{"version":3,"file":"js/app.db6a194a.js","mappings":"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AAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,IAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,W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","sources":["webpack://dve-frontend/./src/assets/img/ sync ^\\.\\/.*\\.svg$","webpack://dve-frontend/./src/App.vue","webpack://dve-frontend/./src/assets/js/utils.js","webpack://dve-frontend/./src/store/modules/importer/darknet.js","webpack://dve-frontend/./src/store/modules/importer/modelpack.js","webpack://dve-frontend/./src/store/modules/importer/maivin.js","webpack://dve-frontend/./src/store/modules/importer/coco.js","webpack://dve-frontend/./src/store/modules/importer/importer.js","webpack://dve-frontend/./src/store/modules/importer/annotations.js","webpack://dve-frontend/./src/store/index.js","webpack://dve-frontend/./src/views/UserPage.vue","webpack://dve-frontend/./src/components/SVGIcon.vue","webpack://dve-frontend/./src/components/SVGIcon.vue?4de9","webpack://dve-frontend/./src/components/Header.vue","webpack://dve-frontend/./src/assets/js/icons.js","webpack://dve-frontend/./src/components/UserMenu.vue","webpack://dve-frontend/./src/components/BaseMenu.vue","webpack://dve-frontend/./src/components/Popper.vue","webpack://dve-frontend/./src/components/Popper.vue?0d88","webpack://dve-frontend/./src/components/BaseMenu.vue?d2b5","webpack://dve-frontend/./src/components/BaseSwitch.vue","webpack://dve-frontend/./src/components/BaseSwitch.vue?e16f","webpack://dve-frontend/./src/components/BaseMenuButton.vue","webpack://dve-frontend/./src/components/BaseMenuButton.vue?5e9a","webpack://dve-frontend/./src/components/PricingModal.vue","webpack://dve-frontend/./src/components/PriceTable.vue","webpack://dve-frontend/./src/components/SingleSliderWithTwoColors.vue","webpack://dve-frontend/./src/components/SingleSliderWithTwoColors.vue?9dfb","webpack://dve-frontend/./src/components/PriceTable.vue?3f15","webpack://dve-frontend/./src/components/Modal.vue","webpack://dve-frontend/./src/components/IconButton.vue","webpack://dve-frontend/./src/components/IconButton.vue?5d45","webpack://dve-frontend/./src/components/Modal.vue?db1b","webpack://dve-frontend/./src/components/PricingModal.vue?18ea","webpack://dve-frontend/./src/components/UserIcon.vue","webpack://dve-frontend/./src/components/UserIcon.vue?6a5d","webpack://dve-frontend/./src/components/UserMenu.vue?144d","webpack://dve-frontend/./src/components/HelpMenu.vue","webpack://dve-frontend/./src/components/FeedbackModal.vue","webpack://dve-frontend/./src/components/FeedbackModal.vue?78b5","webpack://dve-frontend/./src/components/HelpMenu.vue?d290","webpack://dve-frontend/./src/components/ModuleMenuV2.vue","webpack://dve-frontend/./src/components/ModuleMenuV2.vue?157c","webpack://dve-frontend/./src/components/WarningMenu.vue","webpack://dve-frontend/./src/components/WarningMenu.vue?8736","webpack://dve-frontend/./src/components/Header.vue?801b","webpack://dve-frontend/./src/components/BreadcrumbNavigation.vue","webpack://dve-frontend/./src/components/BreadcrumbNavigation.vue?14d1","webpack://dve-frontend/./src/views/UserPage.vue?ff21","webpack://dve-frontend/./src/components/UserProfileComponent/UserUsageLogs.vue","webpack://dve-frontend/./src/components/InlineLoader.vue","webpack://dve-frontend/./src/components/InlineLoader.vue?1a65","webpack://dve-frontend/./src/components/UserProfileComponent/UserUsageLogs.vue?4626","webpack://dve-frontend/./src/components/UserProfileComponent/Transactions.vue","webpack://dve-frontend/./src/components/UserProfileComponent/Transactions.vue?26a3","webpack://dve-frontend/./src/views/AdminPage.vue","webpack://dve-frontend/./src/views/AdminPage.vue?c533","webpack://dve-frontend/./src/views/SuperAdminPage.vue","webpack://dve-frontend/./src/views/SuperAdminPage.vue?f629","webpack://dve-frontend/./src/components/UserProfileComponent/AccountSettings/AccountSettings.vue","webpack://dve-frontend/./src/components/UserProfileComponent/AccountSettings/AccountSettings.vue?7100","webpack://dve-frontend/./src/components/UserProfileComponent/AccountSettings/EditUser.vue","webpack://dve-frontend/./src/components/UserProfileComponent/AccountSettings/EditUser.vue?de32","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/Landing.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/Landing.vue?1d61","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/EditOrganization.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/EditOrganization.vue?3738","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/OrganizationSecuritySettings.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/OrganizationSecuritySettings.vue?23af","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/UserManagement.vue","webpack://dve-frontend/./src/components/ConfirmModal.vue","webpack://dve-frontend/./src/components/ConfirmModal.vue?51f7","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/UserManagement.vue?cc7c","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/OrganizationSettings.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/OrganizationSettings.vue?04f7","webpack://dve-frontend/./src/components/UserProfileComponent/CreateSecondaryUser.vue","webpack://dve-frontend/./src/components/UserProfileComponent/CreateSecondaryUser.vue?aa0a","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/OrganizationManagement.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/OrganizationManagement.vue?5205","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/AddNewOrganization.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/AddNewOrganization.vue?ccc5","webpack://dve-frontend/./src/components/UserProfileComponent/UserAddCredits.vue","webpack://dve-frontend/./src/components/UserProfileComponent/UserAddCredits.vue?3c33","webpack://dve-frontend/./src/components/UserProfileComponent/EmulateUser.vue","webpack://dve-frontend/./src/components/UserProfileComponent/EmulateUser.vue?09de","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/ShowDetailedOrganization.vue","webpack://dve-frontend/./src/components/UserProfileComponent/OrganizationSettings/ShowDetailedOrganization.vue?e3e0","webpack://dve-frontend/./src/views/Projects.vue","webpack://dve-frontend/./src/components/BreadcrumbSelect.vue","webpack://dve-frontend/./src/components/BaseSelect.vue","webpack://dve-frontend/./src/components/BaseSelect.vue?131b","webpack://dve-frontend/./src/components/BreadcrumbSelect.vue?2623","webpack://dve-frontend/./src/components/TasksStatusComponent/TasksModal.vue","webpack://dve-frontend/./src/components/BaseCard.vue","webpack://dve-frontend/./src/components/BaseCard.vue?2020","webpack://dve-frontend/./src/components/TasksStatusComponent/UploadStatusBar.vue","webpack://dve-frontend/./src/components/DatasetComponent/ResumeUploadImagesModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/ResumeUploadImagesModal.vue?e2c0","webpack://dve-frontend/./src/components/TasksStatusComponent/UploadStatusBar.vue?7c3e","webpack://dve-frontend/./src/components/TasksStatusComponent/TasksModal.vue?5620","webpack://dve-frontend/./src/views/Projects.vue?e90d","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectManagement.vue","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectCard.vue","webpack://dve-frontend/./src/components/BaseTextExpander.vue","webpack://dve-frontend/./src/components/BaseTextExpander.vue?a2f3","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectEntryRow.vue","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectEntryRow.vue?c9c0","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectCard.vue?a8d5","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectCreate.vue","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectCreate.vue?2440","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectUpdateModal.vue","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectUpdateModal.vue?4212","webpack://dve-frontend/./src/components/PageLoader.vue","webpack://dve-frontend/./src/components/PageLoader.vue?4463","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectAccessModal.vue","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectAccessModal.vue?4d03","webpack://dve-frontend/./src/components/ProjectsComponent/ProjectManagement.vue?a016","webpack://dve-frontend/./src/views/Trainer.vue","webpack://dve-frontend/./src/views/Trainer.vue?849f","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerManagement.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerCardV2.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingChartSingle.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingChartSingle.vue?9726","webpack://dve-frontend/./src/components/Tooltip.vue","webpack://dve-frontend/./src/components/Tooltip.vue?f9bc","webpack://dve-frontend/./src/components/EncodedIdField.vue","webpack://dve-frontend/./src/components/EncodedIdField.vue?37fc","webpack://dve-frontend/./src/components/TaskStatusBars.vue","webpack://dve-frontend/./src/components/TaskStatusBars.vue?c512","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerCardV2.vue?b83d","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/DownloadModelCard.vue","webpack://dve-frontend/./src/components/ShikiHighlight.vue","webpack://dve-frontend/./src/components/ShikiHighlight.vue?7bf5","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingSessionDetailsModalV2.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingSessionDetailsModalV2.vue?f48b","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingSessionAnalyticsModal.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingSessionAnalyticsModal.vue?d12f","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerCompareTrainedModelsModal.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerCompareTrainedModelsModal.vue?46ee","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerUpdateModal.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerUpdateModal.vue?a883","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/CreateTrainerModal.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/CreateTrainerModal.vue?dcb0","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/CreateTrainerSessionModalV2.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainValTestSplitSlider.vue","webpack://dve-frontend/./src/components/TriRangeSlider.vue","webpack://dve-frontend/./src/components/TriRangeSlider.vue?988e","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainValTestSplitSlider.vue?39a0","webpack://dve-frontend/./src/components/SingleSlider.vue","webpack://dve-frontend/./src/components/SingleSlider.vue?8c8a","webpack://dve-frontend/./src/components/RangeSlider.vue","webpack://dve-frontend/./src/components/RangeSlider.vue?22a9","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/ConfigureFieldsGroup.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/ConfigureFieldsGroup.vue?e34d","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/CreateTrainerSessionModalV2.vue?77c2","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingCharts.vue","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainingCharts.vue?0b51","webpack://dve-frontend/./src/components/TrainerComponent/TrainerExperimentAndSessions/TrainerManagement.vue?8d1c","webpack://dve-frontend/./src/views/Datasets.vue","webpack://dve-frontend/./src/stores/useViewerVisualizationsStore.js","webpack://dve-frontend/./src/views/Datasets.vue?5efc","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationViewer.vue","webpack://dve-frontend/./src/components/BaseSidebar.vue","webpack://dve-frontend/./src/components/BaseSidebar.vue?0b7f","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationCanvas.vue","webpack://dve-frontend/./src/composables/canvas/useZoom.js","webpack://dve-frontend/./src/assets/js/onnxHelpers/onnxModelAPI.js","webpack://dve-frontend/./src/assets/js/onnxHelpers/scaleHelper.js","webpack://dve-frontend/./src/assets/js/onnxHelpers/maskUtils.js","webpack://dve-frontend/./src/composables/canvas/useSAMCanvas.js","webpack://dve-frontend/./src/composables/useAnnotationColorMap.js","webpack://dve-frontend/./src/composables/useColorParser.js","webpack://dve-frontend/./src/stores/useSAM2Store.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaImage.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaTransformer.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaTransformer.vue?7e96","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaImage.vue?8191","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaVideo.vue","webpack://dve-frontend/./src/stores/useVideoPlayerStore.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaVideo.vue?ccf9","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaBrush.vue","webpack://dve-frontend/./src/composables/annotationTool/useBrushToPolygon.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaBrush.vue?def0","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaSegmentationMask.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaSegmentationMask.vue?d8cf","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaSegmentationPolygon.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/Polygon.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/Polygon.vue?4a02","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KonvaSegmentationPolygon.vue?a72b","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationBox.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationBox.vue?c62c","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAMClickPoint.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAMClickPoint.vue?fd03","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAMSelectBox.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAMSelectBox.vue?1dde","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2ClickPoint.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2ClickPoint.vue?20e4","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2SelectBox.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2SelectBox.vue?6856","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2Boxes.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2Boxes.vue?8c45","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/CanvasSelectBox.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/CanvasSelectBox.vue?7105","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationBoxTool.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationBoxTool.vue?4bc8","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/Project3Dto2D.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/Project3Dto2D.vue?c66b","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/ProjectLidarTo2D.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/ProjectLidarTo2D.vue?cf5b","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/ProjectPCDTo2D.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/ProjectPCDTo2D.vue?bac1","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationCanvas.vue?45ea","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolViewingModeControls.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolViewingModeControls.vue?1954","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolRibbon.vue","webpack://dve-frontend/./src/components/BasePersistentSplitButton.vue","webpack://dve-frontend/./src/components/BasePersistentSplitButton.vue?a827","webpack://dve-frontend/./src/composables/annotationTool/useAnnotationDatabase.js","webpack://dve-frontend/./src/composables/annotationTool/useTaskHistory.js","webpack://dve-frontend/./src/stores/useEditorStore.js","webpack://dve-frontend/./src/stores/usePCDStore.js","webpack://dve-frontend/./src/composables/annotationTool/usePCD.js","webpack://dve-frontend/./src/composables/annotationTool/useTasks.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolRibbon.vue?cac4","webpack://dve-frontend/./src/composables/annotationTool/useProjection.js","webpack://dve-frontend/./src/workers/workerPool.js","webpack://dve-frontend/./src/composables/useViewerVisualizations.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolSequenceRibbon.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolSequenceRibbon.vue?6ba8","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationDetails.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationDetails.vue?5173","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridAnnotationReviewItem.vue","webpack://dve-frontend/./src/components/DatasetComponent/BaseGalleryGridItem.vue","webpack://dve-frontend/./src/composables/useFetchImage.js","webpack://dve-frontend/./src/components/ImageCanvas.vue","webpack://dve-frontend/./src/components/ImageCanvas.vue?e884","webpack://dve-frontend/./src/components/DatasetComponent/BaseGalleryGridItem.vue?f2fc","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridAnnotationReviewItem.vue?573a","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationEditorHistoryDrawer.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationEditorGallery.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/DatasetFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/CameraSourceFilter.vue","webpack://dve-frontend/./src/components/FilterPopper.vue","webpack://dve-frontend/./src/components/FilterPopper.vue?fa2c","webpack://dve-frontend/./src/components/BaseFilterButton.vue","webpack://dve-frontend/./src/components/BaseFilterButton.vue?978c","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/CameraSourceFilter.vue?30d6","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/GroupsFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/GroupsFilter.vue?58a4","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/BoundingBoxSizeFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/BoundingBoxSizeFilter.vue?4201","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ConfidenceRangeFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ConfidenceRangeFilter.vue?e0d4","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/AnnotationLabelFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/AnnotationLabelFilter.vue?17db","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/AnnotationTypeFilter.vue","webpack://dve-frontend/./src/stores/useAnnotationTypeStore.js","webpack://dve-frontend/./src/composables/useAnnotationType.js","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/AnnotationTypeFilter.vue?c874","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImageTagFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImageTagFilter.vue?5cae","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/TimeRangeFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/TimeRangeFilter.vue?450c","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/DateRangeFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/DateRangeFilter.vue?5138","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImageReviewStatusFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImageReviewStatusFilter.vue?2dd7","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImageNameFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImageNameFilter.vue?ffea","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/MoreFilters.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/MoreFilters.vue?2dc6","webpack://dve-frontend/./src/stores/useGalleryStore.js","webpack://dve-frontend/./src/composables/annotationTool/useGallery.js","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/AnnotationSetFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/AnnotationSetFilter.vue?32cb","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImagesWithAnnotationSetFilter.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/ImagesWithAnnotationSetFilter.vue?a7a3","webpack://dve-frontend/./src/components/DatasetComponent/DatasetFilters/DatasetFilter.vue?6447","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/DisplayAnnotationsFilterV2.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/DisplayAnnotationsFilterV2.vue?a2ba","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGrid.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridItem.vue","webpack://dve-frontend/./src/assets/js/error-message.js","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridItem.vue?72bc","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGrid.vue?c649","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/AnnotationEditorGalleryGridItem.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridItemLabelTags.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridItemLabelTags.vue?cf88","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/AnnotationEditorGalleryGridItem.vue?5e41","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryEmptyState.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryEmptyState.vue?dc8b","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryImageSort.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryImageSort.vue?a000","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationEditorGallery.vue?4428","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationEditorHistoryDrawer.vue?5065","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationReview.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/ImageDetails.vue","webpack://dve-frontend/./src/components/ImageGroupSelector.vue","webpack://dve-frontend/./src/components/ImageGroupSelector.vue?6ce8","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/ImageDetails.vue?3996","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationReviewAnnotationDetails.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationReviewAnnotationDetails.vue?1fc6","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationReview.vue?e286","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/TaskProgressCard.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/TaskProgressCard.vue?3fcb","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/TaskActiveTimeCard.vue","webpack://dve-frontend/./src/composables/useActiveTimer.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/TaskActiveTimeCard.vue?762e","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/TaskDatasetAndDestinationCard.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/TaskDatasetAndDestinationCard.vue?900f","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AuditToolSelect.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AuditToolSelect.vue?4c21","webpack://dve-frontend/./src/composables/annotationTool/useAnnotationEditorModalHotkeys.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VideoControls/Scrubber.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VideoControls/Scrubber.vue?622d","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VideoControls/VideoControls.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VideoControls/VideoControls.vue?b4bc","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAMToolbar.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAMToolbar.vue?0b6f","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationList.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationList.vue?6e92","webpack://dve-frontend/./src/stores/useEditorControlsStore.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolViewingMode3DControls.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationToolViewingMode3DControls.vue?38e1","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/PointCloudViewer.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/PointCloudViewer.vue?b032","webpack://dve-frontend/./src/components/JSONViewer/JsonView.vue","webpack://dve-frontend/./src/components/JSONViewer/JsonViewItem.vue","webpack://dve-frontend/./src/components/JSONViewer/JsonViewItem.vue?1621","webpack://dve-frontend/./src/components/JSONViewer/JsonView.vue?39a6","webpack://dve-frontend/./src/components/ColorPicker.vue","webpack://dve-frontend/./src/components/ColorPicker.vue?25f5","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/JsonRawViewer.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/JsonRawViewer.vue?0153","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/BulkDeleteAnnotationModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/BulkDeleteAnnotationModal.vue?4b0e","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/DepthMapViewer.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/DepthMapViewer.vue?df02","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/DrawingToolModeControls.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/DrawingToolModeControls.vue?026c","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/DrawingToolModeControls3d.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/DrawingToolModeControls3d.vue?ba34","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VisualizationPane.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SelectVisualizationMenu.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SelectVisualizationMenu.vue?9e0f","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VisualizationContainer.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VisualizationContainer.vue?275b","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VisualizationDisplays.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/VisualizationDisplays.vue?2e65","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SelectLayoutMenu.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SelectLayoutMenu.vue?f5e5","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AddVisualizationMenu.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AddVisualizationMenu.vue?dd01","webpack://dve-frontend/./src/composables/annotationTool/useVisualizationDisplays.js","webpack://dve-frontend/./src/composables/useImagesFetch.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KeyframeTimeline2.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/KeyframeTimeline2.vue?c261","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnimationControlsV2.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnimationControlsV2.vue?c0cb","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2Sidebar.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/SAM2Sidebar.vue?43e7","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationEditorModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationEditorModal.vue?6748","webpack://dve-frontend/./src/stores/useDepthMapStore.js","webpack://dve-frontend/./src/composables/annotationTool/useDepthMap.js","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationTool/AnnotationViewer.vue?89a5","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetManagement.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/ManageDatasetAccess.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/ManageDatasetAccess.vue?3ed4","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/CreateLabelsModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/CreateLabelsModal.vue?7dec","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetCard.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/AnnotationSetListItem.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/AnnotationSetListItem.vue?8739","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/GroupListItem.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/GroupListItem.vue?86f2","webpack://dve-frontend/./src/components/DatasetComponent/DatasetCardLabelsPopper.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetCardLabelsPopper.vue?0c98","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetCard.vue?e50e","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetCopyModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationSetsRadioSelect.vue","webpack://dve-frontend/./src/components/DatasetComponent/AnnotationSetsRadioSelect.vue?a460","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetCopyModal.vue?3f6b","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetCreateModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetCreateModal.vue?b347","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetUpdateModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetUpdateModal.vue?9889","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/AnnSetCopyModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/AnnSetCopyModal.vue?bb85","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/CreateAnnotationSetModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/CreateAnnotationSetModal.vue?1384","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/UpdateAnnotationSetModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/UpdateAnnotationSetModal.vue?0678","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetExportModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetExportModal.vue?0302","webpack://dve-frontend/./src/components/DatasetComponent/UploadImagesModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/ImportForms/DefaultImportScriptForm.vue","webpack://dve-frontend/./src/components/DatasetComponent/ImportForms/DefaultImportScriptForm.vue?b27f","webpack://dve-frontend/./src/components/DatasetComponent/UploadImagesModal.vue?4a3b","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/CreateGroupsModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/CreateGroupsModal.vue?d784","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/GenerateAPITokenModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/GenerateAPITokenModal.vue?ea8e","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/ConfusionMatrixModal.vue","webpack://dve-frontend/./src/components/ValidationPage/ComparisonFilter.vue","webpack://dve-frontend/./src/components/ValidationPage/ComparisonTaskGroundTruth.vue","webpack://dve-frontend/./src/components/ValidationPage/ComparisonTaskGroundTruth.vue?e959","webpack://dve-frontend/./src/components/ValidationPage/ChooseValidationTarget.vue","webpack://dve-frontend/./src/components/ValidationPage/ChooseValidationTarget.vue?ae7a","webpack://dve-frontend/./src/components/ValidationPage/ConfidenceThresholdFilter.vue","webpack://dve-frontend/./src/components/ValidationPage/ConfidenceThresholdFilter.vue?4e43","webpack://dve-frontend/./src/components/ValidationPage/IoUThresholdFilter.vue","webpack://dve-frontend/./src/components/ValidationPage/IoUThresholdFilter.vue?bc9f","webpack://dve-frontend/./src/components/ValidationPage/MetricFilter.vue","webpack://dve-frontend/./src/components/ValidationPage/MetricFilter.vue?e3e2","webpack://dve-frontend/./src/components/ValidationPage/IgnoreBoxesFilter.vue","webpack://dve-frontend/./src/components/ValidationPage/IgnoreBoxesFilter.vue?7379","webpack://dve-frontend/./src/components/ValidationPage/ComparisonFilter.vue?6819","webpack://dve-frontend/./src/components/ValidationPage/ComparisonTableDynamic.vue","webpack://dve-frontend/./src/components/ValidationPage/ComparisonTableDynamic.vue?628e","webpack://dve-frontend/./src/components/ValidationPage/ConfusionMatrixCardV2.vue","webpack://dve-frontend/./src/components/ValidationPage/ConfusionMatrixV2.vue","webpack://dve-frontend/./src/components/ValidationPage/ConfusionMatrixV2.vue?943a","webpack://dve-frontend/./src/components/ValidationPage/ConfusionMatrixCardV2.vue?c3ae","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/ConfusionMatrixModal.vue?57f4","webpack://dve-frontend/./src/components/Snapshots/SnapshotAddModal.vue","webpack://dve-frontend/./src/components/Snapshots/SnapshotAddModal.vue?1fd2","webpack://dve-frontend/./src/components/DatasetComponent/DatasetManagement/DatasetManagement.vue?108f","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/Gallery.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridItem2.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryGridItem2.vue?17ff","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryDropZone.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryDropZone.vue?9e95","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/DisplayImageDetails.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/DisplayImageDetails.vue?36da","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/ImageCopyModal.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/ImageCopyModal.vue?06ab","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryActionsDropdown.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryActionsDropdown.vue?1cfc","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/Gallery.vue?b586","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/DatasetStats.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/StatsOverview.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/StatsOverview.vue?7eae","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/ConfidenceHistogram.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/ConfidenceHistogram.vue?0a7f","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/LabelsPieChart.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/LabelsPieChart.vue?f1df","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/LabelLocationMap.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/LabelSelector.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/LabelSelector.vue?7d4d","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/LabelLocationMap.vue?2618","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/BoundingBoxDisplay.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/BoundingBoxDisplay.vue?6823","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/BoundingBoxSizeHistogram.vue","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/BoundingBoxSizeHistogram.vue?e81a","webpack://dve-frontend/./src/components/DatasetComponent/DatasetStats/DatasetStats.vue?be31","webpack://dve-frontend/./src/components/DatasetComponent/Map.vue","webpack://dve-frontend/./src/components/DatasetComponent/Map.vue?db5e","webpack://dve-frontend/./src/views/Validator.vue","webpack://dve-frontend/./src/views/Validator.vue?0b46","webpack://dve-frontend/./src/components/ValidationPage/ValidatorManagement.vue","webpack://dve-frontend/./src/components/ValidationPage/StartValidatorModal.vue","webpack://dve-frontend/./src/components/ValidationPage/StartValidatorModal.vue?f52d","webpack://dve-frontend/./src/components/ValidationPage/ValidatorCardV2.vue","webpack://dve-frontend/./src/components/ValidationPage/ValidatorCardV2.vue?6be8","webpack://dve-frontend/./src/components/ValidationPage/ValidateSessionDetailsModal.vue","webpack://dve-frontend/./src/components/ValidationPage/ValidateSessionDetailsModal.vue?a98d","webpack://dve-frontend/./src/components/ValidationPage/ValidatorManagement.vue?7460","webpack://dve-frontend/./src/views/Automation.vue","webpack://dve-frontend/./src/components/AutoAnnotations/AutomatedTasks.vue","webpack://dve-frontend/./src/components/AutoAnnotations/CreateAutoAnnotationTaskModal.vue","webpack://dve-frontend/./src/components/AutoAnnotations/CreateAutoAnnotationTaskModal.vue?9b71","webpack://dve-frontend/./src/components/AutoAnnotations/AutoAnnotationCard.vue","webpack://dve-frontend/./src/components/AutoAnnotations/AutoAnnotationCard.vue?93a8","webpack://dve-frontend/./src/components/AutoAnnotations/AutomatedTasks.vue?d198","webpack://dve-frontend/./src/views/Automation.vue?b012","webpack://dve-frontend/./src/views/TaskBoard.vue","webpack://dve-frontend/./src/components/ReviewsPage/ReviewsTab.vue","webpack://dve-frontend/./src/components/ReviewsPage/ReviewTaskCard.vue","webpack://dve-frontend/./src/components/ReviewsPage/ReviewTaskCard.vue?0009","webpack://dve-frontend/./src/components/ReviewsPage/CreateAnnotationReviewTaskModal.vue","webpack://dve-frontend/./src/components/ReviewsPage/CreateAnnotationReviewTaskModal.vue?19cc","webpack://dve-frontend/./src/components/ReviewsPage/ManageReviewsAccess.vue","webpack://dve-frontend/./src/components/ReviewsPage/ManageReviewsAccess.vue?904c","webpack://dve-frontend/./src/components/ReviewsPage/ReviewsTab.vue?fc0d","webpack://dve-frontend/./src/views/TaskBoard.vue?ed72","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryLandingPage.vue","webpack://dve-frontend/./src/components/DatasetComponent/GalleryComponent/GalleryLandingPage.vue?5502","webpack://dve-frontend/./src/views/RecycleBin.vue","webpack://dve-frontend/./src/views/RecycleBin.vue?f4ea","webpack://dve-frontend/./src/components/CloudInstances/CloudInstancesList.vue","webpack://dve-frontend/./src/components/CloudInstances/CloudInstancesList.vue?8e39","webpack://dve-frontend/./src/components/CloudInstances/CloudInstanceFilters.vue","webpack://dve-frontend/./src/components/CloudInstances/CloudInstanceFilters.vue?3b81","webpack://dve-frontend/./src/components/CloudInstances/NewCloudInstanceModal.vue","webpack://dve-frontend/./src/components/CloudInstances/NewCloudInstanceModal.vue?e813","webpack://dve-frontend/./src/views/CloudInstancesPage.vue","webpack://dve-frontend/./src/views/CloudInstancesPage.vue?0347","webpack://dve-frontend/./src/views/Snapshots.vue","webpack://dve-frontend/./src/components/Snapshots/SnapshotList.vue","webpack://dve-frontend/./src/components/Snapshots/SnapshotList.vue?7381","webpack://dve-frontend/./src/views/Snapshots.vue?9c48","webpack://dve-frontend/./src/views/Welcome.vue","webpack://dve-frontend/./src/views/WelcomeLanding2.vue","webpack://dve-frontend/./src/views/WelcomeLanding2.vue?8b48","webpack://dve-frontend/./src/views/Pricing.vue","webpack://dve-frontend/./src/views/Login.vue","webpack://dve-frontend/./src/views/Login.vue?240b","webpack://dve-frontend/./src/components/ValidationPage/ValidateSessionCharts.vue","webpack://dve-frontend/./src/components/ValidationPage/ChartCard.vue","webpack://dve-frontend/./src/components/ValidationPage/ChartCard.vue?300c","webpack://dve-frontend/./src/components/ValidationPage/ValidateSessionCharts.vue?5fca","webpack://dve-frontend/./src/router/index.js","webpack://dve-frontend/./src/assets/js/DatastoreFunctions/datastore-interface.js","webpack://dve-frontend/./src/App.vue?7ccd","webpack://dve-frontend/./src/main.js","webpack://dve-frontend/webpack/bootstrap","webpack://dve-frontend/webpack/runtime/chunk loaded","webpack://dve-frontend/webpack/runtime/compat get default export","webpack://dve-frontend/webpack/runtime/define property getters","webpack://dve-frontend/webpack/runtime/ensure chunk","webpack://dve-frontend/webpack/runtime/get javascript chunk filename","webpack://dve-frontend/webpack/runtime/get mini-css chunk filename","webpack://dve-frontend/webpack/runtime/global","webpack://dve-frontend/webpack/runtime/hasOwnProperty shorthand","webpack://dve-frontend/webpack/runtime/load script","webpack://dve-frontend/webpack/runtime/make namespace object","webpack://dve-frontend/webpack/runtime/publicPath","webpack://dve-frontend/webpack/runtime/jsonp chunk loading","webpack://dve-frontend/webpack/startup"],"sourcesContent":["var map = {\n\t\"./3d.svg\": 20655,\n\t\"./account_circle.svg\": 92586,\n\t\"./add.svg\": 29475,\n\t\"./add_box_outlined.svg\": 81938,\n\t\"./admin.svg\": 32267,\n\t\"./admin_panel_settings_black_24dp.svg\": 95001,\n\t\"./analytics.svg\": 31254,\n\t\"./annotate.svg\": 84074,\n\t\"./apps.svg\": 48130,\n\t\"./arrow.svg\": 52013,\n\t\"./arrow_right.svg\": 33854,\n\t\"./arrow_upward.svg\": 41401,\n\t\"./auto.svg\": 75287,\n\t\"./auto_annotate.svg\": 43326,\n\t\"./auzoneLogo.svg\": 46575,\n\t\"./bar-graph.svg\": 48478,\n\t\"./bar-graph_white.svg\": 60576,\n\t\"./bar_chart.svg\": 13244,\n\t\"./border_outer_line.svg\": 19801,\n\t\"./border_top_line.svg\": 86321,\n\t\"./bounding-box.svg\": 11522,\n\t\"./box-tool.svg\": 75248,\n\t\"./brush.svg\": 58862,\n\t\"./brush_icon.svg\": 91762,\n\t\"./call_split.svg\": 13771,\n\t\"./cancel_cross.svg\": 45953,\n\t\"./cancel_filled.svg\": 56891,\n\t\"./chart.svg\": 88114,\n\t\"./chat.svg\": 71660,\n\t\"./check.svg\": 14414,\n\t\"./check_circle.svg\": 37581,\n\t\"./check_filled.svg\": 72477,\n\t\"./chevron_left.svg\": 1969,\n\t\"./chevron_right.svg\": 80284,\n\t\"./clear_all.svg\": 24645,\n\t\"./clipboard.svg\": 22188,\n\t\"./clock.svg\": 60236,\n\t\"./close.svg\": 48298,\n\t\"./cloud_servers.svg\": 16320,\n\t\"./cloud_upload.svg\": 93875,\n\t\"./compare.svg\": 25891,\n\t\"./conf_matrix.svg\": 79100,\n\t\"./convert.svg\": 16347,\n\t\"./copy.svg\": 22541,\n\t\"./copy_content.svg\": 86431,\n\t\"./copy_white.svg\": 95207,\n\t\"./cpu.svg\": 11220,\n\t\"./cube.svg\": 58733,\n\t\"./cursor.svg\": 75056,\n\t\"./dangerous.svg\": 44886,\n\t\"./dangerous_outlined.svg\": 32791,\n\t\"./darkmode.svg\": 55183,\n\t\"./dashboard.svg\": 79646,\n\t\"./database.svg\": 51789,\n\t\"./database2.svg\": 49413,\n\t\"./database_sync.svg\": 84089,\n\t\"./dataset.svg\": 31886,\n\t\"./dataset_white.svg\": 81616,\n\t\"./debug.svg\": 62031,\n\t\"./del.svg\": 75849,\n\t\"./delete.svg\": 65863,\n\t\"./delete_sweep.svg\": 38558,\n\t\"./description.svg\": 16356,\n\t\"./detection.svg\": 61239,\n\t\"./detection2.svg\": 74455,\n\t\"./dollar.svg\": 55632,\n\t\"./done.svg\": 91190,\n\t\"./done_outline.svg\": 34921,\n\t\"./dotted_line.svg\": 45019,\n\t\"./download.svg\": 92446,\n\t\"./drag_drop.svg\": 75968,\n\t\"./dve_logo_and_primary_name.svg\": 64362,\n\t\"./edgefirst_hexagon.svg\": 69028,\n\t\"./edgefirst_hexagon_light.svg\": 96425,\n\t\"./edgefirst_logo_and_name.svg\": 86123,\n\t\"./edgefirst_name.svg\": 12065,\n\t\"./edit.svg\": 69338,\n\t\"./ellipsis.svg\": 77543,\n\t\"./empty.svg\": 50789,\n\t\"./empty_dataset.svg\": 68528,\n\t\"./eraser.svg\": 16346,\n\t\"./eraser_icon.svg\": 78126,\n\t\"./evaluate.svg\": 84331,\n\t\"./evaluate_white.svg\": 87829,\n\t\"./event.svg\": 70570,\n\t\"./expand_less.svg\": 24570,\n\t\"./expand_more.svg\": 68330,\n\t\"./export.svg\": 54288,\n\t\"./external_link.svg\": 51526,\n\t\"./eye_icon.svg\": 55071,\n\t\"./eye_icon_off.svg\": 51433,\n\t\"./feedback.svg\": 11939,\n\t\"./file-copy.svg\": 318,\n\t\"./file_restore.svg\": 50271,\n\t\"./file_upload_black_24dp.svg\": 73065,\n\t\"./filter_white.svg\": 28054,\n\t\"./flag.svg\": 98636,\n\t\"./flip.svg\": 63435,\n\t\"./folder.svg\": 90006,\n\t\"./folder2.svg\": 94552,\n\t\"./folder_zip.svg\": 9682,\n\t\"./fullscreen.svg\": 22885,\n\t\"./gallery_thumbnail.svg\": 28025,\n\t\"./gpu.svg\": 68904,\n\t\"./graph.svg\": 99942,\n\t\"./graph_white.svg\": 70904,\n\t\"./grid3x3.svg\": 16538,\n\t\"./grid_view.svg\": 93430,\n\t\"./hash_tag.svg\": 36131,\n\t\"./hashtag.svg\": 81490,\n\t\"./height.svg\": 96923,\n\t\"./help.svg\": 56463,\n\t\"./help_filled.svg\": 43950,\n\t\"./hexagon.svg\": 51794,\n\t\"./highlight_alt.svg\": 77050,\n\t\"./history.svg\": 61006,\n\t\"./image.svg\": 70213,\n\t\"./image_group.svg\": 52537,\n\t\"./image_search.svg\": 60004,\n\t\"./import.svg\": 94909,\n\t\"./import_export.svg\": 82834,\n\t\"./info.svg\": 2310,\n\t\"./info_outline.svg\": 69145,\n\t\"./insights.svg\": 50909,\n\t\"./invert_colors.svg\": 38933,\n\t\"./invert_colors_off.svg\": 3431,\n\t\"./kanban.svg\": 77387,\n\t\"./label.svg\": 68232,\n\t\"./label2.svg\": 60970,\n\t\"./label_white.svg\": 45394,\n\t\"./launch.svg\": 78975,\n\t\"./layout_2_columns.svg\": 26043,\n\t\"./layout_2x1.svg\": 14202,\n\t\"./layout_2x2.svg\": 98665,\n\t\"./layout_add.svg\": 38608,\n\t\"./layout_single.svg\": 94903,\n\t\"./linux_os.svg\": 91621,\n\t\"./list.svg\": 74506,\n\t\"./list_alt.svg\": 85722,\n\t\"./list_white.svg\": 17772,\n\t\"./log.svg\": 25432,\n\t\"./logout.svg\": 63292,\n\t\"./map.svg\": 78908,\n\t\"./maximize.svg\": 57768,\n\t\"./mcu.svg\": 38407,\n\t\"./messages.svg\": 99578,\n\t\"./messages_white.svg\": 61468,\n\t\"./minimize.svg\": 1374,\n\t\"./minus_box_outlined.svg\": 85693,\n\t\"./model.svg\": 20093,\n\t\"./model_white.svg\": 37879,\n\t\"./more_vert.svg\": 75557,\n\t\"./new_label.svg\": 91211,\n\t\"./npu.svg\": 5625,\n\t\"./open_in_full.svg\": 79304,\n\t\"./organizations.svg\": 15134,\n\t\"./orthographic.svg\": 31128,\n\t\"./outlined_flag.svg\": 66597,\n\t\"./palette.svg\": 2519,\n\t\"./palette_fill.svg\": 64329,\n\t\"./pan_tool.svg\": 52324,\n\t\"./params.svg\": 92560,\n\t\"./params_white.svg\": 33098,\n\t\"./parking.svg\": 33186,\n\t\"./paste.svg\": 28287,\n\t\"./pause.svg\": 77556,\n\t\"./pause_circle.svg\": 13295,\n\t\"./payments.svg\": 72939,\n\t\"./pentagon.svg\": 48282,\n\t\"./people.svg\": 64043,\n\t\"./people_add.svg\": 56331,\n\t\"./person.svg\": 79245,\n\t\"./person_add.svg\": 6209,\n\t\"./person_arrow.svg\": 48723,\n\t\"./person_settings.svg\": 62567,\n\t\"./perspective.svg\": 4432,\n\t\"./photo_camera.svg\": 97328,\n\t\"./pie_chart.svg\": 2297,\n\t\"./place.svg\": 16087,\n\t\"./play.svg\": 37116,\n\t\"./play_circle.svg\": 45431,\n\t\"./play_circle_filled.svg\": 22662,\n\t\"./playback_speed.svg\": 27953,\n\t\"./preview.svg\": 40714,\n\t\"./project.svg\": 25009,\n\t\"./python.svg\": 91508,\n\t\"./receipt.svg\": 32790,\n\t\"./refresh.svg\": 33571,\n\t\"./remove_selection.svg\": 10317,\n\t\"./replay.svg\": 29191,\n\t\"./restore.svg\": 25400,\n\t\"./review_annotation.svg\": 44978,\n\t\"./run_circle.svg\": 22328,\n\t\"./run_circle2.svg\": 69914,\n\t\"./sam-image.svg\": 89739,\n\t\"./sam-video.svg\": 94221,\n\t\"./sam.svg\": 2683,\n\t\"./savefile.svg\": 56075,\n\t\"./scale.svg\": 27208,\n\t\"./science.svg\": 87032,\n\t\"./screen_share.svg\": 65110,\n\t\"./screen_share_filled.svg\": 62325,\n\t\"./security.svg\": 19164,\n\t\"./segments.svg\": 54992,\n\t\"./set.svg\": 89246,\n\t\"./settings.svg\": 25189,\n\t\"./skip_next.svg\": 8253,\n\t\"./skip_previous.svg\": 69141,\n\t\"./slideshow.svg\": 25110,\n\t\"./snapshot_export.svg\": 36451,\n\t\"./snapshot_import.svg\": 79430,\n\t\"./sort.svg\": 57774,\n\t\"./source_branch.svg\": 28608,\n\t\"./source_commit.svg\": 94375,\n\t\"./split.svg\": 44526,\n\t\"./stats.svg\": 69083,\n\t\"./stop.svg\": 4870,\n\t\"./stop_circle.svg\": 51141,\n\t\"./swap.svg\": 65823,\n\t\"./swap_horiz.svg\": 55672,\n\t\"./sync_alt.svg\": 78843,\n\t\"./tag.svg\": 11718,\n\t\"./tag_filled.svg\": 27365,\n\t\"./test.svg\": 94222,\n\t\"./text_snippet.svg\": 97433,\n\t\"./toggle_annotation_grid.svg\": 23165,\n\t\"./token.svg\": 62709,\n\t\"./tool.svg\": 42428,\n\t\"./train.svg\": 82752,\n\t\"./trainer.svg\": 4517,\n\t\"./trash.svg\": 90008,\n\t\"./undo.svg\": 6240,\n\t\"./upload.svg\": 24341,\n\t\"./usage.svg\": 4967,\n\t\"./user.svg\": 32751,\n\t\"./val.svg\": 90971,\n\t\"./validate.svg\": 63276,\n\t\"./verified.svg\": 74870,\n\t\"./verified_filled.svg\": 68949,\n\t\"./videocam.svg\": 38768,\n\t\"./view_in_ar.svg\": 14069,\n\t\"./visibility.svg\": 5270,\n\t\"./visibility_off.svg\": 36620,\n\t\"./volume_off.svg\": 50930,\n\t\"./volume_up.svg\": 83508,\n\t\"./warning.svg\": 6426,\n\t\"./width.svg\": 28778,\n\t\"./windows_os.svg\": 68270,\n\t\"./zoom_to_extents.svg\": 57083,\n\t\"./zoom_to_selection.svg\": 15618\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 19832;","<template>\n  <router-view />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nexport default {\n  components: {\n  },\n  data() {\n    return {\n      routerIsReady: false,\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    currentRoutePath() {\n      if (this.routerIsReady) {\n        return this.$route.path;\n      }\n      return null;\n    },\n    isTokenExpired() {\n      const currentToken = this.$store.state.user.token;\n      if (this.$store.state.user.token) {\n        const parseJwt = (token) => {\n          try {\n            return JSON.parse(atob(token.split('.')[1]));\n          } catch (e) {\n            return null;\n          }\n        };\n        const parsedToken = parseJwt(currentToken);\n        const tokenExpireInSeconds = parsedToken.exp - (new Date().getTime() / 1000);\n        if (tokenExpireInSeconds > 0) {\n          return false;\n        }\n      }\n      return true;\n    },\n  },\n  watch: {\n    $route(to, from) {\n      if (from.name === 'Datasets') {\n        this.$store.commit('datasets/clearDatasetsState');\n      }\n    },\n    isTokenExpired: {\n      immediate: true,\n      handler(isExpired) {\n        if (isExpired && this.currentRoutePath && this.currentRoutePath !== '/') {\n          this.$router.push({ path: '/logout' });\n        }\n      },\n    },\n    currentProject() {\n      this.getDockerTasksForProject();\n    },\n  },\n  created() {\n    // const protocol = window.location.protocol;\n    // const host = window.location.host.split(':')[0];\n    const host = `${process.env.VUE_APP_BACKEND_URL}`;\n    const datastoreServerUrl = `${host}:10912`;\n    const trainerServerUrl = `${host}:10914`;\n    const enterpriseServerUrl = `${host}:${process.env.VUE_APP_BACKEND_PORT}`;\n    const samServerUrl = `${process.env.VUE_APP_DVE_SAM_URL}:${process.env.VUE_APP_DVE_SAM_PORT}`;\n    this.$store.commit('setDatastoreServerUrl', datastoreServerUrl);\n    this.$store.commit('setTrainerServerUrl', trainerServerUrl);\n    this.$store.commit('setEnterpriseServerUrl', enterpriseServerUrl);\n    this.$store.commit('setEnterpriseServerHost', host);\n    this.$store.commit('setSAMServerUrl', samServerUrl);\n\n    if (process.env.NODE_ENV === 'development') {\n      this.$store.commit('appVersion/setAllowDebug', 'yes');\n    }\n  },\n  mounted() {\n    this.getAppVersion();\n\n    setInterval(this.getAppVersion, 60 * 1000); // Check every 60s\n    this.$router.isReady().then(() => {\n      this.routerIsReady = true;\n\n      // Continue refreshing tokens if still valid\n      this.$nextTick(() => {\n        if (!this.isTokenExpired && this.$route.path !== '/') {\n          this.$store.dispatch('user/autoRefreshToken', this.$store.state.user.token);\n        }\n      });\n    });\n    window.addEventListener(\"beforeunload\", this.handleBeforeUnload);\n    this.getDockerTasksForProject();\n  },\n  beforeUnmount() {\n    window.removeEventListener(\"beforeunload\", this.handleBeforeUnload);\n  },\n  methods: {\n    handleBeforeUnload(event) {\n      event.stopImmediatePropagation();\n      event.returnValue = '';\n    },\n    async getAppVersion() {\n      const dataConnect = new DatastoreConnect();\n      await dataConnect.getAppVersion()\n        .then((data) => {\n          if (data.result) {\n            const currentVersion = this.$store.state.appVersion.frontendVersion;\n            const incomingVersion = data.result.frontendVersion || '0';\n            if (currentVersion && currentVersion !== incomingVersion) {\n              $toast.open({\n                queue: true,\n                dismissible: true,\n                message: `New version available. Click here to reload.`,\n                type: \"info\",\n                position: \"top\",\n                onDismiss: () => window.location.reload(),\n              });\n            }\n            this.$store.commit('appVersion/setVersion', data.result.version);\n            this.$store.commit('appVersion/setIsSaas', data.result.is_saas);\n            this.$store.commit('appVersion/setFrontendVersion', incomingVersion);\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getDockerTasksForProject() {\n      this.$store.commit('tasks/resetUploadTasks');\n      if (this.currentProject) {\n        const dataConnect = new DatastoreConnect();\n        await dataConnect.getDockerTasksDashboard({ project_id: this.currentProject.id, completed_limit: 50 })\n          .then((data) => {\n            if (data.result) {\n              const tasks = data.result;\n              tasks.forEach((task) => {\n                if (task.type === 'upload') { this.$store.commit('tasks/addExistingUploadTask', task); }\n              });\n            }\n          })\n          .catch((e) => { console.log(e); });\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/assets/css/styles.scss';\n@import '@/assets/css/bootstrap-grid.min.css';\n\n.button-main {\n  width: 120px;\n  background: #095b7c;\n  color: aliceblue;\n  border: none;\n  padding: 10px;\n}\n\n.button-main:hover {\n  background: #068697;\n}\n\n#app {\n}\n\n.side-panel {\n  width: 330px;\n  height: 100%;\n  background-color: var(--side-panel-color);\n}\n\n#nav {\n  padding: 30px;\n}\n\n#nav a {\n  font-weight: bold;\n  color: #2c3e50;\n}\n\n#nav a.router-link-exact-active {\n  color: #42b983;\n}\n</style>\n","/*\n * Copyright 2020 Au-zone\n * Copyright 2021 NXP\n *\n * NXP Confidential. This software is owned or controlled by NXP and may\n * only be used strictly in accordance with the applicable license terms.\n * By expressly accepting such terms or by downloading, installing,\n * activating and/or otherwise using the software, you are agreeing that\n * you have read, and that you agree to comply with and are bound by,\n * such license terms.  If you do not agree to be bound by the applicable\n * license terms, then you may not retain, install, activate or otherwise\n * use the software.\n *\n * Project: eIQ Toolkit - Portal UI app\n * utils.js - Utility code\n */\n\n// This file holds functions that are shared between training js files\n// to avoid code duplication\n\nfunction checkpointNameToH5Path(modelName, checkpointName) {\n  let path = sessionStorage.getItem('project_directory');\n  const slash = path.slice(-1);\n  path += `${sessionStorage.getItem('project_name')}${slash}${modelName}${slash}chk${slash}${checkpointName}.h5`;\n  return path;\n}\n\n// eslint-disable-next-line consistent-return\nfunction uppercaseFirstLetter(word) {\n  if (word) {\n    return word.charAt(0).toUpperCase() + word.slice(1);\n  }\n}\n\nfunction splitStream(splitOn) {\n  let buffer = '';\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      buffer += chunk;\n      const parts = buffer.split(splitOn);\n      parts.slice(0, -1)\n        .forEach((part) => controller.enqueue(part));\n      buffer = parts[parts.length - 1];\n    },\n    flush(controller) {\n      if (buffer) controller.enqueue(buffer);\n    },\n  });\n}\n\nfunction parseJSON() {\n  return new TransformStream({\n    transform(chunk, controller) {\n      controller.enqueue(JSON.parse(chunk));\n    },\n  });\n}\n\nconst scaleNanos = (time) => {\n  if (time < 10e3) {\n    const scaled = time.toFixed(0);\n    return `${scaled}ns`;\n  }\n\n  if (time < 10e6) {\n    const scaled = (time / 1e3).toFixed(0);\n    return `${scaled}µs`;\n  }\n\n  if (time < 10e9) {\n    const scaled = (time / 1e6).toFixed(0);\n    return `${scaled}ms`;\n  }\n\n  const scaled = (time / 1e9).toFixed(0);\n  return `${scaled}s`;\n};\n\n// Debounce function for events\nconst debounce = (fn, delay) => {\n  let timeoutID;\n  return (...args) => {\n    if (timeoutID) {\n      clearTimeout(timeoutID);\n    }\n    timeoutID = setTimeout(() => {\n      fn(...args);\n    }, delay);\n  };\n};\n\n// Throttle function: Input as function which needs to be throttled\n// and delay is the time interval in milliseconds\nconst throttle = (fn, delay) => {\n  let timerID;\n  return (...args) => {\n    // If setTimeout is already scheduled, no need to do anything\n    if (timerID) {\n      return;\n    }\n    // Schedule a setTimeout after delay seconds\n    timerID = setTimeout(() => {\n      fn(...args);\n      // Once setTimeout function execution is finished, timerId = undefined so that\n      // the next execution can be scheduled by the setTimeout\n      timerID = undefined;\n    }, delay);\n  };\n};\n\nconst inputSanitizer = (event) => {\n  const input = event.target;\n  const inputValue = event.target.value;\n  if (inputValue === '' || inputValue === undefined) {\n    input.style.color = 'black';\n  } else if (parseFloat(inputValue) > parseFloat(input.max)) {\n    input.style.color = 'red';\n  } else if (parseFloat(inputValue) < parseFloat(input.min)) {\n    input.style.color = 'red';\n  } else {\n    input.style.color = 'black';\n  }\n};\n\nconst changeSanitizer = (event) => {\n  const input = event.target;\n  const inputValue = event.target.value;\n  if (parseFloat(inputValue) > parseFloat(input.max)) {\n    event.target.value = input.max;\n    input.style.color = 'black';\n  } else if (parseFloat(inputValue) < parseFloat(input.min)) {\n    event.target.value = input.min;\n    input.style.color = 'black';\n  } else if (inputValue === \"\" || Number.isNaN(inputValue)) {\n    event.target.value = input.min;\n    input.style.color = 'black';\n  }\n  input.dispatchEvent(new CustomEvent('input'));\n};\n\n/**\n * Adjusts a number to the specified digit.\n *\n * @param {\"round\" | \"floor\" | \"ceil\"} type The type of adjustment.\n * @param {number} value The number.\n * @param {number} exp The exponent (the 10 logarithm of the adjustment base).\n * @returns {number} The adjusted value.\n */\nfunction decimalAdjust(type, value, exp) {\n  type = String(type);\n  if (![\"round\", \"floor\", \"ceil\"].includes(type)) {\n    throw new TypeError(\n      \"The type of decimal adjustment must be one of 'round', 'floor', or 'ceil'.\",\n    );\n  }\n  exp = Number(exp);\n  value = Number(value);\n  if (exp % 1 !== 0 || Number.isNaN(value)) {\n    return NaN;\n  } else if (exp === 0) {\n    return Math[type](value);\n  }\n  const [magnitude, exponent = 0] = value.toString().split(\"e\");\n  const adjustedValue = Math[type](`${magnitude}e${exponent - exp}`);\n  // Shift back\n  const [newMagnitude, newExponent = 0] = adjustedValue.toString().split(\"e\");\n  return Number(`${newMagnitude}e${+newExponent + exp}`);\n}\n\nconst roundNumber = (number, digits) => {\n  const multiple = 10 ** digits;\n  return Math.round(number * multiple) / multiple;\n};\n\nfunction hslToHex(h, s, l) {\n  l /= 100;\n  const a = s * Math.min(l, 1 - l) / 100;\n  const f = (n) => {\n    const k = (n + h / 30) % 12;\n    const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n    return Math.round(255 * color).toString(16).padStart(2, '0'); // convert to Hex and prefix \"0\" if needed\n  };\n  return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nconst getColorByIndexFromScale = (index) => {\n  const hue = (index * 137.508) % 360; // use golden angle approximation\n  return hslToHex(hue, 70, 50);\n};\nconst getColorByIndex = (index) => {\n  // const colors = ['#ffff00', '#00ff00', '#ffa500', '#ff0000', '#48d1cc', '#a0522d', '#ffc0cb', '#ff1493', '#f0e68c', '#1e90ff', '#0000ff', '#00fa9a'];\n  // const colors = [\n  //   \"#ffff00\", // yellow\n  //   \"#00ff00\", // lime\n  //   \"#ff8c00\", // darkorange\n  //   '#ff0000', // red\n  //   \"#00ced1\", // darkturquoise\n  //   \"#8b4513\", // saddlebrown\n  //   \"#ffb6c1\", // lightpink\n  //   \"#dc143c\", // crimson\n  //   \"#9400d3\", // darkviolet\n  //   \"#00bfff\", // deepskyblue\n  //   \"#00008b\", // darkblue\n  //   \"#00ff7f\", // springgreen\n  //   \"#2f4f4f\", // darkslategray\n  //   \"#556b2f\", // darkolivegreen\n  //   \"#228b22\", // forestgreen\n  //   \"#7f0000\", // maroon2\n  //   \"#191970\", // midnightblue\n  //   \"#808000\", // olive\n  //   \"#3cb371\", // mediumseagreen\n  //   \"#008080\", // teal\n  //   \"#b8860b\", // darkgoldenrod\n  //   \"#4682b4\", // steelblue\n  //   \"#d2691e\", // chocolate\n  //   \"#9acd32\", // yellowgreen\n  //   \"#32cd32\", // limegreen\n  //   \"#8fbc8f\", // darkseagreen\n  //   \"#800080\", // purple\n  //   \"#b03060\", // maroon3\n  //   \"#ff4500\", // orangered\n  //   \"#00ced1\", // darkturquoise\n  //   \"#ffd700\", // gold\n  //   \"#0000cd\", // mediumblue\n  //   \"#deb887\", // burlywood\n  //   \"#f4a460\", // sandybrown\n  //   \"#f08080\", // lightcoral\n  //   \"#adff2f\", // greenyellow\n  //   \"#ff6347\", // tomato\n  //   \"#da70d6\", // orchid\n  //   \"#b0c4de\", // lightsteelblue\n  //   \"#ff00ff\", // fuchsia\n  //   \"#1e90ff\", // dodgerblue\n  //   \"#f0e68c\", // khaki\n  //   \"#dda0dd\", // plum\n  //   \"#ff1493\", // deeppink\n  //   \"#7b68ee\", // mediumslateblue\n  //   \"#afeeee\", // paleturquoise\n  //   \"#98fb98\", // palegreen\n  //   \"#7fffd4\", // aquamarine\n  //   \"#ff69b4\", // hotpink\n  // ];\n  const colorsHSL = [\n    \"hsl(60, 100%, 50%)\", // yellow\n    \"hsl(120, 100%, 50%)\", // lime\n    \"hsl(33, 100%, 50%)\", // darkorange\n    \"hsl(0, 100%, 50%)\", // red\n    \"hsl(181, 87%, 41%)\", // darkturquoise\n    \"hsl(25, 76%, 31%)\", // saddlebrown\n    \"hsl(351, 100%, 86%)\", // lightpink\n    \"hsl(348, 83%, 47%)\", // crimson\n    \"hsl(282, 100%, 41%)\", // darkviolet\n    \"hsl(195, 100%, 50%)\", // deepskyblue\n    \"hsl(240, 100%, 27%)\", // darkblue\n    \"hsl(150, 100%, 50%)\", // springgreen\n    \"hsl(180, 25%, 24%)\", // darkslategray\n    \"hsl(82, 39%, 31%)\", // darkolivegreen\n    \"hsl(120, 61%, 34%)\", // forestgreen\n    \"hsl(0, 100%, 25%)\", // maroon2\n    \"hsl(240, 64%, 27%)\", // midnightblue\n    \"hsl(60, 100%, 25%)\", // olive\n    \"hsl(147, 50%, 47%)\", // mediumseagreen\n    \"hsl(180, 100%, 25%)\", // teal\n    \"hsl(43, 89%, 38%)\", // darkgoldenrod\n    \"hsl(207, 44%, 49%)\", // steelblue\n    \"hsl(25, 74%, 47%)\", // chocolate\n    \"hsl(80, 61%, 50%)\", // yellowgreen\n    \"hsl(120, 61%, 50%)\", // limegreen\n    \"hsl(120, 25%, 60%)\", // darkseagreen\n    \"hsl(300, 100%, 25%)\", // purple\n    \"hsl(340, 55%, 47%)\", // maroon3\n    \"hsl(16, 100%, 50%)\", // orangered\n    \"hsl(181, 87%, 41%)\", // darkturquoise (duplicate)\n    \"hsl(51, 100%, 50%)\", // gold\n    \"hsl(240, 100%, 40%)\", // mediumblue\n    \"hsl(33, 57%, 70%)\", // burlywood\n    \"hsl(28, 87%, 67%)\", // sandybrown\n    \"hsl(0, 79%, 72%)\", // lightcoral\n    \"hsl(84, 100%, 59%)\", // greenyellow\n    \"hsl(9, 100%, 64%)\", // tomato\n    \"hsl(302, 59%, 65%)\", // orchid\n    \"hsl(214, 41%, 78%)\", // lightsteelblue\n    \"hsl(300, 100%, 50%)\", // fuchsia\n    \"hsl(210, 100%, 56%)\", // dodgerblue\n    \"hsl(54, 77%, 75%)\", // khaki\n    \"hsl(300, 100%, 75%)\", // plum\n    \"hsl(327, 100%, 54%)\", // deeppink\n    \"hsl(248, 80%, 67%)\", // mediumslateblue\n    \"hsl(180, 65%, 81%)\", // paleturquoise\n    \"hsl(120, 93%, 79%)\", // palegreen\n    \"hsl(160, 100%, 75%)\", // aquamarine\n    \"hsl(330, 100%, 71%)\", // hotpink\n  ];\n  return colorsHSL[index % 49];\n};\n\nconst getColor = (index) => {\n  let color = '';\n  if (index < 49) {\n    color = getColorByIndex(index);\n  } else {\n    color = getColorByIndexFromScale(index);\n  }\n  return color;\n};\n\nfunction wait(delay) {\n  return new Promise((resolve) => setTimeout(resolve, delay));\n}\n\nfunction fetchRetry(url, { delay = 500, tries = 3, backoff_factor = 1 }, fetchOptions = {}) {\n  function onError(err) {\n    const triesLeft = tries - 1;\n    if (!triesLeft) {\n      throw err;\n    }\n    const delayWithBackoff = delay * (tries * backoff_factor);\n    return wait(delay).then(() => fetchRetry(url, { delay: delayWithBackoff, tries: triesLeft, backoff_factor }, fetchOptions));\n  }\n  return fetch(url, fetchOptions).catch(onError);\n}\n\nasync function getFileContents(file) {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = function (e) {\n      const fileContents = e.target.result;\n      resolve(fileContents);\n    };\n    reader.onerror = function (err) {\n      reject(err);\n    };\n    reader.readAsText(file);\n  });\n}\n\nfunction parseJwt(token) {\n  const base64Url = token.split('.')[1];\n  const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n  const jsonPayload = decodeURIComponent(window.atob(base64).split('').map((c) => `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`).join(''));\n\n  return JSON.parse(jsonPayload);\n}\n\nfunction deepCompare(obj1, obj2) {\n  // Get the keys of the objects\n  const keys1 = Object.keys(obj1);\n  const keys2 = Object.keys(obj2);\n\n  // Check if the number of keys is the same\n  if (keys1.length !== keys2.length) {\n    return false;\n  }\n\n  // Check if all keys in obj1 exist in obj2 and have the same value recursively\n  for (const key of keys1) {\n    const val1 = obj1[key];\n    const val2 = obj2[key];\n\n    // Check if both values are objects and if so, perform a recursive deep comparison\n    if (typeof val1 === 'object' && typeof val2 === 'object') {\n      if (!deepCompare(val1, val2)) {\n        return false;\n      }\n    } else if (val1 !== val2) {\n      return false;\n    }\n  }\n\n  // If all checks pass, the objects are deeply equal\n  return true;\n}\n\nfunction getTimeDifference(date1, date2) {\n  // Convert the dates to milliseconds\n  const diffInMs = Math.abs(date2 - date1);\n\n  // Calculate the difference in various units\n  const seconds = Math.floor(diffInMs / 1000);\n  const minutes = Math.floor(seconds / 60);\n  const hours = Math.floor(minutes / 60);\n  const days = Math.floor(hours / 24);\n  const months = Math.floor(days / 30); // Approximate month (30 days)\n  const years = Math.floor(days / 365); // Approximate year (365 days)\n\n  if (years > 0) {\n    return `${years} years ago`;\n  } else if (months > 0) {\n    return `${months} months ago`;\n  } else if (days > 0) {\n    return `${days} days ago`;\n  } else if (hours > 0) {\n    return `${hours} hours ago`;\n  } else if (minutes > 0) {\n    return `${minutes} minutes ago`;\n  } else {\n    return `${seconds} seconds ago`;\n  }\n}\n\nexport {\n  checkpointNameToH5Path,\n  uppercaseFirstLetter,\n  splitStream,\n  parseJSON,\n  debounce,\n  throttle,\n  scaleNanos,\n  inputSanitizer,\n  changeSanitizer,\n  decimalAdjust,\n  roundNumber,\n  getColor,\n  getColorByIndexFromScale,\n  getColorByIndex,\n  hslToHex,\n  fetchRetry,\n  getFileContents,\n  parseJwt,\n  deepCompare,\n  getTimeDifference,\n};\n","import { getFileContents } from '@/assets/js/utils.js';\n\nconst txtFormat5 = ['label_index', 'center_x', 'center_y', 'width', 'height'];\nconst txtFormat6 = ['label_index', 'score', 'center_x', 'center_y', 'width', 'height'];\nconst txtFormatSegment = ['label_index', 'polygon'];\n\nfunction parseLabelIndex(format, columns, annotation) {\n  const i = format.indexOf('label_index');\n  annotation.label_index = parseInt(columns[i]);\n}\nfunction parseScore(format, columns, annotation) {\n  const i = format.indexOf('score');\n  annotation.score = parseFloat(columns[i]);\n}\nfunction parseCenterX(format, columns, annotation) {\n  const cx = columns[format.indexOf('center_x')];\n  const w = columns[format.indexOf('width')];\n  annotation.x = parseFloat(cx) - (parseFloat(w) / 2);\n}\nfunction parseCenterY(format, columns, annotation) {\n  const cy = columns[format.indexOf('center_y')];\n  const h = columns[format.indexOf('height')];\n  annotation.y = parseFloat(cy) - (parseFloat(h) / 2);\n}\nfunction parseWidth(format, columns, annotation) {\n  const w_i = format.indexOf('width');\n  annotation.w = parseFloat(columns[w_i]);\n}\nfunction parseHeight(format, columns, annotation) {\n  const h_i = format.indexOf('height');\n  annotation.h = parseFloat(columns[h_i]);\n}\nfunction parsePolygon(format, columns, annotation) {\n  const polygon_i = format.indexOf('polygon');\n  const polygonColumns = columns.slice(polygon_i);\n  // Group elements as pairs [x, y]\n  const points = [];\n  for (let i = 0; i < polygonColumns.length; i += 2) {\n    points.push([parseFloat(polygonColumns[i]), parseFloat(polygonColumns[i + 1])]);\n  }\n  annotation.polygon = JSON.stringify([points]);\n}\n\nconst formatMap = {\n  label_index: parseLabelIndex,\n  score: parseScore,\n  center_x: parseCenterX,\n  center_y: parseCenterY,\n  width: parseWidth,\n  height: parseHeight,\n  polygon: parsePolygon,\n};\n\nasync function parseAnnotationTextFile(file) {\n  const annotations = [];\n  const fileContents = await getFileContents(file);\n  fileContents.split('\\n').forEach((line) => {\n    // Check that line is valid\n    const columns = line.split(' ');\n    if (line === '' || columns.length === 0) { return; }\n\n    const annotation = {};\n    annotation.polygon = '';\n    annotation.type = 'box';\n    // Determine txt format\n    let format = txtFormat5;\n    if (columns.length === 6) {\n      format = txtFormat6;\n    } else if (columns.length > 6) {\n      format = txtFormatSegment;\n      annotation.type = 'seg';\n    }\n\n    // Parse each column into the annotation\n    format.forEach((col) => {\n      formatMap[col](format, columns, annotation);\n    });\n    annotations.push(annotation);\n  });\n  return annotations;\n}\n\nexport default {\n  parseAnnotationTextFile,\n};\n","import { getFileContents } from '@/assets/js/utils.js';\n\nfunction parseCenterX(cx, w) {\n  return parseFloat(cx) - (parseFloat(w) / 2);\n}\nfunction parseCenterY(cy, h) {\n  return parseFloat(cy) - (parseFloat(h) / 2);\n}\n\nasync function parseAnnotationJsonFile(file, labels) {\n  const annotations = [];\n  const meta = {};\n  let fileContents = '';\n  let json = {};\n  try {\n    fileContents = await getFileContents(file);\n    json = JSON.parse(fileContents);\n  } catch (error) {\n    return { annotations, meta };\n  }\n\n  // Parse boxes\n  json.boxes.forEach((box) => {\n    const cx = box?.[0];\n    const cy = box?.[1];\n    const w = box?.[2];\n    const h = box?.[3];\n    const label_index = box?.[4];\n    annotations.push({\n      label_index,\n      score: 0,\n      x: parseCenterX(cx, w),\n      y: parseCenterY(cy, h),\n      w,\n      h,\n      type: 'box',\n      polygon: '',\n    });\n  });\n\n  // Parse segments\n  json.segment.forEach((segment) => {\n    // Assume class is the first polygon class\n    const label_index = segment?.[0].class;\n    const combinedPolygons = [];\n    segment.forEach((polygon) => {\n      combinedPolygons.push(polygon.polygon);\n    });\n    annotations.push({\n      label_index,\n      score: 0,\n      x: 0,\n      y: 0,\n      w: 0,\n      h: 0,\n      type: 'seg',\n      polygon: JSON.stringify(combinedPolygons),\n    });\n  });\n\n  return { annotations, meta };\n}\n\nexport default {\n  parseAnnotationJsonFile,\n};\n","import { getFileContents } from '@/assets/js/utils.js';\n\nasync function parseAnnotationJsonFile(file, labels) {\n  const annotations = [];\n  const meta = {};\n  let fileContents = '';\n  let json = {};\n  try {\n    fileContents = await getFileContents(file);\n    json = JSON.parse(fileContents);\n  } catch (error) {\n    return { annotations, meta };\n  }\n  json.objects.forEach(async (obj) => {\n    annotations.push({\n      label_index: labels.indexOf(obj.label),\n      label_name: obj.label,\n      score: obj.score,\n      x: obj.bbox.xmin,\n      y: obj.bbox.ymin,\n      w: obj.bbox.xmax - obj.bbox.xmin,\n      h: obj.bbox.ymax - obj.bbox.ymin,\n      type: 'box',\n      polygon: '',\n    });\n  });\n\n  if (json.device_id) {\n    meta.source = json.device_id;\n  } else {\n    const filenameParts = file.name.split('_');\n    if (filenameParts.length > 1) {\n      meta.source = filenameParts[0];\n    }\n  }\n  if (json.timestamp) {\n    meta.timestamp = json.timestamp;\n  }\n  if (json.gps) {\n    meta.gps = {};\n    meta.gps.lat = json.gps.lat;\n    meta.gps.lon = json.gps.lon;\n  }\n  return { annotations, meta };\n}\n\nexport default {\n  parseAnnotationJsonFile,\n};\n","import pLimit from 'p-limit';\nimport { fetchRetry, getFileContents } from '@/assets/js/utils.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport path from 'path-browserify';\n\nconst parseAnnotationsJSON = async (annotationURLs) => {\n  const annotationsJSON = await Promise.all(annotationURLs.map(async (annotationURL) => {\n    const fileContents = await getFileContents(annotationURL);\n    return JSON.parse(fileContents);\n  }));\n\n  return annotationsJSON || [];\n};\n\nconst getLabelIndex = (category_id, categories, databaseLabels) => {\n  const categoryObj = categories.find((category) => category.id === category_id);\n  if (!categoryObj) return -1;\n\n  const categoryName = `${categoryObj.name} - ${categoryObj.supercategory}`;\n  const labelObj = databaseLabels.find((label) => label.name === categoryName);\n  if (!labelObj) return -1;\n\n  return labelObj.index;\n};\n\nconst parseSegmentation = (originalSegmentation, image) => {\n  const normalizedSegmentation = originalSegmentation.map((segmentation) => {\n    const normalizedPoints = [];\n\n    for (let i = 0; i < segmentation.length; i += 2) {\n      const x = segmentation[i] / image.width;\n      const y = segmentation[i + 1] / image.height;\n      normalizedPoints.push([x, y]);\n    }\n\n    return normalizedPoints;\n  });\n\n  return normalizedSegmentation;\n};\n\nconst convertAnnotation = (annotation, image, categories, databaseLabels) => {\n  let convertedAnnotation = {\n    label_index: getLabelIndex(annotation.category_id, categories, databaseLabels),\n    score: 0,\n  };\n\n  if (annotation.bbox) {\n    convertedAnnotation = {\n      ...convertedAnnotation,\n      ...{\n        x: (annotation.bbox[0] / image.width),\n        y: (annotation.bbox[1] / image.height),\n        w: (annotation.bbox[2] / image.width),\n        h: (annotation.bbox[3] / image.height),\n      },\n    };\n    convertedAnnotation.type = 'box';\n  }\n\n  if (annotation.segmentation && annotation.segmentation.length > 0) {\n    convertedAnnotation.polygon = JSON.stringify(parseSegmentation(annotation.segmentation, image));\n    convertedAnnotation.type = 'seg';\n  }\n\n  return convertedAnnotation;\n};\n\nasync function importDataset({ commit, dispatch }, { urls, importParams }) {\n  const dataConnect = new DatastoreConnect('', { delay: 500, tries: 5, backoff_factor: 1 });\n\n  // Filter by image urls\n  const imageURLs = urls.filter((url) => url.file.type.startsWith('image/') && url.file.size > 0);\n  const numImages = imageURLs.length;\n  if (numImages === 0) {\n    alert(\"No valid images found\");\n    return \"Upload Cancelled\";\n  }\n  const imageNameURLMap = imageURLs.reduce((acc, img) => {\n    acc[img.file.name] = { ...img };\n    return acc;\n  }, {});\n\n  // Get annotation files data as json array (one entry per annotation file)\n  const annotationURLs = urls.filter((url) => url.file.type === 'application/json');\n  const annotationJSON = await parseAnnotationsJSON(annotationURLs.map((url) => url.file));\n\n  // Get labels\n  const allLabelObjects = annotationJSON.map((groupJSON) => groupJSON.categories).flat();\n  const labelsToAdd = [...new Set(allLabelObjects.map((obj) => `${obj.name} - ${obj.supercategory}`))];\n  // Add labels to database\n  await dataConnect.addLabel({ label_names: labelsToAdd, dataset_id: importParams.dataset_id });\n  const labels = await dataConnect.getLabelList({ dataset_id: importParams.dataset_id })\n    .then((resp) => {\n      if (resp.result) {\n        return resp.result;\n      }\n      throw Error(\"Failed to get labels from the database\");\n    });\n\n  // Match image object with annotations, match image objects with imageNameURLMap\n  annotationJSON.forEach((groupJSON) => {\n    const imagesIDMap = groupJSON.images.reduce((acc, obj) => {\n      acc[obj.id] = obj;\n      acc[obj.id].annotations = [];\n      return acc;\n    }, {});\n\n    // Copy all annotations to the corresponding image object\n    groupJSON.annotations.forEach((anno) => {\n      imagesIDMap[anno.image_id].annotations.push(convertAnnotation(anno, imagesIDMap[anno.image_id], groupJSON.categories, labels));\n    });\n\n    // Copy image with annotations object to the imageNameURLMap\n    Object.values(imagesIDMap).forEach((imageWithAnnotations) => {\n      if (imageNameURLMap[imageWithAnnotations.file_name]) {\n        imageNameURLMap[imageWithAnnotations.file_name].data = imageWithAnnotations;\n      }\n    });\n  });\n\n  // Add upload task to store and database\n  let dbTask;\n  if (importParams.task) {\n    // Resume from existing docker task\n    const updatedTask = await dataConnect.updateDockerTaskStatus({\n      docker_task_id: importParams.task.id,\n      status: 'running',\n    })\n      .then((resp) => {\n        if (resp.result) {\n          return resp.result;\n        }\n        throw Error(\"Failed to update import task in database to status 'running'\");\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n    dbTask = updatedTask;\n    commit('tasks/resumeUploadTask', dbTask, { root: true });\n  } else {\n    // Create new docker task\n    dbTask = await dataConnect.addDockerTask({\n      name: `Upload To ${importParams.dataset_name}`,\n      project_id: importParams.project_id,\n      docker_id: '',\n      type: 'upload',\n      status: 'running',\n      total: numImages,\n      data: {\n        dataset_id: importParams.dataset_id,\n        annotation_set_id: importParams.annotation_set_id,\n        s3_path: importParams.importer_source,\n        import_type: importParams.import_type,\n      },\n    })\n      .then((resp) => {\n        if (resp.result) {\n          return resp.result;\n        }\n        throw Error(\"Failed to create import task in database\");\n      })\n      .catch((error) => {\n        console.error(error);\n        throw error;\n      });\n    commit('tasks/addNewUploadTask', dbTask, { root: true });\n  }\n\n  // Add groups to database\n  let groups = [];\n  if (importParams.create_image_groups) {\n    const createGroupsParams = {\n      dataset_id: importParams.dataset_id,\n      group_names: [],\n      group_splits: [],\n    };\n    importParams.create_image_groups.forEach((createGroup) => {\n      createGroupsParams.group_names.push(createGroup);\n      createGroupsParams.group_splits.push(0);\n    });\n\n    groups = await dataConnect.createGroupsForDataset(createGroupsParams).then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error);\n      }\n      return resp.result;\n    })\n      .catch((error) => {\n        console.error(error);\n      });\n  }\n\n  const promises = [];\n  const max_concurrent_req = 6;\n  const limit = pLimit(max_concurrent_req);\n  const numAnnotationFileParseFailed = 0;\n  let imageUploadSuccessCount = 0;\n  Object.values(imageNameURLMap).forEach((image) => {\n    promises.push(limit(async () => {\n      // Handle creating database entry and uploading image/thumbnail files to S3\n      if (image.file) {\n        const imageRelativePath = image.file.relativePath || image.file.webkitRelativePath || image.file.name;\n\n        // Parse image metadata\n        let imageInfo;\n        let thumbnail;\n        try {\n          ({ imageInfo, thumbnail } = await dispatch('parseImage', image.file));\n        } catch (error) {\n          console.log(error);\n        }\n\n        // Create database entry for uploaded image\n        const uploadData = {\n          dataset_id: importParams.dataset_id,\n          annotation_set_id: importParams.annotation_set_id,\n          image_width: imageInfo.width,\n          image_height: imageInfo.height,\n          image_filepath: imageRelativePath,\n          s3_path: importParams.importer_source,\n          docker_task_id: dbTask.id,\n        };\n\n        // Parse auto created group\n        const pathSplit = path.normalize(imageRelativePath).split(path.sep);\n        if (pathSplit.length > 1 && importParams.create_image_groups?.includes(pathSplit[1])) {\n          const toCreateGroup = groups.find((group) => group.name === pathSplit[1]);\n          uploadData.group_id = toCreateGroup.id;\n        }\n\n        if (importParams.group_id) {\n          uploadData.group_id = importParams.group_id;\n        }\n\n        // if (imageInfo.exif) {\n        //   if (imageInfo.exif.annotations && imageInfo.exif.annotations.length > 0) {\n        //     uploadData.annotations = imageInfo.exif.annotations;\n        //   }\n        //   if (imageInfo.exif.meta && imageInfo.exif.meta.gps.lon && imageInfo.exif.meta.gps.lat) {\n        //     uploadData.lon = imageInfo.exif.meta.gps.lon;\n        //     uploadData.lat = imageInfo.exif.meta.gps.lat;\n        //   }\n        //   if (imageInfo.exif.meta && imageInfo.exif.meta.timestamp) {\n        //     uploadData.timestamp = imageInfo.exif.meta.timestamp;\n        //   }\n        // }\n\n        if (image.data.annotations.length > 0) {\n          uploadData.annotations = image.data.annotations;\n        }\n\n        if (image.data.date_captured) {\n          uploadData.timestamp = Math.round((new Date(image.data.date_captured)).getTime() * 1000000);\n        }\n\n        // if (annotationMeta?.source) {\n        //   uploadData.image_source = annotationMeta.source;\n        // }\n\n        // if (annotationMeta?.gps) {\n        //   uploadData.lat = annotationMeta.gps.lat;\n        //   uploadData.lon = annotationMeta.gps.lon;\n        // }\n        await dataConnect.addUploadData(uploadData)\n          .then(async () => {\n            imageUploadSuccessCount += 1;\n            // Upload image file to S3 bucket using presigned url\n            await fetchRetry(image.url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n              method: 'PUT',\n              body: image.file,\n            })\n              .then(async () => {\n                // Upload thumbnail to S3 bucket using presigned url\n                fetchRetry(image.thumbnail_url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n                  method: 'PUT',\n                  body: thumbnail,\n                })\n                  .catch((error) => {\n                    // Handle thumbnail upload error\n                    console.error(error);\n                  });\n              })\n              .catch((error) => {\n                // Handle image upload error\n                console.error(error);\n              });\n          })\n          .catch((error) => {\n            // TODO handle database fail\n            console.error(error);\n          });\n      }\n    }));\n  });\n  await Promise.all(promises);\n\n  if (numAnnotationFileParseFailed) {\n    console.log(\"Number of failed annotation parses:\", numAnnotationFileParseFailed);\n  }\n\n  dataConnect.completeUpload()\n    .then(() => commit('notifications/updateNotifications', true));\n\n  // Remove upload task from store and set to complete in database\n  // commit('tasks/removeUploadTask', { taskID }, { root: true });\n  dataConnect.updateDockerTaskStatus({\n    docker_task_id: dbTask.id,\n    status: 'complete',\n  });\n\n  return \"Upload Complete\";\n}\n\nexport default {\n  importDataset,\n};\n","import pLimit from 'p-limit';\nimport { fetchRetry, getFileContents } from '@/assets/js/utils';\nimport exifr from 'exifr';\nimport path from 'path-browserify';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport MediaInfoFactory from 'mediainfo.js';\nimport darknet from './darknet';\nimport modelpack from './modelpack';\nimport maivin from './maivin';\nimport coco from './coco';\n\nconst annotationImporters = {\n  darknet,\n  modelpack,\n  maivin,\n};\n\nconst thumbnailSize = 256;\n\nasync function parseLabelsTxt(file) {\n  const labels = [];\n  const fileContents = await getFileContents(file);\n  fileContents.split('\\n').forEach((line) => {\n    // Check that line is valid\n    if (line !== '') {\n      labels.push(line);\n    }\n  });\n  return labels;\n}\n\nasync function parseAnnotationFile(importer, file, labels) {\n  let annotations;\n  let meta = {};\n  if (file.type === 'text/plain') {\n    if (!importer.parseAnnotationTextFile) {\n      throw Error(\"Can't parse txt\");\n    }\n    annotations = await importer.parseAnnotationTextFile(file);\n  } else if (file.type === 'application/json') {\n    if (!importer.parseAnnotationJsonFile) {\n      throw Error(\"Can't parse JSON\");\n    }\n    ({ annotations, meta } = await importer.parseAnnotationJsonFile(file, labels));\n  }\n  return { annotations, meta };\n}\n\nfunction createThumbnail(img) {\n  return new Promise((resolve) => {\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d');\n\n    // Calculate the dimensions for the thumbnail\n    const maxWidth = thumbnailSize; // Adjust this as needed\n    const maxHeight = thumbnailSize; // Adjust this as needed\n    let width = img.width;\n    let height = img.height;\n\n    if (width > maxWidth || height > maxHeight) {\n      const aspectRatio = width / height;\n      if (width > maxWidth) {\n        width = maxWidth;\n        height = maxWidth / aspectRatio;\n      }\n      if (height > maxHeight) {\n        height = maxHeight;\n        width = maxHeight * aspectRatio;\n      }\n    }\n\n    // Set the canvas size\n    canvas.width = width;\n    canvas.height = height;\n\n    // Draw the image on the canvas to create the thumbnail\n    ctx.drawImage(img, 0, 0, width, height);\n\n    // Convert the canvas to a Blob with JPG format\n    canvas.toBlob(resolve, 'image/jpeg');\n  });\n}\n\nfunction createVideoThumbnail(file, videoDimensions) {\n  return new Promise((resolve) => {\n    const videoPath = URL.createObjectURL(file);\n\n    const video = document.createElement('video');\n    video.onerror = (e) => { console.log(e); };\n    video.onloadeddata = () => {\n      const canvas = document.createElement('canvas');\n      const ctx = canvas.getContext('2d');\n\n      // Calculate the dimensions for the thumbnail\n      const maxWidth = thumbnailSize; // Adjust this as needed\n      const maxHeight = thumbnailSize; // Adjust this as needed\n      let width = videoDimensions.width;\n      let height = videoDimensions.height;\n\n      if (width > maxWidth || height > maxHeight) {\n        const aspectRatio = width / height;\n        if (width > maxWidth) {\n          width = maxWidth;\n          height = maxWidth / aspectRatio;\n        }\n        if (height > maxHeight) {\n          height = maxHeight;\n          width = maxHeight * aspectRatio;\n        }\n      }\n\n      // Set the canvas size\n      canvas.width = width;\n      canvas.height = height;\n\n      // Draw the image on the canvas to create the thumbnail\n      ctx.drawImage(video, 0, 0, width, height);\n\n      video.pause();\n\n      // Convert the canvas to a Blob with JPG format\n      canvas.toBlob(resolve, 'image/jpeg');\n    };\n\n    video.autoplay = true;\n    video.muted = true;\n    video.src = videoPath;\n  });\n}\n\nasync function readUserComment(json_raw) {\n  let json_str = json_raw.substring(json_raw.indexOf(\"{\"));\n  json_str = json_str.trim();\n  const json = JSON.parse(json_str);\n  const userComment = json;\n  const annotations = [];\n  const meta = {};\n  json.objects.forEach((obj) => {\n    annotations.push({\n      label_index: -1,\n      label_name: obj.label,\n      score: obj.score,\n      x: obj.bbox.xmin,\n      y: obj.bbox.ymin,\n      w: obj.bbox.xmax - obj.bbox.xmin,\n      h: obj.bbox.ymax - obj.bbox.ymin,\n      type: 'box',\n      polygon: '',\n    });\n  });\n\n  if (json.device_id) {\n    meta.source = json.device_id;\n  }\n  if (json.timestamp) {\n    meta.timestamp = json.timestamp;\n  }\n  if (json.gps) {\n    meta.gps = {};\n    meta.gps.lat = json.gps.lat;\n    meta.gps.lon = json.gps.lon;\n  }\n  return { annotations, meta, userComment };\n}\n\nasync function getExifData(imageData) {\n  // Try to get exif data\n  let exifResult = {\n    annotations: [],\n    meta: {\n      gps: {},\n      timestamp: 0,\n    },\n  };\n  const options = {\n    userComment: true,\n  };\n  let exifData;\n  try {\n    exifData = await exifr.parse(imageData, options);\n  } catch (error) {\n    console.log(error);\n    throw Error(\"Failed to parse EXIF\");\n  }\n  if (!exifData) {\n    return exifResult;\n  }\n\n  // Parse exif data\n  if (exifData.latitude && exifData.longitude) {\n    exifResult.meta.gps.lat = exifData.latitude;\n    exifResult.meta.gps.lon = exifData.longitude;\n  }\n  if (exifData.DateTimeOriginal) {\n    exifResult.meta.timestamp = Math.round(exifData.DateTimeOriginal.getTime() * 1000000);\n  }\n\n  if (exifData.userComment) {\n    try {\n      exifResult = readUserComment(exifData.userComment);\n    } catch (error) {\n      // Do Nothing\n      console.error(error);\n    }\n  }\n\n  return exifResult;\n}\n\nasync function getMediaInfo(file) {\n  const mediaInfo = await MediaInfoFactory({ format: 'object' });\n\n  const getSize = () => file.size;\n\n  const readChunk = (chunkSize, offset) => new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = (event) => {\n      if (event.target.error) {\n        reject(event.target.error);\n      }\n      resolve(new Uint8Array(event.target.result));\n    };\n    reader.readAsArrayBuffer(file.slice(offset, offset + chunkSize));\n  });\n  const mediaInfoResult = await mediaInfo\n    .analyzeData(getSize, readChunk)\n    .catch((error) => {\n      console.log(error);\n    });\n\n  return mediaInfoResult;\n}\n\nconst actions = {\n  parseImage({ commit, dispatch }, file) {\n    return new Promise((resolve, reject) => {\n      const imageInfo = {};\n      // Function to extract EXIF data using exif-js library\n      const reader = new FileReader();\n      reader.onload = function (e) {\n        const imageArrayBuffer = e.target.result;\n        const image = new Image();\n        image.onload = async function () {\n          // Get image dimensions\n          imageInfo.width = image.naturalWidth;\n          imageInfo.height = image.naturalHeight;\n\n          // const thumbnail = await createThumbnail(image);\n\n          try {\n            const exifData = await getExifData(imageArrayBuffer);\n            imageInfo.exif = exifData;\n          } catch (error) {\n            console.log(error);\n          }\n          resolve({ imageInfo });\n        };\n        image.onerror = function () {\n          reject(Error(`Failed to parse image: ${file.name}`));\n        };\n\n        image.src = URL.createObjectURL(file);\n      };\n      reader.onerror = function () {\n        reject(Error(`Failed to parse image: ${file.name}`));\n      };\n      reader.readAsArrayBuffer(file);\n    });\n  },\n\n  parseVideo({ commit, dispatch }, file) {\n    return new Promise((resolve, reject) => {\n      const videoDimensions = {};\n      let videoMeta = {};\n\n      const video = document.createElement('video');\n      video.controls = true;\n\n      // Function to extract EXIF data using exif-js library\n      const reader = new FileReader();\n      reader.onload = function (e) {\n        const videoArrayBuffer = e.target.result;\n\n        video.onloadedmetadata = async function () {\n          // Get image dimensions\n          videoDimensions.width = this.videoWidth;\n          videoDimensions.height = this.videoHeight;\n\n          // Get media info about the video\n          const mediaInfoResult = await getMediaInfo(file);\n          const generalTrack = mediaInfoResult?.media?.track?.[0];\n          if (generalTrack) {\n            videoMeta = {\n              ...videoMeta,\n              ...generalTrack,\n            };\n          }\n\n          const thumbnail = await createVideoThumbnail(file, videoDimensions);\n          // try {\n          //   const exifData = await getExifData(imageArrayBuffer);\n          //   imageInfo.exif = exifData;\n          // } catch (error) {\n          //   console.log(error);\n          //   // reject(error);\n          // }\n\n          resolve({ videoDimensions, videoMeta, thumbnail });\n        };\n\n        video.src = URL.createObjectURL(new Blob([videoArrayBuffer]));\n      };\n\n      reader.readAsArrayBuffer(file);\n    });\n  },\n\n  async import({ commit, dispatch }, { urls, importParams }) {\n    const dataConnect = new DatastoreConnect('', { delay: 500, tries: 5, backoff_factor: 1 });\n    const annotationFileTypes = ['application/json', 'text/plain'];\n\n    // Match image files with annotation files\n    let importFileGroups = {};\n    let labelsFromFile = [];\n    urls.forEach(async (presignedUrl) => {\n      if (presignedUrl.file.name === 'labels.txt') {\n        labelsFromFile = parseLabelsTxt(presignedUrl.file);\n        return;\n      }\n\n      const basename = path.basename(presignedUrl.file.name, path.extname(presignedUrl.file.name));\n      const fileGroup = importFileGroups[basename];\n      if (!fileGroup) { importFileGroups[basename] = {}; }\n\n      if (presignedUrl.file.type.startsWith('image/') && presignedUrl.file.size > 0) {\n        importFileGroups[basename].imageFile = presignedUrl;\n      } else if (presignedUrl.file.type.startsWith('video/') && presignedUrl.file.size > 0) {\n        importFileGroups[basename].videoFile = presignedUrl;\n      } else if (annotationFileTypes.includes(presignedUrl.file.type)) {\n        importFileGroups[basename].annotationFile = presignedUrl;\n      }\n    });\n\n    // Filter empty groups caused by empty files\n    importFileGroups = Object.fromEntries(Object.entries(importFileGroups).filter(([key, value]) => Object.keys(value).length > 0));\n\n    const numImages = Object.values(importFileGroups).length;\n    if (numImages === 0) {\n      alert(\"No valid images found\");\n      return \"Upload Cancelled\";\n    }\n\n    // Add upload task to store and database\n    let dbTask;\n    if (importParams.task) {\n      // Resume from existing docker task\n      const updatedTask = await dataConnect.updateDockerTaskStatus({\n        docker_task_id: importParams.task.id,\n        status: 'running',\n      })\n        .then((resp) => {\n          if (resp.result) {\n            return resp.result;\n          }\n          throw Error(\"Failed to update import task in database to status 'running'\");\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n      dbTask = updatedTask;\n      commit('tasks/resumeUploadTask', dbTask, { root: true });\n    } else {\n      // Create new docker task\n      dbTask = await dataConnect.addDockerTask({\n        name: `Upload To ${importParams.dataset_name}`,\n        project_id: importParams.project_id,\n        docker_id: '',\n        type: 'upload',\n        status: 'running',\n        total: numImages,\n        data: {\n          dataset_id: importParams.dataset_id,\n          annotation_set_id: importParams.annotation_set_id,\n          s3_path: importParams.importer_source,\n          import_type: importParams.import_type,\n        },\n      })\n        .then(async (resp) => {\n          if (resp.result) {\n            await dataConnect.updateDataset({\n              dataset_id: importParams.dataset_id,\n              docker_task_id: resp.result.id,\n            })\n              .then((data) => {\n                if (data.error) {\n                  throw Error(\"Failed to update dataset status\");\n                }\n              })\n              .catch((error) => {\n                console.log(error);\n              });\n            return resp.result;\n          }\n          throw Error(\"Failed to create import task in database\");\n        })\n        .catch((error) => {\n          console.error(error);\n          throw error;\n        });\n      commit('tasks/addNewUploadTask', dbTask, { root: true });\n    }\n\n    // Add labels to database\n    labelsFromFile = await labelsFromFile;\n    await dataConnect.addLabel({ label_names: labelsFromFile, dataset_id: importParams.dataset_id });\n\n    const labels = await dataConnect.getLabelList({ dataset_id: importParams.dataset_id })\n      .then((resp) => {\n        if (resp.result) {\n          return resp.result;\n        }\n        throw Error(\"Failed to get labels from the database\");\n      });\n\n    // Add groups to database\n    let groups = [];\n    if (importParams.create_image_groups) {\n      const createGroupsParams = {\n        dataset_id: importParams.dataset_id,\n        group_names: [],\n        group_splits: [],\n      };\n      importParams.create_image_groups.forEach((createGroup) => {\n        createGroupsParams.group_names.push(createGroup);\n        createGroupsParams.group_splits.push(0);\n      });\n\n      groups = await dataConnect.createGroupsForDataset(createGroupsParams).then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error);\n        }\n        return resp.result;\n      })\n        .catch((error) => {\n          console.error(error);\n        });\n    }\n\n    const promises = [];\n    const max_concurrent_req = 6;\n    const limit = pLimit(max_concurrent_req);\n    let numAnnotationFileParseFailed = 0;\n    let imageUploadSuccessCount = 0;\n    Object.values(importFileGroups).forEach((importFileGroup) => {\n      promises.push(limit(async () => {\n        // Handle creating database entry and uploading image/thumbnail files to S3\n        if (importFileGroup.imageFile) {\n          const imageRelativePath = importFileGroup.imageFile.file.relativePath || importFileGroup.imageFile.file.webkitRelativePath || importFileGroup.imageFile.file.name;\n\n          // Parse image metadata\n          let imageInfo;\n          // let thumbnail;\n          try {\n            ({ imageInfo } = await dispatch('parseImage', importFileGroup.imageFile.file));\n          } catch (error) {\n            console.error(error);\n            return;\n          }\n\n          // Parse Annotation File\n          let annotations = [];\n          let annotationMeta;\n          if (importFileGroup.annotationFile) {\n            const annotationImporter = annotationImporters[importParams.import_type];\n            if (annotationImporter) {\n              try {\n                ({ annotations, meta: annotationMeta } = await parseAnnotationFile(annotationImporter, importFileGroup.annotationFile.file, labels));\n              } catch (error) {\n                console.error(error);\n                numAnnotationFileParseFailed += 1;\n              }\n            }\n          }\n\n          // Create database entry for uploaded image\n          const uploadData = {\n            dataset_id: importParams.dataset_id,\n            annotation_set_id: importParams.annotation_set_id,\n            image_width: imageInfo.width,\n            image_height: imageInfo.height,\n            image_filepath: imageRelativePath,\n            s3_path: importParams.importer_source,\n            docker_task_id: dbTask.id,\n            type: 'image',\n          };\n\n          // Parse auto created group\n          const pathSplit = path.normalize(imageRelativePath).split(path.sep);\n          if (pathSplit.length > 1 && importParams.create_image_groups?.includes(pathSplit[1])) {\n            const toCreateGroup = groups.find((group) => group.name === pathSplit[1]);\n            uploadData.group_id = toCreateGroup.id;\n          }\n\n          if (importParams.group_id) {\n            uploadData.group_id = importParams.group_id;\n          }\n\n          if (imageInfo.exif) {\n            if (imageInfo.exif.annotations && imageInfo.exif.annotations.length > 0) {\n              uploadData.annotations = imageInfo.exif.annotations;\n            }\n            if (imageInfo.exif.meta && imageInfo.exif.meta.gps.lon && imageInfo.exif.meta.gps.lat) {\n              uploadData.lon = imageInfo.exif.meta.gps.lon;\n              uploadData.lat = imageInfo.exif.meta.gps.lat;\n            }\n            if (imageInfo.exif.meta && imageInfo.exif.meta.timestamp) {\n              uploadData.timestamp = imageInfo.exif.meta.timestamp;\n            }\n            if (imageInfo.exif.meta && imageInfo.exif.meta.source) {\n              uploadData.image_source = imageInfo.exif.meta.source;\n            }\n          }\n\n          if (annotations.length > 0) {\n            uploadData.annotations = annotations;\n          }\n          if (annotationMeta?.source) {\n            uploadData.image_source = annotationMeta.source;\n          }\n          if (annotationMeta?.timestamp) {\n            uploadData.timestamp = annotationMeta.timestamp;\n          }\n          if (annotationMeta?.gps) {\n            uploadData.lat = annotationMeta.gps.lat;\n            uploadData.lon = annotationMeta.gps.lon;\n          }\n          if (imageInfo.exif.userComment) {\n            // Append userComment to meta column if exists\n            uploadData.meta = { ...uploadData.meta, user_comment: imageInfo.exif.userComment };\n          }\n          await dataConnect.addUploadData(uploadData)\n            .then(async () => {\n              imageUploadSuccessCount += 1;\n              // Upload image file to S3 bucket using presigned url\n              await fetchRetry(importFileGroup.imageFile.url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n                method: 'PUT',\n                body: importFileGroup.imageFile.file,\n              })\n                // .then(async () => {\n                //   // Upload thumbnail to S3 bucket using presigned url\n                //   fetchRetry(importFileGroup.imageFile.thumbnail_url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n                //     method: 'PUT',\n                //     body: thumbnail,\n                //   })\n                //     .catch((error) => {\n                //       // Handle thumbnail upload error\n                //       console.error(error);\n                //     });\n                // })\n                .catch((error) => {\n                  // Handle image upload error\n                  console.error(error);\n                });\n            })\n            .catch((error) => {\n              // TODO handle database fail\n              console.error(error);\n            });\n        }\n        if (importFileGroup.videoFile) {\n          const imageRelativePath = importFileGroup.videoFile.file.relativePath || importFileGroup.videoFile.file.webkitRelativePath || importFileGroup.videoFile.file.name;\n\n          // Parse image metadata\n          let videoDimensions;\n          let videoMeta;\n          let thumbnail;\n          try {\n            ({ videoDimensions, videoMeta, thumbnail } = await dispatch('parseVideo', importFileGroup.videoFile.file));\n          } catch (error) {\n            console.log(error);\n          }\n\n          // Parse Annotation File\n          // let annotations = [];\n          // let annotationMeta;\n          // if (importFileGroup.annotationFile) {\n          //   const annotationImporter = annotationImporters[importParams.import_type];\n          //   if (annotationImporter) {\n          //     try {\n          //       ({ annotations, meta: annotationMeta } = await parseAnnotationFile(annotationImporter, importFileGroup.annotationFile.file, labels));\n          //     } catch (error) {\n          //       console.log(error);\n          //       numAnnotationFileParseFailed += 1;\n          //     }\n          //   }\n          // }\n\n          // Create database entry for uploaded image\n          const uploadData = {\n            dataset_id: importParams.dataset_id,\n            annotation_set_id: importParams.annotation_set_id,\n            image_width: videoDimensions.width,\n            image_height: videoDimensions.height,\n            image_filepath: imageRelativePath,\n            s3_path: importParams.importer_source,\n            docker_task_id: dbTask.id,\n            type: 'video',\n            meta: videoMeta,\n          };\n\n          // Parse auto created group\n          const pathSplit = path.normalize(imageRelativePath).split(path.sep);\n          if (pathSplit.length > 1 && importParams.create_image_groups?.includes(pathSplit[1])) {\n            const toCreateGroup = groups.find((group) => group.name === pathSplit[1]);\n            uploadData.group_id = toCreateGroup.id;\n          }\n\n          if (importParams.group_id) {\n            uploadData.group_id = importParams.group_id;\n          }\n\n          // if (imageInfo.exif) {\n          //   if (imageInfo.exif.annotations && imageInfo.exif.annotations.length > 0) {\n          //     uploadData.annotations = imageInfo.exif.annotations;\n          //   }\n          //   if (imageInfo.exif.meta && imageInfo.exif.meta.gps.lon && imageInfo.exif.meta.gps.lat) {\n          //     uploadData.lon = imageInfo.exif.meta.gps.lon;\n          //     uploadData.lat = imageInfo.exif.meta.gps.lat;\n          //   }\n          //   if (imageInfo.exif.meta && imageInfo.exif.meta.timestamp) {\n          //     uploadData.timestamp = imageInfo.exif.meta.timestamp;\n          //   }\n          // }\n\n          // if (annotations.length > 0) {\n          //   uploadData.annotations = annotations;\n          // }\n          // if (annotationMeta?.source) {\n          //   uploadData.image_source = annotationMeta.source;\n          // }\n          // if (annotationMeta?.timestamp) {\n          //   uploadData.timestamp = annotationMeta.timestamp;\n          // }\n          // if (annotationMeta?.gps) {\n          //   uploadData.lat = annotationMeta.gps.lat;\n          //   uploadData.lon = annotationMeta.gps.lon;\n          // }\n          await dataConnect.addUploadData(uploadData)\n            .then(async () => {\n              imageUploadSuccessCount += 1;\n              // Upload image file to S3 bucket using presigned url\n              await fetchRetry(importFileGroup.videoFile.url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n                method: 'PUT',\n                body: importFileGroup.videoFile.file,\n              })\n                .then(async () => {\n                  // Upload thumbnail to S3 bucket using presigned url\n                  fetchRetry(importFileGroup.videoFile.thumbnail_url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n                    method: 'PUT',\n                    body: thumbnail,\n                  })\n                    .catch((error) => {\n                      // Handle thumbnail upload error\n                      console.error(error);\n                    });\n                })\n                .catch((error) => {\n                  // Handle image upload error\n                  console.error(error);\n                });\n            })\n            .catch((error) => {\n              // TODO handle database fail\n              console.error(error);\n            });\n        }\n      }));\n    });\n    await Promise.all(promises);\n\n    if (numAnnotationFileParseFailed) {\n      console.log(\"Number of failed annotation parses:\", numAnnotationFileParseFailed);\n    }\n\n    dataConnect.completeUpload()\n      .then(() => commit('notifications/updateNotifications', true));\n\n    // Remove upload task from store and set to complete in database\n    // commit('tasks/removeUploadTask', { taskID }, { root: true });\n    dataConnect.updateDockerTaskStatus({\n      docker_task_id: dbTask.id,\n      status: 'complete',\n    });\n    dataConnect.updateDataset({\n      dataset_id: importParams.dataset_id,\n      docker_task_id: null,\n    })\n      .then((data) => {\n        if (data.error) {\n          throw Error(\"Failed to update dataset status\");\n        }\n      });\n\n    return \"Upload Complete\";\n  },\n\n  async importWithDocker({ commit, dispatch }, { urls, taskID }) {\n    const promises = [];\n    const max_concurrent_req = 10;\n    const limit = pLimit(max_concurrent_req);\n    urls.forEach((presignedUrl) => {\n      promises.push(limit(() => fetchRetry(presignedUrl.url, { delay: 500, tries: 5, backoff_factor: 1 }, {\n        method: 'PUT',\n        body: presignedUrl.file,\n      })\n        .then(() => {\n          commit('tasks/updateUploadTaskPercent', { taskID }, { root: true });\n        })));\n    });\n    return Promise.all(promises);\n  },\n\n  async importByType({ commit, dispatch }, { urls, importParams }) {\n    switch (importParams.import_type) {\n    case \"coco\":\n      return coco.importDataset({ commit, dispatch }, { urls, importParams });\n    default:\n      return dispatch('import', { urls, importParams });\n    }\n  },\n};\n\nexport default {\n  namespaced: true,\n  actions,\n};\n","import pLimit from 'p-limit';\nimport { fetchRetry, getFileContents } from '@/assets/js/utils';\nimport exifr from 'exifr';\nimport path from 'path-browserify';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport darknet from './darknet';\nimport modelpack from './modelpack';\nimport maivin from './maivin';\n\nconst annotationImporters = {\n  darknet,\n  modelpack,\n  maivin,\n};\n\nasync function parseLabelsTxt(file) {\n  const labels = [];\n  const fileContents = await getFileContents(file);\n  fileContents.split('\\n').forEach((line) => {\n    // Check that line is valid\n    if (line !== '') {\n      labels.push(line);\n    }\n  });\n  return labels;\n}\n\nasync function parseAnnotationFile(importer, file, labels) {\n  let annotations;\n  let meta = {};\n  if (file.type === 'text/plain') {\n    if (!importer.parseAnnotationTextFile) {\n      throw Error(\"Can't parse txt\");\n    }\n    annotations = await importer.parseAnnotationTextFile(file);\n  } else if (file.type === 'application/json') {\n    if (!importer.parseAnnotationJsonFile) {\n      throw Error(\"Can't parse JSON\");\n    }\n    ({ annotations, meta } = await importer.parseAnnotationJsonFile(file, labels));\n  }\n  return { annotations, meta };\n}\n\nconst actions = {\n  async importAnnotationsDarknet({ commit, dispatch }, { files, importParams }) {\n    const dataConnect = new DatastoreConnect('', { delay: 500, tries: 5, backoff_factor: 1 });\n    const annotationFileTypes = ['application/json', 'text/plain'];\n\n    // Match image files with annotation files\n    const importFileGroups = {};\n    let labelsFromFile = [];\n    files.forEach(async (file) => {\n      if (file.name === 'labels.txt') {\n        labelsFromFile = parseLabelsTxt(file);\n        return;\n      }\n      const basename = path.basename(file.name, path.extname(file.name));\n      const fileGroup = importFileGroups[basename];\n      if (!fileGroup) { importFileGroups[basename] = {}; }\n\n      if (annotationFileTypes.includes(file.type)) {\n        importFileGroups[basename].annotationFile = file;\n      }\n    });\n    const numAnnotations = Object.values(importFileGroups).filter((group) => group.annotationFile).length;\n\n    // Add upload task to store and database\n    let dbTask;\n    if (importParams.task) {\n      // Resume from existing docker task\n      const updatedTask = await dataConnect.updateDockerTaskStatus({\n        docker_task_id: importParams.task.id,\n        status: 'running',\n      })\n        .then((resp) => {\n          if (resp.result) {\n            return resp.result;\n          }\n          throw Error(\"Failed to update import task in database to status 'running'\");\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n      dbTask = updatedTask;\n      commit('tasks/resumeUploadTask', dbTask, { root: true });\n    } else {\n      // Create new docker task\n      dbTask = await dataConnect.addDockerTask({\n        name: `Upload To ${importParams.dataset_name}`,\n        project_id: importParams.project_id,\n        docker_id: '',\n        type: 'upload',\n        status: 'running',\n        total: numAnnotations,\n        data: {\n          dataset_id: importParams.dataset_id,\n          annotation_set_id: importParams.annotation_set_id,\n          s3_path: importParams.importer_source,\n          import_type: importParams.import_type,\n        },\n      })\n        .then((resp) => {\n          if (resp.result) {\n            return resp.result;\n          }\n          throw Error(\"Failed to create import task in database\");\n        })\n        .catch((error) => {\n          console.error(error);\n          throw error;\n        });\n      commit('tasks/addNewUploadTask', dbTask, { root: true });\n    }\n\n    // Add labels to database\n    labelsFromFile = await labelsFromFile;\n    await dataConnect.addLabel({ label_names: labelsFromFile, dataset_id: importParams.dataset_id });\n\n    const labels = await dataConnect.getLabelList({ dataset_id: importParams.dataset_id })\n      .then((resp) => {\n        if (resp.result) {\n          return resp.result;\n        }\n        throw Error(\"Failed to get labels from the database\");\n      });\n\n    const promises = [];\n    const max_concurrent_req = 6;\n    const limit = pLimit(max_concurrent_req);\n    let numAnnotationFileParseFailed = 0;\n    Object.values(importFileGroups).forEach((importFileGroup) => {\n      promises.push(limit(async () => {\n        // Parse Annotation File\n        let annotations = [];\n        let annotationMeta;\n        if (importFileGroup.annotationFile) {\n          const annotationImporter = annotationImporters['darknet'];\n          if (annotationImporter) {\n            try {\n              ({ annotations, meta: annotationMeta } = await parseAnnotationFile(annotationImporter, importFileGroup.annotationFile, labels));\n            } catch (error) {\n              console.log(error);\n              numAnnotationFileParseFailed += 1;\n            }\n          }\n        }\n        // Create database entry for uploaded image\n        const uploadData = {\n          dataset_id: importParams.dataset_id,\n          annotation_set_id: importParams.annotation_set_id,\n          docker_task_id: dbTask.id,\n          img_name: path.parse(importFileGroup.annotationFile.name).name,\n          timestamp: Date.now(),\n        };\n\n        if (annotations.length > 0) {\n          uploadData.annotations = annotations;\n        } else {\n          return;\n        }\n        if (annotationMeta?.timestamp) {\n          uploadData.timestamp = annotationMeta.timestamp;\n        }\n        await dataConnect.uploadAnnotations(uploadData)\n          .catch((error) => {\n            // TODO handle database fail\n            console.error(error);\n          });\n      }));\n    });\n    await Promise.all(promises);\n\n    if (numAnnotationFileParseFailed) {\n      console.log(\"Number of failed annotation parses:\", numAnnotationFileParseFailed);\n    }\n\n    // Remove upload task from store and set to complete in database\n    // commit('tasks/removeUploadTask', { taskID }, { root: true });\n    dataConnect.updateDockerTaskStatus({\n      docker_task_id: dbTask.id,\n      status: 'complete',\n    });\n\n    return \"Upload Complete\";\n  },\n};\n\nexport default {\n  namespaced: true,\n  actions,\n};\n","import { createStore } from 'vuex';\nimport VuexPersistence from 'vuex-persist';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport importer from './modules/importer/importer';\nimport annotations from './modules/importer/annotations';\n\nconst vuexLocal = new VuexPersistence({\n  storage: window.sessionStorage,\n  modules: ['appVersion', 'user', 'datasets', 'annotationTool', 'projects', 'reviews', 'statistics', 'notifications'],\n});\n\nconst appVersion = {\n  namespaced: true,\n  state: () => ({\n    version: '',\n    isSaas: '',\n    allowDebug: '',\n    frontendVersion: '',\n  }),\n  mutations: {\n    setVersion(state, payload) {\n      state.version = payload;\n    },\n    setIsSaas(state, payload) {\n      state.isSaas = payload;\n    },\n    setFrontendVersion(state, payload) {\n      state.frontendVersion = payload;\n    },\n    setAllowDebug(state, payload) {\n      state.allowDebug = payload;\n    },\n  },\n};\n\nconst user = {\n  namespaced: true,\n  state: () => ({\n    user: null,\n    token: null,\n    tokenRefreshTask: null,\n    permissions: null,\n    userList: null,\n  }),\n  mutations: {\n    setUser(state, userPayload) {\n      state.user = userPayload;\n    },\n    setToken(state, tokenPayload) {\n      state.token = tokenPayload;\n\n      store.dispatch('user/autoRefreshToken', tokenPayload);\n    },\n    logout(state) {\n      clearInterval(state.tokenRefreshTask);\n      state.tokenRefreshTask = null;\n      state.token = \"\";\n      state.user = null;\n    },\n    removeToken(state) {\n      clearInterval(state.tokenRefreshTask);\n      state.tokenRefreshTask = null;\n      state.token = \"\";\n    },\n    setTokenRefreshTask(state, tokenRefreshTimerPayload) {\n      state.tokenRefreshTask = tokenRefreshTimerPayload;\n    },\n    setPermissions(state, payload) {\n      state.permissions = payload;\n    },\n    setUserList(state, payload) {\n      state.userList = payload;\n    },\n  },\n  actions: {\n    autoRefreshToken(context, tokenPayload) {\n      // Handle refreshing token\n      const parseJwt = (token) => {\n        try {\n          return JSON.parse(atob(token.split('.')[1]));\n        } catch (e) {\n          return null;\n        }\n      };\n      const parsedToken = parseJwt(tokenPayload);\n      const tokenExpireInSeconds = parsedToken.exp - (new Date().getTime() / 1000);\n\n      // Refresh token automatically 30 seconds before it expires\n      const tokenRefreshTimer = setTimeout(async () => {\n        // Get new token from server\n        const dataConnect = new DatastoreConnect(store.state.enterpriseServerUrl);\n        const resp = await dataConnect.refreshToken({\n          username: parsedToken.username,\n        })\n          .catch((error) => {\n            console.log(error);\n            alert(error);\n          });\n        if (!resp || resp.error || !resp.result) {\n          if (resp && resp.error) {\n            console.error(resp.error);\n            return;\n          }\n        }\n        const newToken = resp.result.token;\n        context.commit('setToken', newToken);\n      }, (tokenExpireInSeconds - 30) * 1000);\n      context.commit('setTokenRefreshTask', tokenRefreshTimer);\n    },\n    async refreshUserList(context, organization_id) {\n      const dataConnect = new DatastoreConnect();\n      await dataConnect.getUserListByOrganization({ organization_id })\n        .then((data) => {\n          if (data.result) {\n            context.commit('user/setUserList', data.result, { root: true });\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n  },\n};\n\nconst projects = {\n  namespaced: true,\n  state: () => ({\n    projectList: [],\n    currentProject: null,\n  }),\n  mutations: {\n    setCurrentProject(state, payload) {\n      state.currentProject = payload;\n    },\n    setProjectList(state, payload) {\n      state.projectList = payload;\n    },\n    resetState(state) {\n      state.currentProject = null;\n      state.projectList = [];\n    },\n  },\n\n};\n\nconst statistics = {\n  namespaced: true,\n  state: () => ({\n    datasetID: null,\n    set: null,\n    labelLocation: null,\n    labelVisualizer: null,\n  }),\n  mutations: {\n    setDatasetID(state, payload) {\n      state.datasetID = payload;\n    },\n    setAnnotationSet(state, payload) {\n      state.set = payload;\n    },\n    setLabelLocation(state, payload) {\n      state.labelLocation = payload;\n    },\n    setLabelVisualizer(state, payload) {\n      state.labelVisualizer = payload;\n    },\n    resetState(state) {\n      state.datasetID = null;\n      state.set = null;\n      state.labelLocation = null;\n      state.labelVisualizer = null;\n    },\n  },\n\n};\n\nconst reviews = {\n  namespaced: true,\n  state: () => ({\n    usersFilter: [],\n  }),\n  mutations: {\n    setUsersFilter(state, payload) {\n      state.usersFilter = payload;\n    },\n    resetState(state) {\n      state.usersFilter = [];\n    },\n  },\n\n};\n\nconst datasets = {\n  namespaced: true,\n  state: () => ({\n    currentDataset: null,\n    datasetList: [],\n    annotationSetColorMap: null,\n    annotationsTabState: null,\n    labelColorMap: null,\n    uploadFolderTasks: {},\n    confMatrixTargetSet: null,\n  }),\n  mutations: {\n    setCurrentDataset(state, payload) {\n      state.currentDataset = payload;\n\n      // Clear states dependent on the current dataset\n      state.annotationsTabState = null;\n    },\n    setAnnotationsTabState(state, payload) {\n      state.annotationsTabState = payload;\n    },\n    clearDatasetsState(state) {\n      state.currentDataset = null;\n      state.annotationsTabState = null;\n    },\n    setAnnotationSetColorMap(state, payload) {\n      state.annotationSetColorMap = payload;\n    },\n    setLabelColorMap(state, payload) {\n      state.labelColorMap = payload;\n    },\n    setDatasetList(state, payload) {\n      state.datasetList = payload;\n    },\n    setConfMatrixTargetSet(state, payload) {\n      state.confMatrixTargetSet = payload;\n    },\n    setDataset(state, payload) {\n      // preventing flicker for refresh interval\n      Object.assign(state.datasetList[payload.index], payload.dataset);\n      store.dispatch('datasets/updateCurrentDatasetAction');\n    },\n    setDatasetAnnotationSets(state, payload) {\n      if (payload.index >= 0) {\n        state.datasetList[payload.index]['annotation_sets'] = state.datasetList[payload.index]['annotation_sets'] || [];\n        if (payload.sets && payload.sets.length > 0) {\n          Object.assign(state.datasetList[payload.index]['annotation_sets'], payload.sets);\n        } else {\n          state.datasetList[payload.index]['annotation_sets'].length = 0;\n        }\n      }\n      store.dispatch('datasets/updateCurrentDatasetAction');\n    },\n    setDatasetLabels(state, payload) {\n      state.datasetList[payload.index]['labels'] = state.datasetList[payload.index]['labels'] || [];\n      if (payload.labels && payload.labels.length > 0) {\n        Object.assign(state.datasetList[payload.index]['labels'], payload.labels);\n      } else {\n        state.datasetList[payload.index]['labels'].length = 0;\n      }\n      store.dispatch('datasets/updateCurrentDatasetAction');\n    },\n    updateCurrentDataset(state, payload) {\n      const id = state.currentDataset?.id;\n      if (id) {\n        state.currentDataset = state.datasetList.find((e) => e.id === id);\n      }\n    },\n    resetState(state) {\n      state.currentDataset = null;\n      state.datasetList = [];\n      state.annotationSetColorMap = null;\n      state.annotationsTabState = null;\n      state.labelColorMap = null;\n      state.uploadFolderTasks = {};\n    },\n  },\n  actions: {\n    updateCurrentDatasetAction(context) {\n      context.commit('datasets/updateCurrentDataset', {}, { root: true });\n    },\n  },\n};\n\nconst tasks = {\n  namespaced: true,\n  state: () => ({\n    uploadTasks: {},\n    importTasks: {},\n    exportTasks: {},\n  }),\n  mutations: {\n    resetAllTasks(state) {\n      // Reset all task categories\n      Object.keys(state.uploadTasks).forEach((key) => {\n        clearInterval(state.uploadTasks[key]?.interval);\n        delete state.uploadTasks[key];\n      });\n\n      Object.keys(state.importTasks).forEach((key) => {\n        clearInterval(state.importTasks[key]?.interval);\n        delete state.importTasks[key];\n      });\n\n      Object.keys(state.exportTasks).forEach((key) => {\n        clearInterval(state.exportTasks[key]?.interval);\n        delete state.exportTasks[key];\n      });\n\n      if (state.converterTasks) {\n        Object.keys(state.converterTasks).forEach((key) => {\n          clearInterval(state.converterTasks[key]?.interval);\n          delete state.converterTasks[key];\n        });\n      }\n    },\n    // ----------- Uploads --------------\n    addNewUploadTask(state, task) {\n      task.isLocal = true;\n      state.uploadTasks = { ...state.uploadTasks, [task.id]: { ...task } };\n      state.uploadTasks[task.id].interval = setInterval(() => { store.dispatch('tasks/getUploadTaskDockerInterval', task.id); }, 1000);\n    },\n    resumeUploadTask(state, task) {\n      state.uploadTasks[task.id].isLocal = true;\n      state.uploadTasks[task.id].interval = setInterval(() => { store.dispatch('tasks/getUploadTaskDockerInterval', task.id); }, 1000);\n    },\n    addExistingUploadTask(state, task) {\n      if (!state.uploadTasks[task.id]) {\n        if (task.username === store.state.user.user.username && task.status === 'running') {\n          const dataConnect = new DatastoreConnect();\n          dataConnect.updateDockerTaskStatus({\n            docker_task_id: task.id,\n            status: 'terminated',\n          });\n          task.status = 'terminated';\n        }\n\n        state.uploadTasks = { ...state.uploadTasks, [task.id]: { ...task } };\n        state.uploadTasks[task.id].interval = setInterval(() => { store.dispatch('tasks/getUploadTaskDockerInterval', task.id); }, 1000);\n      }\n    },\n    removeUploadTask(state, { id }) {\n      delete state.uploadTasks[id];\n    },\n    updateUploadTask(state, task) {\n      Object.keys(task).forEach((key) => {\n        state.uploadTasks[task.id][key] = task[key];\n      });\n    },\n    clearUploadTaskInterval(state, docker_task_id) {\n      if (state.uploadTasks[docker_task_id]?.interval) {\n        clearInterval(state.uploadTasks[docker_task_id].interval);\n      }\n    },\n\n    // ------------ Import --------------\n    addImportTask(state, payload) {\n      state.importTasks[payload.id] = {\n        dataset_id: payload.dataset_id,\n      };\n\n      state.importTasks[payload.id].interval = setInterval(() => { store.dispatch('tasks/getImportTaskDockerInterval', payload.id); }, 1000);\n    },\n    removeImportTask(state, payload) {\n      if (state.importTasks[payload.id]?.interval) {\n        clearInterval(state.importTasks[payload.id].interval);\n      }\n      delete state.importTasks[payload.id];\n    },\n    clearImportTaskInterval(state, payload) {\n      if (state.importTasks[payload.id]?.interval) {\n        clearInterval(state.importTasks[payload.id].interval);\n      }\n    },\n    updateImportTaskStatus(state, payload) {\n      state.importTasks[payload.id].status = payload.data.status;\n      state.importTasks[payload.id].name = payload.data.name;\n      state.importTasks[payload.id].date = payload.data.date;\n      state.importTasks[payload.id].progress = payload.data.progress;\n    },\n\n    // ------------ Export --------------\n    addExportTask(state, payload) {\n      state.exportTasks[payload.id] = {\n        dataset_id: payload.dataset_id,\n      };\n      state.exportTasks[payload.id].interval = setInterval(() => { store.dispatch('tasks/getExportTaskDockerInterval', payload.id); }, 1000);\n    },\n    removeExportTask(state, payload) {\n      clearInterval(state.exportTasks[payload.id].interval);\n      delete state.exportTasks[payload.id];\n    },\n    clearExportTaskInterval(state, payload) {\n      clearInterval(state.exportTasks[payload.id].interval);\n    },\n    updateExportTaskStatus(state, payload) {\n      state.exportTasks[payload.id].status = payload.data.status;\n      state.exportTasks[payload.id].name = payload.data.name;\n      state.exportTasks[payload.id].date = payload.data.date;\n      state.exportTasks[payload.id].progress = payload.data.progress;\n    },\n\n    resetUploadTasks(state) {\n      Object.entries(state.uploadTasks).forEach(([key, task]) => {\n        if (!task.isLocal) {\n          clearInterval(state.uploadTasks[key].interval);\n          delete state.uploadTasks[key];\n        }\n      });\n    },\n    resetImportTasks(state) {\n      Object.keys(state.importTasks).forEach((key) => {\n        clearInterval(state.importTasks[key].interval);\n        delete state.importTasks[key];\n      });\n    },\n    resetExportTasks(state) {\n      Object.keys(state.exportTasks).forEach((key) => {\n        clearInterval(state.exportTasks[key].interval);\n        delete state.exportTasks[key];\n      });\n    },\n    resetConverterTasks(state) {\n      Object.keys(state.converterTasks).forEach((key) => {\n        clearInterval(state.converterTasks[key].interval);\n        delete state.converterTasks[key];\n      });\n    },\n\n    // ------------ SnapshotUpload --------------\n    addSnapshotUploadTask(state, payload) {\n      state.uploadTasks[payload.id] = {\n        id: payload.id,\n      };\n    },\n    removeSnapshotUploadTask(state, payload) {\n      delete state.uploadTasks[payload.id];\n    },\n    updateSnapshotUploadTaskStatus(state, task) {\n      Object.keys(task).forEach((key) => {\n        state.uploadTasks[task.id][key] = task[key];\n      });\n    },\n  },\n  actions: {\n    async getUploadTaskDockerInterval(context, docker_task_id) {\n      const dataConnect = new DatastoreConnect();\n      await dataConnect.getDockerTaskById({ docker_task_id })\n        .then((data) => {\n          if (data.result) {\n            const task = data.result;\n            if (task.status === 'complete' || task.status === 'error' || task.status === 'terminated') {\n              context.commit('tasks/clearUploadTaskInterval', docker_task_id, { root: true });\n            }\n            context.commit('tasks/updateUploadTask', task, { root: true });\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async getImportTaskDockerInterval(context, docker_task_id) {\n      const res = {\n        status: '',\n        name: '',\n        date: null,\n        progress: 0,\n      };\n      const dataConnect = new DatastoreConnect(store.state.enterpriseServerUrl);\n      await dataConnect.getDockerTaskById({ docker_task_id })\n        .then((data) => {\n          res.status = data.result.status;\n          res.name = data.result.name;\n          res.date = data.result.date;\n          if (data.result.message !== 'Complete' && data.result.status !== 'complete' && data.result.status !== 'error') {\n            res.progress = Math.round((data.result.count / data.result.total) * 100);\n          } else {\n            res.progress = 100;\n            context.commit('tasks/clearImportTaskInterval', { docker_task_id }, { root: true });\n          }\n          context.commit('tasks/updateImportTaskStatus', { docker_task_id, data: res }, { root: true });\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async getExportTaskDockerInterval(context, docker_task_id) {\n      const res = {\n        status: '',\n        name: '',\n        date: null,\n        progress: 0,\n      };\n      const dataConnect = new DatastoreConnect(store.state.enterpriseServerUrl);\n      await dataConnect.getDockerTaskById({ docker_task_id })\n        .then((data) => {\n          res.status = data.result.status;\n          res.name = data.result.name;\n          res.date = data.result.date;\n          if (data.result.message !== 'Complete' && data.result.status !== 'complete' && data.result.status !== 'error') {\n            res.progress = Math.round((data.result.count / data.result.total) * 100);\n          } else {\n            res.progress = 100;\n            context.commit('tasks/removeExportTask', { docker_task_id }, { root: true });\n          }\n          context.commit('tasks/updateExportTaskStatus', { docker_task_id, data: res }, { root: true });\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n  },\n};\n\nconst annotationTool = {\n  namespaced: true,\n  state: () => ({\n    samEnabled: false,\n  }),\n  mutations: {\n    toggleSAMEnabled(state, isEnabled) {\n      state.samEnabled = isEnabled;\n    },\n    resetState(state) {\n      state.samEnabled = false;\n    },\n  },\n};\n\nconst notifications = {\n  namespaced: true,\n  state: () => ({\n    hasNotifications: false,\n  }),\n  mutations: {\n    updateNotifications(state, payload) {\n      state.hasNotifications = payload;\n    },\n  },\n};\n\nconst store = createStore({\n  strict: process.env.NODE_ENV !== 'production',\n  modules: {\n    appVersion,\n    user,\n    datasets,\n    notifications,\n    annotationTool,\n    projects,\n    reviews,\n    statistics,\n    tasks,\n    importer,\n    annotations,\n  },\n  state() {\n    return {\n      debugMode: false,\n      theme: 'theme-auzone-light',\n      trainerServerUrl: null,\n      datastoreServerUrl: null,\n      enterpriseServerHost: null,\n      enterpriseServerUrl: null,\n      samServerUrl: null,\n      currentDataset: {},\n    };\n  },\n  mutations: {\n    // IMPORTANT: mutations take exactly 2 parameters: state and payload.\n    setDebugMode(state, mode) {\n      state.debugMode = mode;\n    },\n    setTrainerServerUrl(state, url) {\n      state.trainerServerUrl = url;\n    },\n    setDatastoreServerUrl(state, url) {\n      state.datastoreServerUrl = url;\n    },\n    setEnterpriseServerHost(state, host) {\n      state.enterpriseServerHost = host;\n    },\n    setEnterpriseServerUrl(state, url) {\n      state.enterpriseServerUrl = url;\n    },\n    setSAMServerUrl(state, url) {\n      state.samServerUrl = url;\n    },\n    setCurrentDataset(state, dataset) {\n      state.currentDataset = dataset;\n      // state.currentTrainer['DatasetName'] = dataset.Name ? dataset.Name : '';\n      // state.currentTrainer['DatasetName'] = dataset.Filename ? dataset.Filename : '';\n    },\n    setTheme(state, theme) {\n      state.theme = theme;\n\n      const app = document.querySelector('#app');\n      app.className = \"\";\n      app.classList.add(theme);\n      const root = document.documentElement;\n      root.className = \"\";\n      root.classList.add(theme);\n    },\n  },\n  plugins: [vuexLocal.plugin],\n});\n\nexport default store;\n","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <div class=\"user-router\">\n        <div class=\"user-router__container\">\n          <ul>\n            <li :class=\"{ 'active': currentTab.includes('profile') }\" @click=\"navigateToAccount\">\n              <SVGIcon\n                :iconName=\"'account_circle'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Profile</span>\n            </li>\n            <li :class=\"{ 'active': currentTab.includes('edit') }\" @click=\"navigateToEditUser\">\n              <SVGIcon\n                :iconName=\"'edit'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Edit Info</span>\n            </li>\n          </ul>\n        </div>\n      </div>\n      <main class=\"main-display-area\">\n        <router-view />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport Header from '@/components/Header.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  name: 'UserProfile',\n  components: {\n    Header,\n    BreadcrumbNavigation,\n    SVGIcon,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      currentTab: 'account',\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n  },\n  watch: {\n    $route(to, from) {\n      if (to && to !== '') {\n        this.currentTab = to.fullPath;\n      }\n    },\n  },\n\n  methods: {\n    navigateToAccount() {\n      this.$router.push({ name: 'user.profile' });\n    },\n    navigateToEditUser() {\n      this.$router.push({ name: 'user.edit', query: { editUser: this.user.username } });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.user-router {\n  min-width: 250px;\n  width: 250px;\n  @include themify() {\n    background-color: themed('background-light-gray');\n  };\n  padding: 30px 0px 30px 30px;\n\n  &__container {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    height: 100%;\n    padding-right: 30px;\n\n    ul {\n      list-style-type: none;\n    }\n\n    ul + ul {\n      margin-top: 20px;\n    }\n\n    li {\n      display: flex;\n      flex-direction: row;\n      margin-top: 2px;\n      margin-bottom: 2px;\n      font-size: 0.9rem;\n      padding: 4px;\n      color: $color-link;\n      cursor: pointer;\n      border-radius: 4px;\n\n      span {\n        margin-left: 5px;\n      }\n    }\n\n    li:hover {\n      background-color: rgba(140, 140, 140, 0.1);\n\n    }\n\n    li:focus-visible {\n      background-color: rgba(140, 140, 140, 0.1);\n    }\n\n    li.active {\n      background-color: rgba(140, 140, 140, 0.2);\n      color: inherit;\n    }\n  }\n}\n</style>\n","<template>\n  <svg\n    :width=\"width\"\n    :height=\"height\"\n    :aria-labelledby=\"iconName\"\n    role=\"presentation\"\n    :fill=\"iconColor\"\n    :title=\"title\"\n    :class=\"{ 'mirrored' : mirrored }\"\n  >\n    <use\n      :href=\"iconFile\"\n    />\n  </svg>\n</template>\n\n<script>\n\nexport default {\n  name: 'SVGIcon',\n  props: {\n    iconName: {\n      type: String,\n      default: '',\n    },\n    width: {\n      type: [Number, String],\n      default: '100%',\n    },\n    height: {\n      type: [Number, String],\n      default: '100%',\n    },\n    iconColor: {\n      type: String,\n      default: 'currentColor',\n    },\n    title: {\n      type: String,\n      default: '',\n    },\n    mirrored: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  computed: {\n    iconFile() {\n      return `${require(`@/assets/img/${this.iconName}.svg`)}#${this.iconName}`;\n    },\n  },\n};\n</script>\n\n<style scoped>\nsvg {\n  display: block;\n}\n.mirrored {\n  transform:rotate(180deg);\n}\n</style>\n","import { render } from \"./SVGIcon.vue?vue&type=template&id=7f6cc5c3&scoped=true\"\nimport script from \"./SVGIcon.vue?vue&type=script&lang=js\"\nexport * from \"./SVGIcon.vue?vue&type=script&lang=js\"\n\nimport \"./SVGIcon.vue?vue&type=style&index=0&id=7f6cc5c3&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7f6cc5c3\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <div class=\"header\">\n    <div class=\"header__logo\" @click=\"gotoHome()\" v-html=\"auzone_logo\" />\n    <div id=\"header__left\" class=\"left\">\n      <div id=\"header-module\" class=\"header__module\">\n        <slot name=\"header-slot\" />\n      </div>\n    </div>\n    <div id=\"header__center\" class=\"center\">\n      <div id=\"header-project\" class=\"header__breadcrumbs\">\n        <slot name=\"page-slot\" />\n      </div>\n    </div>\n    <div class=\"menus\">\n      <WarningMenu />\n      <div />\n      <ModuleMenu />\n      <div />\n      <HelpMenu />\n      <div />\n      <UserMenu />\n    </div>\n  </div>\n</template>\n\n<script>\nimport { auzone_logo } from \"@/assets/js/icons\";\nimport UserMenu from \"@/components/UserMenu.vue\";\nimport HelpMenu from \"@/components/HelpMenu.vue\";\nimport ModuleMenu from \"@/components/ModuleMenuV2.vue\";\nimport WarningMenu from \"@/components/WarningMenu.vue\";\n\nexport default {\n  components: {\n    ModuleMenu,\n    UserMenu,\n    HelpMenu,\n    WarningMenu,\n  },\n  props: {\n    headerTitle: { String, default: \"Welcome\" },\n    page: {\n      type: String,\n      default: \"\",\n    },\n  },\n  data() {\n    return {\n      auzone_logo,\n      show_menu: false,\n      userInfo: null,\n      debugMode: false,\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n  },\n  watch: {\n    debugMode() {\n      const state = this.$store.state.debugMode;\n      this.$store.commit('setDebugMode', !state);\n    },\n  },\n  methods: {\n    gotoHome() {\n      this.$router.push({ path: '/projects' });\n    },\n  },\n};\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\" scoped>\n\n.header {\n  display: flex;\n  font-size: 1.5rem;\n  gap: 15px;\n  box-shadow: 0 1px 3px grey, 0 1px 7px grey;\n  z-index: 10;\n  background: var(--header-background);\n  color: var(--header-text-color);\n\n  .left {\n    display: flex;\n    min-width: fit-content;\n    justify-content: flex-start;\n    align-items: center;\n    overflow-x: hidden;\n    overflow-y: hidden;\n  }\n\n  .center {\n    display: flex;\n    flex: 1 1 0px;\n    align-items: center;\n    min-width: 0;\n    overflow: hidden;\n  }\n\n  .menus {\n    display: flex;\n    min-width: fit-content;\n    justify-content: flex-end;\n    align-items: center;\n    overflow-x: hidden;\n    overflow-y: hidden;\n\n    div {\n      margin: 0px 10px;\n    }\n  }\n\n  &__module {\n    font-weight: 500;\n    letter-spacing: 0.0325em;\n  }\n\n  &__breadcrumbs {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    margin: auto;\n    height: 70%;\n    max-width: 100%;\n    line-height: 1;\n  }\n\n  &__logo {\n    width: 100px;\n    min-width: 70px;\n    height: 50px;\n    padding: 6px 6px 6px 6px;\n    cursor: pointer;\n  }\n\n  &__select-theme {\n    position: relative;\n    width: 150px;\n    height: 30px;\n  }\n\n  &__button {\n    padding-right: 10px;\n  }\n\n  &__dot-menu {\n    display: flex;\n    flex: 0 0 auto;\n    height: 100%;\n    align-items: center;\n    justify-content: center;\n    padding: 0 4px;\n    background: none;\n    border: none;\n    cursor: pointer;\n    color: var(--header-dot-menu);\n\n    &:hover {\n      background: var(--header-button-background-hover);\n      color: var(--header-button-color-hover);\n    }\n\n    &._active {\n      background: var(--header-button-background-hover);\n      color: var(--header-button-color-hover);\n    }\n  }\n\n  &__user {\n    display: flex;\n    flex: 0 0 auto;\n    width: 32px;\n    height: 32px;\n    cursor: pointer;\n    border-radius: 50%;\n    background: rgb(5, 60, 143);\n    margin-right: 8px;\n    justify-content: center;\n    align-items: center;\n  }\n\n  &__user-letter {\n    height: min-content;\n    font-size: 1.25rem;\n  }\n}\n\n.header.switch-label {\n  font-size: 20px;\n}\n\n</style>\n","export const auzone_logo = ` \n<svg id=\"auzoneLogoWhite\" width=\"100%\" height=\"100%\" viewBox=\"0 0 60 40\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" xmlns:serif=\"http://www.serif.com/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\">\n    <g>\n        <path d=\"M23.68,5.15C23.68,6.426 24.714,7.46 25.989,7.46C27.264,7.46 28.298,6.426 28.298,5.15C28.298,3.875 27.264,2.841 25.989,2.841C24.714,2.841 23.68,3.875 23.68,5.15Z\" style=\"fill:url(#_Radial1);fill-rule:nonzero;\"/>\n        <path d=\"M20.319,10.191C20.319,11.467 21.353,12.501 22.627,12.501C23.902,12.501 24.937,11.467 24.937,10.191C24.937,8.916 23.902,7.882 22.627,7.882C21.353,7.882 20.319,8.916 20.319,10.191Z\" style=\"fill:url(#_Radial2);fill-rule:nonzero;\"/>\n        <path d=\"M27.04,10.191C27.04,11.467 28.074,12.501 29.349,12.501C30.624,12.501 31.659,11.467 31.659,10.191C31.659,8.916 30.624,7.882 29.349,7.882C28.074,7.882 27.04,8.916 27.04,10.191Z\" style=\"fill:url(#_Radial3);fill-rule:nonzero;\"/>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M25.445,37.232C25.589,37.221 25.69,37.201 25.749,37.171C25.847,37.118 25.916,37.019 25.955,36.874L26.66,34.309C26.287,34.309 26.04,34.337 25.92,34.393C25.799,34.449 25.659,34.62 25.5,34.904L25.417,34.888L25.618,34.14L28.207,34.14L27.993,34.933L27.908,34.921L27.92,34.753C27.92,34.604 27.886,34.493 27.819,34.419C27.752,34.346 27.619,34.309 27.419,34.309L27.149,34.309L26.475,36.727C26.459,36.779 26.447,36.826 26.439,36.867C26.425,36.928 26.418,36.978 26.418,37.014C26.418,37.109 26.447,37.168 26.506,37.191C26.564,37.214 26.679,37.227 26.85,37.232L26.85,37.311L25.445,37.311L25.445,37.232Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M28.008,36.682C28.008,36.33 28.166,35.99 28.482,35.661C28.796,35.332 29.119,35.168 29.453,35.168C29.576,35.168 29.674,35.196 29.747,35.253C29.82,35.31 29.856,35.395 29.856,35.507C29.856,35.735 29.723,35.93 29.456,36.092C29.19,36.254 28.909,36.353 28.615,36.39L28.48,36.406C28.459,36.471 28.445,36.523 28.437,36.562C28.429,36.601 28.425,36.649 28.425,36.708C28.425,36.847 28.471,36.955 28.562,37.033C28.653,37.111 28.761,37.149 28.886,37.149C29.004,37.149 29.13,37.111 29.263,37.032C29.339,36.985 29.449,36.902 29.593,36.784L29.655,36.838C29.583,36.928 29.481,37.021 29.348,37.116C29.113,37.285 28.876,37.37 28.639,37.37C28.471,37.37 28.324,37.311 28.198,37.192C28.071,37.073 28.008,36.903 28.008,36.682ZM28.513,36.3C28.815,36.255 29.061,36.149 29.251,35.98C29.441,35.812 29.536,35.645 29.536,35.479C29.536,35.419 29.522,35.371 29.493,35.335C29.465,35.299 29.423,35.282 29.367,35.282C29.265,35.282 29.164,35.326 29.065,35.413C28.966,35.501 28.877,35.6 28.798,35.711C28.714,35.841 28.648,35.966 28.599,36.084C28.572,36.147 28.543,36.219 28.513,36.3Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M31.532,35.168C31.725,35.168 31.864,35.211 31.949,35.298C32.035,35.385 32.077,35.471 32.077,35.552C32.077,35.627 32.055,35.684 32.011,35.725C31.967,35.767 31.914,35.787 31.854,35.787C31.796,35.787 31.747,35.769 31.707,35.733C31.668,35.696 31.648,35.651 31.648,35.597C31.648,35.556 31.661,35.512 31.687,35.464C31.713,35.417 31.726,35.386 31.726,35.372C31.726,35.343 31.71,35.319 31.677,35.299C31.645,35.28 31.593,35.27 31.522,35.27C31.267,35.27 31.046,35.415 30.859,35.704C30.671,35.994 30.578,36.297 30.578,36.615C30.578,36.794 30.616,36.934 30.691,37.035C30.767,37.136 30.881,37.187 31.033,37.187C31.155,37.187 31.273,37.152 31.388,37.082C31.503,37.012 31.608,36.921 31.705,36.812L31.721,36.793L31.79,36.845C31.679,36.986 31.573,37.095 31.47,37.171C31.288,37.302 31.086,37.367 30.865,37.367C30.653,37.367 30.481,37.3 30.35,37.165C30.218,37.029 30.153,36.845 30.153,36.611C30.153,36.251 30.299,35.921 30.592,35.619C30.881,35.318 31.195,35.168 31.532,35.168Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M32.708,34.129C32.81,34.114 32.892,34.103 32.954,34.094C33.017,34.085 33.071,34.077 33.117,34.069C33.303,34.033 33.404,34.013 33.418,34.01C33.432,34.007 33.443,34.005 33.451,34.005C33.47,34.015 33.48,34.026 33.48,34.041L32.922,36.16C33.121,35.865 33.284,35.65 33.411,35.514C33.632,35.28 33.836,35.163 34.021,35.163C34.097,35.163 34.17,35.187 34.24,35.235C34.311,35.284 34.346,35.37 34.346,35.495C34.346,35.525 34.342,35.564 34.334,35.612C34.326,35.659 34.317,35.701 34.305,35.737L33.985,36.874C33.976,36.906 33.968,36.936 33.961,36.965C33.955,36.995 33.952,37.021 33.952,37.045C33.952,37.072 33.958,37.092 33.971,37.105C33.984,37.119 34.002,37.125 34.025,37.125C34.074,37.125 34.132,37.091 34.199,37.023C34.24,36.981 34.317,36.887 34.429,36.743L34.491,36.8C34.38,36.965 34.286,37.085 34.208,37.161C34.071,37.295 33.932,37.363 33.793,37.363C33.73,37.363 33.677,37.343 33.634,37.303C33.591,37.264 33.57,37.207 33.57,37.133C33.57,37.112 33.571,37.093 33.573,37.074C33.576,37.056 33.58,37.036 33.586,37.014L33.952,35.623C33.955,35.611 33.958,35.598 33.96,35.584C33.963,35.571 33.964,35.557 33.964,35.543C33.964,35.503 33.952,35.472 33.928,35.45C33.903,35.428 33.87,35.417 33.831,35.417C33.725,35.417 33.591,35.502 33.43,35.672C33.268,35.842 33.132,36.016 33.022,36.193C32.946,36.318 32.888,36.436 32.85,36.546C32.811,36.657 32.736,36.912 32.625,37.311L32.258,37.311L33.017,34.432C33.022,34.412 33.025,34.394 33.026,34.38C33.028,34.366 33.029,34.352 33.029,34.34C33.029,34.272 33.007,34.231 32.962,34.217C32.918,34.204 32.833,34.2 32.708,34.207L32.708,34.129Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M34.687,37.311L35.098,35.844C35.133,35.721 35.153,35.646 35.159,35.62C35.164,35.594 35.167,35.566 35.167,35.536C35.167,35.49 35.154,35.454 35.128,35.428C35.102,35.402 35.051,35.388 34.975,35.388C34.956,35.388 34.937,35.39 34.919,35.392C34.901,35.394 34.88,35.397 34.858,35.4L34.858,35.32C34.961,35.304 35.034,35.292 35.078,35.284C35.121,35.276 35.168,35.267 35.219,35.256L35.644,35.163C35.653,35.169 35.66,35.176 35.663,35.184L35.347,36.205C35.54,35.909 35.702,35.689 35.831,35.545C36.059,35.29 36.263,35.163 36.443,35.163C36.513,35.163 36.573,35.176 36.624,35.203C36.72,35.256 36.769,35.35 36.769,35.486C36.769,35.524 36.765,35.563 36.757,35.604C36.749,35.646 36.738,35.69 36.726,35.737L36.415,36.874C36.409,36.898 36.402,36.926 36.394,36.961C36.386,36.995 36.382,37.019 36.382,37.033C36.382,37.057 36.387,37.078 36.398,37.097C36.409,37.116 36.428,37.125 36.453,37.125C36.494,37.125 36.542,37.101 36.595,37.053C36.649,37.005 36.737,36.902 36.859,36.743L36.928,36.805C36.798,36.981 36.695,37.104 36.619,37.175C36.489,37.3 36.365,37.363 36.246,37.363C36.193,37.363 36.141,37.345 36.091,37.309C36.041,37.275 36.016,37.209 36.016,37.116C36.016,37.089 36.018,37.061 36.022,37.032C36.026,37 36.031,36.974 36.038,36.952L36.337,35.799C36.352,35.736 36.363,35.684 36.369,35.644C36.374,35.603 36.377,35.574 36.377,35.557C36.377,35.519 36.368,35.486 36.35,35.458C36.332,35.431 36.299,35.417 36.254,35.417C36.135,35.417 35.985,35.524 35.805,35.74C35.699,35.868 35.592,36.02 35.482,36.198C35.399,36.335 35.333,36.469 35.284,36.6C35.236,36.73 35.16,36.967 35.055,37.311L34.687,37.311Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M37.568,36.8C37.568,36.932 37.601,37.04 37.667,37.127C37.732,37.213 37.828,37.256 37.955,37.256C38.213,37.256 38.441,37.061 38.641,36.672C38.81,36.338 38.895,36.032 38.895,35.752C38.895,35.633 38.88,35.537 38.852,35.464C38.797,35.327 38.695,35.258 38.548,35.258C38.306,35.258 38.079,35.439 37.867,35.801C37.668,36.14 37.568,36.473 37.568,36.8ZM38.574,35.158C38.84,35.158 39.028,35.229 39.137,35.371C39.246,35.512 39.3,35.68 39.3,35.873C39.3,36.209 39.153,36.537 38.857,36.86C38.551,37.195 38.226,37.363 37.879,37.363C37.661,37.363 37.486,37.299 37.355,37.173C37.223,37.046 37.158,36.868 37.158,36.639C37.158,36.293 37.305,35.961 37.599,35.645C37.9,35.32 38.225,35.158 38.574,35.158Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M40.342,34.432C40.348,34.412 40.352,34.391 40.354,34.37C40.356,34.35 40.356,34.333 40.356,34.321C40.356,34.267 40.335,34.234 40.291,34.222C40.248,34.21 40.161,34.205 40.031,34.207L40.031,34.129C40.102,34.119 40.184,34.108 40.277,34.096C40.369,34.083 40.43,34.074 40.458,34.069C40.547,34.053 40.655,34.03 40.781,33.998C40.792,33.998 40.803,34.006 40.814,34.022L40.067,36.874C40.049,36.942 40.039,36.983 40.036,36.997C40.033,37.012 40.031,37.026 40.031,37.04C40.031,37.071 40.037,37.096 40.048,37.117C40.059,37.138 40.08,37.149 40.11,37.149C40.167,37.149 40.241,37.099 40.333,36.997C40.424,36.896 40.502,36.798 40.565,36.703L40.629,36.748C40.493,36.949 40.387,37.088 40.311,37.166C40.18,37.297 40.048,37.363 39.915,37.363C39.858,37.363 39.807,37.348 39.763,37.32C39.695,37.277 39.661,37.205 39.661,37.102C39.661,37.062 39.667,37.009 39.68,36.943C39.688,36.903 39.698,36.857 39.711,36.805L40.342,34.432Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M41.348,36.8C41.348,36.932 41.381,37.04 41.447,37.127C41.512,37.213 41.608,37.256 41.735,37.256C41.993,37.256 42.221,37.061 42.421,36.672C42.59,36.338 42.675,36.032 42.675,35.752C42.675,35.633 42.66,35.537 42.632,35.464C42.577,35.327 42.475,35.258 42.328,35.258C42.086,35.258 41.859,35.439 41.647,35.801C41.448,36.14 41.348,36.473 41.348,36.8ZM42.354,35.158C42.62,35.158 42.808,35.229 42.917,35.371C43.026,35.512 43.08,35.68 43.08,35.873C43.08,36.209 42.933,36.537 42.637,36.86C42.331,37.195 42.006,37.363 41.659,37.363C41.441,37.363 41.266,37.299 41.135,37.173C41.003,37.046 40.938,36.868 40.938,36.639C40.938,36.293 41.085,35.961 41.379,35.645C41.68,35.32 42.005,35.158 42.354,35.158Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M44.082,36.096C44.082,36.194 44.097,36.272 44.127,36.33C44.178,36.427 44.269,36.475 44.4,36.475C44.542,36.475 44.669,36.385 44.781,36.204C44.892,36.022 44.948,35.823 44.948,35.604C44.948,35.5 44.925,35.418 44.879,35.359C44.833,35.299 44.764,35.27 44.673,35.27C44.496,35.27 44.353,35.364 44.244,35.552C44.136,35.74 44.082,35.922 44.082,36.096ZM44.165,38.212C44.353,38.212 44.509,38.167 44.634,38.077C44.758,37.987 44.82,37.879 44.82,37.754C44.82,37.659 44.787,37.579 44.723,37.515C44.688,37.48 44.632,37.443 44.554,37.403C44.489,37.371 44.38,37.326 44.225,37.267C44.071,37.207 43.982,37.178 43.958,37.178C43.917,37.178 43.837,37.233 43.719,37.343C43.6,37.452 43.541,37.577 43.541,37.716C43.541,37.927 43.632,38.072 43.814,38.151C43.909,38.192 44.026,38.212 44.165,38.212ZM43.277,37.778C43.277,37.659 43.323,37.547 43.414,37.44C43.505,37.333 43.649,37.227 43.847,37.121C43.807,37.095 43.775,37.069 43.75,37.041C43.724,37.014 43.712,36.977 43.712,36.931C43.712,36.866 43.757,36.792 43.847,36.708C43.898,36.66 43.98,36.598 44.094,36.52C43.992,36.482 43.905,36.429 43.833,36.359C43.744,36.266 43.7,36.145 43.7,35.996C43.7,35.757 43.793,35.559 43.98,35.4C44.166,35.242 44.397,35.163 44.673,35.163C44.817,35.163 44.938,35.186 45.038,35.231C45.138,35.276 45.196,35.313 45.214,35.343L45.534,35.343L45.534,35.533L45.292,35.533C45.302,35.568 45.309,35.6 45.313,35.628C45.318,35.657 45.321,35.697 45.321,35.749C45.321,36.005 45.221,36.207 45.023,36.354C44.824,36.501 44.61,36.575 44.381,36.575C44.357,36.575 44.335,36.574 44.314,36.571C44.294,36.569 44.269,36.565 44.238,36.558C44.215,36.558 44.182,36.581 44.141,36.627C44.098,36.673 44.077,36.714 44.077,36.751C44.077,36.804 44.251,36.896 44.599,37.026C44.946,37.157 45.119,37.349 45.119,37.602C45.119,37.792 45.032,37.96 44.858,38.102C44.684,38.245 44.421,38.317 44.07,38.317C43.826,38.317 43.633,38.264 43.491,38.16C43.349,38.056 43.277,37.928 43.277,37.778Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M46.713,34.641C46.649,34.641 46.593,34.616 46.547,34.565C46.501,34.514 46.478,34.454 46.478,34.382C46.478,34.31 46.501,34.248 46.547,34.197C46.593,34.147 46.649,34.121 46.713,34.121C46.778,34.121 46.834,34.147 46.881,34.197C46.927,34.248 46.951,34.31 46.951,34.382C46.951,34.455 46.927,34.516 46.881,34.566C46.834,34.616 46.778,34.641 46.713,34.641ZM46.77,35.162C46.78,35.165 46.784,35.172 46.782,35.18L46.303,36.874C46.281,36.964 46.27,37.019 46.27,37.035C46.27,37.059 46.274,37.08 46.284,37.097C46.292,37.116 46.312,37.125 46.343,37.125C46.397,37.125 46.468,37.079 46.557,36.985C46.609,36.93 46.673,36.851 46.749,36.748L46.811,36.8L46.787,36.834C46.668,37 46.57,37.119 46.493,37.192C46.371,37.306 46.252,37.363 46.137,37.363C46.069,37.363 46.012,37.334 45.967,37.277C45.922,37.22 45.9,37.153 45.9,37.076C45.9,37.03 45.903,36.99 45.909,36.956C45.915,36.922 45.927,36.872 45.945,36.805L46.277,35.585C46.282,35.566 46.286,35.549 46.289,35.533C46.292,35.517 46.293,35.502 46.293,35.486C46.293,35.429 46.272,35.394 46.231,35.38C46.189,35.367 46.106,35.36 45.983,35.36L45.983,35.282C46.114,35.266 46.208,35.254 46.266,35.245C46.324,35.236 46.382,35.227 46.441,35.218C46.516,35.205 46.588,35.191 46.656,35.175C46.724,35.159 46.762,35.154 46.77,35.162Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M47.171,36.682C47.171,36.33 47.33,35.99 47.646,35.661C47.959,35.332 48.283,35.168 48.616,35.168C48.74,35.168 48.838,35.196 48.911,35.253C48.984,35.31 49.02,35.395 49.02,35.507C49.02,35.735 48.887,35.93 48.62,36.092C48.353,36.254 48.073,36.353 47.779,36.39L47.644,36.406C47.623,36.471 47.609,36.523 47.601,36.562C47.593,36.601 47.589,36.649 47.589,36.708C47.589,36.847 47.635,36.955 47.725,37.033C47.816,37.111 47.924,37.149 48.049,37.149C48.168,37.149 48.294,37.111 48.427,37.032C48.503,36.985 48.613,36.902 48.756,36.784L48.818,36.838C48.747,36.928 48.645,37.021 48.512,37.116C48.276,37.285 48.04,37.37 47.803,37.37C47.635,37.37 47.488,37.311 47.361,37.192C47.235,37.073 47.171,36.903 47.171,36.682ZM47.677,36.3C47.979,36.255 48.225,36.149 48.415,35.98C48.605,35.812 48.7,35.645 48.7,35.479C48.7,35.419 48.685,35.371 48.657,35.335C48.628,35.299 48.586,35.282 48.531,35.282C48.428,35.282 48.327,35.326 48.229,35.413C48.13,35.501 48.041,35.6 47.962,35.711C47.878,35.841 47.811,35.966 47.762,36.084C47.735,36.147 47.707,36.219 47.677,36.3Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <g transform=\"matrix(1.30485,0,0,1.30485,-7.003,-10.6871)\">\n            <path d=\"M49.35,36.603L49.428,36.603C49.463,36.795 49.504,36.935 49.551,37.023C49.638,37.186 49.768,37.269 49.941,37.269C50.037,37.269 50.118,37.234 50.184,37.166C50.249,37.098 50.282,37.008 50.282,36.895C50.282,36.826 50.274,36.769 50.257,36.724C50.241,36.68 50.22,36.64 50.194,36.603L49.998,36.312C49.879,36.134 49.805,36.016 49.774,35.956C49.729,35.865 49.706,35.775 49.706,35.685C49.706,35.547 49.755,35.426 49.854,35.321C49.953,35.216 50.093,35.163 50.275,35.163C50.353,35.163 50.441,35.178 50.541,35.207C50.641,35.236 50.709,35.251 50.745,35.251C50.785,35.251 50.814,35.243 50.833,35.227C50.852,35.211 50.869,35.19 50.885,35.163L50.954,35.163L50.857,35.837L50.778,35.837C50.758,35.683 50.727,35.568 50.686,35.49C50.61,35.347 50.49,35.275 50.325,35.275C50.255,35.275 50.193,35.296 50.139,35.34C50.084,35.383 50.057,35.447 50.057,35.531C50.057,35.596 50.069,35.653 50.094,35.702C50.118,35.751 50.174,35.838 50.261,35.963L50.429,36.205C50.516,36.33 50.578,36.432 50.614,36.511C50.651,36.59 50.669,36.675 50.669,36.767C50.669,36.938 50.596,37.082 50.451,37.199C50.305,37.316 50.132,37.375 49.931,37.375C49.866,37.375 49.774,37.361 49.653,37.334C49.533,37.307 49.464,37.295 49.445,37.295C49.413,37.295 49.39,37.301 49.375,37.315C49.36,37.329 49.346,37.351 49.333,37.379L49.255,37.379L49.35,36.603Z\" style=\"fill:#F3F4F6;\"/>\n        </g>\n        <path d=\"M7.493,26.873L6.733,22.388L4.157,26.873L7.493,26.873ZM0.229,31.114C0.612,31.018 0.914,30.841 1.137,30.582C1.359,30.323 1.803,29.627 2.467,28.495L7.519,19.845L7.899,19.845L9.563,29.636C9.67,30.266 9.797,30.659 9.943,30.814C10.089,30.969 10.402,31.069 10.881,31.114L10.881,31.393L6.615,31.393L6.615,31.114C7.127,31.063 7.46,31.001 7.612,30.928C7.854,30.815 7.975,30.596 7.975,30.269C7.975,30.185 7.972,30.095 7.966,29.999C7.961,29.903 7.952,29.822 7.941,29.754L7.595,27.49L3.793,27.49L2.788,29.433C2.715,29.562 2.65,29.7 2.594,29.847C2.498,30.106 2.45,30.323 2.45,30.497C2.45,30.717 2.525,30.872 2.674,30.962C2.823,31.052 3.089,31.103 3.472,31.114L3.472,31.393L0.229,31.393L0.229,31.114Z\" style=\"fill:#F3F4F6;\"/>\n        <path d=\"M13.237,25.294C13.249,25.237 13.259,25.185 13.267,25.138C13.275,25.09 13.28,25.04 13.28,24.99C13.28,24.748 13.208,24.6 13.064,24.546C12.921,24.493 12.652,24.466 12.258,24.466L12.258,24.229L13.499,23.984L14.842,23.732C14.871,23.725 14.896,23.737 14.918,23.765C14.941,23.793 14.949,23.821 14.944,23.85L14.918,23.968L13.423,29.712C13.384,29.852 13.356,29.962 13.339,30.041C13.322,30.12 13.314,30.176 13.314,30.21C13.314,30.34 13.35,30.441 13.423,30.514C13.497,30.587 13.592,30.624 13.711,30.624C14.043,30.624 14.458,30.328 14.957,29.737C15.455,29.146 15.898,28.532 16.287,27.896C16.636,27.327 16.957,26.693 17.25,25.995C17.43,25.561 17.689,24.871 18.027,23.925L19.303,23.925L17.706,29.914C17.678,30.027 17.653,30.131 17.63,30.227C17.608,30.323 17.596,30.402 17.596,30.464C17.596,30.537 17.613,30.6 17.647,30.654C17.681,30.707 17.74,30.734 17.824,30.734C17.909,30.734 17.996,30.701 18.086,30.637C18.176,30.572 18.289,30.472 18.424,30.337C18.486,30.275 18.599,30.143 18.762,29.94C18.863,29.816 19.018,29.627 19.227,29.374L19.463,29.534C19.204,29.962 18.934,30.331 18.652,30.641C18.095,31.266 17.577,31.579 17.098,31.579C16.85,31.579 16.647,31.511 16.49,31.376C16.332,31.241 16.253,31.029 16.253,30.742C16.253,30.596 16.267,30.435 16.295,30.261C16.323,30.086 16.368,29.889 16.431,29.669C16.532,29.275 16.661,28.783 16.819,28.191L17.005,27.473L16.946,27.473C16.169,28.763 15.558,29.675 15.113,30.21C14.341,31.128 13.612,31.587 12.925,31.587C12.739,31.587 12.57,31.548 12.418,31.469C12.125,31.311 11.979,31.029 11.979,30.624C11.979,30.506 11.984,30.41 11.996,30.337C12.007,30.264 12.027,30.162 12.055,30.033L13.237,25.294Z\" style=\"fill:#F3F4F6;\"/>\n        <path d=\"M34.122,31.459L26.157,31.459L26.157,29.578L30.777,23.333L26.4,23.333L26.4,21.417L33.852,21.417L33.852,23.333L29.239,29.544L34.122,29.544L34.122,31.459Z\" style=\"fill:#F3F4F6;\"/>\n        <path d=\"M42.565,27.676C42.565,28.921 42.225,29.902 41.543,30.62C40.862,31.337 39.899,31.695 38.654,31.695C37.417,31.695 36.456,31.337 35.771,30.62C35.085,29.902 34.742,28.921 34.742,27.676C34.742,26.417 35.085,25.431 35.771,24.719C36.456,24.006 37.417,23.65 38.654,23.65C39.895,23.65 40.857,24.008 41.54,24.725C42.223,25.442 42.565,26.426 42.565,27.676ZM40.144,27.689C40.144,27.24 40.107,26.865 40.033,26.566C39.959,26.267 39.856,26.028 39.726,25.848C39.587,25.659 39.429,25.528 39.254,25.454C39.079,25.379 38.878,25.342 38.654,25.342C38.442,25.342 38.251,25.375 38.08,25.44C37.91,25.505 37.752,25.63 37.608,25.814C37.473,25.99 37.366,26.23 37.285,26.536C37.204,26.842 37.163,27.226 37.163,27.689C37.163,28.152 37.201,28.527 37.278,28.812C37.354,29.098 37.453,29.326 37.575,29.497C37.701,29.672 37.858,29.8 38.047,29.881C38.236,29.962 38.445,30.002 38.674,30.002C38.863,30.002 39.055,29.962 39.25,29.881C39.446,29.8 39.602,29.679 39.719,29.517C39.859,29.324 39.964,29.091 40.036,28.819C40.108,28.547 40.144,28.17 40.144,27.689Z\" style=\"fill:#F3F4F6;\"/>\n        <path d=\"M50.914,31.459L48.54,31.459L48.54,27.703C48.54,27.397 48.528,27.092 48.503,26.789C48.479,26.485 48.432,26.262 48.365,26.118C48.284,25.947 48.167,25.825 48.014,25.75C47.861,25.676 47.657,25.639 47.401,25.639C47.207,25.639 47.012,25.675 46.814,25.747C46.616,25.819 46.405,25.934 46.18,26.091L46.18,31.459L43.82,31.459L43.82,23.886L46.18,23.886L46.18,24.722C46.567,24.394 46.943,24.137 47.31,23.953C47.676,23.769 48.082,23.677 48.527,23.677C49.3,23.677 49.891,23.921 50.301,24.408C50.71,24.896 50.914,25.603 50.914,26.529L50.914,31.459Z\" style=\"fill:#F3F4F6;\"/>\n        <path d=\"M56.539,31.662C55.109,31.662 54.013,31.32 53.251,30.636C52.489,29.953 52.108,28.98 52.108,27.716C52.108,26.48 52.463,25.493 53.173,24.756C53.884,24.018 54.877,23.65 56.154,23.65C57.314,23.65 58.187,23.962 58.771,24.587C59.355,25.212 59.648,26.107 59.648,27.271L59.648,28.121L54.475,28.121C54.498,28.472 54.572,28.765 54.698,29.001C54.824,29.237 54.99,29.425 55.197,29.564C55.399,29.704 55.635,29.804 55.905,29.864C56.175,29.925 56.469,29.955 56.788,29.955C57.063,29.955 57.332,29.925 57.598,29.864C57.863,29.804 58.106,29.724 58.326,29.625C58.519,29.539 58.698,29.447 58.862,29.348C59.026,29.249 59.16,29.162 59.263,29.085L59.513,29.085L59.513,31.034C59.32,31.111 59.143,31.182 58.983,31.247C58.824,31.312 58.605,31.378 58.326,31.446C58.07,31.513 57.805,31.566 57.533,31.604C57.261,31.642 56.93,31.662 56.539,31.662ZM57.321,26.698C57.308,26.199 57.192,25.819 56.974,25.558C56.756,25.297 56.422,25.167 55.972,25.167C55.514,25.167 55.155,25.304 54.897,25.578C54.638,25.853 54.495,26.226 54.468,26.698L57.321,26.698Z\" style=\"fill:#F3F4F6;\"/>\n        <path d=\"M21.879,27.39C23.439,27.511 24.225,28.23 24.225,28.23L24.256,26.204L20.808,26.688L20.327,27.451C20.327,27.451 20.891,27.314 21.879,27.39Z\" style=\"fill:#F3F4F6;\"/>\n        <g transform=\"matrix(0.613339,0,0,0.613339,-148.574,-234.227)\">\n            <clipPath id=\"_clip4\">\n                <path d=\"M294.206,389.253C303.213,387.444 310.102,387.986 311.124,391.029C312.509,395.155 302.602,402.305 288.995,407.001C275.391,411.696 262.814,412.209 261.429,408.084C260.612,405.652 263.872,402.15 269.473,398.721C261.802,403.033 257.368,407.569 258.398,410.858C260.121,416.362 276.458,416.293 294.889,410.708C313.319,405.124 326.865,396.137 325.141,390.635C324.289,387.912 319.856,386.554 313.361,386.554C308.071,386.554 301.412,387.455 294.206,389.253Z\"/>\n            </clipPath>\n            <g clip-path=\"url(#_clip4)\">\n                <path d=\"M255.39,403.107L321.314,379.578L328.499,399.706L262.574,423.235L255.39,403.107Z\" style=\"fill:url(#_Linear5);fill-rule:nonzero;\"/>\n            </g>\n        </g>\n    </g>\n    <defs>\n        <radialGradient id=\"_Radial1\" cx=\"0\" cy=\"0\" r=\"1\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"matrix(2.78964,0,0,2.78964,25.008,4.118)\"><stop offset=\"0\" style=\"stop-color:white;stop-opacity:1\"/><stop offset=\"1\" style=\"stop-color:rgb(249,194,14);stop-opacity:1\"/></radialGradient>\n        <radialGradient id=\"_Radial2\" cx=\"0\" cy=\"0\" r=\"1\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"matrix(2.78964,0,0,2.78964,21.647,9.159)\"><stop offset=\"0\" style=\"stop-color:white;stop-opacity:1\"/><stop offset=\"1\" style=\"stop-color:rgb(249,194,14);stop-opacity:1\"/></radialGradient>\n        <radialGradient id=\"_Radial3\" cx=\"0\" cy=\"0\" r=\"1\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"matrix(2.78964,0,0,2.78964,28.368,9.159)\"><stop offset=\"0\" style=\"stop-color:white;stop-opacity:1\"/><stop offset=\"1\" style=\"stop-color:rgb(249,194,14);stop-opacity:1\"/></radialGradient>\n        <linearGradient id=\"_Linear5\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\" gradientUnits=\"userSpaceOnUse\" gradientTransform=\"matrix(75.9342,-27.1018,27.1018,75.9342,248.736,416.405)\"><stop offset=\"0\" style=\"stop-color:white;stop-opacity:1\"/><stop offset=\"1\" style=\"stop-color:rgb(28,10,98);stop-opacity:1\"/></linearGradient>\n    </defs>\n</svg>\n`;\n\nexport const close_icon = `\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\"><path d=\"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" /></svg>\n`;\n\nexport const action_icon = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 40 40\">\n    <path d=\"M10.4 26.4Q9.4 26.4 8.7 25.7Q8 25 8 24Q8 23 8.7 22.3Q9.4 21.6 10.4 21.6Q11.4 21.6 12.1 22.3Q12.8 23 12.8 24Q12.8 25 12.1 25.7Q11.4 26.4 10.4 26.4ZM24 26.4Q23 26.4 22.3 25.7Q21.6 25 21.6 24Q21.6 23 22.3 22.3Q23 21.6 24 21.6Q25 21.6 25.7 22.3Q26.4 23 26.4 24Q26.4 25 25.7 25.7Q25 26.4 24 26.4ZM37.6 26.4Q36.6 26.4 35.9 25.7Q35.2 25 35.2 24Q35.2 23 35.9 22.3Q36.6 21.6 37.6 21.6Q38.6 21.6 39.3 22.3Q40 23 40 24Q40 25 39.3 25.7Q38.6 26.4 37.6 26.4Z\"/>\n</svg>`;\n\nexport const time_icon = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z\"/></svg>`;\n","<template>\n  <BaseMenu\n    v-if=\"userInfo\"\n    :placement=\"'bottom'\"\n    :appendToBody=\"true\"\n  >\n    <UserIcon\n      v-if=\"userInfo\"\n      :user=\"userInfo\"\n      :size=\"'32px'\"\n    />\n    <template #menu=\"{closeMenu}\">\n      <div id=\"user-menu\" class=\"user-menu\">\n        <ul>\n          <li v-if=\"isSuper\">\n            <BaseMenuButton @click=\"closeMenu(), $router.push({ path: '/super' })\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'admin'\"\n              />\n              <span>Super Admin</span>\n            </BaseMenuButton>\n          </li>\n          <li v-if=\"isSuper || isAdmin\">\n            <BaseMenuButton @click=\"closeMenu(), $router.push({ path: '/admin' })\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'verified'\"\n              />\n              <span>Admin Console</span>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton @click=\"closeMenu(), $router.push({ path: '/user' })\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'account_circle'\"\n              />\n              <span>Profile</span>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton @click=\"closeMenu(), openPricingModal()\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'payments'\"\n              />\n              <span>Plans & Pricing</span>\n            </BaseMenuButton>\n          </li>\n        </ul>\n        <hr>\n        <ul>\n          <!-- <li>\n            <BaseMenuButton>\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'darkmode'\"\n              />\n              <span>Dark Mode</span>\n              <BaseSwitch v-model:active=\"darkModeActive\" />\n            </BaseMenuButton>\n          </li> -->\n          <li v-if=\"allowDebug === 'yes'\">\n            <BaseMenuButton>\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'debug'\"\n              />\n              <span>Debug</span>\n              <BaseSwitch v-model:active=\"debugModeActive\" />\n            </BaseMenuButton>\n          </li>\n        </ul>\n        <hr>\n        <ul>\n          <li>\n            <BaseMenuButton @click=\"logOut\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'logout'\"\n              />\n              <span>Log Out</span>\n            </BaseMenuButton>\n          </li>\n        </ul>\n      </div>\n    </template>\n  </BaseMenu>\n  <PricingModal\n    ref=\"pricingModal\"\n  />\n</template>\n\n<script>\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseSwitch from '@/components/BaseSwitch.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport PricingModal from '@/components/PricingModal.vue';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: 'UserMenu',\n  components: {\n    SVGIcon,\n    BaseSwitch,\n    BaseMenu,\n    BaseMenuButton,\n    PricingModal,\n    UserIcon,\n  },\n  data() {\n    return {\n      debugModeActive: false,\n      darkModeActive: false,\n      dataConnect: new DatastoreConnect(),\n    };\n  },\n  computed: {\n    userInfo() {\n      return this.$store.state.user.user;\n    },\n    themeStoreState() {\n      return this.$store.state.theme;\n    },\n    debugModeStoreState() {\n      return this.$store.state.debugMode;\n    },\n    allowDebug() {\n      return this.$store.state.appVersion.allowDebug;\n    },\n    isSaas() {\n      return this.$store.state.appVersion.isSaas;\n    },\n    isSuper() {\n      return this.userInfo.role === 'super';\n    },\n    isAdmin() {\n      return this.userInfo.role === 'admin';\n    },\n  },\n  watch: {\n    debugModeActive() {\n      this.$store.commit('setDebugMode', this.debugModeActive);\n    },\n    darkModeActive(value) {\n      if (value) {\n        this.$store.commit('setTheme', \"theme-auzone-dark\");\n      } else {\n        this.$store.commit('setTheme', \"theme-auzone-light\");\n      }\n    },\n    themeStoreState(value) {\n      this.setTheme(value);\n    },\n  },\n  mounted() {\n    if (this.themeStoreState === \"theme-auzone-dark\") {\n      this.darkModeActive = true;\n    }\n    if (this.debugModeStoreState) {\n      this.debugModeActive = this.debugModeStoreState;\n    }\n    this.setTheme(this.themeStoreState);\n  },\n  methods: {\n    setTheme(value) {\n      this.$store.commit('setTheme', value);\n    },\n    logOut() {\n      this.$router.push({ path: '/logout' });\n    },\n    open(page) {\n      window.open(page);\n    },\n    openPricingModal() {\n      this.$refs.pricingModal.showModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.user-circle {\n  margin-right: 8px;\n  margin-left: 4px;\n}\n\n.user-menu:deep {\n  width: 186px;\n  .switch {\n    margin-left: auto;\n  }\n}\n\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <Popper\n    ref=\"popper\"\n    :trigger=\"trigger\"\n    :config=\"menuPopperConfig\"\n    :virtualReferenceElement=\"virtualReferenceElement\"\n    :appendToBody=\"appendToBody\"\n    :ignoreClickOutside=\"ignoreClickOutside\"\n    v-bind=\"$attrs\"\n    @popper-open=\"handlePopperOpened\"\n    @popper-closed=\"handlePopperClosed\"\n  >\n    <template #trigger>\n      <slot :isActive=\"internalIsOpen\" />\n    </template>\n    <div ref=\"menu\" class=\"menu__container\" :class=\"background\">\n      <slot name=\"menu\" :closeMenu=\"closeMenu\" />\n    </div>\n  </Popper>\n</template>\n\n<script>\nimport Popper from '@/components/Popper.vue';\nimport { detectOverflow } from '@popperjs/core';\n\nconst overflowPadding = 20;\n\nexport default {\n  name: 'BaseMenu',\n  components: {\n    Popper,\n  },\n  props: {\n    text: {\n      type: String,\n      default: '',\n    },\n    placement: {\n      type: String,\n      default: 'bottom',\n    },\n    flip: {\n      type: Boolean,\n      default: true,\n    },\n    virtualReferenceElement: {\n      type: Object,\n      default: null,\n    },\n    trigger: {\n      type: String,\n      default: 'click',\n    },\n    isOpen: {\n      type: Boolean,\n      default: false,\n    },\n    background: {\n      type: String,\n      default: '',\n    },\n    appendToBody: {\n      type: Boolean,\n      default: false,\n    },\n    offset: {\n      type: Array,\n      default: () => [0, 8],\n    },\n    ignoreClickOutside: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['update:isOpen', 'opened', 'closed'],\n  data() {\n    return {\n      internalIsOpen: false,\n    };\n  },\n  computed: {\n    detectOverflowModifier() {\n      return {\n        name: 'detectOverflowModifier',\n        enabled: !this.flip,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement === 'right') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.right - overflowPadding}px`;\n          }\n          if (state.placement === 'left') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.left - overflowPadding}px`;\n          }\n        },\n      };\n    },\n    detectHeightOverflowModifier() {\n      return {\n        name: 'detectHeightOverflowModifier',\n        enabled: true,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement.startsWith('bottom')) {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflowPadding}px`;\n          } else if (state.placement.startsWith('left') || state.placement.startsWith('right')) {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflow.top - (overflowPadding * 2)}px`;\n          }\n        },\n      };\n    },\n    menuPopperConfig() {\n      return {\n        placement: this.placement,\n        modifiers: [\n          this.detectOverflowModifier,\n          this.detectHeightOverflowModifier,\n          {\n            name: 'offset',\n            options: {\n              offset: this.offset,\n            },\n          },\n          {\n            name: 'preventOverflow',\n            options: {\n              padding: overflowPadding,\n            },\n          },\n          {\n            name: 'flip',\n            enabled: this.flip,\n          },\n        ],\n      };\n    },\n  },\n  watch: {\n    isOpen(value) {\n      this.internalIsOpen = value;\n    },\n  },\n  methods: {\n    handlePopperOpened() {\n      this.internalIsOpen = true;\n      this.$emit('update:isOpen', this.internalIsOpen);\n      this.$emit('opened');\n    },\n    handlePopperClosed() {\n      this.internalIsOpen = false;\n      this.$emit('update:isOpen', this.internalIsOpen);\n      this.$emit('closed');\n    },\n    closeMenu() {\n      if (this.$refs.popper) {\n        this.$refs.popper.close();\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.menu__container:deep {\n  background: #ffffff;\n  border: 1px solid #ffffff;\n  color: #000000;\n  box-shadow: 0 2px 5px 0 rgb(0 0 0 / 30%);\n  border-radius: 8px;\n  margin: 0;\n  padding: 8px;\n  z-index: 999;\n\n  ul {\n    list-style-type: none;\n    margin: 0;\n    padding: 0;\n  }\n\n  hr {\n    margin: 4px 0;\n  }\n}\n\n</style>\n","<template>\n  <slot name=\"trigger\" />\n  <!-- <transition :name=\"transition\" :enter-active-class=\"enterActiveClass\" :leave-active-class=\"leaveActiveClass\" @after-leave=\"destroyPopper\"> -->\n  <Teleport v-if=\"isOpen\" :disabled=\"!teleportEl\" :to=\"teleportEl\">\n    <OnClickOutside\n      ref=\"clickContainer\"\n      class=\"click-container\"\n      :options=\"{ignore: ignoreClickOutside}\"\n      v-bind=\"$attrs\"\n      @trigger=\"close\"\n    >\n      <div\n        v-show=\"isOpen\"\n        ref=\"popperEl\"\n        class=\"popper-container scrollbar\"\n      >\n        <slot />\n      </div>\n    </OnClickOutside>\n  </Teleport>\n  <!-- </transition> -->\n</template>\n\n<script>\nimport { createPopper } from '@popperjs/core';\nimport { OnClickOutside } from '@vueuse/components';\n\nfunction on(element, event, handler) {\n  if (element && event && handler) {\n    document.addEventListener ? element.addEventListener(event, handler, false) : element.attachEvent(`on${event}`, handler);\n  }\n}\nfunction off(element, event, handler) {\n  if (element && event) {\n    document.removeEventListener ? element.removeEventListener(event, handler, false) : element.detachEvent(`on${event}`, handler);\n  }\n}\n\nexport default {\n  name: 'Popper',\n  components: {\n    OnClickOutside,\n  },\n  props: {\n    trigger: {\n      type: String,\n      default: 'click',\n    },\n    referenceElement: {\n      type: String,\n      default: null,\n    },\n    virtualReferenceElement: {\n      type: Object,\n      default: null,\n    },\n    appendToBody: {\n      type: Boolean,\n      default: false,\n    },\n    transition: {\n      type: String,\n      default: '',\n    },\n    delayOnMouseOver: {\n      type: Number,\n      default: 10,\n    },\n    delayOnMouseOut: {\n      type: Number,\n      default: 10,\n    },\n    config: {\n      type: Object,\n      default: () => ({\n        placement: 'bottom',\n      }),\n    },\n    ignoreClickOutside: {\n      type: Array,\n      default: () => [],\n    },\n    show: {\n      type: Boolean,\n      default: false,\n    },\n    teleport: {\n      type: [String, HTMLElement],\n      default: null,\n    },\n  },\n  emits: ['popper-open', 'popper-closed', 'update:show'],\n  data() {\n    return {\n      isOpen: false,\n      hidden: false,\n      triggerEl: null,\n      popperEl: null,\n      popperJS: null,\n    };\n  },\n  computed: {\n    teleportEl() {\n      if (this.appendToBody) {\n        return 'body';\n      } else if (this.teleport) {\n        return this.teleport;\n      }\n      return null;\n    },\n  },\n  watch: {\n    referenceElement() {\n      this.setupEvents();\n    },\n    show(show) {\n      this.setupEvents();\n      // Toggle popper if required\n      if (!this.isOpen && show) {\n        this.open();\n      } else if (this.isOpen && !show) {\n        this.close();\n      }\n    },\n  },\n  beforeUnmount() {\n    if (!this.popperEl) {\n      return;\n    }\n\n    this.destroyPopper();\n  },\n  mounted() {\n    this.setupEvents();\n    if (!this.isOpen && this.show) {\n      this.open();\n    }\n  },\n  methods: {\n    setupTriggerEvents() {\n      if (!this.referenceElement && !this.virtualReferenceElement) {\n        this.triggerEl = this.$el.nextElementSibling;\n      } else if (this.referenceElement) {\n        this.triggerEl = document.getElementById(this.referenceElement);\n      }\n\n      if (this.triggerEl) {\n        switch (this.trigger) {\n        case 'clickToOpen':\n          on(this.triggerEl, 'click', this.doShow);\n          break;\n        case 'click': // Same as clickToToggle, provided for backwards compatibility.\n        case 'clickToToggle':\n          on(this.triggerEl, 'click', this.togglePopper);\n          break;\n        case 'hover':\n          on(this.triggerEl, 'mouseover', this.onMouseOver);\n          on(this.triggerEl, 'mouseout', this.onMouseOut);\n          break;\n        case 'focus':\n          on(this.triggerEl, 'focus', this.onMouseOver);\n          on(this.triggerEl, 'blur', this.onMouseOut);\n          break;\n        case 'show':\n          break;\n        default:\n        }\n      }\n    },\n    setupPopperEvents() {\n      this.popperEl = this.$refs.popperEl;\n\n      if (this.popperEl) {\n        switch (this.trigger) {\n        case 'clickToOpen':\n          break;\n        case 'click': // Same as clickToToggle, provided for backwards compatibility.\n        case 'clickToToggle':\n          break;\n        case 'hover':\n          on(this.popperEl, 'mouseover', this.onMouseOver);\n          on(this.popperEl, 'mouseout', this.onMouseOut);\n          break;\n        case 'focus':\n          on(this.popperEl, 'focus', this.onMouseOver);\n          on(this.popperEl, 'blur', this.onMouseOut);\n          break;\n        case 'show':\n          break;\n        default:\n        }\n      }\n    },\n    setupEvents() {\n      this.setupTriggerEvents();\n    },\n    togglePopper() {\n      if (!this.isOpen) {\n        this.open();\n      } else {\n        this.close();\n      }\n    },\n    onMouseOver() {\n      clearTimeout(this._timer);\n      this._timer = setTimeout(() => {\n        this.open();\n      }, this.delayOnMouseOver);\n    },\n    onMouseOut() {\n      clearTimeout(this._timer);\n      this._timer = setTimeout(() => {\n        this.close();\n      }, this.delayOnMouseOut);\n    },\n    async open() {\n      if (this.isOpen) {\n        return;\n      }\n\n      this.isOpen = true;\n      await this.$nextTick();\n      this.setupPopperEvents();\n      let referenceElement = this.triggerEl;\n      if (this.virtualReferenceElement) {\n        referenceElement = this.virtualReferenceElement;\n      }\n      this.popperJS = createPopper(referenceElement, this.popperEl, this.config);\n\n      this.$emit('update:show', true);\n      this.$emit('popper-open');\n    },\n    close(e) {\n      if (!this.isOpen\n          || (e && (this.triggerEl === e.target || this.triggerEl?.contains(e.target)))) {\n        return;\n      }\n      this.destroyPopper();\n\n      this.isOpen = false;\n      this.$emit('update:show', false);\n      this.$emit('popper-closed');\n    },\n    update() {\n      this.setupEvents();\n      this.popperJS.update();\n    },\n    destroyPopper() {\n      // off(this.referenceElm, 'click', this.togglePopper);\n      // off(this.referenceElm, 'mouseup', this.doClose);\n      // off(this.referenceElm, 'mousedown', this.doShow);\n      // off(this.referenceElm, 'focus', this.doShow);\n      // off(this.referenceElm, 'blur', this.doClose);\n      // off(this.referenceElm, 'mouseout', this.onMouseOut);\n      // off(this.referenceElm, 'mouseover', this.onMouseOver);\n      // off(document, 'click', this.handleDocumentClick);\n\n      if (this.popperJS) {\n        this.popperJS.destroy();\n        this.popperJS = null;\n      }\n    },\n    handleDocumentClick() {},\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.click-container {\n  position: absolute;\n}\n.popper-container {\n  display: flex;\n  opacity: 1;\n  z-index: 1000;\n}\n</style>\n","import { render } from \"./Popper.vue?vue&type=template&id=7640d0d8&scoped=true\"\nimport script from \"./Popper.vue?vue&type=script&lang=js\"\nexport * from \"./Popper.vue?vue&type=script&lang=js\"\n\nimport \"./Popper.vue?vue&type=style&index=0&id=7640d0d8&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7640d0d8\"]])\n\nexport default __exports__","import { render } from \"./BaseMenu.vue?vue&type=template&id=da30c4aa&scoped=true\"\nimport script from \"./BaseMenu.vue?vue&type=script&lang=js\"\nexport * from \"./BaseMenu.vue?vue&type=script&lang=js\"\n\nimport \"./BaseMenu.vue?vue&type=style&index=0&id=da30c4aa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-da30c4aa\"]])\n\nexport default __exports__","<template>\n  <label\n    ref=\"switch\"\n    class=\"switch\"\n    :class=\"`_${theme}`\"\n    :disabled=\"disabled\"\n  >\n    <input\n      :id=\"uid\"\n      :checked=\"active\"\n      class=\"switch__input\"\n      type=\"checkbox\"\n      :disabled=\"disabled\"\n      @change=\"handleSwitchToggle\"\n    >\n    <span class=\"switch__slider _round\" />\n  </label>\n</template>\n\n<script>\nlet uid = 0;\n\nexport default {\n  name: \"BaseSwitch\",\n  props: {\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    active: {\n      type: Boolean,\n      default: false,\n    },\n    theme: {\n      type: String,\n      default: 'primary',\n    },\n    fontSize: {\n      type: String,\n      default: '14px',\n    },\n  },\n  emits: ['change', 'update:active'],\n  data() {\n    uid += 1;\n    return {\n      uid: `switch-${uid}`,\n    };\n  },\n  methods: {\n    handleSwitchToggle(e) {\n      this.$emit('change');\n      this.$emit('update:active', e.target.checked);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n/* The switch - the box around the slider */\n.switch {\n  --switchWidth: 44px;\n  --switchHeight: 22px;\n  position: relative;\n  display: inline-block;\n  width: var(--switchWidth);\n  height: var(--switchHeight);\n  margin: 1px;\n\n  &__input {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n\n    &:focus-visible {\n      outline: 1px dotted rgba(0,0,0,0.5);\n    }\n  }\n\n  /* Toggle functionality */\n  &__input:checked + .switch__slider {\n    @include themify() {\n      background-color: themed('primary-switch-active-background');\n    }\n    &:before {\n      -webkit-transform: translateX(calc(var(--switchWidth) - var(--switch-handle-size) - var(--switch-handle-margin) * 2));\n      -ms-transform: translateX(calc(var(--switchWidth) - var(--switch-handle-size) - var(--switch-handle-margin) * 2));\n      transform: translateX(calc(var(--switchWidth) - var(--switch-handle-size) - var(--switch-handle-margin) * 2));\n    }\n  }\n\n  /* Disabled slider style */\n  &[disabled=\"true\"] {\n    opacity: 0.25;\n    & span {\n      background-color: grey;\n      cursor: not-allowed;\n    }\n\n    & .switch__slider._round:before {\n      background-color: #CCCCCC;\n    }\n  }\n\n  /* Switch slider style */\n  &__slider {\n    position: absolute;\n    cursor: pointer;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: #ccc;\n    -webkit-transition: .4s;\n    transition: .4s;\n\n    &:before {\n      --switch-handle-margin: 3px;\n      --switch-handle-size: calc(var(--switchHeight) - 6px);\n      position: absolute;\n      content: \"\";\n      height: var(--switch-handle-size);\n      width: var(--switch-handle-size);\n      left: var(--switch-handle-margin);\n      bottom: var(--switch-handle-margin);\n      background-color: white;\n      -webkit-transition: .4s;\n      transition: .4s;\n    }\n\n    /* Rounded sliders */\n    &._round {\n      border-radius: var(--switchHeight);\n\n      &:before {\n        border-radius: 50%;\n      }\n    }\n  }\n}\n\n// Alternative themes\n.switch._accent .switch__input:checked + .switch__slider {\n  @include themify() {\n    background-color: themed('accent-switch-active-background');\n  }\n}\n\n</style>\n","import { render } from \"./BaseSwitch.vue?vue&type=template&id=49bdcda6&scoped=true\"\nimport script from \"./BaseSwitch.vue?vue&type=script&lang=js\"\nexport * from \"./BaseSwitch.vue?vue&type=script&lang=js\"\n\nimport \"./BaseSwitch.vue?vue&type=style&index=0&id=49bdcda6&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-49bdcda6\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <button\n    class=\"menu-button\"\n    :disabled=\"disabled\"\n    :class=\"{ '_disabled' : disabled }\"\n  >\n    <slot />\n  </button>\n</template>\n\n<script>\n\nexport default {\n  name: 'BaseMenuButton',\n  components: {\n  },\n  props: {\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.menu-button:deep {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  align-items: center;\n  outline: none;\n  border: none;\n  border-radius: 4px;\n  background: none;\n  color: inherit;\n  padding: 8px 4px;\n  margin: 0;\n  line-height: 1;\n  cursor: pointer;\n\n  &:hover {\n    background-color: var(--menu-button-hover-background);\n  }\n\n  &:focus-visible {\n    background-color: var(--menu-button-hover-background);\n  }\n\n  > span {\n    font: inherit;\n    font-size: 1rem;\n    font-weight: 600;\n    white-space: nowrap;\n  }\n\n  > svg + span {\n    margin-left: 12px;\n  }\n\n  &._danger {\n    @include themify() {\n      color: themed('color-danger');\n    }\n  }\n\n  &._disabled {\n    color: $color-auzone-disabled;\n    cursor: not-allowed;\n\n  }\n}\n\n</style>\n","import { render } from \"./BaseMenuButton.vue?vue&type=template&id=1c3e588e&scoped=true\"\nimport script from \"./BaseMenuButton.vue?vue&type=script&lang=js\"\nexport * from \"./BaseMenuButton.vue?vue&type=script&lang=js\"\n\nimport \"./BaseMenuButton.vue?vue&type=style&index=0&id=1c3e588e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1c3e588e\"]])\n\nexport default __exports__","<template>\n  <Teleport :to=\"'body'\">\n    <Modal\n      ref=\"pricingModal\"\n      :width=\"'80%'\"\n      :height=\"'90%'\"\n      :title=\"'EdgeFirst Studio Pricing'\"\n    >\n      <template #modal-main>\n        <div class=\"body scrollbar\">\n          <div class=\"image\">\n            <PriceTable :color=\"'black'\" :maxWidth=\"'100%'\" />\n          </div>\n        </div>\n      </template>\n    </Modal>\n  </Teleport>\n</template>\n\n<script>\nimport { auzone_logo } from \"@/assets/js/icons\";\n\nimport PriceTable from '@/components/PriceTable.vue';\nimport Modal from './Modal.vue';\n\nexport default {\n  name: 'PricingModal',\n  components: {\n    Modal,\n    PriceTable,\n  },\n  data() {\n    return {\n      auzone_logo,\n    };\n  },\n  methods: {\n    showModal() {\n      this.$refs.pricingModal.showModal();\n    },\n    closeModal() {\n      this.$refs.pricingModal.closeModal();\n    },\n  },\n\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.body {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  min-width: 450px;\n  overflow: auto;\n}\n\n.image {\n  display: flex;\n  width: 100%;\n}\n.pricing {\n  position: relative;\n  left: -1%;\n  object-fit: contain;\n  min-width: 0;\n  max-height: 100%;\n}\n\n.title {\n  color: tint-color($accent-text-color, 45%);\n  font-size: 1.1rem;\n  margin-left: 20px;\n  font-weight: 600;\n  text-align: left;\n}\n.brand-name {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-start;\n  line-height: 1;\n  margin-bottom: 0.5rem;\n  margin-top: 10px;\n  margin-left: 20px;\n\n  span {\n    color: var(--color-accent);\n    font-weight: 700;\n    font-size: 3rem;\n    text-wrap: nowrap;\n  }\n\n  span + span {\n    color: var(--color-primary-500);\n    font-size: 3rem;\n    font-weight: 300;\n    margin-left: 8px;\n  }\n}\n</style>\n","<template>\n  <div class=\"pricing-table\" :style=\"{ maxWidth: maxWidth}\">\n    <h1 :style=\"{color: textColor}\">Pricing Plans</h1>\n    <div class=\"pricing-table__subtitle\">\n      <p :style=\"{color: textColor}\">\n        Sign up for free to claim $10 in credits.\n        For customized plans and payments, contact our sales team\n      </p>\n    </div>\n    <button class=\"button sales-btn\" @click=\"contactSales\">Contact Sales</button>\n    <table v-if=\"costPackage.freePackage && costPackage.basicPackage && costPackage.proPackage && costPackage.businessPackage\" class=\"table\">\n      <colgroup>\n        <col span=\"1\" style=\"width: 26%;\">\n        <col span=\"1\" style=\"width: 17%;\" class=\"free\">\n        <col span=\"1\" style=\"width: 17%;\" class=\"low\">\n        <col span=\"1\" style=\"width: 17%;\" class=\"medium\">\n        <col span=\"1\" style=\"width: 17%;\" class=\"high\">\n      </colgroup>\n      <tbody>\n        <tr class=\"header-row\">\n          <th />\n          <th><div class=\"cell text-center highlight\"><h3>Free (Trial)</h3></div></th>\n          <th><div class=\"cell text-center highlight\"><h3>Basic</h3></div></th>\n          <th><div class=\"cell text-center highlight\"><h3>Pro</h3></div></th>\n          <th><div class=\"cell text-center highlight\"><h3>Business</h3></div></th>\n        </tr>\n        <tr class=\"header-row-secondary\">\n          <th />\n          <th><div class=\"cell text-center cost-tag\">One-time $ 10 credit</div></th>\n          <th><div class=\"cell text-center cost-tag\">$ {{ costPackage.basicPackage['package_cost_dollar'] }} *</div></th>\n          <th><div class=\"cell text-center cost-tag\">$ {{ costPackage.proPackage['package_cost_dollar'] }} *</div></th>\n          <th><div class=\"cell text-center cost-tag\">$ {{ costPackage.businessPackage['package_cost_dollar'] }} *</div></th>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>Seats (Per User / Month)</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Adding New User</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>$1</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.basicPackage['seats'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.basicPackage['seats'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['seats'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['seats'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['seats'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['seats'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>Machine Learning Operations (Per Hour)</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Auto Annotation</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['auto_ann'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['auto_ann'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['auto_ann'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['auto_ann'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Auto Segmentation</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['auto_seg'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['auto_seg'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.basicPackage['auto_seg'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.basicPackage['auto_seg'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['auto_seg'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['auto_seg'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['auto_seg'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['auto_seg'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>AI Assisted Segmentation</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['training'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['training'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['training'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['training'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Image Based Training</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['training'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['training'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['training'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['training'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Sensor Fusion Model Training</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['training'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['training'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['training'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['training'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['training'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Model Quantization & Conversion</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Model & Inference Validation</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['auto_ann'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['auto_ann'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['auto_ann'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['auto_ann'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['auto_ann'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Edge Model Optimization & Export</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Data Audit & Labelling</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>Data Storage (Per Month)</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Image (per Image)</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['images'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['images'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.basicPackage['images'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.basicPackage['images'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['images'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['images'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['images'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['images'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Parked Image (per Image)</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['images'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['images'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']/2) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.basicPackage['images'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.basicPackage['images'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd']/2) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['images'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['images'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']/2) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['images'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['images'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']/2) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Video & Binary (per MB)</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['bulk_video'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['bulk_video'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.basicPackage['bulk_video'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.basicPackage['bulk_video'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['bulk_video'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['bulk_video'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['bulk_video'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['bulk_video'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>Annotations (Per Month)</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Image Bounding Box</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.basicPackage['annotations'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.basicPackage['annotations'][0]['crpu']*costPackage.basicPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Image Segmentation</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Radar Point Cloud</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Pose / IMU / GPS</span></div></td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span> {{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.freePackage['annotations'][0]['crpu']*costPackage.freePackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.proPackage['annotations'][0]['crpu']*costPackage.proPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n          <td>\n            <div class=\"cell text-center highlight\">\n              <span v-if=\"costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd'] > 1\">$ </span>\n              <span v-else>&#65504;</span>\n              <span>{{ roundToTwoDecimals(costPackage.businessPackage['annotations'][0]['crpu']*costPackage.businessPackage['dve_credits_cost_usd']) }}</span>\n            </div>\n          </td>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>Live Data & Dataset Enrichment (Per Call)</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Bridge API</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>License</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>ModelPack Enterprise</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n        </tr>\n        <tr class=\"header-row-secondary description\">\n          <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h3>Support Package</h3></div></td>\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Technical Support</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Not Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n        </tr>\n        <tr>\n          <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Feature Request</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Not Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n          <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n        </tr>\n        <tr>\n          <td />\n          <td />\n          <td />\n          <td />\n          <td />\n        </tr>\n        <tr>\n          <td colspan=\"5\">\n            <div class=\"cell text-left\" :style=\"{color: textColor}\">\n              <span class=\"unit\">\n                (*): Minimum monthly charge on an annual basis. A credit amount equal to the minimum monthly charge will be deducted.\n              </span>\n            </div>\n          </td>\n        </tr>\n      <!-- <div class=\"t-row\">\n        <div class=\"cell\"> {{ parseFloat(params.iou) }} </div>\n        <div class=\"cell\">{{ parseFloat(params.confidence) }}</div>\n      </div> -->\n      </tbody>\n    </table>\n\n    <div ref=\"sliderInput\" class=\"slider-pricing\">\n      <div class=\"container slider-card\" :style=\"{color: textColor}\">\n        <div class=\"slider-title\">\n          <div class=\"slider-title__text\">\n            <span class=\"item text-italic\">Seats</span>\n            <span class=\"subtitle\">How many members does your team have?</span>\n          </div>\n          <div class=\"settings__control-group slider-box-input\">\n            <input\n              v-model=\"sliderValue.seats\"\n              type=\"number\"\n              placeholder=\"0\"\n              max=\"999999999\"\n              @input=\"updateInput('seats')\"\n            >\n          </div>\n        </div>\n        <SingleSliderWithTwoColors\n          v-model:sliderValue=\"sliderValue.seats\"\n          class=\"mb-4\"\n          :step=\"1\"\n          :min=\"0\"\n          :max=\"20\"\n        />\n        <div class=\"slider-title\">\n          <div class=\"slider-title__text\">\n            <span class=\"item text-italic\">Images</span>\n            <span class=\"subtitle\">How many images does your project have?</span>\n          </div>\n          <div class=\"settings__control-group slider-box-input\">\n            <input\n              v-model=\"sliderValue.images\"\n              type=\"number\"\n              placeholder=\"0\"\n              @input=\"updateInput('images')\"\n            >\n          </div>\n        </div>\n        <SingleSliderWithTwoColors\n          v-model:sliderValue=\"sliderValue.images\"\n          class=\"mb-4\"\n          :step=\"10000\"\n          :min=\"0\"\n          :max=\"1000000\"\n        />\n        <div class=\"slider-title\">\n          <div class=\"slider-title__text\">\n            <span class=\"item text-italic\">Video & binary files (MB)</span>\n            <span class=\"subtitle\">Videos and other file storages</span>\n          </div>\n          <div class=\"settings__control-group slider-box-input\">\n            <input\n              v-model=\"sliderValue.video\"\n              type=\"number\"\n              placeholder=\"0\"\n              max=\"999999999\"\n              @input=\"updateInput('video')\"\n            >\n          </div>\n        </div>\n        <SingleSliderWithTwoColors\n          v-model:sliderValue=\"sliderValue.video\"\n          class=\"mb-4\"\n          :step=\"10\"\n          :min=\"0\"\n          :max=\"10000\"\n        />\n        <div class=\"slider-title\">\n          <div class=\"slider-title__text\">\n            <span class=\"item text-italic\">Annotations</span>\n            <span class=\"subtitle\">Bounding boxes, segments, and other annotations</span>\n          </div>\n          <div class=\"settings__control-group slider-box-input slider-box-input\">\n            <input\n              v-model=\"sliderValue.annotations\"\n              type=\"number\"\n              placeholder=\"0\"\n              max=\"999999999\"\n              @input=\"updateInput('annnotations')\"\n            >\n          </div>\n        </div>\n        <SingleSliderWithTwoColors\n          v-model:sliderValue=\"sliderValue.annotations\"\n          class=\"mb-4\"\n          :min=\"0\"\n          :max=\"1000000\"\n          :step=\"10000\"\n        />\n        <div class=\"slider-title\">\n          <div class=\"slider-title__text\">\n            <span class=\"item text-italic\">Machine Learning Operations (per month)</span>\n            <span class=\"subtitle\">Training, inference, and AI assisted tasks usage</span>\n          </div>\n          <div class=\"settings__control-group slider-box-input\">\n            <input\n              v-model=\"sliderValue.mlops\"\n              type=\"number\"\n              placeholder=\"0\"\n              max=\"999999999\"\n              @input=\"updateInput('mlops')\"\n            >\n          </div>\n        </div>\n        <SingleSliderWithTwoColors\n          v-model:sliderValue=\"sliderValue.mlops\"\n          class=\"mb-4\"\n          :step=\"5\"\n          :min=\"0\"\n          :max=\"200\"\n        />\n      </div>\n\n      <div class=\"container total-price-card\" :style=\"{color: textColor}\">\n        <span class=\"label text-italic\">Monthly Total</span>\n        <div class=\"item\">\n          <div class=\"price\">\n            <h2>\n              $ {{\n                displayWithComma(roundToTwoDecimals(displayTotal))\n              }} <span class=\"unit\"> / month</span>\n            </h2>\n          </div>\n        </div>\n        <span class=\"label text-italic\">Recommended Plan</span>\n        <div class=\"item\">\n          <div class=\"price\">\n            <h2>{{ displayPlan }}</h2>\n          </div>\n        </div>\n        <br>\n        <br>\n        <div class=\"text-center\">\n          <p>For customized plans and payments</p>\n          <button class=\"button sales-btn\" @click=\"contactSales\">Contact Sales</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\n\nimport SingleSliderWithTwoColors from '@/components/SingleSliderWithTwoColors.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { inputSanitizer, changeSanitizer } from '../assets/js/utils';\n\nexport default {\n  name: \"PriceTable\",\n  components: {\n    SingleSliderWithTwoColors,\n  },\n  props: {\n    color: {\n      type: String,\n      default: 'white',\n    },\n    maxWidth: {\n      type: String,\n      default: '1500px',\n    },\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(),\n      costPackage: {\n        freePackage: null,\n        basicPackage: null,\n        proPackage: null,\n        businessPackage: null,\n      },\n      sliderValue: {\n        seats: 0,\n        images: 0,\n        video: 0,\n        annotations: 0,\n        mlops: 0,\n      },\n      sliderInput: {\n        seats: 0,\n        images: 0,\n        video: 0,\n        annotations: 0,\n        mlops: 0,\n      },\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    textColor() {\n      if (this.color === '' || this.color === 'white') {\n        return \"#f6f7f8\";\n      } else {\n        return `${this.color}`;\n      }\n    },\n    totalMonthlyCostBasic() {\n      return this.getCreditCost('seats', this.sliderValue.seats, 'basicPackage')\n              + this.getCreditCost('training', this.sliderValue.mlops, 'basicPackage')\n              + this.getCreditCost('images', this.sliderValue.images, 'basicPackage')\n              + this.getCreditCost('video', this.sliderValue.video, 'basicPackage')\n              + this.getCreditCost('annotations', this.sliderValue.annotations, 'basicPackage');\n    },\n    totalMonthlyCostPro() {\n      return this.getCreditCost('seats', this.sliderValue.seats, 'proPackage')\n              + this.getCreditCost('training', this.sliderValue.mlops, 'proPackage')\n              + this.getCreditCost('images', this.sliderValue.images, 'proPackage')\n              + this.getCreditCost('video', this.sliderValue.video, 'proPackage')\n              + this.getCreditCost('annotations', this.sliderValue.annotations, 'proPackage');\n    },\n    totalMonthlyCostBusiness() {\n      return this.getCreditCost('seats', this.sliderValue.seats, 'businessPackage')\n              + this.getCreditCost('training', this.sliderValue.mlops, 'businessPackage')\n              + this.getCreditCost('images', this.sliderValue.images, 'businessPackage')\n              + this.getCreditCost('video', this.sliderValue.video, 'businessPackage')\n              + this.getCreditCost('annotations', this.sliderValue.annotations, 'businessPackage');\n    },\n    displayTotal() {\n      if ((this.sliderValue.seats + this.sliderValue.mlops\n      + this.sliderValue.images\n      + this.sliderValue.video + this.sliderValue.annotations) === 0) {\n        return 0;\n      }\n      const basic = Math.max(this.totalMonthlyCostBasic, this.costPackage.basicPackage?.package_cost_dollar);\n      const pro = Math.max(this.totalMonthlyCostPro, this.costPackage.proPackage?.package_cost_dollar);\n      const business = Math.max(this.totalMonthlyCostBusiness, this.costPackage.businessPackage?.package_cost_dollar);\n      if (basic < this.costPackage.proPackage?.package_cost_dollar) {\n        return basic;\n      } else if (pro <= this.costPackage.businessPackage?.package_cost_dollar) {\n        return pro;\n      } else {\n        return business;\n      }\n    },\n    displayPlan() {\n      if (this.displayTotal === 0) {\n        return \"Free\";\n      } else if (this.displayTotal < this.costPackage.proPackage?.package_cost_dollar) {\n        return \"Basic\";\n      } else if (this.displayTotal < this.costPackage.businessPackage?.package_cost_dollar) {\n        return \"Pro\";\n      } else {\n        return \"Business\";\n      }\n    },\n  },\n  watch: {\n    sliderValue: {\n      deep: true,\n      handler() {\n        Object.keys(this.sliderValue).forEach((key) => {\n          if (this.sliderValue[key] === \"\" || !this.sliderValue[key]) {\n            this.sliderValue[key] = 0;\n          }\n          this.sliderInput[key] = this.sliderValue[key];\n        });\n      },\n    },\n  },\n  created() {\n    this.getFreeCostPackage();\n    this.getBasicCostPackage();\n    this.getProCostPackage();\n    this.getBusinessCostPackage();\n  },\n  mounted() {\n    const inputs = this.$refs.sliderInput.querySelectorAll('input[type=number]');\n    inputs.forEach((input) => {\n      input.onkeydown = function (e) {\n        if (e.keyCode === 13) {\n          input.blur();\n        }\n        if (e.target.value && e.target.value.length > 9) {\n          return false;\n        }\n        if (!((e.keyCode > 95 && e.keyCode < 106)\n      || (e.keyCode > 47 && e.keyCode < 58)\n      || e.keyCode === 8)) {\n          return false;\n        }\n        return true;\n      };\n    });\n  },\n  methods: {\n    changeSanitizer,\n    inputSanitizer,\n    updateInput(key) {\n      if (!this.sliderInput[key] || this.sliderInput[key] === \"\") {\n        this.sliderValue[key] = 0;\n      }\n    },\n    async getFreeCostPackage() {\n      await this.dsConn.getCostPackageByName({ package_name: 'free' })\n        .then((data) => {\n          if (data.result) {\n            this.costPackage.freePackage = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getBasicCostPackage() {\n      await this.dsConn.getCostPackageByName({ package_name: 'basic' })\n        .then((data) => {\n          if (data.result) {\n            this.costPackage.basicPackage = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getProCostPackage() {\n      await this.dsConn.getCostPackageByName({ package_name: 'pro' })\n        .then((data) => {\n          if (data.result) {\n            this.costPackage.proPackage = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getBusinessCostPackage() {\n      await this.dsConn.getCostPackageByName({ package_name: 'business' })\n        .then((data) => {\n          if (data.result) {\n            this.costPackage.businessPackage = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    roundToTwoDecimals(n) {\n      const log10 = n ? Math.floor(Math.log10(n)) : 0;\n      const div = log10 < 0 ? 10 ** (2 - log10 - 1) : 10 ** 2;\n      const result = Math.round(n * div) / div;\n\n      return result > 1 ? `${result}` : `${result * 100}`;\n    },\n    displayWithComma(x) {\n      return Intl.NumberFormat('en-US').format(x);\n    },\n    contactSales() {\n      window.open('https://support.deepviewml.com/hc/en-us/requests/new');\n    },\n    getCreditCost(itemName, total, pkg) {\n      let credit_range = null;\n      if (!this.costPackage[pkg]) {\n        return 0;\n      }\n      switch (itemName) {\n      case 'seats':\n        credit_range = this.costPackage[pkg]['seats'];\n        break;\n      case 'images':\n        credit_range = this.costPackage[pkg]['images'];\n        break;\n      case 'annotations':\n        credit_range = this.costPackage[pkg]['annotations'];\n        break;\n      case 'video':\n        credit_range = this.costPackage[pkg]['bulk_video'];\n        break;\n      case 'training':\n        credit_range = this.costPackage[pkg]['training'];\n        break;\n      case 'auto_ann':\n        credit_range = this.costPackage[pkg]['auto_ann'];\n        break;\n      case 'auto_seg':\n        credit_range = this.costPackage[pkg]['auto_seg'];\n        break;\n      default:\n      }\n      let total_dollar_used = 0;\n      let localTotal = total;\n\n      credit_range.forEach((range, i) => {\n        if (credit_range[i]['max'] === -1) {\n          credit_range[i]['max'] = Infinity;\n        }\n        credit_range[i]['count'] = Math.min(credit_range[i]['max'], localTotal);\n        credit_range[i]['cost_credits'] = credit_range[i]['count'] * credit_range[i]['crpu'];\n        credit_range[i]['cost_dollars'] = credit_range[i]['cost_credits'] * this.costPackage[pkg]['dve_credits_cost_usd'];\n        total_dollar_used += credit_range[i]['cost_dollars'];\n\n        // move to next bracket\n        localTotal -= credit_range[i]['count'];\n      });\n      return total_dollar_used;\n    },\n  },\n\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.pricing-table {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  width: 100%;\n  height: 100%;\n  padding: 20px;\n  background: rgba(255, 255, 255, 0.075);\n  border-radius: 16px;\n  box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n  backdrop-filter: blur(1px);\n  -webkit-backdrop-filter: blur(1px);\n\n  &__subtitle {\n    display: flex;\n    flex-direction: column;\n    width: 60%;\n    padding: 8px;\n  }\n}\n\ntable {\n  border-radius: 4px;\n  border-spacing: 10px 0;\n  width: 100%;\n  margin: 8px;\n  color: var(--primary-text-color);\n\n  .header-row {\n    font-weight: 700;\n  }\n\n  .header-row-secondary {\n    font-weight: 300;\n    font-size: 0.9rem;\n\n    td:first-child h3 {\n      padding-left: 5px;\n    }\n  }\n\n  .cell {\n    display: flex;\n  }\n\n  // .cell + .cell {\n  //   border-left:  0.5px solid rgba(96, 95, 95, 0.5);\n  // }\n\n  span {\n    font-size: 1.06rem;\n  }\n}\n\ntr:first-child th:nth-child(n+2) {\n  padding-top: 10px;\n  margin-left: 20px;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  border-bottom: 0.5px solid inherit;\n}\n\ntd {\n  height: 40px;\n}\n\ntr:nth-last-child(2) td:nth-child(n+2) {\n  padding-bottom: 10px;\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\ntr.header-row-secondary.description {\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.free {\n  background: rgb(20, 110, 68);\n}\n\n.low {\n  background: rgb(31, 95, 224);\n}\n\n.medium {\n  background: rgb(148, 38, 19);\n}\n\n.high {\n  background: #ae862e;\n}\n\n.highlight {\n  font-weight: 600;\n}\n\n.cost-tag {\n  font-weight: 400;\n  font-size: 1.7rem !important;\n}\n\n.spaced {\n  letter-spacing: 0.2rem;\n}\n.text-left{\n  justify-content: flex-start;\n}\n\n.text-right{\n  justify-content: flex-end;\n}\n\n.text-center{\n  justify-content: center;\n  align-items: center;\n}\n\n.text-italic {\n  font-style: italic;\n}\n\n.tab {\n  margin-left: 20px;\n}\n\n.sales-btn {\n  background-color: var(--color-primary-400);\n  border-radius: 6px;\n  width: 300px;\n  height: 50px;\n  font-size: 16px;\n  margin: 12px 0 36px;\n\n  &:hover {\n    background-color: var(--color-primary-300);\n  }\n}\n\n.slider-pricing {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  width: 100%;\n  .container {\n    padding: 20px;\n    margin: 20px 20px;\n    background: rgba(17, 17, 17, 0.075);\n    border-radius: 16px;\n    box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);\n    backdrop-filter: blur(1px);\n    -webkit-backdrop-filter: blur(1px);\n    border: 1px solid rgba(255, 255, 255, 0.3);\n  }\n}\n\n.slider-card{\n  display: flex;\n  flex-direction: column;\n  text-align: left;\n  width: 45%;\n\n  .slider-title {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n\n    &__text {\n      display: flex;\n      flex-direction: column;\n    }\n  }\n\n  .slider-box-input {\n    width: 120px;\n  }\n\n  .item {\n    font-size: 1.2rem;\n    font-weight: 600;\n  }\n\n  .subtitle {\n    padding-bottom: 10px;\n    font-size: 0.9rem;\n  }\n}\n\n.total-price-card{\n  display: flex;\n  flex-direction: column;\n  text-align: left;\n  padding-top: 20px !important;\n  width: 25%;\n\n  button {\n    width: 100%;\n  }\n}\n\n.item {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    margin-bottom: 10px;\n  }\n\n  .label {\n    padding-top: 5px;\n    font-size: 1.1rem;\n    font-weight: 600;\n  }\n  .price {\n    padding-top: 5px;\n    font-size: 1.2rem;\n    font-weight: 500;\n  }\n\n.unit {\n    font-size: 0.9rem !important;\n    font-weight: 500 !important;\n  }\n\n:deep() {\n\n.range-slidercontainer {\n  width: 100%;\n}\n\n.range-slider input[type='range'] {\n  background: var(--color-white-500) !important;\n}\n.range-slider input[type='range']::-webkit-slider-thumb {\n  background-color: rgb(31, 164, 221)  !important;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-thumb {\n  background-color: rgb(31, 164, 221) !important;\n}\n.range-slider input[type='range']::-webkit-slider-runnable-track {\n  background: var(--color-white-500) !important;\n}\n\n.range-slider .range-slider-left {\n  background: rgb(31, 164, 221)  !important;\n}\n}\n</style>\n","<template>\n  <div ref=\"sliderContainer\" class=\"range-slidercontainer\">\n    <div class=\"range-slider\">\n      <div ref=\"right\" class=\"range-slider-left\" />\n      <input\n        ref=\"singleSlider\"\n        v-model=\"localValue\"\n        type=\"range\"\n        :step=\"step\"\n        :min=\"min\"\n        :max=\"max\"\n        :disabled=\"disabled\"\n        @input=\"handleSliderInput\"\n      >\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SingleSlider',\n  props: {\n    step: {\n      type: Number,\n      default: 1,\n    },\n    min: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 1,\n    },\n    sliderValue: {\n      type: Number,\n      default: 0,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'input', 'update:sliderValue',\n  ],\n  data() {\n    return {\n      localValue: 0,\n      resizeObserver: null,\n    };\n  },\n  watch: {\n    sliderValue(newVal) {\n      this.localValue = newVal;\n      this.refresh();\n    },\n  },\n  beforeMount() {\n    this.localValue = this.sliderValue;\n  },\n  mounted() {\n    this.refresh();\n    window.addEventListener(\"resize\", () => this.refresh());\n  },\n  beforeUnmount() {\n    window.removeEventListener(\"resize\", () => this.refresh());\n  },\n  methods: {\n    refresh() {\n      const thumbHalfWidth = 10;\n      const value = this.localValue;\n      const minValue = this.min;\n      const maxValue = this.max;\n      const totalInputWidth = this.$refs.singleSlider.clientWidth;\n      const width = (((value - minValue) / (maxValue - minValue)) * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth));\n      const maxWidth = totalInputWidth - thumbHalfWidth;\n      if (value > maxValue) {\n        this.$refs.right.style.width = `${maxWidth}px`;\n      } else {\n        this.$refs.right.style.width = `${width + thumbHalfWidth}px`;\n      }\n      this.$emit('input');\n      this.$emit('update:sliderValue', this.localValue);\n    },\n    handleSliderInput(event) {\n      const thumbHalfWidth = 10;\n      const value = event.target.value;\n      const minValue = this.min;\n      const maxValue = this.max;\n      const totalInputWidth = this.$refs.singleSlider.clientWidth;\n      const width = (((value - minValue) / (maxValue - minValue)) * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth));\n      const maxWidth = totalInputWidth - thumbHalfWidth;\n\n      if (value > maxValue) {\n        this.$refs.right.style.width = `${maxWidth}px`;\n      } else {\n        this.$refs.right.style.width = `${width + thumbHalfWidth}px`;\n      }\n      this.$emit('input');\n      this.$emit('update:sliderValue', Number(event.target.value));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.range-slidercontainer {\n  width: 100%;\n}\n\n.range-slider {\n  position: relative;\n  margin: 0;\n  height: 25px;\n}\n\n.range-slider input[type='range'] {\n  -webkit-appearance: none;\n  pointer-events: none;\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  left: 0;\n  top: 10px;\n  height: 5px;\n  width: 100%;\n  border-radius: 14px;\n  @include themify {\n    background: themed('range-slider-unselected-color');\n  }\n}\n.range-slider input[type='range']:focus, .range-slider input[type='range']:active {\n  outline: none;\n}\n.range-slider input[type='range']::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  box-sizing: content-box;\n  width: 20px;\n  height: 20px;\n  border: none;\n  pointer-events: auto;\n  border-radius: 14px;\n  @include themify {\n    background-color: themed('range-slider-thumb-color');\n  }\n  cursor: pointer;\n  position: relative;\n  z-index: 3;\n  top: -7.5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-thumb {\n  pointer-events: none;\n  @include themify {\n    background-color: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']::-webkit-slider-runnable-track {\n  -webkit-appearance: none;\n  @include themify {\n    background: themed('range-slider-unselected-color');\n  }\n  height: 5px;\n  border-radius: 2.5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-runnable-track {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n.range-slider .range-slider-value {\n  color: white;\n  position: relative;\n  width: 60px;\n  display:flex;\n  z-index: 3;\n  top: 25px;\n  left: -22px;\n  span {\n    width: 100%;\n    text-align: center;\n    font-size: 0.9;\n  }\n}\n\n.range-slider .range-slider-left {\n  height: 5px;\n  width: 0;\n  @include themify {\n    background: themed('range-slider-selected-color');\n  }\n  position: absolute;\n  top: 10px;\n  border-radius: 2.5px;\n  z-index: 2;\n}\n@-moz-document url-prefix() {\n  .range-slider .range-slider-track-background {\n    display: block;\n    height: 5px;\n    width: 100%;\n    @include themify {\n      background: themed('range-slider-unselected-color');\n    }\n    position: absolute;\n    border-radius: 2.5px;\n    top: 10px;\n    z-index: 0;\n  }\n  .range-slider .range-slider-left {\n    height: 5px;\n    width: 20px;\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    position: absolute;\n    border-radius: 2.5px;\n    top: 10px;\n    z-index: 0;\n  }\n}\n\n</style>\n","import { render } from \"./SingleSliderWithTwoColors.vue?vue&type=template&id=05fcc218&scoped=true\"\nimport script from \"./SingleSliderWithTwoColors.vue?vue&type=script&lang=js\"\nexport * from \"./SingleSliderWithTwoColors.vue?vue&type=script&lang=js\"\n\nimport \"./SingleSliderWithTwoColors.vue?vue&type=style&index=0&id=05fcc218&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-05fcc218\"]])\n\nexport default __exports__","import { render } from \"./PriceTable.vue?vue&type=template&id=512d6925&scoped=true\"\nimport script from \"./PriceTable.vue?vue&type=script&lang=js\"\nexport * from \"./PriceTable.vue?vue&type=script&lang=js\"\n\nimport \"./PriceTable.vue?vue&type=style&index=0&id=512d6925&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-512d6925\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <div\n    v-if=\"localShow\"\n    ref=\"modal\"\n    class=\"backdrop\"\n    :style=\"{ 'z-index': zIndex }\"\n    tabindex=\"-1\"\n    @mousedown=\"mousedown\"\n    @mouseup=\"mouseup\"\n    @keyup.esc=\"handleEscapeKey\"\n  >\n    <div\n      class=\"modal\"\n      :class=\"{'full-screen': fullScreen, pop: isPopping}\"\n      :style=\"{ width: width, height: height }\"\n      @click.stop=\"\"\n    >\n      <div class=\"modal-header\">\n        <slot name=\"modal-header-prepend\" />\n        <h2 v-if=\"title\" :title=\"title\" class=\"mt-0 mb-0\">{{ title }}</h2>\n        <slot v-else name=\"modal-header-title-description\" />\n        <slot name=\"modal-header\" />\n        <IconButton\n          class=\"close-modal-btn\"\n          :icon=\"'close'\"\n          :width=\"28\"\n          :height=\"28\"\n          @click=\"closeModal\"\n        />\n      </div>\n      <div class=\"modal-container scrollbar\">\n        <div class=\"modal-main\">\n          <slot name=\"modal-main\" />\n        </div>\n      </div>\n      <div class=\"modal-footer\">\n        <slot name=\"modal-footer\" />\n        <slot name=\"modal-actions\" class=\"modal-actions\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport { useFocusTrap } from '@vueuse/integrations/useFocusTrap';\nimport { ref } from 'vue';\n\nexport default {\n  name: 'Modal',\n  components: {\n    IconButton,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: false,\n    },\n    title: {\n      type: String,\n      default: null,\n    },\n    isPluginModal: {\n      type: Boolean,\n      default: false,\n    },\n    width: {\n      type: String,\n      default: undefined,\n    },\n    height: {\n      type: String,\n      default: undefined,\n    },\n    padding: {\n      type: String,\n      default: '20px',\n    },\n    fullScreen: {\n      type: Boolean,\n      default: false,\n    },\n    closeWithEscapeKey: {\n      type: Boolean,\n      default: true,\n    },\n    zIndex: {\n      type: Number,\n      default: null,\n    },\n    persistent: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: ['update:show', 'opened', 'closed'],\n  setup() {\n    const modal = ref(null);\n    const { activate: activateFocusTrap, deactivate: deactivateFocusTrap } = useFocusTrap(modal, { immediate: false, allowOutsideClick: true });\n\n    return {\n      modal,\n      activateFocusTrap,\n      deactivateFocusTrap,\n    };\n  },\n  data() {\n    return {\n      localShow: false,\n      mousedownOnBackdrop: false,\n      isPopping: false,\n    };\n  },\n  watch: {\n    show(shouldShow) {\n      if (shouldShow && !this.localShow) {\n        this.localShow = true;\n      }\n    },\n    localShow(isShown) {\n      if (isShown) {\n        this.$nextTick(() => {\n          this.activateFocusTrap();\n          this.modal.focus();\n        });\n      } else {\n        this.$nextTick(() => {\n          this.deactivateFocusTrap();\n        });\n      }\n      this.$emit('update:show', isShown);\n    },\n  },\n  mounted() {\n    if (this.show && !this.localShow) {\n      this.localShow = true;\n    }\n  },\n  methods: {\n    showModal() {\n      this.localShow = true;\n      this.$emit('opened');\n      this.$nextTick(() => {\n        this.$refs.modal.focus();\n      });\n    },\n    focus() {\n      this.$nextTick(() => {\n        this.$refs.modal.focus();\n      });\n    },\n    closeModal() {\n      this.localShow = false;\n      this.$emit('closed');\n    },\n    handleEscapeKey() {\n      if (this.closeWithEscapeKey) {\n        this.closeModal();\n      }\n    },\n    mousedown(e) {\n      this.mousedownOnBackdrop = Boolean(e.srcElement === this.$refs.modal);\n    },\n    mouseup(e) {\n      // Prevents drag originating from the modal to the backdrop from closing it\n      const isDescendantOfModal = this.$refs.modal.contains(e.target);\n      if (isDescendantOfModal && this.mousedownOnBackdrop) {\n        if (this.persistent) {\n          this.startPopAnimation();\n        } else {\n          this.closeModal();\n        }\n      }\n      this.mousedownOnBackdrop = false;\n    },\n    startPopAnimation() {\n      this.isPopping = true;\n      setTimeout(() => {\n        this.isPopping = false;\n      }, 150); // Stop the wiggle after 1 second\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n$mainPadding: 24px;\n$mainPaddingMobile: 16px;\n\n.backdrop {\n  position: fixed;\n  top: 0px;\n  bottom: 0px;\n  left: 0px;\n  right: 0px;\n  width: 100%;\n  height: 100%;\n  background: rgba(0, 0, 0, 0.625);\n  outline: none;\n  z-index: 1000;\n}\n\n.modal {\n  display: flex;\n  flex-direction: column;\n  position: fixed;\n  top: 0px;\n  bottom: 0px;\n  left: 0px;\n  right: 0px;\n  max-height: calc((100% - 6px) - 2em);\n  width: min-content;\n  height: min-content;\n  overflow: hidden;\n\n  color: black;\n  text-align: center;\n  margin: auto;\n  border: none;\n  padding: 0;\n  border-radius: 6px;\n  box-shadow: 0 0 35px rgba(0,0,0,0.1), 0 0 10px rgba(0,0,0,0.25);\n  max-width: calc((100% - 6px) - 2em);\n  z-index: 500;\n  cursor: default;\n  @include themify() {\n    background-color: themed('modal-background');\n  }\n\n  &.full-screen {\n    max-width: 100vw;\n    max-height: 100vh;\n    width: 100%;\n    height: 100%;\n    border-radius: 0;\n  }\n}\n\n.modal-container {\n  display: flex;\n  justify-content: space-between;\n  flex-flow: column;\n  height: 100%;\n  width: 100%;\n  overflow: hidden;\n}\n\n.modal-header {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  gap: 24px;\n  padding: 8px 16px;\n  border-radius: 6px 6px 0 0;\n  border-bottom: 1px solid grey;\n  @include themify() {\n    background: linear-gradient(45deg, themed('color-primary-600') 0%, themed('color-primary') 100%);\n    color: themed('modal-header-text-color');\n  }\n}\n\n.modal-header h2:first-of-type {\n  text-align: left;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  min-width: 100px;\n  overflow: hidden;\n  flex: 1 1 fit-content;\n  max-width: fit-content;\n  font-size: 1.5rem !important;\n}\n\n.close-modal-btn {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: none;\n  border: none;\n  border-radius: 4px;\n  margin-left: auto;\n  cursor: pointer;\n}\n\n.close-modal-btn:hover {\n  background: rgba(128, 128, 128, 0.25);\n}\n\n.modal-main {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 100%;\n  overflow: hidden;\n  position: relative;\n}\n\n@media (max-width: $breakpoint-sm) {\n  .modal {\n    width: 100% !important;\n    height: 100% !important;\n    max-width: 100%;\n    max-height: 100%;\n    margin: 0;\n  }\n\n  .modal-container {\n    padding: 0 0 0 16px;\n      margin: 16px 0;\n  }\n\n  .modal-header {\n    padding: 16px;\n  }\n}\n\n.pop {\n  animation: pop 0.15s ease-in-out;\n}\n@keyframes pop {\n  50%  {transform: scale(1.005);}\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <button\n    class=\"icon-button\"\n    :disabled=\"disabled\"\n    :class=\"{ 'active': active, [type]: type,\n              'icon-button-hover': hoverStyle && showHover,\n              'icon-button-active': showActive,\n              'icon-button-disabled': disabled }\"\n    :style=\"btnStyles\"\n    @click.stop=\"handleButtonClick\"\n    @mousedown.prevent=\"\"\n  >\n    <SVGIcon\n      :mirrored=\"mirrored\"\n      :width=\"'100%'\"\n      :height=\"'100%'\"\n      :iconName=\"currIcon\"\n      :iconColor=\"iconColor\"\n    />\n  </button>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'IconButton',\n  components: {\n    SVGIcon,\n  },\n  props: {\n    modelValue: {\n      type: Boolean,\n      default: false,\n    },\n    icon: {\n      type: String,\n      default: '',\n    },\n    iconActive: {\n      type: String,\n      default: '',\n    },\n    iconColor: {\n      type: String,\n      default: 'currentColor',\n    },\n    type: {\n      type: String,\n      default: 'toggle',\n    },\n    width: {\n      type: [Number, String],\n      default: null,\n    },\n    height: {\n      type: [Number, String],\n      default: null,\n    },\n    showHover: {\n      type: Boolean,\n      default: true,\n    },\n    showActive: {\n      type: Boolean,\n      default: true,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    notifications: {\n      type: Number,\n      default: 0,\n    },\n    allowClick: {\n      type: Boolean,\n      default: true,\n    },\n    mirrored: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: ['update:modelValue', 'change'],\n  data() {\n    return {\n      active: false,\n    };\n  },\n  computed: {\n    hoverStyle() {\n      return this.type !== 'tooltip-hover';\n    },\n    currIcon() {\n      if (this.active && this.type === 'toggle-icon') {\n        return this.iconActive;\n      }\n      return this.icon;\n    },\n    btnStyles() {\n      let width = this.width;\n      let height = this.height;\n      if (typeof this.width === 'number') {\n        width = `${width}px`;\n      }\n      if (typeof this.height === 'number') {\n        height = `${height}px`;\n      }\n      return {\n        width,\n        height,\n        'min-width': width,\n        'min-height': height,\n      };\n    },\n  },\n  watch: {\n    modelValue: {\n      immediate: true,\n      handler(val) {\n        this.active = val;\n        this.$emit('change', val);\n      },\n    },\n    active() {\n      this.$emit('update:modelValue', this.active);\n    },\n  },\n  methods: {\n    handleButtonClick() {\n      if (this.allowClick) {\n        if (this.type === 'toggle' || this.type === 'toggle-color' || this.type === 'toggle-icon') { this.active = !this.active; this.$emit('change', this.active); }\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.icon-button {\n  background-color: transparent;\n  color: inherit;\n  border: none;\n  background-size: contain;\n  padding: 0;\n  vertical-align: middle;\n  box-shadow: none;\n  font-size: 12px;\n  position: relative;\n  cursor: pointer;\n}\n\n.icon-button.icon-button-hover:hover,\n.icon-button.icon-button-hover:focus-visible {\n  @include themify() {\n    background-color: themed('icon-hover-color');\n    border-radius: 100%;\n    box-shadow: 0 0 0 4px themed('icon-hover-color');\n  }\n}\n\n.icon-button.icon-button-active.active {\n  @include themify() {\n    color: themed('icon-color-primary');\n    border-radius: 100%;\n  }\n}\n\n.icon-button.icon-button-active.active:not(.toggle-icon) {\n  @include themify() {\n    background-color: themed('icon-hover-color');\n    box-shadow: 0 0 0 4px themed('icon-hover-color');\n  }\n}\n\n.icon-button.icon-button-disabled {\n    color: $color-auzone-disabled !important;\n    cursor:not-allowed;\n}\n\n</style>\n","import { render } from \"./IconButton.vue?vue&type=template&id=ec35751e&scoped=true\"\nimport script from \"./IconButton.vue?vue&type=script&lang=js\"\nexport * from \"./IconButton.vue?vue&type=script&lang=js\"\n\nimport \"./IconButton.vue?vue&type=style&index=0&id=ec35751e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ec35751e\"]])\n\nexport default __exports__","import { render } from \"./Modal.vue?vue&type=template&id=ed69fc3c&scoped=true\"\nimport script from \"./Modal.vue?vue&type=script&lang=js\"\nexport * from \"./Modal.vue?vue&type=script&lang=js\"\n\nimport \"./Modal.vue?vue&type=style&index=0&id=ed69fc3c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ed69fc3c\"]])\n\nexport default __exports__","import { render } from \"./PricingModal.vue?vue&type=template&id=59840c57&scoped=true\"\nimport script from \"./PricingModal.vue?vue&type=script&lang=js\"\nexport * from \"./PricingModal.vue?vue&type=script&lang=js\"\n\nimport \"./PricingModal.vue?vue&type=style&index=0&id=59840c57&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-59840c57\"]])\n\nexport default __exports__","<template>\n  <button class=\"user-circle\" :style=\"sizeStyle\" :title=\"user.first_name + ' ' + user.last_name\">\n    <template v-if=\"user\">\n      <img :src=\"imageUrl\">\n    </template>\n    <!-- <template v-else>\n      <div :style=\"fontStyle\" :title=\"user.first_name + ' ' + user.last_name\">\n        {{ formatInitials() }}\n      </div>\n    </template> -->\n  </button>\n</template>\n\n<script setup>\nimport {\n  toRefs, computed,\n} from 'vue';\n\nconst props = defineProps({\n  user: {\n    type: Object,\n    default: () => {},\n  },\n  size: {\n    type: [Number, String],\n    default: null,\n  },\n});\n\nconst {\n  user,\n  size,\n} = toRefs(props);\n\nconst imageUrl = computed(() => `avatar/${user.value.username}`);\n\nconst sizeStyle = computed(() => {\n  let w = size.value;\n  let h = size.value;\n  if (typeof size.value === 'number') {\n    w = `${w}px`;\n  }\n  if (typeof size.value === 'number') {\n    h = `${h}px`;\n  }\n\n  return {\n    width: w,\n    'max-width': w,\n    height: h,\n    'max-height': h,\n  };\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n.user-circle {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border: none;\n  border-radius: 50%;\n  color: inherit;\n  text-transform: uppercase;\n\n  img {\n    max-width: inherit;\n    max-height: inherit;\n  }\n}\n</style>\n","import script from \"./UserIcon.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./UserIcon.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./UserIcon.vue?vue&type=style&index=0&id=c454ca16&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-c454ca16\"]])\n\nexport default __exports__","import { render } from \"./UserMenu.vue?vue&type=template&id=33cd6242&scoped=true\"\nimport script from \"./UserMenu.vue?vue&type=script&lang=js\"\nexport * from \"./UserMenu.vue?vue&type=script&lang=js\"\n\nimport \"./UserMenu.vue?vue&type=style&index=0&id=33cd6242&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-33cd6242\"]])\n\nexport default __exports__","<template>\n  <BaseMenu\n    :placement=\"'bottom'\"\n    :offset=\"[0,0]\"\n    :appendToBody=\"true\"\n  >\n    <button class=\"help-button\">\n      <SVGIcon\n        :height=\"'32px'\"\n        :width=\"'32px'\"\n        :iconName=\"'help'\"\n        :showHover=\"false\"\n        :showActive=\"true\"\n      />\n    </button>\n    <template #menu=\"{closeMenu}\">\n      <div class=\"help-menu\">\n        <ul>\n          <li>\n            <BaseMenuButton @click=\"closeMenu(), open('https://help.dveml.com')\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'chat'\"\n              />\n              <span>\n                Help Center\n              </span>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton @click=\"closeMenu(), openFeedbackModal()\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'feedback'\"\n              />\n              <span>\n                Feedback\n              </span>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton @click=\"closeMenu(), open('https://help.dveml.com/releases/releases/')\">\n              <SVGIcon\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n                :iconName=\"'description'\"\n              />\n              <span>\n                Release Notes\n              </span>\n            </BaseMenuButton>\n          </li>\n          <!-- NOT SURE WHY THE WINDOWS DOWNLOAD SHOWS VIRUS-->\n          <!-- <li>\n            <a href=\"/downloader-zip/downloader_windows.zip\" download=\"downloader_windows.zip\">\n              <div class=\"li-row\">\n                <BaseMenuButton @click=\"closeMenu()\">\n                  <SVGIcon\n                    :width=\"'24px'\"\n                    :height=\"'24px'\"\n                    :iconName=\"'windows_os'\"\n                  />\n                  <div class=\"li-text\">\n                    <div class=\"li-text__title\">Image Downloader Tool</div>\n                    <div class=\"li-text__description\">Install for Windows</div>\n                  </div>\n                </BaseMenuButton>\n              </div>\n            </a>\n          </li> -->\n          <!-- <li>\n            <a href=\"/downloader-zip/downloader_linux.zip\" download=\"downloader_linux.zip\">\n              <div class=\"li-row\">\n                <BaseMenuButton @click=\"closeMenu()\">\n                  <SVGIcon\n                    :width=\"'24px'\"\n                    :height=\"'24px'\"\n                    :iconName=\"'linux_os'\"\n                  />\n                  <div class=\"li-text\">\n                    <div class=\"li-text__title\">Image Downloader Tool</div>\n                    <div class=\"li-text__description\">Install for Linux</div>\n                  </div>\n                </BaseMenuButton>\n              </div>\n            </a>\n          </li>\n          <li>\n            <a href=\"/downloader-zip/downloader_python.zip\" download=\"downloader_python.zip\">\n              <div class=\"li-row\">\n                <BaseMenuButton @click=\"closeMenu()\">\n                  <SVGIcon\n                    :width=\"'24px'\"\n                    :height=\"'24px'\"\n                    :iconName=\"'python'\"\n                  />\n                  <div class=\"li-text\">\n                    <div class=\"li-text__title\">Image Downloader Tool</div>\n                    <div class=\"li-text__description\">Python Script</div>\n                  </div>\n                </BaseMenuButton>\n              </div>\n            </a>\n          </li> -->\n          <hr>\n          <li>\n            <span class=\"version-text\">Version: {{ version }} - {{ frontendVersion }}</span>\n          </li>\n        </ul>\n      </div>\n    </template>\n  </BaseMenu>\n  <FeedbackModal ref=\"feedbackModal\" />\n</template>\n\n<script>\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport FeedbackModal from '@/components/FeedbackModal.vue';\n\nexport default {\n  name: 'HelpMenu',\n  components: {\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    FeedbackModal,\n  },\n  computed: {\n    version() {\n      return this.$store.state.appVersion.version;\n    },\n    frontendVersion() {\n      return this.$store.state.appVersion.frontendVersion;\n    },\n  },\n  methods: {\n    open(page) {\n      window.open(page);\n    },\n    openFeedbackModal() {\n      this.$refs.feedbackModal.showModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.help-button {\n  display: flex;\n  flex: 0 0 auto;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n  padding: 0 4px;\n  background: none;\n  border: none;\n  cursor: pointer;\n  @include themify() {\n    color: themed('header-dot-menu');\n  }\n\n  &:hover {\n    @include themify() {\n      background: themed('header-button-background-hover');\n      color: themed('header-button-color-hover');\n    }\n  }\n\n  &._active {\n    @include themify() {\n      background: themed('header-button-background-hover');\n      color: themed('header-button-color-hover');\n    }\n  }\n}\n\n.help-menu:deep {\n  width: 240px;\n  .switch {\n    margin-left: auto;\n  }\n\n  a {\n    color: inherit;\n    text-decoration: none;\n  }\n\n  a > span {\n    font: inherit;\n    font-size: 1rem;\n    font-weight: 600;\n    margin-left: 12px;\n    white-space: nowrap;\n  }\n}\n\n.version-text {\n  display: block;\n  width: inherit;\n  align-items: center;\n  padding: 4px 4px;\n  text-align: left;\n  font: inherit;\n  font-size: 0.7rem;\n  font-weight: 600;\n  color: rgba(92, 91, 91, 0.5);\n  word-wrap: break-word;\n}\n\n.li-row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n.li-text {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n\n  &__title{\n    display: flex;\n    font-size: 1rem;\n    font-weight: 600;\n    margin-left: 12px;\n  }\n\n  &__description{\n    display: flex;\n    font-size: 0.8rem;\n    font-weight: 600;\n    margin-left: 12px;\n    margin-top: 5px;\n    @include themify() {\n      color: rgba(61, 60, 60, 0.5);\n    }\n  }\n}\n\n</style>\n","<template>\n  <Modal\n    ref=\"feedbackModal\"\n    :title=\"'Send a Request'\"\n    @closed=\"clearData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mb-3\">\n          <div class=\"col-6 settings__control-group\">\n            <label class=\"required\">Issue Type</label>\n            <select v-model=\"type\" class=\"select\" required>\n              <option disabled :value=\"null\">Select issue type</option>\n              <option :value=\"'Feature Request'\">Feature Request</option>\n              <option :value=\"'Bug Report'\">Bug Report</option>\n              <option :value=\"'Other Feedback'\">Other Feedback</option>\n            </select>\n          </div>\n        </div>\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Subject</label>\n            <input\n              v-model=\"subject\"\n              placeholder=\"Add a subject\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Body</label>\n            <textarea\n              v-model=\"body\"\n              class=\"select feedback-body\"\n              placeholder=\"Description of your feedback.\"\n              rows=\"10\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result\" :class=\"[success ? 'success' : 'error']\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button class=\"button button-sm\" @click=\"send\">{{ 'Send' }}</button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'FeedbackModal',\n  components: {\n    Modal,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(),\n      type: null,\n      subject: '',\n      body: '',\n      message: '',\n      success: false,\n    };\n  },\n  methods: {\n    showModal() {\n      this.$refs.feedbackModal.showModal();\n    },\n    clearData() {\n      this.type = null;\n      this.subject = \"\";\n      this.body = \"\";\n      this.message = \"\";\n      this.success = false;\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.feedbackModal.closeModal();\n    },\n    send() {\n      if (!this.type || this.type === '') {\n        this.message = \"Missing issue type\";\n        this.success = false;\n        return;\n      }\n      if (!this.body || this.body === '') {\n        this.message = \"Missing issue body\";\n        this.success = false;\n        return;\n      }\n\n      this.dataConnect.sendFeedback({\n        issue_type: this.type,\n        subject: this.subject,\n        body: this.body,\n      }).then((response) => {\n        if (response.error) {\n          this.message = response.error;\n          this.success = false;\n        } else {\n          this.message = response.result;\n          this.success = true;\n        }\n      }).catch((e) => console.log(e));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 550px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.feedback-body {\n  height: 150px;\n  min-height: 150px;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.success {\n  @include themify() {\n    background: rgba(115, 206, 115, 0.5) ;\n    color: themed('color-success');\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n</style>\n","import { render } from \"./FeedbackModal.vue?vue&type=template&id=19220ba6&scoped=true\"\nimport script from \"./FeedbackModal.vue?vue&type=script&lang=js\"\nexport * from \"./FeedbackModal.vue?vue&type=script&lang=js\"\n\nimport \"./FeedbackModal.vue?vue&type=style&index=0&id=19220ba6&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-19220ba6\"]])\n\nexport default __exports__","import { render } from \"./HelpMenu.vue?vue&type=template&id=79f76bc4&scoped=true\"\nimport script from \"./HelpMenu.vue?vue&type=script&lang=js\"\nexport * from \"./HelpMenu.vue?vue&type=script&lang=js\"\n\nimport \"./HelpMenu.vue?vue&type=style&index=0&id=79f76bc4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-79f76bc4\"]])\n\nexport default __exports__","<template>\n  <BaseMenu\n    :placement=\"'bottom'\"\n    :offset=\"[0,0]\"\n    :appendToBody=\"true\"\n  >\n    <button class=\"module-button\">\n      <SVGIcon\n        :height=\"'32px'\"\n        :width=\"'32px'\"\n        :iconName=\"'apps'\"\n        :showHover=\"false\"\n        :showActive=\"true\"\n      />\n    </button>\n    <template #menu=\"{closeMenu}\">\n      <div class=\"module-menu\">\n        <ul>\n          <li>\n            <BaseMenuButton\n              @click=\"Project(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'folder2'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Projects</div>\n                  <div class=\"li-text__description\">Manage projects</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Dataset(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'database2'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Datasets</div>\n                  <div class=\"li-text__description\">Curate, upload, and share datasets</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Trainer(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'train'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Trainer</div>\n                  <div class=\"li-text__description\">Train models</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Validator(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'compare'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Validate Sessions</div>\n                  <div class=\"li-text__description\">Compare model outputs</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Automation(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'auto_annotate'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Automation</div>\n                  <div class=\"li-text__description\">AI assisted annotation & segmentation</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Tasks(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'kanban'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Edit/Audit Annotations</div>\n                  <div class=\"li-text__description\">Manage labelling, audit, and more</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Servers(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'cloud_servers'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Cloud Instances</div>\n                  <div class=\"li-text__description\">Virtual Servers for Automated Tasks</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n          <li>\n            <BaseMenuButton\n              @click=\"Snapshots(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'database_sync'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Data Snapshots</div>\n                  <div class=\"li-text__description\">Save and Restore Data from Snapshots</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n        </ul>\n        <hr>\n        <ul>\n          <li>\n            <BaseMenuButton\n              @click=\"RecycleBin(), closeMenu()\"\n            >\n              <div class=\"li-row\">\n                <SVGIcon\n                  :width=\"'28px'\"\n                  :height=\"'28px'\"\n                  :iconName=\"'trash'\"\n                />\n                <div class=\"li-text\">\n                  <div class=\"li-text__title\">Recycle Bin</div>\n                  <div class=\"li-text__description\">Manage removed items</div>\n                </div>\n              </div>\n            </BaseMenuButton>\n          </li>\n        </ul>\n      </div>\n    </template>\n  </BaseMenu>\n</template>\n\n<script>\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\n\nexport default {\n  name: 'ModuleMenuV2',\n  components: {\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n  },\n  computed: {\n    isSaas() {\n      return this.$store.state.appVersion.isSaas;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n  },\n  methods: {\n    goto(route) {\n      this.$router.push({ path: route });\n    },\n    Trainer() {\n      if (this.currentProject) {\n        this.goto('/trainer');\n      }\n    },\n    Project() {\n      this.goto('/projects');\n    },\n    Dataset() {\n      if (this.currentProject) {\n        this.goto('/datasets');\n      }\n    },\n    Automation() {\n      this.goto('/automation');\n    },\n    Validator() {\n      this.goto('/validator');\n    },\n    Tasks() {\n      this.goto('/taskboard');\n    },\n    Servers() {\n      this.goto('/servers');\n    },\n    RecycleBin() {\n      this.goto('/recycle');\n    },\n    Snapshots() {\n      this.goto('/snapshots');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.module-button {\n  display: flex;\n  flex: 0 0 auto;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n  padding: 0 4px;\n  background: none;\n  border: none;\n  cursor: pointer;\n  @include themify() {\n    color: themed('header-dot-menu');\n  }\n\n  &:hover {\n    @include themify() {\n      background: themed('header-button-background-hover');\n      color: themed('header-button-color-hover');\n    }\n  }\n\n  &._active {\n    @include themify() {\n      background: themed('header-button-background-hover');\n      color: themed('header-button-color-hover');\n    }\n  }\n}\n\n.li-row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n.li-text {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n\n  &__title{\n    display: flex;\n    font-size: 1rem;\n    font-weight: 600;\n    margin-left: 12px;\n  }\n\n  &__description{\n    display: flex;\n    font-size: 0.8rem;\n    font-weight: 600;\n    margin-left: 12px;\n    margin-top: 5px;\n    text-align: left;\n    @include themify() {\n      color: rgba(61, 60, 60, 0.5);\n    }\n  }\n}\n.module-menu {\n  width: 290px;\n}\n</style>\n","import { render } from \"./ModuleMenuV2.vue?vue&type=template&id=fd3f8190&scoped=true\"\nimport script from \"./ModuleMenuV2.vue?vue&type=script&lang=js\"\nexport * from \"./ModuleMenuV2.vue?vue&type=script&lang=js\"\n\nimport \"./ModuleMenuV2.vue?vue&type=style&index=0&id=fd3f8190&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-fd3f8190\"]])\n\nexport default __exports__","<template>\n  <BaseMenu\n    v-if=\"notificationCounter > 0\"\n    :placement=\"'bottom'\"\n    :offset=\"[0,0]\"\n    :appendToBody=\"true\"\n  >\n    <button class=\"warning-button\">\n      <div v-if=\"notificationCounter > 0\" class=\"icon-badge\">\n        <span>{{ notificationCounter }}</span>\n      </div>\n      <SVGIcon\n        :height=\"'32px'\"\n        :width=\"'32px'\"\n        :iconName=\"'warning'\"\n        :showHover=\"false\"\n        :showActive=\"true\"\n      />\n    </button>\n    <template #menu>\n      <div class=\"help-menu\">\n        <ul>\n          <li\n            v-for=\"notif in notifications\"\n            :key=\"notif.id\"\n            class=\"notification\"\n            :class=\"{ 'warning': notif.key.includes('warning') }\"\n          >\n            {{ notif.value }}\n          </li>\n        </ul>\n      </div>\n    </template>\n  </BaseMenu>\n</template>\n\n<script>\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'WarningMenu',\n  components: {\n    SVGIcon,\n    BaseMenu,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      notifications: [],\n    };\n  },\n  computed: {\n    refreshTrigger() {\n      return this.$store.state.notifications.hasNotifications;\n    },\n    notificationCounter() {\n      return this.notifications.length;\n    },\n  },\n  watch: {\n    refreshTrigger: {\n      immediate: true,\n      handler(shouldRefresh) {\n        if (shouldRefresh) {\n          this.getNotifications();\n          this.$store.commit('notifications/updateNotifications', false);\n        }\n      },\n    },\n  },\n  mounted() {\n    this.getNotifications();\n  },\n  methods: {\n    async getNotifications() {\n      await this.dsConn.listWarnings()\n        .then((data) => {\n          if (data.result) {\n            this.notifications = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.icon-badge {\n  background-color: red;\n  padding: 1px;\n  font-size: 11px;\n  color: white;\n  text-align: center;\n  width: -moz-fit-content;\n  width: fit-content;\n  height: -moz-fit-content;\n  height: fit-content;\n  border-radius: 40%;\n  position: absolute;\n  top: 5%;\n  right: -5%;\n  z-index: 100;\n  display: flex;\n  flex-direction: column;\n\n  span {\n    padding: 0 4px 0 4px;\n\n  }\n}\n\n.warning-button {\n  display: flex;\n  position: relative;\n  flex: 0 0 auto;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n  padding: 0 4px;\n  background: none;\n  border: none;\n  cursor: pointer;\n  @include themify() {\n    color: themed('header-dot-menu');\n  }\n\n  &:hover {\n    @include themify() {\n      background: themed('header-button-background-hover');\n      color: themed('header-button-color-hover');\n    }\n  }\n\n  &._active {\n    @include themify() {\n      background: themed('header-button-background-hover');\n      color: themed('header-button-color-hover');\n    }\n  }\n}\n\n.help-menu:deep {\n  min-width: 450px;\n  .switch {\n    margin-left: auto;\n  }\n\n  a {\n    color: inherit;\n    text-decoration: none;\n  }\n\n  a > span {\n    font: inherit;\n    font-size: 1rem;\n    font-weight: 600;\n    margin-left: 12px;\n    white-space: nowrap;\n  }\n}\n\n.notification {\n  font-size: 0.9;\n  padding: 5px;\n  border-radius: 8px;\n  width: fit-content;\n}\n.notification +.notification {\n  margin-top: 10px;\n}\n\n.warning {\n  font-size: 0.9;\n  @include themify() {\n    background: rgba(198, 120, 120, 0.5) ;\n    color: themed('color-error');\n    border: 1px solid themed('color-error');\n  }\n}\n\n</style>\n","import { render } from \"./WarningMenu.vue?vue&type=template&id=43f286a0&scoped=true\"\nimport script from \"./WarningMenu.vue?vue&type=script&lang=js\"\nexport * from \"./WarningMenu.vue?vue&type=script&lang=js\"\n\nimport \"./WarningMenu.vue?vue&type=style&index=0&id=43f286a0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-43f286a0\"]])\n\nexport default __exports__","import { render } from \"./Header.vue?vue&type=template&id=67276c90&scoped=true\"\nimport script from \"./Header.vue?vue&type=script&lang=js\"\nexport * from \"./Header.vue?vue&type=script&lang=js\"\n\nimport \"./Header.vue?vue&type=style&index=0&id=67276c90&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-67276c90\"]])\n\nexport default __exports__","<template>\n  <v-breadcrumbs :items=\"crumbs\">\n    <template #title=\"{ item }\">\n      <div class=\"item-flex\">\n        <span>{{ item.title }}</span>\n        <span v-if=\"item.siblings && item.siblings.length > 1\" class=\"breadcrumb-path-siblings\">\n          <BaseMenu\n            :placement=\"'bottom'\"\n            :offset=\"[0, 16]\"\n          >\n            <!-- allow click = false to remove active state on click  -->\n            <IconButton\n              :id=\"`${item.title.trim()}`\"\n              :mirrored=\"show\"\n              class=\"breadcrumb-dropdown-icon\"\n              :icon=\"'expand_more'\"\n              :width=\"22\"\n              :height=\"22\"\n              :allowClick=\"false\"\n              @click.stop.prevent=\"toggleShow\"\n            />\n            <template #menu=\"{closeMenu}\">\n              <ul>\n                <li\n                  v-for=\"(s, idx) in item.siblings.filter(i => i.meta && Object.keys(i.meta).length > 0)\"\n                  :key=\"`${s.meta.breadCrumb.trim()}_${idx}`\"\n                >\n                  <BaseMenuButton\n                    :disabled=\"s.meta.breadCrumb === item.title\"\n                    @click.stop=\"navigate(s.name), closeMenu(), toggleShow()\"\n                  >\n                    <SVGIcon\n                      :iconName=\"s.meta.icon\"\n                      :width=\"'22px'\"\n                      :height=\"'22px'\"\n                    />\n                    <span>{{ s.meta.breadCrumb }}</span>\n                  </BaseMenuButton>\n                </li>\n              </ul>\n            </template>\n          </BaseMenu>\n        </span>\n      </div>\n    </template>\n  </v-breadcrumbs>\n</template>\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'BreadcrumbNavigation',\n  components: {\n    IconButton,\n    BaseMenu,\n    BaseMenuButton,\n    SVGIcon,\n  },\n  data() {\n    return {\n      show: false,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    crumbs() {\n      const pathArray = this.$route.path.split(\"/\");\n      pathArray.shift();\n      const breadcrumbs = pathArray.reduce((breadcrumbArray, path, idx) => {\n        if (this.$route.matched[idx].meta.breadCrumb) {\n          const obj = {\n            path,\n            to: breadcrumbArray[idx - 1]\n              ? `${breadcrumbArray[idx - 1].to}/${path}`\n              : `/${path}`,\n            title: this.$route.matched[idx].meta.breadCrumb,\n            siblings: this.$route.matched[idx - 1] ? this.$route.matched[idx - 1].children : null,\n          };\n\n          if (obj.siblings) {\n            obj.siblings = obj.siblings.filter((item) => ((!item.permissions) || (item.permissions && item.permissions.some((i) => this.user.role === i))) && item.meta?.breadCrumb);\n          }\n          breadcrumbArray.push(obj);\n        }\n        return breadcrumbArray;\n      }, []);\n      return breadcrumbs;\n    },\n\n  },\n  methods: {\n    navigate(name) {\n      this.$router.push({ name });\n    },\n    toggleShow() {\n      this.show = !this.show;\n    },\n  },\n};\n</script>\n<style lang=\"scss\">\n.item-flex {\n  display: flex;\n  padding: 5px;\n  flex-wrap: nowrap;\n  overflow-x: hidden;\n  overflow-y: hidden;\n  span {\n    width: fit-content;\n    white-space: nowrap;\n  }\n}\n\n.v-breadcrumbs {\n  padding: 0;\n}\n\n.v-breadcrumbs .v-breadcrumbs-item--link,\n.v-breadcrumbs .v-icon {\n  font-size: 1.0rem;\n}\n\n.v-breadcrumbs li.v-breadcrumbs-item--disabled:first-child{\n  opacity: 1;\n}\n\n.v-breadcrumbs li.v-breadcrumbs-item--disabled:not(:first-child) {\n  opacity: 1;\n  text-decoration: underline;\n  text-decoration-thickness: 2px;\n}\n\n.breadcrumb-path-siblings {\n  margin-left: 8px;\n  pointer-events: auto;\n}\n\n.breadcrumb-dropdown-icon {\n  z-index: 4;\n}\n\n.breadcrumb-dropdown-icon.active {\n  color: var(--color-white) !important;\n}\n</style>\n","import { render } from \"./BreadcrumbNavigation.vue?vue&type=template&id=5f54f58a\"\nimport script from \"./BreadcrumbNavigation.vue?vue&type=script&lang=js\"\nexport * from \"./BreadcrumbNavigation.vue?vue&type=script&lang=js\"\n\nimport \"./BreadcrumbNavigation.vue?vue&type=style&index=0&id=5f54f58a&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./UserPage.vue?vue&type=template&id=2e75c440&scoped=true\"\nimport script from \"./UserPage.vue?vue&type=script&lang=js\"\nexport * from \"./UserPage.vue?vue&type=script&lang=js\"\n\nimport \"./UserPage.vue?vue&type=style&index=0&id=2e75c440&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2e75c440\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"doneFetch\" class=\"settings scrollbar\">\n    <div class=\"row\">\n      <div class=\"col-9 flex-col\">\n        <span class=\"header\">Current Usage</span>\n        <span class=\"subtitle\">Summary of your organization total usage this month. Usage information may take some time to update.</span>\n      </div>\n      <div class=\"col-3 flex-col\">\n        <span class=\"header\">Funds Remaining</span>\n        <h3>USD  {{ Number(totalDollars).toLocaleString(userLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}</h3>\n      </div>\n    </div>\n    <div class=\"static-summary\">\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'folder2'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Projects</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${numProject}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'database2'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Datasets</span>\n            <SVGIcon\n              :iconName=\"'info'\"\n              class=\"detail-icon\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n              @click=\"() => showDetailedDatasets = !showDetailedDatasets\"\n            />\n          </div>\n          <div class=\"progress__subtitle\">\n            <template v-if=\"showDetailedDatasets\">\n              <span>{{ numActiveDataset }} <span class=\"unit\">active</span> / {{ numParkedDataset }}\n                <span class=\"unit\">parked</span> / {{ numDeletedDataset }} <span class=\"unit\">recycled</span></span>\n            </template>\n            <template v-else>\n              <span>{{ numDataset }}</span>\n            </template>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'image'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Images</span>\n            <SVGIcon\n              :iconName=\"'info'\"\n              class=\"detail-icon\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n              @click=\"() => showDetailedImages = !showDetailedImages\"\n            />\n          </div>\n          <div class=\"progress__subtitle\">\n            <template v-if=\"showDetailedImages\">\n              <span>{{ numActiveImages }} <span class=\"unit\">active</span> / {{ numParkedImages }}\n                <span class=\"unit\">parked</span> / {{ numDeletedImages }} <span class=\"unit\">recycled</span></span>\n            </template>\n            <template v-else>\n              <span>{{ numImages }}</span>\n            </template>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'set'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Annotations (boxes)</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${numAnnotations}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'train'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Training</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${parseDuration(trainingTime)}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'auto_annotate'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Auto Annotations</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${parseDuration(autoAnnotationsTime)}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'sam'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>AI Ground Truth</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${parseDuration(aigtTime)}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'snapshot_import'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Snapshot Restore</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${parseDuration(snapshotRestoreTime)}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'snapshot_export'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Snapshot Creation</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${parseDuration(snapshotCreationTime)}` }}</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"static-summary__item\">\n        <div class=\"icon\">\n          <SVGIcon\n            :iconName=\"'compare'\"\n            :width=\"'36px'\"\n            :height=\"'36px'\"\n          />\n        </div>\n        <div class=\"progress\">\n          <div class=\"progress__title\">\n            <span>Validation</span>\n          </div>\n          <div class=\"progress__subtitle\">\n            <span>{{ `${parseDuration(validationTime)}` }}</span>\n          </div>\n        </div>\n      </div>\n    </div>\n    <br>\n    <div class=\"header\">\n      <span>Billing Details</span>\n      <div class=\"date-selector settings__control-group\">\n        <select v-model=\"selectMonth\" class=\"select\">\n          <option v-for=\"(month, i) in months\" :key=\"i\" :value=\"month\">\n            {{ month }}\n          </option>\n        </select>\n        <select v-model=\"selectYear\" class=\"select\">\n          <option v-for=\"(year, i) in years\" :key=\"i\" :value=\"year\">\n            {{ year }}\n          </option>\n        </select>\n        <button class=\"button button-rounded\" @click=\"retrieveMonthlyBill\">Retrieve</button>\n      </div>\n    </div>\n    <div class=\"usage-monitor\">\n      <div class=\"table-container\">\n        <v-data-table\n          :headers=\"headers\"\n          :items=\"mainTableRows\"\n          item-value=\"name\"\n          :group-by=\"groupBy\"\n          :items-per-page=\"-1\"\n          density=\"comfortable\"\n        >\n          <template #top>\n            <div class=\"table-flex-end\">\n              <span>{{ `Net Usage (approx.): $ ${Number(Math.abs(totalCreditUsage)).toLocaleString(userLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` }}</span>\n            </div>\n          </template>\n          <template #group-header=\"{ item, columns, toggleGroup, isGroupOpen }\">\n            <tr>\n              <td :colspan=\"columns.length - 2\">\n                <v-btn\n                  size=\"small\"\n                  variant=\"text\"\n                  :icon=\"isGroupOpen(item) ? 'mdi-chevron-down' : 'mdi-chevron-up'\"\n                  @click=\"toggleGroup(item)\"\n                />\n                {{ item.value }}\n              </td>\n              <td :colspan=\"2\" class=\"total-credit-group\">\n                <span :class=\"{ 'added-fund': getCreditForKey(item.value) > 0 }\">\n                  {{ `$ ${Number(Math.abs(getCreditForKey(item.value))).toLocaleString(userLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` }}\n                </span>\n              </td>\n            </tr>\n          </template>\n          <template #[`header.date`]>\n            <div class=\"date-col\">\n              <span>Date</span>\n              <div class=\"tz-selector\">\n                <input\n                  id=\"option-local\"\n                  v-model=\"selectTimeZone\"\n                  type=\"radio\"\n                  name\n                  :value=\"'local'\"\n                >\n                <label for=\"option-local\">Local</label>\n                <input\n                  id=\"option-utc\"\n                  v-model=\"selectTimeZone\"\n                  type=\"radio\"\n                  :value=\"'utc'\"\n                >\n                <label for=\"option-utc\">UTC</label>\n              </div>\n            </div>\n          </template>\n          <template v-for=\"header in headers\" #[`item.${header.key}`]=\"{ item }\">\n            <template v-if=\"header.key !=='dollars'\">\n              {{ `${item[header.key]}` }}\n            </template>\n            <template v-else>\n              {{ `${Number(item[header.key]).toLocaleString(userLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` }}\n            </template>\n          </template>\n          <template #bottom />\n        </v-data-table>\n      </div>\n    </div>\n  </div>\n  <div v-else class=\"empty-state\">\n    <InlineLoader\n      :width=\"'60px'\"\n      :height=\"'60px'\"\n      :border=\"'12px'\"\n    />\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nexport default {\n  name: 'UserUsageLogs',\n  components: {\n    SVGIcon,\n    InlineLoader,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      dollars: 0,\n      numProject: 0,\n      numDataset: 0,\n      showDetailedDatasets: false,\n      hasDetailedDatasets: false,\n      numActiveDataset: 0,\n      numParkedDataset: 0,\n      numDeletedDataset: 0,\n      numImages: 0,\n      showDetailedImages: false,\n      hasDetailedImages: false,\n      numActiveImages: 0,\n      numParkedImages: 0,\n\n      numDeletedImages: 0,\n      numAnnotations: 0,\n      trainingTime: 0,\n      autoAnnotationsTime: 0,\n      aigtTime: 0,\n      snapshotRestoreTime: 0,\n      snapshotCreationTime: 0,\n      validationTime: 0,\n      numTasks: 0,\n      refreshTimeOut: false,\n      headers: [\n        {\n          title: 'Description', key: 'description', sortable: false, width: '40%',\n        },\n        {\n          title: 'Date', key: 'date', width: '22%', sortable: false, align: 'center',\n        },\n        {\n          title: 'Amount', key: 'amount', sortable: false, width: '10%', align: 'center',\n        },\n        {\n          title: 'Rate', key: 'rate', width: '10%', sortable: false, align: 'center',\n        },\n        {\n          title: 'Duration', key: 'duration', sortable: false, width: '10%', align: 'center',\n        },\n        {\n          title: 'Usage', key: 'dollars', sortable: false, width: '10%', align: 'end',\n        },\n      ],\n      groupBy: [\n        {\n          key: 'type',\n          order: 'asc',\n        },\n      ],\n      orgId: 0,\n      numImagesRecord: [],\n      numParkedImagesRecord: [],\n      numAnnotationsRecord: [],\n      bulkRecord: [],\n      trainingTimeRecord: [],\n      validationTimeRecord: [],\n      autoAnnRecord: [],\n      usersRecord: [],\n      serviceRecord: [],\n      aigtRecord: [],\n      snapshotRestoreRecord: [],\n      snapshotCreationRecord: [],\n      costPackage: null,\n      selectMonth: '',\n      selectYear: 0,\n      timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      currentDateDollarCost: 0,\n      selectTimeZone: 'local',\n      doneSummaryFetch: false,\n      doneDetailsFetch: false,\n      userLocale: navigator.language || 'en-US',\n      organization: null,\n      instances: null,\n    };\n  },\n  computed: {\n    totalDollars() {\n      if (!this.doneFetch) {\n        return 0;\n      } else {\n        return this.dollars + this.parseLocaleNumber(this.currentDateDollarCost, this.userLocale);\n      }\n    },\n    doneFetch() {\n      return this.doneDetailsFetch && this.doneSummaryFetch;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    months() {\n      return [\n        'January', 'February', 'March', 'April', 'May', 'June',\n        'July', 'August', 'September', 'October', 'November', 'December',\n      ];\n    },\n    years() {\n      const currentYear = new Date().getFullYear();\n      const startingYear = 2023;\n      const years = [];\n      for (let year = startingYear; year <= currentYear; year++) {\n        years.push(year);\n      }\n\n      return years;\n    },\n    totalCreditUsage() {\n      const count = Number.parseFloat(this.totalAnnotationCredit) + Number.parseFloat(this.totalImageCredit) + Number.parseFloat(this.totalParkedImageCredit)\n      + Number.parseFloat(this.totalAutoAnnCredit) + Number.parseFloat(this.totalTrainingCredit)\n      + Number.parseFloat(this.totalUsersCredit) + Number.parseFloat(this.totalValidationCredit)\n      + Number.parseFloat(this.totalBulkCredit) + Number.parseFloat(this.totalServiceCharge) + Number(this.totalAIGTCredit);\n      return count;\n    },\n    totalTrainingCredit() {\n      let count = 0;\n      this.trainingTimeRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalAutoAnnCredit() {\n      let count = 0;\n      this.autoAnnRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalImageCredit() {\n      let count = 0;\n      this.numImagesRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalParkedImageCredit() {\n      let count = 0;\n      this.numParkedImagesRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalAnnotationCredit() {\n      let count = 0;\n      this.numAnnotationsRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalValidationCredit() {\n      let count = 0;\n      this.validationTimeRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalBulkCredit() {\n      let count = 0;\n      this.bulkRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalUsersCredit() {\n      let count = 0;\n      this.usersRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalServiceCharge() {\n      let count = 0;\n      this.serviceRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalAIGTCredit() {\n      let count = 0;\n      this.aigtRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalSnapshotRestoreCredit() {\n      let count = 0;\n      this.snapshotRestoreRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    totalSnapshotCreationCredit() {\n      let count = 0;\n      this.snapshotCreationRecord.forEach((record) => {\n        count += Number.parseFloat(record.dollars);\n      });\n      return count;\n    },\n    mainTableRows() {\n      return [...this.numImagesRecord, ...this.numAnnotationsRecord, ...this.trainingTimeRecord,\n        ...this.autoAnnRecord, ...this.validationTimeRecord, ...this.snapshotCreationRecord, ...this.snapshotRestoreRecord,\n        ...this.usersRecord, ...this.serviceRecord, ...this.bulkRecord, ...this.numParkedImagesRecord, ...this.aigtRecord];\n    },\n  },\n  watch: {\n    showDetailedDatasets(v) {\n      if (v) {\n        this.getDetailedDatasets();\n      }\n    },\n    showDetailedImages(v) {\n      if (v) {\n        this.getDetailedImages();\n      }\n    },\n    selectTimeZone(val) {\n      if (val === 'utc') {\n        this.timeZone = 'UTC';\n      } else if (val === 'local') {\n        this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n      }\n      this.retrieveMonthlyBill();\n    },\n  },\n  created() {\n    if (this.$route.query.org) {\n      this.orgId = parseInt(this.$route.query.org);\n    }\n    this.selectMonth = this.months[new Date().getMonth()];\n    this.selectYear = new Date().getFullYear();\n  },\n  async mounted() {\n    await this.getAllInstances();\n    await this.getOrganization();\n    await this.getCostPackage();\n    await this.getUsagePercentage();\n    await this.retrieveMonthlyBill();\n  },\n  methods: {\n    parseDuration(hrs) {\n      const msDiff = hrs * 3600 * 1000;\n      const minutes = Math.floor(msDiff / (1000 * 60)) % 60;\n      const hours = Math.floor(msDiff / (1000 * 60 * 60)) % 24;\n      const days = Math.floor(msDiff / (1000 * 60 * 60 * 24));\n      const result = [];\n      if (days > 0) result.push(`${days} day${days > 1 ? 's' : ''}`);\n      if (hours > 0) result.push(`${hours} hr${hours > 1 ? 's' : ''}`);\n      if (minutes > 0) result.push(`${minutes} min${minutes > 1 ? 's' : ''}`);\n      return result.join(\" \") || \"0 mins\";\n    },\n    parseLocaleNumber(stringNumber, locale) {\n    // Create a NumberFormat object for the specific locale\n      const formatter = new Intl.NumberFormat(locale);\n\n      // Extract the parts from the formatted number\n      const parts = formatter.formatToParts(1234.56);\n      const groupSeparator = parts.find((part) => part.type === 'group').value;\n      const decimalSeparator = parts.find((part) => part.type === 'decimal').value;\n\n      // Remove group separators and replace the decimal separator with a dot\n      const normalizedNumber = stringNumber.toString()\n        .replace(new RegExp(`\\\\${groupSeparator}`, 'g'), '')\n        .replace(decimalSeparator, '.');\n\n      // Parse the normalized number using parseFloat\n      return parseFloat(normalizedNumber);\n    },\n    async getOrganization() {\n      await this.dsConn.getOrg({ organization_id: this.orgId })\n        .then((resp) => {\n          if (resp.result) {\n            this.organization = resp.result;\n          } else if (!resp || resp.error) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Error getting organization`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n        })\n        .catch((e) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Error getting organization`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n    },\n    async getAllInstances() {\n      await this.dsConn.getAllInstances()\n        .then((resp) => {\n          if (resp.result) {\n            this.instances = resp.result;\n          } else if (!resp || resp.error) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Error getting instances`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n        })\n        .catch((e) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Error getting instances`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n    },\n    async retrieveMonthlyBill() {\n      this.doneDetailsFetch = false;\n      await this.dsConn.retrieveMonthlyBill({\n        organization_id: this.orgId,\n        month: this.selectMonth,\n        year: this.selectYear,\n      })\n        .then((resp) => {\n          if (resp.result && Object.keys(resp.result).length > 0 && this.costPackage) {\n            this.parseReport(resp.result);\n          } else {\n            this.parseReport([]);\n          }\n          this.doneDetailsFetch = true;\n        })\n        .catch((e) => {\n          console.log(e);\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Error retrieving monthly bill`,\n            type: \"error\",\n            position: \"top\",\n          });\n          this.doneDetailsFetch = true;\n        });\n    },\n    async getCostPackage() {\n      await this.dsConn.getCostPackage({ organization_id: this.orgId })\n        .then((resp) => {\n          if (resp.result) {\n            this.costPackage = resp.result;\n          } else if (!resp || resp.error) {\n            this.costPackage = null;\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Error getting cost package`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n        })\n        .catch((e) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Error getting cost package`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n    },\n    getCreditForKey(key) {\n      switch (key) {\n      case \"Images (Duration in Days)\":\n        return this.totalImageCredit;\n      case \"Parked Images (Duration in Days)\":\n        return this.totalParkedImageCredit;\n      case \"Annotations (Duration in Days)\":\n        return this.totalAnnotationCredit;\n      case \"Training Time (Duration in Hours)\":\n        return this.totalTrainingCredit;\n      case \"Auto Annotations (Duration in Hours)\":\n        return this.totalAutoAnnCredit;\n      case \"Video & Binary (Duration in Day)\":\n        return this.totalBulkCredit;\n      case \"Validations (Duration in Hours)\":\n        return this.totalValidationCredit;\n      case \"Users (Duration in Days)\":\n        return this.totalUsersCredit;\n      case \"AI Assisted Ground Truth (Duration in Hours)\":\n        return this.totalAIGTCredit;\n      case \"Snapshot Creation (Duration in Hours)\":\n        return this.totalAIGTCredit;\n      case \"Snapshot Restore (Duration in Hours)\":\n        return this.totalAIGTCredit;\n      case \"Minimum Usage\":\n        return this.totalServiceCharge;\n      default:\n        return 0;\n      }\n    },\n    async getUsagePercentage() {\n      this.doneSummaryFetch = false;\n      await this.dsConn.getUsageSummaryForOrganization({ organization_id: this.orgId })\n        .then((resp) => {\n          if (resp.result) {\n            this.numProject = resp.result.project;\n            this.numDataset = resp.result.dataset;\n            this.numImages = resp.result.images;\n            this.numAnnotations = resp.result.annotations;\n            this.trainingTime = resp.result.train_time;\n            this.autoAnnotationsTime = resp.result.autoanns;\n            this.aigtTime = resp.result.aigt_time;\n            this.snapshotCreationTime = resp.result.snapshot_restore;\n            this.snapshotRestoreTime = resp.result.snapshot_creation;\n            this.validationTime = resp.result.validation_time;\n            this.dollars = (resp.result.credits * this.costPackage['dve_credits_cost_usd']);\n          } else if (!resp || resp.error) {\n            this.costPackage = null;\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Error getting usage summary`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n          this.doneSummaryFetch = true;\n        })\n        .catch((e) => {\n          console.log(e);\n          this.doneSummaryFetch = true;\n        });\n    },\n    async getDetailedDatasets() {\n      if (!this.hasDetailedDatasets) {\n        await this.dsConn.getDetailedDatasets({ organization_id: this.orgId })\n          .then((resp) => {\n            if (resp.result) {\n              this.numActiveDataset = resp.result.dataset;\n              this.numParkedDataset = resp.result.parked_dataset;\n              this.numDeletedDataset = resp.result.deleted_dataset;\n            }\n          });\n      }\n    },\n    async getDetailedImages() {\n      if (!this.hasDetailedImages) {\n        await this.dsConn.getDetailedImages({ organization_id: this.orgId })\n          .then((resp) => {\n            if (resp.result) {\n              this.numActiveImages = resp.result.images;\n              this.numParkedImages = resp.result.parked_images;\n              this.numDeletedImages = resp.result.deleted_images;\n            }\n          });\n      }\n    },\n    parseReport(data) {\n      // Images\n      if (this.selectMonth === this.months[new Date().getMonth()] && this.selectYear === new Date().getFullYear()) {\n        this.currentDateDollarCost = 0;\n      }\n      const num_images_array = data.filter((e) => e.type === 'num_images');\n      let reduced_num_images_array = num_images_array.reduce((acc, curr) => {\n        const obj = {\n          type: \"Images (Duration in Days)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: this.costPackage['images'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] > 1 ? `$${this.costPackage['images'][0]['crpu'] * this.costPackage['dve_credits_cost_usd']}/image/month`\n            : `\\u00A2${this.costPackage['images'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * 100}/image/month`,\n          amount: curr.amount,\n          duration: `${curr.duration}d`,\n          dollars: this.getDollarCost('images', curr.amount, curr.duration, 1),\n        };\n        if (Number(obj.dollars) !== 0) {\n          acc.push(obj);\n        }\n        return acc;\n      }, []);\n\n      // [0] is always the latest record\n      reduced_num_images_array = this.appendCurrentDateRecord(reduced_num_images_array, num_images_array[0], num_images_array[num_images_array.length - 1]);\n      this.numImagesRecord = reduced_num_images_array;\n\n      const num_parked_images_array = data.filter((e) => e.type === 'parked_images' || e.type === 'parked_images_fee');\n      let reduced_num_parked_images_array = num_parked_images_array.reduce((acc, curr) => {\n        const obj = {\n          type: \"Parked Images (Duration in Days)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: this.costPackage['images'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] > 1 ? `$${(this.costPackage['images'][0]['crpu'] * this.costPackage['dve_credits_cost_usd']) / 2}/image/month`\n            : `\\u00A2${((this.costPackage['images'][0]['crpu'] * this.costPackage['dve_credits_cost_usd']) / 2) * 100}/image/month`,\n          amount: curr.amount,\n          duration: `${curr.duration}d`,\n          dollars: this.getDollarCost('images', curr.amount, curr.duration, 0.5),\n        };\n        if (Number(obj.dollars) !== 0) {\n          acc.push(obj);\n        }\n        return acc;\n      }, []);\n      reduced_num_parked_images_array = this.appendCurrentDateRecord(reduced_num_parked_images_array, num_parked_images_array[0], num_parked_images_array[num_parked_images_array.length - 1]);\n      this.numParkedImagesRecord = reduced_num_parked_images_array;\n      // annotations\n      const num_annotations_array = data.filter((e) => e.type === 'num_annotations');\n      let reduced_num_annotations_array = num_annotations_array.reduce((acc, curr) => {\n        const obj = {\n          type: \"Annotations (Duration in Days)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: this.costPackage['annotations'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] > 1 ? `$${this.costPackage['annotations'][0]['crpu'] * this.costPackage['dve_credits_cost_usd']}/ann./month`\n            : `\\u00A2${this.costPackage['annotations'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * 100}/ann./month`,\n          amount: curr.amount,\n          duration: `${curr.duration}d`,\n          dollars: this.getDollarCost('annotations', curr.amount, curr.duration, 1),\n        };\n        if (Number(obj.dollars) !== 0) {\n          acc.push(obj);\n        }\n        return acc;\n      }, []);\n      reduced_num_annotations_array = this.appendCurrentDateRecord(reduced_num_annotations_array, num_annotations_array[0], num_parked_images_array[num_parked_images_array.length - 1]);\n      this.numAnnotationsRecord = reduced_num_annotations_array;\n\n      // seats\n      const seat_array = data.filter((e) => e.type === 'num_seats');\n      const reduced_seat_array = seat_array.reduce((acc, curr) => {\n        const obj = {\n          type: \"Users (Duration in Days)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: this.costPackage['seats'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] > 1 ? `$${this.costPackage['seats'][0]['crpu'] * this.costPackage['dve_credits_cost_usd']}/seat/month`\n            : `\\u00A2${this.costPackage['seats'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * 100}/seat/month`,\n          amount: curr.amount,\n          duration: `${curr.duration}d`,\n          dollars: this.getDollarCost('seats', curr.amount, curr.duration, 1),\n        };\n        if (Number(obj.dollars) !== 0) {\n          acc.push(obj);\n        }\n        return acc;\n      }, []);\n      this.usersRecord = reduced_seat_array;\n\n      // bulk data\n      const bulk_array = data.filter((e) => e.type === 'size_bulkdata');\n      const reduced_bulk_array = bulk_array.reduce((acc, curr) => {\n        const obj = {\n          type: \"Bulk Storage (Duration in Day)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: this.costPackage['bulk_video'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] > 1 ? `$${this.costPackage['bulk_video'][0]['crpu'] * this.costPackage['dve_credits_cost_usd']}/MB/month`\n            : `\\u00A2${this.costPackage['bulk_video'][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * 100}/MB/month`,\n          amount: curr.amount,\n          duration: `${curr.duration}d`,\n          dollars: this.getDollarCost('video', curr.amount, curr.duration, 1),\n        };\n        if (Number(obj.dollars) !== 0) {\n          acc.push(obj);\n        }\n        return acc;\n      }, []);\n      this.bulkRecord = reduced_bulk_array;\n\n      // service\n      const service_array = data.filter((e) => e.type === 'service');\n      const reduced_service_array = service_array.reduce((acc, curr) => {\n        const obj = {\n          type: \"Minimum Usage\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          amount: curr.amount,\n          duration: `${curr.duration}d`,\n          dollars: (curr.credit_change * this.costPackage['dve_credits_cost_usd']),\n        };\n        if (curr.credit_change !== 0) {\n          acc.push(obj);\n        }\n        return acc;\n      }, []);\n      this.serviceRecord = reduced_service_array;\n\n      // training\n      const training_array = data.filter((e) => e.type === 'training_time');\n      const reduced_training_array = training_array.reduce((acc, curr) => {\n        const cost = this.getDollarCostForCloudInstances(curr.instance_type, curr.duration);\n        const obj = {\n          type: \"Training Time (Duration in Hours)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: cost.rate,\n          duration: `${Number(curr.duration).toFixed(3).toLocaleString()}h`,\n          amount: '-',\n          dollars: cost.dollars,\n        };\n        acc.push(obj);\n        return acc;\n      }, []);\n      this.trainingTimeRecord = reduced_training_array;\n\n      // aigt\n      const aigt_array = data.filter((e) => e.type === 'aigt_time');\n      const reduced_aigt_array = aigt_array.reduce((acc, curr) => {\n        const cost = this.getDollarCostForCloudInstances(curr.instance_type, curr.duration);\n        const obj = {\n          type: \"AI Assisted Ground Truth (Duration in Hours)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: cost.rate,\n          duration: `${Number(curr.duration).toFixed(3).toLocaleString()}h`,\n          amount: '-',\n          dollars: cost.dollars,\n        };\n        acc.push(obj);\n        return acc;\n      }, []);\n      this.aigtRecord = reduced_aigt_array;\n\n      // autoann\n      const autoann_array = data.filter((e) => e.type === 'auto_annotations');\n      const reduced_autoann_array = autoann_array.reduce((acc, curr) => {\n        const cost = this.getDollarCostForCloudInstances(curr.instance_type, curr.duration);\n        const obj = {\n          type: \"Auto Annotations (Duration in Hours)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: cost.rate,\n          duration: `${Number(curr.duration).toFixed(3).toLocaleString()}h`,\n          amount: '-',\n          dollars: cost.dollars,\n        };\n        acc.push(obj);\n        return acc;\n      }, []);\n      this.autoAnnRecord = reduced_autoann_array;\n\n      // validation\n      const validation_array = data.filter((e) => e.type === 'validation');\n      const reduced_validation_array = validation_array.reduce((acc, curr) => {\n        const cost = this.getDollarCostForCloudInstances(curr.instance_type, curr.duration);\n        const obj = {\n          type: \"Validations (Duration in Hours)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: cost.rate,\n          duration: `${Number(curr.duration).toFixed(3).toLocaleString()}h`,\n          amount: '-',\n          dollars: cost.dollars,\n        };\n        acc.push(obj);\n        return acc;\n      }, []);\n      this.validationTimeRecord = reduced_validation_array;\n\n      // snapshot_restore\n      const snapshot_restore_array_array = data.filter((e) => e.type === 'snapshot_restore');\n      const reduced_snapshot_restore_array = snapshot_restore_array_array.reduce((acc, curr) => {\n        const cost = this.getDollarCostForCloudInstances(curr.instance_type, curr.duration);\n        const obj = {\n          type: \"Snapshot Restore (Duration in Hours)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: cost.rate,\n          duration: `${Number(curr.duration).toFixed(3).toLocaleString()}h`,\n          amount: '-',\n          dollars: cost.dollars,\n        };\n        acc.push(obj);\n        return acc;\n      }, []);\n      this.snapshotRestoreRecord = reduced_snapshot_restore_array;\n\n      // snapshot_creation\n      const snapshot_creation_array = data.filter((e) => e.type === 'snapshot_creation');\n      const reduced_snapshot_creation_array = snapshot_creation_array.reduce((acc, curr) => {\n        const cost = this.getDollarCostForCloudInstances(curr.instance_type, curr.duration);\n        const obj = {\n          type: \"Snapshot Creation (Duration in Hours)\",\n          description: curr.comments,\n          date: new Date(curr.date).toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: cost.rate,\n          duration: `${Number(curr.duration).toFixed(3).toLocaleString()}h`,\n          amount: '-',\n          dollars: cost.dollars,\n        };\n        acc.push(obj);\n\n        return acc;\n      }, []);\n      this.snapshotCreationRecord = reduced_snapshot_creation_array;\n    },\n    appendCurrentDateRecord(array, latest, first) {\n      if (!latest || !first) {\n        return array;\n      }\n      const now = new Date();\n\n      // latest is the most recent entry\n      const latestDate = new Date(latest.date);\n      // first is first entry of the month, used to get which month the current record is from\n      const firstDate = new Date(first.date);\n\n      if (now.getUTCFullYear() !== firstDate.getUTCFullYear() || now.getUTCMonth() !== firstDate.getUTCMonth()) {\n        return array;\n      }\n\n      const diff = this.getDateDifferenceInDays(latestDate, now) + 1;\n      let parsedEndDate = \"\";\n      if (latest.comments) {\n        parsedEndDate = latest.comments.split(' ')[latest.comments.split(' ').length - 1];\n      } else {\n        parsedEndDate = this.parseToYYYMMDD(latestDate);\n      }\n      let type = null;\n      let costPkgKey = null;\n      let modifier = 1;\n      let unit = null;\n      switch (latest.type) {\n      case \"num_images\":\n        type = \"Images (Duration in Days)\";\n        costPkgKey = 'images';\n        unit = \"/image/month\";\n        break;\n      case \"num_annotations\":\n        type = \"Annotations (Duration in Days)\";\n        costPkgKey = 'annotations';\n        unit = \"/ann./month\";\n        break;\n      case \"parked_images_fee\":\n      case \"parked_images\":\n        type = \"Parked Images (Duration in Days)\";\n        costPkgKey = 'images';\n        modifier = 0.5;\n        unit = \"/image/month\";\n        break;\n      default:\n        break;\n      }\n      if (diff < 1.0) {\n        return array;\n      } else {\n        const newRecord = {\n          type,\n          description: `Storage from ${parsedEndDate} to  ${this.parseToYYYMMDD(now)}`,\n          date: now.toLocaleString('default', {\n            year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n          }),\n          rate: this.costPackage[costPkgKey][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] > 1 ? `$${this.costPackage[costPkgKey][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * modifier}${unit}`\n            : `\\u00A2${this.costPackage[costPkgKey][0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * 100 * modifier}${unit}`,\n          amount: latest.amount,\n          duration: `${diff}d`,\n          dollars: this.getDollarCost(costPkgKey, latest.amount, diff, modifier),\n        };\n        if (Number(newRecord.dollars) !== 0) {\n          array.unshift(newRecord);\n          if (this.selectMonth === this.months[new Date().getMonth()] && this.selectYear === new Date().getFullYear()) {\n            this.currentDateDollarCost += newRecord.dollars;\n          }\n        }\n        return array;\n      }\n    },\n    parseToYYYMMDD(dateString) {\n      const date = new Date(dateString);\n      // Extract the year, month (0-based, so we add 1), and day\n      const year = date.getUTCFullYear();\n      const month = String(date.getUTCMonth() + 1).padStart(2, '0'); // Pad single digit months with a leading zero\n      const day = String(date.getUTCDate()).padStart(2, '0'); // Pad single digit days with a leading zero\n\n      // Format the date as 'yyyy-mm-dd'\n      const formattedDate = `${year}-${month}-${day}`;\n\n      return formattedDate;\n    },\n    getDateDifferenceInDays(date1, date2) {\n    // Parse the input dates\n      const startDate = new Date(date1);\n      const endDate = new Date(date2);\n\n      // Ensure that the date objects are valid\n      if (Number.isNaN(startDate) || Number.isNaN(endDate)) {\n        throw new Error(\"Invalid date format\");\n      }\n\n      // Get the time in milliseconds for both dates\n      const startTime = startDate.getTime();\n      const endTime = endDate.getTime();\n\n      // Calculate the difference in milliseconds\n      const differenceInMilliseconds = endTime - startTime;\n\n      // Convert milliseconds to full days (1000 milliseconds * 60 seconds * 60 minutes * 24 hours)\n      const differenceInDays = Math.floor(differenceInMilliseconds / (1000 * 60 * 60 * 24));\n\n      return differenceInDays;\n    },\n    timeOut() {\n      this.refreshTimeOut = true;\n      setTimeout(() => { this.refreshTimeOut = false; }, 10000);\n    },\n    getDollarCost(key, count, duration, modifier) {\n      let credit_range = null;\n      let prorated = 1;\n      switch (key) {\n      case \"seats\":\n        credit_range = this.costPackage['seats'];\n        prorated = duration / 30.0;\n        break;\n      case \"images\":\n        credit_range = this.costPackage['images'];\n        prorated = duration / 30.0;\n        break;\n      case \"annotations\":\n        credit_range = this.costPackage['annotations'];\n        prorated = duration / 30.0;\n        break;\n      case \"video\":\n        credit_range = this.costPackage['bulk_video'];\n        prorated = duration / 30.0;\n        break;\n      default:\n        break;\n      }\n\n      return Number(-1 * count * credit_range[0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * prorated * modifier).toLocaleString();\n    },\n    getDollarCostForCloudInstances(type, duration) {\n      const pkgName = this.organization.package_name;\n      const instance = this.instances.find((inst) => inst.type === type && inst.package === pkgName);\n\n      if (!instance) {\n        return {\n          dollars: 0,\n          rate: \"$0/hour\",\n        };\n      }\n      return {\n        dollars: Number(-1 * duration * instance[\"price\"]).toLocaleString(),\n        rate: instance[\"price\"] > 1 ? `$${instance[\"price\"]}/hour` : `\\u00A2${instance[\"price\"]}/hour`,\n      };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.flex-col {\n  display: flex;\n  flex-direction: column;\n}\n\n.refresh-usage {\n  width: fit-content;\n}\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  min-width: 400px;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.date-selector {\n  width: 380px;\n  display: flex;\n  flex-direction: row;\n  margin-left: 20px;\n  font-size: 1rem;\n  font-weight: 500;\n\n  select + select {\n    margin-left: 20px;\n  }\n\n  button {\n    margin-left: 20px;\n  }\n}\n\n.static-summary {\n  width: 100%;\n  display: grid;\n  grid-gap: 30px;\n  padding: 15px;\n  grid-template-columns: repeat(auto-fill, 370px);\n  grid-auto-rows: auto;\n  border-radius: 8px;\n  margin-top: 20px;\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n  @include themify() {\n    background: themed('card-color');\n    color: themed('body-text-color');\n  }\n\n  &__item {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n\n    .icon +.progress {\n      margin-left: 20px;\n    }\n  }\n\n  &__item > .label {\n    width: 200px;\n    text-align: right;\n    font-size: 0.9rem;\n    font-weight: 600;\n    color: rgba(grey, 0.9);\n\n    &.required::after {\n      content: '*';\n      font-size: 14px;\n      font-weight: 700;\n      padding-left: 1px;\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n  }\n\n  &__item > .value {\n    flex: 1 1 auto;\n    font-size: 0.9rem;\n    margin-left: 20px;\n  }\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.subtitle {\n  font-size: 0.9rem;\n}\n\n.icon {\n  width: fit-content;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.progress {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n\n  &__title {\n    display: flex;\n    width: 100%;\n    font-size: 1.0rem;\n    font-weight: 600;\n    @include themify() {\n    color: themed('body-text-color');\n    }\n    span {\n      margin-right: 5px\n    }\n  }\n\n  &__subtitle {\n    display: flex;\n    width: 100%;\n    font-size: 1rem;\n    font-weight: 600;\n    justify-content: space-between;\n    @include themify() {\n    color: themed('body-text-color-secondary');\n    }\n\n    div:first-child {\n    margin-bottom: 5px;\n    }\n  }\n\n  &__bar {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n      margin-top: 1px;\n\n      progress {\n      width: 100%;\n      border-radius: 0;\n      height: 10px;\n\n        &::-webkit-progress-bar {\n            @include themify() {\n            background-color: themed('progress-bar');\n            }\n        }\n        &::-webkit-progress-value {\n            @include themify() {\n            background-color: themed('progress-value');\n            }\n        }\n      }\n  }\n\n  &__estimate {\n      display: flex;\n      font-weight: 600;\n      font-size: 0.875rem;\n      @include themify() {\n      color: themed('body-text-color-secondary');\n      }\n      margin-top: 5px;\n      justify-content: space-between;\n  }\n}\n.usage-monitor {\n  .radio-group {\n    display: inline-block;\n    margin: 10px 0 20px 0;\n    border-radius: 5px;\n    overflow: hidden;\n    border: solid 1px black\n  }\n\n  .radio-group input[type=\"radio\"] {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n  }\n\n  .radio-group input[type=\"radio\"] + label {\n    min-width: 6rem;\n    max-width: 50%;\n    text-align: center;\n    display: inline-block;\n    cursor: pointer;\n    font-size: 0.9rem;\n    line-height: 1.5;\n    padding: 5px 20px;\n    transition: all 0s ease;\n    @include themify() {\n      background: themed('card-color');\n      color: themed('body-text-color');\n    }\n  }\n\n  .radio-group input[type=\"radio\"]:not(:disabled):hover + label {\n    @include themify() {\n      background: themed('color-primary-300');\n      color: themed('primary-text-color');\n    }\n  }\n\n  .radio-group input[type=\"radio\"]:checked + label,\n  .radio-group input[type=\"radio\"]:checked:hover + label {\n    opacity: 1;\n    z-index: 1;\n    @include themify() {\n      background: themed('color-primary');\n      color: themed('primary-text-color');\n    }\n  }\n\n  .table-container {\n    width: 100%;\n    padding: 15px;\n    border-radius: 8px;\n    margin-top: 20px;\n    box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n    @include themify() {\n      background: themed('card-color');\n      color: themed('body-text-color');\n\n    }\n  }\n\n  :deep(tbody tr:nth-of-type(odd)) {\n    background-color: rgba(0, 0, 0, .05);\n  }\n\n  :deep(thead > tr > th:nth-child(1)) {\n    color: transparent;\n    max-width: 60px;\n  }\n  .table-flex-end {\n    display: flex;\n    justify-content: end;\n\n      span {\n      font-size: 1rem;\n      font-weight: 600;\n    }\n  }\n  .total-credit-group{\n    text-align: end;\n    font-weight: 550;\n\n    span {\n      margin-left: auto;\n      font-size: 1.0rem;\n    }\n  }\n\n  .radio-group {\n    display: inline-block;\n    margin: 10px 0 20px 0;\n    border-radius: 5px;\n    overflow: hidden;\n    border: solid 1px black\n  }\n\n  .radio-group input[type=\"radio\"] {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n  }\n\n  .radio-group input[type=\"radio\"] + label {\n    min-width: 6rem;\n    max-width: 50%;\n    text-align: center;\n    display: inline-block;\n    cursor: pointer;\n    font-size: 0.9rem;\n    line-height: 1.5;\n    padding: 5px 20px;\n    transition: all 0s ease;\n    @include themify() {\n      background: themed('card-color');\n      color: themed('body-text-color');\n    }\n  }\n\n  .radio-group input[type=\"radio\"]:not(:disabled):hover + label {\n    @include themify() {\n      background: themed('color-primary-300');\n      color: themed('primary-text-color');\n    }\n  }\n\n  .radio-group input[type=\"radio\"]:checked + label,\n  .radio-group input[type=\"radio\"]:checked:hover + label {\n    opacity: 1;\n    z-index: 1;\n    @include themify() {\n      background: themed('color-primary');\n      color: themed('primary-text-color');\n    }\n  }\n}\n\n.added-fund {\n  color: var(--color-success)\n}\n\n.unit {\n  font-size: 0.85rem !important;\n  font-weight: 500 !important;\n}\n\n.detail-icon {\n  cursor: pointer;\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n  &:hover {\n    @include themify{\n      background-color: themed('icon-hover-color');\n      border-radius: 100%;\n      box-shadow: 0 0 0 4px themed('icon-hover-color');\n    }\n  }\n}\n\n.date-col {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n\n  .tz-selector {\n    margin-left: 5px;\n\n    input[type=\"radio\"] {\n      display: none;\n    }\n\n    label {\n      padding: 2px 5px;\n      width: fit-content;\n      font-size: 0.85rem;\n      font-weight: bold;\n      color: var(--gray-500);\n      cursor: pointer;\n    }\n\n     input[type=\"radio\"]:checked+label {\n      @include themify() {\n        color: themed('color-primary-500');\n      }\n    }\n  }\n}\n</style>\n","<template>\n  <div class=\"inline-loader\" :style=\"{ width: width, height: height }\" />\n</template>\n\n<script>\nexport default {\n  name: 'InlineLoader',\n  props: {\n    width: {\n      type: String,\n      default: '50px',\n    },\n    height: {\n      type: String,\n      default: '50px',\n    },\n    border: {\n      type: String,\n      default: '10px',\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.inline-loader {\n @include themify() {\n  border: v-bind(border) solid themed('loader-background');\n  border-top: v-bind(border) solid themed('loader-main-color');;\n }\n border-radius: 50%;\n animation: spin 2s linear infinite;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n</style>\n","import { render } from \"./InlineLoader.vue?vue&type=template&id=30667883&scoped=true\"\nimport script from \"./InlineLoader.vue?vue&type=script&lang=js\"\nexport * from \"./InlineLoader.vue?vue&type=script&lang=js\"\n\nimport \"./InlineLoader.vue?vue&type=style&index=0&id=30667883&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-30667883\"]])\n\nexport default __exports__","import { render } from \"./UserUsageLogs.vue?vue&type=template&id=c3ec2ac0&scoped=true\"\nimport script from \"./UserUsageLogs.vue?vue&type=script&lang=js\"\nexport * from \"./UserUsageLogs.vue?vue&type=script&lang=js\"\n\nimport \"./UserUsageLogs.vue?vue&type=style&index=0&id=c3ec2ac0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c3ec2ac0\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings scrollbar\">\n    <div class=\"header\">\n      <span>Transactions</span>\n      <div class=\"date-selector settings__control-group\">\n        <select v-model=\"selectYear\" class=\"select\">\n          <option v-for=\"(year, i) in years\" :key=\"i\" :value=\"year\">\n            {{ year }}\n          </option>\n        </select>\n      </div>\n    </div>\n    <span class=\"subtitle\">All purchases and payments made in the selected year.</span>\n    <div class=\"transactions\">\n      <div class=\"table-container\">\n        <v-data-table\n          v-if=\"doneFetch\"\n          :headers=\"headers\"\n          :items=\"transactions\"\n          item-value=\"name\"\n          :items-per-page=\"-1\"\n          density=\"comfortable\"\n        >\n          <template #top>\n            <div class=\"table-flex-end\">\n              <span>{{ `Net Amount ($): ${Number(totalAmount).toLocaleString(userLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` }}</span>\n            </div>\n          </template>\n          <template #[`header.date_generated`]>\n            <div class=\"date-col\">\n              <span>Date Posted</span>\n              <div class=\"tz-selector\">\n                <input\n                  id=\"option-local\"\n                  v-model=\"selectTimeZone\"\n                  type=\"radio\"\n                  name\n                  :value=\"'local'\"\n                >\n                <label for=\"option-local\">Local</label>\n                <input\n                  id=\"option-utc\"\n                  v-model=\"selectTimeZone\"\n                  type=\"radio\"\n                  :value=\"'utc'\"\n                >\n                <label for=\"option-utc\">UTC</label>\n              </div>\n            </div>\n          </template>\n          <template v-for=\"header in headers\" #[`item.${header.key}`]=\"{ item }\">\n            <template v-if=\"header.key ==='amount'\">\n              {{ `${Number(item[header.key]).toLocaleString(userLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` }}\n            </template>\n            <template v-else>\n              {{ `${item[header.key]}` }}\n            </template>\n          </template>\n          <template #bottom />\n        </v-data-table>\n        <div v-else class=\"empty-state\">\n          <InlineLoader\n            :width=\"'60px'\"\n            :height=\"'60px'\"\n            :border=\"'12px'\"\n          />\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport InlineLoader from '@/components/InlineLoader.vue';\n\nexport default {\n  name: 'UserUsageLogs',\n  components: {\n    InlineLoader,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      refreshTimeOut: false,\n      headers: [\n        {\n          title: 'Type', key: 'type', sortable: false, width: '20%', align: 'left',\n        },\n        {\n          title: 'Month', key: 'month', sortable: false, width: '20%', align: 'center',\n        },\n        {\n          title: 'Date Posted', key: 'date_generated', width: '20%', sortable: false, align: 'center',\n        },\n        {\n          title: 'Amount ($)',\n          key: 'amount',\n          width: '20%',\n          sortable: false,\n          align: 'center',\n        },\n      ],\n      groupBy: [\n        {\n          key: 'type',\n          order: 'asc',\n        },\n      ],\n      orgId: 0,\n      costPackage: null,\n      selectYear: 0,\n      doneFetch: false,\n      transactions: [],\n      timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      selectTimeZone: 'local',\n      userLocale: navigator.language || 'en-US',\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    years() {\n      const currentYear = new Date().getFullYear();\n      const startingYear = 2023;\n      const years = [];\n      for (let year = startingYear; year <= currentYear; year++) {\n        years.push(year);\n      }\n\n      return years;\n    },\n    totalAmount() {\n      if (!this.doneFetch) {\n        return 0;\n      } else {\n        return this.transactions.reduce((a, c) => a + c.amount, 0);\n      }\n    },\n  },\n  watch: {\n    selectTimeZone(val) {\n      if (val === 'utc') {\n        this.timeZone = 'UTC';\n      } else if (val === 'local') {\n        this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n      }\n      this.getTransactions();\n    },\n    selectYear() {\n      this.getTransactions();\n    },\n  },\n  created() {\n    if (this.$route.query.org) {\n      this.orgId = parseInt(this.$route.query.org);\n    }\n    this.selectYear = new Date().getFullYear();\n  },\n  async mounted() {\n    await this.getCostPackage();\n    await this.getTransactions();\n  },\n  methods: {\n    async getTransactions() {\n      this.doneFetch = false;\n      await this.dsConn.retrieveAnnualBill({ organization_id: this.orgId, year: this.selectYear })\n        .then((resp) => {\n          if (resp.result && Object.keys(resp.result).length > 0 && this.costPackage) {\n            this.parseReport(resp.result);\n          } else {\n            this.parseReport([]);\n          }\n          this.doneFetch = true;\n        })\n        .catch((e) => {\n          console.log(e);\n          this.doneFetch = true;\n        });\n    },\n    async getCostPackage() {\n      await this.dsConn.getCostPackage({ organization_id: this.orgId })\n        .then((resp) => {\n          if (resp.result) {\n            this.costPackage = resp.result;\n          } else {\n            this.costPackage = null;\n          }\n        })\n        .catch((e) => {\n          console.log(e);\n        });\n    },\n    parseReport(data) {\n      const arr = [...data];\n      arr.forEach((datum, i) => {\n        arr[i].type = `${arr[i].type === 'purchase' ? \"Credit Purchase\" : \"Monthly Service Fee\"}`;\n        arr[i].amount = Number(arr[i].change * this.costPackage['dve_credits_cost_usd']);\n        arr[i].date_generated = new Date(arr[i].date_generated).toLocaleString('default', {\n          year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n        });\n      });\n      this.transactions = arr;\n    },\n    switchTime() {\n      const arr = [...this.transactions];\n      arr.forEach((datum, i) => {\n        arr[i].date_generated = new Date(arr[i].date_generated).toLocaleString('default', {\n          year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, timeZone: this.timeZone,\n        });\n      });\n      this.transactions = arr;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.flex-col {\n  display: flex;\n  flex-direction: column;\n}\n\n.refresh-usage {\n  width: fit-content;\n}\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  min-width: 400px;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.date-selector {\n  width: 200px;\n  display: flex;\n  flex-direction: row;\n  margin-left: 20px;\n  font-size: 1rem;\n  font-weight: 500;\n\n  select + select {\n    margin-left: 20px;\n  }\n\n  button {\n    margin-left: 20px;\n  }\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.subtitle {\n  font-size: 0.9rem;\n}\n\n.icon {\n  width: fit-content;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.transactions {\n  .radio-group {\n    display: inline-block;\n    margin: 10px 0 20px 0;\n    border-radius: 5px;\n    overflow: hidden;\n    border: solid 1px black\n  }\n\n  .radio-group input[type=\"radio\"] {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n  }\n\n  .radio-group input[type=\"radio\"] + label {\n    min-width: 6rem;\n    max-width: 50%;\n    text-align: center;\n    display: inline-block;\n    cursor: pointer;\n    font-size: 0.9rem;\n    line-height: 1.5;\n    padding: 5px 20px;\n    transition: all 0s ease;\n    @include themify() {\n      background: themed('card-color');\n      color: themed('body-text-color');\n    }\n  }\n\n  .radio-group input[type=\"radio\"]:not(:disabled):hover + label {\n    @include themify() {\n      background: themed('color-primary-300');\n      color: themed('primary-text-color');\n    }\n  }\n\n  .radio-group input[type=\"radio\"]:checked + label,\n  .radio-group input[type=\"radio\"]:checked:hover + label {\n    opacity: 1;\n    z-index: 1;\n    @include themify() {\n      background: themed('color-primary');\n      color: themed('primary-text-color');\n    }\n  }\n\n  .table-container {\n    width: 100%;\n    padding: 15px;\n    border-radius: 8px;\n    margin-top: 20px;\n    box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n    @include themify() {\n      background: themed('card-color');\n      color: themed('body-text-color');\n\n    }\n  }\n\n  :deep(tbody tr:nth-of-type(odd)) {\n    background-color: rgba(0, 0, 0, .05);\n  }\n  .table-flex-end {\n    display: flex;\n    justify-content: end;\n\n      span {\n      font-size: 1rem;\n      font-weight: 600;\n    }\n  }\n  .total-credit-group{\n    text-align: end;\n    font-weight: 550;\n\n    span {\n      margin-left: auto;\n      font-size: 1.0rem;\n    }\n  }\n\n  .radio-group {\n    display: inline-block;\n    margin: 10px 0 20px 0;\n    border-radius: 5px;\n    overflow: hidden;\n    border: solid 1px black\n  }\n\n  .radio-group input[type=\"radio\"] {\n    position: absolute;\n    opacity: 0;\n    pointer-events: none;\n  }\n\n    .radio-group input[type=\"radio\"] + label {\n      min-width: 6rem;\n      max-width: 50%;\n      text-align: center;\n      display: inline-block;\n      cursor: pointer;\n      font-size: 0.9rem;\n      line-height: 1.5;\n      padding: 5px 20px;\n      transition: all 0s ease;\n      @include themify() {\n        background: themed('card-color');\n        color: themed('body-text-color');\n      }\n    }\n\n    .radio-group input[type=\"radio\"]:not(:disabled):hover + label {\n      @include themify() {\n        background: themed('color-primary-300');\n        color: themed('primary-text-color');\n      }\n    }\n\n    .radio-group input[type=\"radio\"]:checked + label,\n    .radio-group input[type=\"radio\"]:checked:hover + label {\n      opacity: 1;\n      z-index: 1;\n      @include themify() {\n        background: themed('color-primary');\n        color: themed('primary-text-color');\n      }\n    }\n}\n\n.date-col {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n\n  .tz-selector {\n    margin-left: 5px;\n\n    input[type=\"radio\"] {\n      display: none;\n    }\n\n    label {\n      padding: 2px 5px;\n      width: fit-content;\n      font-size: 0.85rem;\n      font-weight: bold;\n      color: var(--gray-500);\n      cursor: pointer;\n    }\n\n     input[type=\"radio\"]:checked+label {\n      @include themify() {\n        color: themed('color-primary-500');\n      }\n    }\n  }\n}\n\n</style>\n","import { render } from \"./Transactions.vue?vue&type=template&id=195b7b51&scoped=true\"\nimport script from \"./Transactions.vue?vue&type=script&lang=js\"\nexport * from \"./Transactions.vue?vue&type=script&lang=js\"\n\nimport \"./Transactions.vue?vue&type=style&index=0&id=195b7b51&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-195b7b51\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <div class=\"user-router\">\n        <div class=\"user-router__container\">\n          <ul>\n            <li @click=\"navigateToOrganization\">\n              <span>Organization</span>\n            </li>\n            <li class=\"secondary\" :class=\"{ 'active': currentTab.includes('admin/organization/details') }\" @click=\"navigateToOrganization\">\n              <SVGIcon\n                :iconName=\"'info'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Information</span>\n            </li>\n            <li class=\"secondary\" :class=\"{ 'active': currentTab.includes('admin/organization/editorg') }\" @click=\"navigateToEditOrganization\">\n              <SVGIcon\n                :iconName=\"'edit'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Edit Info</span>\n            </li>\n            <li class=\"secondary\" :class=\"{ 'active': currentTab.includes('admin/organization/security') }\" @click=\"navigateToOrganizationSecurity\">\n              <SVGIcon\n                :iconName=\"'security'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Security</span>\n            </li>\n            <li @click=\"navigateToUserManager\">\n              <span>Users</span>\n            </li>\n            <li class=\"secondary\" :class=\"{ 'active': currentTab.includes('admin/people/list') }\" @click=\"navigateToUserManager\">\n              <SVGIcon\n                :iconName=\"'people'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>User Manager</span>\n            </li>\n            <li class=\"secondary\" :class=\"{ 'active': currentTab.includes('admin/people/newuser') }\" @click=\"navigateToCreatingUser\">\n              <SVGIcon\n                :iconName=\"'person_add'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>New User</span>\n            </li>\n            <!-- <li class=\"secondary\" :class=\"{ 'active': currentTab.includes('admin/people/edituser') }\" @click=\"navigateToEditUser\">\n              <SVGIcon\n                :iconName=\"'edit'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Edit User</span>\n            </li> -->\n            <li :class=\"{ 'active': currentTab.includes('organization/usagelogs') }\" @click=\"navigateToUserUsageLogs\">\n              <SVGIcon\n                :iconName=\"'usage'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Usage & Billing</span>\n            </li>\n            <li :class=\"{ 'active': currentTab.includes('organization/transactions') }\" @click=\"navigateToTransactions\">\n              <SVGIcon\n                :iconName=\"'receipt'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Transactions</span>\n            </li>\n            <!-- <li>\n                <span>Billing Address</span>\n              </li>\n              <li>\n                <span>Usage & Payment</span>\n              </li> -->\n          </ul>\n        </div>\n      </div>\n      <main class=\"main-display-area\">\n        <router-view />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport Header from '@/components/Header.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  name: 'UserProfile',\n  components: {\n    Header,\n    BreadcrumbNavigation,\n    SVGIcon,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      currentTab: 'account',\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && this.user.role === 'admin';\n    },\n    isSuper() {\n      return this.user && this.user.role === 'super';\n    },\n  },\n  watch: {\n    $route(to, from) {\n      if (to && to !== '') {\n        this.currentTab = to.fullPath;\n      }\n    },\n  },\n  created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    if (this.$route) {\n      this.currentTab = this.$route.fullPath;\n    }\n  },\n  methods: {\n    navigateToOrganization() {\n      this.$router.push({ name: 'admin.organization.details' });\n    },\n    navigateToEditOrganization() {\n      this.$router.push({ name: 'admin.organization.editorg', query: { org: this.user.organization_id } });\n    },\n    navigateToOrganizationSecurity() {\n      this.$router.push({ name: 'admin.organization.security', query: { org: this.user.organization_id } });\n    },\n    navigateToUserUsageLogs() {\n      this.$router.push({ name: 'admin.usagelogs', query: { org: this.user.organization_id } });\n    },\n    navigateToTransactions() {\n      this.$router.push({ name: 'admin.transactions', query: { org: this.user.organization_id } });\n    },\n    navigateToUserManager() {\n      this.$router.push({ name: 'admin.people.list' });\n    },\n    navigateToCreatingUser() {\n      this.$router.push({ name: 'admin.people.newuser', query: { org: this.user.organization_id } });\n    },\n    navigateToEditUser() {\n      this.$router.push({ name: 'admin.people.edituser' });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.user-router {\n  min-width: 250px;\n  width: 250px;\n  @include themify() {\n    background-color: themed('background-light-gray');\n  };\n  padding: 30px 0px 30px 30px;\n\n  &__container {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    height: 100%;\n    padding-right: 30px;\n\n    ul {\n      list-style-type: none;\n    }\n\n    ul + ul {\n      margin-top: 20px;\n    }\n\n    li {\n      display: flex;\n      flex-direction: row;\n      margin-top: 2px;\n      margin-bottom: 2px;\n      font-size: 0.9rem;\n      padding: 4px;\n      color: $color-link;\n      cursor: pointer;\n      border-radius: 4px;\n\n      span {\n        margin-left: 5px;\n      }\n\n      &.secondary {\n          margin-left: 15px;\n      }\n    }\n\n    li:hover {\n      background-color: rgba(140, 140, 140, 0.1);\n\n    }\n\n    li:focus-visible {\n      background-color: rgba(140, 140, 140, 0.1);\n    }\n\n    li.active {\n      background-color: rgba(140, 140, 140, 0.2);\n      color: inherit;\n    }\n  }\n}\n</style>\n","import { render } from \"./AdminPage.vue?vue&type=template&id=c5a856cc&scoped=true\"\nimport script from \"./AdminPage.vue?vue&type=script&lang=js\"\nexport * from \"./AdminPage.vue?vue&type=script&lang=js\"\n\nimport \"./AdminPage.vue?vue&type=style&index=0&id=c5a856cc&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c5a856cc\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template #page-slot>\n        <span v-if=\"org\" class=\"mt-0 mb-0\">{{ org.name }}</span>\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <div class=\"user-router\">\n        <div class=\"user-router__container\">\n          <ul>\n            <li :class=\"{ 'active': currentTab.includes('super/list') }\" @click=\"navigateToOrganizationList\">\n              <SVGIcon\n                :iconName=\"'organizations'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>Organization List</span>\n            </li>\n            <li :class=\"{ 'active': currentTab.includes('super/neworg') }\" @click=\"navigateToCreateOrganization\">\n              <SVGIcon\n                :iconName=\"'people_add'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n              <span>New Organization</span>\n            </li>\n          </ul>\n        </div>\n      </div>\n      <main class=\"main-display-area\">\n        <router-view />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport Header from '@/components/Header.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  name: 'UserProfile',\n  components: {\n    Header,\n    BreadcrumbNavigation,\n    SVGIcon,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      currentTab: 'account',\n      org: null,\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    hasOrg() {\n      return this.user && this.user.organization_id !== 0;\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'super' || this.user.role === 'admin');\n    },\n    isSuper() {\n      return this.user && this.user.role === 'super';\n    },\n  },\n  watch: {\n    $route(to, from) {\n      if (to.query.org) {\n        this.getOrg(parseInt(to.query.org));\n      } else {\n        this.org = null;\n      }\n      if (to && to !== '') {\n        this.currentTab = to.fullPath;\n      }\n    },\n  },\n  created() {\n    if (!this.isSuper) {\n      this.$router.push('/login');\n    }\n    if (this.$route) {\n      this.currentTab = this.$route.fullPath;\n    }\n  },\n  methods: {\n    async getOrg(id) {\n      await this.dsConn.getOrg({ organization_id: id })\n        .then((data) => {\n          if (data.result) {\n            this.org = data.result;\n          }\n        })\n        .catch((e) => { this.message = e; });\n    },\n    navigateToCreateOrganization() {\n      this.$router.push({ name: 'super.neworg' });\n    },\n    navigateToOrganizationList() {\n      this.$router.push({ name: 'super.list' });\n    },\n    navigateToAddCredits() {\n      this.$router.push({ name: 'super.addcredits' });\n    },\n    navigateToUserEmulation() {\n      this.dsConn.send2FA({ username: this.user.username });\n      this.$router.push({ name: 'super.emulate' });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.user-router {\n  min-width: 250px;\n  width: 250px;\n  @include themify() {\n    background-color: themed('background-light-gray');\n  };\n  padding: 30px 0px 30px 30px;\n\n  &__container {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    height: 100%;\n    padding-right: 30px;\n\n    ul {\n      list-style-type: none;\n    }\n\n    ul + ul {\n      margin-top: 20px;\n    }\n\n    li {\n      display: flex;\n      flex-direction: row;\n      margin-top: 2px;\n      margin-bottom: 2px;\n      font-size: 0.9rem;\n      padding: 4px;\n      color: $color-link;\n      cursor: pointer;\n      border-radius: 4px;\n\n      span {\n        margin-left: 5px;\n      }\n\n      &.secondary {\n          margin-left: 15px;\n      }\n    }\n\n    li:hover {\n      background-color: rgba(140, 140, 140, 0.1);\n\n    }\n\n    li:focus-visible {\n      background-color: rgba(140, 140, 140, 0.1);\n    }\n\n    li.active {\n      background-color: rgba(140, 140, 140, 0.2);\n      color: inherit;\n    }\n  }\n}\n</style>\n","import { render } from \"./SuperAdminPage.vue?vue&type=template&id=2f0bf401&scoped=true\"\nimport script from \"./SuperAdminPage.vue?vue&type=script&lang=js\"\nexport * from \"./SuperAdminPage.vue?vue&type=script&lang=js\"\n\nimport \"./SuperAdminPage.vue?vue&type=style&index=0&id=2f0bf401&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2f0bf401\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings scrollbar account\">\n    <span class=\"header\">User Information</span>\n    <div class=\"row mt-3\">\n      <div class=\"label\">Username</div>\n      <div class=\"value\">{{ user.username }}</div>\n    </div>\n    <div v-if=\"user.first_name\" class=\"row mt-3\">\n      <div class=\"label\">First Name</div>\n      <div class=\"value\">{{ user.first_name }}</div>\n    </div>\n    <div v-if=\"user.last_name\" class=\"row mt-3\">\n      <div class=\"label\">Last Name</div>\n      <div class=\"value\">{{ user.last_name }}</div>\n    </div>\n    <div class=\"row mt-2\">\n      <div class=\"label\">Email</div>\n      <div class=\"value\">{{ user.email }}</div>\n    </div>\n    <div v-if=\"orgName\" class=\"row mt-2\">\n      <div class=\"label\">Organization</div>\n      <div class=\"value\">{{ orgName }}</div>\n    </div>\n    <div v-if=\"user.role\" class=\"row mt-2\">\n      <div class=\"label\">User Permission</div>\n      <div class=\"value\">{{ user.role.charAt(0).toUpperCase() + user.role.slice(1) }}</div>\n    </div>\n    <div v-if=\"bucket\" class=\"row mt-2\">\n      <div class=\"label\">S3 Bucket</div>\n      <div class=\"value\">{{ bucket }}</div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'UserProfile',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      allRoles: [],\n      bucket: null,\n      orgName: '',\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && this.user.role === 'admin';\n    },\n  },\n  created() {\n    this.getAllRoles();\n    this.getOrg();\n  },\n  mounted() {\n    this.getUserBucket();\n  },\n  methods: {\n    async getOrg() {\n      await this.dsConn.getOrg({ organization_id: this.user.organization_id })\n        .then((data) => {\n          if (data.result) {\n            this.orgName = data.result.name;\n          } else {\n            this.message = data.error.message;\n          }\n        })\n        .catch((e) => { this.message = e; });\n    },\n    async getUserBucket() {\n      await this.dsConn.getUserBucket({\n        username: this.user.username,\n      }).then((data) => {\n        if (data.result) {\n          this.bucket = data.result;\n        }\n      }).catch((e) => { console.log(e); });\n    },\n    async getAllRoles() {\n      await this.dsConn.getAllRoles()\n        .then((data) => {\n          this.allRoles = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    editUser() {\n      this.$router.push({ path: '/user/account/edit', query: { editUser: this.user.username } });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 1.0rem;\n  font-weight: 600;\n  color: rgba(grey, 1.0)\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 1.0rem;\n  margin-left: 20px;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-start;\n  button {\n    margin-left: 30px;\n    width: fit-content\n  }\n}\n</style>\n","import { render } from \"./AccountSettings.vue?vue&type=template&id=004e45f4&scoped=true\"\nimport script from \"./AccountSettings.vue?vue&type=script&lang=js\"\nexport * from \"./AccountSettings.vue?vue&type=script&lang=js\"\n\nimport \"./AccountSettings.vue?vue&type=style&index=0&id=004e45f4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-004e45f4\"]])\n\nexport default __exports__","<template>\n  <div class=\"main-page scrollbar\">\n    <div class=\"settings\">\n      <span class=\"header\">Edit User</span>\n\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Username</label>\n        <div class=\"value\">\n          <input\n            v-model=\"username\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorUsername }\"\n            disabled\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">First Name</label>\n        <div class=\"value\">\n          <input\n            v-model=\"firstname\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorFirstname }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Last Name</label>\n        <div class=\"value\">\n          <input\n            v-model=\"lastname\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorLastname }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label\">Email</label>\n        <div class=\"value\">\n          <input\n            v-model=\"email\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorEmail }\"\n          >\n        </div>\n      </div>\n      <div v-if=\"presetRole !== 'super'\" class=\"row mt-3\">\n        <label class=\"label required\">Role</label>\n        <div class=\"value permission-list\">\n          <div class=\"role-grid-single-row\">\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"admin\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n                :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n              >\n                <template #label>\n                  <div class=\"label-text\">Admin</div>\n                </template>\n              </v-checkbox>\n              <span class=\"chkbx-li__subtitle\">Full access to EdgeFist Studio. Can read and write to projects, datasets, trainer, validation, automation, and task board.</span>\n            </div>\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"auditor\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n                :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n              >\n                <template #label>\n                  <div class=\"label-text\">Audit & Label</div>\n                </template>\n              </v-checkbox>\n              <span class=\"chkbx-li__subtitle\">Limited access to EdgeFist Studio. Can only perform auditing and labelling in task board.</span>\n            </div>\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"user\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n                :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n              >\n                <template #label>\n                  <div class=\"label-text\">Custom</div>\n                </template>\n              </v-checkbox>\n              <span class=\"chkbx-li__subtitle\">Customize access to EdgeFist Studio for specific usage.</span>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div v-else class=\"row mt-3\">\n        <label class=\"label required\">Role</label>\n        <div class=\"value permission-list\">\n          <div class=\"role-grid-single-row\">\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"super\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n                disabled\n              >\n                <template #label>\n                  <div class=\"label-text\">Super</div>\n                </template>\n              </v-checkbox>\n            </div>\n          </div>\n        </div>\n      </div>\n      <template v-if=\"presetRole === 'user'\">\n        <div class=\"row mt-3\">\n          <label class=\"label\">Project</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.project_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.project_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <label class=\"label\">Dataset</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.dataset_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.dataset_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <label class=\"label\">Trainer</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.trainer_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.trainer_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <label class=\"label\">Task Board</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.annotator_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.annotator_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"user.role !== 'admin' && user.role !== 'super'\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n      </template>\n      <!-- <div class=\"row mt-4\">\n          <label class=\"label required\">Role</label>\n          <div class=\"value\">\n            <select\n              v-model=\"role\"\n              class=\"select\"\n            >\n              <option v-for=\"option in roles\" :key=\"`access-select-${option.id}`\" :value=\"option.value\">\n                {{ option.name }}\n              </option>\n            </select>\n          </div>\n        </div> -->\n      <div v-if=\"message\" class=\"row mt-2\">\n        <label class=\"label\" />\n        <div class=\"value\" :class=\"{ 'error-text': isError, 'success-text' : !isError }\">{{ message }}</div>\n      </div>\n      <div class=\"row mt-3 footer\">\n        <button class=\"button button-sm rounded\" @click.stop=\"applyChanges\">Apply</button>\n        <span @click.stop=\"$router.go(-1)\">Cancel</span>\n      </div>\n\n      <span class=\"header\">Change Password</span>\n      <div class=\"row mt-3\">\n        <label class=\"label\">Password</label>\n        <div class=\"value\">\n          <input\n            v-model=\"password\"\n            class=\"select\"\n            type=\"password\"\n            :class=\"{ 'error' : errorPassword }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label\">Confirm Password</label>\n        <div class=\"value\">\n          <input\n            v-model=\"confirmPassword\"\n            class=\"select\"\n            type=\"password\"\n            :class=\"{ 'error' : errorConfirmPassword }\"\n          >\n        </div>\n      </div>\n      <div v-if=\"passwordMessage\" class=\"row mt-2\">\n        <label class=\"label\" />\n        <div class=\"value\" :class=\"{ 'error-text': passwordError, 'success-text' : !passwordError }\">{{ passwordMessage }}</div>\n      </div>\n      <div class=\"row mt-3 footer\">\n        <button class=\"button button-sm rounded\" @click.stop=\"changePassword\">Apply</button>\n        <span @click.stop=\"$router.go(-1)\">Cancel</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'EditUser',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      password: '',\n      errorPassword: false,\n      confirmPassword: '',\n      errorConfirmPassword: false,\n      username: '',\n      errorUsername: false,\n      firstname: '',\n      errorFirstname: false,\n      lastname: '',\n      errorLastname: false,\n      message: '',\n      errorRole: false,\n      email: '',\n      errorEmail: false,\n      backendError: false,\n      passwordMessage: '',\n      presetRole: 'admin',\n      permissions: {\n        project_read: false,\n        project_write: false,\n        dataset_read: false,\n        dataset_write: false,\n        trainer_read: false,\n        trainer_write: false,\n        annotator_read: false,\n        annotator_write: false,\n      },\n    };\n  },\n  computed: {\n    isAdmin() {\n      return this.user.role === 'admin';\n    },\n    isSuper() {\n      return this.user.role === 'super';\n    },\n    isError() {\n      return this.errorUsername || this.errorRole || this.errorEmail || this.backendError || this.errorFirstname || this.errorLastname;\n    },\n    passwordError() {\n      return this.errorConfirmPassword || this.errorPassword;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n  },\n  watch: {\n    permissions: {\n      deep: true,\n      handler() {\n        Object.values(this.permissions).forEach((type) => {\n          if (type.canWrite) {\n            Object.keys(type).forEach((key) => {\n              type[key] = true;\n            });\n          }\n        });\n      },\n    },\n  },\n  async created() {\n    if (this.$route.query.editUser) {\n      this.getExistingUser(this.$route.query.editUser);\n      this.getUserPermissions(this.$route.query.editUser);\n    }\n  },\n  methods: {\n    async getUserPermissions(u) {\n      await this.dsConn.getUserPermissions({ username: u })\n        .then(async (data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          }\n        })\n        .catch((e) => { this.message = e; });\n    },\n\n    async getExistingUser(u) {\n      await this.dsConn.checkForUser({ username: u })\n        .then(async (data) => {\n          if (data.result) {\n            this.username = data.result.username;\n            this.firstname = data.result.first_name;\n            this.lastname = data.result.last_name;\n            this.email = data.result.email;\n            this.presetRole = data.result.role;\n          } else {\n            this.message = data.error.message;\n          }\n        })\n        .catch((e) => { this.message = e; });\n    },\n    resetErrors() {\n      this.errorRole = false;\n      this.errorEmail = false;\n      this.backendError = false;\n      this.errorFirstname = false;\n      this.errorLastname = false;\n    },\n    async changePassword() {\n      this.errorConfirmPassword = false;\n      this.errorPassword = false;\n      this.passwordMessage = \"\";\n      let tempMessage = \"No changes made\";\n      // should separate each field then make optional checks on BE\n      if ((this.password !== '' || this.confirmPassword !== '') && this.password !== this.confirmPassword) {\n        this.errorPassword = true;\n        this.errorConfirmPassword = true;\n        tempMessage = 'Confirm password does not match password.';\n        this.message = tempMessage;\n      } else if (this.password !== '' && this.confirmPassword !== '' && this.password === this.confirmPassword) {\n        await this.dsConn.updateUserPasswordAuth({ username: this.username, password: this.password })\n          .then((resp) => {\n            if (resp.result) {\n              this.errorPassword = false;\n              tempMessage = 'Successfully updated password';\n            } else {\n              this.errorPassword = true;\n              tempMessage = resp.error.message;\n            }\n          })\n          .catch((e) => {\n            this.errorPassword = true;\n            tempMessage = e;\n          });\n      }\n      this.passwordMessage = tempMessage;\n    },\n    async applyChanges() {\n      this.resetErrors();\n      this.message = \"\";\n\n      let tempMessage = \"No changes made\";\n\n      if (!this.username) {\n        this.errorUsername = true;\n        this.message = 'Missing username field.';\n        return;\n      }\n\n      if (!this.firstname) {\n        this.errorFirstname = true;\n        this.message = 'Missing first name field.';\n        return;\n      }\n\n      if (!this.lastname) {\n        this.errorLastname = true;\n        this.message = 'Missing last name field.';\n        return;\n      }\n      const params = {\n        username: this.username,\n        last_name: this.lastname,\n        first_name: this.firstname,\n        email: this.email,\n        role: this.presetRole,\n        permissions: {},\n      };\n      if (this.presetRole === 'admin') {\n        params.permissions.project_read = true;\n        params.permissions.project_write = true;\n        params.permissions.dataset_read = true;\n        params.permissions.dataset_write = true;\n        params.permissions.trainer_read = true;\n        params.permissions.trainer_write = true;\n        params.permissions.annotator_read = true;\n        params.permissions.annotator_write = true;\n      } else if (this.presetRole === 'auditor') {\n        params.permissions.project_read = true;\n        params.permissions.project_write = false;\n        params.permissions.dataset_read = false;\n        params.permissions.dataset_write = false;\n        params.permissions.trainer_read = false;\n        params.permissions.trainer_write = false;\n        params.permissions.annotator_read = true;\n        params.permissions.annotator_write = true;\n      } else if (this.presetRole === 'user') {\n        params.permissions = this.permissions;\n      }\n\n      await this.dsConn.updateUser(params)\n        .then(async (data) => {\n          if (data.result) {\n            this.backendError = false;\n            tempMessage = 'Successfully updated user';\n\n            if (this.user.username === this.username) {\n              // user is logged in, refresh data\n              const newUserObj = { ...this.user };\n              newUserObj.last_name = this.lastname;\n              newUserObj.first_name = this.firstname;\n              newUserObj.email = this.email;\n              newUserObj.role = this.presetRole;\n              this.$store.commit('user/setUser', newUserObj);\n            }\n          } else {\n            this.backendError = true;\n            tempMessage = 'Could not update user information';\n          }\n        })\n        .catch((e) => {\n          this.backendError = true;\n          tempMessage = e.message;\n        });\n\n      this.message = tempMessage;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.main-page {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n  margin-bottom: 10px;\n}\n\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  height: 100%;\n  padding: 30px;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row:nth-child(n + 6):not(:nth-last-child(-n + 3)) > .label {\n  align-items: start !important;\n  margin-top: 10px !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr 1fr;\n  grid-auto-rows: auto;\n  width: 100%;\n}\n\n.label-text {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin-left: 2px;\n  width: 100px;\n}\n\n:deep(.v-label) {\n  opacity: 1 !important;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n</style>\n","import { render } from \"./EditUser.vue?vue&type=template&id=1f4225f0&scoped=true\"\nimport script from \"./EditUser.vue?vue&type=script&lang=js\"\nexport * from \"./EditUser.vue?vue&type=script&lang=js\"\n\nimport \"./EditUser.vue?vue&type=style&index=0&id=1f4225f0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1f4225f0\"]])\n\nexport default __exports__","<template>\n  <router-view />\n</template>\n\n<script>\n\nexport default {\n  name: 'OrganizationSettingsLanding',\n};\n</script>\n","import { render } from \"./Landing.vue?vue&type=template&id=64af53bc\"\nimport script from \"./Landing.vue?vue&type=script&lang=js\"\nexport * from \"./Landing.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <div class=\"main-page scrollbar\">\n    <div class=\"settings\">\n      <span class=\"header\">Edit Organization Information</span>\n\n      <div class=\"row mt-4\">\n        <label class=\"label required\">Name</label>\n        <div class=\"value\">\n          <input\n            v-model=\"name\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorName }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-4\">\n        <label class=\"label\">Street</label>\n        <div class=\"value\">\n          <input\n            v-model=\"street\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorStreet }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-4\">\n        <label class=\"label\">City</label>\n        <div class=\"value\">\n          <input\n            v-model=\"city\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorCity }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-4\">\n        <label class=\"label\">Country</label>\n        <div class=\"value\">\n          <input\n            v-model=\"country\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorCountry }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-4\">\n        <label class=\"label\">Contact Name</label>\n        <div class=\"value\">\n          <input\n            v-model=\"contactName\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorContactName }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-4\">\n        <label class=\"label\">Contact Email</label>\n        <div class=\"value\">\n          <input\n            v-model=\"contactEmail\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorContactEmail }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-4\">\n        <label class=\"label\">Contact Phone</label>\n        <div class=\"value\">\n          <input\n            v-model=\"contactPhone\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorContactPhone }\"\n          >\n        </div>\n      </div>\n      <div v-if=\"message\" class=\"row mt-2\">\n        <label class=\"label\" />\n        <div\n          class=\"value\"\n          :class=\"{ 'error-text': isError, 'success-text' : !isError }\"\n        >\n          {{ message }}\n        </div>\n      </div>\n      <div class=\"row mt-3 footer\">\n        <button class=\"button button-sm rounded\" @click.stop=\"editOrg()\">Apply</button>\n        <span @click.stop=\"$router.go(-1)\">Cancel</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'EditOrganization',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      orgId: null,\n      name: '',\n      errorName: false,\n      errorStreet: false,\n      errorCity: false,\n      errorCountry: false,\n      errorContactName: false,\n      errorContactEmail: false,\n      errorContactPhone: false,\n      street: '',\n      city: '',\n      country: '',\n      contactName: '',\n      contactEmail: '',\n      contactPhone: '',\n      message: '',\n      packages: [],\n      pack: '',\n      backendError: false,\n    };\n  },\n  computed: {\n    isError() {\n      return this.errorName || this.errorStreet || this.errorCity || this.errorCountry || this.errorContactName || this.errorContactEmail || this.errorContactPhone || this.backendError;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    paidPackage() {\n      return this.pack && this.pack !== 'free';\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'admin');\n    },\n    isSuper() {\n      return this.user && (this.user.role === 'super');\n    },\n  },\n  async created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    this.getAllPackages();\n    if (this.$route.query.org) {\n      this.orgId = parseInt(this.$route.query.org);\n      this.getOrg();\n    }\n  },\n  methods: {\n    async getAllPackages() {\n      await this.dsConn.getPackageList()\n        .then((data) => {\n          if (data.result) {\n            this.packages = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getOrg() {\n      await this.dsConn.getOrg({ organization_id: this.orgId })\n        .then((data) => {\n          if (data.result) {\n            this.name = data.result.name;\n            this.street = data.result.street;\n            this.city = data.result.city;\n            this.country = data.result.country;\n            this.contactName = data.result.contact_name;\n            this.contactEmail = data.result.contact_email;\n            this.contactPhone = data.result.contact_phone;\n            this.pack = data.result.package_name;\n          } else {\n            this.message = data.error.message;\n          }\n        })\n        .catch((e) => { this.message = e; });\n    },\n    resetErrors() {\n      this.errorName = false;\n      this.errorStreet = false;\n      this.errorCity = false;\n      this.errorCountry = false;\n      this.errorContactName = false;\n      this.errorContactEmail = false;\n      this.errorContactPhone = false;\n      this.backendError = false;\n    },\n    async editOrg() {\n      this.resetErrors();\n      if (!this.name) {\n        this.errorName = true;\n        this.message = 'Missing Organization name.';\n        return;\n      }\n      const params = {\n        name: this.name,\n        organization_id: this.orgId,\n      };\n      if (this.street) {\n        params.street = this.street;\n      }\n      if (this.city) {\n        params.city = this.city;\n      }\n      if (this.country) {\n        params.country = this.country;\n      }\n      if (this.contactName) {\n        params.contact_name = this.contactName;\n      }\n      if (this.contactEmail) {\n        params.contact_email = this.contactEmail;\n      }\n      if (this.contactPhone) {\n        params.contact_phone = this.contactPhone;\n      }\n      await this.dsConn.updateOrg(params)\n        .then((data) => {\n          if (data.result) {\n            const temp = { ...this.user };\n            temp.organization_id = data.result.id;\n            temp.organization = data.result;\n            this.$store.commit('user/setUser', temp);\n            this.backendError = false;\n            this.message = 'Successfully updated organization info.';\n          } else {\n            this.backendError = true;\n            this.message = 'Could not update organization info.';\n          }\n        })\n        .catch((e) => {\n          this.message = e;\n        });\n    },\n    async editPaidOrg() {\n      this.resetErrors();\n      if (!this.name) {\n        this.errorName = true;\n        this.message = 'Missing Organization name.';\n        return;\n      }\n      if (!this.street) {\n        this.errorStreet = true;\n        this.message = 'Missing Street.';\n        return;\n      }\n      if (!this.city) {\n        this.errorCity = true;\n        this.message = 'Missing City.';\n        return;\n      }\n      if (!this.country) {\n        this.errorCountry = true;\n        this.message = 'Missing Country.';\n        return;\n      }\n      if (!this.contactName) {\n        this.errorContactName = true;\n        this.message = 'Missing Contact Name.';\n        return;\n      }\n      if (!this.contactEmail) {\n        this.errorContactEmail = true;\n        this.message = 'Missing Contact Email.';\n        return;\n      }\n      if (!this.contactPhone) {\n        this.errorContactPhone = true;\n        this.message = 'Missing Contact Phone.';\n        return;\n      }\n      const params = {\n        name: this.name,\n        organization_id: this.orgId,\n        street: this.street,\n        city: this.city,\n        country: this.country,\n        contact_name: this.contactName,\n        contact_email: this.contactEmail,\n        contact_phone: this.contactPhone,\n      };\n      await this.dsConn.updateOrg(params)\n        .then((data) => {\n          if (data.result) {\n            const temp = { ...this.user };\n            temp.organization_id = data.result.id;\n            temp.organization = data.result;\n            this.$store.commit('user/setUser', temp);\n            this.backendError = false;\n            this.message = 'Successfully updated organization info.';\n          } else {\n            this.backendError = true;\n            this.message = 'Could not update organization info.';\n          }\n        })\n        .catch((e) => {\n          this.message = e;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.main-page {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n}\n\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  height: 100%;\n  padding: 30px;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: repeat(auto-fill, 200px);\n  grid-auto-rows: auto;\n  width: 100%;\n  overflow-y: auto;\n}\n</style>\n","import { render } from \"./EditOrganization.vue?vue&type=template&id=e4769a98&scoped=true\"\nimport script from \"./EditOrganization.vue?vue&type=script&lang=js\"\nexport * from \"./EditOrganization.vue?vue&type=script&lang=js\"\n\nimport \"./EditOrganization.vue?vue&type=style&index=0&id=e4769a98&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e4769a98\"]])\n\nexport default __exports__","<template>\n  <div class=\"main-page scrollbar\">\n    <div class=\"settings\">\n      <span class=\"header\">Security Settings</span>\n\n      <div class=\"row mt-4\">\n        <label class=\"label required\">Image Limit</label>\n        <div class=\"value\">\n          <input\n            v-model=\"imageLimit\"\n            class=\"select\"\n            type=\"number\"\n            min=\"0\"\n          >\n        </div>\n      </div>\n      <div v-if=\"message\" class=\"row mt-2\">\n        <label class=\"label\" />\n        <div\n          class=\"value\"\n          :class=\"{ 'error-text': hasError, 'success-text' : !hasError }\"\n        >\n          {{ message }}\n        </div>\n      </div>\n      <div class=\"row mt-3 footer\">\n        <button class=\"button button-sm rounded\" :disabled=\"!hasChanges\" @click.stop=\"apply()\">Apply</button>\n        <span @click.stop=\"$router.go(-1)\">Cancel</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'OrganizationSecuritySettings',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      orgId: null,\n      imageLimit: 0,\n      originalImageLimit: 0,\n      message: '',\n      hasError: false,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'admin');\n    },\n    isSuper() {\n      return this.user && (this.user.role === 'super');\n    },\n    hasChanges() {\n      if (this.imageLimit !== this.originalImageLimit) {\n        return true;\n      }\n\n      return false;\n    },\n  },\n  async created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    if (this.$route.query.org) {\n      this.orgId = parseInt(this.$route.query.org);\n      this.getOrgDataImageLimit();\n    }\n  },\n  methods: {\n    async getOrgDataImageLimit() {\n      await this.dsConn.getOrgDataField({ key: \"image-limit\" })\n        .then((data) => {\n          if (!data.error) {\n            if (data.result) {\n              this.imageLimit = parseInt(data.result, 10);\n              this.originalImageLimit = parseInt(data.result, 10);\n            } else {\n              this.imageLimit = 0;\n              this.originalImageLimit = 0;\n            }\n          } else {\n            this.hasError = true;\n            this.message = data.error.message;\n          }\n        })\n        .catch((e) => { this.hasError = true; this.message = e; });\n    },\n    resetErrors() {\n      this.hasError = false;\n    },\n    async apply() {\n      this.resetErrors();\n      if (!this.imageLimit) {\n        this.imageLimit = 0;\n      }\n      const params = {\n        name: this.name,\n        key: \"image-limit\",\n        value: this.imageLimit.toString(),\n      };\n      await this.dsConn.setOrgDataField(params)\n        .then((data) => {\n          if (data.result) {\n            this.hasError = false;\n            this.message = 'Successfully updated image limit';\n            this.originalImageLimit = this.imageLimit;\n          } else {\n            this.hasError = true;\n            this.message = 'Could not update image limit.';\n          }\n          this.$store.commit('notifications/updateNotifications', true);\n        })\n        .catch((e) => {\n          this.hasError = true;\n          this.message = e;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.main-page {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n}\n\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  height: 100%;\n  padding: 30px;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: repeat(auto-fill, 200px);\n  grid-auto-rows: auto;\n  width: 100%;\n  overflow-y: auto;\n}\n</style>\n","import { render } from \"./OrganizationSecuritySettings.vue?vue&type=template&id=eff42026&scoped=true\"\nimport script from \"./OrganizationSecuritySettings.vue?vue&type=script&lang=js\"\nexport * from \"./OrganizationSecuritySettings.vue?vue&type=script&lang=js\"\n\nimport \"./OrganizationSecuritySettings.vue?vue&type=style&index=0&id=eff42026&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-eff42026\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings scrollbar\">\n    <span class=\"header\">User Management</span>\n    <span v-if=\"isAdmin || isSuper\" class=\"user-table__header\">Manage users for your organization.</span>\n    <button v-if=\"isAdmin || isSuper\" class=\"button button-rounded create-button mt-3\" @click=\"navigateToCreateUser\">Create New User</button>\n    <div v-if=\"users && users.length > 0\" class=\"user-table\">\n      <div class=\"user-table__table\">\n        <div class=\"row header-row\">\n          <div\n            v-for=\"(h, i) in headers\"\n            :key=\"`header-cell-${i}`\"\n            class=\"header-cell\"\n            :class=\"{ 'col-3' : i <= 2, 'col-sm' : i > 2 }\"\n          >\n            {{ h }}\n          </div>\n          <div class=\"button-padding\" />\n        </div>\n        <div\n          v-for=\"(u, j) in users\"\n          :key=\"`user-row-${j}`\"\n          class=\"row mt-3 li-row\"\n        >\n          <div class=\"col-3 user-table__username\">\n            <span>{{ u['username'] }}</span>\n          </div>\n          <div class=\"col-3 user-table__access\">\n            {{ u['email'] }}\n          </div>\n          <div class=\"col-3 user-table__access\">\n            {{ u['role'] ? u['role'].charAt(0).toUpperCase() + u['role'].slice(1) : '' }}\n          </div>\n          <div class=\"button-padding\">\n            <IconButton\n              :class=\"{ invisible: (!isAdmin && !isSuper) || u.role === 'super' }\"\n              class=\"edit-btn icon\"\n              :icon=\"'edit'\"\n              :width=\"22\"\n              :height=\"22\"\n              @click=\"navigateToEditUser(u)\"\n            />\n            <IconButton\n              :class=\"{ invisible: (!isAdmin && !isSuper) || u.username === user.username || u.role === 'super' }\"\n              class=\"close-btn icon\"\n              :icon=\"'close'\"\n              :width=\"22\"\n              :height=\"22\"\n              @click=\"openConfirmDeleteUserModal(u)\"\n            />\n          </div>\n        </div>\n        <div class=\"row footer-row\" />\n      </div>\n    </div>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"'Delete'\"\n    @confirmed=\"removeUser\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport IconButton from '@/components/IconButton.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\n\nexport default {\n  name: 'UserManagement',\n  components: {\n    IconButton,\n    ConfirmModal,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      users: [\n      ],\n      org: null,\n      allRoles: [],\n      confirmMessage: null,\n      confirmMessageHeader: null,\n    };\n  },\n  computed: {\n    headers() {\n      return ['User', 'E-mail', 'Role'];\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'admin');\n    },\n    isSuper() {\n      return this.user && (this.user.role === 'super');\n    },\n  },\n  created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    this.getUsers();\n    this.getAllRoles();\n  },\n  methods: {\n    openConfirmDeleteUserModal(u) {\n      this.confirmMessage = `Are you sure you want to remove user \"${u.username}\"?`;\n      this.confirmMessageHeader = 'Remove User';\n      this.toDelete = u;\n      this.$refs.confirmModal.showModal();\n    },\n    async getAllRoles() {\n      await this.dsConn.getAllRoles()\n        .then((data) => {\n          this.allRoles = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getUsers() {\n      await this.dsConn.getUserListByOrganization({ organization_id: this.user.organization_id })\n        .then((data) => {\n          if (data.result) {\n            this.users = data.result.reverse();\n          }\n        }).catch((e) => console.log(e));\n    },\n    navigateToCreateUser() {\n      this.$router.push({ name: 'admin.people.newuser', query: { org: this.user.organization_id } });\n    },\n    navigateToEditUser(u) {\n      this.$router.push({ name: 'admin.people.edituser', query: { editUser: u.username } });\n    },\n    async removeUser() {\n      await this.dsConn.deleteUser({ username: this.toDelete.username })\n        .then(async (data) => {\n          if (!data.error) {\n            this.toDelete = null;\n            await this.getUsers();\n          }\n        }).catch((e) => console.log(e));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.create-button {\n  width: fit-content;\n}\n.user-table {\n  display: flex;\n  flex-direction: column;\n  border-radius: 10px;\n  width: 100%;\n  padding-top: 20px;\n  padding-left: 30px;\n  padding-right: 30px;\n\n  &__header {\n    font-size: 0.9rem;\n  }\n\n  &__table {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin: 15px 15px 15px 15px;\n\n    .header-row {\n      font-weight: 700;\n      border-bottom: 2px solid rgba(96, 95, 95, 0.5);\n    }\n\n    .footer-row {\n      min-height: 10px;\n      border-bottom: 2px solid rgba(96, 95, 95, 0.5);\n    }\n  }\n\n  &__username {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    span:nth-child(2) {\n      font-size: 0.9rem;\n      padding-left: 20px;\n      color: rgba(grey, 0.9)\n    }\n  }\n\n  &__package {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n  }\n\n  &__access {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n  }\n\n}\n\n.button-padding {\n  display: flex;\n  flex-direction: row;\n  width: 100px;\n}\n\n.li-row {\n  padding: 5px;\n  border-radius: 8px;\n  align-items: center;\n}\n\n.li-row:hover {\n  background-color: rgba(140, 140, 140, 0.2);\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 1.0rem;\n  font-weight: 600;\n  color: rgba(grey, 1.0)\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 1.0rem;\n  margin-left: 20px;\n}\n\n.icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: none;\n  border: none;\n  border-radius: 4px;\n  margin-left: auto;\n  cursor: pointer;\n}\n\n.icon + .icon {\n  margin-left: 10px;\n}\n\n.edit-btn:hover {\n  background: none !important;\n  box-shadow: none !important;\n  color: $color-primary-400;\n}\n\n.close-btn:hover {\n  background: none !important;\n  box-shadow: none !important;\n  color: $color-red-400;\n}\n\n.invisible {\n  visibility: hidden;\n}\n</style>\n","<template>\n  <Teleport :to=\"'body'\">\n    <Modal\n      ref=\"confirmModal\"\n      v-model:show=\"isShown\"\n      class=\"confirm-modal\"\n      :width=\"'30%'\"\n      @keyup=\"handleKeyup\"\n    >\n      <template #modal-header>\n        <div class=\"header\">\n          <h2>\n            {{ messageHeader ? messageHeader : \"\" }}\n          </h2>\n        </div>\n      </template>\n      <template #modal-main>\n        <div class=\"body\">\n          <p class=\"confirm-text\">\n            {{ message ? message : \"\" }}\n          </p>\n          <p class=\"confirm-text-note\">\n            {{ note ? note : \"\" }}\n          </p>\n        </div>\n      </template>\n      <template #modal-footer>\n        <div class=\"footer\">\n          <button\n            class=\"button modal-cancel-button\"\n            @click=\"handleCancelClicked\"\n          >\n            Cancel\n          </button>\n          <button\n            v-if=\"buttonText && buttonText !== ''\"\n            class=\"button modal-action-button\"\n            :class=\"buttonClass\"\n            @click=\"handleMainButtonClicked\"\n          >\n            {{ buttonText }}\n          </button>\n        </div>\n      </template>\n    </Modal>\n  </Teleport>\n</template>\n\n<script>\nimport Modal from './Modal.vue';\n\nexport default {\n  name: 'ConfirmModal',\n  components: {\n    Modal,\n  },\n  props: {\n    messageHeader: {\n      type: String,\n      default: '',\n    },\n    message: {\n      type: String,\n      default: '',\n    },\n    note: {\n      type: String,\n      default: '',\n    },\n    buttonClass: {\n      type: String,\n      default: '',\n    },\n    buttonText: {\n      type: String,\n      default: '',\n    },\n    show: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'confirmed',\n  ],\n  data() {\n    return {\n      isShown: false,\n    };\n  },\n  watch: {\n    isShown() {\n      if (this.isShown) {\n        window.addEventListener('keyup', this.handleKeyup, true);\n      } else {\n        window.removeEventListener('keyup', this.handleKeyup, true);\n      }\n    },\n    show() {\n      if (this.show) {\n        this.$refs.confirmModal.showModal();\n      } else {\n        this.$refs.confirmModal.closeModal();\n      }\n    },\n  },\n  beforeUnmount() {\n    window.removeEventListener('keyup', this.handleKeyup, true);\n  },\n  methods: {\n    showModal() {\n      this.$refs.confirmModal.showModal();\n    },\n    handleCancelClicked() {\n      this.$refs.confirmModal.closeModal();\n    },\n    handleSubmit() {\n      this.$emit('confirmed');\n      this.$refs.confirmModal.closeModal();\n    },\n    handleMainButtonClicked() {\n      this.handleSubmit();\n    },\n    handleKeyup(event) {\n      switch (event.key) {\n      case 'Enter':\n        event.stopPropagation();\n        this.handleSubmit();\n        break;\n      default:\n        break;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.body {\n  display: flex;\n  flex-direction: column;\n  padding: 0.75rem 2rem;\n\n  p + p {\n    margin-top: 5px;\n  }\n\n  z-index: 1500;\n}\n\n.confirm-text {\n  height: fit-content;\n  display: flex;\n  font-size: 1.1rem;\n  font-weight: 500;\n  word-break: break-word;\n  text-align: left;\n}\n\n.confirm-text-note {\n  height: fit-content;\n  display: flex;\n  font-size: 0.9rem;\n  font-weight: 400;\n  word-break: break-word;\n  text-align: left;\n  color: var(--gray-600)\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 2rem;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n</style>\n","import { render } from \"./ConfirmModal.vue?vue&type=template&id=29b4bdeb&scoped=true\"\nimport script from \"./ConfirmModal.vue?vue&type=script&lang=js\"\nexport * from \"./ConfirmModal.vue?vue&type=script&lang=js\"\n\nimport \"./ConfirmModal.vue?vue&type=style&index=0&id=29b4bdeb&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-29b4bdeb\"]])\n\nexport default __exports__","import { render } from \"./UserManagement.vue?vue&type=template&id=31ce796b&scoped=true\"\nimport script from \"./UserManagement.vue?vue&type=script&lang=js\"\nexport * from \"./UserManagement.vue?vue&type=script&lang=js\"\n\nimport \"./UserManagement.vue?vue&type=style&index=0&id=31ce796b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-31ce796b\"]])\n\nexport default __exports__","<template>\n  <div class=\"main-page scrollbar\">\n    <div class=\"settings\">\n      <span class=\"header\">Organization Information</span>\n      <div class=\"row mt-3\">\n        <div class=\"label\">Name</div>\n        <div class=\"value\">{{ name }}</div>\n      </div>\n      <div class=\"row mt-2\">\n        <div class=\"label\">Street</div>\n        <div class=\"value\">{{ street }}</div>\n      </div>\n      <div class=\"row mt-2\">\n        <div class=\"label\">City</div>\n        <div class=\"value\">{{ city }}</div>\n      </div>\n      <div class=\"row mt-2\">\n        <div class=\"label\">Country</div>\n        <div class=\"value\">{{ country }}</div>\n      </div>\n      <div class=\"row mt-2\">\n        <div class=\"label\">Contact Name</div>\n        <div class=\"value\">{{ contactName }}</div>\n      </div>\n      <div class=\"row mt-2\">\n        <div class=\"label\">Contact Email</div>\n        <div class=\"value\">{{ contactEmail }}</div>\n      </div>\n      <div class=\"row mt-2\">\n        <div class=\"label\">Contact Phone</div>\n        <div class=\"value\">{{ contactPhone }}</div>\n      </div>\n      <div v-if=\"isSuper || isAdmin\" class=\"row mt-3 footer\">\n        <button class=\"button button-sm rounded\" @click.stop=\"navigateToEditOrg\">Edit</button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'OrganizationSettings',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      users: [\n      ],\n      name: '',\n      street: '',\n      city: '',\n      country: '',\n      contactName: '',\n      contactEmail: '',\n      contactPhone: '',\n      allRoles: [],\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && this.user.role === 'admin';\n    },\n    isSuper() {\n      return this.user && this.user.role === 'super';\n    },\n  },\n  created() {\n    this.getOrg();\n  },\n  methods: {\n    async getOrg() {\n      await this.dsConn.getOrg({ organization_id: this.user.organization_id })\n        .then((data) => {\n          if (data.result) {\n            this.name = data.result.name;\n            this.street = data.result.street;\n            this.city = data.result.city;\n            this.country = data.result.country;\n            this.contactName = data.result.contact_name;\n            this.contactEmail = data.result.contact_email;\n            this.contactPhone = data.result.contact_phone;\n          } else {\n            this.message = data.error.message;\n          }\n        })\n        .catch((e) => { this.message = e; });\n    },\n    navigateToEditOrg() {\n      this.$router.push({ name: 'admin.organization.editorg', query: { org: this.user.organization_id } });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.main-page {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n}\n\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  height: 100%;\n  padding: 30px;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n.user-table {\n  display: flex;\n  flex-direction: column;\n  border-radius: 10px;\n  width: 1200px;\n  padding-top: 20px;\n  padding-left: 30px;\n  padding-right: 30px;\n\n  &__header {\n    font-size: 0.9rem;\n  }\n\n  &__table {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin: 15px 15px 15px 15px;\n\n    .header-row {\n      font-weight: 700;\n      border-bottom: 2px solid rgba(96, 95, 95, 0.5);\n    }\n\n    .footer-row {\n      min-height: 10px;\n      border-bottom: 2px solid rgba(96, 95, 95, 0.5);\n    }\n  }\n\n  &__username {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    span:nth-child(2) {\n      font-size: 0.9rem;\n      padding-left: 20px;\n      color: rgba(grey, 0.9)\n    }\n  }\n\n  &__package {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n  }\n\n  &__access {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n  }\n\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 1.0rem;\n  font-weight: 600;\n  color: rgba(grey, 1.0)\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 1.0rem;\n  margin-left: 20px;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-start;\n  button {\n    margin-left: 30px;\n    width: fit-content\n  }\n}\n</style>\n","import { render } from \"./OrganizationSettings.vue?vue&type=template&id=02884ac2&scoped=true\"\nimport script from \"./OrganizationSettings.vue?vue&type=script&lang=js\"\nexport * from \"./OrganizationSettings.vue?vue&type=script&lang=js\"\n\nimport \"./OrganizationSettings.vue?vue&type=style&index=0&id=02884ac2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-02884ac2\"]])\n\nexport default __exports__","<template>\n  <div class=\"main-page scrollbar\">\n    <div class=\"settings\">\n      <span class=\"header\">Add New User</span>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">First Name</label>\n        <div class=\"value\">\n          <input\n            v-model=\"firstname\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorFirstName }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Last Name</label>\n        <div class=\"value\">\n          <input\n            v-model=\"lastname\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorLastName }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">New Username</label>\n        <div class=\"value\">\n          <input\n            v-model=\"username\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorUsername }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Password</label>\n        <div class=\"value\">\n          <input\n            v-model=\"password\"\n            class=\"select\"\n            type=\"password\"\n            :class=\"{ 'error' : errorPassword }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Confirm Password</label>\n        <div class=\"value\">\n          <input\n            v-model=\"confirmPassword\"\n            class=\"select\"\n            type=\"password\"\n            :class=\"{ 'error' : errorConfirmPassword }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Email</label>\n        <div class=\"value\">\n          <input\n            v-model=\"email\"\n            class=\"select\"\n            type=\"text\"\n            :class=\"{ 'error' : errorEmail }\"\n          >\n        </div>\n      </div>\n      <div class=\"row mt-3\">\n        <label class=\"label required\">Role</label>\n        <div class=\"value permission-list\">\n          <div class=\"role-grid-single-row\">\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"admin\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n              >\n                <template #label>\n                  <div class=\"label-text\">Admin</div>\n                </template>\n              </v-checkbox>\n              <span class=\"chkbx-li__subtitle\">Full access to EdgeFist Studio. Can read and write to projects, datasets, trainer, validation, automation, and task board.</span>\n            </div>\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"auditor\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n              >\n                <template #label>\n                  <div class=\"label-text\">Audit & Label</div>\n                </template>\n              </v-checkbox>\n              <span class=\"chkbx-li__subtitle\">Limited access to EdgeFist Studio. Can only perform auditing and labelling in task board.</span>\n            </div>\n            <div class=\"chkbx-li\">\n              <v-checkbox\n                v-model=\"presetRole\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                value=\"user\"\n                :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                :true-icon=\"'mdi-circle-slice-8'\"\n              >\n                <template #label>\n                  <div class=\"label-text\">Custom</div>\n                </template>\n              </v-checkbox>\n              <span class=\"chkbx-li__subtitle\">Customize access to EdgeFist Studio for specific usage.</span>\n            </div>\n          </div>\n        </div>\n      </div>\n      <template v-if=\"presetRole === 'user'\">\n        <div class=\"row mt-3\">\n          <label class=\"label\">Project</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.project_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.project_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <label class=\"label\">Dataset</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.dataset_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.dataset_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <label class=\"label\">Trainer</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.trainer_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.trainer_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <label class=\"label\">Task Board</label>\n          <div class=\"value permission-list\">\n            <div class=\"role-grid\">\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.annotator_read\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Read</div>\n                  </template>\n                </v-checkbox>\n              </div>\n              <div class=\"chkbx-li\">\n                <v-checkbox\n                  v-model=\"permissions.annotator_write\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                >\n                  <template #label>\n                    <div class=\"label-text\">Write</div>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n          </div>\n        </div>\n      </template>\n      <div v-if=\"message\" class=\"row mt-3\">\n        <label class=\"label\" />\n        <div class=\"value\" :class=\"{ 'error-text': isError, 'success-text' : !isError }\">{{ message }}</div>\n      </div>\n      <div class=\"row mt-3 footer\">\n        <button class=\"button button-sm rounded\" @click.stop=\"createUser\">Add</button>\n        <span @click.stop=\"$router.go(-1)\">Back</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'CreateSecondaryUser',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      password: '',\n      errorPassword: false,\n      confirmPassword: '',\n      errorConfirmPassword: false,\n      username: '',\n      errorUsername: false,\n      firstname: '',\n      errorFirstName: false,\n      lastname: '',\n      errorLastName: false,\n      allRoles: [],\n      message: '',\n      errorRole: false,\n      email: '',\n      errorEmail: false,\n      backendError: false,\n      organization_id: 0,\n      presetRole: 'admin',\n      permissions: {\n        project_read: true,\n        project_write: false,\n        dataset_read: true,\n        dataset_write: false,\n        trainer_read: true,\n        trainer_write: false,\n        annotator_read: true,\n        annotator_write: false,\n      },\n    };\n  },\n  computed: {\n    isError() {\n      return this.errorPassword || this.errorUsername || this.errorFirstName || this.errorLastName || this.errorRole || this.errorEmail || this.backendError || this.errorConfirmPassword;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isSuper() {\n      return this.user.role === 'super';\n    },\n    isAdmin() {\n      return this.user.role === 'admin';\n    },\n  },\n  watch: {\n    permissions: {\n      deep: true,\n      handler() {\n        Object.values(this.permissions).forEach((type) => {\n          if (type.canWrite) {\n            Object.keys(type).forEach((key) => {\n              type[key] = true;\n            });\n          }\n        });\n      },\n    },\n  },\n  created() {\n    if (this.$route.query.org) {\n      this.organization_id = parseInt(this.$route.query.org);\n    } else {\n      this.$router.go(-1);\n    }\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n  },\n  methods: {\n    resetErrors() {\n      this.errorUsername = false;\n      this.errorLastName = false;\n      this.errorLastName = false;\n      this.errorRole = false;\n      this.errorConfirmPassword = false;\n      this.errorPassword = false;\n      this.errorEmail = false;\n      this.backendError = false;\n    },\n    async createUser() {\n      this.resetErrors();\n      this.message = \"\";\n      if (!this.username) {\n        this.errorUsername = true;\n        this.message = 'Missing username.';\n        return;\n      }\n      if (!this.firstname) {\n        this.errorFirstName = true;\n        this.message = 'Missing first name.';\n        return;\n      }\n      if (!this.lastname) {\n        this.errorLastName = true;\n        this.message = 'Missing last name.';\n        return;\n      }\n      if (!this.password) {\n        this.errorPassword = true;\n        this.message = 'Missing password.';\n        return;\n      }\n      if (!this.confirmPassword) {\n        this.errorConfirmPassword = true;\n        this.message = 'Missing confirm password.';\n        return;\n      }\n\n      if (this.password !== this.confirmPassword) {\n        this.errorPassword = true;\n        this.errorConfirmPassword = true;\n        this.message = 'Confirm password does not match password.';\n        return;\n      }\n      if (!this.email) {\n        this.errorEmail = true;\n        this.message = 'Missing email.';\n        return;\n      }\n\n      const params = {\n        organization_id: this.organization_id,\n        username: this.username,\n        last_name: this.lastname,\n        first_name: this.firstname,\n        password: this.password,\n        email: this.email,\n        role: this.presetRole,\n      };\n\n      if (this.presetRole === 'admin') {\n        params.permissions = {\n          project_read: true,\n          project_write: true,\n          dataset_read: true,\n          dataset_write: true,\n          trainer_read: true,\n          trainer_write: true,\n          annotator_read: true,\n          annotator_write: true,\n        };\n      } else if (this.presetRole === 'auditor') {\n        params.permissions = {\n          project_read: true,\n          project_write: false,\n          dataset_read: false,\n          dataset_write: false,\n          trainer_read: false,\n          trainer_write: false,\n          annotator_read: true,\n          annotator_write: true,\n        };\n      } else if (this.presetRole === 'user') {\n        params.permissions = this.permissions;\n      }\n\n      let message = '';\n\n      await this.dsConn.createUser(params)\n        .then(async (data) => {\n          if (!data.error) {\n            message = `User ${this.username} added successfully.`;\n          } else {\n            this.backendError = true;\n            message = data.error.message;\n          }\n        })\n        .catch((e) => {\n          this.backendError = true;\n          message = e;\n        });\n      this.message = message;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.main-page {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n  margin-bottom: 10px;\n}\n\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  height: 100%;\n  padding: 30px;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row:nth-child(n + 8) > .label {\n  align-items: start !important;\n  margin-top: 10px !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr 1fr;\n  grid-auto-rows: auto;\n  width: 100%;\n}\n\n.role-grid-single-row {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr;\n  grid-auto-rows: auto;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n\n.permission-list {\n  display: flex;\n  flex-direction: column !important;\n  width: 100%;\n\n  &__title {\n    margin: 5px 0 5px 0;\n    font-size: 1rem;\n    font-weight: 600;\n    color: rgba(rgb(0, 0, 0), 0.7);\n  }\n}\n\n.chkbx-li {\n  display: flex;\n  flex-direction: column;\n  align-items: start;\n\n  &__subtitle {\n    margin-left: 30px;\n    color: rgba(grey, 0.95);\n  }\n}\n\n.label-text {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin-left: 2px;\n  width: 100px;\n}\n\n:deep(.v-label) {\n  opacity: 1 !important;\n}\n\n.separator {\n  display: flex;\n  width: 100%;\n  align-items: center;\n  text-align: center;\n  font-weight: 700;\n  font-size: 0.75rem;\n  @include themify() {\n    color: themed('form-separator-color');\n    border-color: themed('form-separator-color');\n  }\n  &::before, &::after {\n    content: '';\n    flex: 1;\n    border-bottom: 1px solid;\n  }\n  &:not(:empty)::before {\n    margin-right: 1.5em;\n    margin-left: .25em;\n  }\n  &:not(:empty)::after {\n    margin-right: .25em;\n    margin-left: 1.5em;\n  }\n}\n</style>\n","import { render } from \"./CreateSecondaryUser.vue?vue&type=template&id=7b3a55c1&scoped=true\"\nimport script from \"./CreateSecondaryUser.vue?vue&type=script&lang=js\"\nexport * from \"./CreateSecondaryUser.vue?vue&type=script&lang=js\"\n\nimport \"./CreateSecondaryUser.vue?vue&type=style&index=0&id=7b3a55c1&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7b3a55c1\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings\">\n    <span class=\"header\">Organization Management</span>\n    <button v-if=\"isSuper\" class=\"button button-rounded create-button mt-3\" @click=\"navigateToCreateOrganization\">Create New Organization</button>\n    <div class=\"panels scrollbar\">\n      <div class=\"panel panel-header\">\n        <div class=\"panel__title\">\n          <div class=\"panel__title-text\">\n            <div class=\"row\">\n              <div class=\"col-3\">\n                <span>Org Name</span>\n              </div>\n              <div class=\"col-3\">\n                <span>Org Id</span>\n              </div>\n              <div class=\"col-3\">\n                <span>Contact Name</span>\n              </div>\n              <div class=\"col-3\">\n                <span>Contact Email</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div\n        v-for=\"(org, index) in allOrgs\"\n        :key=\"index\"\n        class=\"panel\"\n        @click=\"navigateToOrgDetails(org.id)\"\n      >\n        <div class=\"panel__title\">\n          <div class=\"panel__title-text\">\n            <div class=\"row\">\n              <div class=\"col-3\">\n                <span>{{ org.name }}</span>\n              </div>\n              <div class=\"col-3\">\n                <span>{{ org.id }}</span>\n              </div>\n              <div class=\"col-3\">\n                <span>{{ org.contact_name }}</span>\n              </div>\n              <div class=\"col-3\">\n                <span>{{ org.contact_email }}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'OrganizationManagement',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      allOrgs: [],\n      allRoles: [],\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      openedDropdowns: [],\n      dollarCreditRatio: 0.001,\n      selectMonth: '',\n      selectYear: 0,\n      message: '',\n      error: false,\n    };\n  },\n  computed: {\n    headers() {\n      return ['User', 'E-mail', 'Role'];\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'admin');\n    },\n    isSuper() {\n      return this.user && (this.user.role === 'super');\n    },\n    months() {\n      return [\n        'January', 'February', 'March', 'April', 'May', 'June',\n        'July', 'August', 'September', 'October', 'November', 'December',\n      ];\n    },\n    years() {\n      const currentYear = new Date().getFullYear();\n      const startingYear = 2023;\n      const years = [];\n      for (let year = startingYear; year <= currentYear; year++) {\n        years.push(year);\n      }\n\n      return years;\n    },\n  },\n  created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    this.getAllOrgs();\n    this.getAllRoles();\n  },\n  methods: {\n    async getAllOrgs() {\n      await this.dsConn.getOrgList()\n        .then((data) => {\n          this.allOrgs = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getAllRoles() {\n      await this.dsConn.getAllRoles()\n        .then((data) => {\n          this.allRoles = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getUsers(id) {\n      const resp = await this.dsConn.getUserListByOrganization({ organization_id: id })\n        .catch((error) => {\n          console.log('Failed to retrieve training sessions:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n\n      const users = resp.result.reverse();\n      return users;\n    },\n    navigateToCreateOrganization() {\n      this.$router.push({ name: 'super.neworg' });\n    },\n    navigateToOrgDetails(id) {\n      this.$router.push({ name: 'super.orgdetail', query: { org: id } });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.header-text{\n  display: flex;\n  flex-direction: column;\n  margin-top: 10px;\n  margin-left: 20px;\n\n  span {\n    width:fit-content;\n    font-weight: 600;\n    font-size: 1.0rem;\n  }\n}\n\n.create-button {\n    width: fit-content;\n  }\n\n.panel-header {\n}\n\n.panels {\n  background: var(--color-white-100);\n  padding: 10px;\n  border-radius: 10px;\n  margin: 10px 0;\n  overflow-y: auto;\n}\n\n.panel {\n  padding: 0 !important;\n\n  &__title-text {\n    display: flex;\n    width: 100%;\n    height: 100%;\n    margin: 0 10px 0 0;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n\n    .row {\n      width: 100%;\n    }\n\n  }\n\n  &__title {\n    height: 30px;\n    min-height: 0;\n    font-weight: 600;\n    border-radius: 0;\n  }\n\n}\n\n.panel:not(.panel-header):hover {\n  cursor: pointer;\n  background: var(--color-white-600);\n}\n\n.panel + .panel {\n  border-top: 0.5px solid grey;\n}\n</style>\n","import { render } from \"./OrganizationManagement.vue?vue&type=template&id=78b1f238&scoped=true\"\nimport script from \"./OrganizationManagement.vue?vue&type=script&lang=js\"\nexport * from \"./OrganizationManagement.vue?vue&type=script&lang=js\"\n\nimport \"./OrganizationManagement.vue?vue&type=style&index=0&id=78b1f238&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-78b1f238\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings scrollbar\">\n    <span class=\"header\">Create Organization</span>\n    <div class=\"row mt-4\">\n      <label class=\"label required\">Name</label>\n      <div class=\"value\">\n        <input\n          v-model=\"name\"\n          class=\"select\"\n          type=\"text\"\n          :class=\"{ 'error' : errorName }\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Street</label>\n      <div class=\"value\">\n        <input\n          v-model=\"street\"\n          class=\"select\"\n          type=\"text\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">City</label>\n      <div class=\"value\">\n        <input\n          v-model=\"city\"\n          class=\"select\"\n          type=\"text\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Country</label>\n      <div class=\"value\">\n        <input\n          v-model=\"country\"\n          class=\"select\"\n          type=\"text\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Contact Name</label>\n      <div class=\"value\">\n        <input\n          v-model=\"contactName\"\n          class=\"select\"\n          type=\"text\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Contact Email</label>\n      <div class=\"value\">\n        <input\n          v-model=\"contactEmail\"\n          class=\"select\"\n          type=\"text\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Contact Phone</label>\n      <div class=\"value\">\n        <input\n          v-model=\"contactPhone\"\n          class=\"select\"\n          type=\"text\"\n        >\n      </div>\n    </div>\n    <div v-if=\"message\" class=\"row mt-2\">\n      <label class=\"label\" />\n      <div class=\"value\" :class=\"{ 'error-text': isError, 'success-text' : !isError }\">{{ message }}</div>\n    </div>\n    <div class=\"row mt-3 footer\">\n      <button class=\"button button-sm rounded\" @click.stop=\"createOrg\">Create</button>\n      <span @click.stop=\"$router.go(-1)\">Cancel</span>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'AddNewOrganization',\n  components: {\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      name: '',\n      errorName: false,\n      isError: false,\n      street: '',\n      city: '',\n      country: '',\n      contactName: '',\n      contactEmail: '',\n      contactPhone: '',\n      message: '',\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isSuper() {\n      return this.user && (this.user.role === 'super');\n    },\n  },\n  created() {\n    if (!this.isSuper) {\n      this.$router.push('/login');\n    }\n  },\n  methods: {\n    async createOrg() {\n      this.isError = false;\n      if (!this.name) {\n        this.errorName = true;\n        this.message = 'Missing Organization name.';\n        return;\n      }\n      const params = {\n        name: this.name,\n        parent_username: this.user.username,\n      };\n      if (this.street) {\n        params.street = this.street;\n      }\n      if (this.city) {\n        params.city = this.city;\n      }\n      if (this.country) {\n        params.country = this.country;\n      }\n      if (this.contactName) {\n        params.contact_name = this.contactName;\n      }\n      if (this.contactEmail) {\n        params.contact_email = this.contactEmail;\n      }\n      if (this.contactPhone) {\n        params.contact_phone = this.contactPhone;\n      }\n      await this.dsConn.createOrg(params)\n        .then((data) => {\n          if (data.result) {\n            this.message = \"Organization created successfully.\";\n          } else {\n            this.message = data.error.message;\n            this.isError = false;\n          }\n        })\n        .catch((e) => {\n          this.message = e;\n          this.isError = false;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 600px;\n  min-width: 400px;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n</style>\n","import { render } from \"./AddNewOrganization.vue?vue&type=template&id=7e715806&scoped=true\"\nimport script from \"./AddNewOrganization.vue?vue&type=script&lang=js\"\nexport * from \"./AddNewOrganization.vue?vue&type=script&lang=js\"\n\nimport \"./AddNewOrganization.vue?vue&type=style&index=0&id=7e715806&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7e715806\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings scrollbar\">\n    <span class=\"header\">Add Funds</span>\n\n    <div class=\"row mt-4\">\n      <label class=\"label required\">Organization</label>\n      <div class=\"value\">\n        <input\n          v-model=\"orgName\"\n          class=\"select\"\n          type=\"text\"\n          disabled\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Amount ($)</label>\n      <div class=\"value\">\n        <input\n          v-model=\"amount\"\n          class=\"select\"\n          type=\"number\"\n          step=\"1\"\n          :class=\"{ 'error' : errorAmount }\"\n        >\n      </div>\n    </div>\n    <div v-if=\"message\" class=\"row mt-2\">\n      <label class=\"label\" />\n      <div\n        class=\"value\"\n        :class=\"{ 'error-text': isError, 'success-text' : !isError }\"\n      >\n        {{ message }}\n      </div>\n    </div>\n    <div class=\"row mt-3 footer\">\n      <button class=\"button button-sm rounded\" @click.stop=\"openConfirmModal()\">Apply</button>\n      <span @click.stop=\"$router.go(-1)\">Cancel</span>\n    </div>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"apply\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\n\nexport default {\n  name: 'UserAddCredits',\n  components: {\n    ConfirmModal,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      orgId: null,\n      orgName: '',\n      amount: 0,\n      errorAmount: null,\n      message: '',\n      backendError: false,\n      orgList: [],\n      confirmMessage: '',\n      confirmMessageHeader: '',\n      buttonText: '',\n    };\n  },\n  computed: {\n    isError() {\n      return this.errorAmount || this.backendError;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isSuper() {\n      return this.user.role === 'super';\n    },\n    isAdmin() {\n      return this.user.role === 'admin';\n    },\n  },\n  created() {\n    if (!this.isSuper) {\n      this.$router.push('/login');\n    }\n  },\n  async mounted() {\n    await this.getOrgList();\n    if (this.$route.query.org) {\n      this.orgId = parseInt(this.$route.query.org);\n      const org = this.orgList.find((e) => e.id === this.orgId);\n      if (org) {\n        this.orgName = org.name;\n      }\n    }\n  },\n  methods: {\n    async getOrgList() {\n      await this.dsConn.getOrgList()\n        .then((data) => {\n          if (data.result) {\n            this.orgList = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    resetErrors() {\n      this.errorAmount = false;\n      this.backendError = false;\n    },\n    openConfirmModal() {\n      this.confirmMessage = `Adding $ ${this.amount} to organization ${this.orgId} ?`;\n      this.confirmMessageHeader = 'Adding Funds';\n      this.buttonText = \"Confirm\";\n      this.$refs.confirmModal.showModal();\n    },\n    async apply() {\n      this.resetErrors();\n      if (!this.orgId) {\n        this.message = 'Missing Organization.';\n        return;\n      }\n      if (!this.amount) {\n        this.errorAmount = true;\n        this.message = 'Missing Amount.';\n        return;\n      }\n      const params = {\n        organization_id: this.orgId,\n        amount: this.amount,\n      };\n      await this.dsConn.purchaseCredits(params)\n        .then((data) => {\n          if (data.result) {\n            this.backendError = false;\n            this.message = `Successfully added $ ${this.amount} in credits`;\n          } else {\n            this.backendError = true;\n            this.message = `Could not add credits: ${data.error}`;\n          }\n        })\n        .catch((e) => {\n          this.message = e;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  min-width: 400px;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: repeat(auto-fill, 200px);\n  grid-auto-rows: auto;\n  width: 100%;\n  overflow-y: auto;\n}\n</style>\n","import { render } from \"./UserAddCredits.vue?vue&type=template&id=1e6bf942&scoped=true\"\nimport script from \"./UserAddCredits.vue?vue&type=script&lang=js\"\nexport * from \"./UserAddCredits.vue?vue&type=script&lang=js\"\n\nimport \"./UserAddCredits.vue?vue&type=style&index=0&id=1e6bf942&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1e6bf942\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings scrollbar\">\n    <span class=\"header\">Emulate User</span>\n\n    <div class=\"row mt-4\">\n      <label class=\"label required\">Target User</label>\n      <div class=\"value\">\n        <input\n          v-model=\"username\"\n          class=\"select\"\n          type=\"text\"\n          :class=\"{ 'error' : errorUsername }\"\n          disabled\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">Password</label>\n      <div class=\"value\">\n        <input\n          v-model=\"password\"\n          class=\"select\"\n          type=\"password\"\n          :class=\"{ 'error' : errorPassword }\"\n        >\n      </div>\n    </div>\n    <div class=\"row mt-4\">\n      <label class=\"label\">2FA Code</label>\n      <div class=\"value\">\n        <input\n          v-model=\"authCode\"\n          class=\"select\"\n          type=\"text\"\n          step=\"1\"\n          :class=\"{ 'error' : errorCode }\"\n        >\n      </div>\n      <IconButton\n        class=\"refresh-icon\"\n        :icon=\"'refresh'\"\n        :width=\"24\"\n        :height=\"24\"\n        :title=\"`Send Code`\"\n        :type=\"''\"\n        @click.stop=\"sendCode\"\n      />\n    </div>\n    <div v-if=\"message\" class=\"row mt-2\">\n      <label class=\"label\" />\n      <div\n        class=\"value\"\n        :class=\"{ 'error-text': isError, 'success-text' : !isError }\"\n      >\n        {{ message }}\n      </div>\n    </div>\n    <div class=\"row mt-3 footer\">\n      <button class=\"button button-sm rounded\" @click.stop=\"openConfirmModal()\">Apply</button>\n      <span @click.stop=\"$router.go(-1)\">Cancel</span>\n    </div>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"apply\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport IconButton from '@/components/IconButton.vue';\n\nexport default {\n  name: 'EmulateUser',\n  components: {\n    ConfirmModal,\n    IconButton,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      username: null,\n      errorUsername: null,\n      password: '',\n      errorPassword: null,\n      authCode: '',\n      errorCode: null,\n      message: '',\n      backendError: false,\n      confirmMessage: '',\n      confirmMessageHeader: '',\n      buttonText: '',\n    };\n  },\n  computed: {\n    isError() {\n      return this.errorUsername || this.errorPassword || this.errorCode || this.backendError;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isSuper() {\n      return this.user.role === 'super';\n    },\n    isAdmin() {\n      return this.user.role === 'admin';\n    },\n  },\n  created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    if (this.$route.query.name) {\n      this.username = this.$route.query.name;\n    }\n  },\n  methods: {\n    sendCode() {\n      this.dsConn.send2FA({ username: this.user.username });\n    },\n    resetErrors() {\n      this.errorPassword = false;\n      this.errorCode = false;\n      this.backendError = false;\n    },\n    openConfirmModal() {\n      this.resetErrors();\n      if (!this.username) {\n        this.message = 'Missing Username.';\n        this.errorUsername = true;\n        return;\n      }\n      if (!this.password) {\n        this.errorPassword = true;\n        this.message = 'Missing Password.';\n        return;\n      }\n      this.confirmMessage = `Logging in as user '${this.username}' ?`;\n      this.confirmMessageHeader = 'Emulate user';\n      this.buttonText = \"Confirm\";\n      this.$refs.confirmModal.showModal();\n    },\n    async apply() {\n      const params = {\n        username: this.user.username,\n        password: this.password,\n        code: this.authCode,\n        emulate_user: this.username,\n      };\n      await this.dsConn.signIn(params)\n        .then((data) => {\n          if (data.result) {\n            this.message = '';\n            this.backendError = false;\n            const token = data.result.token;\n            this.$store.commit('user/setToken', token);\n            this.performUserCheckAndLogin(data.result.username);\n          } else {\n            this.message = data.error.message;\n            this.backendError = true;\n          }\n        })\n        .catch((e) => {\n          this.message = e;\n        });\n    },\n    async performUserCheckAndLogin(u) {\n      const userResp = await this.dsConn.checkForUser({\n        username: u,\n      });\n\n      const userObj = { ...userResp.result };\n      userObj.role = userResp.result.role;\n\n      this.$store.commit('user/setUser', userObj);\n\n      if (userObj.role === 'super') {\n        this.$router.replace({ path: '/user' });\n      } else {\n        this.$router.replace({ path: '/projects' });\n      }\n      this.$store.commit('appVersion/setAllowDebug', 'yes');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  width: 730px;\n  min-width: 400px;\n  height: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n  color: rgba(grey, 0.9);\n\n  &.required::after {\n    content: '*';\n    font-size: 14px;\n    font-weight: 700;\n    padding-left: 1px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.select {\n  width: 100%;\n  height: 30px;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  align-self: center;\n  -webkit-appearance: auto;\n  background: rgba(#ffffff, 0.8);\n  @include themify() {\n    border: 1px solid themed('form-input-border');\n  }\n\n}\n\n.select:focus {\n  @include themify() {\n    border: 1px solid themed('color-primary');\n    box-shadow:  0 0 0 1px themed('color-primary'), 0 0 3px themed('color-primary-300');\n  }\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n}\n\ninput.error , select.error {\n  @include themify() {\n    border: 1px solid themed('color-red') !important;\n    box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n  }\n\n  &:focus, &:focus-visible {\n    @include themify() {\n      border: 1px solid themed('color-red') !important;\n      box-shadow:  0 0 0 1px themed('color-red'), 0 0 3px themed('color-red') !important;\n    }\n  }\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.footer {\n  display: flex;\n  justify-content: flex-end;\n  button {\n    width: fit-content\n  }\n  span {\n    color: $color-link;\n    text-decoration: underline;\n    cursor: pointer;\n    width: fit-content;\n  }\n}\n\n.refresh-icon {\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.refresh-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n</style>\n","import { render } from \"./EmulateUser.vue?vue&type=template&id=187ff8f5&scoped=true\"\nimport script from \"./EmulateUser.vue?vue&type=script&lang=js\"\nexport * from \"./EmulateUser.vue?vue&type=script&lang=js\"\n\nimport \"./EmulateUser.vue?vue&type=style&index=0&id=187ff8f5&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-187ff8f5\"]])\n\nexport default __exports__","<template>\n  <div class=\"settings\">\n    <div v-if=\"doneFetch\" class=\"usage-summary-settings panel__text scrollbar\">\n      <template v-if=\"showDetailedOrg?.useSummary && showDetailedOrg?.users\">\n        <div class=\"row\">\n          <div class=\"col-9\">\n            <div class=\"generate-bill\">\n              <button class=\"button button-rounded create-button\" @click=\"generateMonthlyBill\">Generate Bill</button>\n              <div class=\"date-selector settings__control-group\">\n                <select v-model=\"selectMonth\" class=\"select\">\n                  <option v-for=\"(month, i) in months\" :key=\"i\" :value=\"month\">\n                    {{ month }}\n                  </option>\n                </select>\n                <select v-model=\"selectYear\" class=\"select\">\n                  <option v-for=\"(year, i) in years\" :key=\"i\" :value=\"year\">\n                    {{ year }}\n                  </option>\n                </select>\n              </div>\n              <div class=\"value\" :class=\"{ 'error-text': error, 'success-text' : !error }\">{{ message }}</div>\n            </div>\n          </div>\n          <div class=\"col\">\n            <BaseMenu\n              :placement=\"'bottom-start'\"\n              @closed=\"show_menu = false\"\n            >\n              <button class=\"button button-rounded button-secondary actions-button\">More Actions</button>\n              <template #menu=\"{closeMenu}\">\n                <ul>\n                  <li>\n                    <BaseMenuButton @click.stop=\"navigateToBilling(), closeMenu()\">\n                      <SVGIcon\n                        :iconName=\"'usage'\"\n                        :width=\"'22px'\"\n                        :height=\"'22px'\"\n                      />\n                      <span>Usage & Billing</span>\n                    </BaseMenuButton>\n                  </li>\n                  <li>\n                    <BaseMenuButton @click.stop=\"navigateToAddCredits(), closeMenu()\">\n                      <SVGIcon\n                        :iconName=\"'dollar'\"\n                        :width=\"'22px'\"\n                        :height=\"'22px'\"\n                      />\n                      <span>Add Funds</span>\n                    </BaseMenuButton>\n                  </li>\n                  <li>\n                    <BaseMenuButton @click.stop=\"navigateToCreateUser(), closeMenu()\">\n                      <SVGIcon\n                        :iconName=\"'person_add'\"\n                        :width=\"'22px'\"\n                        :height=\"'22px'\"\n                      />\n                      <span>Create New User</span>\n                    </BaseMenuButton>\n                  </li>\n                  <li>\n                    <BaseMenuButton @click.stop=\"navigateToEditOrganization(), closeMenu()\">\n                      <SVGIcon\n                        :iconName=\"'edit'\"\n                        :width=\"'22px'\"\n                        :height=\"'22px'\"\n                      />\n                      <span>Edit Organization</span>\n                    </BaseMenuButton>\n                  </li>\n                </ul>\n              </template>\n            </BaseMenu>\n          </div>\n          <!-- <div class=\"col-3 header-text hyperlink\">\n            <span @click=\"navigateToBilling(u)\">Usage & Billing</span>\n          </div>\n          <div class=\"col-3 header-text hyperlink\">\n            <span @click=\"navigateToAddCredits(u)\">Add Credits</span>\n          </div> -->\n          <div class=\"col header-text\">\n            <span>Funds Remaining</span>\n            <h3>\n              USD {{ Number(showDetailedOrg.useSummary.credits * dollarCreditRatio + showDetailedOrg.currentDateDollarCost).toFixed(2) }}\n            </h3>\n          </div>\n        </div>\n        <div class=\"static-summary\">\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'folder2'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Projects</span>\n              </div>\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.project}` }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'database2'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Datasets</span>\n              </div>\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.dataset}` }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'set'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Annotations (boxes)</span>\n              </div>\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.annotations}` }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'image'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Images</span>\n              </div>\n\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.images}` }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'train'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Training Time (hour)</span>\n              </div>\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.train_time.toFixed(4)}` }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'detection2'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Auto Annotations (hours)</span>\n              </div>\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.autoanns.toFixed(4)}` }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"static-summary__item\">\n            <div class=\"icon\">\n              <SVGIcon\n                :iconName=\"'segments'\"\n                :width=\"'28px'\"\n                :height=\"'28px'\"\n              />\n            </div>\n            <div class=\"progress\">\n              <div class=\"progress__title\">\n                <span>Auto Segmentations (hours)</span>\n              </div>\n              <div class=\"progress__subtitle\">\n                <span>{{ `${showDetailedOrg.useSummary.autosegs.toFixed(4)}` }}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </template>\n      <div v-if=\"showDetailedOrg?.useSummary && showDetailedOrg?.users && showDetailedOrg?.users.length > 0\" class=\"user-table\">\n        <!-- <button class=\"button button-rounded create-button mt-3\" @click=\"navigateToCreateUser\">Create New User</button> -->\n        <div class=\"user-table__table\">\n          <div class=\"row header-row\">\n            <div\n              v-for=\"(h, i) in headers\"\n              :key=\"`header-cell-${i}`\"\n              :class=\"{ 'col-3' : i <= 2, 'col-sm' : i > 2 }\"\n            >\n              {{ h }}\n            </div>\n            <div class=\"button-padding\" />\n          </div>\n          <div\n            v-for=\"(u, j) in showDetailedOrg.users\"\n            :key=\"`user-row-${j}`\"\n            class=\"row mt-3 li-row\"\n          >\n            <div class=\"col-3 user-table__username\">\n              <span>{{ u['username'] }}</span>\n            </div>\n            <div class=\"col-3 user-table__access\">\n              {{ u['email'] }}\n            </div>\n            <div class=\"col-3 user-table__access\">\n              {{ u['role'] ? u['role'].charAt(0).toUpperCase() + u['role'].slice(1) : '' }}\n            </div>\n            <div class=\"button-padding\">\n              <IconButton\n                class=\"edit-btn icon\"\n                :icon=\"'edit'\"\n                :width=\"22\"\n                :height=\"22\"\n                @click=\"navigateToEditUser(u)\"\n              />\n              <IconButton\n                class=\"edit-btn icon\"\n                :icon=\"'person_arrow'\"\n                :width=\"22\"\n                :height=\"22\"\n                @click=\"navigateToUserEmulation(u.username)\"\n              />\n              <IconButton\n                :class=\"{ invisible: u.username === user.username }\"\n                class=\"close-btn icon\"\n                :icon=\"'close'\"\n                :width=\"22\"\n                :height=\"22\"\n                @click=\"openConfirmDeleteUserModal(u)\"\n              />\n            </div>\n          </div>\n          <div class=\"row footer-row\" />\n        </div>\n      </div>\n    </div>\n    <div v-else class=\"empty-state\">\n      <InlineLoader\n        :width=\"'60px'\"\n        :height=\"'60px'\"\n        :border=\"'12px'\"\n      />\n    </div>\n    <ConfirmModal\n      ref=\"confirmModal\"\n      :messageHeader=\"confirmMessageHeader\"\n      :message=\"confirmMessage\"\n      :buttonClass=\"'button-delete'\"\n      :buttonText=\"'Delete'\"\n      @confirmed=\"removeUser\"\n    />\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport IconButton from '@/components/IconButton.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\n\nexport default {\n  name: 'ShowDetailedOrganization',\n  components: {\n    IconButton,\n    ConfirmModal,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    InlineLoader,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      allRoles: [],\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      openedDropdowns: [],\n      showDetailedOrg: null,\n      dollarCreditRatio: 0.001,\n      selectMonth: '',\n      selectYear: 0,\n      message: '',\n      error: false,\n      currentDateDollarCost: 0,\n      doneSummaryFetch: false,\n      doneDetailsFetch: false,\n      costPackage: null,\n    };\n  },\n  computed: {\n    doneFetch() {\n      return this.doneDetailsFetch && this.doneSummaryFetch;\n    },\n    headers() {\n      return ['User', 'E-mail', 'Role'];\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'admin');\n    },\n    isSuper() {\n      return this.user && (this.user.role === 'super');\n    },\n    months() {\n      return [\n        'January', 'February', 'March', 'April', 'May', 'June',\n        'July', 'August', 'September', 'October', 'November', 'December',\n      ];\n    },\n    years() {\n      const currentYear = new Date().getFullYear();\n      const startingYear = 2023;\n      const years = [];\n      for (let year = startingYear; year <= currentYear; year++) {\n        years.push(year);\n      }\n\n      return years;\n    },\n  },\n  async created() {\n    if (!this.isAdmin && !this.isSuper) {\n      this.$router.push('/login');\n    }\n    if (this.$route.query.org) {\n      await this.getCostPackage(parseInt(this.$route.query.org));\n      await this.getOrg(parseInt(this.$route.query.org));\n      await this.getDollarCreditRatio(parseInt(this.$route.query.org));\n      await this.retrieveMonthlyBill(parseInt(this.$route.query.org));\n    }\n    this.selectMonth = this.months[new Date().getMonth()];\n    this.selectYear = new Date().getFullYear();\n    this.getAllRoles();\n  },\n\n  methods: {\n    async getOrg(id) {\n      this.doneSummaryFetch = false;\n      await this.dsConn.getOrg({ organization_id: id })\n        .then(async (data) => {\n          if (data.result) {\n            this.showDetailedOrg = data.result;\n            this.showDetailedOrg.users = await this.getUsers(id);\n            this.showDetailedOrg.useSummary = await this.getUsagePercentage(id);\n          }\n          this.doneSummaryFetch = true;\n        })\n        .catch((e) => {\n          this.message = e;\n          this.doneSummaryFetch = true;\n        });\n    },\n    async generateMonthlyBill() {\n      this.message = '';\n      await this.dsConn.generateMonthlyBill({\n        organization_id: this.showDetailedOrg.id,\n        month: this.selectMonth,\n        year: this.selectYear,\n      })\n        .then((resp) => {\n          if (resp.result) {\n            this.message = \"Bill generated successfully\";\n            this.error = false;\n          } else {\n            this.message = resp.error.message;\n            this.error = true;\n          }\n        })\n        .catch((e) => {\n          console.log(e);\n        });\n    },\n    async getCostPackage(id) {\n      await this.dsConn.getCostPackage({ organization_id: id })\n        .then((resp) => {\n          if (resp.result) {\n            this.costPackage = resp.result;\n          } else {\n            this.costPackage = null;\n          }\n        })\n        .catch((e) => {\n          console.log(e);\n        });\n    },\n    async retrieveMonthlyBill(id) {\n      this.doneDetailsFetch = false;\n      const now = new Date();\n      await this.dsConn.retrieveMonthlyBill({\n        organization_id: id,\n        month: now.toLocaleString('default', { month: 'long' }),\n        year: now.getUTCFullYear(),\n      })\n        .then((resp) => {\n          if (resp.result && Object.keys(resp.result).length > 0 && this.costPackage) {\n            this.showDetailedOrg.currentDateDollarCost = this.parseReport(resp.result);\n          } else {\n            this.showDetailedOrg.currentDateDollarCost = this.parseReport([]);\n          }\n          this.doneDetailsFetch = true;\n        })\n        .catch((e) => {\n          this.doneDetailsFetch = true;\n        });\n    },\n    async getDollarCreditRatio(id) {\n      await this.dsConn.getDollarCreditRatio({ organization_id: id })\n        .then((resp) => {\n          if (resp.result && resp.result > 0) {\n            this.dollarCreditRatio = resp.result;\n          } else {\n            this.dollarCreditRatio = 0.001;\n          }\n        })\n        .catch((e) => {\n          console.log(e);\n        });\n    },\n    openConfirmDeleteUserModal(u) {\n      this.confirmMessage = `Are you sure you want to remove user \"${u.username}\"?`;\n      this.confirmMessageHeader = 'Remove User';\n      this.toDelete = u;\n      this.$refs.confirmModal.showModal();\n    },\n    async getAllRoles() {\n      await this.dsConn.getAllRoles()\n        .then((data) => {\n          this.allRoles = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getUsers(id) {\n      const resp = await this.dsConn.getUserListByOrganization({ organization_id: id })\n        .catch((error) => {\n          console.log('Failed to retrieve training sessions:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n\n      const users = resp.result.reverse();\n      return users;\n    },\n    async getUsagePercentage(id) {\n      const resp = await this.dsConn.getUsageSummaryForOrganization({ organization_id: id })\n        .catch((error) => {\n          console.log('Failed to retrieve training sessions:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      resp.result.credits = Number(resp.result.credits);\n      return resp.result;\n    },\n    navigateToCreateOrganization() {\n      this.$router.push({ name: 'super.neworg' });\n    },\n    navigateToEditOrganization() {\n      this.$router.push({ name: 'super.editorg', query: { org: this.showDetailedOrg.id } });\n    },\n    navigateToEditUser(u) {\n      this.$router.push({ name: 'super.edituser', query: { editUser: u.username } });\n    },\n    navigateToCreateUser() {\n      this.$router.push({ name: 'super.createuser', query: { org: this.showDetailedOrg.id } });\n    },\n    async removeUser() {\n      await this.dsConn.deleteUser({ username: this.toDelete.username })\n        .then(async (data) => {\n          if (!data.error) {\n            this.toDelete = null;\n            this.showDetailedOrg.users = await this.getUsers(this.showDetailedOrg.id);\n          }\n        }).catch((e) => console.log(e));\n    },\n    navigateToUserEmulation(name) {\n      this.dsConn.send2FA({ username: this.user.username });\n      this.$router.push({ name: 'super.emulate', query: { name } });\n    },\n    navigateToBilling() {\n      this.$router.push({ name: 'super.usagelogs', query: { org: this.showDetailedOrg.id } });\n    },\n    navigateToAddCredits() {\n      this.$router.push({ name: 'super.addcredits', query: { org: this.showDetailedOrg.id } });\n    },\n    parseReport(data) {\n      // Images\n      let currentDateDollarCost = 0;\n      const num_images_array = data.filter((e) => e.type === 'num_images');\n      currentDateDollarCost += this.appendCurrentDateRecord(num_images_array[0], num_images_array[num_images_array.length - 1]);\n      const num_parked_images_array = data.filter((e) => e.type === 'parked_images' || e.type === 'parked_images_fee');\n      currentDateDollarCost += this.appendCurrentDateRecord(num_parked_images_array[0], num_parked_images_array[num_parked_images_array.length - 1]);\n      // annotations\n      const num_annotations_array = data.filter((e) => e.type === 'num_annotations');\n      currentDateDollarCost += this.appendCurrentDateRecord(num_annotations_array[0], num_parked_images_array[num_parked_images_array.length - 1]);\n      return currentDateDollarCost;\n    },\n\n    appendCurrentDateRecord(latest, first) {\n      if (!latest || !first) {\n        return 0;\n      }\n      const now = new Date();\n\n      // latest is the most recent entry\n      const latestDate = new Date(latest.date);\n      // first is first entry of the month, used to get which month the current record is from\n      const firstDate = new Date(first.date);\n      if (now.getUTCFullYear() !== firstDate.getUTCFullYear() || now.getUTCMonth() !== firstDate.getUTCMonth()) {\n        return 0;\n      }\n\n      const diff = this.getDateDifferenceInDays(latestDate, now) + 1;\n      let costPkgKey = null;\n      let modifier = 1;\n      switch (latest.type) {\n      case \"num_images\":\n        costPkgKey = 'images';\n        break;\n      case \"num_annotations\":\n        costPkgKey = 'annotations';\n        break;\n      case \"parked_images_fee\":\n      case \"parked_images\":\n        costPkgKey = 'images';\n        modifier = 0.5;\n        break;\n      default:\n        break;\n      }\n      if (diff < 1.0) {\n        return 0;\n      } else {\n        const dollars = this.getCreditCostForCount(costPkgKey, latest.amount, diff, modifier);\n        if (Number(dollars) !== 0) {\n          return Number(dollars);\n        }\n        return 0;\n      }\n    },\n    getDateDifferenceInDays(date1, date2) {\n    // Parse the input dates\n      const startDate = new Date(date1);\n      const endDate = new Date(date2);\n\n      // Ensure that the date objects are valid\n      if (Number.isNaN(startDate) || Number.isNaN(endDate)) {\n        throw new Error(\"Invalid date format\");\n      }\n\n      // Get the time in milliseconds for both dates\n      const startTime = startDate.getTime();\n      const endTime = endDate.getTime();\n\n      // Calculate the difference in milliseconds\n      const differenceInMilliseconds = endTime - startTime;\n\n      // Convert milliseconds to full days (1000 milliseconds * 60 seconds * 60 minutes * 24 hours)\n      const differenceInDays = Math.floor(differenceInMilliseconds / (1000 * 60 * 60 * 24));\n\n      return differenceInDays;\n    },\n\n    getCreditCostForCount(key, count, duration, modifier) {\n      let credit_range = null;\n      let prorated = 1;\n      switch (key) {\n      case \"seats\":\n        credit_range = this.costPackage['seats'];\n        prorated = duration / 30.0;\n        break;\n      case \"images\":\n        credit_range = this.costPackage['images'];\n        prorated = duration / 30.0;\n        break;\n      case \"annotations\":\n        credit_range = this.costPackage['annotations'];\n        prorated = duration / 30.0;\n        break;\n      case \"video\":\n        credit_range = this.costPackage['bulk_video'];\n        prorated = duration / 30.0;\n        break;\n      default:\n        break;\n      }\n\n      return Number(-1 * count * credit_range[0]['crpu'] * this.costPackage['dve_credits_cost_usd'] * prorated * modifier);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 100%;\n  padding: 30px;\n  overflow-y: auto;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.header-text{\n  display: flex;\n  flex-direction: column;\n  margin-top: 10px;\n  margin-left: 20px;\n\n  span {\n    width:fit-content;\n    font-weight: 600;\n    font-size: 1.0rem;\n  }\n}\n\n.hyperlink {\n  color: #0b60f3;\n  text-decoration: underline;\n}\n\n.hyperlink span:hover {\n  cursor: pointer;\n}\n\n.date-selector {\n  width: 400px;\n  display: flex;\n  flex-direction: row;\n  margin-top: 20px;\n  margin-bottom: 10px;\n\n  select + select {\n    margin-left: 20px;\n  }\n}\n\n.value {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n}\n\n.error-text {\n  color: $color-red-500;\n}\n\n.success-text {\n  color: $color-success;\n}\n\n.static-summary {\n  width: 100%;\n  display: grid;\n  grid-gap: 30px;\n  padding: 15px;\n  margin-left: 13px;\n  grid-template-columns: repeat(auto-fill, 300px);\n  grid-auto-rows: auto;\n  border-radius: 8px;\n  margin-top: 10px;\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n  @include themify() {\n    background: themed('card-color');\n    color: themed('body-text-color');\n  }\n\n  &__item {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n\n    .icon +.progress {\n      margin-left: 20px;\n    }\n  }\n\n  &__item > .label {\n    width: 200px;\n    text-align: right;\n    font-size: 0.9rem;\n    font-weight: 600;\n    color: rgba(grey, 0.9);\n\n    &.required::after {\n      content: '*';\n      font-size: 14px;\n      font-weight: 700;\n      padding-left: 1px;\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n  }\n\n  &__item > .value {\n    flex: 1 1 auto;\n    font-size: 0.9rem;\n    margin-left: 20px;\n  }\n}\n\n.icon {\n  width: fit-content;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.progress {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n\n  &__title {\n    display: flex;\n    width: 100%;\n    font-size: 1.0rem;\n    font-weight: 600;\n    @include themify() {\n    color: themed('body-text-color');\n    }\n\n    justify-content: space-between;\n  }\n\n  &__subtitle {\n    display: flex;\n    width: 100%;\n    font-size: 1.1rem;\n    font-weight: 600;\n    justify-content: space-between;\n    @include themify() {\n    color: themed('body-text-color-secondary');\n    }\n\n    div:first-child {\n    margin-bottom: 5px;\n    }\n  }\n\n  &__bar {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n      margin-top: 1px;\n\n      progress {\n      width: 100%;\n      border-radius: 0;\n      height: 10px;\n\n        &::-webkit-progress-bar {\n            @include themify() {\n            background-color: themed('progress-bar');\n            }\n        }\n        &::-webkit-progress-value {\n            @include themify() {\n            background-color: themed('progress-value');\n            }\n        }\n      }\n  }\n\n  &__estimate {\n      display: flex;\n      font-weight: 600;\n      font-size: 0.875rem;\n      @include themify() {\n      color: themed('body-text-color-secondary');\n      }\n      margin-top: 5px;\n      justify-content: space-between;\n  }\n}\n\n.header {\n  font-size: 1.2rem;\n  font-weight: 700;\n}\n\n.actions-button {\n  margin-left: 15px;\n  margin-top: 10px;\n}\n\n.create-button {\n  width: fit-content;\n}\n\n.generate-bill {\n  margin: 20px 0 0 15px;\n}\n\n.user-table {\n  display: flex;\n  flex-direction: column;\n  border-radius: 10px;\n  width: 100%;\n  padding: 10px;\n\n  &__header {\n    font-size: 0.9rem;\n  }\n\n  &__table {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin: 15px 15px 15px 15px;\n\n    .header-row {\n      font-weight: 700;\n      border-bottom: 2px solid rgba(96, 95, 95, 0.5);\n    }\n\n    .footer-row {\n      min-height: 10px;\n      border-bottom: 2px solid rgba(96, 95, 95, 0.5);\n    }\n  }\n\n  &__username {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n\n    span:nth-child(2) {\n      font-size: 0.9rem;\n      padding-left: 20px;\n      color: rgba(grey, 0.9)\n    }\n  }\n\n  &__package {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n  }\n\n  &__access {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n  }\n\n}\n\n.button-padding {\n  display: flex;\n  flex-direction: row;\n  width: 100px;\n}\n\n.li-row {\n  padding: 5px;\n  border-radius: 8px;\n  align-items: center;\n}\n\n.li-row:hover {\n  background-color: rgba(140, 140, 140, 0.2);\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: center;\n  width: 200px;\n  text-align: right;\n  font-size: 1.0rem;\n  font-weight: 600;\n  color: rgba(grey, 1.0)\n}\n\n.row > .value {\n  flex: 1 1 auto;\n  font-size: 1.0rem;\n  margin-left: 20px;\n}\n\n.icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: none;\n  border: none;\n  border-radius: 4px;\n  margin-left: auto;\n}\n\n.icon + .icon {\n  margin-left: 10px;\n}\n\n.edit-btn:hover {\n  background: none !important;\n  box-shadow: none !important;\n  color: $color-primary-400;\n}\n\n.close-btn:hover {\n  background: none !important;\n  box-shadow: none !important;\n  color: $color-red-400;\n}\n\n.invisible {\n  visibility: hidden;\n}\n</style>\n","import { render } from \"./ShowDetailedOrganization.vue?vue&type=template&id=94f3801c&scoped=true\"\nimport script from \"./ShowDetailedOrganization.vue?vue&type=script&lang=js\"\nexport * from \"./ShowDetailedOrganization.vue?vue&type=script&lang=js\"\n\nimport \"./ShowDetailedOrganization.vue?vue&type=style&index=0&id=94f3801c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-94f3801c\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template #page-slot>\n        <BreadcrumbSelect\n          id=\"project-select\"\n          v-model=\"currentProject\"\n          :options=\"projectList\"\n          :placeholder=\"'Project'\"\n          :displayTag=\"'name'\"\n        />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <!-- <ProjectsIconSidebar\n        v-model=\"currentTab\"\n        :redirect=\"redirect\"\n      /> -->\n      <main class=\"main-display-area\">\n        <router-view />\n      </main>\n    </div>\n    <TasksModal />\n  </div>\n</template>\n\n<script>\nimport Header from '@/components/Header.vue';\nimport BreadcrumbSelect from '@/components/BreadcrumbSelect.vue';\nimport TasksModal from '@/components/TasksStatusComponent/TasksModal.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  components: {\n    Header,\n    BreadcrumbSelect,\n    TasksModal,\n    BreadcrumbNavigation,\n  },\n  data() {\n    return {\n      currentTab: null,\n      redirect: '',\n    };\n  },\n  computed: {\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject: {\n      get() {\n        return this.$store.state.projects.currentProject;\n      },\n      set(value) {\n        this.$store.commit('projects/setCurrentProject', value);\n      },\n    },\n  },\n  watch: {\n    projectList(list) {\n      if (list && list.length > 0 && !this.currentProject) {\n        this.$store.commit('projects/setCurrentProject', list[0]);\n      }\n    },\n  },\n  created() {\n    if (this.$route) {\n      this.redirect = this.$route.name;\n    }\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","<template>\n  <BaseSelect\n    v-model=\"value\"\n    class=\"breadcrumb-select\"\n    :options=\"options\"\n    :placeholder=\"placeholder\"\n    :displayTag=\"displayTag\"\n    @select=\"$emit('select', $event)\"\n    @update:modelValue=\"$emit('update:modelValue', $event)\"\n  />\n</template>\n\n<script>\nimport BaseSelect from '@/components/BaseSelect.vue';\n\nexport default {\n  name: \"BreadcrumbSelect\",\n  components: {\n    BaseSelect,\n  },\n  props: {\n    modelValue: {\n      type: [String, Object],\n      default: '',\n    },\n    placeholder: {\n      type: String,\n      default: '',\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    options: {\n      type: Array,\n      default: () => [],\n    },\n    displayTag: {\n      type: String,\n      default: null,\n    },\n    flip: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: ['update:modelValue', 'select'],\n  data() {\n    return {\n      value: '',\n    };\n  },\n  watch: {\n    modelValue(value) {\n      this.value = value;\n    },\n  },\n  mounted() {\n    this.value = this.modelValue;\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.breadcrumb-select {\n  background: transparent;\n  color: inherit !important;\n  width: 250px;\n  height: 100%;\n}\n\n:deep {\n  .base-select__label {\n      color: hsla(210, 12%, 90%, 75%);\n  }\n}\n\n</style>\n","<template>\n  <div\n    :id=\"uid\"\n    ref=\"select\"\n    class=\"base-select\"\n    :class=\"{ 'focused': focused }\"\n    @click=\"showMenu = !showMenu\"\n  >\n    <Popper\n      :config=\"menuPopperConfig\"\n      :show=\"showMenu\"\n      :appendToBody=\"true\"\n      :trigger=\"null\"\n      @popper-closed=\"handlePopperClosed\"\n    >\n      <template #trigger>\n        <div class=\"base-select__inner\" :class=\"{ 'focused': focused }\">\n          <fieldset class=\"base-select__fieldset\" :class=\"{ 'focused': focused }\"><legend>{{ legendText }}</legend></fieldset>\n          <span class=\"base-select__value\">\n            {{ displayTag && value ? value[displayTag] : value }}\n          </span>\n          <button class=\"base-select__dropdown-button\">\n            <SVGIcon\n              :mirrored=\"showMenu\"\n              :iconName=\"'expand_more'\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n            />\n          </button>\n          <label class=\"base-select__label\" :class=\"{ 'focused': focused }\">{{ placeholder }}</label>\n        </div>\n      </template>\n      <div v-if=\"options && options.length > 0\" class=\"base-select__dropdown scrollbar\" :style=\"{width: clientWidth}\">\n        <ul>\n          <li v-for=\"(option, i) in options\" :key=\"i\">\n            <button\n              class=\"dropdown-button\"\n              @mousedown=\"handleMenuButtonClick(option)\"\n            >\n              {{ displayTag && option ? option[displayTag] : option }}\n            </button>\n          </li>\n        </ul>\n      </div>\n    </Popper>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport Popper from '@/components/Popper.vue';\nimport { detectOverflow } from '@popperjs/core';\n\nconst overflowPadding = 20;\n\nlet uid = 0;\n\nexport default {\n  name: \"BaseSelect\",\n  components: {\n    SVGIcon,\n    Popper,\n  },\n  props: {\n    modelValue: {\n      type: [String, Object],\n      default: '',\n    },\n    placeholder: {\n      type: String,\n      default: '',\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    options: {\n      type: Array,\n      default: () => [],\n    },\n    displayTag: {\n      type: String,\n      default: null,\n    },\n    flip: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: ['update:modelValue', 'select'],\n  data() {\n    uid += 1;\n    return {\n      uid: `base-select-${uid}`,\n      showMenu: false,\n      clientWidth: null,\n      value: '',\n    };\n  },\n  computed: {\n    detectOverflowModifier() {\n      return {\n        name: 'detectOverflowModifier',\n        enabled: true,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement === 'bottom-start') {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflowPadding}px`;\n          }\n          if (state.placement === 'top-start') {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.top - overflowPadding}px`;\n          }\n        },\n      };\n    },\n    focused() {\n      return this.value;\n    },\n    legendText() {\n      return this.focused ? this.placeholder : '';\n    },\n    menuPopperConfig() {\n      return {\n        placement: 'bottom-start',\n        modifiers: [\n          this.detectOverflowModifier,\n          {\n            name: 'offset',\n            options: {\n              offset: [0, 1],\n            },\n          },\n          {\n            name: 'preventOverflow',\n            options: {\n              padding: 0,\n            },\n          },\n          {\n            name: 'flip',\n            enabled: this.flip,\n          },\n        ],\n      };\n    },\n  },\n  watch: {\n    modelValue(value) {\n      this.value = value;\n    },\n  },\n  mounted() {\n    this.value = this.modelValue;\n    window.addEventListener('resize', this.handleResize);\n    this.handleResize();\n  },\n  beforeUnmount() {\n    window.removeEventListener('resize', this.handleResize);\n  },\n  methods: {\n    handleResize() {\n      if (this.$refs.select) {\n        this.clientWidth = `${this.$refs.select.clientWidth}px`;\n      }\n    },\n    handleMenuButtonClick(value) {\n      this.$emit('select', value);\n      this.value = value;\n      this.$emit('update:modelValue', value);\n      this.showMenu = false;\n    },\n    handlePopperClosed() {\n      this.showMenu = false;\n    },\n    handleInput() {\n      this.$emit('update:modelValue', this.value);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n$selectHeight: 40px;\n$selectLegendFontSize: 12px;\n$denseSelectHeight: 30px;\n\n.base-select {\n  position: relative;\n  height: 48px;\n  background: white;\n  cursor: pointer;\n  @include themify() {\n    color: themed('body-text-color')\n  }\n\n  &.focused {\n    margin: 0;\n  }\n\n  &__inner {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    height: 100%;\n    background: inherit;\n  }\n\n  &__fieldset {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n\n    padding: 0 8px;\n    margin: 0;\n\n    text-align: left;\n    font-size: $selectLegendFontSize;\n    line-height: 1;\n\n    pointer-events: none;\n    border-collapse: collapse;\n    border: 1px solid;\n    border-radius: 4px;\n\n    transition-duration: .1s;\n    transition-property: color,border-width;\n    transition-timing-function: cubic-bezier(.25,.8,.25,1);\n\n    &.focused{\n      border: 2px solid;\n      color: inherit;\n\n      legend {\n        padding: 0 4px;\n      }\n    }\n\n    legend {\n      display: flex;\n      padding: 0;\n      visibility: hidden;\n      height: 0;\n    }\n  }\n\n  &__value {\n    background: none;\n    width: 100%;\n    border: none !important;\n    padding: 0px 12px;\n    margin: auto;\n    text-align: left;\n    line-height: 1.2;\n    white-space: nowrap;\n    overflow: hidden;\n    font-size: 1rem;\n\n    &:focus {\n      outline: none;\n    }\n  }\n\n  &__dropdown-button {\n    display: flex;\n    align-items: center;\n    height: 100%;\n    background: none;\n    border: none;\n    cursor: pointer;\n    color: inherit;\n  }\n\n  &__label {\n    position: absolute;\n    left: 12px;\n    top: 50%;\n    transform: translateY(-50%);\n    line-height: 1;\n    font-weight: 500;\n    height: fit-content;\n    pointer-events: none;\n    transition: all .3s cubic-bezier(.25,.8,.5,1);\n\n    @include themify() {\n      color: themed('placeholder-text-color')\n    }\n\n    &.focused {\n      top: 0;\n      font-size: $selectLegendFontSize;\n      color: inherit;\n    }\n  }\n\n  &__dropdown {\n    width: 100%;\n    background: white;\n    box-shadow: 0 1px 4px 0 rgb(0 0 0 / 40%);\n    overflow-y: auto;\n    @include themify() {\n      outline: 1px solid themed('popper-border-light');\n    }\n\n    ul {\n      list-style-type: none;\n      margin: 0;\n      padding: 0;\n    }\n  }\n}\n\n.dropdown-button {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  align-items: center;\n  outline: none;\n  border: none;\n  border-radius: 0px;\n  background: white;\n  color: inherit;\n  padding: 8px 4px;\n  margin: 0;\n  line-height: 1;\n  text-align: left;\n  cursor: pointer;\n\n  &:hover {\n    background-color: var(--menu-button-hover-background);\n  }\n\n  &:focus-visible {\n    background-color: var(--menu-button-hover-background);\n  }\n\n  > span {\n    font: inherit;\n    font-size: 1rem;\n    font-weight: 600;\n    margin-left: 12px;\n    white-space: nowrap;\n  }\n\n  &._danger {\n    @include themify() {\n      color: themed('color-danger');\n    }\n  }\n}\n\n.base-select.dense {\n  height: 40px;\n}\n\n</style>\n","import { render } from \"./BaseSelect.vue?vue&type=template&id=6be1e4c6&scoped=true\"\nimport script from \"./BaseSelect.vue?vue&type=script&lang=js\"\nexport * from \"./BaseSelect.vue?vue&type=script&lang=js\"\n\nimport \"./BaseSelect.vue?vue&type=style&index=0&id=6be1e4c6&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6be1e4c6\"]])\n\nexport default __exports__","import { render } from \"./BreadcrumbSelect.vue?vue&type=template&id=658d4bcc&scoped=true\"\nimport script from \"./BreadcrumbSelect.vue?vue&type=script&lang=js\"\nexport * from \"./BreadcrumbSelect.vue?vue&type=script&lang=js\"\n\nimport \"./BreadcrumbSelect.vue?vue&type=style&index=0&id=658d4bcc&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-658d4bcc\"]])\n\nexport default __exports__","<template>\n  <Popper\n    v-model:show=\"showTasksModal\"\n    class=\"task-popper\"\n    :config=\"popperConfig\"\n    :appendToBody=\"true\"\n    :trigger=\"'click'\"\n    :ignoreClickOutside=\"['.task-menu.click-container', '#resume-upload-modal']\"\n  >\n    <template #trigger>\n      <div\n        ref=\"trigger\"\n        class=\"task-icon\"\n        :class=\"{ '_active' : inProgress }\"\n      >\n        <div class=\"inline-loader\">\n          <div v-if=\"inProgress\" class=\"loader-component\" />\n          <div class=\"loader-inner\">\n            <IconButton\n              :icon=\"'import_export'\"\n              :showHover=\"false\"\n              :width=\"'32px'\"\n              :height=\"'32px'\"\n            />\n            <span class=\"subtitle\">Tasks</span>\n          </div>\n        </div>\n      </div>\n    </template>\n    <BaseCard\n      class=\"tasks-modal\"\n    >\n      <template #body>\n        <div class=\"mode-selector\">\n          <input\n            id=\"option-local\"\n            v-model=\"mode\"\n            type=\"radio\"\n            name=\"mode-selector\"\n            :value=\"'local'\"\n          >\n          <label for=\"option-local\">Local ({{ numLocalTasks }})</label>\n          <input\n            id=\"option-in_progress\"\n            v-model=\"mode\"\n            type=\"radio\"\n            name=\"mode-selector\"\n            :value=\"'in_progress'\"\n          >\n          <label for=\"option-in_progress\">In Progress ({{ numInProgressTasks }})</label>\n          <input\n            id=\"option-completed\"\n            v-model=\"mode\"\n            type=\"radio\"\n            name=\"mode-selector\"\n            :value=\"'completed'\"\n          >\n          <label for=\"option-completed\">Completed</label>\n        </div>\n        <div class=\"mt-2 tasks-box scrollbar\">\n          <p v-if=\"mode==='local'\" class=\"disclaimer\"><strong>Warning:</strong> These tasks will be terminated if you exit the website or close your browser.</p>\n          <div>\n            <template v-if=\"mode==='local'\">\n              <div v-for=\"(t, taskID) in localTasks\" :key=\"taskID\" class=\"task\">\n                <component\n                  :is=\"getStatusComponent(t.type)\"\n                  :task=\"t\"\n                  @cancel-task=\"handleCancelDockerTask\"\n                />\n              </div>\n            </template>\n            <template v-if=\"mode==='in_progress'\">\n              <div v-for=\"(t, taskID) in inProgressTasks\" :key=\"taskID\" class=\"task\">\n                <component\n                  :is=\"getStatusComponent(t.type)\"\n                  :task=\"t\"\n                  @cancel-task=\"handleCancelDockerTask\"\n                />\n              </div>\n            </template>\n            <template v-if=\"mode==='completed'\">\n              <div v-for=\"t in completeTasks\" :key=\"t.docker_task_id\" class=\"task\">\n                <component\n                  :is=\"getStatusComponent(t.type)\"\n                  :task=\"t\"\n                />\n              </div>\n            </template>\n          </div>\n        </div>\n      </template>\n    </BaseCard>\n  </Popper>\n</template>\n\n<script>\nimport Popper from '@/components/Popper.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport BaseCard from '@/components/BaseCard.vue';\nimport UploadStatusBar from '@/components/TasksStatusComponent/UploadStatusBar.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"TasksModal\",\n  components: {\n    Popper,\n    IconButton,\n    BaseCard,\n    UploadStatusBar,\n  },\n  props: {\n  },\n  emits: [\n  ],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      mode: 'in_progress',\n      showTasksModal: false,\n    };\n  },\n  computed: {\n    numUploadTasks() {\n      return Object.keys(this.uploadTasks).length;\n    },\n    uploadTasks() {\n      return this.$store.state.tasks.uploadTasks;\n    },\n    inProgressUploadTasks() {\n      return Object.fromEntries(\n        Object.entries(this.uploadTasks).filter(([key, value]) => ['pending', 'running', 'terminated', 'error'].includes(value.status)),\n      );\n    },\n    completeUploadTasks() {\n      return Object.fromEntries(\n        Object.entries(this.uploadTasks).filter(([key, value]) => ['complete'].includes(value.status)),\n      );\n    },\n    localTasks() {\n      return Object.fromEntries(\n        Object.entries(this.uploadTasks).filter(([key, value]) => value.isLocal),\n      );\n    },\n    inProgressTasks() {\n      return { ...this.inProgressUploadTasks };\n    },\n    completeTasks() {\n      return { ...this.completeUploadTasks };\n    },\n    numLocalTasks() {\n      return Object.keys(this.localTasks).length;\n    },\n    numInProgressTasks() {\n      return Object.keys(this.inProgressTasks).length;\n    },\n    numRunningTasks() {\n      return Object.entries(this.inProgressTasks).filter(([key, value]) => ['running'].includes(value.status)).length;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    hasTasks() {\n      return Object.keys(this.uploadTasks).length > 0;\n    },\n    inProgress() {\n      return this.numRunningTasks > 0;\n    },\n    popperConfig() {\n      return {\n        placement: 'bottom-start',\n        modifiers: [\n          {\n            name: 'offset',\n            options: {\n              offset: [75, -15],\n            },\n          },\n          {\n            name: 'preventOverflow',\n            options: {\n              padding: 0,\n            },\n          },\n          {\n            name: 'flip',\n            enabled: true,\n          },\n        ],\n      };\n    },\n  },\n  watch: {\n    numLocalTasks: {\n      handler(newVal, oldVal) {\n        if (newVal > oldVal) {\n          this.mode = 'local';\n          this.showTasksModal = true;\n        }\n      },\n    },\n  },\n  methods: {\n    async handleCancelDockerTask(taskID) {\n      await this.dsConn.deleteDockerTask({ docker_task_id: taskID })\n        .catch((e) => { console.log(e); });\n    },\n    getStatusComponent(type) {\n      if (type === 'upload' || type === 'copyds') {\n        return 'UploadStatusBar';\n      }\n      return null;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.tasks-modal {\n  width: 600px;\n  height: 400px;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.3);\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  button + button {\n    margin-left: 10px;\n  }\n  .icon {\n    visibility: visible;\n    @include themify() {\n      color: themed('icon-color-inactive');\n    }\n  }\n\n  .icon:hover {\n    visibility: visible;\n    @include themify() {\n      color: themed('icon-color-primary');\n    }\n  }\n}\n\n.task-icon {\n  position : absolute;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n  width: 60px;\n  height: 60px;\n  bottom: 8px;\n  left: 10px;\n  border-radius: 50%;\n  color: var(--color-primary);\n  background: var(--color-white-500);\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n\n  &._active {\n    color: var(--color-primary);\n  }\n\n  & button {\n    pointer-events: none;\n  }\n}\n\n.subtitle {\n  font-size: 0.65rem;\n  font-weight: bold;\n}\n\n.mode-selector {\n  display: flex;\n  flex-direction: row;\n}\n\n.mode-selector input[type=\"radio\"] {\n  display: none;\n}\n\n.mode-selector label {\n  padding: 2px 5px;\n  width: fit-content;\n  font-size: 0.9rem;\n  font-weight: bold;\n  cursor: pointer;\n}\n\n.mode-selector input[type=\"radio\"]:checked+label {\n  @include themify() {\n    color: themed('color-primary-500');\n    border-bottom: 2px solid themed('color-primary-500');\n  }\n}\n\n.tasks-box {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  flex: 0 1 100%;\n  align-items: flex-end;\n  overflow-y: scroll;\n\n  & > div {\n    display: flex;\n    flex-direction: column-reverse;\n    width: 100%;\n    gap: 12px;\n  }\n\n  .task {\n    display: flex;\n    flex-direction: row;\n    padding: 4px 4px;\n  }\n\n  .disclaimer {\n    margin: 4px 0 8px 0;\n    font-weight: 600;\n    font-style: italic;\n    line-height: 1.15;\n    font-size: 0.875rem;\n    color: var(--body-text-color-secondary);\n  }\n}\n\n.inline-loader {\n  position: relative;\n  .loader-component {\n    width: 60px;\n    height: 60px;\n    @include themify() {\n      border: 3px solid themed('loader-background');\n      border-top: 3px solid themed('loader-main-color');;\n    }\n    border-radius: 50%;\n    animation: spin 2s linear infinite;\n  }\n\n  .loader-inner {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n\n  }\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <div ref=\"card\" class=\"card\">\n    <div class=\"card__header\">\n      <div v-if=\"title\" class=\"card__titles\">\n        <slot name=\"title-start\" />\n        <div class=\"card__title\"><span v-tooltip=\"title\">{{ title }}</span></div>\n        <span v-if=\"subtitle\" class=\"card__subtitle\">{{ subtitle }}</span>\n      </div>\n      <slot name=\"header\" />\n    </div>\n    <div class=\"card__body\">\n      <slot name=\"body\" />\n    </div>\n    <div class=\"card__footer\">\n      <slot name=\"footer\" />\n    </div>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  name: 'BaseCard',\n  components: {\n  },\n  props: {\n    title: {\n      type: String,\n      default: '',\n    },\n    subtitle: {\n      type: String,\n      default: '',\n    },\n  },\n  data() {\n    return {\n      localTitle: '',\n    };\n  },\n  watch: {\n    title: {\n      immediate: true,\n      handler() {\n        this.localTitle = this.title;\n      },\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  height: fit-content;\n  padding: 16px;\n  margin: 0;\n  text-align: left;\n  border-radius: 8px;\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n\n  @include themify() {\n    background: themed('card-color');\n    color: themed('body-text-color');\n  }\n\n  &__header {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    max-width: 100%;\n  }\n\n  &__titles {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    overflow: hidden;\n    width: 100%;\n    line-height: normal;\n    align-items: center;\n\n    input {\n      border: 1px solid rgb(43, 43, 43);\n      border-radius: 5px;\n    }\n\n    input:focus {\n      border: 2px solid #250E81;\n    }\n  }\n\n  &__title {\n    font-size: 1.25rem;\n    font-weight: 700;\n    @include themify() {\n      color: themed('body-text-color');\n    }\n    width: 100%;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  &__subtitle {\n    font-size: 0.875rem;\n    font-weight: 600;\n    margin-top: 2px;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  &__body {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    flex: 1 1 auto;\n    min-height: 0;\n  }\n\n  &__footer {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    height: fit-content;\n  }\n}\n\n</style>\n","import { render } from \"./BaseCard.vue?vue&type=template&id=7f847494&scoped=true\"\nimport script from \"./BaseCard.vue?vue&type=script&lang=js\"\nexport * from \"./BaseCard.vue?vue&type=script&lang=js\"\n\nimport \"./BaseCard.vue?vue&type=style&index=0&id=7f847494&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7f847494\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"internalTask\" class=\"progress\">\n    <div class=\"progress__text\">\n      <div v-if=\"internalTask.status\" class=\"status\">\n        <div v-if=\"internalTask.status === 'running'\" class=\"status__icon _running icon-spinner\">\n          <SVGIcon\n            :title=\"'Task Running'\"\n            :iconName=\"'upload'\"\n            :width=\"'14px'\"\n            :height=\"'14px'\"\n          />\n        </div>\n        <div v-else-if=\"internalTask.status === 'complete'\" class=\"status__icon _complete\">\n          <SVGIcon\n            :title=\"'Task Complete'\"\n            :iconName=\"'check_filled'\"\n            :width=\"'100%'\"\n            :height=\"'100%'\"\n          />\n        </div>\n        <div v-else-if=\"internalTask.status === 'terminated'\" class=\"status__icon _terminated\">\n          <SVGIcon\n            :title=\"'Task Stopped'\"\n            :iconName=\"'stop'\"\n            :width=\"'100%'\"\n            :height=\"'100%'\"\n          />\n        </div>\n        <div v-else-if=\"internalTask.status === 'error'\" class=\"status__icon _error\">\n          <SVGIcon\n            :title=\"'Task Error'\"\n            :iconName=\"'cancel_filled'\"\n            :width=\"'100%'\"\n            :height=\"'100%'\"\n          />\n        </div>\n      </div>\n      <div class=\"description name\">\n        <span>{{ internalTask.name ? `${internalTask.name}` : '' }} </span>\n      </div>\n      <div class=\"description date\">\n        <span>{{ internalTask.date ? `${dateParser(task.date)}` : '' }} </span>\n      </div>\n      <div class=\"description count\">\n        <template v-if=\"internalTask.status !== 'complete'\">\n          <span v-if=\"internalTask.unit && internalTask.unit ==='bytes'\">\n            {{ internalTask.countValue }} {{ internalTask.countUnit ? internalTask.countUnit : '' }} of {{ internalTask.totalValue }} {{ internalTask.totalUnit ? internalTask.totalUnit : '' }}\n          </span>\n          <span v-else>{{ internalTask.count }} of {{ internalTask.total }}</span>\n        </template>\n      </div>\n      <div v-if=\"startedByUser && task.status !== 'complete' && task.type=== 'upload'\" class=\"ms-2\">\n        <!-- <IconButton\n          :title=\"'Remove Task'\"\n          class=\"cancel-icon\"\n          :icon=\"'trash'\"\n          :width=\"20\"\n          :height=\"20\"\n          @click.stop=\"cancel\"\n        /> -->\n        <BaseMenu\n          :placement=\"'right'\"\n          :appendToBody=\"true\"\n          :class=\"'task-menu'\"\n          @closed=\"show_menu = false\"\n        >\n          <IconButton\n            v-model=\"show_menu\"\n            :icon=\"'more_vert'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n          <template #menu=\"{closeMenu}\">\n            <ul>\n              <!-- <li v-if=\"startedByUser\">\n                <BaseMenuButton @click.stop=\"handleStopUploading(), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'stop'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Stop Uploading</span>\n                </BaseMenuButton>\n              </li> -->\n              <li v-if=\"startedByUser\">\n                <BaseMenuButton @click.stop=\"handleResumeUploading(), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'play_circle'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Resume Uploading</span>\n                </BaseMenuButton>\n              </li>\n            </ul>\n          </template>\n        </BaseMenu>\n      </div>\n    </div>\n    <div class=\"progress__bar\">\n      <progress id=\"autoAnnotate-progress-bar\" :value=\"progress\" :max=\"100\" />\n    </div>\n    <div v-if=\"internalTask.status === 'error'\" class=\"progress__err-text\">\n      <span>Error: {{ internalTask.message }}</span>\n    </div>\n  </div>\n  <ResumeUploadImagesModal\n    v-if=\"showResumeUploadModal\"\n    :internalTask=\"internalTask\"\n    @closed=\"showResumeUploadModal = false\"\n  />\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport ResumeUploadImagesModal from '@/components/DatasetComponent/ResumeUploadImagesModal.vue';\nimport { toRaw } from 'vue';\n\nexport default {\n  name: \"UploadStatusBar\",\n  components: {\n    IconButton,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    ResumeUploadImagesModal,\n  },\n  props: {\n    task: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['cancel-task'],\n  data() {\n    return {\n      showResumeUploadModal: false,\n      show_menu: false,\n      internalTask: null,\n    };\n  },\n  computed: {\n    progress() {\n      if (this.internalTask.total === 0) {\n        return 0;\n      } else {\n        const result = this.internalTask.count / this.internalTask.total;\n        return Number.isNaN(result) ? 0 : result * 100;\n      }\n    },\n    startedByUser() {\n      if (this.$store.state.user.user.username === this.internalTask.username) {\n        return true;\n      }\n      return false;\n    },\n  },\n  watch: {\n    task: {\n      deep: true,\n      handler(t) {\n        this.internalTask = structuredClone(toRaw(t));\n        if (t && t.count > -1 && t.total > -1) {\n          const count = this.formatBytes(t.count);\n          this.internalTask[\"countUnit\"] = count.unit;\n          this.internalTask[\"countValue\"] = count.value;\n          const total = this.formatBytes(t.total);\n          this.internalTask[\"totalUnit\"] = total.unit;\n          this.internalTask[\"totalValue\"] = total.value;\n        }\n      },\n    },\n  },\n  mounted() {\n    this.internalTask = structuredClone(toRaw(this.task));\n  },\n  methods: {\n    dateParser(d) {\n      const date = new Date(d);\n      return `${date.toLocaleString('default', {\n        year: 'numeric', month: 'short', day: 'numeric',\n      })}`;\n    },\n    cancel() {\n      this.$emit('cancel-task', this.internalTask.id);\n      this.$store.commit('tasks/removeUploadTask', { id: this.internalTask.id });\n    },\n    async handleResumeUploading() {\n      this.showResumeUploadModal = true;\n    },\n    formatBytes(bytes) {\n      if (bytes === 0) return { value: 0, unit: \"Bytes\" };\n\n      const units = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\"];\n      const index = Math.floor(Math.log(bytes) / Math.log(1024));\n      const value = (bytes / 1024 ** index).toFixed(2);\n\n      return { value: parseFloat(value), unit: units[index] };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.progress {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n\n  &__text {\n    display: flex;\n    width: 100%;\n    font-size: 0.9rem;\n    font-weight: 600;\n    justify-content: space-between;\n    align-items: flex-end;\n    margin-bottom: 2px;\n\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n\n    span {\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .description {\n      display: flex;\n      flex-direction: row;\n      line-height: 1;\n      margin-bottom: 1px;\n      white-space: nowrap;\n\n      &.name {\n        flex: 1 1 auto;\n        font-size: 1rem;\n        font-weight: 600;\n        line-height: 1.2;\n        color: var(--body-text-color);\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      &.date {\n        font-size: 0.875rem;\n        font-weight: 600;\n        line-height: 1.2;\n        color: var(--body-text-color-secondary);\n      }\n\n      &.count {\n        font-size: 0.875rem;\n        font-weight: 600;\n        line-height: 1.2;\n        color: var(--body-text-color-secondary);\n        margin-left: 12px;\n      }\n    }\n  }\n\n  &__bar {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin-top: 1px;\n\n    progress {\n      width: 100%;\n      border-radius: 0;\n      height: 6px;\n\n      &::-webkit-progress-bar {\n        @include themify() {\n          background-color: themed('progress-bar');\n        }\n      }\n      &::-webkit-progress-value {\n        @include themify() {\n          background-color: themed('progress-value');\n        }\n      }\n    }\n  }\n\n  &__err-text {\n    font-size: 0.875rem;\n    @include themify() {\n      color: var(--color-error);\n    }\n  }\n\n  &__estimate {\n    display: flex;\n    font-weight: 600;\n    font-size: 0.875rem;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n    margin-top: 5px;\n    justify-content: space-between;\n  }\n}\n\n.status {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding-right: 12px;\n\n  &__icon {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    width: 20px;\n    height: 20px;\n\n    &._running {\n      color: var(--color-primary);\n    }\n\n    &._complete {\n      color: var(--color-success);\n    }\n\n    &._error {\n      color: var(--color-error);\n    }\n  }\n}\n\n// .cancel-icon {\n//   margin-left: 10px;\n//   visibility: hidden;\n// }\n\n// .progress:hover .cancel-icon {\n//   visibility: visible;\n// }\n\n// .cancel-icon:hover, .download-icon:hover {\n//   @include themify() {\n//       color: themed('icon-color-primary');\n//   }\n// }\n</style>\n","<template>\n  <Teleport to=\"body\">\n    <Modal\n      id=\"resume-upload-modal\"\n      ref=\"uploadImagesModal\"\n      :title=\"'Resume Upload'\"\n      :zIndex=\"501\"\n      @closed=\"$emit('closed')\"\n    >\n      <template #modal-main>\n        <div class=\"upload-images scrollbar\">\n          <p class=\"disclaimer\">Choose the original upload folder. Only files that haven't been uploaded previously will be uploaded.</p>\n          <div class=\"form\">\n            <div class=\"row\">\n              <div class=\"settings__control-group\">\n                <label>Folder</label>\n                <div class=\"source-row\">\n                  <input\n                    v-model=\"sourceDir\"\n                    class=\"source-row__text-input input\"\n                    type=\"text\"\n                  >\n                  <button class=\"source-row__folder-btn button-secondary\" :class=\"{'button-spinner': parsingFiles}\" @click=\"chooseSourceFolder\">SELECT FOLDER</button>\n                  <input\n                    v-show=\"false\"\n                    id=\"import-script-folder-input\"\n                    ref=\"importFolder\"\n                    type=\"file\"\n                    webkitdirectory\n                    mozdirectory\n                    msdirectory\n                    odirectory\n                    directory\n                    multiple\n                    @change=\"sourceSelected\"\n                  >\n                </div>\n              </div>\n            </div>\n            <div class=\"row mt-3 align-items-flex-end\">\n              <div class=\"col-4\" />\n              <div class=\"col-8 action-buttons\">\n                <button\n                  class=\"button button-sm button-secondary\"\n                  @click=\"closeModal\"\n                >\n                  Cancel\n                </button>\n                <button\n                  class=\"button button-sm\"\n                  :class=\"{'button-spinner': startingImport}\"\n                  :disabled=\"startingImport || parsingFiles\"\n                  @click=\"handleStartImportScript\"\n                >\n                  Start Import\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      </template>\n    </Modal>\n  </Teleport>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'ResumeUploadImagesModal',\n  components: {\n    Modal,\n  },\n  props: {\n    datasetID: {\n      type: Number,\n      default: null,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    task: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['upload-error', 'closed'],\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(),\n      files: null,\n      // importTypes: [],\n      sourceDir: \"\",\n      selectedAnnotationSet: null,\n      startingImport: false,\n      files_parsed: 0,\n      parsingFiles: false,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    taskData() {\n      if (this.task.data) {\n        return JSON.parse(this.task.data);\n      }\n      return null;\n    },\n    datasetName() {\n      const dataset = this.$store.state?.datasets?.datasetList.find((d) => d.id === this.taskData?.dataset_id);\n      return dataset ? dataset.name : null;\n    },\n  },\n  async mounted() {\n    this.$refs.uploadImagesModal.showModal();\n    // await this.getSupportedTypes();\n  },\n  methods: {\n    // async getSupportedTypes() {\n    //   this.dataConnect.getSupportedImportTypes()\n    //     .then((data) => {\n    //       this.importTypes = data.result;\n    //     })\n    //     .catch((e) => console.log(e));\n    // },\n    showModal() {\n      this.$refs.uploadImagesModal.showModal();\n    },\n    closeModal() {\n      this.$refs.uploadImagesModal.closeModal();\n      this.$emit('closed');\n    },\n    async chooseSourceFolder() {\n      try {\n        const directoryHandle = await showDirectoryPicker({ _preferPolyfill: false });\n        this.parsingFiles = true;\n        const tree = { [directoryHandle.name]: {} };\n        this.sourceDir = directoryHandle.name;\n        this.files_parsed = 0;\n        this.files = [];\n        await this.handleDirectory(directoryHandle, tree, directoryHandle.name);\n        Promise.all(this.files).then((files) => {\n          this.files = files;\n          this.parsingFiles = false;\n        });\n      } catch (error) {\n        console.error(error);\n      }\n    },\n    async handleDirectory(dirhandle, tree, relativePath) {\n      const subtree = {};\n      tree[dirhandle.name] = subtree;\n      for await (const [name, handle] of dirhandle) {\n        if (handle.kind === \"directory\") {\n          const newRelativePath = relativePath ? `${relativePath}/${name}` : name;\n          await this.handleDirectory(handle, subtree, newRelativePath);\n        } else {\n          this.files_parsed++;\n          subtree[name] = \"[file]\";\n          this.files.push(new Promise((resolve, reject) => {\n            handle.getFile().then((file) => {\n              file.relativePath = `${relativePath}/${name}`;\n              resolve(file);\n            });\n          }));\n        }\n      }\n    },\n    sourceSelected() {\n      this.files = this.$refs['importFolder'][0].files;\n      if (this.files.length > 0) {\n        const relativePath = this.files[0].webkitRelativePath;\n        const folder = relativePath.split(\"/\");\n        this.sourceDir = folder[0];\n      }\n    },\n    async handleStartImportScript() {\n      if (!this.sourceDir) {\n        this.message = \"Please select a folder\";\n        return;\n      }\n\n      if (this.files === null || !this.files.length) {\n        this.message = \"No files found in folder\";\n        return;\n      }\n\n      if (!this.taskData?.dataset_id) {\n        alert('Missing dataset_id');\n        return;\n      }\n      if (!this.taskData?.annotation_set_id) {\n        alert('Missing annotation_set_id');\n        return;\n      }\n      if (!this.taskData?.s3_path) {\n        alert('Missing s3_path');\n        return;\n      }\n\n      this.startingImport = true;\n      const resp = await this.s3MultipleImageUpload({\n        fileList: this.files,\n        dataset_id: this.taskData.dataset_id,\n        annotation_set_id: this.taskData.annotation_set_id,\n        s3_path: this.taskData.s3_path,\n      });\n      if (resp) {\n        // this.$emit('upload-complete');\n      }\n    },\n    async s3MultipleImageUpload({\n      fileList, dataset_id, annotation_set_id, s3_path,\n    }) {\n      const keys = [];\n      const params = {};\n\n      // Handle Accounting\n      let maxFileSize = 0;\n      let imgCount = 0;\n      let imgTooLargeErrCount = 0;\n      const imgSizeResp = await this.dataConnect.getAccountingMaxImageSize()\n        .catch((error) => {\n          console.error(error);\n        });\n      maxFileSize = imgSizeResp.result;\n      for (const file of fileList) {\n        const relativePath = file.relativePath || file.webkitRelativePath;\n        const trimmedPath = relativePath.split('/');\n        trimmedPath.shift();\n\n        if (file.type.includes(\"image/\")) {\n          if (file.size <= maxFileSize || maxFileSize === -1) {\n            keys.push(trimmedPath.join('/'));\n            imgCount += 1;\n          } else {\n            imgTooLargeErrCount += 1;\n          }\n        } else {\n          keys.push(trimmedPath.join('/'));\n        }\n      }\n      const checkImageUploadLimitResp = await this.dataConnect.checkImageLimitForAccounting({\n        image_count: imgCount,\n      });\n      if (checkImageUploadLimitResp.result < 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `Not enough credits to perform this operation.`,\n          confirmMessageHeader: 'Insufficient Credits',\n        });\n        this.closeModal();\n        return null;\n      }\n      if (imgTooLargeErrCount > 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `${imgTooLargeErrCount} image(s) were discard due to file size limit.`,\n          confirmMessageHeader: 'Large File Size',\n        });\n      }\n\n      // Handle creating presigned urls\n      const presignedResponse = await this.dataConnect.s3CreatePresignedUrl({\n        dataset_id,\n        keys,\n        importer_source: s3_path,\n      });\n      const newFileList = [];\n      if (presignedResponse.result) {\n        const {\n          importerSource, indexes, presignedUrls, tnPresignedUrls,\n        } = presignedResponse.result;\n        params.import_type = this.taskData.import_type;\n        params.annotation_set_id = annotation_set_id;\n        params.dataset_id = dataset_id;\n        params.dataset_name = this.datasetName;\n        params.task = this.task;\n        if (importerSource) {\n          params.importer_source = importerSource;\n        }\n        presignedUrls.forEach((url, i) => {\n          newFileList.push({\n            url,\n            thumbnail_url: tnPresignedUrls[i],\n            file: fileList[indexes[i]],\n          });\n        });\n      }\n      this.processingFiles = false;\n      console.log(newFileList);\n      const importResponse = await this.$store.dispatch('importer/importByType', { urls: newFileList, importParams: params });\n      return importResponse;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.upload-images {\n  display: flex;\n  flex-direction: column;\n  width: 500px;\n  padding: 1rem 1.5rem;\n  overflow: auto;\n\n  &__drag-drop {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n  }\n}\n\n.source-row {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n\n  &__text-input {\n    width: unset;\n    flex: 1 1 auto;\n    border-radius: 6px 0 0 6px;\n    border-right: 1px solid transparent !important;\n\n    &:focus {\n      margin-right: 1px;\n    }\n  }\n\n  &__folder-btn {\n    flex: 0 1 auto;\n    padding: 2px 8px;\n    height: 100%;\n    border-radius: 0 6px 6px 0;\n    font-size: 0.875rem;\n    font-weight: 600;\n    color: var(--body-text-color-secondary);\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.action-buttons {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 8px;\n}\n\n.disclaimer {\n  margin: 4px 0 8px 0;\n  font-weight: 600;\n  font-style: italic;\n  line-height: 1.15;\n  font-size: 0.875rem;\n  text-align: left;\n  color: var(--body-text-color-secondary);\n}\n</style>\n","import { render } from \"./ResumeUploadImagesModal.vue?vue&type=template&id=00350ccb&scoped=true\"\nimport script from \"./ResumeUploadImagesModal.vue?vue&type=script&lang=js\"\nexport * from \"./ResumeUploadImagesModal.vue?vue&type=script&lang=js\"\n\nimport \"./ResumeUploadImagesModal.vue?vue&type=style&index=0&id=00350ccb&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-00350ccb\"]])\n\nexport default __exports__","import { render } from \"./UploadStatusBar.vue?vue&type=template&id=fabf7d52&scoped=true\"\nimport script from \"./UploadStatusBar.vue?vue&type=script&lang=js\"\nexport * from \"./UploadStatusBar.vue?vue&type=script&lang=js\"\n\nimport \"./UploadStatusBar.vue?vue&type=style&index=0&id=fabf7d52&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-fabf7d52\"]])\n\nexport default __exports__","import { render } from \"./TasksModal.vue?vue&type=template&id=630b1f05&scoped=true\"\nimport script from \"./TasksModal.vue?vue&type=script&lang=js\"\nexport * from \"./TasksModal.vue?vue&type=script&lang=js\"\n\nimport \"./TasksModal.vue?vue&type=style&index=0&id=630b1f05&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-630b1f05\"]])\n\nexport default __exports__","import { render } from \"./Projects.vue?vue&type=template&id=f07ced90\"\nimport script from \"./Projects.vue?vue&type=script&lang=js\"\nexport * from \"./Projects.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","ge<template>\n  <PageLoader\n    v-if=\"!loadingFinished\"\n    :width=\"'200px'\"\n    :height=\"'250px'\"\n    :text=\"'Fetching Data'\"\n  />\n  <template v-else>\n    <div class=\"controls-bar\">\n      <span />\n      <button v-if=\"permissions && permissions.project_write\" class=\"button button-sm\" @click=\"openCreateModal\">Create</button>\n    </div>\n    <div v-if=\"notEmpty && permissions && (permissions.project_read || permissions.project_write)\" class=\"manager-card-container scrollbar\">\n      <ProjectCard\n        v-for=\"p in projectList\"\n        :key=\"p.id\"\n        :project=\"p\"\n        :selected=\"p.id === projectID\"\n        :refresh=\"p.id === refreshCardID\"\n        @edit-project=\"openUpdateProjectModal(p)\"\n        @delete-project=\"openConfirmDeleteProjectModal(p)\"\n        @clicked=\"handleSelectNewProject(p)\"\n        @open-project-access-management=\"handleOpenProjectAccessManagement(p)\"\n      />\n    </div>\n    <div\n      v-else\n      class=\"empty-state\"\n    >\n      <svg width=\"60%\" height=\"60%\">\n        <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n      </svg>\n      <div class=\"empty-state__message\">\n        <h3>No project to display.</h3>\n      </div>\n    </div>\n    <ProjectCreate\n      ref=\"createProjectModal\"\n      @create-project=\"(params) => createProject(params)\"\n    />\n    <ConfirmModal\n      ref=\"confirmModal\"\n      :messageHeader=\"confirmMessageHeader\"\n      :message=\"confirmMessage\"\n      :buttonClass=\"'button-delete'\"\n      :buttonText=\"buttonText\"\n      @confirmed=\"handleDeleteProject\"\n    />\n    <ProjectUpdateModal\n      ref=\"updateProjectModal\"\n      :project=\"modalProject\"\n      @edit-project=\"updateProject\"\n    />\n    <ProjectAccessModal\n      ref=\"projectAccessModal\"\n      :modalProject=\"modalProject\"\n      @refresh-projects=\"getProjectList\"\n    />\n  </template>\n</template>\n\n<script>\nimport ProjectCard from \"@/components/ProjectsComponent/ProjectCard.vue\";\nimport ProjectCreate from \"@/components/ProjectsComponent/ProjectCreate.vue\";\nimport ProjectUpdateModal from '@/components/ProjectsComponent/ProjectUpdateModal.vue';\nimport PageLoader from '@/components/PageLoader.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ProjectAccessModal from \"@/components/ProjectsComponent/ProjectAccessModal.vue\";\n\nexport default {\n  name: 'ProjectManagement',\n  components: {\n    ProjectCard,\n    ProjectCreate,\n    ConfirmModal,\n    PageLoader,\n    ProjectUpdateModal,\n    ProjectAccessModal,\n  },\n  props: {\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(),\n      loadingFinished: true,\n      mergeSource: null,\n      toDelete: null,\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      buttonText: '',\n      refreshCardID: null,\n      modalProject: null,\n      projectList: null,\n    };\n  },\n  computed: {\n    notEmpty() {\n      return this.projectList && this.projectList.length > 0;\n    },\n    projectID() {\n      return this.$store.state.projects.currentProject ? this.$store.state.projects.currentProject.id : 0;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    permissions() {\n      return this.$store.state.user.permissions;\n    },\n  },\n  async mounted() {\n    this.getProjectList();\n  },\n  methods: {\n    async getProjectList() {\n      await this.dataConnect.getProjectList({ get_num_datasets: true })\n        .then((data) => {\n          this.projectList = data.result;\n          let noLT = 0;\n          let noDS = 0;\n          let noTR = 0;\n          let noVA = 0;\n          let noAU = 0;\n\n          this.projectList.forEach((proj) => {\n            noAU += proj.no_of_automations;\n            noLT += proj.no_of_label_tasks;\n            noDS += proj.no_of_datasets;\n            noTR += proj.no_of_trainers;\n            noVA += proj.no_of_validations;\n          });\n\n          for (let k = 0; k < this.projectList.length; k++) {\n            this.projectList[k].total_automations = noAU;\n            this.projectList[k].total_datasets = noDS;\n            this.projectList[k].total_trainers = noTR;\n            this.projectList[k].total_validations = noVA;\n            this.projectList[k].total_label_tasks = noLT;\n          }\n          if (this.modalProject) {\n            const temp = this.projectList.find((e) => e.id === this.modalProject.id);\n            if (temp) {\n              this.modalProject = temp;\n            }\n          }\n          this.$store.commit('projects/setProjectList', this.projectList);\n        })\n        .catch((e) => { console.log(e); });\n    },\n    handleSelectNewProject(p) {\n      this.$store.commit('projects/setCurrentProject', p);\n      this.$store.commit('datasets/resetState');\n    },\n    async handleDeleteProject() {\n      const params = {\n        project_id: this.toDelete.id,\n      };\n      await this.dataConnect.deleteProject(params)\n        .then((data) => {\n          if (data.result) {\n            this.toDelete = null;\n            this.getProjectList();\n            this.handleSelectNewProject(null);\n          }\n        })\n        .catch((e) => { console.log(e); });\n    },\n    handleOpenProjectAccessManagement(project) {\n      this.modalProject = project;\n      this.$nextTick(() => {\n        this.$refs.projectAccessModal.showModal();\n      });\n    },\n    openConfirmDeleteProjectModal(d) {\n      this.confirmMessage = `Are you sure you want to move project \"${d.name}\" to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Project';\n      this.buttonText = 'Remove';\n      this.toDelete = d;\n      this.$refs.confirmModal.showModal();\n    },\n    openCreateModal() {\n      this.$refs.createProjectModal.showModal();\n    },\n    openUpdateProjectModal(p) {\n      this.modalProject = p;\n      this.$refs.updateProjectModal.showModal();\n    },\n    async updateProject(params) {\n      await this.dataConnect.updateProject(params)\n        .then((data) => {\n          if (data.result) {\n            this.getProjectList();\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n    async createProject(params) {\n      const args = { ...params };\n      await this.dataConnect.addProject(args)\n        .then((data) => {\n          if (!data.error) {\n            this.getProjectList();\n          } else if (data.error.message.includes(\"A project with the same name already existed for this user\")) {\n            this.confirmMessage = `A project with the same name already existed for this user.`;\n            this.confirmMessageHeader = 'Project Already Exists';\n            this.buttonText = \"\";\n            this.$refs.confirmModal.showModal();\n          } else if (data.error.message.includes(\"limit reached\")) {\n            this.confirmMessage = `You haved reached the limit for number of projects. Delete unused projects or upgrade your package.`;\n            this.confirmMessageHeader = 'Limit Reached';\n            this.buttonText = \"\";\n            this.$refs.confirmModal.showModal();\n          } else if (data.error.message !== \"\") {\n            this.confirmMessage = data.error.message.charAt(0).toUpperCase() + data.error.message.slice(1);\n            this.confirmMessageHeader = 'Error';\n            this.buttonText = \"\";\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n.manager-card-container {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n  grid-auto-rows: 380px;\n  width: 100%;\n  gap: 16px;\n  padding: 16px;\n  overflow-y: auto;\n  .list-card {\n    height: 100%;\n    width: 100%;\n    cursor: pointer;\n  }\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <BaseCard\n    :id=\"`project-${project.name}`\"\n    ref=\"card\"\n    class=\"card project-card\"\n    :class=\"{ 'project-selected': selected }\"\n    :title=\"title\"\n    @edit-mode=\"(mode) => editTitle = mode\"\n    @apply-edit=\"handleApplyEdit\"\n    @click=\"handleClickEvent\"\n  >\n    <template #header>\n      <BaseMenu\n        v-if=\"permissions && permissions.project_write\"\n        :placement=\"'bottom-start'\"\n      >\n        <IconButton\n          class=\"refresh-icon\"\n          :icon=\"'more_vert'\"\n          :width=\"22\"\n          :height=\"22\"\n        />\n        <template #menu=\"{closeMenu}\">\n          <ul>\n            <li>\n              <BaseMenuButton\n                v-tooltip=\"'Edit project name and description'\"\n                @click.stop=\"handleApplyEdit(), closeMenu()\"\n              >\n                <SVGIcon\n                  :iconName=\"'edit'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Edit</span>\n              </BaseMenuButton>\n            </li>\n            <li>\n              <BaseMenuButton\n                v-tooltip=\"'View and edit project access'\"\n                @click.stop=\"handleManageAccess(), closeMenu()\"\n              >\n                <SVGIcon\n                  :iconName=\"'people'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Manage Access</span>\n              </BaseMenuButton>\n            </li>\n            <li>\n              <BaseMenuButton\n                v-tooltip=\"'Move project to recycle bin. All data under this project will be moved as well'\"\n                class=\"_danger\"\n                @click.stop=\"deleteProject(), closeMenu()\"\n              >\n                <SVGIcon\n                  :iconName=\"'trash'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Move to Recycle Bin</span>\n              </BaseMenuButton>\n            </li>\n          </ul>\n        </template>\n      </BaseMenu>\n    </template>\n    <template #body>\n      <BaseTextExpander v-if=\"project.description\" :text=\"project.description\" class=\"mt-2\" />\n      <div class=\"project-rows\">\n        <div class=\"bar\" :style=\"barstyle\" />\n        <ProjectRow\n          icon=\"database\"\n          tooltip=\"Datasets\"\n          :val=\"project.no_of_datasets\"\n          :max=\"project.total_datasets\"\n          @clicked=\"moveToHandlerPage\"\n        />\n        <ProjectRow\n          icon=\"train\"\n          tooltip=\"Trainers\"\n          :val=\"project.no_of_trainers\"\n          :max=\"project.total_trainers\"\n          @clicked=\"moveToHandlerPage\"\n        />\n        <ProjectRow\n          icon=\"auto_annotate\"\n          tooltip=\"Automations\"\n          :val=\"project.no_of_automations\"\n          :max=\"project.total_automations\"\n          @clicked=\"moveToHandlerPage\"\n        />\n        <ProjectRow\n          icon=\"tag\"\n          tooltip=\"Label Tasks\"\n          :val=\"project.no_of_label_tasks\"\n          :max=\"project.total_label_tasks\"\n          @clicked=\"moveToHandlerPage\"\n        />\n        <ProjectRow\n          icon=\"compare\"\n          tooltip=\"Validate Sessions\"\n          :val=\"project.no_of_validations\"\n          :max=\"project.total_validations\"\n          @clicked=\"moveToHandlerPage\"\n        />\n        <div class=\"bar\" :style=\"barstyle\" />\n      </div>\n    </template>\n  </BaseCard>\n</template>\n<script>\nimport BaseCard from '@/components/BaseCard.vue';\nimport BaseTextExpander from '@/components/BaseTextExpander.vue';\nimport ProjectRow from '@/components/ProjectsComponent/ProjectEntryRow.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  components: {\n    IconButton,\n    BaseCard,\n    BaseTextExpander,\n    ProjectRow,\n    BaseMenu,\n    BaseMenuButton,\n    SVGIcon,\n  },\n  props: {\n    project: {\n      type: Object,\n      default: () => {},\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n    refresh: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: {\n    'delete-project': null, 'clicked': null, 'edit-project': null, 'open-project-access-management': null,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      editTitle: false,\n      datasets: [23, 44],\n      permissions: null,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    barstyle() {\n      const aa = `background: ${this.stringToColour(this.project.name)};`;\n      return aa;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    title() {\n      return this.isDebugMode ? `${this.project.name} (${this.project.id})` : `${this.project.name}`;\n    },\n  },\n  created() {\n    this.GetPermissionsForCurrentUser();\n  },\n  methods: {\n    async GetPermissionsForCurrentUser() {\n      const user = this.$store.state.user.user;\n      await this.dataConnect.getProjectAccessForSingleUser({\n        project_id: this.project.id,\n        username: user.username,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    stringToColour(str) {\n      let hash = 0;\n      str.split('').forEach((char) => {\n        hash = char.charCodeAt(0) + ((hash << 5) - hash);\n      });\n      let colour = '#';\n      for (let i = 0; i < 3; i++) {\n        const value = (hash >> (i * 8)) & 0xff;\n        colour += value.toString(16).padStart(2, '0');\n      }\n      return colour;\n    },\n    deleteProject() {\n      this.$emit('delete-project');\n    },\n    handleClickEvent() {\n      this.$emit('clicked');\n    },\n    moveToHandlerPage(name) {\n      this.handleClickEvent();\n      if (name.toLowerCase() === \"datasets\") this.$router.push({ path: '/datasets' });\n      if (name.toLowerCase() === \"trainers\") this.$router.push({ path: '/trainer' });\n      if (name.toLowerCase() === \"automations\") this.$router.push({ path: '/automation' });\n      if (name.toLowerCase() === \"label tasks\") this.$router.push({ path: '/taskboard' });\n      if (name.toLowerCase() === \"validations\") this.$router.push({ path: '/validator' });\n    },\n    handleApplyEdit() {\n      this.$emit('edit-project');\n    },\n    handleManageAccess() {\n      this.$emit('open-project-access-management');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.bar {\n  width: 100%;\n  height: 3px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  background: red;\n}\n.project-selected {\n  @include themify() {\n    outline: 3px solid themed('card-list-color-selected-border')\n  }\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n.details {\n  margin-top: auto;\n  &__row {\n    display: flex;\n    flex-direction: row;\n    margin-top: 8px;\n  }\n  label {\n    width: fit-content;\n    font-weight: 600;\n    margin-right: 8px;\n  }\n  span {\n    flex: 1 1 auto;\n  }\n}\n\n.delete-project-icon,\n.apply-edit-icon,\n.edit-data-icon,\n.database-icon {\n  visibility: hidden;\n}\n\n.card:hover .database-icon,\n.card:hover .apply-edit-icon,\n.card:hover .edit-data-icon,\n.card:hover .delete-project-icon {\n  visibility: visible;\n  @include themify() {\n    color: themed('icon-color-inactive');\n  }\n}\n\n.card:hover .database-icon:hover,\n.card:hover .apply-edit-icon:hover,\n.card:hover .edit-data-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.card:hover .delete-project-icon:hover {\n  @include themify() {\n    color: themed('color-red');\n  }\n}\n\n.project-card {\n  min-width: 300px;\n  max-width: 500px;\n  height: 100%;\n}\n\n.project-rows {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  justify-content: space-between;\n}\n\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <OnClickOutside @trigger=\"handleClickOutside\">\n    <div\n      ref=\"container\"\n      class=\"text-expander\"\n      :class=\"{_expand: expand_text, ellipsisActive: isEllipsisActive}\"\n      @click.stop=\"handleTextClick\"\n    >\n      <p\n        ref=\"textEl\"\n        :title=\"text\"\n        class=\"text-expander__content\"\n        :class=\"{ellipsisActive: isEllipsisActive}\"\n      >\n        {{ text }}\n      </p>\n    </div>\n  </OnClickOutside>\n</template>\n\n<script>\nimport { OnClickOutside } from '@vueuse/components';\nimport { useResizeObserver } from '@vueuse/core';\n\nexport default {\n  name: 'BaseTextExpander',\n  components: {\n    OnClickOutside,\n  },\n  props: {\n    text: {\n      type: String,\n      default: '',\n    },\n  },\n  data() {\n    return {\n      expand_text: false,\n      isEllipsisActive: false,\n    };\n  },\n  watch: {\n    expand_text() {\n      this.$nextTick(() => {\n        this.isEllipsisActive = this.checkIsEllipsisActive(this.$refs.textEl);\n      });\n    },\n  },\n  mounted() {\n    this.isEllipsisActive = this.checkIsEllipsisActive(this.$refs.textEl);\n\n    useResizeObserver(this.$refs.container, () => {\n      this.isEllipsisActive = this.checkIsEllipsisActive(this.$refs.textEl);\n    });\n  },\n  methods: {\n    handleTextClick() {\n      if (this.isEllipsisActive) {\n        this.expand_text = true;\n      }\n    },\n    handleClickOutside() {\n      this.expand_text = false;\n    },\n    checkIsEllipsisActive(el) {\n      return (el.offsetHeight < el.scrollHeight);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.text-expander {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  line-height: 1.2rem;\n  border-radius: 4px;\n  @include themify() {\n    background: themed('card-color');\n  }\n\n  &.ellipsisActive:hover {\n    box-shadow: 0px 2px 5px rgb(0 0 0 / 25%), 0 0 0 1px rgb(0 0 0 / 10%);\n    padding: 4px;\n    margin: -4px;\n  }\n\n  &__content {\n    font-size: 14px;\n    font-weight: 600;\n    margin: 0;\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    @include themify() {\n      background: themed('card-color');\n    }\n    max-height: 2.4rem;\n  }\n\n  p {\n    text-align: left;\n  }\n\n  p.ellipsisActive {\n    cursor: pointer;\n  }\n\n  &._expand {\n    height: 2.4rem;\n\n    .text-expander__content {\n      position: absolute;\n      -webkit-line-clamp: unset;\n      z-index: 2;\n      top: 0;\n      padding: 8px;\n      margin: -8px;\n      border-radius: 4px;\n      box-shadow: 0px 2px 5px rgb(0 0 0 / 25%), 0 0 0 1px rgb(0 0 0 / 10%);\n      max-height: fit-content;\n    }\n  }\n}\n</style>\n","import { render } from \"./BaseTextExpander.vue?vue&type=template&id=606ded94&scoped=true\"\nimport script from \"./BaseTextExpander.vue?vue&type=script&lang=js\"\nexport * from \"./BaseTextExpander.vue?vue&type=script&lang=js\"\n\nimport \"./BaseTextExpander.vue?vue&type=style&index=0&id=606ded94&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-606ded94\"]])\n\nexport default __exports__","<template>\n  <div class=\"project-row\">\n    <IconButton\n      v-tooltip=\"tooltip\"\n      class=\"project-row__icon\"\n      :icon=\"icon\"\n      :width=\"32\"\n      :height=\"32\"\n      :type=\"''\"\n      @click=\"handleClickEvent(tooltip)\"\n    />\n\n    <div class=\"stack\">\n      <div class=\"stack__value-row\">\n        <span>{{ val }}</span>\n        <label>{{ tooltip }}</label>\n      </div>\n      <progress\n        :value=\"!isNaN(val/max) ? (val*100/max) : 0\"\n        :max=\"100\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\nimport IconButton from '../IconButton.vue';\n\nexport default {\n  components: {\n    IconButton,\n  },\n  props: {\n    icon: {\n      type: String,\n      default: \"database\",\n    },\n    tooltip: {\n      type: String,\n      default: \"Database\",\n    },\n\n    val: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 1,\n    },\n\n  },\n\n  emits: {\n    'delete-project': null, 'clicked': null, 'edit-project': null,\n  },\n  methods: {\n    handleClickEvent(name) {\n      this.$emit('clicked', name);\n    },\n\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.project-row {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: nowrap;\n  width:100%;\n  height: 38px;\n  padding: 0px;\n  margin-top: 8px;\n  font-size: small;\n\n  &__icon {\n    color: var(--color-primary);\n  }\n}\n\n.stack{\n  display: flex;\n  flex-direction: column;\n  flex-wrap: nowrap;\n  width:100%;\n  height: 38px;\n  padding-left: 8px;\n  padding-right: 8px;\n  margin: 0px;\n\n  &__value-row {\n    display: flex;\n    flex-direction: row;\n    gap: 6px;\n    align-items: baseline;\n\n    span {\n      font-size: 1rem;\n      font-weight: 700;\n    }\n\n    label {\n      font-size: 0.875rem;\n      font-weight: 500;\n      color: var(--body-text-color-secondary);\n    }\n  }\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  button + button {\n    margin: 4px;\n  }\n}\n\nprogress {\n  border-radius: 10px;\n  width: 100%;\n  height: 8px;\n  padding: 1px;\n}\n\nprogress::-webkit-progress-value {\n  background-color: var(--progress-value);\n  border-radius: 10px;\n}\n\nprogress::-moz-progress-bar {\n  background-color: var(--progress-bar);\n}\n\nprogress::-webkit-progress-bar {\n  background-color: var(--progress-bar);\n}\n  </style>\n","import { render } from \"./ProjectEntryRow.vue?vue&type=template&id=1b8b0d87&scoped=true\"\nimport script from \"./ProjectEntryRow.vue?vue&type=script&lang=js\"\nexport * from \"./ProjectEntryRow.vue?vue&type=script&lang=js\"\n\nimport \"./ProjectEntryRow.vue?vue&type=style&index=0&id=1b8b0d87&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1b8b0d87\"]])\n\nexport default __exports__","import { render } from \"./ProjectCard.vue?vue&type=template&id=6e6f35aa&scoped=true\"\nimport script from \"./ProjectCard.vue?vue&type=script&lang=js\"\nexport * from \"./ProjectCard.vue?vue&type=script&lang=js\"\n\nimport \"./ProjectCard.vue?vue&type=style&index=0&id=6e6f35aa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6e6f35aa\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createProjectModal\"\n    :title=\"'Create New Project'\"\n    :width=\"'700px'\"\n    @closed=\"clearData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mt-2\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"label required\">Name</label>\n            <input\n              v-model=\"createNewName\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"createNewDescription\"\n              rows=\"2\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button class=\"button\" @click=\"createProject\">Create</button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'ProjectCreate',\n  components: {\n    Modal,\n  },\n  emits: {\n    'create-project': null,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      createNewName: '',\n      createNewDescription: '',\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n  },\n  methods: {\n    showModal() {\n      this.getUsersListByOrganization(this.user.organization_id);\n      this.$refs.createProjectModal.showModal();\n    },\n    clearData() {\n      this.createNewName = '';\n      this.createNewDescription = '';\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.createProjectModal.closeModal();\n    },\n    createProject() {\n      const args = {\n        project_name: this.createNewName,\n        description: this.createNewDescription,\n      };\n\n      this.$emit('create-project', args);\n      this.closeModal();\n    },\n    async getUsersListByOrganization(id) {\n      await this.dsConn.getUserListByOrganization({\n        organization_id: id,\n      })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.close-button {\n  @include themify() {\n    background: themed('button-secondary');\n    color: themed('button-secondary-text');\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n</style>\n","import { render } from \"./ProjectCreate.vue?vue&type=template&id=6a87e2ef&scoped=true\"\nimport script from \"./ProjectCreate.vue?vue&type=script&lang=js\"\nexport * from \"./ProjectCreate.vue?vue&type=script&lang=js\"\n\nimport \"./ProjectCreate.vue?vue&type=style&index=0&id=6a87e2ef&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6a87e2ef\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"updateProjectModal\"\n    :title=\"'Edit Project Information'\"\n    @closed=\"clearData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Name</label>\n            <input\n              v-model=\"name\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"description\"\n              rows=\"4\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button class=\"button button-sm\" @click=\"apply\">{{ 'Apply Changes' }}</button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'ProjectUpdateModal',\n  components: {\n    Modal,\n  },\n  props: {\n    project: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: {\n    'edit-project': null,\n  },\n  data() {\n    return {\n      name: '',\n      description: '',\n    };\n  },\n  watch: {\n    project(d) {\n      if (d) {\n        this.name = this.project.name;\n        this.description = this.project.description;\n      }\n    },\n  },\n  methods: {\n    showModal() {\n      this.$refs.updateProjectModal.showModal();\n    },\n    clearData() {\n      this.name = \"\";\n      this.description = \"\";\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.updateProjectModal.closeModal();\n    },\n    apply() {\n      if (this.name) {\n        this.$emit('edit-project', { name: this.name, description: this.description, project_id: this.project.id });\n      }\n      this.closeModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.close-button {\n  @include themify() {\n    background: themed('button-secondary');\n    color: themed('button-secondary-text');\n  }\n}\n</style>\n","import { render } from \"./ProjectUpdateModal.vue?vue&type=template&id=1f6dc788&scoped=true\"\nimport script from \"./ProjectUpdateModal.vue?vue&type=script&lang=js\"\nexport * from \"./ProjectUpdateModal.vue?vue&type=script&lang=js\"\n\nimport \"./ProjectUpdateModal.vue?vue&type=style&index=0&id=1f6dc788&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1f6dc788\"]])\n\nexport default __exports__","<template>\n  <div class=\"disable-background\">\n    <div class=\"loader-modal\" :style=\"{ width: width, height: height }\">\n      <div class=\"loader-modal__loader loader\" />\n      <span class=\"loader-modal__text\">{{ text }}</span>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'PageLoader',\n  props: {\n    text: {\n      type: String,\n      default: '',\n    },\n    width: {\n      type: String,\n      default: undefined,\n    },\n    height: {\n      type: String,\n      default: undefined,\n    },\n  },\n\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.disable-background{\n  position: fixed;\n  top: 0px;\n  bottom: 0px;\n  left: 0px;\n  right: 0px;\n  width: 100%;\n  height: 100%;\n  background: rgba(0, 0, 0, 0.625);\n  outline: none;\n  z-index: 100;\n}\n\n.loader-modal {\n  position:absolute;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-evenly;\n  padding: 20px;\n  top:50%;\n  left:50%;\n  transform:translate(-50%, -50%);\n  border-radius: 6px;\n  z-index: 1000;\n  @include themify() {\n    background-color: themed('modal-background');\n  }\n\n  &__loader {\n    width: 60px !important;\n    height: 60px !important;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  &__text {\n    font-weight: 600;\n  }\n}\n</style>\n","import { render } from \"./PageLoader.vue?vue&type=template&id=aec1149e&scoped=true\"\nimport script from \"./PageLoader.vue?vue&type=script&lang=js\"\nexport * from \"./PageLoader.vue?vue&type=script&lang=js\"\n\nimport \"./PageLoader.vue?vue&type=style&index=0&id=aec1149e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-aec1149e\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"projectAccessModal\"\n    :title=\"modalProject ? modalProject.name : 'Manage Project Access'\"\n    :width=\"'700px'\"\n    @closed=\"resetData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div v-if=\"shareMode==='custom'\" class=\"row mt-2\">\n          <div class=\"header-buttons\">\n            <button\n              class=\"button button-back\"\n              aria-label=\"Back\"\n              :title=\"'Back'\"\n              :class=\"{ 'invisible' : mode !== 'new' }\"\n              @click=\"() => mode = 'users'\"\n            >\n              <SVGIcon\n                class=\"me-1\"\n                :iconName=\"'chevron_left'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Back</span>\n            </button>\n            <button\n              class=\"button button-mode\"\n              aria-label=\"Add Users\"\n              :title=\"'Add New Users'\"\n              :class=\"{ 'invisible' : mode !== 'users' }\"\n              @click=\"() => mode = 'new'\"\n            >\n              <SVGIcon\n                class=\"me-1\"\n                :iconName=\"'person_add'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Add Users</span>\n            </button>\n          </div>\n        </div>\n        <div v-if=\"mode === 'users'\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"label required\">Access Sharing</label>\n            <div class=\"value permission-list\">\n              <div class=\"role-grid-single-row\">\n                <v-radio-group\n                  v-model=\"shareMode\"\n                  :density=\"'compact'\"\n                  :hide-details=\"true\"\n                >\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"default\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Default sharing</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Share this project with everyone in your organization, using their default permissions.</span>\n                  </div>\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"custom\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Custom sharing</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Share this project with selected members, using custom permissions.</span>\n                  </div>\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"private\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Private</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Only you can access this project.</span>\n                  </div>\n                </v-radio-group>\n              </div>\n            </div>\n          </div>\n        </div>\n        <template v-if=\"mode === 'users'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Users with access to this project</label>\n              <ul class=\"mt-1 users scrollbar\">\n                <li\n                  v-for=\"(user, index) in accessListByType.sort(sortByName)\"\n                  :key=\"index\"\n                  class=\"users__list-item\"\n                >\n                  <div class=\"users__container\" :class=\"{ 'slashed': remove.indexOf(user.username) > -1 }\">\n                    <div class=\"users__icon\">\n                      <UserIcon\n                        v-if=\"user.username\"\n                        :user=\"user\"\n                        :size=\"'32px'\"\n                      />\n                    </div>\n                    <div class=\"users__content\">\n                      <span class=\"users__username\">{{ user.first_name && user.last_name ? `${user.first_name} ${user.last_name}` : user.username }}</span>\n                      <span class=\"users__email\">{{ user.email }}</span>\n                    </div>\n                    <template v-if=\"(user.username === currentUser.username ) || shareMode==='default'\">\n                      <div class=\"users__role\">\n                        <template v-if=\"user.project_read && !user.project_write && !user.annotator_write\">\n                          <SVGIcon\n                            :iconName=\"'visibility'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Viewer</span>\n                        </template>\n                        <template v-else-if=\"user.project_write\">\n                          <SVGIcon\n                            :iconName=\"'edit'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Editor</span>\n                        </template>\n                        <template v-else-if=\"user.project_read && !user.project_write && (user.annotator_read && user.annotator_write)\">\n                          <SVGIcon\n                            :iconName=\"'tag'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Auditor</span>\n                        </template>\n                        <template v-else>\n                          <span>No Access</span>\n                        </template>\n                      </div>\n                    </template>\n                    <template v-else>\n                      <BaseMenu\n                        :placement=\"'bottom-end'\"\n                        :appendToBody=\"true\"\n                      >\n                        <div class=\"users__role editable\">\n                          <template v-if=\"user.project_read && !user.project_write && !user.annotator_write\">\n                            <SVGIcon\n                              :iconName=\"'visibility'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Viewer</span>\n                          </template>\n                          <template v-else-if=\"user.project_write\">\n                            <SVGIcon\n                              :iconName=\"'edit'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Editor</span>\n                          </template>\n                          <template v-else-if=\"user.project_read && !user.project_writed && (user.annotator_read && user.annotator_write)\">\n                            <SVGIcon\n                              :iconName=\"'tag'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Auditor</span>\n                          </template>\n                          <template v-else>\n                            <span>No Access</span>\n                          </template>\n                          <SVGIcon\n                            :iconName=\"'chevron_left'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"dropdown-role\"\n                          />\n                        </div>\n                        <template #menu=\"{closeMenu}\">\n                          <ul>\n                            <li>\n                              <BaseMenuButton @click=\"selectAccess(user, 'viewer'), closeMenu()\">\n                                <SVGIcon\n                                  :iconName=\"'visibility'\"\n                                  :width=\"'22px'\"\n                                  :height=\"'22px'\"\n                                />\n                                <span>Viewer</span>\n                              </BaseMenuButton>\n                            </li>\n                            <li>\n                              <BaseMenuButton @click=\"selectAccess(user, 'editor'), closeMenu()\">\n                                <SVGIcon\n                                  :iconName=\"'edit'\"\n                                  :width=\"'22px'\"\n                                  :height=\"'22px'\"\n                                />\n                                <span>Editor</span>\n                              </BaseMenuButton>\n                            </li>\n                          </ul>\n                          <hr>\n                          <ul>\n                            <li>\n                              <BaseMenuButton class=\"_danger\" @click.stop=\"toggleRemoveAccess(user.username), closeMenu()\">\n                                <template v-if=\"remove.indexOf(user.username) > -1\">\n                                  <SVGIcon\n                                    :iconName=\"'close'\"\n                                    :width=\"'22px'\"\n                                    :height=\"'22px'\"\n                                  />\n                                  <span>Cancel</span>\n                                </template>\n                                <template v-else>\n                                  <SVGIcon\n                                    :iconName=\"'trash'\"\n                                    :width=\"'22px'\"\n                                    :height=\"'22px'\"\n                                  />\n                                  <span>Remove Access</span>\n                                </template>\n                              </BaseMenuButton>\n                            </li>\n                          </ul>\n                        </template>\n                      </BaseMenu>\n                    </template>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </template>\n        <template v-else-if=\"mode === 'new'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Add users by name or e-mail</label>\n            </div>\n          </div>\n          <div class=\"row\">\n            <v-combobox\n              v-model=\"userInputValue\"\n              class=\"combobox\"\n              chips\n              clearable\n              multiple\n              :density=\"'comfortable'\"\n              :hide-details=\"true\"\n              :label=\"'Add People'\"\n              :items=\"formatOrgUserListObject\"\n              :item-title=\"(obj) => obj['username']\"\n              :item-value=\"(obj) => obj['username']\"\n              :return-object=\"false\"\n              variant=\"outlined\"\n            />\n          </div>\n          <div class=\"row mt-2\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Permissions</label>\n            </div>\n          </div>\n          <div class=\"row mt-2\">\n            <label class=\"label\">Project</label>\n            <div class=\"value permission-list\">\n              <div class=\"role-grid\">\n                <div class=\"chkbx-li\">\n                  <v-checkbox\n                    v-model=\"role_viewer\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                  >\n                    <template #label>\n                      <div class=\"label-text\">Viewer</div>\n                    </template>\n                  </v-checkbox>\n                </div>\n                <div class=\"chkbx-li\">\n                  <v-checkbox\n                    v-model=\"role_writer\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                  >\n                    <template #label>\n                      <div class=\"label-text\">Editor</div>\n                    </template>\n                  </v-checkbox>\n                </div>\n              </div>\n            </div>\n          </div>\n        </template>\n        <div v-if=\"message\" class=\"row mt-2\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          v-if=\"mode === 'users'\"\n          class=\"button modal-action-button\"\n          :disabled=\"!hasChanges && !hasRemoved && !hasAccessModeChange\"\n          @click=\"confirmChanges\"\n        >\n          Confirm\n        </button>\n        <button\n          v-else-if=\"mode === 'new'\"\n          class=\"button modal-action-button\"\n          @click=\"addAccess\"\n        >\n          Add Users\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport { toRaw } from 'vue';\nimport { deepCompare } from '@/assets/js/utils.js';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: 'ProjectAccessModal',\n  components: {\n    Modal,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    UserIcon,\n  },\n  props: {\n    modalProject: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['refresh-projects'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      mode: 'users',\n      organizationDefaultAccessList: [],\n      originalProjectAccessList: [],\n      projectAccessList: [],\n      orgUserList: [],\n      userInputValue: [],\n      remove: [],\n      role_viewer: true,\n      role_writer: false,\n      project_read: true,\n      project_write: false,\n      dataset_read: true,\n      dataset_write: false,\n      trainer_read: true,\n      trainer_write: false,\n      annotator_read: true,\n      annotator_write: false,\n      message: '',\n      originalShareMode: '',\n      shareMode: '',\n    };\n  },\n  computed: {\n    currentUser() {\n      return this.$store.state.user.user;\n    },\n    formatOrgUserListObject() {\n      if (this.orgUserList.length > 0) {\n        const temp = this.orgUserList.map((e) => ({ username: e.username, email: e.email }));\n        return temp.filter((e) => this.projectAccessList.find((el) => el.username === e.username) === undefined);\n      } else {\n        return [];\n      }\n    },\n    hasRemoved() {\n      if (this.remove.length > 0) {\n        return true;\n      }\n      return false;\n    },\n    hasChanges() {\n      let tempChange = false;\n      this.projectAccessList.forEach((project_access, index) => {\n        if (!this.deepCompare(project_access, this.originalProjectAccessList[index])) {\n          tempChange = true;\n        }\n      });\n      return tempChange;\n    },\n    hasAccessModeChange() {\n      if (this.originalShareMode !== this.shareMode && this.shareMode !== 'custom') {\n        return true;\n      }\n      return false;\n    },\n    accessListByType() {\n      if (this.shareMode === 'default') {\n        return this.organizationDefaultAccessList;\n      } else if (this.shareMode === 'custom') {\n        return this.projectAccessList;\n      } else if (this.shareMode === 'private') {\n        return this.projectAccessList.filter((e) => e.username === this.currentUser.username);\n      } else {\n        return [];\n      }\n    },\n    sortByName() {\n      return () => this.sortByName;\n    },\n  },\n  watch: {\n    shareMode(r) {\n      if (r === 'default') {\n        this.mode = 'users';\n        this.projectAccessList = structuredClone(toRaw(this.originalProjectAccessList));\n      }\n    },\n    role_writer(value) {\n      if (value) {\n        this.role_viewer = true;\n      }\n    },\n    modalProject: {\n      immediate: true,\n      handler() {\n        this.shareMode = this.modalProject ? this.modalProject.permission_type : 'default';\n        this.originalShareMode = this.modalProject ? this.modalProject.permission_type : 'default';\n      },\n    },\n  },\n  async mounted() {\n    if (this.currentUser) {\n      this.orgUserList = await this.getUsersListByOrganization(this.currentUser.organization_id);\n    }\n  },\n  methods: {\n    deepCompare,\n    async getOrganizationDefaultPermissions() {\n      await this.dsConn.getOrganizationDefaultPermissions()\n        .then((data) => {\n          if (data.result) {\n            this.organizationDefaultAccessList = data.result.sort((a, b) => {\n              if (a.username < b.username) {\n                return -1;\n              }\n              if (a.username > b.username) {\n                return 1;\n              }\n              // names must be equal\n              return 0;\n            });\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    toggleRemoveAccess(username) {\n      const index = this.remove.indexOf(username);\n      if (index < 0) {\n        this.remove.push(username);\n      } else {\n        this.remove.splice(index, 1);\n      }\n    },\n    showModal() {\n      this.$refs.projectAccessModal.showModal();\n      this.getProjectAccessList();\n      this.getOrganizationDefaultPermissions();\n      this.shareMode = this.modalProject ? this.modalProject.permission_type : 'default';\n      this.originalShareMode = this.modalProject ? this.modalProject.permission_type : 'default';\n    },\n    closeModal() {\n      this.resetData();\n    },\n    resetData() {\n      this.projectAccessList = [];\n      this.originalProjectAccessList = [];\n      this.organizationDefaultAccessList = [];\n      this.userInputValue = [];\n      this.message = \"\";\n      this.remove = [];\n      this.mode = 'users';\n    },\n    async getUsersListByOrganization(id) {\n      const resp = await this.dsConn.getUserListByOrganization({\n        organization_id: id,\n      })\n        .catch((error) => {\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async getProjectAccessList() {\n      if (this.modalProject) {\n        await this.dsConn.getProjectAccessList({ project_id: this.modalProject.id })\n          .then((data) => {\n            if (data.result) {\n              const temp = data.result;\n              temp.sort((a, b) => {\n                if (a.last_name < b.last_name) {\n                  return -1;\n                }\n                if (a.last_name > b.last_name) {\n                  return 1;\n                }\n                // names must be equal\n                return 0;\n              });\n\n              this.projectAccessList = temp;\n              this.originalProjectAccessList = structuredClone(temp);\n            } else {\n              this.resetData();\n            }\n          })\n          .catch((e) => {\n            console.log(e);\n          });\n      }\n    },\n    async confirmChanges() {\n      this.message = \"\";\n      const promises = [];\n      const deleted_ids = [];\n      const updated_project_access = [];\n      if (this.hasAccessModeChange && this.shareMode === 'default') {\n        promises.push(this.revertProjectAccessToDefault());\n      } else if (this.hasAccessModeChange && this.shareMode === 'private') {\n        promises.push(this.setProjectAccessToPrivate());\n      } else if (this.shareMode === 'custom') {\n        this.projectAccessList.filter((e) => this.remove.indexOf(e.username) > -1).forEach((project_access, index) => {\n          deleted_ids.push(project_access.username);\n        });\n        if (this.hasChanges) {\n          this.projectAccessList.filter((e) => this.remove.indexOf(e.username) < 0).forEach((project_access, index) => {\n            updated_project_access.push(project_access);\n          });\n        }\n\n        if (deleted_ids.length > 0) {\n          promises.push(this.deleteProjectAccess(deleted_ids));\n        }\n\n        if (updated_project_access.length > 0) {\n          promises.push(this.updateProjectAccess(updated_project_access));\n        }\n      }\n\n      await Promise.all(promises)\n        .then(async () => {\n          this.getProjectAccessList();\n          this.remove = [];\n          this.$emit('refresh-projects');\n        });\n    },\n    async revertProjectAccessToDefault() {\n      await this.dsConn.revertProjectAccessToDefault({\n        project_id: this.modalProject.id,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async setProjectAccessToPrivate() {\n      await this.dsConn.setProjectAccessToPrivate({\n        project_id: this.modalProject.id,\n        username: this.currentUser.username,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async updateProjectAccess(project_access_list) {\n      await this.dsConn.updateProjectAccess({\n        project_id: this.modalProject.id,\n        project_access_list,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async deleteProjectAccess(project_access_usernames) {\n      await this.dsConn.deleteProjectAccess({\n        project_id: this.modalProject.id,\n        project_access_usernames,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    selectAccess(user, role) {\n      switch (role) {\n      case 'viewer':\n        user.project_read = true;\n        user.project_write = false;\n        user.dataset_read = true;\n        user.dataset_write = false;\n        user.trainer_read = true;\n        user.trainer_write = false;\n        user.annotator_read = true;\n        user.annotator_write = false;\n        break;\n      case 'editor':\n        user.project_read = true;\n        user.project_write = true;\n        user.dataset_read = true;\n        user.dataset_write = true;\n        user.trainer_read = true;\n        user.trainer_write = true;\n        user.annotator_read = true;\n        user.annotator_write = true;\n        break;\n      default:\n        break;\n      }\n    },\n    async addAccess() {\n      this.message = \"\";\n      const orginalNameMap = this.originalProjectAccessList.map((e) => e.username);\n      const overlap = this.userInputValue.some((r) => orginalNameMap.includes(r));\n      if (this.userInputValue.length === 0) {\n        this.message = \"Please select one or more users.\";\n        return;\n      }\n      if (overlap) {\n        this.message = \"One or more users already has access to this project.\";\n        return;\n      }\n      const permissions = {};\n      if (this.role_viewer) {\n        permissions.project_read = true;\n        permissions.project_write = false;\n        permissions.dataset_read = true;\n        permissions.dataset_write = false;\n        permissions.trainer_read = true;\n        permissions.trainer_write = false;\n        permissions.annotator_read = true;\n        permissions.annotator_write = false;\n      } else if (this.role_writer) {\n        permissions.project_read = true;\n        permissions.project_write = true;\n        permissions.dataset_read = true;\n        permissions.dataset_write = true;\n        permissions.trainer_read = true;\n        permissions.trainer_write = true;\n        permissions.annotator_read = true;\n        permissions.annotator_write = true;\n      } else {\n        this.message = \"Missing permissions.\";\n        return;\n      }\n\n      await this.dsConn.addProjectAccess({\n        project_id: this.modalProject.id,\n        usernames: this.userInputValue,\n        permissions,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.userInputValue = [];\n            this.getProjectAccessList();\n            this.remove = [];\n            this.mode = 'users';\n            this.$emit('refresh-projects');\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 480px;\n  overflow: visible;\n}\n\n.header-buttons{\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n\n  .invisible {\n    visibility: hidden;\n  }\n}\n\n.combobox {\n  margin: 1px 0;\n  width: 100%;\n  padding-top: 8px;\n  border-radius: 8px;\n}\n\n.users {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  list-style: none;\n  width: 100%;\n  max-height: 450px;\n  padding: 0 15px 0 15px;\n  margin: 0;\n  overflow-y: scroll;\n\n  &__list-item {\n    margin: 0px -8px;\n    padding: 4px 8px;\n\n    &:hover {\n      background: var(--hover-background);\n    }\n  }\n\n  &__container {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n  }\n\n  &__icon {\n    padding-right: 16px;\n  }\n\n  &__initials {\n    display: flex;\n    flex: 0 0 auto;\n    width: 32px;\n    height: 32px;\n    // cursor: pointer;\n    border: none;\n    border-radius: 50%;\n    background: #053c8f;\n    color: white;\n    justify-content: center;\n    align-items: center;\n  }\n\n  &__content {\n    display: flex;\n    flex-direction: column;\n    text-align: left;\n    flex: 1 1 auto;\n  }\n\n  &__username {\n    font-weight: 600;\n    font-size: 16px;\n  }\n\n  &__email {\n    font-weight: 400;\n    font-size: 12px;\n  }\n\n  &__role {\n    border-radius: 32px;\n    height: 34px;\n    width: 102px;\n    padding: 2px 0 2px 2px;\n    font-size: 0.9rem;\n    font-weight: 600;\n    display: flex;\n    align-items: center;\n    justify-content: flex-end;\n  }\n\n  .slashed {\n    position: relative;\n  }\n\n  .slashed::after {\n    content: \"\";\n    position: absolute;\n    width: 100%;\n    height: 1px;\n    top: 50%;\n    left: -10px;\n    background: var(--color-red-600);\n  }\n\n  .dropdown-role{\n    margin-left: 5px;\n  }\n\n  .editable {\n    .dropdown-role {\n        transform: rotate(-90deg);\n      }\n  }\n\n  .editable:hover {\n    padding: 2px 0 2px 2px;\n    background: rgba(185, 184, 184, 0.5);\n    cursor: pointer;\n  }\n\n  .role-icon {\n    margin-right: 5px;\n  }\n}\n\n.italic {\n  font-style: italic;\n}\n\n.removing {\n  font-weight: 600;\n  @include themify() {\n    color: themed('color-red-600');\n  }\n}\n\n.button-mode {\n  background: none;\n  height: 35px;\n  color: var(--body-text-color);\n  padding: 10px 10px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  text-transform: capitalize;\n  font-size: 0.9rem;\n  font-weight: 550;\n  border: 1px solid rgb(76, 76, 76);\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n\n  &.active {\n    border: 1px solid transparent;\n    background: var(--color-primary);\n    color: var(--button-text-color);\n  }\n}\n\n.button-back {\n  background: none;\n  color: var(--body-text-color);\n  padding: 10px 6px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  border-radius: 4px;\n  text-transform: capitalize;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n}\n\n.remove-row {\n  justify-content: flex-end;\n  &__button {\n    font-weight: 600;\n    font-size: 14px;\n    width: fit-content;\n    margin-right: 5px;\n    border-radius: 20px;\n    padding: 2px 5px 2px 5px;\n    color: var(--color-red-600);\n    border: 1px solid var(--color-red-600);\n\n    &:hover{\n      cursor: pointer;\n      background: rgba(red, 0.1);\n    }\n  }\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: start;\n  width: 130px;\n  margin-top: 10px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n\n}\n\n.row > .value {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr 1fr;\n  grid-auto-rows: auto;\n  width: 100%;\n}\n\n.role-grid-single-row {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr;\n  grid-auto-rows: auto;\n\n  .label-text {\n    width: 200px;\n  }\n}\n\n.permission-list {\n  display: flex;\n  flex-direction: column !important;\n  width: 100%;\n\n  &__title {\n    margin: 5px 0 5px 0;\n    font-size: 1rem;\n    font-weight: 600;\n    color: rgba(rgb(0, 0, 0), 0.7);\n  }\n}\n\n.chkbx-li {\n  display: flex;\n  flex-direction: column;\n  align-items: start;\n\n  &__subtitle {\n    text-align: left;\n    margin-left: 30px;\n    font-size: 0.85rem;\n    color: rgba(grey, 0.95);\n  }\n}\n\n.chkbx-li +.chkbx-li {\n  margin-top: 10px;\n}\n\n.label-text {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin-left: 2px;\n  width: 100px;\n}\n\n:deep() {\n  .v-label {\n    opacity: 1 !important;\n  }\n  .v-expansion-panel:not(:first-child)::after {\n    border-style: none;\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n</style>\n","import { render } from \"./ProjectAccessModal.vue?vue&type=template&id=d2a1e30e&scoped=true\"\nimport script from \"./ProjectAccessModal.vue?vue&type=script&lang=js\"\nexport * from \"./ProjectAccessModal.vue?vue&type=script&lang=js\"\n\nimport \"./ProjectAccessModal.vue?vue&type=style&index=0&id=d2a1e30e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d2a1e30e\"]])\n\nexport default __exports__","import { render } from \"./ProjectManagement.vue?vue&type=template&id=89011416&scoped=true\"\nimport script from \"./ProjectManagement.vue?vue&type=script&lang=js\"\nexport * from \"./ProjectManagement.vue?vue&type=script&lang=js\"\n\nimport \"./ProjectManagement.vue?vue&type=style&index=0&id=89011416&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-89011416\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template #page-slot>\n        <BreadcrumbSelect\n          id=\"project-select\"\n          v-model=\"currentProject\"\n          :options=\"projectList\"\n          :placeholder=\"'Project'\"\n          :displayTag=\"'name'\"\n        />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <main class=\"main-display-area\">\n        <router-view />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Header from '@/components/Header.vue';\nimport BreadcrumbSelect from '@/components/BreadcrumbSelect.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  components: {\n    Header,\n    BreadcrumbSelect,\n    BreadcrumbNavigation,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      currentTab: {},\n      redirect: '',\n      datasets: null,\n    };\n  },\n  computed: {\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject: {\n      get() {\n        return this.$store.state.projects.currentProject;\n      },\n      set(value) {\n        this.$store.commit('projects/setCurrentProject', value);\n      },\n    },\n  },\n  watch: {\n    async currentProject() {\n      this.refreshDatasetList();\n    },\n  },\n  beforeMount() {\n    this.refreshDatasetList();\n  },\n  created() {\n    if (this.$route) {\n      this.redirect = this.$route.name;\n    }\n  },\n  methods: {\n    async refreshDatasetList() {\n      this.datasets = await this.getDatasets();\n      this.getDatasetDetails();\n    },\n    async getDatasetDetails() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          get_labels: true,\n          get_annotation_sets: true,\n          get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        if (!resp.error) {\n          const temp = resp.result;\n\n          const shallowDatasets = JSON.parse(JSON.stringify(this.datasets));\n\n          shallowDatasets.forEach((e, i) => {\n            temp[i].annotation_sets?.forEach((set, j) => {\n              temp[i].annotation_sets[j].num_images = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_images : 0;\n              temp[i].annotation_sets[j].num_annotations = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_annotations : 0;\n            });\n            shallowDatasets[i].annotation_sets = temp[i].annotation_sets;\n            shallowDatasets[i].numImages = temp[i].numImages ? temp[i].numImages : 0;\n            shallowDatasets[i].labels = temp[i].labels ? temp[i].labels : [];\n            shallowDatasets[i].numLabels = temp[i].numLabels ? temp[i].numLabels : 0;\n            shallowDatasets[i].groups = temp[i].groups ? temp[i].groups : [];\n          });\n          this.$store.commit('datasets/setDatasetList', shallowDatasets);\n        }\n      }\n    },\n    async getDatasets() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          // get_num_images: true,\n          // get_labels: true,\n          // get_num_labels: true,\n          // get_annotation_sets: true,\n          // get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        let list = [];\n        if (resp.error) {\n          return list;\n        } else {\n          let temp = resp.result;\n\n          temp = temp.map((e) => {\n            e.annotation_sets = [];\n            e.numImages = null;\n            e.labels = null;\n            e.numLabels = null;\n            e.groups = null;\n            return e;\n          });\n\n          list = temp;\n        }\n        return list;\n      }\n      return [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.main {\n  height: 100vh;\n}\n</style>\n","import { render } from \"./Trainer.vue?vue&type=template&id=6af57b83&scoped=true\"\nimport script from \"./Trainer.vue?vue&type=script&lang=js\"\nexport * from \"./Trainer.vue?vue&type=script&lang=js\"\n\nimport \"./Trainer.vue?vue&type=style&index=0&id=6af57b83&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6af57b83\"]])\n\nexport default __exports__","<template>\n  <div class=\"controls-bar\">\n    <div class=\"trainer-header\" />\n    <button v-if=\"permissions && permissions.trainer_write\" class=\"button button-sm\" @click=\"openCreateModal\">Create</button>\n  </div>\n  <div v-if=\"!loadingFinished\" class=\"empty-state\">\n    <InlineLoader\n      :width=\"'60px'\"\n      :height=\"'60px'\"\n      :border=\"'12px'\"\n    />\n  </div>\n  <div v-else-if=\"notEmpty && permissions && (permissions.trainer_read || permissions.trainer_write)\" class=\"trainers-card-container scrollbar\">\n    <v-expansion-panels v-model=\"openedDropdowns\">\n      <TrainerCard\n        v-for=\"(t, i) in trainers.sort((a, b) => b.id - a.id)\"\n        :key=\"i\"\n        :trainer=\"t\"\n        :currentProject=\"currentProject\"\n        :permissions=\"permissions\"\n        @create-trainer-session=\"openTrainerStartModal(t)\"\n        @info-clicked=\"handleSessionInfoClick($event, t)\"\n        @analytics-clicked=\"handleSessionAnalyticsClick(t)\"\n        @delete-session=\"openConfirmDeleteSessionModal\"\n        @terminate-session=\"openConfirmStopTrainingSessionModal\"\n        @delete-trainer=\"openConfirmDeleteTrainerModal(t)\"\n        @edit-trainer=\"openEditModal(t)\"\n        @charts-clicked=\"handleShowChartsClick\"\n        @refresh-session=\"(session) => handleRefreshSession(session)\"\n      />\n    </v-expansion-panels>\n  </div>\n  <div\n    v-else\n    class=\"empty-state\"\n  >\n    <svg width=\"60%\" height=\"60%\">\n      <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n    </svg>\n    <div class=\"empty-state__message\">\n      <h3>No trainer to display.</h3>\n    </div>\n  </div>\n  <CreateTrainerModal\n    ref=\"createEditTrainerModal\"\n    :project=\"currentProject\"\n    @trainer-created=\"handleTrainerCreated\"\n  />\n  <TrainerUpdateModal\n    ref=\"trainerUpdateModal\"\n    :modalTrainer=\"modalTrainer\"\n    @edit-trainer=\"handleUpdateTrainer\"\n  />\n  <CreateTrainerSessionModal\n    ref=\"startTrainerSessionModal\"\n    :trainer=\"trainerToCreateSession\"\n    @create-trainer-session=\"handleTrainingSessionCreated(trainerToCreateSession)\"\n  />\n  <TrainingSessionDetailsModal\n    ref=\"trainingSessionDetailsModal\"\n    :session=\"selectedTrainingSession\"\n    :permissions=\"permissions\"\n    @stop-training=\"openConfirmStopTrainingSessionModal\"\n    @delete-session=\"openConfirmDeleteSessionModal\"\n  />\n  <TrainingSessionAnalyticsModal\n    ref=\"trainingSessionAnalyticsModal\"\n    :trainerSession=\"trainerToShowAnalytics\"\n    :projectID=\"currentProject ? currentProject.id : 0\"\n  />\n  <TrainingChartsModal\n    ref=\"trainingChartsModal\"\n    :trainerSession=\"selectedTrainingSession\"\n    :trainerExperiment=\"selectedTrainingExperiment\"\n    :projectID=\"currentProject ? currentProject.id : 0\"\n  />\n  <TrainerCompareTrainedModelsModal\n    ref=\"trainerCompareTrainedModelsModal\"\n    :trainers=\"trainers\"\n    @launch-trained-model-compare=\"launchTrainedModelCompare\"\n  />\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport TrainerCard from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainerCardV2.vue';\nimport TrainingSessionDetailsModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainingSessionDetailsModalV2.vue';\nimport TrainingSessionAnalyticsModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainingSessionAnalyticsModal.vue';\nimport TrainerCompareTrainedModelsModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainerCompareTrainedModelsModal.vue';\nimport TrainerUpdateModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainerUpdateModal.vue';\nimport CreateTrainerModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/CreateTrainerModal.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\nimport CreateTrainerSessionModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/CreateTrainerSessionModalV2.vue';\nimport TrainingChartsModal from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainingCharts.vue';\nimport { AlertDialogDescription } from 'radix-vue';\n\nexport default {\n  name: \"TrainerManagement\",\n  components: {\n    TrainerCard,\n    CreateTrainerModal,\n    CreateTrainerSessionModal,\n    TrainingSessionDetailsModal,\n    TrainingSessionAnalyticsModal,\n    TrainerCompareTrainedModelsModal,\n    TrainingChartsModal,\n    ConfirmModal,\n    TrainerUpdateModal,\n    InlineLoader,\n  },\n  props: {\n  },\n  emits: [\n    'trainer-set-created', 'update-list',\n  ],\n  data() {\n    return {\n      dataConnect: null,\n      trainers: [],\n      trainingSessionList: [],\n      trainerToCreateSession: null,\n      trainerToShowAnalytics: null,\n      loadingFinished: true,\n      selectedTrainingSession: null,\n      selectedTrainingExperiment: null,\n      selectedTrainerDetails: null,\n      interval: null,\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      toDelete: null,\n      confirmFunction: null,\n      buttonText: 'Delete',\n      modalTrainer: null,\n      permissions: null,\n      openedDropdowns: null,\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    notEmpty() {\n      return this.trainers && this.trainers.length > 0;\n    },\n    trainerIds() {\n      return this.trainers.reduce((acc, curr) => {\n        acc.push(curr.id);\n        return acc;\n      }, []);\n    },\n  },\n  watch: {\n    trainers: {\n      deep: false,\n      async handler(trainers) {\n        await Promise.all(trainers.map(async (trainer) => {\n          trainer.training_sessions = await this.getTrainingSessionList(trainer.id);\n        }));\n      },\n    },\n    async currentProject(p) {\n      this.openedDropdowns = null;\n      if (p) {\n        this.trainers = await this.getTrainerList();\n        if (this.trainers.length > 0) {\n          this.trainers = this.trainers.sort((a, b) => b.id - a.id);\n          this.openedDropdowns = this.trainers[0].id;\n        }\n      }\n    },\n    async openedDropdowns() {\n      if (this.openedDropdowns) {\n        const openedTrainer = this.trainers.findIndex((e) => e.id === this.openedDropdowns);\n        if (openedTrainer > -1) {\n          this.trainers[openedTrainer].training_sessions = await this.getTrainingSessionList(this.trainers[openedTrainer].id);\n        }\n      }\n    },\n  },\n  async created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n    this.trainers = await this.getTrainerList();\n    if (this.trainers.length > 0) {\n      this.trainers = this.trainers.sort((a, b) => b.id - a.id);\n      this.openedDropdowns = this.trainers[0].id;\n    }\n  },\n  beforeUnmount() {\n    this.stopInterval();\n  },\n  mounted() {\n    this.startInterval();\n    this.getProjectAccessForSingleUser();\n  },\n  methods: {\n    async getProjectAccessForSingleUser() {\n      await this.dataConnect.getProjectAccessForSingleUser({\n        project_id: this.currentProject.id,\n        username: this.$store.state.user.user.username,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    openConfirmDeleteTrainerModal(t) {\n      this.confirmMessage = `Are you sure you want to remove experiment \"${t.name}\" to recycle bin? This will terminate all training sessions in progress.`;\n      this.confirmMessageHeader = 'Remove Trainer Experiment';\n      this.toDelete = t;\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => this.handleTrainerDelete();\n    },\n    openConfirmStopTrainingSessionModal(session) {\n      this.confirmMessage = `Are you sure you want to stop training session \"${session.name}\"?\\n You will need to restart training to resume.`;\n      this.confirmMessageHeader = 'Stop Training Session';\n      this.toDelete = session;\n      this.buttonText = 'Stop';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.$refs.trainingSessionDetailsModal.closeModal();\n        this.handleStopTrainingSessions([session.id]);\n      };\n    },\n    openConfirmDeleteSessionModal(session) {\n      this.confirmMessage = `Are you sure you want to move training session \"${session.name}\" to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Training Session';\n      this.toDelete = session;\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.$refs.trainingSessionDetailsModal.closeModal();\n        this.handleDeleteSession(session.id);\n      };\n    },\n    handlePauseClicked() {\n    },\n    async handleRefreshSession(session) {\n      const trainerIndex = this.trainers.findIndex((e) => e.id === session.trainer_id);\n      if (trainerIndex > -1) {\n        const index = this.trainers[trainerIndex].training_sessions.findIndex((e) => e.id === session.id);\n        if (index > -1) {\n          this.trainers[trainerIndex].training_sessions[index] = await this.getSession(session.id);\n        }\n      }\n    },\n    startInterval() {\n      this.interval = setInterval(async () => {\n        if (this.openedDropdowns) {\n          const openedTrainer = this.trainers.findIndex((e) => e.id === this.openedDropdowns);\n          if (openedTrainer > -1) {\n            this.trainers[openedTrainer].training_sessions = await this.getTrainingSessionList(this.trainers[openedTrainer].id);\n          }\n        }\n      }, 30000);\n    },\n    stopInterval() {\n      clearInterval(this.interval);\n      this.interval = null;\n    },\n    async updateEC2InstanceStatus() {\n      await this.dataConnect.updateEC2Status({\n        trainer_ids: this.trainerIds,\n      })\n        .catch((e) => console.log(e));\n    },\n    async handleTrainerCreated() {\n      this.trainers = await this.getTrainerList();\n    },\n    async getTrainerList() {\n      this.loadingFinished = false;\n      const resp = await this.dataConnect.getTrainerList2({ project_id: this.currentProject.id })\n        .catch((error) => {\n          console.log('Failed to retrieve trainers:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        this.loadingFinished = true;\n        return [];\n      }\n      this.loadingFinished = true;\n      return resp.result;\n    },\n    async getTrainingSessionList(trainer_id) {\n      const resp = await this.dataConnect.getTrainingSessionList({ trainer_id, reverse: true })\n        .catch((error) => {\n          console.log('Failed to retrieve training sessions:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n\n      if (resp.result) {\n        resp.result.forEach((session) => {\n          if (this.selectedTrainingSession && session.id === this.selectedTrainingSession.id) {\n            this.selectedTrainingSession = session;\n          }\n        });\n      }\n      return resp.result;\n    },\n    async getSession(id) {\n      const resp = await this.dataConnect.getTrainingSession({\n        trainer_session_id: id,\n      })\n        .catch((e) => {\n          console.log(e);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return null;\n      }\n      return resp.result;\n    },\n    openCreateModal() {\n      this.$refs.createEditTrainerModal.showModal();\n    },\n    openEditModal(t) {\n      this.modalTrainer = t;\n      this.$refs.trainerUpdateModal.showModal();\n    },\n    openTrainerStartModal(trainer) {\n      this.trainerToCreateSession = trainer;\n      this.$refs.startTrainerSessionModal.showModal();\n    },\n    async handleTrainingSessionCreated(trainer) {\n      trainer.training_sessions = await this.getTrainingSessionList(trainer.id);\n    },\n    async handleSessionInfoClick(session) {\n      this.selectedTrainingSession = session;\n      await this.$nextTick();\n      this.$refs.trainingSessionDetailsModal.showModal();\n    },\n    async handleSessionAnalyticsClick(trainer) {\n      this.trainerToShowAnalytics = { trainer_id: trainer.id };\n      await this.$nextTick();\n      this.$refs.trainingSessionAnalyticsModal.showModal();\n    },\n    async handleShowChartsClick(v) {\n      if (v.trainer_id != null) {\n        this.selectedTrainingSession = v;\n        this.selectedTrainingExperiment = null;\n      } else {\n        this.selectedTrainingExperiment = v;\n      }\n\n      await this.$nextTick();\n      this.$refs.trainingChartsModal.showModal();\n    },\n    async launchTrainedModelCompare(trainer_ids) {\n      this.trainerToShowAnalytics = { trainer_ids };\n      await this.$nextTick();\n      this.$refs.trainingSessionAnalyticsModal.showModal();\n    },\n    async handleProjectAnalyticsClick() {\n      const trainer_ids = this.trainers.map((e) => e.id);\n      this.trainerToShowAnalytics = { trainer_ids };\n      await this.$nextTick();\n      this.$refs.trainingSessionAnalyticsModal.showModal();\n    },\n    async handleCompareTrainedModelsOpen() {\n      this.$refs.trainerCompareTrainedModelsModal.showModal();\n    },\n    async handleTrainerDelete() {\n      await this.dataConnect.deleteTrainer({\n        trainer_id: this.toDelete.id,\n      })\n        .then((data) => {\n          if (data.error) {\n            alert(data.error);\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n\n      this.trainers = await this.getTrainerList();\n      this.toDelete = null;\n    },\n    async handleStopTrainingSessions(ids) {\n      await this.dataConnect.terminateTrainingSessions({\n        session_ids: ids,\n      })\n        .then(() => {\n          this.updateEC2InstanceStatus();\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n\n      this.toDelete = null;\n    },\n    async handleDeleteSession(id) {\n      await this.dataConnect.deleteTrainingSession({\n        session_id: id,\n      })\n        .then(async () => {\n          this.trainers = await this.getTrainerList();\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n\n      this.toDelete = null;\n    },\n    async handleUpdateTrainer(params) {\n      await this.dataConnect.updateTrainer(params)\n        .then(async (data) => {\n          if (data.result) {\n            this.trainers = await this.getTrainerList();\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n.trainers-card-container {\n  display: flex;\n  width: 100%;\n  padding: 16px;\n  overflow-y: scroll;\n}\n\n.trainer-header {\n  display: flex;\n  flex-direction: row;\n  gap: 16px;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <v-expansion-panel\n    :id=\"`trainer-${trainer.id}`\"\n    ref=\"card\"\n    :value=\"trainer.id\"\n    class=\"trainer-card\"\n  >\n    <v-expansion-panel-title>\n      <div class=\"card-title\">{{ `${trainer.name} (${trainer.training_sessions ? `${trainer.training_sessions.length} Sessions` : 'O Sessions'})` }}</div>\n    </v-expansion-panel-title>\n    <v-expansion-panel-text>\n      <div class=\"actions\">\n        <div class=\"actions__header\">\n          <div class=\"left\" />\n          <div class=\"right\">\n            <button class=\"button\" @click=\"handleShowAllChartsClick()\">\n              <SVGIcon\n                :iconName=\"'analytics'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />All Charts\n            </button>\n            <button class=\"button\" @click=\"handleApplyEdit()\">\n              <SVGIcon\n                :iconName=\"'edit'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />Edit Experiment\n            </button>\n            <button class=\"button\" @click=\"handleTrainerStart()\">\n              <SVGIcon\n                :iconName=\"'play'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              New Session\n            </button>\n            <button class=\"button delete\" @click=\"handleDeleteTrainer()\">\n              <SVGIcon\n                :iconName=\"'trash'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Remove Experiment</span>\n            </button>\n          </div>\n        </div>\n      </div>\n      <div class=\"trainer-card__body mt-2\">\n        <template v-if=\"trainer && trainer.training_sessions && trainer.training_sessions.length > 0\">\n          <ul class=\"training-sessions scrollbar\">\n            <li\n              v-for=\"(session, i) in trainer.training_sessions\"\n              :key=\"i\"\n              class=\"training-sessions__list-item card\"\n            >\n              <!-- @click=\"handleSessionInfoClick(session)\" -->\n              <div v-show=\"!hiddenProgress.includes(session.id)\" class=\"progress\">\n                <div class=\"training-sessions__header\">\n                  <div class=\"progress\"><div class=\"header\"><span class=\"section-title\">Progress</span></div></div>\n                </div>\n                <div class=\"body _separator\">\n                  <TaskStatusBars :task=\"session.docker_task\" @hide-bars=\"($event) => toggleHideProgress($event, session.id)\" />\n                </div>\n              </div>\n              <div class=\"statistics\">\n                <div class=\"training-sessions__header\">\n                  <div class=\"statistics\">\n                    <div class=\"header\">\n                      <div class=\"left\">\n                        <span class=\"section-title\">Information</span>\n                      </div>\n                      <div v-if=\"!hasMetrics(session) && !hasResults(session)\" class=\"right\">\n                        <div class=\"icon-container\">\n                          <IconButton\n                            v-tooltip=\"`Refresh training session`\"\n                            class=\"icon\"\n                            :icon=\"'refresh'\"\n                            :width=\"20\"\n                            :height=\"20\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleRefresh(session)\"\n                          />\n                          <IconButton\n                            v-tooltip=\"`View validate session for training session`\"\n                            class=\"icon\"\n                            :icon=\"'maximize'\"\n                            :width=\"20\"\n                            :height=\"20\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleSessionInfoClick(session)\"\n                          />\n                          <IconButton\n                            v-tooltip=\"`View charts for training session`\"\n                            class=\"icon\"\n                            :icon=\"'analytics'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleShowChartsClick(session)\"\n                          />\n                          <IconButton\n                            v-if=\"permissions && permissions.trainer_write\"\n                            v-tooltip=\"`Terminate training session. This will stop training, but you can still view train artifacts`\"\n                            class=\"icon\"\n                            :icon=\"'stop_circle'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"terminateTask(session)\"\n                          />\n                          <IconButton\n                            v-if=\"permissions && permissions.trainer_write\"\n                            v-tooltip=\"`Move training session to recycle bin`\"\n                            class=\"icon delete\"\n                            :icon=\"'trash'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"deleteTask(session)\"\n                          />\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"body scrollbar\" :class=\"{ '_separator': hasMetrics(session) || hasResults(session)}\">\n                  <div class=\"body__header\">\n                    <div class=\"owner-id-display\">\n                      <UserIcon\n                        :user=\"userList.find((e) => e.username === session.docker_task.username)\"\n                        :size=\"'32px'\"\n                      />\n                      <EncodedIdField\n                        :id=\"session.id\"\n                        :type=\"'trainer'\"\n                        :hideLabel=\"false\"\n                      />\n                      <div val-status class=\"status-col\">\n                        <span v-if=\"sessionStatusList[session.id]?.toLowerCase().includes('complete')\" class=\"status-tag _complete\"><div class=\"status-icon\">&#x2713;</div>Complete</span>\n                        <span v-else-if=\"sessionStatusList[session.id]?.toLowerCase().includes('error')\" class=\"status-tag _error\"><div class=\"status-icon\">&#x2716;</div>Error</span>\n                        <span v-else-if=\"sessionStatusList[session.id]?.toLowerCase().includes('terminate')\" class=\"status-tag _warning\"><div class=\"status-icon\">&#x21;</div>Terminated</span>\n                        <span v-else-if=\"sessionStatusList[session.id]\" class=\"status-tag _running\"><div class=\"running-icon\" />\n                          {{ String(sessionStatusList[session.id]).charAt(0).toUpperCase() + String(sessionStatusList[session.id]).slice(1) }}\n                        </span>\n                      </div>\n                    </div>\n                    <div class=\"name-display\">\n                      <div\n                        v-tooltip=\"session.name ? session.name : 'Unknown'\"\n                        class=\"description\"\n                      >\n                        {{ session.name ? session.name : \"Unknown\" }}\n                      </div>\n                      <div\n                        v-if=\"session && session.description\"\n                        v-tooltip=\"session.description\"\n                        class=\"value\"\n                      >\n                        {{ session.description }}\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"body__grid\">\n                    <div class=\"body__grid-field\">\n                      <div class=\"description\">Dataset</div>\n                      <div\n                        v-tooltip=\"session.params.trainer_params ? session.params.trainer_params['dataset_name'] : 'Unknown'\"\n                        class=\"value\"\n                      >\n                        {{ session.params.trainer_params ? session.params.trainer_params['dataset_name'] : 'Unknown' }}\n                      </div>\n                    </div>\n                    <div class=\"body__grid-field\">\n                      <div class=\"description\">Start Date</div>\n                      <div class=\"value\"><span v-if=\"session.docker_task\">{{ formatTime(session.docker_task.date) }}</span></div>\n                    </div>\n                    <div class=\"body__grid-field\">\n                      <div class=\"description\">Duration</div>\n                      <div class=\"value\"><span v-if=\"session.docker_task && getEndTime(session.docker_task)\" class=\"duration\">{{ getEndTime(session.docker_task) }}</span></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div v-if=\"hasMetrics(session)\" class=\"metrics\">\n                <div class=\"training-sessions__header\">\n                  <div class=\"metrics\">\n                    <div class=\"header\">\n                      <div class=\"left\">\n                        <span class=\"section-title\">Metrics</span>\n                      </div>\n                      <div v-if=\"!hasResults(session)\" class=\"right\">\n                        <div class=\"icon-container\">\n                          <IconButton\n                            v-tooltip=\"`Refresh training session ${session.name}`\"\n                            class=\"icon\"\n                            :icon=\"'refresh'\"\n                            :width=\"20\"\n                            :height=\"20\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleRefresh(session)\"\n                          />\n                          <IconButton\n                            v-tooltip=\"`View validate session for training session`\"\n                            class=\"icon\"\n                            :icon=\"'maximize'\"\n                            :width=\"20\"\n                            :height=\"20\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleSessionInfoClick(session)\"\n                          />\n                          <IconButton\n                            v-tooltip=\"`View charts for training session`\"\n                            class=\"icon\"\n                            :icon=\"'analytics'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleShowChartsClick(session)\"\n                          />\n                          <IconButton\n                            v-if=\"permissions && permissions.trainer_write\"\n                            v-tooltip=\"`Terminate training session. This will stop training, but you can still view train artifacts`\"\n                            class=\"icon\"\n                            :icon=\"'stop_circle'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"terminateTask(session)\"\n                          />\n                          <IconButton\n                            v-if=\"permissions && permissions.trainer_write\"\n                            v-tooltip=\"`Move training session to recycle bin`\"\n                            class=\"icon delete\"\n                            :icon=\"'trash'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"deleteTask(session)\"\n                          />\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"body _separator\">\n                  <div class=\"body__grid scrollbar\">\n                    <div v-for=\"(metricVal, metric) in session.metrics\" :key=\"metric\" class=\"body__grid-field\">\n                      <div class=\"description\">{{ metric }}</div>\n                      <div v-tooltip=\"metricVal\" class=\"value\">{{ metricVal }}</div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div v-if=\"hasResults(session)\" class=\"charts\">\n                <div class=\"training-sessions__header\">\n                  <div class=\"charts\">\n                    <div class=\"header\">\n                      <div class=\"left\">\n                        <span class=\"section-title\">Result</span>\n                      </div>\n                      <div class=\"right\">\n                        <div class=\"icon-container\">\n                          <IconButton\n                            v-tooltip=\"`Refresh training session`\"\n                            class=\"icon\"\n                            :icon=\"'refresh'\"\n                            :width=\"20\"\n                            :height=\"20\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleRefresh(session)\"\n                          />\n                          <IconButton\n                            v-tooltip=\"`View validate session for training session`\"\n                            class=\"icon\"\n                            :icon=\"'maximize'\"\n                            :width=\"20\"\n                            :height=\"20\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleSessionInfoClick(session)\"\n                          />\n                          <IconButton\n                            v-tooltip=\"`View charts for training session`\"\n                            class=\"icon\"\n                            :icon=\"'analytics'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"handleShowChartsClick(session)\"\n                          />\n                          <IconButton\n                            v-if=\"permissions && permissions.trainer_write\"\n                            v-tooltip=\"`Terminate training session. This will stop training, but you can still view train artifacts`\"\n                            class=\"icon\"\n                            :icon=\"'stop_circle'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"terminateTask(session)\"\n                          />\n                          <IconButton\n                            v-if=\"permissions && permissions.trainer_write\"\n                            v-tooltip=\"`Move training session to recycle bin`\"\n                            class=\"icon delete\"\n                            :icon=\"'trash'\"\n                            :width=\"22\"\n                            :height=\"22\"\n                            :type=\"'click'\"\n                            @click.stop=\"deleteTask(session)\"\n                          />\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"body\">\n                  <div style=\"height: 90%;\">\n                    <TrainingChartSingle\n                      :name=\"session.results.name\"\n                      :labels=\"session.results.labels\"\n                      :series=\"session.results.series\"\n                      @chart-clicked=\"chartZoomHandler(session.results.name)\"\n                    />\n                  </div>\n                </div>\n              </div>\n            </li>\n          </ul>\n        </template>\n        <div v-else class=\"training-sessions-empty\">\n          <span>No Sessions Created</span>\n        </div>\n      </div>\n    </v-expansion-panel-text>\n  </v-expansion-panel>\n</template>\n<script>\n\nimport TrainingChartSingle from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainingChartSingle';\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport EncodedIdField from '@/components/EncodedIdField.vue';\nimport TaskStatusBars from '@/components/TaskStatusBars.vue';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: \"TrainerCard\",\n  components: {\n    IconButton,\n    SVGIcon,\n    UserIcon,\n    EncodedIdField,\n    TaskStatusBars,\n    TrainingChartSingle,\n  },\n  props: {\n    trainer: {\n      type: Object,\n      default: () => {},\n    },\n    currentProject: {\n      type: Object,\n      default: () => {},\n    },\n    permissions: {\n      type: Object,\n      default: () => {},\n    },\n\n  },\n  emits: ['show-trainer-details', 'create-trainer-session', 'info-clicked', 'charts-clicked', 'analytics-clicked', 'terminate-session', 'delete-trainer', 'delete-session', 'edit-trainer', 'refresh-session'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      show_menu: false,\n      hiddenProgress: [],\n      sessionStatusList: {},\n    };\n  },\n  computed: {\n    userList() {\n      return this.$store.state.user.userList;\n    },\n  },\n  watch: {\n    trainer: {\n      deep: true,\n      handler() {\n        if (this.trainer && this.trainer.training_sessions) {\n          this.trainer.training_sessions.forEach((session) => {\n            this.getStatus(session);\n          });\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.trainer && this.trainer.training_sessions) {\n      this.trainer.training_sessions.forEach((session) => {\n        this.getStatus(session);\n      });\n    }\n  },\n  methods: {\n    hasMetrics(session) {\n      return session && session.metrics && Object.keys(session.metrics).length > 0;\n    },\n    hasResults(session) {\n      return session && session.results && Object.keys(session.results).length > 0;\n    },\n    toggleHideProgress(v, id) {\n      const index = this.hiddenProgress.indexOf(id);\n      if (v) {\n        this.hiddenProgress.push(id); // Add if not\n      } else {\n        if (index > -1) {\n          this.hiddenProgress.splice(index, 1); // Remove if exists\n        }\n      }\n    },\n    handleTrainerStart() {\n      this.$emit('create-trainer-session');\n    },\n    handleOpenInFull() {\n      this.$emit('show-trainer-details');\n    },\n    handleSessionInfoClick(session) {\n      this.$emit('info-clicked', session);\n    },\n    handleSessionAnalyticsClick(session) {\n      this.$emit('analytics-clicked', session);\n    },\n    handleShowChartsClick(session) {\n      this.$emit('charts-clicked', session);\n    },\n    handleShowAllChartsClick() {\n      this.$emit('charts-clicked', this.trainer);\n    },\n    getStatus(session) {\n      this.sessionStatusList[session.id] = session.docker_task.status;\n    },\n    getMessage(session) {\n      if (session && session.docker_task) {\n        return session.docker_task.message;\n      }\n      return null;\n    },\n    getCount(session) {\n      if (session && session.docker_task) {\n        return session.docker_task.count;\n      }\n      return null;\n    },\n    getTotal(session) {\n      if (session && session.docker_task) {\n        return session.docker_task.total;\n      }\n      return null;\n    },\n    getEndTime(docker_task) {\n      if (docker_task.end_date !== \"0001-01-01T00:00:00Z\" && docker_task.date !== \"0001-01-01T00:00:00Z\") {\n        const msDiff = new Date(docker_task.end_date) - new Date(docker_task.date);\n        const minutes = Math.floor(msDiff / (1000 * 60)) % 60;\n        const hours = Math.floor(msDiff / (1000 * 60 * 60)) % 24;\n        const days = Math.floor(msDiff / (1000 * 60 * 60 * 24));\n        const result = [];\n        if (days > 0) result.push(`${days} day${days > 1 ? 's' : ''}`);\n        if (hours > 0) result.push(`${hours} hr${hours > 1 ? 's' : ''}`);\n        if (minutes > 0) result.push(`${minutes} min${minutes > 1 ? 's' : ''}`);\n        return result.join(\" \") || \"0 mins\";\n      } else if (docker_task.end_date === \"0001-01-01T00:00:00Z\" && docker_task.date !== \"0001-01-01T00:00:00Z\") {\n        const msDiff = Date.now() - new Date(docker_task.date);\n        const minutes = Math.floor(msDiff / (1000 * 60)) % 60;\n        const hours = Math.floor(msDiff / (1000 * 60 * 60)) % 24;\n        const days = Math.floor(msDiff / (1000 * 60 * 60 * 24));\n        const result = [];\n        if (days > 0) result.push(`${days} day${days > 1 ? 's' : ''}`);\n        if (hours > 0) result.push(`${hours} hr${hours > 1 ? 's' : ''}`);\n        if (minutes > 0) result.push(`${minutes} min${minutes > 1 ? 's' : ''}`);\n        return result.join(\" \") || \"0 mins\";\n      } else {\n        return null;\n      }\n    },\n    formatTime(str) {\n      return `${new Date(str).toLocaleTimeString('default', {\n        year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n      })}`;\n    },\n    terminateTask(session) {\n      this.$emit('terminate-session', session);\n    },\n    deleteTask(session) {\n      this.$emit('delete-session', session);\n    },\n    handleDeleteTrainer() {\n      this.$emit('delete-trainer');\n    },\n    handleApplyEdit() {\n      this.$emit('edit-trainer');\n    },\n    handleRefresh(session) {\n      this.$emit('refresh-session', session);\n    },\n    parseMPKShape(shape) {\n      if (!shape) {\n        return \"\";\n      }\n      const split = shape.split(\",\");\n      return [split[1], split[0]].join(\",\");\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  height: fit-content;\n  padding: 0;\n  margin: 0;\n  text-align: left;\n  border-radius: 8px;\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.card:not([disabled=\"true\"]):hover {\n  @include themify() {\n    outline: 2px solid themed('card-border-color-hover');\n  }\n}\n\n.trainer-card {\n  display: flex;\n  height: fit-content;\n  flex-direction: column;\n  position: relative;\n  padding: 16px;\n  text-align: left;\n  border-radius: 8px;\n  background: transparent !important;\n\n  @include themify() {\n    background: themed('card-color');\n    color: themed('body-text-color');\n  }\n\n  &__body {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    min-height: 0px;\n    flex: 1 1 auto;\n\n    h3 {\n      margin: 0;\n      font-size: 1rem;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n    }\n  }\n\n  &__body-row {\n    display: flex;\n    flex: 1 1 auto;\n    margin-top: 5px;\n    align-items: center;\n  }\n\n  .card-title {\n    font-weight: bold;\n    font-size: 1.15rem;\n  }\n\n}\n\n.actions{\n  margin: 10px 20px;\n  display: flex;\n  flex-direction: column;\n\n  &__header{\n    display: flex;\n    flex-direction: row;\n    .left{\n      width: 40%;\n      max-width: 40%;\n\n      span{\n        font-weight: bold;\n        font-size: 1.15rem;\n      }\n    }\n    .right{\n      display: flex;\n      flex-direction: row;\n      width: 60%;\n      max-width: 60%;\n      gap: 12px;\n      align-items: center;\n      justify-content: flex-end;\n    }\n\n    .button {\n      background: white;\n      position: relative;\n      display: flex;\n      flex-direction: row;\n      align-items: center;\n      height: 26px;\n      padding: 0;\n      box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n      padding: 4px 8px;\n      gap: 2px;\n      width: fit-content;\n\n      @include themify() {\n        color: themed('body-text-color')\n      }\n\n      &:hover {\n        background: rgba(var(--color-primary-100-rgb), 0.5);\n      }\n    }\n\n    .delete {\n      background: #b60000;\n      color: #f6f7f8 !important;\n    }\n  }\n}\n\n.trainer-menu {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n  min-width: 100px;\n}\n\n.training-sessions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n\n  &__list-item {\n    display: flex;\n    flex-direction: row;\n    border-radius: 8px;\n    height: 250px;\n  }\n\n  &__header {\n    display: flex;\n    flex-direction: row;\n    padding: 4px 16px;\n    background: var(--gray-200);\n    height: 32px;\n  }\n\n  .progress {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    width: 350px;\n    // width: min(30%, 400px);\n    // max-width: min(30%, 400px);\n  }\n  .statistics {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    width: 350px;\n    // width: min(30%, 500px);\n    // max-width: min(40%, 500px);\n  }\n  .metrics {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    min-width: 300px;\n    max-width: 600px;\n    // width: min(20%, 500px);\n    // max-width: min(40%, 500px);\n  }\n  .charts {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    min-width: 300px;\n    max-width: 600px;\n  }\n\n  .left {\n    width: 50%;\n    min-width: 50%;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n  }\n\n  .right {\n    width: 50%;\n    min-width: 50%;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-end;\n  }\n}\n\n.header {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  max-width: 100%;\n}\n\n.body {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  flex: 1 1 auto;\n  min-height: 0;\n  padding: 16px;\n  overflow: auto;\n\n  &__header{\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    gap: 10px;\n\n    .owner-id-display {\n      display: flex;\n      flex-direction: row;\n      gap: 10px;\n      align-items: center;\n    }\n\n    .name-display {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start;\n\n      .description {\n        font-size: 0.9rem;\n        font-weight: 600;\n        color: var(--body-text-color);\n        display: -webkit-box;\n        -webkit-line-clamp: 1;\n        line-clamp: 1;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .value {\n        font-size: 0.8rem;\n        font-weight: 600;\n        color: var(--body-text-color-secondary);\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n    }\n\n  }\n\n  &__grid-field {\n    display: flex;\n    flex-direction: row;\n    margin-top: 5px;\n  }\n\n  &__grid {\n    display: block;\n\n    .description {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--body-text-color);\n      width: 100px;\n    }\n    .value {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--body-text-color-secondary);\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n  }\n\n  &._separator::after {\n    content: \"\";\n    position: absolute;\n    right: 0;\n    top: 5%;\n    bottom: 5%;\n    width: 1px;\n    background-color: #9a9ca2;\n  }\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  margin-left: 10px;\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n  .icon + .icon {\n    margin-left: 14px;\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  height: -moz-fit-content;\n  height: fit-content;\n}\n\n.icon {\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.icon:hover {\n  @include themify() {\n    color: themed('color-primary');\n    background: themed('icon-hover-color');\n    border-radius: 100%;\n    box-shadow: 0 0 0 4px themed('icon-hover-color');\n  }\n}\n\n.icon.delete:hover {\n  color: var(--color-error)\n}\n\n.status-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100px;\n  min-width: 100px;\n  border-radius: 18px;\n  padding: 4px 6px;\n  line-height: 1;\n  font-size: 0.625rem;\n  font-weight: 700;\n  white-space: nowrap;\n  border: 2px solid;\n  box-shadow: 0px 0px 1px rgb(0 0 0 / 25%), 0px 1px 4px rgb(0 0 0 / 25%);\n  @include themify() {\n    color: themed('color-black');\n  }\n\n  &._complete {\n    @include themify() {\n      color: themed('color-status-complete');\n      background: themed('color-status-complete-background');\n    }\n  }\n  &._running {\n    @include themify() {\n      color: themed('color-status-running');\n      background: themed('color-status-running-background');\n    }\n  }\n  &._error {\n    @include themify() {\n      color: themed('color-status-error');\n      background: themed('color-status-error-background');\n    }\n  }\n\n  &._warning {\n    @include themify() {\n      color: themed('color-status-warning');\n      background: themed('color-status-warning-background');\n    }\n  }\n\n  .running-icon {\n    color: inherit;\n    width: 4px;\n    height: 4px;\n    border: solid 4px;\n    border-radius: 4px;\n    margin-right: 4px;\n  }\n\n  .status-icon {\n    color: inherit;\n    margin-right: 4px;\n  }\n}\n\n.vertical-separator {\n  width: 1px;\n  height: 80%;\n  background-color: #9a9ca2;\n\n  margin-top: auto;\n  margin-bottom: auto\n}\n\n.trainer-id-field {\n  margin-right: 20px;\n}\n\n:deep() {\n  .v-expansion-panel__shadow {\n    box-shadow: none !important;\n  }\n}\n\n.section-title {\n  display: flex;\n  align-items: center;\n  text-align: left;\n  font-size: 1rem;\n  font-weight: 700;\n  color: var(--body-text-color-heading);\n  letter-spacing: 0.025em;\n  gap: 6px;\n}\n\n.training-sessions-empty {\n  display: flex;\n  flex-direction: column;\n  height: 150px;\n  align-items: center;\n  justify-content: center;\n  font-size: 1.1rem;\n  font-weight: bold;\n  border: solid 1px black;\n  border-radius: 8px;\n  @include themify() {\n    background: radial-gradient(circle, rgba($color-primary-300, 0.075) 50%, rgba(var(--color-primary-rgb), 0.125) 100%);\n  }\n\n  span {\n    padding: 16px;\n    text-align: center;\n  }\n}\n\n</style>\n","<template>\n  <ApexCharts\n    type=\"line\"\n    height=\"100%\"\n    :options=\"chartOptions\"\n    :series=\"series\"\n  />\n</template>\n\n<script>\n\nimport VueApexCharts from \"vue3-apexcharts\";\n\nexport default {\n  name: 'TrainingChartSingle',\n  components: {\n    ApexCharts: VueApexCharts,\n  },\n  props: {\n    isFullScreen: {\n      type: Boolean,\n      default: false,\n    },\n    name: {\n      type: String,\n      default: '',\n    },\n    series: {\n      type: Object,\n      default: () => {},\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  data() {\n    return {\n      isZoomed: false,\n\n      chartOptions: {\n        chart: {\n          height: 350,\n          type: 'line',\n          zoom: {\n            enabled: false,\n          },\n          animations: {\n            enabled: false,\n          },\n        },\n        stroke: {\n          width: 2,\n        },\n        // markers: {\n        //   size: [4],\n        // },\n        labels: this.labels,\n        title: {\n          text: this.name,\n          align: 'center',\n        },\n        xaxis: {\n          tickAmount: this.labels.length / 10,\n        },\n        yaxis: {\n          decimalsInFloat: 4,\n        },\n\n      },\n    };\n  },\n  computed: {\n  },\n  created() {\n\n  },\n  mounted() {\n    setTimeout(() => {\n      window.dispatchEvent(new Event('resize'));\n    }, 500);\n  },\n  methods: {\n    clicked() {\n      this.$emit('chart-clicked');\n    },\n  },\n};\n</script>\n\n  <style lang=\"scss\" scoped>\n\n  </style>\n","import { render } from \"./TrainingChartSingle.vue?vue&type=template&id=8ce8c762\"\nimport script from \"./TrainingChartSingle.vue?vue&type=script&lang=js\"\nexport * from \"./TrainingChartSingle.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <Popper\n    :trigger=\"trigger\"\n    :appendToBody=\"true\"\n    :config=\"tooltipPopperConfig\"\n    :virtualReferenceElement=\"virtualReferenceElement\"\n    :show=\"show\"\n  >\n    <template #trigger>\n      <slot />\n    </template>\n    <div ref=\"tooltip\" class=\"tooltip\">\n      <slot name=\"body\" />\n    </div>\n  </Popper>\n</template>\n\n<script>\nimport Popper from '@/components/Popper.vue';\nimport { detectOverflow } from '@popperjs/core';\n\nconst overflowPadding = 20;\n\nexport default {\n  name: 'Tooltip',\n  components: {\n    Popper,\n  },\n  props: {\n    placement: {\n      type: String,\n      default: 'right',\n    },\n    flip: {\n      type: Boolean,\n      default: true,\n    },\n    virtualReferenceElement: {\n      type: Object,\n      default: null,\n    },\n    trigger: {\n      type: String,\n      default: 'hover',\n    },\n    show: {\n      type: Boolean,\n      default: false,\n    },\n    background: {\n      type: String,\n      default: '',\n    },\n  },\n  computed: {\n    detectOverflowModifier() {\n      return {\n        name: 'detectOverflowModifier',\n        enabled: !this.flip,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement === 'right') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.right - overflowPadding}px`;\n          }\n          if (state.placement === 'left') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.left - overflowPadding}px`;\n          }\n        },\n      };\n    },\n    tooltipPopperConfig() {\n      return {\n        placement: this.placement,\n        modifiers: [\n          this.detectOverflowModifier,\n          {\n            name: 'offset',\n            options: {\n              offset: [0, 8],\n            },\n          },\n          {\n            name: 'preventOverflow',\n            options: {\n              padding: overflowPadding,\n            },\n          },\n          {\n            name: 'flip',\n            enabled: this.flip,\n          },\n        ],\n      };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.tooltip {\n\n  background: #fbfbfb;\n  border: 1px solid #ffffff;\n  color: #000000;\n  border-radius: 8px;\n  margin: 0;\n  padding: 8px;\n  z-index: 999;\n  box-shadow: 0 2px 5px 0 rgb(0 0 0 / 30%);\n  pointer-events: none;\n  white-space: nowrap;\n}\n\n.tooltip p {\n  margin: 0;\n  pointer-events: none;\n}\n\n</style>\n","import { render } from \"./Tooltip.vue?vue&type=template&id=4be3ecc8&scoped=true\"\nimport script from \"./Tooltip.vue?vue&type=script&lang=js\"\nexport * from \"./Tooltip.vue?vue&type=script&lang=js\"\n\nimport \"./Tooltip.vue?vue&type=style&index=0&id=4be3ecc8&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4be3ecc8\"]])\n\nexport default __exports__","<template>\n  <div class=\"labels-container \">\n    <label v-if=\"!hideLabel\">{{ capitalizeWords(type) }} ID</label>\n\n    <div class=\"id-copy-field\">\n      <Tooltip :placement=\"'top-start'\" :trigger=\"'click'\">\n        <template #body>\n          <pre>{{ capitalizeWords(type) }} ID copied</pre>\n        </template>\n        <SVGIcon\n          v-tooltip=\"`Copy ${capitalizeWords(type)} ID to clipboard`\"\n          class=\"icon copy\"\n          :iconName=\"'copy'\"\n          :width=\"'16px'\"\n          :height=\"'16px'\"\n          @click.stop=\"copyToClipboard(parseId(id))\"\n        />\n      </Tooltip>\n      <span>{{ parseId(id) }}</span>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport {\n  ref, toRefs,\n} from 'vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport Tooltip from \"@/components/Tooltip.vue\";\n\nconst props = defineProps({\n  id: {\n    type: Number,\n    default: 0,\n  },\n  type: {\n    type: String,\n    default: '',\n  },\n  hideLabel: {\n    type: Boolean,\n    default: false,\n  },\n});\n\nconst {\n  id,\n  type,\n} = toRefs(props);\n\nfunction capitalizeWords(word) {\n  if (!word) return \"\";\n  return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nfunction parseId() {\n  if (id.value && type.value) {\n    let prefix = '';\n    switch (type.value) {\n    case 'dataset':\n      prefix = 'ds';\n      break;\n    case 'annotation set':\n      prefix = 'as';\n      break;\n    case 'annotation':\n      prefix = 'a';\n      break;\n    case 'image':\n      prefix = 'i';\n      break;\n    case 'trainer':\n      prefix = 't';\n      break;\n    case 'validator':\n      prefix = 'v';\n      break;\n    case 'project':\n      prefix = 'p';\n      break;\n    case 'auto annotation':\n      prefix = 'inf';\n      break;\n    default:\n      prefix = '';\n    }\n    let result = '';\n    if (prefix !== '') {\n      result = `${prefix}-${Number(id.value).toString(16)}`;\n    } else {\n      result = Number(id.value).toString(16);\n    }\n\n    return result;\n  }\n  return '';\n}\n\nfunction copyToClipboard(text) {\n  if (navigator.clipboard && navigator.clipboard.writeText) {\n    navigator.clipboard.writeText(text);\n  }\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.labels-container {\n  display: flex;\n  flex-direction: column;\n  label {\n    font-size: 0.9rem;\n    font-weight: 550;\n\n    &.hide {\n      visibility: hidden;\n    }\n  }\n\n  .id-copy-field {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    color: var(--body-text-color);\n\n    span {\n      font-size: 0.9rem;\n    }\n  }\n\n  .icon {\n    margin: 0 5px;\n    cursor: pointer;\n    &.copy{\n      color: var(--color-primary)\n    }\n  }\n}\n</style>\n","import script from \"./EncodedIdField.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./EncodedIdField.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./EncodedIdField.vue?vue&type=style&index=0&id=5dda794b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-5dda794b\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"task\" class=\"progress-rows scrollbar\">\n    <div v-for=\"(value, i) in stages\" :key=\"i\" class=\"progress-row\">\n      <div class=\"progress-row__value-row\">\n        <span>{{ value.label ? value.label : value.stage }}</span>\n        <label v-if=\"value.percentage\">{{ `${Math.round(value.percentage)}%` }}</label>\n        <label v-else-if=\"value.count && value.total\">{{ value.total > 0 && !isNaN(value.count/value.total) ? `${Math.round(value.count*100/value.total)}%` : '0%' }}</label>\n      </div>\n      <progress\n        :value=\"getProgress(value)\"\n        :class=\"{ '_error' : value.status === 'error'}\"\n        :max=\"100\"\n      />\n      <span\n        v-if=\"value.message\"\n        class=\"progress-row__message\"\n        :title=\"value.message\"\n        :class=\"{ '_error' : value.status === 'error'}\"\n      >{{ value.message }}</span>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport {\n  toRefs, ref, watch, onMounted, computed,\n} from 'vue';\n\nconst props = defineProps({\n  task: {\n    type: Object,\n    default: () => {},\n  },\n});\n\nconst {\n  task,\n} = toRefs(props);\n\nconst stages = ref([]);\n\n// hide the bars if 1 of 3 conditions are met:\n// 1. The overall status is complete\n// 2. There are no bars\n// 3. The last stage status is complete\n\nconst hideBars = computed(() => (task.value && task.value.status.toLowerCase().includes('complete'))\n                              || (stages.value && stages.value.length === 0)\n                              || (stages.value && stages.value.length > 0 && stages.value[stages.value.length - 1]?.status.toLowerCase().includes(\"complete\")));\n\nconst emit = defineEmits(['hide-bars']);\n\nwatch(hideBars, () => {\n  emit('hide-bars', hideBars.value);\n});\n\nwatch(task, () => {\n  if (task.value) {\n    parseData(task.value.data);\n  }\n}, { deep: true });\n\nfunction getProgress(v) {\n  if (v.percentage) {\n    return Math.round(v.percentage);\n  } else if (v.count && v.total && !Number.isNaN(v.count / v.total)) {\n    return Math.round((v.count * 100) / v.total);\n  } else {\n    return 0;\n  }\n}\n\nfunction parseData(data) {\n  if (data === undefined) {\n    stages.value = [];\n  }\n  let dataJson = {};\n  if (typeof data === 'string') {\n    if (data !== \"\") {\n      dataJson = JSON.parse(data);\n    } else {\n      dataJson = {};\n    }\n  }\n\n  let percentage = 0;\n  if (task.value) {\n    let timer = 0;\n    if (task.value.total === 0) {\n      timer = 4 * 60 * 1000;\n    } else {\n      timer = task.value.total;\n    }\n    let timeDiff = (new Date()) - (new Date(task.value.date));\n\n    if (timeDiff / timer > 1) {\n      timeDiff = timer;\n    }\n    percentage = Math.round((timeDiff * 100) / timer);\n  }\n  let stages_json = null;\n  let stage_definitions = null;\n  let stage_definitions_keys = [];\n\n  if (Object.keys(dataJson).length > 0) {\n    stages_json = dataJson[\"stages\"];\n    stage_definitions = dataJson[\"stage_definitions\"];\n  }\n  if (stage_definitions) {\n    stage_definitions_keys = stage_definitions.map((item) => Object.keys(item)[0]);\n  }\n\n  const result = [];\n\n  if (task.value.cloud_instance_id !== \"\") {\n    result.push({\n      stage: \"server-init\",\n      label: \"Server Initialization\",\n      percentage,\n      message: \"\",\n      order: 0,\n      status: \"initializing\",\n    });\n  }\n  // Display all stages in definition\n  if (stage_definitions) {\n    stage_definitions.forEach((def, i) => {\n      const [key, value] = Object.entries(def)[0];\n      if (stages_json && key in stages_json) {\n        result.push({\n          stage: key,\n          label: value,\n          message: stages_json[key][\"message\"],\n          percentage: stages_json[key][\"percentage\"],\n          count: stages_json[key][\"count\"],\n          total: stages_json[key][\"total\"],\n          status: stages_json[key][\"status\"],\n        });\n      } else {\n        result.push({\n          stage: key,\n          label: value,\n          message: \"\",\n          percentage: 0,\n          count: 0,\n          total: 100,\n          status: key,\n        });\n      }\n    });\n  }\n\n  // this block should only add if the stage is not in definition\n  if (stages_json) {\n    for (const [key, value] of Object.entries(stages_json)) {\n      if (!key.includes('init') && !stage_definitions_keys.includes(key)) {\n        if (!stage_definitions_keys.includes(key)) {\n          const newObj = {\n            stage: key,\n            label: value[\"label\"],\n            message: value[\"message\"],\n            percentage: value[\"percentage\"],\n            count: value[\"count\"],\n            total: value[\"total\"],\n            order: value[\"order\"],\n            status: key,\n          };\n\n          result.push(newObj);\n        }\n      }\n    }\n  }\n\n  // if the second stage has begun, remove 'server-init' stage\n  if (result && result.length > 0 && task.value.cloud_instance_id !== \"\") {\n    if (result[1] && ((result[1][\"percentage\"] && result[1][\"percentage\"] > 0)\n    || (result[1][\"count\"] && result[1][\"count\"] > 0))) {\n      const removeIndex = result.findIndex((e) => e.stage === \"server-init\");\n      if (removeIndex > -1) {\n        result.splice(removeIndex, 1);\n      }\n    }\n  }\n\n  stages.value = result;\n}\n\nonMounted(() => {\n  if (task.value) {\n    parseData(task.value.data);\n  }\n  emit('hide-bars', hideBars.value);\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n.progress-rows {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  overflow-y: auto;\n  padding: 5px;\n\n  .progress-row {\n    display: flex;\n    flex-direction: column;\n    flex-wrap: nowrap;\n    width: 100%;\n    height: fit-content;\n    font-size: small;\n\n    &__value-row {\n      display: flex;\n      flex-direction: row;\n      gap: 6px;\n      align-items: baseline;\n      justify-content: space-between;\n\n      span {\n        font-size: 1rem;\n        font-weight: 700;\n      }\n\n      label {\n        font-size: 0.925rem;\n        font-weight: 500;\n        color: var(--body-text-color-secondary);\n      }\n    }\n\n    &__message {\n      flex: 1;\n      font-size: 0.75rem;\n      font-weight: 400;\n      color: var(--body-text-color-secondary);\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n\n      &._error {\n        color: var(--color-error);\n      }\n    }\n\n    progress {\n      border-radius: 10px;\n      width: 100%;\n      height: 8px;\n      padding: 1px;\n    }\n\n    progress::-webkit-progress-value {\n      background-color: var(--progress-value);\n      border-radius: 10px;\n    }\n\n    progress._error::-webkit-progress-value {\n      background-color: var(--color-error) !important;\n    }\n\n    progress::-moz-progress-bar {\n      background-color: var(--progress-bar);\n    }\n\n    progress::-webkit-progress-bar {\n      background-color: var(--progress-bar);\n    }\n\n  }\n\n  .progress-row + .progress-row {\n    margin-top: 20px;\n  }\n}\n</style>\n","import script from \"./TaskStatusBars.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./TaskStatusBars.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./TaskStatusBars.vue?vue&type=style&index=0&id=362f832b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-362f832b\"]])\n\nexport default __exports__","import { render } from \"./TrainerCardV2.vue?vue&type=template&id=b321c5c4&scoped=true\"\nimport script from \"./TrainerCardV2.vue?vue&type=script&lang=js\"\nexport * from \"./TrainerCardV2.vue?vue&type=script&lang=js\"\n\nimport \"./TrainerCardV2.vue?vue&type=style&index=0&id=b321c5c4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-b321c5c4\"]])\n\nexport default __exports__","import script from \"./DownloadModelCard.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./DownloadModelCard.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./DownloadModelCard.vue?vue&type=style&index=0&id=2374b06e&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-2374b06e\"]])\n\nexport default __exports__","<script setup>\nimport { ref, onMounted, watch } from \"vue\";\nimport { createHighlighter } from \"shiki\";\n\nconst props = defineProps({\n  code: String,\n  lang: {\n    type: String,\n    default: \"yaml\",\n  },\n  theme: {\n    type: String,\n    default: \"vitesse-dark\",\n  },\n});\n\nconst highlightedCode = ref(\"\");\nlet highlighter = null;\n\nasync function highlightCode() {\n  if (!highlighter) {\n    highlighter = await createHighlighter({\n      themes: [props.theme],\n      langs: [props.lang],\n    });\n  }\n  highlightedCode.value = highlighter.codeToHtml(props.code, {\n    lang: props.lang,\n    theme: props.theme,\n  });\n}\n\nasync function getHighlighter() {\n  return createHighlighter({\n    themes: [props.theme],\n    langs: [props.lang],\n  });\n}\n\nonMounted(async () => {\n  highlighter = await getHighlighter();\n  highlightCode();\n});\n\n// Watch for `code` changes and update the highlighted output\nwatch(() => props.code, highlightCode);\n</script>\n\n<template>\n  <div v-html=\"highlightedCode\" />\n</template>\n","import script from \"./ShikiHighlight.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ShikiHighlight.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"trainingSessionDetailsModal\"\n    :title=\"'Session Details'\"\n    :width=\"'100%'\"\n    :height=\"'100%'\"\n    @closed=\"handleModalClosed\"\n  >\n    <template #modal-main>\n      <div class=\"training-session\">\n        <div class=\"session-data\">\n          <div class=\"tab-selector\">\n            <input\n              id=\"option-model-params\"\n              v-model=\"tab\"\n              type=\"radio\"\n              name=\"tab-selector\"\n              :value=\"'model-params'\"\n            >\n            <label for=\"option-model-params\">Model Parameters</label>\n            <input\n              id=\"option-metrics\"\n              v-model=\"tab\"\n              type=\"radio\"\n              name=\"tab-selector\"\n              :value=\"'metrics'\"\n            >\n            <label for=\"option-metrics\">Metrics</label>\n            <input\n              id=\"option-logs\"\n              v-model=\"tab\"\n              type=\"radio\"\n              name=\"tab-selector\"\n              :value=\"'logs'\"\n            >\n            <label for=\"option-logs\">System Logs</label>\n          </div>\n          <div v-if=\"tab==='model-params'\" class=\"params mt-2\">\n            <ShikiHighlight\n              class=\"model-params scrollbar shiki-model-params\"\n              :code=\"model_parameters\"\n              lang=\"yaml\"\n              theme=\"vitesse-dark\"\n            />\n          </div>\n          <div v-else-if=\"tab==='metrics'\" class=\"metrics mt-2\">\n            <div id=\"training-session-system-logs\" class=\"text-area-details-white scrollbar\">\n              <div\n                v-for=\"(value, name, index) in metrics\"\n                :key=\"index\"\n                class=\"list-item\"\n                :title=\"value\"\n              >\n                <label>{{ name }}</label>\n                <span>{{ value }}</span>\n              </div>\n            </div>\n          </div>\n          <div v-else-if=\"tab==='logs'\" class=\"system-logs mt-2\">\n            <div id=\"training-session-system-logs\" class=\"text-area-box scrollbar\">\n              <RecycleScroller\n                v-slot=\"{ item }\"\n                class=\"logs-scroller\"\n                :items=\"logLines\"\n                :item-size=\"20\"\n              >\n                <div class=\"log-line\">{{ item }}</div>\n              </RecycleScroller>\n            </div>\n          </div>\n        </div>\n        <div class=\"artifact-list\">\n          <h3>Download Raw Model</h3>\n          <div class=\"artifacts scrollbar\">\n            <DownloadModelCard\n              v-for=\"(artifact, i) in artifacts\"\n              :key=\"i\"\n              :title=\"artifact.name\"\n              :modelType=\"artifact.modelType\"\n              class=\"download-model-card\"\n              @click=\"handleDownloadModel(artifact)\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script setup>\nimport {\n  ref, computed, onBeforeUnmount,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport * as YAML from 'yaml';\nimport { useTimeoutPoll } from '@vueuse/core';\n// import { useToast } from 'vue-toast-notification';\nimport DownloadModelCard from './DownloadModelCard.vue';\nimport 'vue-toast-notification/dist/theme-sugar.css';\nimport ShikiHighlight from \"@/components/ShikiHighlight.vue\";\nimport { RecycleScroller } from 'vue-virtual-scroller';\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css';\n\nconst props = defineProps({\n  session: {\n    type: Object,\n    default: () => ({}),\n  },\n  permissions: {\n    type: Object,\n    default: () => ({}),\n  },\n});\n\n// Refs\nconst trainingSessionDetailsModal = ref(null);\nconst tab = ref('model-params');\nconst logs = ref(null);\nconst artifacts = ref([]);\nconst logLines = ref([]);\n// const $toast = useToast();\n\nconst metrics = computed(() => {\n  const result = {};\n  for (const [key, value] of Object.entries(props.session?.metrics || {})) {\n    if (key !== 'timings' && key !== 'model' && key !== 'dataset'\n      && key !== 'class_histogram_data' && key !== 'confusion_matrix_data' && key !== 'precision_recall_data') {\n      result[key] = value;\n    }\n  }\n  return result;\n});\n\nconst model_parameters = computed(() => YAML.stringify(props.session?.params?.model_params || {}, { indent: 8 }));\n\n// Lifecycle hooks\nonBeforeUnmount(() => {\n  pauseGetLogs();\n});\n\n// Methods\nconst showModal = async () => {\n  trainingSessionDetailsModal.value.showModal();\n  resumeGetLogs();\n  artifacts.value = await listTrainingSessionArtifacts()\n    .catch((err) => {\n      // commenting this since no artifacts is not an error\n      // $toast.open({\n      //   queue: true,\n      //   duration: 5000,\n      //   message: `Error occured while fetching artifacts`,\n      //   type: 'error',\n      //   position: 'top',\n      // });\n    });\n};\n\nconst handleModalClosed = () => {\n  tab.value = 'model-params';\n  logs.value = null;\n  pauseGetLogs();\n};\n\nconst closeModal = () => {\n  handleModalClosed();\n  trainingSessionDetailsModal.value.closeModal();\n};\n\nconst getLogs = async () => {\n  if (props.session && props.session.id) {\n    const dataConnect = new DatastoreConnect();\n    const resp = await dataConnect.getTrainingSessionLogs({\n      session_id: props.session.id,\n    });\n\n    let temp = \"\";\n    if (!resp || resp.error || !resp.result) {\n      temp += `Trainer may take some time to create logs file for \"${props.session.name}\".`;\n    } else {\n      temp += resp.result;\n    }\n\n    logs.value = temp;\n  } else {\n    logs.value = null;\n  }\n\n  if (logs.value) {\n    logLines.value = logs.value.split('\\n');\n  }\n};\n\nconst { isActive: isGetLogsActive, pause: pauseGetLogs, resume: resumeGetLogs } = useTimeoutPoll(getLogs, 5000);\n\nconst handleDownloadModel = (model) => {\n  const url = `/download_model?training_session_id=${props.session.id}&file=${model.name}`;\n\n  const a = document.createElement('a');\n  a.href = url;\n  a.setAttribute('download', ''); // This tells the browser to download instead of navigate\n\n  document.body.appendChild(a);\n  a.click();\n  document.body.removeChild(a);\n};\n\nconst listTrainingSessionArtifacts = async () => {\n  const dataConnect = new DatastoreConnect();\n  return dataConnect.getTrainingSessionArtifacts({\n    training_session_id: props.session.id,\n  })\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error.message);\n      }\n      return resp.result;\n    })\n    .catch((error) => {\n      throw error;\n    });\n};\n\n// Expose methods to the template\ndefineExpose({\n  showModal,\n  closeModal,\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.training-session{\n  display: flex;\n  flex-direction: row;\n  height: 100%;\n}\n\n.session-data {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  height: 100%;\n  width: calc(100% - 400px);\n  padding: 16px;\n\n  ul {\n    list-style-type: none;\n  }\n\n  h3 {\n    margin: 0;\n    margin-bottom: 10px;\n    font-size: 1rem;\n    text-align: left;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  .text-area-box {\n    display: flex;\n    flex-direction: row;\n    border-radius: 4px;\n    background: #121212;\n    border: 1px solid grey;\n    height: 100%;\n    // padding: 15px;\n    overflow-y: auto;\n\n    span {\n      color: white;\n      font-weight: 700;\n      font-size: 0.9rem;\n\n      pre {\n        font-family: 'Courier New', monospace !important;\n        text-align: left;\n      }\n    }\n  }\n\n  .text-area-details-white {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, 450px);\n    grid-auto-rows: 50px;\n    grid-gap: 20px 5px;\n    height: 100%;\n    border-radius: 4px;\n    background: var(--color-white-100);\n    border: 1px solid var(--color-primary-100);\n    padding: 15px;\n    overflow-y: auto;\n\n    .list-item {\n      height: fit-content;\n      display: flex;\n      flex-direction: column;\n      text-align: left;\n      padding: 5px;\n\n      label {\n        @include themify() {\n          color: tint-color(themed('body-text-color-secondary'), 20%);\n        }\n        font-weight: 700;\n        font-size: 0.9rem;\n        overflow: hidden;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n      }\n\n      span {\n        @include themify() {\n          color: themed('body-text-color');\n        }\n        font-weight: 600;\n        font-size: 0.9rem;\n        overflow: hidden;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n      }\n    }\n  }\n\n  .system-logs, .metrics, .params {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    overflow-y: auto;\n  }\n}\n\n.model-params {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  border-radius: 4px;\n  background: var(--color-white-100);\n  // border: 1px solid var(--color-primary-100);\n  overflow-y: auto;\n}\n\n.artifact-list {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  padding: 16px;\n  max-width: 400px;\n\n  h3 {\n    margin: 0;\n    font-size: 1rem;\n    text-align: left;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n}\n\n.tab-selector {\n  display: flex;\n  flex-direction: row;\n}\n\n.tab-selector input[type=\"radio\"] {\n  display: none;\n}\n\n.tab-selector label {\n  padding: 2px 5px;\n  margin-right: 10px;\n  width: fit-content;\n  font-size: 0.9rem;\n  font-weight: bold;\n  cursor: pointer;\n}\n\n.tab-selector input[type=\"radio\"]:checked+label {\n  @include themify() {\n    color: themed('color-primary-500');\n    border-bottom: 2px solid themed('color-primary-500');\n  }\n}\n\n.artifacts {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  overflow-y: auto;\n  min-height: 0;\n  padding: 4px;\n}\n\n.download-model-card {\n  cursor: pointer;\n  &:hover {\n    box-shadow: 0px 3px 4px rgba(0, 0, 0, 0.375), 0 0 2px 2px rgba(0, 0, 0, 0.125);\n  }\n}\n\n.shiki-model-params {\n  text-align: left;\n  white-space: pre-wrap;\n}\n\n:deep(.shiki-model-params pre) {\n  padding: 16px;\n  flex: 1 1 auto;\n  overflow: auto;\n}\n\n.logs-scroller {\n  height: 100%;\n  width: 100%;\n}\n\n.log-line {\n  text-align: left;\n  white-space: pre;\n  color: white;\n}\n\n:deep(.vue-recycle-scroller__item-wrapper) {\n  overflow: visible !important;\n}\n\n:deep(.vue-recycle-scroller) {\n  overflow: auto !important;\n  padding: 15px;\n}\n</style>\n","import script from \"./TrainingSessionDetailsModalV2.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./TrainingSessionDetailsModalV2.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./TrainingSessionDetailsModalV2.vue?vue&type=style&index=0&id=99b93318&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-99b93318\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"trainingSessionAnalyticsModal\"\n    :title=\"'Training Analytics'\"\n    :fullScreen=\"true\"\n    :closeWithEscapeKey=\"false\"\n    @closed=\"handleModalClosed\"\n  >\n    <template #modal-main>\n      <div id=\"wrapper\" class=\"wrapper\">\n        <div class=\"loader-dual-ring\" />\n        <iframe\n          v-if=\"tensorboardReady\"\n          ref=\"tensorboard\"\n          :src=\"tensorboardURL\"\n          title=\"Trainer Charts\"\n          scrolling=\"no\"\n          frameborder=\"0\"\n        />\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'TrainingSessionAnalyticsModal',\n  components: {\n    Modal,\n  },\n  props: {\n    trainerParam: {\n      type: Object,\n      default: () => {},\n    },\n    projectID: {\n      type: Number,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      tensorboardReady: false,\n      tensorboardPort: 0,\n      dockerTask: null,\n    };\n  },\n  computed: {\n    tensorboardURL() {\n      return `tensorboard/${this.tensorboardPort}/`;\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n    window.addEventListener(\"beforeunload\", async (e) => {\n      e.preventDefault();\n      this.closeAnalytics();\n      e.returnValue = '';\n    });\n  },\n  unmounted() {\n    this.closeAnalytics();\n  },\n  methods: {\n    async showModal() {\n      this.launchAnalytics().then(async (resp) => {\n        this.tensorboardPort = resp.port;\n        this.dockerTask = resp.docker_task;\n        await this.retryFetch(this.tensorboardURL, { method: 'HEAD' }, 60, 500)\n          .then(() => {\n            // Was able to connect to Tensorboard\n            this.tensorboardReady = true;\n          })\n          .catch(() => {\n            // Unable to connect to Tensorboard\n            alert('Unable to connect to Tensorboard');\n          });\n      });\n      this.$refs.trainingSessionAnalyticsModal.showModal();\n    },\n    async launchAnalytics() {\n      const params = { project_id: this.projectID };\n      if (this.trainerParam?.trainer_id) {\n        params.trainer_ids = [this.trainerParam.trainer_id];\n      } else if (this.trainerParam?.trainer_ids) {\n        params.trainer_ids = this.trainerParam.trainer_ids;\n      }\n      const resp = await this.dataConnect.getCharts(params)\n        .catch((error) => {\n          console.log('Failed to launch analytics:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async closeAnalytics() {\n    },\n    handleModalClosed() {\n      this.closeAnalytics();\n      this.tensorboardReady = false;\n    },\n    async retryFetch(url, options, maxRetries, delay) {\n      let retries = 0;\n\n      while (retries < maxRetries) {\n        try {\n          const response = await fetch(url, options);\n          if (response.ok) {\n            return response;\n          } else {\n            console.warn(`Error in Tensorboard fetch request after ${retries} attempts`);\n          }\n        } catch (error) {\n          console.warn(`Error in Tensorboard fetch request after ${retries} attempts : ${error}`);\n        }\n\n        retries++;\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n\n      throw new Error(`Failed to fetch Tensorboard after ${maxRetries} attempts.`);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.wrapper {\n  position: relative;\n  display: flex;\n  width: 100%;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n\n  iframe {\n    position: relative;\n    width: 100%;\n    height: 100%;\n  }\n}\n\n.loader-dual-ring {\n  position: absolute;\n  display: inline-block;\n  width: 80px;\n  height: 80px;\n}\n.loader-dual-ring:after {\n  content: \" \";\n  display: block;\n  width: 64px;\n  height: 64px;\n  margin: 8px;\n  border-radius: 50%;\n  @include themify() {\n    border: 6px solid themed('color-primary');\n    border-color: themed('color-primary') transparent themed('color-primary') transparent;\n  }\n  animation: loader-dual-ring 1.2s linear infinite;\n}\n@keyframes loader-dual-ring {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n</style>\n","import { render } from \"./TrainingSessionAnalyticsModal.vue?vue&type=template&id=447061b4&scoped=true\"\nimport script from \"./TrainingSessionAnalyticsModal.vue?vue&type=script&lang=js\"\nexport * from \"./TrainingSessionAnalyticsModal.vue?vue&type=script&lang=js\"\n\nimport \"./TrainingSessionAnalyticsModal.vue?vue&type=style&index=0&id=447061b4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-447061b4\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"trainerCompareTrainedModelsModal\"\n    :title=\"'Select Experiments to Compare'\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"compare-trained-models\">\n        <template v-if=\"trainers && trainers.length > 0\">\n          <ul class=\"trainers scrollbar\">\n            <li\n              v-for=\"(trainer, i) in trainers\"\n              :key=\"i\"\n              class=\"trainers__list-item\"\n            >\n              <label>\n                <input\n                  v-model=\"selectedTrainers\"\n                  type=\"checkbox\"\n                  :value=\"trainer.id\"\n                >\n                {{ trainer.name }}\n              </label>\n            </li>\n          </ul>\n        </template>\n        <div v-else class=\"trained-models-empty\">\n          <span>No Trained Models</span>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          :disabled=\"selectedTrainers.length < 2\"\n          @click=\"launchGraph\"\n        >\n          Compare Selected Experiments\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'TrainerCompareTrainedModelsModal',\n  components: {\n    Modal,\n  },\n  props: {\n    trainers: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['launch-trained-model-compare'],\n  data() {\n    return {\n      selectedTrainers: [],\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    showModal() {\n      this.$refs.trainerCompareTrainedModelsModal.showModal();\n    },\n    async launchGraph() {\n      this.$emit('launch-trained-model-compare', this.selectedTrainers);\n      this.$refs.trainerCompareTrainedModelsModal.closeModal();\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.compare-trained-models {\n  display: flex;\n  flex-direction: column;\n  min-width: 440px;\n  min-height: 0px;\n  flex: 1 1 auto;\n  padding: 16px;\n\n  h3 {\n    margin: 0;\n    font-size: 1rem;\n    text-align: left;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n}\n\n.trained-models-empty {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n  font-size: 1.25rem;\n  font-weight: bold;\n  border: solid 1px black;\n  border-radius: 8px;\n  @include themify() {\n    background: radial-gradient(circle, rgba($color-primary-300, 0.075) 50%, rgba(var(--color-primary-rgb), 0.125) 100%);\n  }\n\n  span {\n    padding: 16px;\n    text-align: center;\n  }\n}\n\n.trainers {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  list-style: none;\n  padding: 2px 4px;\n  margin: -2px -4px;\n  overflow-y: auto;\n\n  &__list-item {\n    display: flex;\n    flex-direction: row;\n    position: relative;\n    background: rgb(231, 224, 224);\n    border-radius: 4px;\n    gap: 16px;\n    align-items: center;\n    cursor: pointer;\n    @include themify() {\n      background: themed('color-white-700');\n    }\n\n    &:hover {\n      box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.375), 0 0 1px 1px rgba(0, 0, 0, 0.125);\n    }\n\n    label {\n      display: flex;\n      align-items: center;\n      width: 100%;\n      min-height: 32px;\n      // overflow-wrap: anywhere;\n      font-weight: 600;\n      font-size: 1.25rem;\n      padding: 8px;\n      // letter-spacing: 0.05em;\n      // white-space: nowrap;\n      cursor: pointer;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n\n      input {\n        width: 16px;\n        height: 16px;\n        margin-right: 16px;\n      }\n    }\n  }\n}\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 16px;\n  justify-content: flex-end;\n}\n\n</style>\n","import { render } from \"./TrainerCompareTrainedModelsModal.vue?vue&type=template&id=79a9e85b&scoped=true\"\nimport script from \"./TrainerCompareTrainedModelsModal.vue?vue&type=script&lang=js\"\nexport * from \"./TrainerCompareTrainedModelsModal.vue?vue&type=script&lang=js\"\n\nimport \"./TrainerCompareTrainedModelsModal.vue?vue&type=style&index=0&id=79a9e85b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-79a9e85b\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"updateTrainerModal\"\n    :title=\"'Edit Trainer Information'\"\n    @closed=\"clearData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Name</label>\n            <input\n              v-model=\"name\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"description\"\n              rows=\"4\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button class=\"button button-sm\" @click=\"apply\">Save</button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'TrainerUpdateModal',\n  components: {\n    Modal,\n  },\n  props: {\n    modalTrainer: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: {\n    'edit-trainer': null,\n  },\n  data() {\n    return {\n      name: '',\n      description: '',\n    };\n  },\n  watch: {\n    trainer(d) {\n      if (d) {\n        this.name = this.modalTrainer.name;\n        this.description = this.modalTrainer.description;\n      }\n    },\n  },\n  methods: {\n    showModal() {\n      this.$refs.updateTrainerModal.showModal();\n    },\n    clearData() {\n      this.name = \"\";\n      this.description = \"\";\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.updateTrainerModal.closeModal();\n    },\n    apply() {\n      if (this.name) {\n        this.$emit('edit-trainer', { name: this.name, description: this.description, trainer_id: this.modalTrainer.id });\n      }\n      this.closeModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.close-button {\n  @include themify() {\n    background: themed('button-secondary');\n    color: themed('button-secondary-text');\n  }\n}\n</style>\n","import { render } from \"./TrainerUpdateModal.vue?vue&type=template&id=631265f2&scoped=true\"\nimport script from \"./TrainerUpdateModal.vue?vue&type=script&lang=js\"\nexport * from \"./TrainerUpdateModal.vue?vue&type=script&lang=js\"\n\nimport \"./TrainerUpdateModal.vue?vue&type=style&index=0&id=631265f2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-631265f2\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createTrainerModal\"\n    :title=\"'Create New Experiment'\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"form container\">\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Project</label>\n            <span>{{ project.name }}</span>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Name</label>\n            <input\n              v-model=\"name\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"description\"\n              rows=\"2\"\n            />\n          </div>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"createTrainer\"\n        >\n          Create New Experiment\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'CreateTrainerModal',\n  components: {\n    Modal,\n  },\n  props: {\n    trainer: {\n      type: Object,\n      default: () => null,\n    },\n    project: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['trainer-created', 'trainer-updated'],\n  data() {\n    return {\n      message: '',\n      name: '',\n      description: \"\",\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n  },\n  mounted() {\n\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    showModal() {\n      this.$refs.createTrainerModal.showModal();\n      this.initializeModal();\n    },\n    initializeModal() {\n      this.message = '';\n      if (this.trainer) {\n        this.name = this.trainer.name;\n        this.project_id = this.project.id;\n      } else {\n        this.name = '';\n        this.description = '';\n      }\n    },\n    async createTrainer() {\n      if (!this.name) {\n        this.message = `Missing Trainer name`;\n        return;\n      }\n\n      await this.dataConnect.addTrainer({\n        project_id: this.currentProject.id,\n        name: this.name,\n        description: this.description,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.$refs.createTrainerModal.closeModal();\n            this.$emit('trainer-created', data.result);\n          } else if (data.error) {\n            this.message = data.error.message;\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.form {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n\n  span {\n    width: 100%;\n    font-size: 1rem;\n    font-weight: 700;\n    text-align: left;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n</style>\n","import { render } from \"./CreateTrainerModal.vue?vue&type=template&id=74c9ad1b&scoped=true\"\nimport script from \"./CreateTrainerModal.vue?vue&type=script&lang=js\"\nexport * from \"./CreateTrainerModal.vue?vue&type=script&lang=js\"\n\nimport \"./CreateTrainerModal.vue?vue&type=style&index=0&id=74c9ad1b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-74c9ad1b\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createTrainerModal\"\n    :title=\"'Create Training Session'\"\n    @closed=\"resetData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings scrollbar\">\n        <div class=\"container\">\n          <div class=\"static-card\">\n            <h2>Description</h2>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label class=\"required\">Trainer Type</label>\n                <select v-model=\"schemaType\" class=\"select\" required>\n                  <option :value=\"''\" disabled>Select a Trainer Type</option>\n                  <template v-for=\"schema in schemaList\" :key=\"schema.name\">\n                    <option :value=\"schema.name\">{{ schema.label }}</option>\n                  </template>\n                </select>\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <v-checkbox\n                v-model=\"is_local\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n              >\n                <template #label>\n                  <span class=\"checkbox-label\">User Managed Trainer</span>\n                </template>\n              </v-checkbox>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label class=\"required\">Name</label>\n                <input\n                  v-model=\"name\"\n                  class=\"select\"\n                  type=\"text\"\n                >\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label>Description (Optional)</label>\n                <textarea\n                  v-model=\"description\"\n                  rows=\"2\"\n                />\n              </div>\n            </div>\n            <h2 class=\"mt-4\">Training Data</h2>\n            <div class=\"row mt-3\">\n              <div class=\"col-md-auto\">\n                <input\n                  id=\"percent-split-radio\"\n                  v-model=\"groupSplit\"\n                  type=\"radio\"\n                  name=\"percent_group_split\"\n                  value=\"percent\"\n                  class=\"split-radio\"\n                >\n              </div>\n              <div class=\"col settings__control-group\">\n                <label class=\"clickable\" @click=\"() => groupSplit='percent'\">From Dataset</label>\n                <template v-if=\"groupSplit ==='percent'\">\n                  <div class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Dataset</label>\n                      <select v-model=\"dataset\" class=\"select\" required>\n                        <option disabled :value=\"''\">Select a Dataset</option>\n                        <option v-for=\"(d, i) in datasetList\" :key=\"i\" :value=\"d\">\n                          {{ d.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"dataset\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Annotation Set</label>\n                      <select v-model=\"annset\" class=\"select\" required>\n                        <option disabled :value=\"''\">Select Annotation Set</option>\n                        <option v-for=\"(a, i) in dataset.annotation_sets\" :key=\"i\" :value=\"a\">\n                          {{ a.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"dataset\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Training Group</label>\n                      <select v-model=\"trainGroup\" class=\"select\" required>\n                        <option disabled :value=\"''\">Select Training Group</option>\n                        <option v-for=\"(group, i) in dataset.groups\" :key=\"i\" :value=\"group\">\n                          {{ group.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"dataset\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Validation Group</label>\n                      <select v-model=\"valGroup\" class=\"select\" required>\n                        <option disabled :value=\"''\">Select Validation Group</option>\n                        <option v-for=\"(group, i) in dataset.groups\" :key=\"i\" :value=\"group\">\n                          {{ group.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                </template>\n              </div>\n            </div>\n          </div>\n          <div class=\"dynamic-card\">\n            <h2>Model Settings</h2>\n            <ConfigureFieldsGroup\n              :key=\"componentKey\"\n              v-model:params=\"configGroupValues\"\n              :fields=\"schema\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <div v-if=\"message\" class=\"result error\">\n          <span>{{ message }}</span>\n        </div>\n        <button\n          class=\"button modal-action-button\"\n          :class=\"{'button-spinner': startingTrainer, 'mt-2': message}\"\n          :disabled=\"startingTrainer\"\n          @click=\"startSessionV2\"\n        >\n          Start Session\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport TrainValTestSplitSlider from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainValTestSplitSlider';\nimport { inputSanitizer, changeSanitizer } from '@/assets/js/utils';\nimport ConfigureFieldsGroup from '@/components/TrainerComponent/TrainerExperimentAndSessions/ConfigureFieldsGroup.vue';\nimport {\n  computed,\n} from 'vue';\nimport { useStore } from 'vuex';\n\nexport default {\n  name: 'CreateTrainerSessionModal',\n  components: {\n    Modal,\n    TrainValTestSplitSlider,\n    ConfigureFieldsGroup,\n  },\n  props: {\n    trainer: {\n      type: Object,\n      default: () => {},\n    },\n    trainerSessionList: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['create-trainer-session'],\n  setup() {\n    const store = useStore();\n    const currentProject = computed(() => store.state.projects.currentProject);\n\n    return {\n      currentProject,\n    };\n  },\n  data() {\n    return {\n      schemaType: 'modelpack',\n      message: '',\n      name: '',\n      description: \"\",\n      dataset: '',\n      annset: '',\n      trainGroup: '',\n      valGroup: '',\n      groupSplit: 'percent',\n      version_params: {\n        version: '',\n      },\n      custom_split_slider_values: [80, 20, 0],\n      custom_split_train_input: 0,\n      custom_split_val_input: 0,\n      dataset_split_params: {\n        train: {\n          d: '',\n          set: '',\n          group: '',\n        },\n        val: {\n          d: '',\n          set: '',\n          group: '',\n        },\n        test: {\n          d: '',\n          set: '',\n          group: '',\n        },\n      },\n      default_split_params: {\n        train: {\n          d: '',\n          set: '',\n        },\n        val: {\n          d: '',\n          set: '',\n        },\n        test: {\n          d: '',\n          set: '',\n        },\n      },\n      modelList: [\n        { name: 'ModelPack', value: 'modelpack' },\n        { name: 'Legacy Detection', value: 'legacy' },\n        { name: 'Legacy Segmentation', value: 'legacy' },\n      ],\n      selectedModel: null,\n      startingTrainer: false,\n      advancedSettings: {\n        upsample: 'resize',\n      },\n      schema: null,\n      schemaList: [],\n      configGroupValues: {},\n      componentKey: 0,\n      is_local: false,\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    datasetList() {\n      return this.$store.state.datasets.datasetList;\n    },\n    custom_split_params() {\n      return {\n        train: {\n          percent: this.custom_split_slider_values[0],\n          count: (this.custom_split_slider_values[0] / 100) * this.total,\n        },\n        val: {\n          percent: this.custom_split_slider_values[1],\n          count: (this.custom_split_slider_values[1] / 100) * this.total,\n        },\n        test: {\n          percent: this.custom_split_slider_values[2],\n          count: (this.custom_split_slider_values[2] / 100) * this.total,\n        },\n      };\n    },\n    total() {\n      if (this.dataset) {\n        return this.dataset.numImages;\n      }\n      return 0;\n    },\n  },\n  watch: {\n    configGroupValues: {\n      deep: true,\n      handler(value) {\n        // console.log(value);\n      },\n    },\n    datasetList(l) {\n      if (l && l.length > 0) {\n        this.dataset = l[0];\n      }\n    },\n    dataset(d) {\n      this.annset = '';\n      this.trainGroup = '';\n      this.valGroup = '';\n\n      if (d.annotation_sets && d.annotation_sets.length > 0) {\n        this.annset = d.annotation_sets[0];\n      }\n      if (d.groups && d.groups.length > 0) {\n        const trainGroup = d.groups.find((group) => group.name.includes(\"train\"));\n        if (trainGroup) {\n          this.trainGroup = trainGroup;\n        }\n        const valGroup = d.groups.find((group) => group.name.includes(\"val\"));\n        if (valGroup) {\n          this.valGroup = valGroup;\n        }\n      }\n    },\n    schemaType(v) {\n      this.schema = null;\n      this.configGroupValues = {};\n      this.getTrainerSchema(v);\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n    if (this.datasetList && this.datasetList.length > 0) {\n      this.dataset = this.datasetList[0];\n    }\n  },\n  mounted() {\n    this.getAllTrainerSchema();\n    this.getTrainerSchema(this.schemaType);\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    async getTrainerSchema(schemaType) {\n      const params = {\n        type: schemaType,\n      };\n      await this.dataConnect.getTrainerParametersSchema(params)\n        .then((data) => {\n          if (data.result) {\n            this.schema = data.result;\n          } else if (data.error) {\n            this.message = data.error.message;\n          }\n          this.componentKey += 1;\n        });\n    },\n    async getAllTrainerSchema() {\n      await this.dataConnect.getTrainerParametersSchema()\n        .then((data) => {\n          if (data.result) {\n            this.schemaList = data.result?.schema_list;\n          } else if (data.error) {\n            this.message = data.error.message;\n          }\n          this.componentKey += 1;\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n    showModal() {\n      this.$refs.createTrainerModal.showModal();\n      this.resetData();\n    },\n    resetData() {\n      this.is_local = false;\n      this.name = '';\n      this.description = '';\n      this.dataset = '';\n      this.annset = '';\n      this.selectedModel = '';\n      this.trainMode = 'detect';\n      this.device = 'gpu';\n      this.message = '';\n      this.startingTrainer = false;\n      this.groupSplit = 'percent';\n      this.dataset_split_params = {\n        train: {\n          d: '',\n          set: '',\n          group: 0,\n        },\n        val: {\n          d: '',\n          set: '',\n          group: 0,\n        },\n        test: {\n          d: '',\n          set: '',\n          group: 0,\n        },\n      };\n      this.default_split_params = {\n        train: {\n          d: '',\n          set: '',\n        },\n        val: {\n          d: '',\n          set: '',\n        },\n        test: {\n          d: '',\n          set: '',\n        },\n      };\n      this.version_params = {\n        d: '',\n        version: '',\n      };\n    },\n\n    async startSessionV2() {\n      if (!this.name) {\n        this.message = `Missing Name`;\n        return;\n      }\n\n      const params = {\n        trainer_id: this.trainer.id,\n        split_mode: this.groupSplit,\n        params: this.configGroupValues,\n      };\n\n      if (this.groupSplit === 'percent') {\n        if (!this.dataset) {\n          this.message = `Missing Dataset`;\n          return;\n        }\n\n        if (!this.annset) {\n          this.message = `Missing Annotation Set`;\n          return;\n        }\n\n        if (!this.trainGroup) {\n          this.message = `Missing Training Group`;\n          return;\n        }\n\n        if (!this.valGroup) {\n          this.message = `Missing Validation Group`;\n          return;\n        }\n\n        params['dataset_id'] = this.dataset.id;\n        params['annotation_set_id'] = this.annset.id;\n        params['train_group_name'] = this.trainGroup.name;\n        params['val_group_name'] = this.valGroup.name;\n        params['train_split'] = this.custom_split_slider_values[0];\n        params['val_split'] = this.custom_split_slider_values[1];\n        params['test_split'] = this.custom_split_slider_values[2];\n      }\n      if (this.groupSplit === 'group') {\n        if (!this.dataset_split_params.train.d) {\n          this.message = `Missing Train Dataset`;\n          return;\n        }\n        params['train_dataset_id'] = this.dataset_split_params.train.d.id;\n\n        if (!this.dataset_split_params.train.set) {\n          this.message = `Missing Train Annotation Set`;\n          return;\n        }\n        params['train_set_id'] = this.dataset_split_params.train.set.id;\n\n        if (this.dataset_split_params.train.group <= 0) {\n          this.message = `Missing Train Group`;\n          return;\n        }\n        params['train_group'] = this.dataset_split_params.train.group;\n\n        if (!this.dataset_split_params.val.d) {\n          this.message = `Missing Val Dataset`;\n          return;\n        }\n        params['val_dataset_id'] = this.dataset_split_params.val.d.id;\n\n        if (!this.dataset_split_params.val.set) {\n          this.message = `Missing Val Annotation Set`;\n          return;\n        }\n        params['val_set_id'] = this.dataset_split_params.val.set.id;\n\n        if (this.dataset_split_params.val.group <= 0) {\n          this.message = `Missing Val Group`;\n          return;\n        }\n        params['val_group'] = this.dataset_split_params.val.group;\n\n        if (this.dataset_split_params.test.set && this.dataset_split_params.test.group > 0) {\n          params['test_dataset_id'] = this.dataset_split_params.test.d.id;\n          params['test_set_id'] = this.dataset_split_params.test.set.id;\n          params['test_group'] = this.dataset_split_params.test.group;\n        }\n      }\n      if (this.groupSplit === 'version') {\n        if (!this.dataset) {\n          this.message = `Missing Dataset`;\n          return;\n        }\n\n        if (!this.version_params.v) {\n          this.message = `Missing Version`;\n          return;\n        }\n        params['dataset_id'] = this.dataset.id;\n        params['version'] = this.version_params.v;\n      }\n      if (this.groupSplit === 'default') {\n        if (!this.default_split_params.train.d) {\n          this.message = `Missing Train Dataset`;\n          return;\n        }\n        params['train_dataset_id'] = this.default_split_params.train.d.id;\n\n        if (!this.default_split_params.train.set) {\n          this.message = `Missing Train Annotation Set`;\n          return;\n        }\n        params['train_set_id'] = this.default_split_params.train.set.id;\n\n        if (!this.default_split_params.val.d) {\n          this.message = `Missing Val Dataset`;\n          return;\n        }\n        params['val_dataset_id'] = this.default_split_params.val.d.id;\n\n        if (!this.default_split_params.val.set) {\n          this.message = `Missing Val Annotation Set`;\n          return;\n        }\n        params['val_set_id'] = this.default_split_params.val.set.id;\n\n        if (this.default_split_params.test.set) {\n          params['test_dataset_id'] = this.default_split_params.test.d.id;\n          params['test_set_id'] = this.default_split_params.test.set.id;\n        }\n      }\n\n      if (this.name) {\n        params.session_name = this.name;\n      }\n      if (this.description) {\n        params.session_description = this.description;\n      }\n      if (this.schemaType) {\n        params.trainer_type = this.schemaType;\n      }\n\n      this.startingTrainer = true;\n      await this.dataConnect.startCloudInstance({\n        params,\n        type: 'trainer',\n        name: params.session_name,\n        project_id: this.currentProject.id,\n        is_local: this.is_local,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.$refs.createTrainerModal.closeModal();\n            this.$emit('create-trainer-session', { docker_data: data.result });\n          } else if (data.error) {\n            this.message = data.error.message;\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n      this.startingTrainer = false;\n    },\n    getSessionName(session) {\n      if (session.name) {\n        return session.name;\n      } else if (session.docker_task) {\n        return session.docker_task.date;\n      }\n      return 'Unknown Session';\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n// $cardMargin: 8px;\n$cardPadding: 16px;\n\n.settings {\n  padding-top: 16px;\n  padding-bottom: 16px;\n  overflow-y: scroll;\n  display: flex;\n  flex-direction: column;\n  margin-left: auto;\n  margin-right: auto;\n  background: var(--color-white-600);\n\n  span {\n    width: 100%;\n    font-size: 1rem;\n    font-weight: 700;\n    text-align: left;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n.container {\n  display: flex;\n  flex-direction: row;\n  padding: 0 16px;\n  gap: 16px;\n}\n\nh2 {\n  color: var(--body-text-color-heading);\n}\n\n.static-card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  padding: $cardPadding;\n  text-align: left;\n  border-radius: 6px;\n  height: fit-content;\n  flex: 1 1 auto;\n  border: 1px solid var(--color-primary-200);\n  // margin: $cardMargin;\n  width: 600px;\n  background: var(--color-white-100);\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.dynamic-card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  padding: $cardPadding;\n  text-align: left;\n  border-radius: 6px;\n  height: fit-content;\n  flex: 1 1 auto;\n  border: 1px solid var(--color-primary-200);\n  // margin: $cardMargin;\n  width: 600px;\n  background: var(--color-white-100);\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n:deep(.dynamic-card > .model-settings > .field-group:not(:first-of-type)) {\n  padding-top: 24px;\n}\n\n@media (max-width: $breakpoint-lg) {\n  .settings {\n    width: 100%;\n  }\n\n  .container {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n  }\n\n  // .static-card {\n  //   width: calc(100% - (2 * #{$cardMargin}));\n  // }\n\n  // .dynamic-card {\n  //   width: calc(100% - (2 * #{$cardMargin}));\n  // }\n}\n\n.footer {\n  display: flex;\n  flex-direction: column;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n  border-top: solid 3px var(--gray-300);\n  background: var(--color-white-100);\n\n  button {\n    margin-left: auto;\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error') !important;\n  }\n}\n\n.radio-group {\n  display: inline-block;\n  margin: 20px;\n  border-radius: 5px;\n  overflow: hidden;\n  @include themify() {\n    border: solid 1px themed('color-primary');\n  }\n}\n\n.radio-group:focus-within, .radio-group:active {\n  @include themify() {\n    box-shadow:0 0 5px themed('color-primary');\n  }\n}\n\n.radio-group input[type=\"radio\"] {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n\n.radio-group input[type=\"radio\"] + label {\n  min-width: 6rem;\n  max-width: 50%;\n  text-align: center;\n  display: inline-block;\n  cursor: pointer;\n  font-weight: bold;\n  font-size: 1rem;\n  line-height: 1.25;\n  padding: 5px 20px;\n  transition: all 0.4s ease;\n  box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.25) inset;\n  @include themify() {\n    color: themed('color-primary');\n    background: themed('color-white-100');\n  }\n}\n\n.radio-group input[type=\"radio\"]:not(:disabled):hover + label {\n  @include themify() {\n    background: themed('color-primary-200');\n    color: themed('primary-text-color');\n  }\n}\n\n.radio-group input[type=\"radio\"]:checked + label,\n.radio-group input[type=\"radio\"]:checked:hover + label {\n  opacity: 1;\n  z-index: 1;\n  box-shadow: 0 0 6px -2px rgba(0, 0, 0, 0.25), 0 0 6px 2px rgba(0, 0, 0, 0.25);\n  @include themify() {\n    background: themed('color-primary');\n    color: themed('primary-text-color');\n  }\n}\n\n.radio-group.full-width-selector {\n  display: flex;\n  width: 100%;\n  margin: 0;\n}\n\n.radio-group.full-width-selector input[type=\"radio\"] + label {\n  min-width: 1px;\n  padding: 3px 10px;\n  flex: 1 1 auto;\n}\n\n.dataset-selector{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  margin: auto;\n\n  :first-child {\n    flex: 1 1 40%;\n  }\n\n  :not(:first-child) {\n    flex: 1 1 60%;\n  }\n}\n\n.trainer-session-row-switch {\n  flex-direction: row !important;\n  overflow: visible;\n  align-items: center;\n\n  label:first-child {\n    flex: 1 1 40%;\n    max-width: 40%;\n  }\n}\n\n.full-width {\n  width: 100%;\n}\n\n.custom-split-card {\n  border-radius: 6px;\n  padding: 10px;\n\n  p {\n    font-size: 0.9rem;\n    font-weight: 700;\n  }\n}\n\n.custom-split-card + .custom-split-card {\n  margin-left: 15px;\n}\n\n.slider-settings {\n  display: flex;\n  flex-direction: row;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 350px;\n  min-height: 50px;\n  justify-content: center;\n  align-items: center;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n    text-align: center;\n  }\n}\n\n._train{\n    border: 2px solid rgb(44, 145, 246);\n}\n\n._validation{\n  @include themify {\n    border: 2px solid themed('range-slider-selected-color');\n  }\n}\n\n._test{\n  @include themify {\n    border: 2px solid themed('range-slider-selected-color-right');\n  }\n}\n\n.clickable {\n  cursor: pointer;\n}\n\n.split-radio[type=\"radio\"] {\n  height: 18px;\n  width: 18px;\n  @include themify() {\n    accent-color: themed('color-primary');\n  }\n}\n\n:deep() {\n  .v-label{\n    opacity: 1 !important;\n  }\n}\n\n.checkbox-label {\n  margin-left: 5px;\n  font-size: 14px !important;\n  font-weight: 600!important;\n  letter-spacing: 0 !important;\n  @include themify() {\n    color: themed('form-label-color') !important;\n  }\n}\n\n</style>\n","<template>\n  <TriRangeSlider\n    v-model:valueLower=\"lowerValue\"\n    v-model:valueUpper=\"upperValue\"\n    :step=\"step\"\n    :min=\"min\"\n    :max=\"max\"\n    :showMiddle=\"true\"\n  />\n</template>\n\n<script>\nimport TriRangeSlider from '@/components/TriRangeSlider.vue';\nimport * as utils from '@/assets/js/utils.js';\n\nexport default {\n  name: \"TrainValTestSplitSlider\",\n  components: {\n    TriRangeSlider,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      min: 0,\n      max: 100,\n      lowerValue: 80,\n      upperValue: 100,\n      step: 1,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.lowerValue > 0 || this.upperValue < 1;\n    },\n    tagValue() {\n      return `${this.lowerValue.toFixed()} - ${this.upperValue.toFixed()}`;\n    },\n    result() {\n      return [this.lowerValue, this.upperValue - this.lowerValue, this.max - this.upperValue];\n    },\n  },\n  watch: {\n    lowerValue() {\n      this.debouncedUpdateFilters();\n    },\n    upperValue() {\n      this.debouncedUpdateFilters();\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 10);\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.lowerValue = this.modelValue[0];\n      this.upperValue = this.modelValue[1] + this.lowerValue;\n    }\n  },\n  methods: {\n    async updateFilters() {\n      if (!this.isActive) {\n        this.$emit('update:modelValue', null);\n        return;\n      }\n      this.$emit('update:modelValue', this.result);\n    },\n  },\n};\n</script>\n","<template>\n  <div ref=\"sliderContainer\" class=\"range-slidercontainer\">\n    <div class=\"range-slider\" :class=\"{'flip': flip}\">\n      <div class=\"range-slider-track-background\" />\n      <div ref=\"middleDiv\" class=\"range-slider-middle\" />\n      <div ref=\"rightDiv\" class=\"range-slider-right\" />\n      <input\n        ref=\"sliderLower\"\n        v-model=\"localValueLower\"\n        type=\"range\"\n        :step=\"step\"\n        :min=\"min\"\n        :max=\"max\"\n        :disabled=\"disabled\"\n        @input=\"handleSliderLowerInput\"\n      >\n      <input\n        ref=\"sliderUpper\"\n        v-model=\"localValueUpper\"\n        type=\"range\"\n        :step=\"step\"\n        :min=\"min\"\n        :max=\"max\"\n        :disabled=\"disabled\"\n        @input=\"handleSliderUpperInput\"\n      >\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'RangeSlider',\n  props: {\n    step: {\n      type: Number,\n      default: 1,\n    },\n    min: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 1,\n    },\n    valueLower: {\n      type: Number,\n      default: 0,\n    },\n    valueUpper: {\n      type: Number,\n      default: 2,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    flip: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'input', 'update:valueLower', 'update:valueUpper',\n  ],\n  data() {\n    return {\n      localValueLower: 0,\n      localValueUpper: 2,\n      localValueMiddle: null,\n      resizeObserver: null,\n    };\n  },\n  watch: {\n    valueLower(newVal) {\n      this.localValueLower = newVal;\n      this.handleRangeSliderMiddleDiv();\n      this.handleRangeSliderRightDiv();\n    },\n    valueUpper(newVal) {\n      this.localValueUpper = newVal;\n      this.handleRangeSliderMiddleDiv();\n      this.handleRangeSliderRightDiv();\n    },\n  },\n  beforeMount() {\n    this.localValueLower = this.valueLower;\n    this.localValueUpper = this.valueUpper;\n  },\n  mounted() {\n    // Watch for resizes to adjust middle div when resized\n    this.resizeObserver = new ResizeObserver(this.onResize);\n    this.resizeObserver.observe(this.$refs.sliderContainer);\n  },\n  beforeUnmount() {\n    if (this.$refs.sliderContainer) {\n      this.resizeObserver.unobserve(this.$refs.sliderContainer);\n    } else {\n      this.resizeObserver.disconnect();\n    }\n  },\n  methods: {\n    onResize() {\n      this.handleRangeSliderMiddleDiv();\n      this.handleRangeSliderRightDiv();\n    },\n    handleSliderLowerInput(event) {\n      let newValueLower = Number(event.target.value);\n      if (newValueLower > Number(this.localValueUpper)) {\n        newValueLower = this.valueLower;\n        this.localValueLower = this.valueLower;\n      }\n      this.$emit('input');\n      this.$emit('update:valueLower', newValueLower);\n    },\n    handleSliderUpperInput(event) {\n      let newValueUpper = Number(event.target.value);\n      if (newValueUpper < Number(this.localValueLower)) {\n        newValueUpper = this.valueUpper;\n        this.localValueUpper = this.valueUpper;\n      }\n      this.$emit('input');\n      this.$emit('update:valueUpper', newValueUpper);\n    },\n    handleRangeSliderMiddleDiv() {\n      const thumbHalfWidth = 7.5;\n      const value1 = this.localValueLower;\n      const minValue1 = this.$refs.sliderLower.min;\n      const maxValue1 = this.$refs.sliderLower.max;\n      const value2 = this.localValueUpper;\n      const minValue2 = this.$refs.sliderUpper.min;\n      const maxValue2 = this.$refs.sliderUpper.max;\n      const totalInputWidth = this.$refs.sliderLower.clientWidth;\n      const left1 = (((value1 - minValue1) / (maxValue1 - minValue1))\n          * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth)) + thumbHalfWidth;\n      const left2 = (((value2 - minValue2) / (maxValue2 - minValue2))\n          * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth)) + thumbHalfWidth;\n      const middleWidth = left2 - left1;\n      this.$refs.middleDiv.style.left = `${left1}px`;\n      this.$refs.middleDiv.style.width = `${middleWidth}px`;\n    },\n    handleRangeSliderRightDiv() {\n      const thumbHalfWidth = 7.5;\n      const value2 = this.localValueUpper;\n      const minValue2 = this.$refs.sliderUpper.min;\n      const maxValue2 = this.$refs.sliderUpper.max;\n      const totalInputWidth = this.$refs.sliderLower.clientWidth;\n      const left1 = (((value2 - minValue2) / (maxValue2 - minValue2))\n          * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth)) + thumbHalfWidth;\n      const middleWidth = totalInputWidth - left1;\n      this.$refs.rightDiv.style.left = `${left1}px`;\n      this.$refs.rightDiv.style.width = `${middleWidth + 1}px`;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.range-slidercontainer {\n  width: 100%;\n}\n\n.range-slider {\n  position: relative;\n  margin: 0;\n  height: 25px;\n}\n// .range-slider:focus-within {\n//   outline: 1px dotted rgba(0,0,0,0.5);\n// }\n.range-slider input[type='range'] {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  pointer-events: none;\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  left: 0;\n  top: 10px;\n  height: 5px;\n  width: 100%;\n  border-radius: 14px;\n  background: none;\n}\n.range-slider input[type='range']:focus, .range-slider input[type='range']:active {\n  outline: none;\n}\n.range-slider input[type='range']::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  box-sizing: content-box;\n  width: 15px;\n  height: 15px;\n  border: none;\n  pointer-events: auto;\n  border-radius: 14px;\n  @include themify {\n    background-color: themed('range-slider-thumb-color');\n  }\n  cursor: pointer;\n  position: relative;\n  z-index: 3;\n  top: -5px;\n}\n.range-slider input[type='range']::-moz-range-thumb {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  box-sizing: content-box;\n  width: 15px;\n  height: 15px;\n  border: none;\n  pointer-events: auto;\n  border-radius: 14px;\n  @include themify {\n    background-color: themed('range-slider-thumb-color');\n  }\n  cursor: pointer;\n  position: relative;\n  z-index: 3;\n  top: -5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-thumb {\n  pointer-events: none;\n  @include themify {\n    background-color: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']:disabled::-moz-range-thumb {\n  pointer-events: none;\n  @include themify {\n    background-color: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']::-webkit-slider-runnable-track {\n  background: rgb(44, 145, 246) !important;\n  height: 5px;\n  border-radius: 2.5px;\n}\n.range-slider input[type='range']::-moz-range-track {\n  @include themify {\n    background: transparent;\n  }\n  height: 5px;\n  border-radius: 2.5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-runnable-track {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']:disabled::-moz-range-track {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n\n.range-slider .range-slider-track-background {\n  display: none;\n}\n.range-slider .range-slider-middle {\n  height: 5px;\n  width: 20px;\n  @include themify {\n    background: themed('range-slider-selected-color');\n  }\n  position: absolute;\n  top: 10px;\n  z-index: 2;\n}\n\n.range-slider .range-slider-right {\n  height: 5px;\n  width: 20px;\n  @include themify {\n    background: themed('range-slider-selected-color-right');\n  }\n  border-radius: 14px;\n  position: absolute;\n  top: 10px;\n  z-index: 2;\n}\n\n@-moz-document url-prefix() {\n  .range-slider .range-slider-track-background {\n    display: block;\n    height: 5px;\n    width: 100%;\n    background: rgb(44, 145, 246) !important;\n    position: absolute;\n    top: 10px;\n    z-index: 0;\n  }\n  .range-slider .range-slider-middle {\n    height: 5px;\n    width: 20px;\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    position: absolute;\n    top: 10px;\n    z-index: 0;\n  }\n}\n\n.range-slider input[type='range']:disabled + .range-slider-middle {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n\n.range-slider input[type='range']:disabled + .range-slider-right {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n\n.flip {\n  &.range-slider input[type='range']::-webkit-slider-runnable-track {\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    height: 5px;\n    border-radius: 2.5px;\n  }\n  &.range-slider input[type='range']::-moz-range-track {\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    height: 5px;\n    border-radius: 2.5px;\n  }\n  &.range-slider .range-slider-middle {\n    height: 5px;\n    width: 20px;\n    position: absolute;\n    top: 10px;\n    z-index: 2;\n    background: rgb(44, 145, 246) !important;\n  }\n  &.range-slider input[type='range']:disabled + .range-slider-middle {\n    background: transparent;\n  }\n\n  &.range-slider .range-slider-right {\n    height: 5px;\n    width: 20px;\n    position: absolute;\n    top: 10px;\n    z-index: 2;\n    background: rgb(44, 145, 246) !important;\n  }\n  &.range-slider input[type='range']:disabled + .range-slider-right {\n    background: transparent;\n  }\n}\n\n</style>\n","import { render } from \"./TriRangeSlider.vue?vue&type=template&id=2c8a1176&scoped=true\"\nimport script from \"./TriRangeSlider.vue?vue&type=script&lang=js\"\nexport * from \"./TriRangeSlider.vue?vue&type=script&lang=js\"\n\nimport \"./TriRangeSlider.vue?vue&type=style&index=0&id=2c8a1176&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2c8a1176\"]])\n\nexport default __exports__","import { render } from \"./TrainValTestSplitSlider.vue?vue&type=template&id=512fdf33\"\nimport script from \"./TrainValTestSplitSlider.vue?vue&type=script&lang=js\"\nexport * from \"./TrainValTestSplitSlider.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <div ref=\"sliderContainer\" class=\"range-slidercontainer\">\n    <div class=\"range-slider\">\n      <input\n        ref=\"singleSlider\"\n        v-model=\"localValue\"\n        type=\"range\"\n        :step=\"step\"\n        :min=\"min\"\n        :max=\"max\"\n        :disabled=\"disabled\"\n        @input=\"handleSliderInput\"\n      >\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SingleSlider',\n  props: {\n    step: {\n      type: Number,\n      default: 1,\n    },\n    min: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 1,\n    },\n    sliderValue: {\n      type: Number,\n      default: 0,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'input', 'update:sliderValue',\n  ],\n  data() {\n    return {\n      localValue: 0,\n      resizeObserver: null,\n    };\n  },\n  watch: {\n    sliderValue(newVal) {\n      this.localValue = newVal;\n    },\n  },\n  beforeMount() {\n    this.localValue = this.sliderValue;\n  },\n  methods: {\n    handleSliderInput(event) {\n      this.$emit('input');\n      this.$emit('update:sliderValue', Number(event.target.value));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.range-slidercontainer {\n  width: 100%;\n}\n\n.range-slider {\n  position: relative;\n  margin: 0;\n  height: 25px;\n}\n\n.range-slider input[type='range'] {\n  -webkit-appearance: none;\n  pointer-events: none;\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  left: 0;\n  top: 10px;\n  height: 5px;\n  width: 100%;\n  border-radius: 14px;\n  @include themify {\n    background: themed('range-slider-selected-color');\n  }\n}\n.range-slider input[type='range']:focus, .range-slider input[type='range']:active {\n  outline: none;\n}\n.range-slider input[type='range']::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  box-sizing: content-box;\n  width: 15px;\n  height: 15px;\n  border: none;\n  pointer-events: auto;\n  border-radius: 14px;\n  @include themify {\n    background-color: themed('range-slider-thumb-color');\n  }\n  cursor: pointer;\n  position: relative;\n  z-index: 3;\n  top: -5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-thumb {\n  pointer-events: none;\n  @include themify {\n    background-color: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']::-webkit-slider-runnable-track {\n  -webkit-appearance: none;\n  @include themify {\n    background: themed('range-slider-selected-color');\n  }\n  height: 5px;\n  border-radius: 2.5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-runnable-track {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n\n</style>\n","import { render } from \"./SingleSlider.vue?vue&type=template&id=6a16da12&scoped=true\"\nimport script from \"./SingleSlider.vue?vue&type=script&lang=js\"\nexport * from \"./SingleSlider.vue?vue&type=script&lang=js\"\n\nimport \"./SingleSlider.vue?vue&type=style&index=0&id=6a16da12&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6a16da12\"]])\n\nexport default __exports__","<template>\n  <div ref=\"sliderContainer\" class=\"range-slidercontainer\">\n    <div class=\"range-slider\" :class=\"{'flip': flip}\">\n      <div class=\"range-slider-track-background\" />\n      <div ref=\"middleDiv\" class=\"range-slider-middle\" />\n      <input\n        ref=\"sliderLower\"\n        v-model=\"localValueLower\"\n        type=\"range\"\n        :step=\"step\"\n        :min=\"min\"\n        :max=\"max\"\n        :disabled=\"disabled\"\n        @input=\"handleSliderLowerInput\"\n      >\n      <input\n        ref=\"sliderUpper\"\n        v-model=\"localValueUpper\"\n        type=\"range\"\n        :step=\"step\"\n        :min=\"min\"\n        :max=\"max\"\n        :disabled=\"disabled\"\n        @input=\"handleSliderUpperInput\"\n      >\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'RangeSlider',\n  props: {\n    step: {\n      type: Number,\n      default: 1,\n    },\n    min: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 1,\n    },\n    valueLower: {\n      type: Number,\n      default: 0,\n    },\n    valueUpper: {\n      type: Number,\n      default: 2,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    flip: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'input', 'update:valueLower', 'update:valueUpper',\n  ],\n  data() {\n    return {\n      localValueLower: 0,\n      localValueUpper: 2,\n      localValueMiddle: null,\n      resizeObserver: null,\n    };\n  },\n  watch: {\n    valueLower(newVal) {\n      this.localValueLower = newVal;\n      this.handleRangeSliderMiddleDiv();\n    },\n    valueUpper(newVal) {\n      this.localValueUpper = newVal;\n      this.handleRangeSliderMiddleDiv();\n    },\n  },\n  beforeMount() {\n    this.localValueLower = this.valueLower;\n    this.localValueUpper = this.valueUpper;\n  },\n  mounted() {\n    // Watch for resizes to adjust middle div when resized\n    this.resizeObserver = new ResizeObserver(this.onResize);\n    this.resizeObserver.observe(this.$refs.sliderContainer);\n  },\n  beforeUnmount() {\n    if (this.$refs.sliderContainer) {\n      this.resizeObserver.unobserve(this.$refs.sliderContainer);\n    } else {\n      this.resizeObserver.disconnect();\n    }\n  },\n  methods: {\n    onResize() {\n      this.handleRangeSliderMiddleDiv();\n    },\n    handleSliderLowerInput(event) {\n      let newValueLower = Number(event.target.value);\n      if (newValueLower >= Number(this.localValueUpper)) {\n        newValueLower = this.valueLower;\n        this.localValueLower = this.valueLower;\n      }\n      this.$emit('input');\n      this.$emit('update:valueLower', newValueLower);\n    },\n    handleSliderUpperInput(event) {\n      let newValueUpper = Number(event.target.value);\n      if (newValueUpper <= Number(this.localValueLower)) {\n        newValueUpper = this.valueUpper;\n        this.localValueUpper = this.valueUpper;\n      }\n      this.$emit('input');\n      this.$emit('update:valueUpper', newValueUpper);\n    },\n    handleRangeSliderMiddleDiv() {\n      const thumbHalfWidth = 7.5;\n      const value1 = this.localValueLower;\n      const minValue1 = this.$refs.sliderLower.min;\n      const maxValue1 = this.$refs.sliderLower.max;\n      const value2 = this.localValueUpper;\n      const minValue2 = this.$refs.sliderUpper.min;\n      const maxValue2 = this.$refs.sliderUpper.max;\n      const totalInputWidth = this.$refs.sliderLower.clientWidth;\n      const left1 = (((value1 - minValue1) / (maxValue1 - minValue1))\n        * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth)) + thumbHalfWidth;\n      const left2 = (((value2 - minValue2) / (maxValue2 - minValue2))\n        * ((totalInputWidth - thumbHalfWidth) - thumbHalfWidth)) + thumbHalfWidth;\n      const middleWidth = left2 - left1;\n      this.$refs.middleDiv.style.left = `${left1}px`;\n      this.$refs.middleDiv.style.width = `${middleWidth}px`;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.range-slidercontainer {\n  width: 100%;\n}\n\n.range-slider {\n  position: relative;\n  margin: 0;\n  height: 25px;\n}\n// .range-slider:focus-within {\n//   outline: 1px dotted rgba(0,0,0,0.5);\n// }\n.range-slider input[type='range'] {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  pointer-events: none;\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  left: 0;\n  top: 10px;\n  height: 5px;\n  width: 100%;\n  border-radius: 14px;\n  background: none;\n}\n.range-slider input[type='range']:focus, .range-slider input[type='range']:active {\n  outline: none;\n}\n.range-slider input[type='range']::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  box-sizing: content-box;\n  width: 15px;\n  height: 15px;\n  border: none;\n  pointer-events: auto;\n  border-radius: 14px;\n  @include themify {\n    background-color: themed('range-slider-thumb-color');\n  }\n  cursor: pointer;\n  position: relative;\n  z-index: 3;\n  top: -5px;\n}\n.range-slider input[type='range']::-moz-range-thumb {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  box-sizing: content-box;\n  width: 15px;\n  height: 15px;\n  border: none;\n  pointer-events: auto;\n  border-radius: 14px;\n  @include themify {\n    background-color: themed('range-slider-thumb-color');\n  }\n  cursor: pointer;\n  position: relative;\n  z-index: 3;\n  top: -5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-thumb {\n  pointer-events: none;\n  @include themify {\n    background-color: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']:disabled::-moz-range-thumb {\n  pointer-events: none;\n  @include themify {\n    background-color: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']::-webkit-slider-runnable-track {\n  @include themify {\n    background: themed('range-slider-unselected-color');\n  }\n  height: 5px;\n  border-radius: 2.5px;\n}\n.range-slider input[type='range']::-moz-range-track {\n  @include themify {\n    background: transparent;\n  }\n  height: 5px;\n  border-radius: 2.5px;\n}\n.range-slider input[type='range']:disabled::-webkit-slider-runnable-track {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n.range-slider input[type='range']:disabled::-moz-range-track {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n\n.range-slider .range-slider-track-background {\n  display: none;\n}\n.range-slider .range-slider-middle {\n  height: 5px;\n  width: 20px;\n  @include themify {\n    background: themed('range-slider-selected-color');\n  }\n  position: absolute;\n  top: 10px;\n  z-index: 2;\n}\n@-moz-document url-prefix() {\n  .range-slider .range-slider-track-background {\n    display: block;\n    height: 5px;\n    width: 100%;\n    @include themify {\n      background: themed('range-slider-unselected-color');\n    }\n    position: absolute;\n    top: 10px;\n    z-index: 0;\n  }\n  .range-slider .range-slider-middle {\n    height: 5px;\n    width: 20px;\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    position: absolute;\n    top: 10px;\n    z-index: 0;\n  }\n}\n\n.range-slider input[type='range']:disabled + .range-slider-middle {\n  @include themify {\n    background: themed('slider-background-disabled');\n  }\n}\n\n.flip {\n  &.range-slider input[type='range']::-webkit-slider-runnable-track {\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    height: 5px;\n    border-radius: 2.5px;\n  }\n  &.range-slider input[type='range']::-moz-range-track {\n    @include themify {\n      background: themed('range-slider-selected-color');\n    }\n    height: 5px;\n    border-radius: 2.5px;\n  }\n  &.range-slider .range-slider-middle {\n    height: 5px;\n    width: 20px;\n    position: absolute;\n    top: 10px;\n    z-index: 2;\n    @include themify {\n      background: themed('range-slider-unselected-color');\n    }\n  }\n  &.range-slider input[type='range']:disabled + .range-slider-middle {\n    background: transparent;\n  }\n}\n\n</style>\n","import { render } from \"./RangeSlider.vue?vue&type=template&id=5e5c52b8&scoped=true\"\nimport script from \"./RangeSlider.vue?vue&type=script&lang=js\"\nexport * from \"./RangeSlider.vue?vue&type=script&lang=js\"\n\nimport \"./RangeSlider.vue?vue&type=style&index=0&id=5e5c52b8&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5e5c52b8\"]])\n\nexport default __exports__","<template>\n  <div class=\"col model-settings\">\n    <template\n      v-for=\"(field, index) in fields\"\n      :key=\"`${parent}-${field.name}-${index}`\"\n    >\n      <div v-if=\"field.type === 'group'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n            <h4>{{ field.label }}</h4>\n          </div>\n          <template v-if=\"getChildren(field)\">\n            <ConfigureFieldsGroup\n              :id=\"`parent-${field.name}`\"\n              v-model:params=\"parameters[field.name]\"\n              :fields=\"field.children\"\n              :parent=\"field.name\"\n            />\n          </template>\n        </div>\n      </div>\n      <div v-if=\"field.type === 'slider'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <label class=\"slider-label\">\n            <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n              <h4>{{ field.label }}</h4>\n              <SVGIcon\n                v-if=\"field.description\"\n                v-tooltip=\"field.description\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n                :iconName=\"'info'\"\n                class=\"help-logo\"\n              />\n            </div>\n            <span>{{ parameters[field.name] }}</span>\n          </label>\n          <div class=\"slider-container\">\n            <SingleSlider\n              v-if=\"field.values === 1 && parameters[field.name] !== null\"\n              v-model:sliderValue=\"parameters[field.name]\"\n              :step=\"field.step\"\n              :min=\"field.min\"\n              :max=\"field.max\"\n            />\n            <RangeSlider\n              v-else-if=\"field.values === 2 && parameters[field.name] !== null\"\n              v-model:valueLower=\"parameters[field.name][0]\"\n              v-model:valueUpper=\"parameters[field.name][1]\"\n              :step=\"field.step\"\n              :min=\"field.min\"\n              :max=\"field.max\"\n              :showMiddle=\"false\"\n            />\n            <SingleSlider\n              v-else-if=\"parameters[field.name] !== null\"\n              v-model:sliderValue=\"parameters[field.name]\"\n              :step=\"field.step\"\n              :min=\"field.min\"\n              :max=\"field.max\"\n            />\n          </div>\n        </div>\n      </div>\n      <template v-if=\"typeof parameters[field.name] === 'string' || typeof parameters[field.name] === 'number' || Array.isArray(parameters[field.name])\">\n        <div v-if=\"field.type === 'select'\" class=\"col form__control-group field-group\">\n          <div class=\"row\">\n            <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n              <h4>\n                {{ field.label ? field.label : field.Label ? field.Label : field.name }}\n              </h4>\n              <SVGIcon\n                v-if=\"field.description\"\n                v-tooltip=\"field.description\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n                :iconName=\"'info'\"\n                class=\"help-logo\"\n              />\n            </div>\n            <select\n              v-if=\"field.is_dropdown\"\n              v-model=\"parameters[field.name]\"\n            >\n              <option\n                v-for=\"(option, i) in field.options\"\n                :key=\"`dropdown-${parent}-${field.name}-${i}-${option.name}`\"\n                :value=\"option.name\"\n              >\n                {{ option.label }}\n              </option>\n            </select>\n            <div v-else class=\"row radio-option\">\n              <div v-for=\"(option, i) in field.options\" :key=\"i\" class=\"radio-option__field\">\n                <input\n                  :id=\"`radio-${parent}-${field.name}-${i}-${option.name}`\"\n                  v-model=\"parameters[field.name]\"\n                  :type=\"field.multi_select ? 'checkbox' : 'radio'\"\n                  :value=\"option.name\"\n                >\n                <label :for=\"`radio-${parent}-${field.name}-${i}-${option.name}`\">{{ option.label }}</label>\n              </div>\n            </div>\n            <template v-if=\"getSelectChildren(field)\">\n              <ConfigureFieldsGroup\n                :id=\"`parent-${field.name}`\"\n                v-model:params=\"parameters[field.name]\"\n                :fields=\"getSelectChildren(field)\"\n                :parent=\"field.name\"\n              />\n            </template>\n          </div>\n        </div>\n      </template>\n      <template v-else-if=\"typeof parameters[field.name] === 'object'\">\n        <div v-if=\"field.type === 'select'\" class=\"col form__control-group field-group\">\n          <div class=\"row\">\n            <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n              <h4>\n                {{ field.label ? field.label : field.Label ? field.Label : field.name }}\n                <SVGIcon\n                  v-if=\"field.description\"\n                  v-tooltip=\"field.description\"\n                  :width=\"'20px'\"\n                  :height=\"'20px'\"\n                  :iconName=\"'info'\"\n                  class=\"help-logo\"\n                />\n              </h4>\n            </div>\n            <select\n              v-if=\"field.is_dropdown\"\n              @change=\"getSelectValue($event.target.value, field)\"\n            >\n              <!-- v-model=\"parameters[field.name]\" -->\n              <option\n                v-for=\"(option, i) in field.options\"\n                :key=\"`dropdown-${parent}-${field.name}-${i}-${option.name}`\"\n                :value=\"option.name\"\n              >\n                {{ option.label }}\n              </option>\n            </select>\n            <div v-else class=\"row radio-option\">\n              <div v-for=\"(option, i) in field.options\" :key=\"i\" class=\"radio-option__field\">\n                <input\n                  :id=\"`radio-${parent}-${field.name}-${i}-${option.name}`\"\n                  :type=\"field.multi_select ? 'checkbox' : 'radio'\"\n                  :value=\"option.name\"\n                  @input=\"($event) => getSelectValue($event.target.value, field)\"\n                >\n                <label :for=\"`radio-${parent}-${field.name}-${i}-${option.name}`\">{{ option.label }}</label>\n              </div>\n            </div>\n\n            <template v-if=\"getSelectChildren(field)\">\n              <ConfigureFieldsGroup\n                v-for=\"childKey in Object.keys(parameters[field.name])\"\n                :id=\"`parent-${field.name}`\"\n                :key=\"childKey\"\n                v-model:params=\"parameters[field.name][childKey]\"\n                :fields=\"getSelectChildren(field)\"\n                :parent=\"field.name\"\n              />\n            </template>\n          </div>\n        </div>\n      </template>\n      <div v-if=\"field.type === 'bool' && 'children' in field\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div class=\"checkbox-container\">\n            <input\n              :id=\"`checkbox-${parent.name}-${field.name}`\"\n              :name=\"`checkbox-${parent.name}-${field.name}`\"\n              type=\"checkbox\"\n              :checked=\"field.name in parameters\"\n              @input=\"($event) => getBooleanValue($event, field)\"\n            >\n            <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n              <h4 class=\"ms-2\" :for=\"`checkbox-${parent}-${field.name}`\">\n                <label :for=\"`checkbox-${parent.name}-${field.name}`\">{{ field.label }}\n                </label>\n              </h4>\n              <SVGIcon\n                v-if=\"field.description\"\n                v-tooltip=\"field.description\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n                :iconName=\"'info'\"\n                class=\"help-logo\"\n              />\n            </div>\n          </div>\n          <keep-alive>\n            <template v-if=\"field.name in parameters\">\n              <ConfigureFieldsGroup\n                :id=\"`parent-${field.name}`\"\n                v-model:params=\"parameters[field.name]\"\n                :fields=\"field.children\"\n                :parent=\"field.name\"\n              />\n            </template>\n          </keep-alive>\n        </div>\n      </div>\n      <div v-else-if=\"field.type === 'bool'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div class=\"checkbox-container\">\n            <input\n              :id=\"`checkbox-${parent}-${field.name}`\"\n              :name=\"`checkbox-${parent}-${field.name}`\"\n              type=\"checkbox\"\n              :checked=\"parameters[field.name]\"\n              @input=\"($event) => getBooleanValue($event, field)\"\n            >\n            <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n              <h4 class=\"ms-2\" :for=\"`checkbox-${parent}-${field.name}`\">\n                <label :for=\"`checkbox-${parent}-${field.name}`\">\n                  {{ field.label }}\n                </label>\n              </h4>\n              <SVGIcon\n                v-if=\"field.description\"\n                v-tooltip=\"field.description\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n                :iconName=\"'info'\"\n                class=\"help-logo\"\n              />\n            </div>\n          </div>\n        </div>\n      </div>\n      <div v-if=\"field.type === 'int'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n            <h4>\n              {{ field.label }}\n            </h4>\n            <SVGIcon\n              v-if=\"field.description\"\n              v-tooltip=\"field.description\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n              :iconName=\"'info'\"\n              class=\"help-logo\"\n            />\n          </div>\n          <input\n            :id=\"`int-input-${parent}-${field.name}`\"\n            v-model=\"parameters[field.name]\"\n            type=\"number\"\n            :step=\"field.step\"\n            :min=\"field.min\"\n            :max=\"field.max\"\n          >\n        </div>\n      </div>\n      <div v-if=\"field.type === 'float'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n            <h4>\n              {{ field.label }}\n            </h4>\n            <SVGIcon\n              v-if=\"field.description\"\n              v-tooltip=\"field.description\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n              :iconName=\"'info'\"\n              class=\"help-logo\"\n            />\n          </div>\n          <input\n            :id=\"`float-input-${parent}-${field.name}`\"\n            v-model=\"parameters[field.name]\"\n            type=\"number\"\n            :step=\"field.step\"\n            :min=\"field.min\"\n            :max=\"field.max\"\n          >\n        </div>\n      </div>\n      <div v-if=\"field.type === 'text'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n            <h4>\n              {{ field.label }}\n            </h4>\n            <SVGIcon\n              v-if=\"field.description\"\n              v-tooltip=\"field.description\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n              :iconName=\"'info'\"\n              class=\"help-logo\"\n            />\n          </div>\n          <textarea\n            v-if=\"field.is_multi_line\"\n            :id=\"`text-input-${parent}-${field.name}`\"\n            v-model=\"parameters[field.name]\"\n            rows=\"4\"\n            cols=\"50\"\n          />\n          <input\n            v-else\n            :id=\"`text-input-${parent}-${field.name}`\"\n            v-model=\"parameters[field.name]\"\n            :type=\"field.hidden ? 'password' : field.numeric_only ? 'number' : 'text'\"\n          >\n        </div>\n      </div>\n      <div v-if=\"field.type === 'date'\" class=\"col form__control-group field-group\">\n        <div class=\"row\">\n          <div :class=\"{'required': field.required}\" class=\"d-flex align-items-center\">\n            <h4>\n              {{ field.label }}\n            </h4>\n            <SVGIcon\n              v-if=\"field.description\"\n              v-tooltip=\"field.description\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n              :iconName=\"'info'\"\n              class=\"help-logo\"\n            />\n          </div>\n          <input\n            v-model=\"parameters[field.name]\"\n            type=\"date\"\n          >\n        </div>\n      </div>\n    </template>\n  </div>\n</template>\n\n<script setup>\nimport {\n  ref, watch, toRefs, onBeforeMount, onActivated,\n} from 'vue';\nimport SingleSlider from '@/components/SingleSlider.vue';\nimport RangeSlider from '@/components/RangeSlider.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nconst props = defineProps({\n  parent: {\n    type: String,\n    default: \"\",\n  },\n  fields: {\n    type: Object,\n    default: () => {},\n  },\n  params: {\n    type: [String, Object, Boolean],\n    default: () => {},\n  },\n});\n\nconst emit = defineEmits([\n  'update:params',\n]);\n\nconst {\n  parent,\n  fields,\n  params,\n} = toRefs(props);\n\nconst parameters = ref({});\nwatch(parameters, (value) => {\n  emit('update:params', JSON.parse(JSON.stringify(value)));\n}, { deep: true });\n\nfunction getSelectChildren(field) {\n  if (parameters.value && parameters.value[field.name] && field.options) {\n    const options = field.options.find((e) => e.name === getSpecificValue(parameters.value[field.name]))?.children;\n    return options;\n  } else {\n    return null;\n  }\n}\n\nfunction getChildren(field) {\n  if (field.children && field.children.length > 0) {\n    return field.children;\n  } else {\n    return null;\n  }\n}\n\nfunction getSpecificValue(val) {\n  if (typeof val === 'string') {\n    return val;\n  } else if (typeof val === 'object') {\n    return Object.keys(val)[0];\n  } else {\n    return '';\n  }\n}\n\nfunction getBooleanValue(e, field) {\n  const isChecked = e.target.checked;\n  if (!('children' in field)) {\n    parameters.value[field.name] = isChecked;\n  } else if ('children' in field && !isChecked) {\n    delete parameters.value[field.name];\n  } else if ('children' in field && isChecked) {\n    parameters.value[field.name] = {};\n  }\n}\n\nfunction getSelectValue(optionName, field) {\n  const option = field.options.find((e) => String(e.name) === String(optionName));\n  const notSelectedOptions = field.options.filter((e) => String(e.name) !== String(optionName));\n  if (option) {\n    if (!('children' in option)) {\n      if (parameters.value[field.name] && Array.isArray(parameters.value[field.name])) {\n        const stringArray = parameters.value[field.name].map((e) => String(e));\n        const arrIndex = stringArray.indexOf(option.name);\n        if (arrIndex > -1) {\n          parameters.value[field.name].splice(arrIndex, 1);\n        } else {\n          parameters.value[field.name].push(option.name);\n        }\n      } else {\n        parameters.value[field.name] = optionName;\n      }\n    } else if ('children' in option) {\n      if (!parameters.value[field.name]) {\n        parameters.value[field.name] = {};\n      }\n      parameters.value[field.name][optionName] = {};\n    }\n  }\n  // remove unselected field\n  if (parameters.value[field.name] && (typeof parameters.value[field.name] === 'object') && !Array.isArray(parameters.value[field.name])) {\n    if (notSelectedOptions && notSelectedOptions.length > 0) {\n      notSelectedOptions.forEach((o) => {\n        if (o.name in parameters.value[field.name]) {\n          delete parameters.value[field.name][o.name];\n        }\n      });\n    }\n  }\n}\n\n// expansion panels do not share the same dropdown, so this will let each child have its own dropdown\nonBeforeMount(() => {\n  if (fields.value) {\n    fields.value.forEach((field) => {\n      if (field.type === 'float' || field.type === 'int') {\n        parameters.value[field.name] = field.default;\n      } else if (field.type === 'select') {\n        if (field.multi_select) {\n          parameters.value[field.name] = [];\n          if (Array.isArray(field.default)) {\n            field.default.forEach((v) => {\n              if (typeof v === 'string' || typeof v === 'number') {\n                getSelectValue(v, field);\n              }\n            });\n          } else if (typeof field.default === 'string' || typeof field.default === 'number') {\n            parameters.value[field.name].push({\n              value: field.default,\n              options: {},\n            });\n          }\n        } else if (typeof field.default === 'string' || typeof field.default === 'number') {\n          getSelectValue(field.default, field);\n        }\n      } else if (field.type === 'slider') {\n        parameters.value[field.name] = field.default;\n      } else if (field.type === 'bool') {\n        if (!('children' in field) && field.default) {\n          parameters.value[field.name] = true;\n        } else if (!('children' in field) && !field.default) {\n          parameters.value[field.name] = false;\n        } else if ('children' in field && field.default) {\n          parameters.value[field.name] = {};\n        }\n      }\n    });\n  }\n  emit('update:params', JSON.parse(JSON.stringify(parameters.value)));\n});\n\nonActivated(() => {\n  emit('update:params', JSON.parse(JSON.stringify(parameters.value)));\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.row {\n  width: 100%;\n  margin-top: 5px;\n  h4 {\n    width: fit-content;\n    margin-bottom: 0;\n    font-size: 15px;\n    white-space: nowrap;\n    text-align: left;\n    color: #250E81;\n\n    &.required::after {\n      content: '*';\n      font-size: 14px;\n      font-weight: 700;\n      padding-left: 1px;\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n\n    span.required {\n      font-size: 14px;\n      font-weight: 700;\n      padding-left: 1px;\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n  }\n\n}\n\nlabel {\n  display: flex;\n  align-items: center;\n}\n\n.radio-option {\n  display: flex;\n  align-items: center;\n\n  &__field {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    width: fit-content;\n    min-width: 300px;\n    // max-width: 150px;\n\n    label {\n      padding-left: 5px;\n      color: #383c48;\n      cursor: pointer;\n      font-size: 15px;\n      font-weight: 500;\n    }\n  }\n}\n\ninput[type=\"radio\"], input[type=\"checkbox\"] {\n    min-height: 18px;\n    min-width: 18px;\n    border: 0px !important;\n    @include themify() {\n      accent-color: themed('color-primary');\n    }\n  }\n\n.color-input {\n  padding: 4px;\n}\n\n.text-field {\n  width: 100%;\n  text-align: start;\n  font-size: 16px;\n  font-weight: 400;\n  white-space: wrap;\n  line-break: anywhere;\n  color: var(--color-primary-600);\n}\n\n.slider-label-container {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  justify-content: space-between;\n}\n\n.slider-label {\n  display: flex;\n  justify-content: space-between;\n  div {\n    display: flex;\n    align-items: center;\n    width: fit-content;\n  }\n}\n\n.checkbox-container {\n  display: flex;\n  flex-direction: row;\n}\n\n:deep() {\n  .v-expansion-panel__shadow {\n    box-shadow: none !important;\n  }\n  .v-expansion-panel-title--active {\n    min-height: 0;\n  }\n  .v-expansion-panel-text{\n    padding: 0 16px 0 16px !important;\n  }\n  .v-expansion-panel-text__wrapper{\n    display: flex;\n    justify-content: center;\n    padding: 0 0 8px 0 !important;\n  }\n  .v-expansion-panel-title{\n    min-height: 40px !important;\n    height: 40px !important;\n  }\n}\n.help-logo {\n  margin: 0 5px;\n  color: var(--color-primary);\n}\n\n.help-logo:focus {\n  outline: none;\n}\n\n</style>\n","import script from \"./ConfigureFieldsGroup.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ConfigureFieldsGroup.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./ConfigureFieldsGroup.vue?vue&type=style&index=0&id=6d82682e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6d82682e\"]])\n\nexport default __exports__","import { render } from \"./CreateTrainerSessionModalV2.vue?vue&type=template&id=7418371e&scoped=true\"\nimport script from \"./CreateTrainerSessionModalV2.vue?vue&type=script&lang=js\"\nexport * from \"./CreateTrainerSessionModalV2.vue?vue&type=script&lang=js\"\n\nimport \"./CreateTrainerSessionModalV2.vue?vue&type=style&index=0&id=7418371e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7418371e\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"trainingChartsModal\"\n    :title=\"'Training Chart'\"\n    :fullScreen=\"true\"\n    :closeWithEscapeKey=\"false\"\n    @closed=\"chartModalClosed\"\n  >\n    <template #modal-main>\n      <div v-if=\"!chartsReady \" class=\"wait-wrapper\">\n        <div class=\"loader-dual-ring\" />\n      </div>\n      <div v-else id=\"wrapper\" class=\"chart-wrapper\">\n        <div v-for=\"chart in chartsData\" :key=\"chart.name\" class=\"chart-small\">\n          <TrainingChartSingle\n            :name=\"chart.name\"\n            :labels=\"chart.labels\"\n            :series=\"chart.series\"\n            @chart-clicked=\"chartZoomHandler(chart.name)\"\n          />\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport TrainingChartSingle from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainingChartSingle';\nimport Modal from '@/components/Modal.vue';\nimport { AlertDialogDescription } from 'radix-vue';\n\nexport default {\n  name: 'TrainingCharts',\n  components: {\n    Modal,\n    TrainingChartSingle,\n  },\n  props: {\n    trainerSession: {\n      type: Object,\n      default: () => {},\n    },\n    trainerExperiment: {\n      type: Object,\n      default: () => {},\n    },\n    projectID: {\n      type: Number,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      chartsReady: false,\n      chartsData: {},\n    };\n  },\n  computed: {\n  },\n  mounted() {\n    false,\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  unmounted() {\n    false,\n    clearInterval(this.interval);\n  },\n  methods: {\n    async refresh() {\n      await this.GetChartsData();\n    },\n    chartModalClosed() {\n      clearInterval(this.interval);\n    },\n    chartZoomHandler(name) {\n      alert(name);\n    },\n\n    async showModal() {\n      this.interval = setInterval(() => {\n        this.refresh();\n      }, 5000);\n\n      await this.GetChartsData();\n\n      this.$refs.trainingChartsModal.showModal();\n    },\n\n    async GetChartsData() {\n      console.log(\"Getting Charts Data\");\n\n      this.fetchCharts().then(async (resp) => {\n        const localChartsData = [];\n        this.chartsReady = false;\n        let x;\n        let y;\n        // Create Data series from resp\n        for (const [chartName, charts] of Object.entries(resp)) {\n          const chart_data = {};\n          const series = [];\n          for (const chart of charts) {\n            x = [];\n            y = [];\n\n            const lines = chart.data.split('\\n');\n            for (const line of lines) {\n              const d = line.split(' ');\n              if (d.length > 2) {\n                const xv = parseFloat(d[2]);\n                const yv = parseFloat(d[1]);\n                x.push(xv);\n                y.push(yv);\n              }\n            }\n\n            series.push({\n              name: chart.id,\n              data: y,\n            });\n          }\n          chart_data['series'] = series;\n          chart_data['labels'] = x;\n          chart_data['name'] = chartName;\n\n          localChartsData.push(chart_data);\n        }\n        this.chartsData = localChartsData;\n        this.chartsReady = true;\n      });\n    },\n    async fetchCharts() {\n      // Get Training Charts from BE\n      const params = {\n        project_id: this.projectID,\n      };\n      if (this.trainerExperiment == null) {\n        params.session_id = this.trainerSession.id;\n        params.trainer_id = this.trainerSession.trainer_id;\n      } else {\n        params.trainer_id = this.trainerExperiment.id;\n      }\n\n      const resp = await this.dataConnect.getCharts(params)\n        .catch((error) => {\n          console.log('Failed to launch analytics:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return {};\n      }\n      return resp.result;\n    },\n    handleModalClosed() {\n      this.chartsReady = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.chart-wrapper {\n  position: relative;\n  display: flex;\n  width: 100%;\n  height: 100%;\n  flex-direction: row;\n  flex-wrap: wrap;\n  padding: 8px;\n  background-color: rgb(101, 107, 109);\n  align-content: start;\n  overflow-y: scroll;\n}\n\n.chart-row {\n  position: relative;\n  display: flex;\n  width: 100%;\n  height: 100%;\n  flex-direction: row;\n  flex-wrap: nowrap;\n  padding: 8px;\n  background-color: rgb(101, 107, 109);\n  align-content: start;\n  overflow-x: scroll;\n}\n\n.wait-wrapper {\n  position: relative;\n  display: flex;\n  width: 100%;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n  background-color: rgb(101, 107, 109);\n}\n\n.chart-small{\n  border-radius: 8px;\n  width: 600px;\n  height: 350px;\n  background-color: white;\n  flex-grow: 1;\n  \n  margin: 8px;\n}\n\n.chart-full {\n  width: 100%;\n  height: 100%;\n}\n\n.loader-dual-ring {\n  position: absolute;\n  display: inline-block;\n  width: 80px;\n  height: 80px;\n}\n.loader-dual-ring:after {\n  content: \" \";\n  display: block;\n  width: 64px;\n  height: 64px;\n  margin: 8px;\n  border-radius: 50%;\n  @include themify() {\n    border: 6px solid themed('color-primary');\n    border-color: themed('color-primary') transparent themed('color-primary') transparent;\n  }\n  animation: loader-dual-ring 1.2s linear infinite;\n}\n@keyframes loader-dual-ring {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n</style>\n","import { render } from \"./TrainingCharts.vue?vue&type=template&id=53750968&scoped=true\"\nimport script from \"./TrainingCharts.vue?vue&type=script&lang=js\"\nexport * from \"./TrainingCharts.vue?vue&type=script&lang=js\"\n\nimport \"./TrainingCharts.vue?vue&type=style&index=0&id=53750968&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-53750968\"]])\n\nexport default __exports__","import { render } from \"./TrainerManagement.vue?vue&type=template&id=19438db0&scoped=true\"\nimport script from \"./TrainerManagement.vue?vue&type=script&lang=js\"\nexport * from \"./TrainerManagement.vue?vue&type=script&lang=js\"\n\nimport \"./TrainerManagement.vue?vue&type=style&index=0&id=19438db0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-19438db0\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template v-if=\"!$route.fullPath.includes('/viewer')\" #page-slot>\n        <BreadcrumbSelect\n          id=\"project-select\"\n          v-model=\"currentProject\"\n          :options=\"projectList\"\n          :placeholder=\"'Project'\"\n          :displayTag=\"'name'\"\n        />\n        <SVGIcon\n          :iconName=\"'arrow_right'\"\n          :width=\"'32px'\"\n          :height=\"'32px'\"\n        />\n        <BreadcrumbSelect\n          id=\"dataset-select\"\n          v-model=\"currentDataset\"\n          :options=\"datasets\"\n          :placeholder=\"'Dataset'\"\n          :displayTag=\"'name'\"\n        />\n      </template>\n      <template v-else #page-slot>\n        <span v-if=\"imageName\" class=\"mt-0 mb-0\">{{ imageName }}</span>\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <main\n        id=\"drop-area\"\n        class=\"main-display-area\"\n      >\n        <router-view />\n      </main>\n    </div>\n    <TasksModal />\n  </div>\n</template>\n\n<script>\nimport Header from '@/components/Header.vue';\nimport BreadcrumbSelect from '@/components/BreadcrumbSelect.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport TasksModal from '@/components/TasksStatusComponent/TasksModal.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport { storeToRefs } from 'pinia';\n\nexport default {\n  name: 'Datasets',\n  components: {\n    Header,\n    BreadcrumbSelect,\n    SVGIcon,\n    TasksModal,\n    BreadcrumbNavigation,\n  },\n  setup() {\n    const {\n      currentAnimationSample,\n    } = storeToRefs(useViewerVisualizationsStore());\n\n    return {\n      currentAnimationSample,\n    };\n  },\n  data() {\n    return {\n      imageName: '',\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n    };\n  },\n  computed: {\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject: {\n      get() {\n        return this.$store.state.projects.currentProject;\n      },\n      set(value) {\n        this.$store.commit('projects/setCurrentProject', value);\n      },\n    },\n    currentDataset: {\n      get() {\n        return this.$store.state.datasets.currentDataset;\n      },\n      set(d) {\n        this.$store.commit('datasets/setCurrentDataset', d);\n      },\n    },\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n    combined() {\n      return { ...this.currentProject, ...this.currentDataset };\n    },\n  },\n  watch: {\n    async currentProject() {\n      this.currentDataset = null;\n      this.refreshDatasetList();\n    },\n    combined: {\n      deep: true,\n      handler() {\n        this.$router.replace({\n          path: this.$route.path,\n          query: {\n            dataset: this.currentProject?.id,\n            project: this.currentDataset?.id,\n          },\n        });\n      },\n    },\n    currentAnimationSample: {\n      deep: true,\n      handler() {\n        if (this.currentAnimationSample?.imageObj) {\n          this.imageName = this.currentAnimationSample.imageObj.name;\n        } else {\n          this.imageName = \"\";\n        }\n      },\n    },\n  },\n  created() {\n    if (this.$route) {\n      this.redirect = this.$route.name;\n    }\n  },\n  async beforeMount() {\n    // this.refreshDatasetList();\n  },\n\n  mounted() {\n    if (this.$route.query.dataset) {\n      const d = this.datasets.find((e) => e.id === this.$route.query.dataset);\n      if (d) {\n        this.$store.commit('datasets/setCurrentDataset', d);\n      }\n    }\n    if (this.$route.query.project) {\n      const d = this.projectList.find((e) => e.id === this.$route.query.project);\n      if (d) {\n        this.$store.commit('datasets/setCurrentProject', d);\n      }\n    }\n  },\n  methods: {\n    async refreshDatasetList() {\n      const datasets = await this.getDatasets();\n      this.$store.commit('datasets/setDatasetList', datasets);\n      this.$nextTick(() => {\n        if (!this.currentDataset && this.datasets && this.datasets.length > 0) {\n          this.currentDataset = this.datasets[0];\n        }\n      });\n      await this.getDatasetDetails();\n    },\n    async getDatasetDetails() {\n      const currentProject = this.$store.state.projects.currentProject;\n      if (currentProject) {\n        const params = {\n          project_id: currentProject.id,\n          get_num_images: true,\n          get_labels: true,\n          get_num_labels: true,\n          get_annotation_sets: true,\n          get_groups: true,\n          get_parked: true,\n          get_docker_tasks: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        if (!resp.error) {\n          const temp = resp.result;\n\n          const shallowDatasets = JSON.parse(JSON.stringify(this.datasets));\n\n          shallowDatasets.forEach((e, i) => {\n            if (temp) {\n              temp[i].annotation_sets?.forEach((set, j) => {\n                temp[i].annotation_sets[j].num_images = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_images : 0;\n                temp[i].annotation_sets[j].num_annotations = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_annotations : 0;\n              });\n              shallowDatasets[i].annotation_sets = temp[i].annotation_sets;\n              shallowDatasets[i].numImages = temp[i].numImages ? temp[i].numImages : 0;\n              shallowDatasets[i].labels = temp[i].labels ? temp[i].labels : [];\n              shallowDatasets[i].numLabels = temp[i].numLabels ? temp[i].numLabels : 0;\n              shallowDatasets[i].groups = temp[i].groups ? temp[i].groups : [];\n            }\n          });\n          this.$store.commit('datasets/setDatasetList', shallowDatasets);\n        }\n      }\n    },\n    async getDatasets() {\n      const currentProject = this.$store.state.projects.currentProject;\n      if (currentProject) {\n        const params = {\n          project_id: currentProject.id,\n          // get_num_images: true,\n          // get_labels: true,\n          // get_num_labels: true,\n          // get_annotation_sets: true,\n          // get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        let list = [];\n        if (resp.error) {\n          return list;\n        } else {\n          let temp = resp.result;\n\n          temp = temp.map((e) => {\n            e.annotation_sets = [];\n            e.numImages = null;\n            e.labels = null;\n            e.numLabels = null;\n            e.groups = null;\n            return e;\n          });\n\n          list = temp;\n        }\n        return list;\n      }\n      return [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\nspan {\n  font-size: 1.0rem;\n  font-weight: 600;\n  padding: 5px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n</style>\n","import { defineStore } from 'pinia';\nimport {\n  ref, computed, onUnmounted,\n} from 'vue';\nimport { useThrottleFn } from '@vueuse/core';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const useViewerVisualizationsStore = defineStore('visualizations', () => {\n  const mouse = ref({});\n  const samples = ref([]);\n  const animationImageCache = ref({});\n  const currentAnimationSample = ref(null);\n  const frame = ref(0);\n  const playing = ref(false);\n  const topics = ref([]);\n  const fps = ref(10);\n  const isInitializingAnimation = ref(false);\n  const abortControllerForCaching = ref(null);\n  const limitAnnotationsToSet = ref(null);\n\n  const frameCount = ref(0);\n\n  const buffered = computed(() => {\n    if (frameCount.value === 0) {\n      return 0;\n    }\n\n    let bufferedIndex = frame.value - 1;\n    const lastFrame = Math.max(0, Math.max(...Object.keys(animationImageCache.value).map((e) => parseInt(e))));\n    for (let i = frame.value - 1; i <= frame.value + lastFrame; i++) {\n      if (animationImageCache.value[i] && animationImageCache.value[i].loaded) {\n        bufferedIndex = i;\n      } else {\n        break;\n      }\n    }\n    return bufferedIndex + 1;\n  });\n\n  function addNewSampleToCache(index) {\n    animationImageCache.value[index] = {\n      image: null,\n      imageObj: null,\n      annotations: [],\n      loaded: false,\n    };\n  }\n\n  function clearSample() {\n    currentAnimationSample.value = {\n      image: null,\n      imageObj: null,\n      annotations: [],\n      loaded: false,\n    };\n  }\n\n  function updateSample() {\n    if (animationImageCache.value[frame.value - 1]) {\n      currentAnimationSample.value = animationImageCache.value[frame.value - 1];\n    }\n  }\n\n  const throttledUpdateSample = useThrottleFn(() => {\n    if (animationImageCache.value[frame.value - 1]) {\n      currentAnimationSample.value = animationImageCache.value[frame.value - 1];\n    }\n  }, 100);\n\n  async function pauseAnimation() {\n    console.log('pause animation');\n    playing.value = false;\n  }\n\n  function getAnimationDelay(fps) {\n    return 1000 / fps;\n  }\n\n  function $reset() {\n    animationImageCache.value = {};\n    currentAnimationSample.value = null;\n    frame.value = 0;\n    frameCount.value = 0;\n    playing.value = false;\n    topics.value = [];\n    // keyframes.value = {};\n    // isKeyframe.value = false;\n    keyframes.value = [];\n    mouse.value = {};\n    limitAnnotationsToSet.value = null;\n  }\n\n  function resetForNewSequence() {\n    animationImageCache.value = {};\n    frame.value = 0;\n    frameCount.value = 0;\n    playing.value = false;\n    topics.value = [];\n    keyframes.value = [];\n  }\n\n  function removeKeyframe(selectedKeyframeObject) {\n    keyframes.value = [...keyframes.value.filter((keyframeObject) => keyframeObject.id !== selectedKeyframeObject)];\n  }\n\n  const doKeyframesExist = computed(() => keyframes.value.length > 0);\n\n  // const isKeyframe = computed(() => {\n  //   if (keyframes.value[frame.value]) {\n  //     return true;\n  //   }\n  //   return false;\n  // });\n\n  // const doKeyframesExist = computed(() => {\n  //   if (Object.keys(keyframes.value).length > 0) {\n  //     return true;\n  //   }\n  //   return false;\n  // });\n\n  // const keyframeRanges = computed(() => {\n  //   const keys = Object.keys(keyframes.value).sort((a, b) => a - b);\n\n  //   let currentRangeStart = null;\n  //   const ranges = [];\n\n  //   for (const key of keys) {\n  //     const currentKey = parseInt(key);\n\n  //     if (currentRangeStart === null) {\n  //       currentRangeStart = currentKey;\n  //     } else if (currentKey !== null) {\n  //       ranges.push([currentRangeStart, currentKey]);\n\n  //       if (keyframes.value[key].end) {\n  //         currentRangeStart = null;\n  //       } else {\n  //         currentRangeStart = currentKey;\n  //       }\n  //     }\n  //   }\n\n  //   if (currentRangeStart && currentRangeStart !== totalFrames.value) {\n  //     ranges.push([currentRangeStart, null]);\n  //   }\n\n  //   return ranges;\n  // });\n\n  onUnmounted(() => {\n    $reset();\n  });\n\n  const keyframes = ref([]);\n\n  function setKeyframeNew(frame, imageObj, annotation) {\n    const existingAnnotationKeyframes = keyframes.value.find((d) => d.id === annotation.id);\n    if (!existingAnnotationKeyframes) {\n      keyframes.value.push({ id: annotation.id, tracking_id: uuidv4(), keyframes: { [frame]: { end: false, annotation } } });\n    } else {\n      existingAnnotationKeyframes.keyframes[frame] = { end: false, annotation };\n    }\n  }\n\n  const keyframeAnnotations = computed(() => {\n    function keyframeBelow(keyframes, frame) {\n      let keyframeBelowVal = null;\n      Object.keys(keyframes).forEach((key) => {\n        if (Number(key) <= frame && Number(key) > keyframeBelowVal) {\n          keyframeBelowVal = Number(key);\n        }\n      });\n      if (keyframeBelowVal && keyframes[keyframeBelowVal].end && keyframeBelowVal < frame) {\n        return null;\n      }\n      return keyframeBelowVal;\n    }\n\n    function keyframeAbove(keyframes, frame) {\n      const aboveKeyframes = Object.keys(keyframes)\n        .map((x) => Number(x))\n        .filter((keyframe) => keyframe >= frame);\n\n      if (aboveKeyframes.length === 0) {\n        return null;\n      }\n\n      const keyframeAboveVal = Math.min(...aboveKeyframes);\n      return keyframeAboveVal;\n    }\n\n    const keyframeAnnotationsArr = [];\n    keyframes.value.forEach((d) => {\n      const keyframeBelowVal = keyframeBelow(d.keyframes, frame.value);\n      const keyframeAboveVal = keyframeAbove(d.keyframes, frame.value);\n      if (keyframeBelowVal && !keyframeAboveVal) {\n        keyframeAnnotationsArr.push(d.keyframes[keyframeBelowVal].annotation);\n      } else if (keyframeBelowVal && keyframeAboveVal && keyframeBelowVal === keyframeAboveVal) {\n        keyframeAnnotationsArr.push(d.keyframes[keyframeBelowVal].annotation);\n      } else if (keyframeBelowVal && keyframeAboveVal && keyframeBelowVal < keyframeAboveVal) {\n        const annotationBelow = d.keyframes[keyframeBelowVal].annotation;\n        const annotationAbove = d.keyframes[keyframeAboveVal].annotation;\n\n        const t = (frame.value - keyframeBelowVal) / (keyframeAboveVal - keyframeBelowVal);\n        if (d.keyframes[keyframeBelowVal].annotation.type === 'box') {\n          // Interpolate box\n          const interpolatedAnnotation = {\n            ...annotationBelow,\n            x: annotationBelow.x + (annotationAbove.x - annotationBelow.x) * t,\n            y: annotationBelow.y + (annotationAbove.y - annotationBelow.y) * t,\n            w: annotationBelow.w + (annotationAbove.w - annotationBelow.w) * t,\n            h: annotationBelow.h + (annotationAbove.h - annotationBelow.h) * t,\n          };\n\n          keyframeAnnotationsArr.push(interpolatedAnnotation);\n        } else if (d.keyframes[keyframeBelowVal].annotation.type === '3dbox') {\n          // Interpolate 3dbox\n          const interpolatedAnnotation = {\n            ...annotationBelow,\n            data_json: {\n              ...annotationBelow.data_json,\n              x: annotationBelow.data_json.x + (annotationAbove.data_json.x - annotationBelow.data_json.x) * t,\n              y: annotationBelow.data_json.y + (annotationAbove.data_json.y - annotationBelow.data_json.y) * t,\n              z: annotationBelow.data_json.z + (annotationAbove.data_json.z - annotationBelow.data_json.z) * t,\n              dx: annotationBelow.data_json.dx + (annotationAbove.data_json.dx - annotationBelow.data_json.dx) * t,\n              dy: annotationBelow.data_json.dy + (annotationAbove.data_json.dy - annotationBelow.data_json.dy) * t,\n              dz: annotationBelow.data_json.dz + (annotationAbove.data_json.dz - annotationBelow.data_json.dz) * t,\n            },\n          };\n\n          keyframeAnnotationsArr.push(interpolatedAnnotation);\n        }\n      }\n    });\n\n    return keyframeAnnotationsArr;\n  });\n\n  function removeAnnotationsFromCache(annotations) {\n    // Check each cache element for excluded annotations and remove them\n    const excludeIds = annotations.map((anno) => anno.id);\n    animationImageCache.value.forEach((imageCache, i) => {\n      const excluded = imageCache.annotations.filter((annotation) => excludeIds.includes(annotation.id));\n      if (excluded.length > 0) {\n        // Clear the parsed annotations\n        excluded.forEach((excludedAnno) => {\n          animationImageCache.value[i][excludedAnno.type] = [];\n        });\n        // Clear annotation object\n        animationImageCache.value[i].annotations = imageCache.annotations.filter((annotation) => !excludeIds.includes(annotation.id));\n        animationImageCache.value[i].imageObj.annotations = imageCache.imageObj.annotations.filter((annotation) => !excludeIds.includes(annotation.id));\n      }\n    });\n    updateSample();\n  }\n\n  // const keyframeRangesNew = computed(() => {\n  //   console.log(Object.keys(testdata.value.keyframes));\n  //   const keys = Object.keys(testdata.value.keyframes).sort((a, b) => a - b);\n  //   console.log(keys);\n\n  //   let currentRangeStart = null;\n  //   const ranges = [];\n\n  //   for (const key of keys) {\n  //     const currentKey = parseInt(key);\n\n  //     if (currentRangeStart === null) {\n  //       currentRangeStart = currentKey;\n  //     } else if (currentKey !== null) {\n  //       ranges.push([currentRangeStart, currentKey]);\n\n  //       if (keyframes.value[key].end) {\n  //         currentRangeStart = null;\n  //       } else {\n  //         currentRangeStart = currentKey;\n  //       }\n  //     }\n  //   }\n\n  //   console.log(currentRangeStart);\n  //   if (currentRangeStart && currentRangeStart !== totalFrames.value) {\n  //     ranges.push([currentRangeStart, null]);\n  //   }\n\n  //   return ranges;\n  // });\n\n  function addNewAnnotationsArrayToCache(newAnnotations) {\n    const groupedNewAnnotations = Object.groupBy(newAnnotations, ({ image_id }) => image_id);\n    Object.values(animationImageCache.value).forEach((cacheFrame) => {\n      if (cacheFrame.imageObj && groupedNewAnnotations[cacheFrame.imageObj.id]) {\n        groupedNewAnnotations[cacheFrame.imageObj.id].forEach((anno) => { anno.reviewStatus = \"verified\"; });\n        cacheFrame.annotations = [...cacheFrame.annotations, ...groupedNewAnnotations[cacheFrame.imageObj.id]];\n        cacheFrame.imageObj.annotations = [...cacheFrame.imageObj.annotations, ...groupedNewAnnotations[cacheFrame.imageObj.id]];\n      }\n    });\n    updateSample();\n  }\n\n  return {\n    samples,\n    animationImageCache,\n    currentAnimationSample,\n    frame,\n    playing,\n    buffered,\n    topics,\n    // isKeyframe,\n    doKeyframesExist,\n    frameCount,\n    fps,\n    isInitializingAnimation,\n    abortControllerForCaching,\n    // keyBelowFrame,\n    // keyAboveFrame,\n    // isWithinKeyframeRange,\n    // isWithinPendingKeyframeRange,\n    pauseAnimation,\n    removeKeyframe,\n    resetForNewSequence,\n    $reset,\n    keyframes,\n    setKeyframeNew,\n    addNewSampleToCache,\n    clearSample,\n    updateSample,\n    throttledUpdateSample,\n    removeAnnotationsFromCache,\n    getAnimationDelay,\n    addNewAnnotationsArrayToCache,\n    // keyframeRangesNew,\n    keyframeAnnotations,\n    mouse,\n    limitAnnotationsToSet,\n  };\n});\n","import { render } from \"./Datasets.vue?vue&type=template&id=ca8f6560&scoped=true\"\nimport script from \"./Datasets.vue?vue&type=script&lang=js\"\nexport * from \"./Datasets.vue?vue&type=script&lang=js\"\n\nimport \"./Datasets.vue?vue&type=style&index=0&id=ca8f6560&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ca8f6560\"]])\n\nexport default __exports__","<template>\n  <div class=\"main-page-div\">\n    <main>\n      <div\n        id=\"annotation-viewer-modal\"\n      >\n        <v-layout :full-height=\"true\" style=\"z-index: 9;\" class=\"flex-column\">\n          <div\n            ref=\"modalDisplay\"\n            class=\"display\"\n            :tabindex=\"selectedAnnotationsToEdit.length > 0\"\n            @keyup.esc.stop=\"handleEscape\"\n          >\n            <BaseSidebar :collapsible=\"false\">\n              <div class=\"annotation-viewer-modal__sidebar\">\n                <div class=\"data\">\n                  <JsonRawViewer\n                    v-model:displayLabelTags=\"displayLabelTags\"\n                    v-model:displayProjection=\"displayProjection\"\n                    v-model:selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n                    v-model:selectedLabels=\"annotationDisplaySettings.displayLabels.labels\"\n                    v-model:colorAnnotationsBy=\"annotationDisplaySettings.colorAnnotationsBy.type\"\n                    :labels=\"labels\"\n                    :imageObj=\"displayImageObj\"\n                    :annotationSets=\"annotationSets\"\n                    :groupedAnnotations=\"groupedAnnotations\"\n                    :hideAddTopics=\"true\"\n                    :isEditing=\"false\"\n                    @edit-for-annotation-set=\"handleEditAnnotations\"\n                    @new-color=\"(params)=>updateLabelColor(params, { dataset_id: internalImageObj.dataset_id })\"\n                  >\n                    <template #utilities-slot>\n                      <AddVisualizationMenu @layout-selected=\"(layout) => {handleAddVisualization(layout); toggleVisibility(layout)}\" />\n                      <SelectLayoutMenu @layout-selected=\"handleLayoutSelected\" />\n                    </template>\n                  </JsonRawViewer>\n                </div>\n              </div>\n            </BaseSidebar>\n\n            <div class=\"visualization\">\n              <template v-if=\"!showEditorModal\">\n                <VisualizationDisplays\n                  ref=\"visualizationDisplays\"\n                  v-model:layout=\"layout\"\n                  :loading=\"isInitializingAnimation || isLoadingSample\"\n                  :failed=\"isLoadingSampleFailed\"\n                  @drop=\"handleVisualizationContainerDrop\"\n                  @visualization-selected=\"handleVisualizationSelected\"\n                />\n              </template>\n              <div class=\"visualization__horizontal-divider\" />\n              <AnimationControls\n                v-if=\"internalImageObj\"\n                ref=\"animationControls\"\n                :imagesParams=\"imagesParams\"\n                :currentImage=\"internalImageObj\"\n                :isTask=\"false\"\n                :labels=\"labels\"\n                :selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n              />\n            </div>\n          </div>\n        </v-layout>\n      </div>\n    </main>\n  </div>\n\n  <template v-if=\"!showEditorModal\">\n    <VisualizationPane v-if=\"visualizationLocations?.canvas\" :paneType=\"'canvas'\" :to=\"getLocationId(visualizationLocations.canvas)\">\n      <AnnotationToolViewingModeControls\n        :hasImage=\"displayImageObj && 'id' in displayImageObj\"\n        :zoom=\"zoom\"\n        :hasSelection=\"selectedAnnotationIdentifiers.length > 0\"\n        @zoom-to-fit=\"handleZoomToFit\"\n        @zoom-to-selection=\"handleZoomToSelection\"\n        @download-image=\"downloadImage\"\n      />\n      <div\n        ref=\"annotationTool\"\n        class=\"annotation-tool\"\n      >\n        <AnnotationCanvas\n          v-if=\"displayImageObj\"\n          ref=\"annotationCanvas\"\n          v-model:scale=\"annotationToolScale\"\n          v-model:selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n          :selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n          :selectedLabels=\"annotationDisplaySettings.displayLabels.labels\"\n          :annotations=\"displayAnnotations\"\n          :annotationSets=\"annotationSets\"\n          :imageObj=\"displayImageObj\"\n          :labels=\"labels\"\n          :colorBy=\"colorBy\"\n          :showAnnotations=\"showAnnotations\"\n          :displayLabelTags=\"displayLabelTags\"\n          :editingEnabled=\"false\"\n          :useImageCacheOnly=\"true\"\n          :imageCacheElem=\"currentAnimationSample?.image\"\n          :displayProjection=\"displayProjection\"\n          :showTypes=\"jsonViewerShowTypes\"\n          :showPointerAxes=\"enableDepthMap\"\n          :lidarProjections=\"currentAnimationSample?.lidarProjections\"\n          :pcdProjections=\"currentAnimationSample?.pcdProjections\"\n        />\n      </div>\n      <VideoControls v-if=\"isVideo\" />\n    </VisualizationPane>\n\n    <VisualizationPane v-if=\"visualizationLocations?.['3d-canvas']\" :to=\"getLocationId(visualizationLocations['3d-canvas'])\">\n      <PointCloudViewer\n        :imageObj=\"displayImageObj\"\n        :annotations=\"displayAnnotations\"\n        :labels=\"labels\"\n        :points=\"currentAnimationSample?.pcd\"\n        :lidar=\"currentAnimationSample?.lidar\"\n        :showTypes=\"jsonViewerShowTypes\"\n        :selectedLabels=\"annotationDisplaySettings.displayLabels.labels\"\n        :selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n      />\n    </VisualizationPane>\n\n    <VisualizationPane v-if=\"visualizationLocations?.['depth-map']\" :to=\"getLocationId(visualizationLocations['depth-map'])\">\n      <DepthMapViewer\n        :showDepthMap=\"enableDepthMap\"\n      />\n    </VisualizationPane>\n  </template>\n\n  <AnnotationEditorModal\n    v-if=\"showEditorModal\"\n    ref=\"annotationEditorModal\"\n    :initialLabels=\"labels\"\n    :reviewSettings=\"reviewSettings\"\n    :initialAuditorType=\"reviewSettings?.initialAuditorType\"\n    :editAsSequence=\"showSequences\"\n    @closed=\"handleExitEditor(reviewSettings.reviewTask)\"\n    @new-color=\"(params) => updateLabelColor(params, reviewSettings.reviewTask)\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport BaseSidebar from '@/components/BaseSidebar.vue';\nimport AnnotationCanvas from '@/components/DatasetComponent/AnnotationTool/AnnotationCanvas.vue';\nimport AnnotationToolViewingModeControls from '@/components/DatasetComponent/AnnotationTool/AnnotationToolViewingModeControls.vue';\nimport AnnotationEditorModal from '@/components/DatasetComponent/AnnotationTool/AnnotationEditorModal.vue';\nimport { roundNumber } from '@/assets/js/utils.js';\nimport {\n  ref, onUnmounted, computed,\n} from 'vue';\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport { auzone_logo } from \"@/assets/js/icons\";\nimport VideoControls from '@/components/DatasetComponent/AnnotationTool/VideoControls/VideoControls.vue';\nimport AnimationControls from '@/components/DatasetComponent/AnnotationTool/AnimationControlsV2.vue';\nimport useViewerVisualizations from '@/composables/useViewerVisualizations.js';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport { storeToRefs } from 'pinia';\nimport PointCloudViewer from '@/components/DatasetComponent/AnnotationTool/PointCloudViewer.vue';\nimport DepthMapViewer from '@/components/DatasetComponent/AnnotationTool/DepthMapViewer.vue';\nimport usePCD from '@/composables/annotationTool/usePCD.js';\nimport useDepthMap from '@/composables/annotationTool/useDepthMap.js';\nimport JsonRawViewer from '@/components/DatasetComponent/AnnotationTool/JsonRawViewer.vue';\nimport useGallery from '@/composables/annotationTool/useGallery.js';\nimport useVisualizationDisplays from '@/composables/annotationTool/useVisualizationDisplays.js';\nimport VisualizationDisplays from '@/components/DatasetComponent/AnnotationTool/VisualizationDisplays.vue';\nimport VisualizationPane from '@/components/DatasetComponent/AnnotationTool/VisualizationPane.vue';\nimport SelectLayoutMenu from '@/components/DatasetComponent/AnnotationTool/SelectLayoutMenu.vue';\nimport AddVisualizationMenu from '@/components/DatasetComponent/AnnotationTool/AddVisualizationMenu.vue';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\nimport { onKeyStroke, useDebounceFn } from '@vueuse/core';\n\nexport default {\n  name: 'AnnotationViewer',\n  components: {\n    AnnotationCanvas,\n    AnnotationToolViewingModeControls,\n    BaseSidebar,\n    VideoControls,\n    AnimationControls,\n    PointCloudViewer,\n    DepthMapViewer,\n    JsonRawViewer,\n    AnnotationEditorModal,\n    VisualizationDisplays,\n    VisualizationPane,\n    SelectLayoutMenu,\n    AddVisualizationMenu,\n  },\n  emits: [\n    'update:updatedAnnotations', 'get-next-image', 'get-previous-image', 'closed',\n  ],\n  setup() {\n    const showEditorModal = ref(false);\n\n    const {\n      imageList,\n      datasetFilters,\n      getImages,\n      getImagesParams,\n      setImageParams,\n      setDatasetFilters,\n      currentDatasetID,\n    } = useGallery();\n    const imagesParams = computed(() => getImagesParams());\n\n    const {\n      jsonViewerShowTypes,\n    } = useAnnotationType();\n\n    const initialAnnotationDisplaySettings = ref(\n      {\n        displayAnnotationSets: { annotation_sets: [] },\n        displayLabels: { labels: [] },\n        colorAnnotationsBy: { type: \"label\" },\n      },\n    );\n    const annotationSets = ref([]);\n    const internalImageObj = ref(null);\n    const internalAnnotations = ref([]);\n    const selectedAnnotationIdentifiers = ref([]);\n    const displayLabelTags = ref({\n      box: true,\n    });\n    const displayProjection = ref({\n      '3dbox': false,\n      lidar: false,\n      pcd: false,\n    });\n    const annotationDisplaySettings = ref({\n      displayAnnotationSets: { annotation_sets: initialAnnotationDisplaySettings.value.displayAnnotationSets.annotation_sets },\n      displayLabels: { labels: initialAnnotationDisplaySettings.value.displayLabels.labels },\n      colorAnnotationsBy: { type: initialAnnotationDisplaySettings.value.colorAnnotationsBy.type },\n    });\n    const showSequences = ref(true);\n\n    const labels = ref([]);\n    const labelColorMap = ref({});\n\n    // Visualizations\n    const {\n      currentAnimationSample, topics, isInitializingAnimation, frame, mouse, samples,\n    } = storeToRefs(useViewerVisualizationsStore());\n    const { $reset } = useViewerVisualizationsStore();\n    onUnmounted(() => {\n      $reset();\n    });\n\n    const animationControls = ref(null);\n    onKeyStroke('ArrowRight', useDebounceFn(async (e) => {\n      if (samples.value && samples.value.length > 0 && !showEditorModal.value) {\n        animationControls.value.handleSkipNext();\n      }\n    }, 20));\n\n    onKeyStroke('ArrowLeft', useDebounceFn(async (e) => {\n      if (samples.value && samples.value.length > 0 && !showEditorModal.value) {\n        animationControls.value.handleSkipPrevious();\n      }\n    }, 20));\n\n    const dataConnect = new DatastoreConnect();\n\n    const { enablePCD } = usePCD(internalImageObj);\n\n    const { enableDepthMap } = useDepthMap(internalImageObj);\n\n    const {\n      handleAddVisualization,\n      handleVisualizationSelected,\n      handleVisualizationContainerDrop,\n      handleLayoutSelected,\n      visualizationLocations,\n      getLocationId,\n      layout,\n    } = useVisualizationDisplays();\n\n    return {\n      showEditorModal,\n      imageList,\n      getImages,\n      imagesParams,\n      datasetFilters,\n      setImageParams,\n      setDatasetFilters,\n      currentDatasetID,\n      labels,\n      annotationSets,\n      internalImageObj,\n      internalAnnotations,\n      selectedAnnotationIdentifiers,\n      labelColorMap,\n      currentAnimationSample,\n      topics,\n      enablePCD,\n      jsonViewerShowTypes,\n      displayLabelTags,\n      displayProjection,\n      annotationDisplaySettings,\n      showSequences,\n      dataConnect,\n      enableDepthMap,\n      isInitializingAnimation,\n      handleAddVisualization,\n      handleVisualizationSelected,\n      handleVisualizationContainerDrop,\n      handleLayoutSelected,\n      visualizationLocations,\n      getLocationId,\n      layout,\n      samples,\n      mouse,\n      animationControls,\n    };\n  },\n  data() {\n    return {\n      auzone_logo,\n      showAnnotations: true,\n      annotationToolScale: 1,\n      reviewSettings: null,\n    };\n  },\n  computed: {\n    title() {\n      return this.internalImageObj?.name ? this.internalImageObj.name : '';\n    },\n    zoom() {\n      return roundNumber(this.annotationToolScale * 100, 0);\n    },\n    annotationIdentifierMap() {\n      const annotationIdentifierMap = {};\n      this.internalAnnotations.forEach((anno, i) => {\n        annotationIdentifierMap[anno.id] = anno;\n      });\n      return annotationIdentifierMap;\n    },\n    selectedAnnotationInfo() {\n      if (this.selectedAnnotationIdentifiers.length > 0) {\n        return this.annotationIdentifierMap[this.selectedAnnotationIdentifiers[0]];\n      }\n      return null;\n    },\n    selectedAnnotationsToEdit() {\n      return this.selectedAnnotationIdentifiers.map((identifier) => this.annotationIdentifierMap[identifier]);\n    },\n    colorBy() {\n      return this.annotationDisplaySettings?.colorAnnotationsBy?.type;\n    },\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n    isVideo() {\n      return this.internalImageObj?.type === 'video';\n    },\n    isSequence() {\n      return this.showSequences && Boolean(this.internalImageObj?.sequence_id);\n    },\n    displayImageObj() {\n      if (this.currentAnimationSample) {\n        return this.currentAnimationSample.imageObj;\n      }\n      return this.internalImageObj;\n    },\n    displayAnnotations() {\n      if (this.currentAnimationSample) {\n        return this.filterAnnotations(this.currentAnimationSample?.annotations);\n      }\n      return this.internalAnnotations;\n    },\n    combined() {\n      return {\n        internalImageObj: this.internalImageObj,\n        internalAnnotations: this.internalAnnotations,\n        selectedAnnotationIdentifiers: this.selectedAnnotationIdentifiers,\n        labelColorMap: this.labelColorMap,\n        currentAnimationSample: this.currentAnimationSample,\n        enablePCD: this.enablePCD,\n        jsonViewerShowTypes: this.jsonViewerShowTypes,\n        annotationDisplaySettings: this.annotationDisplaySettings,\n        enableDepthMap: this.enableDepthMap,\n        imagesParams: this.imagesParams,\n        datasetFilters: this.datasetFilters,\n        currentDatasetID: this.currentDatasetID,\n      };\n    },\n    groupedAnnotations() {\n      if (this.currentAnimationSample) {\n        // For animation\n        const groupedData = {};\n        this.topics.forEach((key) => {\n          groupedData[key] = [];\n        });\n        const filteredAnnotations = this.filterAnnotationsBySet(this.currentAnimationSample?.annotations, this.annotationDisplaySettings.displayAnnotationSets.annotation_sets);\n        filteredAnnotations.forEach((item) => {\n          const itemType = item.type;\n          if (!groupedData[itemType]) {\n            groupedData[itemType] = [];\n          }\n          groupedData[itemType].push(item);\n        });\n        return groupedData;\n      } else {\n        // For non-animation\n        if (!this.displayImageObj?.annotations) return {};\n\n        const groupedData = {};\n        const filteredAnnotations = this.filterAnnotationsBySet(this.displayImageObj?.annotations, this.annotationDisplaySettings.displayAnnotationSets.annotation_sets);\n        filteredAnnotations.forEach((item) => {\n          const itemType = item.type;\n          if (!groupedData[itemType]) {\n            groupedData[itemType] = [];\n          }\n          groupedData[itemType].push(item);\n        });\n        return groupedData;\n      }\n    },\n    isLoadingSample() {\n      if (this.currentAnimationSample) {\n        return !this.currentAnimationSample.loaded;\n      } else if (this.isSequence) {\n        return true;\n      }\n      return false;\n    },\n  },\n  watch: {\n    combined: {\n      deep: true,\n      handler() {\n        this.$router.replace({\n          path: this.$route.path,\n          query: {\n            image_id: encodeURI(JSON.stringify(this.displayImageObj?.id)),\n            // image: encodeURI(JSON.stringify(this.internalImageObj)),\n            // selectedAnnotationIdentifiers: encodeURI(JSON.stringify(this.selectedAnnotationIdentifiers)),\n            // labelColorMap: encodeURI(JSON.stringify(this.labelColorMap)),\n            // currentAnimationSample: encodeURI(JSON.stringify(this.currentAnimationSample)),\n            // enablePCD: encodeURI(JSON.stringify(this.enablePCD)),\n            // showTypes: encodeURI(JSON.stringify(this.showTypes)),\n            imagesParams: encodeURI(JSON.stringify(this.imagesParams)),\n            datasetFilters: encodeURI(JSON.stringify(this.datasetFilters)),\n            annotationDisplaySettings: encodeURI(JSON.stringify(this.annotationDisplaySettings)),\n            showSequences: encodeURI(this.showSequences),\n            dataset_id: JSON.stringify(this.currentDatasetID),\n            // enableDepthMap: encodeURI(JSON.stringify(this.enableDepthMap)),\n          },\n        });\n      },\n    },\n    internalImageObj() {\n      this.internalAnnotations = this.filterAnnotations(this.internalImageObj?.annotations);\n    },\n    internalAnnotations: {\n      deep: true,\n      handler(newAnnotations) {\n        this.$emit('update:updatedAnnotations', newAnnotations || []);\n      },\n    },\n    annotationDisplaySettings: {\n      deep: true,\n      handler() {\n        this.internalAnnotations = this.filterAnnotations(this.internalImageObj?.annotations);\n      },\n    },\n    jsonViewerShowTypes: {\n      deep: true,\n      handler() {\n        this.internalAnnotations = this.filterAnnotations(this.internalImageObj?.annotations);\n        if (this.jsonViewerShowTypes.pcd || this.jsonViewerShowTypes['3dbox'] || this.jsonViewerShowTypes['lidar']) {\n          this.enablePCD = true;\n          this.handleAddVisualization(\"3d-canvas\");\n        } else {\n          this.enablePCD = false;\n        }\n        if (this.jsonViewerShowTypes.depthmap) {\n          this.enableDepthMap = true;\n          this.handleAddVisualization(\"depth-map\");\n        } else {\n          this.enableDepthMap = false;\n        }\n      },\n    },\n  },\n  async created() {\n    if (this.$route.query.annotationDisplaySettings) {\n      const settings = JSON.parse(decodeURI(this.$route.query.annotationDisplaySettings));\n      this.annotationDisplaySettings = settings;\n    }\n    if (this.$route.query.showSequences) {\n      this.showSequences = JSON.parse(this.$route.query.showSequences);\n    }\n    if (this.$route.query.annotationDisplaySettings) {\n      const settings = JSON.parse(decodeURI(this.$route.query.annotationDisplaySettings));\n      this.annotationDisplaySettings = settings;\n    }\n    if (this.$route.query.selectedAnnotationIdentifiers) {\n      this.selectedAnnotationIdentifiers = JSON.parse(decodeURI(this.$route.query.selectedAnnotationIdentifiers));\n    }\n    if (this.$route.query.labelColorMap) {\n      this.labelColorMap = JSON.parse(decodeURI(this.$route.query.labelColorMap));\n    }\n    if (this.$route.query.currentAnimationSample) {\n      this.currentAnimationSample = JSON.parse(decodeURI(this.$route.query.currentAnimationSample));\n    }\n    if (this.$route.query.enablePCD) {\n      this.enablePCD = JSON.parse(decodeURI(this.$route.query.enablePCD));\n    }\n    if (this.$route.query.dataset_id) {\n      this.currentDatasetID = JSON.parse(decodeURI(this.$route.query.dataset_id));\n    }\n    if (this.$route.query.imagesParams) {\n      this.setImageParams(JSON.parse(decodeURI(this.$route.query.imagesParams)));\n    }\n    if (this.$route.query.datasetFilters) {\n      this.setDatasetFilters(JSON.parse(decodeURI(this.$route.query.datasetFilters)));\n    }\n  },\n  async mounted() {\n    const datastore = new DatastoreConnect();\n    const params = {\n      id: parseInt(this.$route.query.image_id),\n      get_annotations: true,\n    };\n    const imageResult = await datastore.getImage(params)\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        console.error(error);\n        alert(`Failed to get image\\n${error.message}`);\n      });\n    this.internalImageObj = imageResult;\n    this.refreshAnnotationSets(imageResult.dataset_id);\n    this.refreshLabels(imageResult.dataset_id);\n    this.topics = await this.getTopics();\n  },\n  methods: {\n    async getTopics() {\n      const dataConnect = new DatastoreConnect();\n      const topicsResp = await dataConnect.getDatasetTopics({ dataset_id: this.internalImageObj.dataset_id });\n      if (!topicsResp.result || topicsResp.error) {\n        return null;\n      }\n      return topicsResp.result;\n    },\n    filterAnnotations(annotations) {\n      if (!annotations) {\n        return [];\n      }\n      let filteredAnnotations = JSON.parse(JSON.stringify(annotations));\n      filteredAnnotations = this.filterAnnotationsBySet(filteredAnnotations, this.annotationDisplaySettings.displayAnnotationSets.annotation_sets);\n      return filteredAnnotations;\n    },\n    filterAnnotationsBySet(annotations, sets) {\n      if (sets) {\n        return annotations.filter((anno) => sets.includes(anno.annotation_set_id));\n      }\n      return annotations;\n    },\n    filterAnnotationsByLabelIndexes(annotations, labelIndexes) {\n      if (labelIndexes) {\n        return annotations.filter((anno) => labelIndexes.includes(anno.label_index));\n      }\n      return annotations;\n    },\n    handleAnnotationListItemClicked(annotation, index) {\n      if (this.selectedAnnotationsToEdit.includes(annotation)) {\n        // Remove selected annotation identifier from the array\n        const arrayIndex = this.selectedAnnotationIdentifiers.indexOf(annotation.id);\n        if (arrayIndex > -1) {\n          this.selectedAnnotationIdentifiers.splice(arrayIndex, 1);\n        }\n      } else {\n        this.selectedAnnotationIdentifiers.push(annotation.id);\n      }\n\n      this.$nextTick(() => {\n        this.$refs.imageModal.focus();\n      });\n    },\n    handleLabelListItemClicked(label) {\n      // Nothing for viewer so far\n    },\n    handleEscape() {\n      this.selectedAnnotationIdentifiers = [];\n      this.$nextTick(() => {\n        this.$refs.imageModal.focus();\n      });\n    },\n    handleModalClosed() {\n      this.selectedAnnotationIdentifiers = [];\n      this.$emit('closed');\n    },\n    handleZoomToFit() {\n      this.$refs.annotationCanvas.zoomToFitImage();\n    },\n    handleZoomToSelection() {\n      this.$refs.annotationCanvas.zoomToSelection();\n    },\n    handleZKey() {\n      if (this.selectedAnnotationIdentifiers.length > 0) {\n        this.$refs.annotationCanvas.zoomToSelection();\n      } else {\n        this.$refs.annotationCanvas.zoomToFitImage();\n      }\n    },\n    async refreshAnnotationSets(dataset_id) {\n      this.annotationSets = await this.getAnnotationSetsForDataset(dataset_id);\n    },\n    async refreshLabels(dataset_id) {\n      this.labels = await this.getLabelListForDataset(dataset_id);\n      this.labelColorMap = useAnnotationColorMap({ items: ref(this.labels), key: 'index' });\n    },\n    async getAnnotationSetsForDataset(dataset_id) {\n      const resp = await this.dataConnect.getAnnotationSets({\n        dataset_id,\n        get_num_annotations: true,\n        get_num_images: true,\n        get_labels: true,\n      })\n        .catch((error) => {\n          console.log('Failed to retrieve sets:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async getLabelListForDataset(dataset_id) {\n      const resp = await this.dataConnect.getLabelList({ dataset_id })\n        .catch((error) => {\n          console.log('Failed to retrieve labels:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    handleEditAnnotations(annotationSet) {\n      this.reviewSettings = {\n        reviewSessionMethod: \"review_annotation_editor\",\n        batchSize: 10,\n        samplingMethod: \"random\",\n        reviewSession: null,\n        reviewTask: {\n          id: null,\n          type: \"audit\",\n          created_at: null,\n          source_annotation_set_id: annotationSet.id,\n          dest_annotation_set_id: annotationSet.id,\n          image_id: parseInt(this.$route.query.image_id),\n          dataset_id: annotationSet.dataset_id,\n          name: \"\",\n          description: \"\",\n          permission_type: \"default\",\n          organization_id: 5,\n          remainingCount: null,\n        },\n        initialAuditorType: \"image\",\n      };\n      this.showEditorModal = true;\n    },\n    async handleExitEditor() {\n      // Update image list\n      this.getImages().then((list) => {\n        this.imageList = list;\n      });\n\n      // Update internal image\n      const datastore = new DatastoreConnect();\n      const params = {\n        id: parseInt(this.$route.query.image_id),\n        get_annotations: true,\n      };\n      const imageResult = await datastore.getImage(params)\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error.message);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          console.error(error);\n          alert(`Failed to get updated image\\n${error.message}`);\n        });\n\n      this.showEditorModal = false;\n\n      this.$nextTick(() => {\n        this.internalImageObj = imageResult;\n      });\n      this.reviewSettings = null;\n\n      if (this.isSequence) {\n        this.$refs.animationControls.handleClearCache();\n      }\n    },\n    async updateLabelColor(params, obj) {\n      params.dataset_id = obj.dataset_id;\n      await this.dataConnect.updateLabel(params)\n        .then(async (data) => {\n          if (!data.error) {\n            this.labels = await this.getLabelListForDataset(obj.dataset_id);\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    toggleVisibility(layout) {\n      if (layout === \"depth-map\") {\n        if (!this.jsonViewerShowTypes[\"depthmap\"]) {\n          this.jsonViewerShowTypes[\"depthmap\"] = true;\n        }\n      }\n    },\n    async downloadImage() {\n      const url = `v3/enterprise/image/${this.displayImageObj.id}`;\n      const headers = new Headers({\n        'Authorization': `Bearer ${this.$store.state.user.token}`,\n      });\n\n      try {\n        const response = await fetch(url, { headers });\n        if (!response.ok) {\n          throw new Error('Network response was not ok');\n        }\n        const blob = await response.blob();\n        const blobUrl = window.URL.createObjectURL(blob);\n\n        const link = document.createElement('a');\n        link.href = blobUrl;\n        link.download = this.displayImageObj.name || this.displayImageObj.id || 'download';\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n        window.URL.revokeObjectURL(blobUrl);\n      } catch (error) {\n        console.error('Error downloading the image:', error);\n      }\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\nmain {\n  width: 100%;\n  height: 100%;\n}\n.display {\n  display: flex;\n  flex-direction: row;\n  position: relative;\n  width: 100%;\n  height: 100%;\n  outline: none;\n  overflow: hidden;\n}\n.visualization {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  position: relative;\n  min-width: 0;\n\n  &__displays {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    min-height: 0;\n  }\n\n  &__pane {\n    display: flex;\n    flex-direction: column;\n    position: relative;\n    flex: 1 0 50%;\n    min-width: 0;\n    height: 100%;\n  }\n\n  &__json-raw-pane {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    width: 20%;\n  }\n\n  &__horizontal-divider {\n    outline: solid 2px gray;\n    z-index: 2;\n  }\n\n  &__vertical-divider {\n    outline: solid 2px gray;\n    z-index: 2;\n  }\n}\n\n#annotation-viewer-modal {\n  width: 100%;\n  height: 100%;\n}\n\n.annotation-viewer-modal {\n  width: 100%;\n  height: 100%;\n\n  &__sidebar {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    width: 300px;\n    min-width: 300px;\n    padding: 0;\n    z-index: 2;\n    @include themify() {\n      background: themed('color-white-100');\n    }\n\n    h3 {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      min-height: 40px;\n      padding: 4px 8px;\n      margin: 0;\n      text-align: left;\n      box-shadow: 0px 1px 3px grey;\n      @include themify() {\n        background: themed('color-white-900');\n      }\n    }\n  }\n}\n\n.annotation-tool {\n  display: flex;\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  flex: 1 1 auto;\n  min-height: 0;\n  @include themify() {\n    background: themed('image-background-fill');\n  }\n}\n\n.label-list {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 50%;\n  padding: 8px 0 8px 0;\n  margin: 0;\n  overflow-y: auto;\n  list-style-type: none;\n\n  li {\n    user-select: none;\n    -moz-user-select: none;\n    -khtml-user-select: none;\n    -webkit-user-select: none;\n    -o-user-select: none;\n    flex-direction: row;\n    display: flex;\n    align-items: center;\n    margin-bottom: unset;\n    height: 30px;\n    padding: 4px 8px;\n    font-size: 0.875rem;\n    border: 1px solid transparent;\n\n    button {\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n\n    span {\n      margin-right: auto;\n    }\n\n    &._active {\n      background: rgba(140,140,140,0.2);\n      cursor: pointer;\n\n      @include themify() {\n        border: 1px solid black;\n        border-left: 4px solid themed('color-primary');\n      }\n    }\n  }\n\n  li._hover {\n    &:hover {\n      background: rgba(140,140,140,0.2);\n      cursor: pointer;\n    }\n  }\n\n  &__symbol {\n    width: 16px;\n    height: 16px;\n    margin-right: 8px;\n  }\n\n  &__box-symbol {\n    border: 2px solid;\n  }\n}\n\n.modal-prepend-header {\n  &__logo {\n    width: 100px;\n    height: 36px;\n  }\n}\n\n#no-image {\n  font-size: 1.5rem;\n  font-weight: 600;\n  color: var(--color-primary);\n}\n\n:deep(.v-expansion-panel-text__wrapper) {\n  padding: 8px 12px 16px;\n}\n:deep(.v-expansion-panel-title__overlay) {\n  pointer-events: none;\n}\n\n.v-window {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  height: 100%;\n}\n\n.v-window-item {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  min-height: 0;\n}\n\n.data {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  min-height: 0;\n}\n\n.button-page {\n  background: none;\n  height: 23px;\n  color: var(--body-text-color);\n  padding: 10px 6px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  border-radius: 4px;\n  text-transform: capitalize;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n}\n\n</style>\n","<template>\n  <div\n    class=\"base-sidebar\"\n    :class=\"[`_${placement}`, { _hide: !localShow }]\"\n    :style=\"styles\"\n  >\n    <div v-if=\"title\" class=\"base-sidebar__header\">\n      <IconButton\n        v-if=\"closeable\"\n        class=\"close-sidebar-btn\"\n        :icon=\"'close'\"\n        :width=\"24\"\n        :height=\"24\"\n        :type=\"''\"\n        @click=\"closeSidebar\"\n      />\n      <h2 class=\"mt-0 mb-0\">{{ title }}</h2>\n      <slot name=\"sidebar-header\" />\n    </div>\n    <div class=\"base-sidebar__content\">\n      <div class=\"base-sidebar__content-inner\" :style=\"styles\">\n        <slot />\n      </div>\n    </div>\n    <button\n      v-if=\"collapsible\"\n      class=\"base-sidebar__toggle-btn\"\n      @click=\"localShow = !localShow\"\n    >\n      <SVGIcon\n        :width=\"24\"\n        :height=\"24\"\n        :iconName=\"'chevron_left'\"\n      />\n    </button>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\n\nexport default {\n  name: 'BaseSidebar',\n  components: {\n    SVGIcon,\n    IconButton,\n  },\n  props: {\n    collapsible: {\n      type: Boolean,\n      default: true,\n    },\n    closeable: {\n      type: Boolean,\n      default: false,\n    },\n    placement: {\n      type: String,\n      default: 'left',\n    },\n    width: {\n      type: Number,\n      default: null,\n    },\n    show: {\n      type: Boolean,\n      default: true,\n    },\n    title: {\n      type: String,\n      default: null,\n    },\n  },\n  emits: ['closed', 'update:show'],\n  data() {\n    return {\n      localShow: true,\n    };\n  },\n  computed: {\n    styles() {\n      let width = this.width;\n      if (typeof this.width === 'number') {\n        width = `${width}px`;\n      }\n      return {\n        'minWidth': width,\n        'maxWidth': width,\n      };\n    },\n  },\n  watch: {\n    show(show) {\n      this.localShow = show;\n    },\n  },\n  mounted() {\n    this.localShow = this.show;\n  },\n  methods: {\n    closeSidebar() {\n      this.localShow = false;\n      this.$emit('update:show', false);\n      this.$emit('closed');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n$sidebar-toogle-btn-width: 16px;\n$sidebar-toogle-btn-svg-width: 24px;\n\n.base-sidebar {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  box-shadow: 0 0 3px gray, 0 0 10px gray;\n  z-index: 10;\n  transition: min-width 0.3s ease-in-out, max-width 0.3s ease-in-out;\n  @include themify() {\n    background: themed('sidebar-background');\n  }\n\n  &__header {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    padding: 16px;\n\n    .close-sidebar-btn {\n      margin-right: 16px;\n    }\n\n    h2 {\n      line-height: 1;\n      font-size: 1.25rem;\n      letter-spacing: 0;\n      font-weight: 500;\n    }\n  }\n\n  &__content {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    overflow: hidden;\n  }\n\n  &__content-inner {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    overflow: hidden;\n  }\n\n  &__toggle-btn {\n    position: absolute;\n    top: 40px;\n    left: 100%;\n    width: 10px;\n    height: 50px;\n    padding: 0;\n    background: transparent;\n    z-index: 2;\n    cursor: pointer;\n    @include themify() {\n      color: themed('sidebar-toggle-btn-color');\n      border-bottom: 10px solid transparent;\n      border-left: $sidebar-toogle-btn-width solid themed('sidebar-toggle-btn-bg');\n      border-right: 0 solid transparent;\n      border-top: 10px solid transparent;\n    }\n\n    & svg {\n      position: absolute;\n      top: 0;\n      bottom: 0;\n      left: calc(-#{$sidebar-toogle-btn-width / 2} - #{$sidebar-toogle-btn-svg-width / 2});\n      right: 0;\n      margin: auto;\n      transition: transform 0.1s ease-in-out;\n      pointer-events: none;\n    }\n\n    &.right {\n      top: 40px;\n      left: calc(0% - #{$sidebar-toogle-btn-width});\n      @include themify() {\n        color: themed('sidebar-toggle-btn-color');\n        border-left: 0 solid transparent;\n        border-right: $sidebar-toogle-btn-width solid themed('sidebar-toggle-btn-bg');\n      }\n\n      & svg {\n        left: calc(#{$sidebar-toogle-btn-width / 2} - #{$sidebar-toogle-btn-svg-width / 2});\n        transform: rotate(-180deg);\n      }\n    }\n  }\n\n  &._hide {\n    min-width: 0px !important;\n    max-width: 0px !important;\n\n    & .base-sidebar__toggle-btn svg {\n      transform: rotate(-180deg);\n    }\n  }\n\n  &._right {\n    .base-sidebar__toggle-btn {\n      top: 40px;\n      left: calc(0% - #{$sidebar-toogle-btn-width});\n      @include themify() {\n        color: themed('sidebar-toggle-btn-color');\n        border-left: 0 solid transparent;\n        border-right: $sidebar-toogle-btn-width solid themed('sidebar-toggle-btn-bg');\n      }\n\n      & svg {\n        left: calc(#{$sidebar-toogle-btn-width / 2} - #{$sidebar-toogle-btn-svg-width / 2});\n        transform: rotate(-180deg);\n      }\n    }\n\n    &._hide {\n      & .base-sidebar__toggle-btn svg {\n        transform: rotate(-360deg);\n      }\n    }\n  }\n}\n\n</style>\n","import { render } from \"./BaseSidebar.vue?vue&type=template&id=53048c5f&scoped=true\"\nimport script from \"./BaseSidebar.vue?vue&type=script&lang=js\"\nexport * from \"./BaseSidebar.vue?vue&type=script&lang=js\"\n\nimport \"./BaseSidebar.vue?vue&type=style&index=0&id=53048c5f&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-53048c5f\"]])\n\nexport default __exports__","<template>\n  <div\n    id=\"konva-container\"\n    ref=\"konvaContainer\"\n    class=\"konva-container\"\n    @mouseout=\"handleCanvasMouseout\"\n  >\n    <v-stage\n      ref=\"stage\"\n      :config=\"configKonva\"\n      @wheel=\"handleCanvasZoomScroll\"\n      @pointerclick=\"handleStageClick($event)\"\n      @pointermove=\"debounceHandleMouseover\"\n      @dragstart=\"handleDragStart\"\n      @dragend=\"handleDragEnd\"\n    >\n      <v-layer>\n        <!-- KonvaImage or KonvaVideo component -->\n        <component\n          :is=\"imageComponent\"\n          ref=\"konvaImage\"\n          :imagePath=\"imagePath\"\n          :imageId=\"imageObj.id\"\n          v-bind=\"{\n            ...(imageComponent === 'KonvaVideo' ? {stageReady} : {}),\n            ...(imageComponent === 'KonvaImage' ? {useImageCacheOnly, imageCacheElem, showPointerAxes} : {})\n          }\"\n          @new-coordinates=\"handleMouseCoordinates\"\n          @image-loaded=\"handleImageLoaded\"\n          @pointermove=\"(isSAMToolSelected && samActive && samMaskImg) ? debouncedHandleSAMMousemove(stageNode) : ''\"\n        />\n      </v-layer>\n      <v-layer>\n        <SAMSelectBox\n          v-if=\"stageReady && isSAMToolSelected && samActive && samBoxActive\"\n          ref=\"samSelectBox\"\n          :stageNode=\"stageNode\"\n          :stageScale=\"stageScale\"\n          :imageNode=\"imageNode\"\n          :samBoxActive=\"samBoxActive\"\n          @sam-box-dimensions-changed=\"handleSAMBoxDimensionChanged\"\n        />\n        <SAM2SelectBox\n          v-else-if=\"stageReady && isSAM2ToolSelected && isSAM2BoxMode\"\n          ref=\"samSelectBox\"\n          :stageNode=\"stageNode\"\n          :stageScale=\"stageScale\"\n          :imageNode=\"imageNode\"\n          :imageId=\"imageObj.id\"\n        />\n        <AnnotationBoxTool\n          v-else-if=\"stageReady && isBoxAnnotating\"\n          :stageNode=\"stageNode\"\n          :stageScale=\"stageScale\"\n          :selectedLabel=\"selectedLabel\"\n          :imageDimensions=\"imageDimensions\"\n          :editingEnabled=\"editingEnabled\"\n          :labelColorMap=\"labelColorMap\"\n          @created-annotation-box=\"handleAnnotationBoxCreated\"\n        />\n        <CanvasSelectBox\n          v-else-if=\"stageReady\"\n          ref=\"selectRect\"\n          v-model:selectedObjects=\"selectedObjects\"\n          :stageNode=\"stageNode\"\n          :stageScale=\"stageScale\"\n        />\n\n        <SAM2Boxes\n          v-if=\"sam2Options && isSAM2ToolSelected\"\n          :stageScale=\"stageScale\"\n          :imageId=\"imageObj.id\"\n        />\n        <SAMClickPoint\n          v-if=\"samOptions && isSAMToolSelected && samActive\"\n          :clicks=\"samClicks\"\n          :stageScale=\"stageScale\"\n        />\n        <SAM2ClickPoint\n          v-if=\"sam2Options && isSAM2ToolSelected\"\n          :stageScale=\"stageScale\"\n          :imageId=\"imageObj.id\"\n        />\n      </v-layer>\n\n      <v-layer>\n        <template v-if=\"imageIdDisplayed === imageObj.id\">\n          <template v-if=\"stageReady && showAnnotations && showTypes?.mask\">\n            <KonvaSegmentationMask\n              v-for=\"(anno) in maskAnnotations\"\n              :ref=\"el => { canvasObjects[anno.id] = el }\"\n              :key=\"anno.name\"\n              :imageDimensions=\"imageDimensions\"\n              :annotation=\"anno\"\n              :labels=\"labels\"\n            />\n          </template>\n          <template v-if=\"showAnnotations && showTypes?.seg\">\n            <KonvaSegmentationPolygon\n              v-for=\"(anno, i) in segmentationPolygonAnnotations\"\n              :ref=\"anno.id\"\n              :key=\"i\"\n              v-model:polygon=\"anno.polygon\"\n              :identifier=\"anno.id\"\n              :imageDimensions=\"imageDimensions\"\n              :isSelected=\"selectedObjects.includes(anno.id)\"\n              :isAnnotating=\"isAnnotating\"\n              :pointerCoordinates=\"imagePointerCoordinates\"\n              :fill=\"getAnnotationColor(anno)\"\n              :stageNode=\"stageNode\"\n              :stageScale=\"stageScale\"\n              :imageNode=\"imageNode\"\n              :editingEnabled=\"editingEnabled\"\n              :pending=\"anno?.pending\"\n              @shape-selected=\"handleShapeSelected(anno.id)\"\n              @polygon-drag-end=\"() => {}\"\n            />\n          </template>\n          <template v-if=\"pendingAnnotations?.seg?.length > 0\">\n            <KonvaSegmentationPolygon\n              v-for=\"(anno, i) in pendingAnnotations.seg\"\n              :ref=\"anno.id\"\n              :key=\"i\"\n              v-model:polygon=\"anno.polygon\"\n              :identifier=\"anno.id\"\n              :imageDimensions=\"imageDimensions\"\n              :isSelected=\"selectedObjects.includes(anno.id)\"\n              :isAnnotating=\"isAnnotating\"\n              :pointerCoordinates=\"imagePointerCoordinates\"\n              :fill=\"getAnnotationColor(anno)\"\n              :stageNode=\"stageNode\"\n              :stageScale=\"stageScale\"\n              :imageNode=\"imageNode\"\n              :editingEnabled=\"editingEnabled\"\n              :pending=\"anno?.pending\"\n              :pendingSelected=\"sam2SelectedObject === anno.object_reference\"\n              @shape-selected=\"handleShapeSelected(anno.id)\"\n              @polygon-drag-end=\"() => {}\"\n            />\n          </template>\n          <template v-if=\"stageReady && showAnnotations && showTypes?.box\">\n            <AnnotationBox\n              v-for=\"(anno) in boxAnnotations\"\n              :ref=\"el => { canvasObjects[anno.id] = el }\"\n              :key=\"anno.name\"\n              v-model:x=\"anno.x\"\n              v-model:y=\"anno.y\"\n              v-model:width=\"anno.w\"\n              v-model:height=\"anno.h\"\n              :identifier=\"anno.id\"\n              :imageDimensions=\"imageDimensions\"\n              :stageNode=\"stageNode\"\n              :stageScale=\"stageScale\"\n              :imageNode=\"imageNode\"\n              :displayLabelTag=\"displayLabelTags?.box\"\n              :name=\"getAnnotationName(anno)\"\n              :fillColor=\"''\"\n              :color=\"getAnnotationColor(anno)\"\n              :isSelected=\"selectedObjects.includes(anno.id)\"\n              :isHighlighting=\"highlightedAnnotationIdentifier === anno.id\"\n              :isAnnotating=\"isAnnotating\"\n              :dashEnabled=\"isAuditMode && anno.reviewStatus !== 'verified'\"\n              :editingEnabled=\"editingEnabled\"\n              @shape-selected=\"handleShapeSelected(anno.id)\"\n              @transformed=\"handleAnnotationTransformed\"\n              @box-clicked-while-annotating=\"handleBoxClickWhileAnnotating($event, anno)\"\n              @box-mouseover-while-annotating=\"handleBoxMouseoverWhileAnnotating($event, anno)\"\n              @box-mouseout-while-annotating=\"handleBoxMouseoutWhileAnnotating($event, anno)\"\n            />\n          </template>\n          <template v-if=\"pendingAnnotations?.['2dbox']?.length > 0\">\n            <AnnotationBox\n              v-for=\"(anno) in pendingAnnotations['2dbox']\"\n              :ref=\"el => { canvasObjects[anno.id] = el }\"\n              :key=\"anno.name\"\n              v-model:x=\"anno.x\"\n              v-model:y=\"anno.y\"\n              v-model:width=\"anno.w\"\n              v-model:height=\"anno.h\"\n              :identifier=\"anno.id\"\n              :imageDimensions=\"imageDimensions\"\n              :stageNode=\"stageNode\"\n              :stageScale=\"stageScale\"\n              :imageNode=\"imageNode\"\n              :displayLabelTag=\"displayLabelTags?.box\"\n              :name=\"getAnnotationName(anno)\"\n              :fillColor=\"''\"\n              :color=\"getAnnotationColor(anno)\"\n              :isSelected=\"selectedObjects.includes(anno.id)\"\n              :isHighlighting=\"highlightedAnnotationIdentifier === anno.id\"\n              :isAnnotating=\"isAnnotating\"\n              :dashEnabled=\"isAuditMode && anno.reviewStatus !== 'verified'\"\n              :editingEnabled=\"editingEnabled\"\n              @shape-selected=\"handleShapeSelected(anno.id)\"\n              @transformed=\"handleAnnotationTransformed\"\n              @box-clicked-while-annotating=\"handleBoxClickWhileAnnotating($event, anno)\"\n              @box-mouseover-while-annotating=\"handleBoxMouseoverWhileAnnotating($event, anno)\"\n              @box-mouseout-while-annotating=\"handleBoxMouseoutWhileAnnotating($event, anno)\"\n            />\n          </template>\n          <Project3Dto2D\n            v-if=\"displayProjection && displayProjection['3dbox']\"\n            :boxes3D=\"box3DAnnotations\"\n            :imageDimensions=\"imageDimensions\"\n            :stageScale=\"stageScale\"\n            :labels=\"labels\"\n            :pending3dBoxes=\"pendingAnnotations?.['3dbox']\"\n          />\n          <template v-if=\"displayProjection && displayProjection.lidar\">\n            <ProjectLidarTo2D\n              v-for=\"(lidarProjection, index) in lidarProjections\"\n              :key=\"index\"\n              :imageDimensions=\"imageDimensions\"\n              :stageScale=\"stageScale\"\n              :lidarProjection=\"lidarProjection\"\n            />\n          </template>\n          <template v-if=\"displayProjection && displayProjection.pcd\">\n            <ProjectPCDTo2D\n              v-for=\"(pcdProjection, index) in pcdProjections\"\n              :key=\"index\"\n              :imageDimensions=\"imageDimensions\"\n              :stageScale=\"stageScale\"\n              :pcdProjection=\"pcdProjection\"\n            />\n          </template>\n        </template>\n      </v-layer>\n      <v-layer ref=\"brushLayer\">\n        <v-image\n          v-if=\"stageReady && drawMode === 'sam' && (isSAMToolSelected && samActive && samMaskImg)\"\n          ref=\"samMask\"\n          :config=\"configSAMMaskImg\"\n          @pointermove=\"debouncedHandleSAMMousemove(stageNode)\"\n          @pointerout=\"handleSAMMouseout\"\n          @pointerclick=\"handleSAMMaskClick($event, stageNode)\"\n        />\n        <v-image\n          v-else-if=\"stageReady && isSAM2ToolSelected\"\n          ref=\"sam2Mask\"\n          :config=\"{\n            x: 0,\n            y: 0,\n            image: null,\n            width: imageDimensions.width,\n            height: imageDimensions.height,\n            draggable: false,\n            opacity: 0.5,\n          }\"\n          @pointerclick=\"handleSAM2ImageClick(\n            $event,\n            stageNode.getRelativePointerPosition().x,\n            stageNode.getRelativePointerPosition().y,\n            imageObj.id,\n            frame\n          )\"\n        />\n        <KonvaBrush\n          v-else-if=\"stageReady && (drawMode === 'brush' || drawMode === 'eraser' || drawMode === 'line')\"\n          :stageNode=\"stageNode\"\n          :imageDimensions=\"imageDimensions\"\n          :drawMode=\"drawMode\"\n          :drawCursorSize=\"drawCursorSize\"\n          :fill=\"drawToolColor\"\n          :polygon=\"editingSegmentationPolygonAnnotation?.polygon\"\n          :enableBrush=\"enableBrush\"\n          :doneVertexDraw=\"doneVertexDraw\"\n          :selectedLabel=\"selectedLabel\"\n          :labels=\"labels\"\n          :labelColorMap=\"labelColorMap\"\n          :scale=\"stageScale.x\"\n          @edit-polygon=\"handleBrushEditPolygon\"\n          @new-polygon=\"handleNewBrushPolygon\"\n        />\n      </v-layer>\n      <!-- <v-layer v-if=\"stageReady && (drawMode === 'brush' || drawMode === 'eraser' || drawMode === 'line')\" ref=\"brushLayer\">\n        <KonvaBrush\n          :stageNode=\"stageNode\"\n          :imageDimensions=\"imageDimensions\"\n          :drawMode=\"drawMode\"\n          :drawCursorSize=\"drawCursorSize\"\n          :fill=\"drawToolColor\"\n          :polygon=\"editingSegmentationPolygonAnnotation?.polygon\"\n          :enableBrush=\"enableBrush\"\n          :doneVertexDraw=\"doneVertexDraw\"\n          :selectedLabel=\"selectedLabel\"\n          :labels=\"labels\"\n          :labelColorMap=\"labelColorMap\"\n          :scale=\"stageScale.x\"\n          @edit-polygon=\"handleBrushEditPolygon\"\n          @new-polygon=\"handleNewBrushPolygon\"\n        />\n      </v-layer> -->\n    </v-stage>\n  </div>\n</template>\n\n<script>\nimport { debounce } from '@/assets/js/utils.js';\nimport Konva from 'konva';\nimport {\n  ref, toRefs, onMounted, computed,\n} from 'vue';\nimport { useResizeObserver, useDebounceFn } from '@vueuse/core';\nimport useZoom from '@/composables/canvas/useZoom.js';\nimport useSAMCanvas from '@/composables/canvas/useSAMCanvas.js';\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport useColorParser from '@/composables/useColorParser.js';\n// import useBrushToPolygon from '@/composables/annotationTool/useBrushToPolygon.js';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useSAM2Store } from '@/stores/useSAM2Store.js';\nimport { storeToRefs } from 'pinia';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport KonvaImage from './KonvaImage.vue';\nimport KonvaVideo from './KonvaVideo.vue';\nimport KonvaBrush from './KonvaBrush.vue';\nimport KonvaSegmentationMask from './KonvaSegmentationMask.vue';\nimport KonvaSegmentationPolygon from './KonvaSegmentationPolygon.vue';\nimport AnnotationBox from './AnnotationBox.vue';\nimport SAMClickPoint from './SAMClickPoint.vue';\nimport SAMSelectBox from './SAMSelectBox.vue';\nimport SAM2ClickPoint from './SAM2ClickPoint.vue';\nimport SAM2SelectBox from './SAM2SelectBox.vue';\nimport SAM2Boxes from './SAM2Boxes.vue';\nimport CanvasSelectBox from './CanvasSelectBox.vue';\nimport AnnotationBoxTool from './AnnotationBoxTool.vue';\n\nimport Project3Dto2D from './Project3Dto2D.vue';\nimport ProjectLidarTo2D from './ProjectLidarTo2D.vue';\nimport ProjectPCDTo2D from './ProjectPCDTo2D.vue';\n\nKonva.dragButtons = [0, 1];\n\nexport default {\n  name: \"AnnotationCanvas\",\n  components: {\n    KonvaImage,\n    KonvaVideo,\n    KonvaSegmentationMask,\n    KonvaSegmentationPolygon,\n    CanvasSelectBox,\n    AnnotationBoxTool,\n    AnnotationBox,\n    SAMClickPoint,\n    SAMSelectBox,\n    SAM2ClickPoint,\n    SAM2SelectBox,\n    SAM2Boxes,\n    Project3Dto2D,\n    ProjectLidarTo2D,\n    ProjectPCDTo2D,\n    KonvaBrush,\n  },\n  props: {\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    useImageCacheOnly: {\n      type: Boolean,\n      default: false,\n    },\n    imageCacheElem: {\n      type: HTMLElement,\n      default: null,\n    },\n    annotations: {\n      type: Array,\n      default: () => [],\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    selectedAnnotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    updatedAnnotations: {\n      type: Array,\n      default: () => [],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    selectedLabel: {\n      type: Object,\n      default: null,\n    },\n    scale: {\n      type: Number,\n      default: 1,\n    },\n    selectedAnnotationIdentifiers: {\n      type: Array,\n      default: () => [],\n    },\n    colorBy: {\n      type: String,\n      default: 'label_index',\n    },\n    showAnnotations: {\n      type: Boolean,\n      default: true,\n    },\n    displayLabelTags: {\n      type: Object,\n      default: () => {},\n    },\n    editingEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    enableSAM: {\n      type: Boolean,\n      default: false,\n    },\n    hasSAMImageEmbedding: {\n      type: Boolean,\n      default: false,\n    },\n    hasSAMImageEmbeddingError: {\n      type: Boolean,\n      default: false,\n    },\n    samOptions: {\n      type: Object,\n      default: null,\n    },\n    shouldZoomToFit: {\n      type: Boolean,\n      default: true,\n    },\n    highlightedAnnotationIdentifier: {\n      type: [String, Number],\n      default: null,\n    },\n    isAuditMode: {\n      type: Boolean,\n      default: false,\n    },\n    displayProjection: {\n      type: Object,\n      default: null,\n    },\n    showTypes: {\n      type: Object,\n      default: () => ({\n        box: true,\n        seg: true,\n      }),\n    },\n    selectedLabels: {\n      type: Object,\n      default: null,\n    },\n    drawMode: {\n      type: String,\n      default: 'pointer',\n    },\n    drawCursorSize: {\n      type: Number,\n      default: 0,\n    },\n    doneVertexDraw: {\n      type: Boolean,\n      default: false,\n    },\n    showPointerAxes: {\n      type: Boolean,\n      default: false,\n    },\n    lidarProjections: {\n      type: Array,\n      default: null,\n    },\n    pcdProjections: {\n      type: Array,\n      default: null,\n    },\n    pendingAnnotations: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: [\n    'new-coordinates',\n    'update:detectedObject',\n    'image-loaded',\n    'update:zonePosition',\n    'update:zoneSize',\n    'update:updatedAnnotations',\n    'create-annotation',\n    'update:scale',\n    'update:selectedAnnotationIdentifiers',\n    'update:hasSAMImageEmbedding',\n    'update:hasSAMImageEmbeddingError',\n    'update:samOptions',\n    'update:samMask', 'remove-annotation',\n  ],\n  setup(props, ctx) {\n    const {\n      imageObj, annotations, selectedLabel, enableSAM, samOptions, labels, annotationSets, highlightedAnnotationIdentifier, drawMode,\n    } = toRefs(props);\n    let expose = {};\n\n    // const {\n    //   processImage,\n    // } = useBrushToPolygon();\n\n    // Setup canvas\n    const konvaContainer = ref(null);\n    const imageDimensions = ref(null);\n    const stage = ref(null);\n    const stageNode = ref(null);\n    const stageScale = ref({ x: 1, y: 1 });\n    const configKonva = ref({\n      width: 100,\n      height: 100,\n      draggable: true,\n      dragBoundFunc: null,\n    });\n\n    onMounted(() => {\n      stageNode.value = stage.value.getStage();\n    });\n    const imagePath = computed(() => {\n      if (imageObj.value.id && (imageObj.value.type === 'image' || imageObj.value.type === '')) {\n        return `v3/enterprise/image/${imageObj.value.id}`;\n      } else if (imageObj.value.id && imageObj.value.type === 'video') {\n        return `video/${imageObj.value.id}`;\n      }\n      return null;\n    });\n    const imageComponent = computed(() => {\n      if (imageObj.value.type === 'image') {\n        return 'KonvaImage';\n      } else if (imageObj.value.type === 'video') {\n        return 'KonvaVideo';\n      }\n      return 'KonvaImage';\n    });\n\n    // Setup canvas objects\n    const canvasObjects = ref({});\n    const selectedObjects = ref([]);\n    const selectedNodes = computed(() => Object.entries(canvasObjects.value)\n      .map(([key, val]) => { if ((selectedObjects.value.map((v) => v.toString())).includes(key)) return val.node; })\n      .filter((node) => node));\n\n    // Setup canvas zoom and resize\n    const {\n      zoomToFitImage, zoomToSelection: baseZoomToSelection, zoomToBox: baseZoomToBox, handleCanvasZoomScroll,\n    } = useZoom(konvaContainer, imageDimensions, stageNode, stageScale);\n    function zoomToSelection() {\n      baseZoomToSelection(selectedNodes);\n    }\n    function zoomToBox({\n      x1, x2, y1, y2,\n    }) {\n      baseZoomToBox({\n        x1, x2, y1, y2,\n      });\n    }\n    function handleCanvasResize() {\n      configKonva.value.width = konvaContainer.value.clientWidth;\n      configKonva.value.height = konvaContainer.value.clientHeight;\n      zoomToFitImage();\n    }\n    useResizeObserver(konvaContainer, useDebounceFn(handleCanvasResize, 15));\n    // useResizeObserver(konvaContainer, () => setTimeout(handleCanvasResize, 0));\n    expose = {\n      ...expose,\n      zoomToFitImage,\n      zoomToSelection,\n      zoomToBox,\n    };\n\n    // Setup Annotation Colors\n    const { map: labelColorMap } = useAnnotationColorMap({ items: labels, key: 'index' });\n    const { map: annotationSetColorMap } = useAnnotationColorMap({ items: annotationSets, key: 'id' });\n\n    // Setup SAM\n    let SAM = {\n      isSAMToolSelected: null,\n      samMaskImg: null,\n      samActive: null,\n      samClicks: null,\n      samBox: null,\n      samBoxActive: null,\n      configSAMMaskImg: null,\n      handleSAMMaskClick: null,\n      handleSAMMousemove: null,\n      debouncedHandleSAMMousemove: null,\n      debouncedHandleSAMMouseout: null,\n      handleSAMMouseout: null,\n      handleSAMBoxDimensionChanged: null,\n    };\n    const isSAMToolSelected = computed(() => {\n      if (drawMode.value === 'sam') {\n        return true;\n      }\n      return false;\n    });\n    if (enableSAM.value) {\n      const useSAM = useSAMCanvas(ctx, samOptions, {\n        imageObj, imageDimensions, annotations, selectedLabel, isSAMToolSelected,\n      });\n      useSAM.startSAMCanvas();\n      SAM = { ...useSAM };\n    }\n\n    // Setup SAM2\n    const sam2Store = useSAM2Store();\n    const { handleSAM2ImageClick } = sam2Store;\n    const {\n      sam2Options,\n      selectedObject: sam2SelectedObject,\n      isSAM2ClickMode,\n      isSAM2BoxMode,\n    } = storeToRefs(sam2Store);\n    const isSAM2ToolSelected = computed(() => {\n      if (drawMode.value === 'sam2') {\n        return true;\n      }\n      return false;\n    });\n    const visualizationStore = useViewerVisualizationsStore();\n    const {\n      frame,\n    } = storeToRefs(visualizationStore);\n\n    const {\n      parseColor,\n    } = useColorParser();\n\n    ctx.expose(expose);\n    return {\n      konvaContainer,\n      stage,\n      imageDimensions,\n      stageNode,\n      stageScale,\n      configKonva,\n      imagePath,\n      imageComponent,\n      canvasObjects,\n      selectedObjects,\n      selectedNodes,\n      zoomToFitImage,\n      zoomToSelection,\n      zoomToBox,\n      handleCanvasZoomScroll,\n      handleCanvasResize,\n      labelColorMap,\n      annotationSetColorMap,\n      samMaskImg: SAM.samMaskImg,\n      samActive: SAM.samActive,\n      samClicks: SAM.samClicks,\n      samBox: SAM.samBox,\n      samBoxActive: SAM.samBoxActive,\n      isSAMAnnotating: SAM.isAnnotating,\n      configSAMMaskImg: SAM.configSAMMaskImg,\n      handleSAMMaskClick: SAM.handleSAMMaskClick,\n      handleSAMMousemove: SAM.handleSAMMousemove,\n      debouncedHandleSAMMousemove: SAM.debouncedHandleSAMMousemove,\n      debouncedHandleSAMMouseout: SAM.debouncedHandleSAMMouseout,\n      handleSAMMouseout: SAM.handleSAMMouseout,\n      handleSAMBoxDimensionChanged: SAM.handleSAMBoxDimensionChanged,\n      isSAMToolSelected,\n      // processImage,\n      parseColor,\n      sam2Options,\n      sam2SelectedObject,\n      isSAM2ClickMode,\n      isSAM2BoxMode,\n      handleSAM2ImageClick,\n      isSAM2ToolSelected,\n      frame,\n    };\n  },\n  data() {\n    return {\n      isSelectionMousedown: false,\n      isSelectionDragging: false,\n      isStageDragging: false,\n      isAnnotationBoxMousedown: false,\n      isAnnotationBoxDragging: false,\n      imageNode: null,\n      imagePointerCoordinates: null,\n      internalAnnotations: [],\n      mouseoverObjectWhileAnnotating: null,\n      imageIdDisplayed: null,\n    };\n  },\n  computed: {\n    debounceHandleMouseover() {\n      return debounce(() => { this.handleMouseover(); }, 2);\n    },\n    dragBoundFunc() {\n      const dragBoundFunc = (pos) => {\n        const maxX = this.configKonva.width - 20;\n        const minX = -(this.imageDimensions.width * this.stageScale.x) + 20;\n        const maxY = this.configKonva.height - 20;\n        const minY = -(this.imageDimensions.height * this.stageScale.y) + 20;\n        const x = Math.max(minX, Math.min(pos.x, maxX));\n        const y = Math.max(minY, Math.min(pos.y, maxY));\n        return {\n          x,\n          y,\n        };\n      };\n      return dragBoundFunc;\n    },\n    stageReady() {\n      return Boolean(this.stageNode && this.imageNode && this.imageDimensions && this.stageScale);\n    },\n    isBox() {\n      if (this.drawMode === 'box') {\n        return true;\n      }\n      return false;\n    },\n    isBoxAnnotating() {\n      if (this.isBox && this.selectedLabel) {\n        return true;\n      }\n      return false;\n    },\n    isAnnotating() {\n      if (this.isBoxAnnotating || this.isSAMAnnotating) {\n        return true;\n      }\n      return false;\n    },\n    isColoring() {\n      if (this.drawMode === 'color') {\n        return true;\n      }\n      return false;\n    },\n    annotationIdentifierMap() {\n      const annotationIdentifierMap = {};\n      this.internalAnnotations.forEach((anno, i) => {\n        annotationIdentifierMap[anno.id] = anno;\n      });\n      return annotationIdentifierMap;\n    },\n    boxAnnotations() {\n      return this.internalAnnotations.filter((anno) => {\n        const isLabelSelected = !this.selectedLabels || this.selectedLabels?.includes(anno.label_index);\n        const isAnnotationSetSelected = !this.selectedAnnotationSets || this.selectedAnnotationSets?.includes(anno.annotation_set_id);\n        return (anno.type === \"box\" || anno.type === \"\") && isLabelSelected && (isAnnotationSetSelected || this.isAuditMode);\n      });\n    },\n    editingBoxAnnotation() {\n      if (this.selectedObjects.length === 1) {\n        return this.internalAnnotations.find((anno) => anno.type === \"box\" && this.selectedLabels?.includes(anno.label_index) && this.selectedObjects[0] === anno.id);\n      } else {\n        return null;\n      }\n    },\n    box3DAnnotations() {\n      return this.internalAnnotations.filter((anno) => {\n        const isLabelSelected = !this.selectedLabels || this.selectedLabels?.includes(anno.label_index);\n        const isAnnotationSetSelected = !this.selectedAnnotationSets || this.selectedAnnotationSets?.includes(anno.annotation_set_id);\n        return anno.type === \"3dbox\" && isLabelSelected && (isAnnotationSetSelected || this.isAuditMode);\n      });\n    },\n    segmentationPolygonAnnotations() {\n      return this.internalAnnotations.filter((anno) => {\n        const isLabelSelected = !this.selectedLabels || this.selectedLabels?.includes(anno.label_index);\n        const isAnnotationSetSelected = !this.selectedAnnotationSets || this.selectedAnnotationSets?.includes(anno.annotation_set_id);\n        return anno.type === \"seg\" && isLabelSelected && (isAnnotationSetSelected || this.isAuditMode);\n      });\n    },\n    editingSegmentationPolygonAnnotation() {\n      if (this.selectedObjects.length === 1) {\n        return this.internalAnnotations.find((anno) => anno.type === \"seg\" && (!this.selectedLabels || this.selectedLabels?.includes(anno.label_index)) && this.selectedObjects[0] === anno.id);\n      } else {\n        return null;\n      }\n    },\n    maskAnnotations() {\n      return this.internalAnnotations.filter((anno) => anno.type === \"mask\");\n    },\n    labelIndexMap() {\n      return this.labels.reduce((acc, item) => {\n        acc[item.index] = item;\n        return acc;\n      }, {});\n    },\n    drawToolColor() {\n      if (this.selectedObjects.length === 1 && this.segmentationPolygonAnnotations.length > 0) {\n        const ann = this.segmentationPolygonAnnotations.find((e) => e.id === this.selectedObjects[0]);\n        if (ann) {\n          return this.getAnnotationColor(ann);\n        }\n      }\n      return null;\n    },\n    enableBrush() {\n      return !this.editingBoxAnnotation && (this.selectedAnnotationIdentifiers.length === 0\n      || this.editingSegmentationPolygonAnnotation !== undefined || this.editingSegmentationPolygonAnnotation !== null);\n    },\n  },\n  watch: {\n    dragBoundFunc: {\n      immediate: true,\n      handler(newFunc) {\n        this.configKonva.dragBoundFunc = newFunc;\n      },\n    },\n    annotations: {\n      deep: true,\n      handler(updatedAnnotations) {\n        this.internalAnnotations = JSON.parse(JSON.stringify(updatedAnnotations));\n      },\n    },\n    stageScale() {\n      this.$emit('update:scale', this.stageScale.x);\n    },\n    selectedAnnotationIdentifiers: {\n      deep: true,\n      handler(selectedAnnotationIdentifiers) {\n        this.selectedObjects = selectedAnnotationIdentifiers;\n      },\n    },\n    selectedObjects() {\n      this.$emit('update:selectedAnnotationIdentifiers', this.selectedObjects);\n    },\n    isAnnotating() {\n      if (this.isAnnotating) {\n        this.stageNode.container().style.cursor = 'crosshair';\n      }\n    },\n  },\n  mounted() {\n    this.imageNode = this.$refs.konvaImage.getImageNode();\n    this.internalAnnotations = JSON.parse(JSON.stringify(this.annotations));\n  },\n  methods: {\n    async handleImageLoaded(imageInfo) {\n      this.imageDimensions = { width: imageInfo.width, height: imageInfo.height };\n      this.imageIdDisplayed = imageInfo.imageId;\n      await this.$nextTick();\n      this.stageNode.scale(\n        { x: 1, y: 1 },\n      );\n      if (this.shouldZoomToFit) { await this.$nextTick(this.zoomToFitImage); }\n      this.$emit('image-loaded', imageInfo);\n    },\n    handleStageClick(e) {\n      if (!this.isSelectionDragging && !this.isStageDragging) {\n        this.selectedObjects = [];\n      }\n    },\n    handleMouseCoordinates(mouse) {\n      this.imagePointerCoordinates = this.imageNode.getRelativePointerPosition();\n      this.$emit('new-coordinates', mouse);\n    },\n    handleShapeSelected(identifier) {\n      if (this.isColoring) {\n        const index = this.internalAnnotations.map((e) => e.id).indexOf(identifier);\n        this.internalAnnotations[index].label_index = this.selectedLabel.index;\n        this.internalAnnotations[index].label_id = this.selectedLabel.id;\n        this.internalAnnotations[index].label_name = this.selectedLabel.name;\n        this.handleAnnotationTransformed();\n\n        return;\n      }\n      if (!this.isSelectionDragging) {\n        this.selectedObjects = [];\n        this.selectedObjects.push(identifier);\n      }\n    },\n    handleMouseover() {\n      // Tell image to get new pointer position now that it has been registered\n      this.$refs.konvaImage?.handleImagePointerMove();\n    },\n    handleDragStart() {\n      this.isStageDragging = true;\n      this.stageNode.container().style.cursor = \"all-scroll\";\n    },\n    handleDragEnd() {\n      this.isStageDragging = false;\n      this.stageNode.container().style.cursor = null;\n    },\n    handleAnnotationTransformed() {\n      this.$emit('update:updatedAnnotations', JSON.parse(JSON.stringify(this.internalAnnotations)));\n    },\n    getAnnotationColor(annotation) {\n      if (this.colorBy === 'set') {\n        return this.annotationSetColorMap[annotation.annotation_set_id];\n      } else {\n        const targetLabel = this.labels.find((e) => e.id === annotation.label_id);\n\n        if (targetLabel && targetLabel.color) {\n          return this.parseColor(targetLabel.color);\n        } else {\n          return this.labelColorMap[annotation.label_index];\n        }\n      }\n    },\n    handleBoxClickWhileAnnotating(e, annotation) {\n      if (this.mouseoverObjectWhileAnnotating) {\n        annotation.label_index = this.selectedLabel.index;\n        this.$emit('update:updatedAnnotations', JSON.parse(JSON.stringify(this.internalAnnotations)));\n      }\n    },\n    handleBoxMouseoverWhileAnnotating(e, annotation) {\n      this.mouseoverObjectWhileAnnotating = annotation;\n    },\n    handleBoxMouseoutWhileAnnotating(e, annotation) {\n      this.mouseoverObjectWhileAnnotating = null;\n    },\n    handleAnnotationBoxCreated(newAnnotationBox) {\n      newAnnotationBox.image_id = this.imageObj.id;\n      this.$emit('create-annotation', newAnnotationBox);\n    },\n    getAnnotationName(anno) {\n      if (this.labelIndexMap[anno.label_index]?.name) {\n        return this.labelIndexMap[anno.label_index]?.name;\n      }\n      return anno.label_index;\n    },\n    handleBrushEditPolygon(polygon) {\n      const index = this.internalAnnotations.map((e) => e.id).indexOf(this.editingSegmentationPolygonAnnotation.id);\n      if (!polygon || polygon.length === 0) {\n        this.$emit('remove-annotation', this.internalAnnotations[index].id);\n        return;\n      }\n      this.internalAnnotations[index].polygon = JSON.stringify(polygon);\n      this.handleAnnotationTransformed();\n    },\n    handleNewBrushPolygon(polygon) {\n      const newAnnotationPolygon = {\n        id: uuidv4(),\n        label_index: this.selectedLabel.index,\n        label_id: this.selectedLabel.id,\n        label_name: this.selectedLabel.name,\n        type: \"seg\",\n        polygon: JSON.stringify(polygon),\n        score: 1,\n        image_id: this.imageObj.id,\n      };\n      this.selectedObjects = [newAnnotationPolygon.id];\n      this.$emit('create-annotation', newAnnotationPolygon);\n    },\n    // handleSegmentationTransformed() {\n    //   const canvas = this.$refs.brushLayer.getNode().getCanvas();\n    //   const processed = this.processImage(\n    //     canvas,\n    //     0,\n    //     0,\n    //     0,\n    //     0,\n    //     this.editingSegmentationPolygonAnnotation.polygon,\n    //     'brush',\n    //   );\n    //   const index = this.internalAnnotations.map((e) => e.id).indexOf(this.editingSegmentationPolygonAnnotation.id);\n    //   this.internalAnnotations[index].polygon = JSON.stringify(processed);\n    //   this.handleAnnotationTransformed();\n    // },\n    startPointDrawing() {\n\n    },\n    handleCanvasMouseout() {\n      if (this.stageReady && (this.isSAMToolSelected && this.samActive && this.samMaskImg)) {\n        this.debouncedHandleSAMMouseout();\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.konva-container {\n  width: 100%;\n  height: 100%;\n  z-index: 2;\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100' %3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%239C92AC' fill-opacity='0.125'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\n  background-repeat: repeat;\n  background-color: var(--canvas-background);\n\n  &._isAnnotating {\n    cursor: crosshair;\n  }\n\n}\n</style>\n","export default function useZoom(konvaContainer, imageDimensions, stageNode, stageScale) {\n  function calculateZoomToFitScale(konvaContainerRect) {\n    // Determine aspect ratios of container and image\n    const { stageAspectRatio, imageAspectRatio } = getAspectRatios(konvaContainerRect);\n\n    let scale = 1;\n    if (stageAspectRatio < imageAspectRatio) {\n      scale = konvaContainerRect.width / imageDimensions.value.width;\n    } else {\n      scale = konvaContainerRect.height / imageDimensions.value.height;\n    }\n    return scale;\n  }\n\n  function getAspectRatios(konvaContainerRect) {\n    const stageAspectRatio = konvaContainerRect.width / konvaContainerRect.height;\n    const imageAspectRatio = imageDimensions.value.width / imageDimensions.value.height;\n    return { stageAspectRatio, imageAspectRatio };\n  }\n\n  function zoomToFitImage() {\n    if (!imageDimensions.value) return;\n\n    const konvaContainerRect = konvaContainer.value.getBoundingClientRect();\n\n    // Determine aspect ratios of container and image\n    const stageAspectRatio = konvaContainerRect.width / konvaContainerRect.height;\n    const imageAspectRatio = imageDimensions.value.width / imageDimensions.value.height;\n\n    // Determine stage scale that will fit image\n    let scale = 1;\n    if (stageAspectRatio < imageAspectRatio) {\n      scale = konvaContainerRect.width / imageDimensions.value.width;\n    } else {\n      scale = konvaContainerRect.height / imageDimensions.value.height;\n    }\n    stageNode.value.scale(\n      { x: scale, y: scale },\n    );\n\n    // Postition the image to the center\n    stageNode.value.position(\n      { x: ((konvaContainerRect.width - (imageDimensions.value.width * scale)) / 2), y: ((konvaContainerRect.height - (imageDimensions.value.height * scale)) / 2) },\n    );\n\n    stageScale.value = { x: stageNode.value.scaleX(), y: stageNode.value.scaleY() };\n  }\n\n  function handleCanvasZoomScroll(e) {\n    if (!e.evt) {\n      return;\n    }\n    const scaleBy = 1.25;\n    const stage = e.currentTarget;\n    const oldScale = stage.scaleX();\n    const pointer = stage.getPointerPosition();\n\n    const mousePointTo = {\n      x: (pointer.x - stage.x()) / oldScale,\n      y: (pointer.y - stage.y()) / oldScale,\n    };\n\n    // how to scale? Zoom in? Or zoom out?\n    let direction = e.evt.deltaY > 0 ? -1 : 1;\n\n    // when we zoom on trackpad, e.evt.ctrlKey is true\n    // in that case lets revert direction\n    if (e.evt.ctrlKey) {\n      direction = -direction;\n    }\n\n    const newScale = direction > 0 ? oldScale * scaleBy : oldScale / scaleBy;\n\n    stage.scale({ x: newScale, y: newScale });\n\n    const newPos = {\n      x: pointer.x - mousePointTo.x * newScale,\n      y: pointer.y - mousePointTo.y * newScale,\n    };\n    stage.position(newPos);\n\n    stageScale.value = { x: stageNode.value.scaleX(), y: stageNode.value.scaleY() };\n  }\n\n  function zoomToSelection(selectedNodes) {\n    const konvaContainerRect = konvaContainer.value.getBoundingClientRect();\n\n    // Determine the selection bounds\n    let minX = imageDimensions.value.width; let maxX = 0; let minY = imageDimensions.value.height; let maxY = 0;\n    selectedNodes.value.forEach((node) => {\n      const nodeMinX = node.getAttrs().x;\n      const nodeMaxX = (node.getAttrs().x + node.getAttrs().width);\n      const nodeMinY = node.getAttrs().y;\n      const nodeMaxY = (node.getAttrs().y + node.getAttrs().height);\n      if (nodeMinX < minX) {\n        minX = nodeMinX;\n      }\n      if (nodeMaxX > maxX) {\n        maxX = nodeMaxX;\n      }\n      if (nodeMinY < minY) {\n        minY = nodeMinY;\n      }\n      if (nodeMaxY > maxY) {\n        maxY = nodeMaxY;\n      }\n    });\n\n    // Determine aspect ratios of container and image\n    const stageAspectRatio = konvaContainerRect.width / konvaContainerRect.height;\n    const imageAspectRatio = (maxX - minX) / (maxY - minY);\n\n    // Determine stage scale that will fit image\n    let scale = 1;\n    const padding = 1.2;\n    if (stageAspectRatio < imageAspectRatio) {\n      scale = konvaContainerRect.width / ((maxX - minX) * padding);\n    } else {\n      scale = konvaContainerRect.height / ((maxY - minY) * padding);\n    }\n    stageNode.value.scale(\n      { x: scale, y: scale },\n    );\n\n    // Postition the image to the center\n    minX = imageDimensions.value.width; maxX = 0; minY = imageDimensions.value.height; maxY = 0;\n    selectedNodes.value.forEach((node) => {\n      const nodeMinX = node.getAttrs().x;\n      const nodeMaxX = (node.getAttrs().x + node.getAttrs().width);\n      const nodeMinY = node.getAttrs().y;\n      const nodeMaxY = (node.getAttrs().y + node.getAttrs().height);\n      if (nodeMinX < minX) {\n        minX = nodeMinX;\n      }\n      if (nodeMaxX > maxX) {\n        maxX = nodeMaxX;\n      }\n      if (nodeMinY < minY) {\n        minY = nodeMinY;\n      }\n      if (nodeMaxY > maxY) {\n        maxY = nodeMaxY;\n      }\n    });\n    const xPos = -(minX * stageNode.value.scaleX());\n    const xOffset = ((konvaContainerRect.width - ((maxX - minX) * stageNode.value.scaleX())) / 2);\n    const yPos = -(minY * stageNode.value.scaleY());\n    const yOffset = ((konvaContainerRect.height - ((maxY - minY) * stageNode.value.scaleY())) / 2);\n    stageNode.value.position(\n      {\n        x: xPos + xOffset,\n        y: yPos + yOffset,\n      },\n    );\n\n    stageScale.value = { x: stageNode.value.scaleX(), y: stageNode.value.scaleY() };\n  }\n\n  function zoomToBox({\n    x1, x2, y1, y2,\n  }) {\n    const minX = x1 * imageDimensions.value.width;\n    const maxX = x2 * imageDimensions.value.width;\n    const minY = y1 * imageDimensions.value.height;\n    const maxY = y2 * imageDimensions.value.height;\n    const konvaContainerRect = konvaContainer.value.getBoundingClientRect();\n\n    // Determine the selection bounds\n    // let minX = imageDimensions.value.width; let maxX = 0; let minY = imageDimensions.value.height; let maxY = 0;\n    // nodes.value.forEach((node) => {\n    //   const nodeMinX = node.getAttrs().x;\n    //   const nodeMaxX = (node.getAttrs().x + node.getAttrs().width);\n    //   const nodeMinY = node.getAttrs().y;\n    //   const nodeMaxY = (node.getAttrs().y + node.getAttrs().height);\n    //   if (nodeMinX < minX) {\n    //     minX = nodeMinX;\n    //   }\n    //   if (nodeMaxX > maxX) {\n    //     maxX = nodeMaxX;\n    //   }\n    //   if (nodeMinY < minY) {\n    //     minY = nodeMinY;\n    //   }\n    //   if (nodeMaxY > maxY) {\n    //     maxY = nodeMaxY;\n    //   }\n    // });\n\n    // Determine aspect ratios of container and image\n    const stageAspectRatio = konvaContainerRect.width / konvaContainerRect.height;\n    const imageAspectRatio = (maxX - minX) / (maxY - minY);\n\n    // Determine zoom to fit scale\n    const zoomToFitScale = calculateZoomToFitScale(konvaContainerRect);\n\n    // Determine stage scale that will fit image\n    let scale = 1;\n    const padding = 3;\n    if (stageAspectRatio < imageAspectRatio) {\n      scale = konvaContainerRect.width / ((maxX - minX) * padding);\n    } else {\n      scale = konvaContainerRect.height / ((maxY - minY) * padding);\n    }\n\n    if (scale < zoomToFitScale) {\n      scale = zoomToFitScale;\n    }\n\n    stageNode.value.scale(\n      { x: scale, y: scale },\n    );\n\n    // Postition the image to the center\n    // minX = imageDimensions.value.width; maxX = 0; minY = imageDimensions.value.height; maxY = 0;\n    // nodes.value.forEach((node) => {\n    //   const nodeMinX = node.getAttrs().x;\n    //   const nodeMaxX = (node.getAttrs().x + node.getAttrs().width);\n    //   const nodeMinY = node.getAttrs().y;\n    //   const nodeMaxY = (node.getAttrs().y + node.getAttrs().height);\n    //   if (nodeMinX < minX) {\n    //     minX = nodeMinX;\n    //   }\n    //   if (nodeMaxX > maxX) {\n    //     maxX = nodeMaxX;\n    //   }\n    //   if (nodeMinY < minY) {\n    //     minY = nodeMinY;\n    //   }\n    //   if (nodeMaxY > maxY) {\n    //     maxY = nodeMaxY;\n    //   }\n    // });\n    const xPos = -(minX * stageNode.value.scaleX());\n    const xOffset = ((konvaContainerRect.width - ((maxX - minX) * stageNode.value.scaleX())) / 2);\n    const yPos = -(minY * stageNode.value.scaleY());\n    const yOffset = ((konvaContainerRect.height - ((maxY - minY) * stageNode.value.scaleY())) / 2);\n    stageNode.value.position(\n      {\n        x: xPos + xOffset,\n        y: yPos + yOffset,\n      },\n    );\n\n    stageScale.value = { x: stageNode.value.scaleX(), y: stageNode.value.scaleY() };\n  }\n\n  return {\n    zoomToFitImage, zoomToSelection, zoomToBox, handleCanvasZoomScroll,\n  };\n}\n","// Copyright (c) Meta Platforms, Inc. and affiliates.\n// All rights reserved.\n\n// This source code is licensed under the license found in the\n// LICENSE file in the root directory of this source tree.\n\nimport { Tensor } from \"onnxruntime-web\";\n\nconst modelData = ({ clicks, tensor, modelScale }) => {\n  const imageEmbedding = tensor;\n  let pointCoords;\n  let pointLabels;\n  let pointCoordsTensor;\n  let pointLabelsTensor;\n\n  // Check there are input click prompts\n  if (clicks) {\n    const n = clicks.length;\n\n    // If there is no box input, a single padding point with\n    // label -1 and coordinates (0.0, 0.0) should be concatenated\n    // so initialize the array to support (n + 1) points.\n    if (!clicks.find((click) => click.clickType === 2 || click.clickType === 3)) {\n      // Add in the extra point/label when only clicks and no box\n      pointCoords = new Float32Array(2 * (n + 1));\n      pointLabels = new Float32Array(n + 1);\n    } else {\n      pointCoords = new Float32Array(2 * (n));\n      pointLabels = new Float32Array(n);\n    }\n\n    // Add clicks and scale to what SAM expects\n    for (let i = 0; i < n; i++) {\n      pointCoords[2 * i] = clicks[i].x * modelScale.samScale;\n      pointCoords[2 * i + 1] = clicks[i].y * modelScale.samScale;\n      pointLabels[i] = clicks[i].clickType;\n    }\n\n    // Add in the extra point/label when only clicks and no box\n    // The extra point is at (0, 0) with label -1\n    // pointCoords[2 * n] = 0.0;\n    // pointCoords[2 * n + 1] = 0.0;\n    // pointLabels[n] = -1.0;\n\n    // // Create the tensor\n    // pointCoordsTensor = new Tensor(\"float32\", pointCoords, [1, n, 2]);\n    // pointLabelsTensor = new Tensor(\"float32\", pointLabels, [1, n]);\n  }\n\n  if (!clicks.find((click) => click.clickType === 2 || click.clickType === 3)) {\n    // Add in the extra point/label when only clicks and no box\n    const n = clicks.length;\n    pointCoords[2 * n] = 0.0;\n    pointCoords[2 * n + 1] = 0.0;\n    pointLabels[n] = -1.0;\n    // Create the tensor\n    pointCoordsTensor = new Tensor(\"float32\", pointCoords, [1, n + 1, 2]);\n    pointLabelsTensor = new Tensor(\"float32\", pointLabels, [1, n + 1]);\n  } else {\n    const n = clicks.length;\n    // Create the tensor\n    pointCoordsTensor = new Tensor(\"float32\", pointCoords, [1, n, 2]);\n    pointLabelsTensor = new Tensor(\"float32\", pointLabels, [1, n]);\n  }\n\n  const imageSizeTensor = new Tensor(\"float32\", [\n    modelScale.height,\n    modelScale.width,\n  ]);\n\n  if (pointCoordsTensor === undefined || pointLabelsTensor === undefined) { return; }\n\n  // There is no previous mask, so default to an empty tensor\n  const maskInput = new Tensor(\n    \"float32\",\n    new Float32Array(256 * 256),\n    [1, 1, 256, 256],\n  );\n  // There is no previous mask, so default to 0\n  const hasMaskInput = new Tensor(\"float32\", [0]);\n\n  return {\n    image_embeddings: imageEmbedding,\n    point_coords: pointCoordsTensor,\n    point_labels: pointLabelsTensor,\n    orig_im_size: imageSizeTensor,\n    mask_input: maskInput,\n    has_mask_input: hasMaskInput,\n  };\n};\n\n// const modelData = ({\n//   clicks,\n//   tensor,\n//   modelScale,\n//   point_coords,\n//   point_labels,\n//   last_pred_mask,\n// }) => {\n//   const lowResTensor = tensor;\n//   let pointCoords;\n//   let pointLabels;\n//   let pointCoordsTensor;\n//   let pointLabelsTensor;\n//   // point_coords, point_labels params below are only truthy in text model\n//   // if (point_coords && point_labels) {\n//   //   pointCoords = new Float32Array(4);\n//   //   pointLabels = new Float32Array(2);\n//   //   pointCoords[0] = point_coords[0][0];\n//   //   pointCoords[1] = point_coords[0][1];\n//   //   pointLabels[0] = point_labels[0]; // UPPER_LEFT\n//   //   pointCoords[2] = point_coords[1][0];\n//   //   pointCoords[3] = point_coords[1][1];\n//   //   pointLabels[1] = point_labels[1]; // BOTTOM_RIGHT\n//   //   pointCoordsTensor = new Tensor(\"float32\", pointCoords, [1, 2, 2]);\n//   //   pointLabelsTensor = new Tensor(\"float32\", pointLabels, [1, 2]);\n//   // }\n//   // point click model check\n//   if (clicks) {\n//     let n = clicks.length;\n//     const clicksFromBox = clicks[0].clickType === 2 ? 2 : 0;\n\n//     // For click only input (no box) need to add an extra\n//     // negative point and label\n//     pointCoords = new Float32Array(2 * (n + 1));\n//     pointLabels = new Float32Array(n + 1);\n\n//     // Check if there is a box input\n//     // if (clicksFromBox) {\n//     //   // For box model need to include the box clicks in the point\n//     //   // coordinates and also don't need to include the extra\n//     //   // negative point\n//     //   pointCoords = new Float32Array(2 * (n + clicksFromBox));\n//     //   pointLabels = new Float32Array(n + clicksFromBox);\n//     //   const {\n//     //     upperLeft,\n//     //     bottomRight,\n//     //   } = getPointsFromBox(clicks[0])!;\n//     //   pointCoords = new Float32Array(2 * (n + clicksFromBox));\n//     //   pointLabels = new Float32Array(n + clicksFromBox);\n//     //   pointCoords[0] = upperLeft.x / modelScale.onnxScale;\n//     //   pointCoords[1] = upperLeft.y / modelScale.onnxScale;\n//     //   pointLabels[0] = 2.0; // UPPER_LEFT\n//     //   pointCoords[2] = bottomRight.x / modelScale.onnxScale;\n//     //   pointCoords[3] = bottomRight.y / modelScale.onnxScale;\n//     //   pointLabels[1] = 3.0; // BOTTOM_RIGHT\n\n//     //   last_pred_mask = null;\n//     // }\n\n//     // Add regular clicks\n//     for (let i = 0; i < n; i++) {\n//       pointCoords[2 * (i + clicksFromBox)] = clicks[i].x * modelScale.uploadScale;\n//       pointCoords[2 * (i + clicksFromBox) + 1] = clicks[i].y * modelScale.uploadScale;\n//       pointLabels[i + clicksFromBox] = clicks[i].clickType;\n//     }\n\n//     // Add in the extra point/label when only clicks and no box\n//     // The extra point is at (0, 0) with label -1\n//     if (!clicksFromBox) {\n//       pointCoords[2 * n] = 0.0;\n//       pointCoords[2 * n + 1] = 0.0;\n//       pointLabels[n] = -1.0;\n//       // update n for creating the tensor\n//       n += 1;\n//     }\n\n//     // Create the tensor\n//     pointCoordsTensor = new Tensor(\"float32\", pointCoords, [\n//       1,\n//       n + clicksFromBox,\n//       2,\n//     ]);\n//     pointLabelsTensor = new Tensor(\"float32\", pointLabels, [\n//       1,\n//       n + clicksFromBox,\n//     ]);\n//   }\n//   const imageSizeTensor = new Tensor(\"float32\", [\n//     modelScale.maskHeight,\n//     modelScale.maskWidth,\n//   ]);\n//   if (pointCoordsTensor === undefined || pointLabelsTensor === undefined) { return; }\n\n//   // if there is a previous tensor, use it, otherwise we default to an empty tensor\n//   const lastPredMaskTensor = last_pred_mask && clicks && !isFirstClick(clicks)\n//     ? last_pred_mask\n//     : new Tensor(\"float32\", new Float32Array(256 * 256), [1, 1, 256, 256]);\n\n//   // +!! is javascript shorthand to convert truthy value to 1, falsey value to 0\n//   const hasLastPredTensor = new Tensor(\"float32\", [\n//     +!!(last_pred_mask && clicks && !isFirstClick(clicks)),\n//   ]);\n\n//   return {\n//     image_embeddings: lowResTensor,\n//     point_coords: pointCoordsTensor,\n//     point_labels: pointLabelsTensor,\n//     orig_im_size: imageSizeTensor,\n//     mask_input: lastPredMaskTensor,\n//     has_mask_input: hasLastPredTensor,\n//   };\n// };\n\nexport { modelData };\n","// Copyright (c) Meta Platforms, Inc. and affiliates.\n// All rights reserved.\n\n// This source code is licensed under the license found in the\n// LICENSE file in the root directory of this source tree.\n\n// Helper function for handling image scaling needed for SAM\nconst handleImageScale = (imageNaturalWidth, imageNaturalHeight) => {\n  // Input images to SAM must be resized so the longest side is 1024\n  const LONG_SIDE_LENGTH = 1024;\n  const w = imageNaturalWidth;\n  const h = imageNaturalHeight;\n  const samScale = LONG_SIDE_LENGTH / Math.max(h, w);\n  return { height: h, width: w, samScale };\n};\n\n// const handleImageScale = (imageNaturalWidth, imageNaturalHeight) => {\n//   const IMAGE_SIZE = 500;\n//   const UPLOAD_IMAGE_SIZE = 1024;\n//   const w = imageNaturalWidth;\n//   const h = imageNaturalHeight;\n//   let scale;\n//   let uploadScale;\n//   if (h < w) {\n//     scale = IMAGE_SIZE / h;\n//     if (h * scale > 1333) {\n//       scale = 1333 / h;\n//     }\n//     uploadScale = UPLOAD_IMAGE_SIZE / w;\n//   } else {\n//     scale = IMAGE_SIZE / w;\n//     if (w * scale > 1333) {\n//       scale = 1333 / w;\n//     }\n//     uploadScale = UPLOAD_IMAGE_SIZE / h;\n//   }\n//   return {\n//     height: h, width: w, scale, uploadScale,\n//   };\n// };\n\nexport { handleImageScale };\n","// Copyright (c) Meta Platforms, Inc. and affiliates.\n// All rights reserved.\n\n// This source code is licensed under the license found in the\n// LICENSE file in the root directory of this source tree.\n\n// Convert the onnx model mask prediction to ImageData\nfunction arrayToImageData(input, height, width) {\n  const [r, g, b, a] = [0, 114, 189, 255]; // the masks's blue color\n  const arr = new Uint8ClampedArray(4 * width * height).fill(0);\n  for (let i = 0; i < input.length; i++) {\n    // Threshold the onnx model mask prediction at 0.0\n    // This is equivalent to thresholding the mask using predictor.model.mask_threshold\n    // in python\n    if (input[i] > 0.0) {\n      arr[4 * i + 0] = r;\n      arr[4 * i + 1] = g;\n      arr[4 * i + 2] = b;\n      arr[4 * i + 3] = a;\n    }\n  }\n  return new ImageData(arr, width, height);\n}\n\n// Use a Canvas element to produce an image from ImageData\nfunction imageDataToImage(imageData) {\n  const canvas = imageDataToCanvas(imageData);\n  const image = new Image();\n  image.src = canvas.toDataURL();\n  return image;\n}\n\n// Canvas elements can be created from ImageData\nfunction imageDataToCanvas(imageData) {\n  const canvas = document.createElement(\"canvas\");\n  const ctx = canvas.getContext(\"2d\");\n  canvas.width = imageData.width;\n  canvas.height = imageData.height;\n  ctx?.putImageData(imageData, 0, 0);\n  return canvas;\n}\n\nfunction clearMask() {\n  const canvas = document.createElement(\"canvas\");\n  return canvas;\n}\n\n// Convert the onnx model mask output to an HTMLImageElement\nfunction onnxMaskToImage(input, height, width) {\n  return imageDataToImage(arrayToImageData(input, height, width));\n}\n\nexport {\n  onnxMaskToImage,\n  clearMask,\n};\n","import { Tensor, InferenceSession } from \"onnxruntime-web\";\nimport { modelData } from \"@/assets/js/onnxHelpers/onnxModelAPI\";\nimport { handleImageScale } from \"@/assets/js/onnxHelpers/scaleHelper\";\nimport { onnxMaskToImage, clearMask } from \"@/assets/js/onnxHelpers/maskUtils\";\nimport { useEventBus, useDebounceFn } from '@vueuse/core';\nimport {\n  ref, computed, watch, onMounted, onUnmounted,\n} from 'vue';\nimport { v4 as uuidv4 } from 'uuid';\nimport cv from \"@techstark/opencv-js\";\n\nconst SAMEventBus = ref(null);\nconst SAMModelURL = '/sam_onnx_example.onnx';\nlet SAMImageEmbedding = ref(null);\nlet samMaskValue = ref(null);\nlet samMaskImg = ref(null);\nlet SAMSession = ref(null);\nlet imageObj = null;\nlet imageDimensions = null;\nlet annotations = null;\nlet selectedLabel = null;\nlet ctx = null;\nlet samOptions = null;\nconst isCreatingPolygon = ref(false);\n\nexport default function useSAMCanvas(context, newSAMOptions, canvas) {\n  let controller = new AbortController();\n  const samIp = computed(() => samOptions.value?.ip);\n  const samActive = computed(() => samOptions.value?.enabled);\n  const samClicks = computed(() => samOptions.value?.params.clicks);\n  const samBox = computed(() => samOptions.value?.params.box);\n  const samBoxActive = computed(() => samOptions.value?.params.pointType === 'box');\n  const samClickActive = computed(() => samOptions.value?.params.pointType === 'add' || samOptions.value?.params.pointType === 'minus');\n  const isAnnotating = computed(() => samActive.value && canvas.isSAMToolSelected.value && (samBoxActive.value || samClickActive.value));\n  const configSAMMaskImg = computed(() => ({\n    x: 0,\n    y: 0,\n    image: samMaskImg.value,\n    width: imageDimensions.value?.width ? imageDimensions.value.width : 100,\n    height: imageDimensions.value?.height ? imageDimensions.value.height : 100,\n    draggable: false,\n    opacity: 0.5,\n  }));\n\n  if (context) {\n    ctx = context;\n  }\n  if (newSAMOptions) {\n    samOptions = newSAMOptions;\n  }\n  if (canvas?.imageObj) {\n    imageObj = canvas.imageObj;\n  }\n  if (canvas?.imageObj) {\n    imageObj = canvas.imageObj;\n  }\n  if (canvas?.imageDimensions) {\n    imageDimensions = canvas.imageDimensions;\n  }\n  if (canvas?.annotations) {\n    annotations = canvas.annotations;\n  }\n  if (canvas?.selectedLabel) {\n    selectedLabel = canvas.selectedLabel;\n  }\n\n  function startSAMCanvas() {\n    watch(SAMImageEmbedding, (v) => {\n      if (v) {\n        ctx.emit('update:hasSAMImageEmbedding', true);\n      } else {\n        ctx.emit('update:hasSAMImageEmbedding', false);\n      }\n    }, { immediate: true });\n    watch(imageObj, () => {\n      samOptions.value.params.box = [];\n      samOptions.value.params.clicks = [];\n      SAMImageEmbedding.value = null;\n      if (samActive.value && imageObj.value.id && samIp.value) {\n        SAMEventBus.value.emit('reset');\n        getNewSAMImageEmbedding(imageObj.value.id);\n      }\n    });\n    watch(samActive, async (active) => {\n      if (active && samIp.value) {\n        if (!SAMImageEmbedding.value) {\n          await Promise.all([\n            getNewSAMImageEmbedding(imageObj.value.id),\n            getSAMSession(),\n          ]);\n        }\n        handleSAMClicks(samOptions.value.params.clicks, samOptions.value.params.box);\n      } else {\n        abortSAMFetching();\n        samMaskImg.value = clearMask();\n      }\n    });\n    watch(samIp, async (active) => {\n      if (active && samIp.value) {\n        if (!SAMImageEmbedding.value) {\n          await Promise.all([\n            getNewSAMImageEmbedding(imageObj.value.id),\n            getSAMSession(),\n          ]);\n        }\n        handleSAMClicks(samOptions.value.params.clicks, samOptions.value.params.box);\n      } else {\n        abortSAMFetching();\n        samMaskImg.value = clearMask();\n      }\n    });\n    watch(samClicks, (clicks) => {\n      if (samActive.value && SAMImageEmbedding.value && SAMSession.value) {\n        handleSAMClicks(clicks, samOptions.value.params.box);\n      }\n    }, { deep: true });\n    watch(samBox, (box) => {\n      if (samActive.value && SAMImageEmbedding.value && SAMSession.value) {\n        handleSAMClicks(samOptions.value.params.clicks, box);\n      }\n    });\n\n    // Lifecycle Hooks\n    onMounted(() => {\n      SAMEventBus.value = useEventBus('sam');\n      SAMEventBus.value.on(SAMEventListener);\n      if (samActive.value) {\n        getNewSAMImageEmbedding(imageObj.value.id);\n        getSAMSession();\n      }\n    });\n    onUnmounted(() => {\n      controller.abort();\n      SAMEventBus.value = null;\n      SAMImageEmbedding = ref(null);\n      samMaskValue = ref(null);\n      samMaskImg = ref(null);\n      SAMSession = ref(null);\n      imageObj = null;\n      imageDimensions = null;\n      annotations = null;\n      selectedLabel = null;\n      ctx = ref(null);\n      samOptions = ref(null);\n    });\n  }\n\n  // Methods\n  function SAMEventListener(event) {\n    switch (event) {\n    case 'reset':\n      reset();\n      break;\n    default:\n    }\n  }\n\n  function reset() {\n    samMaskValue.value = null;\n  }\n\n  async function abortSAMFetching() {\n    controller.abort();\n  }\n\n  async function getNewSAMImageEmbedding(imageID) {\n    SAMImageEmbedding.value = null;\n    samMaskImg.value = null;\n    samMaskValue.value = null;\n    ctx.emit('update:hasSAMImageEmbeddingError', false);\n    ctx.emit('update:samMask', null);\n\n    controller.abort();\n    controller = new AbortController();\n    const response = await fetch(`aigt/embedding?ip=${samOptions.value.ip}&image_id=${imageID}`, {\n      method: \"GET\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      signal: controller.signal,\n    });\n    if (response.ok) {\n      console.log('Got Image Embeddings');\n      const buf = await response.arrayBuffer();\n      const data32 = new Float32Array(buf);\n      SAMImageEmbedding.value = new Tensor('float32', data32, [1, 256, 64, 64]);\n    } else {\n      console.error('Failed to get SAM Image Embedding');\n      // TODO: Show error icon, stop showing loading icon\n      ctx.emit('update:hasSAMImageEmbeddingError', true);\n    }\n  }\n\n  async function getSAMSession() {\n    SAMSession.value = await InferenceSession.create(SAMModelURL);\n  }\n\n  async function handleSAMClicks(clicks, box = [], isPreview = false) {\n    if (!samOptions.value.enabled || !SAMImageEmbedding.value || !SAMSession.value) return;\n\n    if (clicks.length <= 0 && box.length <= 0) { samMaskImg.value = clearMask(); return; }\n\n    const output = await calculateSAMMask(clicks, box);\n    if (!isPreview) {\n      samMaskValue.value = output.data;\n    }\n    ctx.emit('update:samMask', output.data);\n    samMaskImg.value = onnxMaskToImage(output.data, output.dims[2], output.dims[3]);\n  }\n\n  async function calculateSAMMask(clicks, box = []) {\n    const modelScale = handleImageScale(imageDimensions.value.width, imageDimensions.value.height);\n    const feeds = modelData({\n      clicks: [...clicks, ...box],\n      tensor: SAMImageEmbedding.value,\n      modelScale,\n    });\n    const results = await SAMSession.value.run(feeds);\n    const output = results[SAMSession.value.outputNames[0]];\n    return output;\n  }\n\n  function handleSAMMaskClick(e, stageNode) {\n    if (samOptions.value.params.pointType !== 'add' && samOptions.value.params.pointType !== 'minus') {\n      return;\n    }\n\n    const x = stageNode.getRelativePointerPosition().x;\n    const y = stageNode.getRelativePointerPosition().y;\n\n    if (samOptions.value.enabled && (e.evt.button === 0 || e.evt.button === 2)) {\n      e.evt.preventDefault();\n      let clickType;\n      if (e.evt.button === 0) {\n        if (samOptions.value.params.pointType === 'add') {\n          clickType = 1;\n        } else if (samOptions.value.params.pointType === 'minus') {\n          clickType = 0;\n        }\n      } else {\n        clickType = 0;\n      }\n      const newSAMOptions = { ...samOptions.value };\n      newSAMOptions.params.clicks.push({ x, y, clickType });\n      ctx.emit('update:samOptions', newSAMOptions);\n    }\n  }\n\n  function handleSAMMousemove(stageNode) {\n    if (samOptions.value.params.pointType !== 'add' && samOptions.value.params.pointType !== 'minus') {\n      return;\n    }\n    // Show SAM mask preview on hover\n    if (samOptions.value.enabled && SAMImageEmbedding.value) {\n      const x = stageNode.getRelativePointerPosition().x;\n      const y = stageNode.getRelativePointerPosition().y;\n      let previewClickType = 1;\n      if (samOptions.value.params.pointType === 'minus') {\n        previewClickType = 0;\n      }\n      const previewClick = { x, y, clickType: previewClickType };\n      handleSAMClicks([previewClick, ...samClicks.value], samOptions.value.params.box, true);\n    }\n  }\n\n  function handleSAMMouseout() {\n    if (samOptions && samOptions.value) {\n      handleSAMClicks(samOptions.value.params.clicks, samOptions.value.params.box);\n    }\n  }\n\n  const debouncedHandleSAMMousemove = useDebounceFn(handleSAMMousemove, 30);\n  const debouncedHandleSAMMouseout = useDebounceFn(handleSAMMouseout, 30);\n\n  function handleSAMBoxDimensionChanged(dimensions) {\n    if (dimensions) {\n      const newSAMOptions = { ...samOptions.value };\n      newSAMOptions.params.box = [\n        { x: dimensions.x1, y: dimensions.y1, clickType: 2 },\n        { x: dimensions.x2, y: dimensions.y2, clickType: 3 },\n      ];\n      ctx.emit('update:samOptions', newSAMOptions);\n    }\n  }\n\n  async function handleCreateSAMPolygon() {\n    if (!selectedLabel.value) {\n      alert('No label selected');\n      return;\n    }\n\n    if (!samMaskValue.value) {\n      return;\n    }\n\n    isCreatingPolygon.value = true;\n\n    let polygon;\n    try {\n      polygon = await processImage(samMaskValue.value);\n    } catch (err) {\n      console.error('Failed to create annotation:', err);\n      alert(`Failed to create annotation: ${err}`);\n      isCreatingPolygon.value = false;\n      return;\n    }\n\n    const newAnnotationPolygon = {\n      id: uuidv4(),\n      label_index: selectedLabel.value.index,\n      label_id: selectedLabel.value.id,\n      label_name: selectedLabel.value.name,\n      type: \"seg\",\n      polygon: JSON.stringify(polygon),\n      score: 1,\n      reviewStatus: 'verified',\n      image_id: imageObj.value.id,\n    };\n\n    ctx.emit('create-annotation', newAnnotationPolygon);\n\n    samOptions.value.params.clicks = [];\n    samOptions.value.params.box = [];\n\n    isCreatingPolygon.value = false;\n\n    // isCreatingPolygon.value = true;\n    // await fetch(`sam/convert`, {\n    //   method: \"POST\",\n    //   headers: {\n    //     \"Content-Type\": \"application/octet-stream\",\n    //     \"imageW\": imageDimensions.value.width,\n    //     \"imageH\": imageDimensions.value.height,\n    //   },\n    //   body: samMaskValue.value,\n    // })\n    //   .then(async (resp) => {\n    //     const polygon = await resp.json();\n\n    //     const newAnnotationPolygon = {\n    //       id: uuidv4(),\n    //       label_index: selectedLabel.value.index,\n    //       type: \"seg\",\n    //       polygon: JSON.stringify(polygon),\n    //       score: 1,\n    //       reviewStatus: 'verified',\n    //       image_id: imageObj.value.id,\n    //     };\n\n    //     const newAnnotations = [...annotations.value, newAnnotationPolygon];\n    //     ctx.emit('update:updatedAnnotations', newAnnotations);\n\n    //     samOptions.value.params.clicks = [];\n    //     samOptions.value.params.box = [];\n    //   })\n    //   .catch((err) => {\n    //     alert(err);\n    //   });\n    // isCreatingPolygon.value = false;\n  }\n\n  // async function processImage(mask) {\n  //   // Create OpenCV Mat from Float32Array\n  //   const mat = cv.matFromArray(imageDimensions.value.height, imageDimensions.value.width, cv.CV_32FC1, mask);\n  //   console.log(mat);\n\n  //   // Convert to CV_8U single channel (assuming grayscale/binary image)\n  //   const mat8U = new cv.Mat();\n  //   mat.convertTo(mat8U, cv.CV_8U);\n\n  //   // Threshold the mask\n  //   const thresh = new cv.Mat();\n  //   cv.threshold(mat8U, thresh, 0, 255, cv.THRESH_BINARY);\n  //   console.log(thresh);\n\n  //   // Find contours\n  //   const contours = new cv.MatVector();\n  //   const hierarchy = new cv.Mat();\n  //   cv.findContours(thresh, contours, hierarchy, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE);\n  //   console.log('Contours:', contours.size());\n\n  //   // Find the largest contour\n  //   let maxLen = 0;\n  //   let index = 0;\n  //   for (let i = 0; i < contours.size(); i++) {\n  //     const contour = contours.get(i);\n  //     if (contour.size().height > maxLen) {\n  //       maxLen = contour.size().height;\n  //       index = i;\n  //     }\n  //   }\n  //   console.log(contours);\n\n  //   // Convert largest contour to normalized polygon\n  //   const polygon = [];\n  //   const contour = contours.get(index);\n  //   for (let i = 0; i < contour.size().height; i++) {\n  //     const point = contour.intPtr(i);\n  //     polygon.push([point[0] / imageDimensions.value.width, point[1] / imageDimensions.value.height]);\n  //   }\n  //   console.log(polygon);\n\n  //   // Clean up\n  //   mat.delete();\n  //   thresh.delete();\n  //   contours.delete();\n  //   hierarchy.delete();\n\n  //   return [polygon];\n  // }\n\n  async function processImage(mask) {\n    // Create OpenCV Mat from Float32Array\n    const mat = cv.matFromArray(imageDimensions.value.height, imageDimensions.value.width, cv.CV_32FC1, mask);\n\n    // Convert to CV_8U single channel (assuming grayscale/binary image)\n    const mat8U = new cv.Mat();\n    try {\n      mat.convertTo(mat8U, cv.CV_8U);\n    } catch {\n      throw Error('Failed to convert to single channel');\n    }\n\n    // Threshold the mask\n    const thresh = new cv.Mat();\n    try {\n      cv.threshold(mat8U, thresh, 0, 255, cv.THRESH_BINARY);\n    } catch {\n      throw Error('Failed to get threshold mask');\n    }\n\n    // Find contours\n    const contours = new cv.MatVector();\n    const hierarchy = new cv.Mat();\n    try {\n      cv.findContours(thresh, contours, hierarchy, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);\n    } catch {\n      throw Error('Failed to find contours');\n    }\n\n    if (contours.size() === 0) {\n      return [];\n    }\n\n    const simplifiedPolygon = [];\n\n    // Find the largest contour\n    for (let i = 0; i < contours.size(); i++) {\n      const currentPolygon = [];\n      const ctr = contours.get(i);\n\n      // Simplify the largest contour using approxPolyDP\n      const epsilon = 0.0015 * cv.arcLength(ctr, true);\n      const approx = new cv.Mat();\n      try {\n        cv.approxPolyDP(ctr, approx, epsilon, true);\n      } catch {\n        throw Error('Failed to simplify polygon');\n      }\n\n      if (imageDimensions.value.width > 0 && imageDimensions.value.height > 0) {\n        for (let j = 0; j < approx.rows; j++) {\n          const x = (approx.intPtr(j, 0)[0] / imageDimensions.value.width);\n          const y = (approx.intPtr(j, 0)[1] / imageDimensions.value.height);\n          currentPolygon.push([x, y]);\n        }\n        simplifiedPolygon.push(currentPolygon);\n      }\n    }\n\n    // Clean up\n    try {\n      mat.delete();\n      thresh.delete();\n      contours.delete();\n      hierarchy.delete();\n    } catch {\n      throw Error('Failed to clean up');\n    }\n\n    return simplifiedPolygon;\n  }\n\n  return {\n    startSAMCanvas,\n    SAMEventBus,\n    SAMImageEmbedding,\n    samMaskImg,\n    SAMSession,\n    samActive,\n    samClicks,\n    samBox,\n    samBoxActive,\n    samClickActive,\n    isAnnotating,\n    configSAMMaskImg,\n    isCreatingPolygon,\n    getNewSAMImageEmbedding,\n    getSAMSession,\n    handleSAMMaskClick,\n    handleSAMMousemove,\n    debouncedHandleSAMMousemove,\n    debouncedHandleSAMMouseout,\n    handleSAMMouseout,\n    handleSAMBoxDimensionChanged,\n    handleCreateSAMPolygon,\n    abortSAMFetching,\n  };\n}\n","import {\n  computed, unref,\n} from 'vue';\nimport { getColor } from '@/assets/js/utils.js';\n\nexport default function useAnnotationColorMap({ items, key }) {\n  const colorMap = computed(() => {\n    const map = {};\n    unref(items).forEach((item, i) => {\n      map[item[key]] = getColor(i);\n    });\n    return map;\n  });\n\n  return {\n    map: colorMap,\n  };\n}\n","export default function useColorParser() {\n  function parseColor(value) {\n    if (typeof value === 'number' && value > 0 && value < 0xFFFFFFFF && Number.isInteger(value)) {\n      // uint32\n      const hexString = value.toString(16);\n      return `#${hexString.padStart(8, '0').toUpperCase()}`;\n    } else if (value.startsWith('0x') || value.startsWith('#')) {\n      // hex\n      let hexString = value;\n      if (hexString.startsWith('0x')) {\n        hexString = `#${hexString.slice(2)}`;\n      }\n      return hexString;\n    } else if (value.startsWith('hsl')) {\n      let [h, s, l] = value.match(/\\d+/g).map(Number);\n      s /= 100;\n      l /= 100;\n\n      function hueToRgb(p, q, t) {\n        if (t < 0) t += 1;\n        if (t > 1) t -= 1;\n        if (t < 1 / 6) return p + (q - p) * 6 * t;\n        if (t < 1 / 2) return q;\n        if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n        return p;\n      }\n\n      let r; let g; let\n        b;\n\n      if (s === 0) {\n        r = g = b = l; // achromatic (gray)\n      } else {\n        const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n        const p = 2 * l - q;\n        r = hueToRgb(p, q, h / 360 + 1 / 3);\n        g = hueToRgb(p, q, h / 360);\n        b = hueToRgb(p, q, h / 360 - 1 / 3);\n      }\n\n      // Convert to HEX and return\n      const toHex = (x) => {\n        const hex = Math.round(x * 255).toString(16);\n        return hex.length === 1 ? `0${hex}` : hex;\n      };\n\n      return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n    } else {\n      return value.toString();\n    }\n  }\n\n  return {\n    parseColor,\n  };\n}\n","import { defineStore } from 'pinia';\nimport {\n  ref, computed, watch,\n} from 'vue';\n\nexport const useSAM2Store = defineStore('sam2', () => {\n  const sam2Server = ref('');\n  const isSam2ServerFound = ref(false);\n  const sam2Options = ref({\n    enabled: false,\n    mode: null,\n    params: {\n      pointType: null,\n      clicks: [],\n      box: [],\n      boxes: [],\n    },\n  });\n  const sam2Annotations = ref([]);\n  const sam2LastPropagatedAnnotations = ref([]);\n  const aigt3dAnnotations = ref([]);\n  const aigt3dLastPropagatedAnnotations = ref([]);\n  const aigt2dAnnotations = ref([]);\n  const aigt2dLastPropagatedAnnotations = ref([]);\n  const sam2Active = computed(() => sam2Options.value?.enabled);\n  const isSAM2ClickMode = computed(() => sam2Options.value?.mode === 'hover_and_click');\n  const isSAM2BoxMode = computed(() => sam2Options.value?.mode === 'drag_box');\n\n  watch(sam2Server, () => {\n    isSam2ServerFound.value = false;\n  });\n\n  // const clicksByObjId = computed(() => Object.groupBy(sam2Options.value.params.clicks, ({ obj_id }) => obj_id));\n  // const boxByObjId = computed(() => Object.groupBy(sam2Options.value.params.box, ({ obj_id }) => obj_id));\n\n  const isInitializingState = ref(false);\n  const hasInitState = ref(false);\n  const initStatus = ref('');\n  const initDetail = ref('');\n  const initProgress = ref(0);\n  const initTotal = ref(0);\n  const initError = ref('');\n  const initStartFrame = ref(1);\n  const initEndFrame = ref(2);\n  const isPropagating = ref(false);\n  const propagateStatus = ref('');\n  const propagateDetail = ref('');\n  const propagateProgress = ref(0);\n  const propagateTotal = ref(0);\n  const shouldClearNextPoints = ref(false);\n  const isCreatingAnnotations = ref(false);\n  const propagateLastAnnotationIndex = ref(0);\n  const reversePropagateEnabled = ref(false);\n  const objects = ref([]);\n  const objectsLabelMap = ref({});\n  const selectedObject = ref(null);\n  const isAddingNewPointsOrBox = ref(false);\n  const isCancellingPropagation = ref(false);\n\n  function $reset() {\n    sam2Server.value = '';\n    isSam2ServerFound.value = false;\n    sam2Options.value = {\n      enabled: false,\n      mode: null,\n      params: {\n        pointType: null,\n        clicks: [],\n        box: [],\n        boxes: [],\n      },\n    };\n    sam2Annotations.value = [];\n    sam2LastPropagatedAnnotations.value = [];\n    aigt3dAnnotations.value = [];\n    aigt3dLastPropagatedAnnotations.value = [];\n    aigt2dAnnotations.value = [];\n    aigt2dLastPropagatedAnnotations.value = [];\n\n    isInitializingState.value = false;\n    hasInitState.value = false;\n    initStatus.value = '';\n    initDetail.value = '';\n    initProgress.value = 0;\n    initTotal.value = 0;\n    initError.value = '';\n    initStartFrame.value = 1;\n    initEndFrame.value = 2;\n    isPropagating.value = false;\n    propagateStatus.value = '';\n    propagateDetail.value = '';\n    propagateProgress.value = 0;\n    propagateTotal.value = 0;\n    shouldClearNextPoints.value = false;\n    isCreatingAnnotations.value = false;\n    propagateLastAnnotationIndex.value = 0;\n    reversePropagateEnabled.value = false;\n    objects.value = [];\n    objectsLabelMap.value = {};\n    selectedObject.value = null;\n    isCancellingPropagation.value = false;\n  }\n\n  function handleSAM2ImageClick(e, x, y, imageId, frame) {\n    if (sam2Options.value.params.pointType !== 'add' && sam2Options.value.params.pointType !== 'minus') {\n      return;\n    }\n\n    if (sam2Options.value.enabled && (e.evt.button === 0 || e.evt.button === 2)) {\n      e.evt.preventDefault();\n      let clickType;\n      if (e.evt.button === 0) {\n        if (sam2Options.value.params.pointType === 'add') {\n          clickType = 1;\n        } else if (sam2Options.value.params.pointType === 'minus') {\n          clickType = 0;\n        }\n      } else {\n        clickType = 0;\n      }\n      const newSAMOptions = { ...sam2Options.value };\n      newSAMOptions.params.clicks.push({\n        x, y, clickType, imageId, frame_idx: frame - initStartFrame.value, obj_id: selectedObject.value,\n      });\n    }\n  }\n\n  function getFrameSAM2Annotations(frame_image_id) {\n    if (!frame_image_id) return [];\n    return sam2Annotations.value.filter((anno) => anno.image_id === frame_image_id);\n  }\n\n  function getFrameAndObjectSAM2LastPropagatedAnnotations(frame_image_id, obj_id) {\n    if (!frame_image_id || !obj_id) return [];\n    return sam2LastPropagatedAnnotations.value.filter((anno) => anno.image_id === frame_image_id && anno.object_reference === obj_id);\n  }\n\n  function getFrameAndObjectAigt3dLastPropagatedAnnotations(frame_image_id, obj_id) {\n    if (!frame_image_id || !obj_id) return [];\n    return aigt3dLastPropagatedAnnotations.value.filter((anno) => anno.image_id === frame_image_id && anno.object_reference === obj_id);\n  }\n\n  function getFrameAndObjectAigt2dLastPropagatedAnnotations(frame_image_id, obj_id) {\n    if (!frame_image_id || !obj_id) return [];\n    return aigt2dLastPropagatedAnnotations.value.filter((anno) => anno.image_id === frame_image_id && anno.object_reference === obj_id);\n  }\n\n  return {\n    sam2Server,\n    isSam2ServerFound,\n    sam2Options,\n    sam2Active,\n    sam2Annotations,\n    sam2LastPropagatedAnnotations,\n    aigt3dAnnotations,\n    aigt3dLastPropagatedAnnotations,\n    aigt2dAnnotations,\n    aigt2dLastPropagatedAnnotations,\n    isSAM2ClickMode,\n    isSAM2BoxMode,\n    // clicksByObjId,\n    // boxByObjId,\n    isInitializingState,\n    hasInitState,\n    initStatus,\n    initDetail,\n    initProgress,\n    initTotal,\n    initError,\n    initStartFrame,\n    initEndFrame,\n    isPropagating,\n    propagateStatus,\n    propagateDetail,\n    propagateProgress,\n    propagateTotal,\n    propagateLastAnnotationIndex,\n    shouldClearNextPoints,\n    isCreatingAnnotations,\n    reversePropagateEnabled,\n    objects,\n    objectsLabelMap,\n    selectedObject,\n    isAddingNewPointsOrBox,\n    isCancellingPropagation,\n    handleSAM2ImageClick,\n    getFrameSAM2Annotations,\n    getFrameAndObjectSAM2LastPropagatedAnnotations,\n    getFrameAndObjectAigt3dLastPropagatedAnnotations,\n    getFrameAndObjectAigt2dLastPropagatedAnnotations,\n    $reset,\n  };\n});\n","<template>\n  <v-image\n    ref=\"image\"\n    :config=\"configImg\"\n    @dragend=\"$emit('dragend')\"\n    @pointermove=\"$emit('pointermove', $event)\"\n    @pointerout=\"updateImagePointerLeave\"\n    @pointerclick=\"$emit('pointerclick', $event)\"\n  />\n  <KonvaTransformer\n    ref=\"transformer\"\n    :nodes=\"isSelected && node ? [node] : []\"\n    :rotateEnabled=\"true\"\n  />\n\n  <v-line v-if=\"showPointerAxes\" :config=\"configAxisX\" />\n  <v-line v-if=\"showPointerAxes\" :config=\"configAxisY\" />\n</template>\n\n<script>\nimport { roundNumber } from '@/assets/js/utils.js';\nimport { storeToRefs } from 'pinia';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport KonvaTransformer from './KonvaTransformer.vue';\n\nexport default {\n  name: 'KonvaImage',\n  components: {\n    KonvaTransformer,\n  },\n  props: {\n    imagePath: {\n      type: String,\n      default: '',\n    },\n    imageId: {\n      type: Number,\n      default: null,\n    },\n    isSelected: {\n      type: Boolean,\n      default: false,\n    },\n    opacity: {\n      type: Number,\n      default: 1,\n    },\n    stageReady: {\n      type: Boolean,\n      default: false,\n    },\n    useImageCacheOnly: {\n      type: Boolean,\n      default: false,\n    },\n    imageCacheElem: {\n      type: HTMLElement,\n      default: null,\n    },\n    showPointerAxes: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'new-coordinates', 'shape-selected', 'image-loaded', 'dragend', 'pointermove', 'pointerclick',\n  ],\n  setup() {\n    const {\n      mouse,\n    } = storeToRefs(useViewerVisualizationsStore());\n\n    return {\n      mouse,\n    };\n  },\n  data() {\n    return {\n      node: null,\n      image: null,\n      width: 0,\n      height: 0,\n      configAxisX: {\n        stroke: 'red',\n        strokeWidth: 1,\n        points: [],\n      },\n      configAxisY: {\n        stroke: 'red',\n        strokeWidth: 1,\n        points: [],\n      },\n    };\n  },\n  computed: {\n    configImg() {\n      return {\n        type: 'map',\n        fill: 'white',\n        x: 0,\n        y: 0,\n        image: this.imageCacheElem ? this.imageCacheElem : this.image,\n        width: this.width,\n        height: this.height,\n        draggable: false,\n        opacity: this.opacity,\n      };\n    },\n  },\n  watch: {\n    imagePath: {\n      immediate: true,\n      handler(path) {\n        if (path && this.imageId && !this.useImageCacheOnly && !this.imageCacheElem) {\n          this.loadImage(path, this.imageId);\n        }\n      },\n    },\n    imageCacheElem: {\n      immediate: true,\n      handler() {\n        if (this.imageCacheElem) {\n          this.width = this.imageCacheElem.naturalWidth;\n          this.height = this.imageCacheElem.naturalHeight;\n          this.$emit('image-loaded', {\n            width: this.width, height: this.height, url: this.imageCacheElem.src, imageId: this.imageId,\n          });\n        }\n      },\n    },\n    mouse: {\n      deep: true,\n      immediate: true,\n      handler() {\n        const x = this.mouse.offsetX * this.width;\n        const y = this.mouse.offsetY * this.height;\n        this.configAxisX.points = [x, 0, x, this.height];\n        this.configAxisY.points = [0, y, this.width, y];\n      },\n    },\n  },\n  mounted() {\n    this.node = this.$refs.image.getNode();\n  },\n  methods: {\n    loadImage(path, imageId) {\n      // Create a new request\n      fetch(path, {\n        method: 'GET',\n        headers: {\n          'Authorization': `Bearer ${this.$store.state.user.token}`,\n        },\n      })\n        .then((response) => {\n          if (!response.ok) {\n            throw new Error(`Error loading image`);\n          }\n          return response.blob();\n        })\n        .then((blob) => {\n          const image = document.createElement('img');\n          image.onerror = (e) => { console.log(e); };\n          image.onload = () => {\n            this.width = image.naturalWidth;\n            this.height = image.naturalHeight;\n            this.image = image;\n            this.$emit('image-loaded', {\n              width: this.width, height: this.height, url: image.src, imageId,\n            });\n            URL.revokeObjectURL(image.src);\n          };\n          image.src = URL.createObjectURL(blob);\n        })\n        .catch((e) => {\n          console.log(e);\n        });\n    },\n    handleImagePointerMove() {\n      const pointerPos = this.node.getRelativePointerPosition();\n      if (!pointerPos) {\n        return;\n      }\n      if (pointerPos.x < 0 || pointerPos.x > this.width || pointerPos.y < 0 || pointerPos.y > this.height) {\n        this.updateImagePointerLeave();\n        return;\n      }\n      const ptrX = parseInt(pointerPos.x);\n      const ptrY = parseInt(pointerPos.y);\n      const calcX = ptrX / this.width;\n      const calcY = Math.abs((ptrY - this.height) / this.height);\n\n      this.mouse = {\n        offsetX: roundNumber(calcX, 3),\n        offsetY: 1.0 - roundNumber(calcY, 3),\n      };\n    },\n    updateImagePointerLeave() {\n      this.configAxisX.points = [];\n      this.configAxisY.points = [];\n\n      this.mouse = {\n        offsetX: null,\n        offsetY: null,\n      };\n    },\n    getImageNode() {\n      return this.$refs.image.getNode();\n    },\n  },\n};\n</script>\n\n<style>\n</style>\n","<template>\n  <v-transformer\n    ref=\"transformer\"\n    :rotateEnabled=\"rotateEnabled\"\n    :resizeEnabled=\"resizeEnabled\"\n    :config=\"{\n      anchorDragBoundFunc: anchorDragBoundFunc\n    }\"\n  />\n</template>\n\n<script>\nexport default {\n  name: 'KonvaTransformer',\n  props: {\n    rotateEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    resizeEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    imageNode: {\n      type: Object,\n      default: null,\n    },\n  },\n  computed: {\n    anchorDragBoundFunc() {\n      const anchorDragBoundFunc = (oldAbsPos, newAbsPos, event) => {\n        const imagePos = this.imageNode.absolutePosition();\n        const imageAttr = this.imageNode.getAttrs();\n        // Get drag bounds with image node\n        const minX = imagePos.x;\n        const maxX = imagePos.x + (imageAttr.width * this.stageScale.x);\n        const minY = imagePos.y;\n        const maxY = imagePos.y + (imageAttr.height * this.stageScale.y);\n        // Override box position\n        const x = Math.max(minX, Math.min(newAbsPos.x, maxX));\n        const y = Math.max(minY, Math.min(newAbsPos.y, maxY));\n        return {\n          x,\n          y,\n        };\n      };\n      return anchorDragBoundFunc;\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { render } from \"./KonvaTransformer.vue?vue&type=template&id=97273742\"\nimport script from \"./KonvaTransformer.vue?vue&type=script&lang=js\"\nexport * from \"./KonvaTransformer.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./KonvaImage.vue?vue&type=template&id=55b8b45e\"\nimport script from \"./KonvaImage.vue?vue&type=script&lang=js\"\nexport * from \"./KonvaImage.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-image\n    ref=\"image\"\n    :config=\"configImg\"\n    @dragend=\"$emit('dragend')\"\n    @pointermove=\"$emit('pointermove', $event)\"\n    @pointerout=\"updateImagePointerLeave\"\n    @pointerclick=\"handlePointerClick\"\n  />\n  <KonvaTransformer\n    ref=\"transformer\"\n    :nodes=\"isSelected && node ? [node] : []\"\n    :rotateEnabled=\"true\"\n  />\n  <v-line v-if=\"showPointerAxes\" :config=\"configAxisX\" />\n  <v-line v-if=\"showPointerAxes\" :config=\"configAxisY\" />\n</template>\n\n<script>\nimport { roundNumber } from '@/assets/js/utils.js';\nimport Konva from 'konva';\nimport { useVideoPlayerStore } from '@/stores/useVideoPlayerStore.js';\nimport { storeToRefs } from 'pinia';\nimport KonvaTransformer from './KonvaTransformer.vue';\n\nexport default {\n  name: 'KonvaVideo',\n  components: {\n    KonvaTransformer,\n  },\n  props: {\n    imagePath: {\n      type: String,\n      default: '',\n    },\n    isSelected: {\n      type: Boolean,\n      default: false,\n    },\n    opacity: {\n      type: Number,\n      default: 1,\n    },\n    stageReady: {\n      type: Boolean,\n      default: false,\n    },\n    showPointerAxes: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'new-coordinates', 'shape-selected', 'image-loaded', 'dragend', 'pointermove', 'pointerclick',\n  ],\n  setup() {\n    const videoPlayerStore = useVideoPlayerStore();\n    const { playing } = storeToRefs(videoPlayerStore);\n    return {\n      playing,\n      loadVideo: videoPlayerStore.loadVideo,\n    };\n  },\n  data() {\n    return {\n      node: null,\n      width: 0,\n      height: 0,\n      video: null,\n      animation: null,\n      preview: null,\n      videoReady: false,\n      played: false,\n      configAxisX: {\n        stroke: 'red',\n        strokeWidth: 1,\n        points: [],\n      },\n      configAxisY: {\n        stroke: 'red',\n        strokeWidth: 1,\n        points: [],\n      },\n    };\n  },\n  computed: {\n    configImg() {\n      return {\n        type: 'map',\n        fill: 'black',\n        x: 0,\n        y: 0,\n        image: this.played ? this.video : this.preview,\n        width: this.width,\n        height: this.height,\n        draggable: false,\n        opacity: this.opacity,\n      };\n    },\n    stageAndVideoReady() {\n      return this.stageReady && this.videoReady;\n    },\n  },\n  watch: {\n    imagePath: {\n      immediate: true,\n      handler(path) {\n        if (path) {\n          this.loadImage(path);\n        }\n      },\n    },\n    stageAndVideoReady() {\n      if (this.stageReady && !this.animation) {\n        this.animation = new Konva.Animation(() => {\n          // do nothing, animation just need to update the layer\n        }, this.node.getLayer());\n      }\n      this.animation.start();\n    },\n    playing: {\n      handler() {\n        if (!this.played) {\n          this.played = true;\n        }\n      },\n    },\n  },\n  mounted() {\n    this.node = this.$refs.image.getNode();\n  },\n  unmounted() {\n    this.animation.stop();\n  },\n  methods: {\n    loadImage(path) {\n      // Load image path\n      this.video = document.createElement('video');\n      this.video.onerror = (e) => { console.log(e); };\n      this.video.oncanplay = () => {\n        this.videoReady = true;\n        const canvas = document.createElement(\"canvas\");\n        const ctx = canvas.getContext(\"2d\");\n        canvas.width = this.video.videoWidth;\n        canvas.height = this.video.videoHeight;\n        ctx.drawImage(this.video, 0, 0);\n        this.preview = canvas;\n      };\n      this.video.onloadedmetadata = () => {\n        this.width = this.video.videoWidth;\n        this.height = this.video.videoHeight;\n        this.$emit('image-loaded', { width: this.width, height: this.height });\n      };\n      this.video.autoplay = true;\n      this.video.muted = true;\n      this.loadVideo(this.video, path);\n    },\n    handleImagePointerMove() {\n      const pointerPos = this.node.getRelativePointerPosition();\n      if (!pointerPos) {\n        return;\n      }\n      if (pointerPos.x < 0 || pointerPos.x > this.width || pointerPos.y < 0 || pointerPos.y > this.height) {\n        this.updateImagePointerLeave();\n        return;\n      }\n      const ptrX = parseInt(pointerPos.x);\n      const ptrY = parseInt(pointerPos.y);\n      const calcX = ptrX / this.width;\n      const calcY = Math.abs((ptrY - this.height) / this.height);\n\n      this.configAxisX.points = [pointerPos.x, 0, pointerPos.x, this.height];\n      this.configAxisY.points = [0, pointerPos.y, this.width, pointerPos.y];\n\n      this.$emit('new-coordinates', {\n        offsetX: roundNumber(calcX, 3),\n        offsetY: roundNumber(calcY, 3),\n      });\n    },\n    updateImagePointerLeave() {\n      this.configAxisX.points = [];\n      this.configAxisY.points = [];\n\n      this.$emit('new-coordinates', {\n        offsetX: null,\n        offsetY: null,\n      });\n    },\n    getImageNode() {\n      return this.$refs.image.getNode();\n    },\n    handlePointerClick(event) {\n      this.$emit('pointerclick', event);\n      if (this.playing) {\n        this.pause();\n      } else {\n        this.play();\n      }\n    },\n    play() {\n      this.video.play();\n    },\n    pause() {\n      this.video.pause();\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { defineStore, skipHydrate } from 'pinia';\nimport { computed, ref } from 'vue';\nimport { useMediaControls, useFullscreen } from '@vueuse/core';\n\nexport const useVideoPlayerStore = defineStore('video', () => {\n  // we won't expose (return) this element directly\n  const videoElement = ref();\n  const src = ref('');\n  const {\n    playing, volume, muted, currentTime, duration, buffered, togglePictureInPicture,\n  } = useMediaControls(videoElement, { src });\n\n  function loadVideo(element, newSrc) {\n    videoElement.value = element;\n    src.value = newSrc;\n  }\n\n  const {\n    isFullscreen, enter, exit, toggle: toggleFullScreen,\n  } = useFullscreen(videoElement);\n\n  return {\n    src,\n    playing,\n    volume,\n    muted,\n    currentTime,\n    duration,\n    buffered,\n\n    loadVideo,\n    toggleFullScreen,\n    togglePictureInPicture,\n  };\n});\n","import { render } from \"./KonvaVideo.vue?vue&type=template&id=0420344b\"\nimport script from \"./KonvaVideo.vue?vue&type=script&lang=js\"\nexport * from \"./KonvaVideo.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-rect\n    ref=\"brushCanvas\"\n    :config=\"rectConfig\"\n    class=\"brush-canvas\"\n  />\n  <template v-if=\"drawMode === 'brush' || drawMode === 'eraser'\">\n    <component\n      :is=\"item.type\"\n      v-for=\"item, idx in items\"\n      :key=\"idx\"\n      :ref=\"item.ref\"\n      :config=\"item.config\"\n      :listening=\"item.listening\"\n    />\n  </template>\n  <template v-else-if=\"drawMode === 'line'\">\n    <v-line\n      ref=\"freeDrawLine\"\n      :config=\"freeDrawLineConfig\"\n      :listening=\"false\"\n    />\n    <!-- draw this circle to represent the first vertex -->\n    <v-circle\n      v-if=\"freeDrawLinePoints.length === 2\"\n      :config=\"{\n        x: freeDrawLinePoints[0],\n        y: freeDrawLinePoints[1],\n        radius: 1,\n        fill: '#DCDCDC',\n        stroke: '#DCDCDC',\n        strokeWidth: 1,\n      }\"\n      :listening=\"false\"\n    />\n  </template>\n</template>\n\n<script>\nimport useBrushToPolygon from '@/composables/annotationTool/useBrushToPolygon.js';\nimport useColorParser from '@/composables/useColorParser.js';\n\nexport default {\n  name: 'KonvaBrush',\n  props: {\n    stageNode: {\n      type: Object,\n      default: () => {},\n    },\n    imageDimensions: {\n      type: Object,\n      default: () => {},\n    },\n    drawMode: {\n      type: String,\n      default: '',\n    },\n    fill: {\n      type: String,\n      default: '',\n    },\n    drawCursorSize: {\n      type: Number,\n      default: 0,\n    },\n    polygon: {\n      type: String,\n      default: '',\n    },\n    selectedLabel: {\n      type: Object,\n      default: null,\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    labelColorMap: {\n      type: Object,\n      default: null,\n    },\n    scale: {\n      type: Number,\n      default: 1,\n    },\n    enableBrush: {\n      // this means the annotation is not a segment, or should not add segment\n      type: Boolean,\n      default: false,\n    },\n    doneVertexDraw: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'edit-polygon', 'new-polygon',\n  ],\n  setup() {\n    const {\n      processImage,\n    } = useBrushToPolygon();\n    const {\n      parseColor,\n    } = useColorParser();\n    return {\n      processImage,\n      parseColor,\n    };\n  },\n  data() {\n    return {\n      lineObjects: [],\n      pointer: null,\n      brushCanvas: null,\n      brushCursor: null,\n      isDrawing: false,\n      freeDrawLinePoints: [],\n    };\n  },\n  computed: {\n    rectConfig() {\n      return {\n        x: 0,\n        y: 0,\n        width: this.imageDimensions?.width,\n        height: this.imageDimensions?.height,\n        draggable: false,\n        opacity: 0,\n      };\n    },\n    cursorConfig() {\n      return {\n        type: 'v-circle',\n        ref: 'brushCursor',\n        listening: false,\n        config: {\n          x: this.pointer?.x,\n          y: this.pointer?.y,\n          radius: this.drawCursorSize / this.scale,\n          stroke: this.drawMode === 'brush' ? 'black' : '#F6F3F3',\n          fill: this.toolColor,\n          fillEnabled: this.drawMode === 'brush',\n          opacity: 0.8,\n          strokeWidth: 1.5 / this.scale,\n        },\n      };\n    },\n    items() {\n      return [...this.lineObjects, this.cursorConfig];\n    },\n    freeDrawLineConfig() {\n      return {\n        stroke: '#DCDCDC',\n        strokeWidth: 1.5 / this.scale,\n        opacity: 0.8,\n        points: this.freeDrawLinePoints,\n        closed: true,\n        fill: this.toolColor,\n      };\n    },\n    toolColor() {\n      let color = '';\n      if (this.fill) {\n        if (this.drawMode === 'brush' || this.drawMode === 'line') {\n          color = this.fill;\n        } else {\n          color = '#F6F3F3';\n        }\n      } else {\n        color = this.getAnnotationColor();\n      }\n      return color;\n    },\n    freeDrawCircleCoordinates() {\n      const newArr = [];\n      const points1D = [...this.freeDrawLinePoints];\n      while (points1D.length) { newArr.push(points1D.splice(0, 2)); }\n      return newArr;\n    },\n  },\n  watch: {\n    drawMode: {\n      immediate: true,\n      handler() {\n        if ((this.drawMode === 'brush' || this.drawMode === 'eraser')) {\n          this.$nextTick(() => {\n            this.stageNode.container().style.cursor = 'none';\n            this.brushCursor = this.$refs.brushCursor[this.$refs.brushCursor.length - 1]?.getNode();\n            this.clearBrushCanvas();\n            this.setUpBrushEvents();\n          });\n        } else if (this.drawMode === 'line') {\n          this.$nextTick(() => {\n            this.stageNode.container().style.cursor = 'crosshair';\n            this.clearBrushCanvas();\n            this.setUpVertexDrawEvents();\n          });\n        } else {\n          this.$nextTick(() => {\n            this.stageNode.container().style.cursor = 'default';\n            this.clearBrushCanvas();\n          });\n        }\n      },\n    },\n    doneVertexDraw: {\n      immediate: true,\n      handler(newVal, oldVal) {\n        if (!oldVal && newVal && this.freeDrawLinePoints.length >= 6) {\n          this.processPolygon();\n        }\n      },\n    },\n  },\n  mounted() {\n    this.brushCanvas = this.$refs.brushCanvas.getNode();\n    this.pointer = this.brushCanvas.getRelativePointerPosition();\n    this.stageNode.container().style.cursor = 'none';\n  },\n  beforeUnmount() {\n    if (!this.doneVertexDraw && this.freeDrawLinePoints.length >= 6) {\n      this.processPolygon();\n    }\n    this.stageNode.container().style.cursor = 'default';\n    this.clearBrushCanvas();\n  },\n  methods: {\n    getAnnotationColor() {\n      if (this.selectedLabel && this.selectedLabel.color) {\n        return this.parseColor(this.selectedLabel.color);\n      } else if (this.selectedLabel && this.labelColorMap) {\n        return this.labelColorMap[this.selectedLabel['index']];\n      } else {\n        return '#F6F3F3';\n      }\n    },\n    clearAllLines() {\n      this.freeDrawLinePoints = [];\n      this.lineObjects = [];\n    },\n    clearPreviousLine() {\n      this.lineObjects.pop();\n    },\n    clearBrushCanvas() {\n      this.brushCanvas?.off('mousedown touchstart');\n      this.brushCanvas?.off('mousemove touchmove');\n      this.brushCanvas?.off('mouseup touchend');\n      this.brushCanvas?.off('pointerclick');\n      this.brushCanvas?.off('mouseout');\n      this.brushCanvas?.off('mouseover');\n    },\n    processPolygon() {\n      if (!this.enableBrush) {\n        this.clearAllLines();\n        return;\n      }\n      const browserZoom = window.devicePixelRatio;\n      const canvas = this.brushCanvas.getLayer().getCanvas();\n      const clientRect = this.brushCanvas.getClientRect();\n      const originalPolygon = this.polygon ? this.polygon : \"[]\";\n      const processed = this.processImage(\n        canvas,\n        clientRect.x * browserZoom,\n        clientRect.y * browserZoom,\n        this.brushCanvas.attrs.width * this.stageNode.attrs.scaleX * browserZoom,\n        this.brushCanvas.attrs.height * this.stageNode.attrs.scaleY * browserZoom,\n        originalPolygon,\n        this.drawMode,\n      );\n      if (this.polygon) {\n        this.$emit('edit-polygon', processed);\n      } else {\n        this.$emit('new-polygon', processed);\n      }\n      this.clearAllLines();\n    },\n    setUpBrushEvents() {\n      this.brushCanvas?.on('pointerclick', (e) => {\n        e.cancelBubble = true;\n      });\n\n      this.brushCanvas?.on('mouseout', (e) => {\n        this.stageNode.container().style.cursor = 'default';\n        this.brushCursor.hide();\n      });\n\n      this.brushCanvas?.on('mouseover', (e) => {\n        this.stageNode.container().style.cursor = 'none';\n        this.brushCursor.show();\n      });\n\n      this.brushCanvas?.on('mousedown touchstart', (e) => {\n        this.isDrawing = true;\n        this.brushCursor.show();\n        this.pointer = this.brushCanvas.getRelativePointerPosition();\n        const lastLine = {\n          type: 'v-line',\n          ref: `line_${this.lineObjects.length + 1}`,\n          listening: false,\n          config: {\n            stroke: this.toolColor,\n            strokeWidth: (this.drawCursorSize * 2) / this.scale,\n            globalCompositeOperation: 'source-over',\n            // round cap for smoother lines\n            lineCap: 'round',\n            lineJoin: 'round',\n            opacity: 0.8,\n            // add point twice, so we have some drawings even on a simple click\n            points: [this.pointer.x, this.pointer.y, this.pointer.x, this.pointer.y],\n          },\n        };\n\n        this.lineObjects.push(lastLine);\n        e.cancelBubble = true;\n      });\n      this.brushCanvas?.on('mouseup touchend', (e) => {\n        this.brushCursor = this.$refs.brushCursor[this.$refs.brushCursor.length - 1]?.getNode();\n        this.isDrawing = false;\n        if (this.lineObjects.length === 0) {\n          return;\n        }\n\n        e.cancelBubble = true;\n        this.processPolygon();\n      });\n\n      // and core function - drawing\n      this.brushCanvas?.on('mousemove touchmove', (e) => {\n        this.pointer = this.brushCanvas.getRelativePointerPosition();\n        if (!this.isDrawing) {\n          return;\n        }\n        // prevent scrolling on touch devices\n        e.evt.preventDefault();\n        const newPoints = this.lineObjects[this.lineObjects.length - 1].config.points.concat([this.pointer.x, this.pointer.y]);\n        this.lineObjects[this.lineObjects.length - 1].config.points = newPoints;\n        e.cancelBubble = true;\n      });\n    },\n    setUpVertexDrawEvents() {\n      this.brushCanvas?.on('pointerclick', (e) => {\n        this.pointer = this.brushCanvas.getRelativePointerPosition();\n        e.cancelBubble = true;\n\n        this.freeDrawLinePoints = this.freeDrawLinePoints.concat([this.pointer.x, this.pointer.y]);\n      });\n\n      this.brushCanvas?.on('mouseout', (e) => {\n        this.stageNode.container().style.cursor = 'default';\n      });\n\n      this.brushCanvas?.on('mouseover', (e) => {\n        this.stageNode.container().style.cursor = 'crosshair';\n      });\n\n      // and core function - drawing\n      this.brushCanvas?.on('mousemove touchmove', (e) => {\n        this.pointer = this.brushCanvas.getRelativePointerPosition();\n        // prevent scrolling on touch devices\n        e.evt.preventDefault();\n      });\n    },\n  },\n};\n</script>\n\n<style>\n</style>\n","import cv from \"@techstark/opencv-js\";\n\nconst polygonClipping = require('polygon-clipping');\n\nexport default function useBrushToPolygon() {\n  function processImage(canvas, rectX, rectY, width, height, polygon = \"[]\", mode = 'brush') {\n    let simplifiedPolygon = [[]];\n    if (canvas && width > 0 && height > 0) {\n      const ctx = canvas.getContext('2d', { willReadFrequently: true });\n      const imgData = ctx.getImageData(rectX, rectY, width, height);\n\n      const src = cv.matFromImageData(imgData);\n      const gray = new cv.Mat();\n      const binary = new cv.Mat();\n      const contours = new cv.MatVector();\n      const hierarchy = new cv.Mat();\n\n      // Convert to grayscale\n      cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY);\n\n      // Apply binary threshold\n      cv.threshold(gray, binary, 1, 255, cv.THRESH_BINARY);\n\n      try {\n        cv.findContours(binary, contours, hierarchy, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);\n      } catch {\n        throw Error('Failed to find contours');\n      }\n\n      // Find the largest contour\n      let maxLen = 0;\n      let index = 0;\n      for (let i = 0; i < contours.size(); i++) {\n        const contour = contours.get(i);\n        if (contour.size().height > maxLen) {\n          maxLen = contour.size().height;\n          index = i;\n        }\n      }\n\n      // Get the largest contour\n      const largestContour = contours.get(index);\n\n      // Simplify the largest contour using approxPolyDP\n      const epsilon = 0.005 * cv.arcLength(largestContour, true);\n      // const epsilon = 3;\n      const approx = new cv.Mat();\n      try {\n        cv.approxPolyDP(largestContour, approx, epsilon, true);\n      } catch {\n        throw Error('Failed to simplify polygon');\n      }\n\n      // Convert simplified contour to normalized polygon\n      const tempPolygon = [];\n      if (width > 0 && height > 0) {\n        for (let i = 0; i < approx.rows; i++) {\n          const x = (approx.intPtr(i, 0)[0] / width);\n          const y = (approx.intPtr(i, 0)[1] / height);\n          tempPolygon.push([x, y]);\n        }\n      }\n\n      simplifiedPolygon = tempPolygon;\n\n      // Clean up\n      try {\n        src.delete();\n        gray.delete();\n        binary.delete();\n        contours.delete();\n        hierarchy.delete();\n        approx.delete();\n      } catch {\n        throw Error('Failed to clean up');\n      }\n    }\n    // Output of clipping union is a 4D array\n    const originalPoly = JSON.parse(polygon);\n    return mergePolygons(originalPoly, [simplifiedPolygon], mode);\n  }\n\n  function mergePolygons(polygons, targetPolygon, mode) {\n    const formatted = new Array(polygons.length);\n    for (let i = 0; i < polygons.length; i += 1) {\n      formatted[i] = [polygons[i]];\n    }\n    let poly4D = null;\n    if (mode === 'brush' || mode === 'line') {\n      // if no target, try to union all orignal polygons\n      if (targetPolygon[0][0].length === 0) {\n        poly4D = polygonClipping.union(...formatted);\n      } else {\n        poly4D = polygonClipping.union(...formatted, targetPolygon);\n      }\n    } else if (mode === 'eraser') {\n      // if no target, return orignal polygons\n      if (targetPolygon[0][0].length === 0) {\n        return polygons;\n      } else {\n        poly4D = [];\n        formatted.forEach((poly) => {\n          poly4D.push(...polygonClipping.difference(poly, targetPolygon));\n        });\n      }\n    }\n    return combineResult(poly4D);\n  }\n\n  function combineResult(poly4D) {\n    const result = [];\n    for (let i = 0; i < poly4D.length; i += 1) {\n      result.push(poly4D[i][0]);\n    }\n    return result;\n  }\n\n  return {\n    processImage,\n  };\n}\n","import { render } from \"./KonvaBrush.vue?vue&type=template&id=0b85b8cc\"\nimport script from \"./KonvaBrush.vue?vue&type=script&lang=js\"\nexport * from \"./KonvaBrush.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-image\n    ref=\"imageEl\"\n    :config=\"configImg\"\n    @pointerclick=\"handleObjectClick($event)\"\n  />\n</template>\n\n<script setup>\nimport {\n  ref, watch, computed, onMounted, toRefs,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { decode } from 'fast-png';\nimport { useWebWorkerFn } from '@vueuse/core';\n\nconst props = defineProps({\n  identifier: {\n    type: String,\n    default: '',\n  },\n  imageDimensions: {\n    type: Object,\n    default: null,\n  },\n  annotation: {\n    type: Object,\n    default: null,\n  },\n  isSelected: {\n    type: Boolean,\n    default: false,\n  },\n  opacity: {\n    type: Number,\n    default: 1,\n  },\n  pointerCoordinates: {\n    type: Object,\n    default: null,\n  },\n  labels: {\n    type: Array,\n    default: () => [],\n  },\n});\nconst {\n  identifier,\n  imageDimensions,\n  annotation,\n  isSelected,\n  opacity,\n  pointerCoordinates,\n  labels,\n} = toRefs(props);\n\nconst emit = defineEmits(['new-coordinates', 'shape-selected', 'image-loaded']);\n\nconst node = ref(null);\nconst mask = ref(null);\nconst maskCtx = ref(null);\nconst mouseOver = ref(false);\nconst imageEl = ref(null);\n\nconst configImg = computed(() => ({\n  identifier: identifier.value,\n  fill: 'transparent',\n  x: 0,\n  y: 0,\n  image: mask.value,\n  width: imageDimensions.value.width,\n  height: imageDimensions.value.height,\n  draggable: false,\n  opacity: displayOpacity.value,\n}));\n\nconst displayOpacity = computed(() => {\n  if (isSelected.value) {\n    return 1;\n  } else if (mouseOver.value) {\n    return 0.5;\n  }\n  return 1;\n});\n\nwatch(imageDimensions, (dims) => {\n  if (dims) {\n    if (annotation.value) {\n      fetchMask();\n    }\n  }\n}, { immediate: true });\n\nwatch(pointerCoordinates, (coords) => {\n  if (!coords || !maskCtx.value) return;\n\n  const pos = coords;\n  const p = maskCtx.value.getImageData(pos.x, pos.y, 1, 1).data;\n  mouseOver.value = p[3] === 255;\n});\n\nwatch(annotation, (anno) => {\n  if (anno) {\n    fetchMask();\n  }\n});\n\nonMounted(() => {\n  node.value = imageEl.value.getNode();\n});\n\nasync function fetchMask() {\n  const dataConnect = new DatastoreConnect();\n  const blob = await dataConnect.getAnnotationFile(annotation.value.id, 'blob');\n  if (blob) {\n    const arrayBuffer = await blob.arrayBuffer();\n    const decodedImage = await decode(arrayBuffer);\n    const renderedBlob = await convertBlobToRGBImageWorkerFn(decodedImage.data, imageDimensions.value.width, imageDimensions.value.height, JSON.parse(JSON.stringify(labels.value)));\n    const image = new Image();\n    image.onerror = (e) => { console.log(e); };\n    image.onload = () => {\n      mask.value = image;\n      URL.revokeObjectURL(image.src);\n    };\n    image.src = URL.createObjectURL(renderedBlob);\n  }\n}\n\nasync function convertBlobToRGBImage(uint8Array, width, height, labels) {\n  const canvas = new OffscreenCanvas(width, height);\n  const ctx = canvas.getContext(\"2d\");\n  const imageData = ctx.createImageData(width, height);\n\n  function parseColor(value) {\n    if (typeof value === 'number' && value > 0 && value < 0xFFFFFFFF && Number.isInteger(value)) {\n      // uint32\n      const hexString = value.toString(16);\n      return `#${hexString.padStart(8, '0').toUpperCase()}`;\n    } else if (value.startsWith('0x') || value.startsWith('#')) {\n      // hex\n      let hexString = value;\n      if (hexString.startsWith('0x')) {\n        hexString = `#${hexString.slice(2)}`;\n      }\n      return hexString;\n    } else if (value.startsWith('hsl')) {\n      let [h, s, l] = value.match(/\\d+/g).map(Number);\n      s /= 100;\n      l /= 100;\n\n      function hueToRgb(p, q, t) {\n        if (t < 0) t += 1;\n        if (t > 1) t -= 1;\n        if (t < 1 / 6) return p + (q - p) * 6 * t;\n        if (t < 1 / 2) return q;\n        if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n        return p;\n      }\n\n      let r; let g; let\n        b;\n\n      if (s === 0) {\n        r = g = b = l; // achromatic (gray)\n      } else {\n        const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n        const p = 2 * l - q;\n        r = hueToRgb(p, q, h / 360 + 1 / 3);\n        g = hueToRgb(p, q, h / 360);\n        b = hueToRgb(p, q, h / 360 - 1 / 3);\n      }\n\n      // Convert to HEX and return\n      const toHex = (x) => {\n        const hex = Math.round(x * 255).toString(16);\n        return hex.length === 1 ? `0${hex}` : hex;\n      };\n\n      return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n    } else {\n      return value.toString();\n    }\n  }\n\n  function getColorByIndexFromScale(index) {\n    const hue = (index * 137.508) % 360; // use golden angle approximation\n    return hslToHex(hue, 70, 50);\n  }\n\n  function hslToHex(h, s, l) {\n    l /= 100;\n    const a = s * Math.min(l, 1 - l) / 100;\n    const f = (n) => {\n      const k = (n + h / 30) % 12;\n      const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n      return Math.round(255 * color).toString(16).padStart(2, '0'); // convert to Hex and prefix \"0\" if needed\n    };\n    return `#${f(0)}${f(8)}${f(4)}`;\n  }\n\n  for (let i = 0; i < uint8Array.length; i++) {\n    const value = uint8Array[i];\n    const index = i * 4;\n\n    if (value > 0) {\n      const targetLabel = labels.find((lbl) => lbl.index === value);\n      let hexColor;\n      if (targetLabel && targetLabel.color) {\n        hexColor = parseColor(targetLabel.color);\n      } else {\n        hexColor = getColorByIndexFromScale(value);\n      }\n      const r = parseInt(hexColor.substring(1, 3), 16);\n      const g = parseInt(hexColor.substring(3, 5), 16);\n      const b = parseInt(hexColor.substring(5, 7), 16);\n      imageData.data[index] = r;\n      imageData.data[index + 1] = g;\n      imageData.data[index + 2] = b;\n      imageData.data[index + 3] = 100;\n    } else {\n      imageData.data[index] = 255;\n      imageData.data[index + 1] = 255;\n      imageData.data[index + 2] = 255;\n      imageData.data[index + 3] = 0;\n    }\n  }\n\n  ctx.putImageData(imageData, 0, 0);\n  const blob = await canvas.convertToBlob();\n  return blob;\n}\n\nfunction handleObjectClick(e) {\n  if (!pointerCoordinates.value || !maskCtx.value) return;\n\n  const pos = pointerCoordinates.value;\n  const p = maskCtx.value.getImageData(pos.x, pos.y, 1, 1).data;\n  if (p[3] === 255) {\n    e.cancelBubble = true;\n    emit('shape-selected');\n  }\n}\n\nconst { workerFn: convertBlobToRGBImageWorkerFn, workerStatus, workerTerminate } = useWebWorkerFn(\n  convertBlobToRGBImage,\n  { timeout: 10000, localDependencies: [] },\n);\n\n</script>\n\n<style>\n\n</style>\n","import script from \"./KonvaSegmentationMask.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./KonvaSegmentationMask.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <!-- <Polygon\n    :identifier=\"identifier\"\n    :imageDimensions=\"imageDimensions\"\n    :points=\"points\"\n    :fill=\"fill\"\n    :stroke=\"stroke\"\n    :opacity=\"displayOpacity\"\n    :strokeWidth=\"strokeWidth\"\n    :draggable=\"draggable\"\n    :closed=\"true\"\n    :scaleX=\"1\"\n    :scaleY=\"1\"\n    :nodeRadius=\"nodeRadius\"\n    :nodeFill=\"nodeFill\"\n    :nodeStroke=\"nodeStroke\"\n    :nodeStrokeWidth=\"nodeStrokeWidth\"\n    :dashEnabled=\"dashEnabled\"\n    :dashSize=\"dashSize\"\n    :isFocused=\"isFocused\"\n    :nodeDragBoundFunc=\"nodeDragBoundFunc\"\n    :polygonDragBoundFunc=\"polygonDragBoundFunc\"\n    @update:points=\"updatePoints\"\n    @pointerclick=\"handleShapeClick($event)\"\n    @mouseover=\"handleMouseover\"\n    @mouseout=\"handleMouseout\"\n    @node-mouseover=\"handleNodeMouseover\"\n    @node-mouseout=\"handleNodeMouseout\"\n    @polygon-drag-end=\"$emit('polygon-drag-end')\"\n  /> -->\n  <Polygon\n    v-for=\"pts, index in multiPolygonPoints\"\n    :key=\"index\"\n    :identifier=\"identifier\"\n    :imageDimensions=\"imageDimensions\"\n    :points=\"pts\"\n    :fill=\"fill\"\n    :stroke=\"stroke\"\n    :opacity=\"displayOpacity\"\n    :strokeWidth=\"strokeWidth\"\n    :draggable=\"draggable\"\n    :closed=\"true\"\n    :scaleX=\"1\"\n    :scaleY=\"1\"\n    :nodeRadius=\"nodeRadius\"\n    :nodeFill=\"nodeFill\"\n    :nodeStroke=\"nodeStroke\"\n    :nodeStrokeWidth=\"nodeStrokeWidth\"\n    :dashEnabled=\"dashEnabled\"\n    :dashSize=\"dashSize\"\n    :isFocused=\"isFocused\"\n    :pending=\"pending\"\n    :pendingSelected=\"pendingSelected\"\n    @update:points=\"updatePointsV2($event, index)\"\n    @pointerclick=\"handleShapeClick($event)\"\n    @mouseover=\"handleMouseover\"\n    @mouseout=\"handleMouseout\"\n    @node-mouseover=\"handleNodeMouseover\"\n    @node-mouseout=\"handleNodeMouseout\"\n  />\n</template>\n\n<script>\nimport Polygon from './Polygon.vue';\n\nexport default {\n  name: 'KonvaSegmentationPolygon',\n  components: {\n    Polygon,\n  },\n  props: {\n    identifier: {\n      type: [String, Number],\n      default: '',\n    },\n    imageDimensions: {\n      type: Object,\n      default: null,\n    },\n    isSelected: {\n      type: Boolean,\n      default: false,\n    },\n    isAnnotating: {\n      type: Boolean,\n      default: false,\n    },\n    opacity: {\n      type: Number,\n      default: 1,\n    },\n    pointerCoordinates: {\n      type: Object,\n      default: null,\n    },\n    fill: {\n      type: String,\n      default: 'blue',\n    },\n    polygon: {\n      type: String,\n      default: null,\n    },\n    stageNode: {\n      type: Object,\n      default: () => {},\n    },\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    imageNode: {\n      type: Object,\n      default: () => {},\n    },\n    editingEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    pending: {\n      type: Boolean,\n      default: false,\n    },\n    pendingSelected: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'shape-selected',\n    'update:polygon',\n    'transformed',\n    'polygon-clicked-while-annotating',\n    'polygon-mouseover-while-annotating',\n    'polygon-mouseout-while-annotating', 'polygon-drag-end',\n  ],\n  data() {\n    return {\n      image: null,\n      mask: null,\n      maskCtx: null,\n      width: 0,\n      height: 0,\n      isMouseOver: false,\n      internalPolygon: null,\n    };\n  },\n  computed: {\n    draggable() {\n      if (!this.editingEnabled || this.isAnnotating) {\n        return false;\n      }\n      return true;\n    },\n    displayOpacity() {\n      if (this.isSelected) {\n        return 0.75;\n      } else if (this.isMouseOver) {\n        return 0.75;\n      }\n      return 0.5;\n    },\n    // points() {\n    //   if (this.polygon && this.imageDimensions) {\n    //     return this.convertRatioArrayToPixelArray(JSON.parse(this.polygon).flat().flat());\n    //   }\n    //   return [];\n    // },\n    multiPolygonPoints() {\n      if (this.internalPolygon && this.imageDimensions) {\n        return this.convertRatioArrayToPixelArrayV2(JSON.parse(this.internalPolygon));\n      }\n      return [];\n    },\n    xPoints() {\n      return this.multiPolygonPoints.flat().filter((p, i) => i % 2 === 0);\n    },\n    yPoints() {\n      return this.multiPolygonPoints.flat().filter((p, i) => i % 2 === 1);\n    },\n    minXPoint() {\n      return Math.min(...this.xPoints);\n    },\n    maxXPoint() {\n      return Math.max(...this.xPoints);\n    },\n    minYPoint() {\n      return Math.min(...this.yPoints);\n    },\n    maxYPoint() {\n      return Math.max(...this.yPoints);\n    },\n    nodeRadius() {\n      return 5 / this.stageScale.x;\n    },\n    stroke() {\n      if (this.isSelected) {\n        return 'black';\n      }\n      return this.fill;\n    },\n    strokeWidth() {\n      if (this.isSelected) {\n        return 2 / this.stageScale.x;\n      }\n      return 1 / this.stageScale.x;\n    },\n    nodeFill() {\n      return 'white';\n    },\n    nodeStroke() {\n      return 'blue';\n    },\n    nodeStrokeWidth() {\n      return 1 / this.stageScale.x;\n    },\n    dashEnabled() {\n      if (this.isSelected) {\n        return true;\n      }\n      return false;\n    },\n    dashSize() {\n      const dashBaseSize = 3;\n      return dashBaseSize / this.stageScale.x;\n    },\n    isFocused() {\n      if (this.isSelected && this.editingEnabled) {\n        return true;\n      }\n      return false;\n    },\n    getNodeDragBoundFunc() {\n      const dragBoundFunc = (pos) => {\n        const imagePos = this.imageNode.absolutePosition();\n        const imageAttr = this.imageNode.getAttrs();\n        // Get drag bounds with image node\n        const minX = imagePos.x;\n        const maxX = (imagePos.x + (imageAttr.width * this.stageScale.x));\n        const minY = imagePos.y;\n        const maxY = (imagePos.y + (imageAttr.height * this.stageScale.y));\n        // Override box position\n        const x = Math.max(minX, Math.min(pos.x, maxX));\n        const y = Math.max(minY, Math.min(pos.y, maxY));\n        return {\n          x,\n          y,\n        };\n      };\n      return dragBoundFunc;\n    },\n    getPolygonDragBoundFunc() {\n      const dragBoundFunc = (pos) => {\n        // TODO: sometimes this sets points to floats or negative\n        const imagePos = this.imageNode.absolutePosition();\n        const imageAttr = this.imageNode.getAttrs();\n        // Get drag bounds with image node\n        const minX = imagePos.x;\n        const maxX = (imagePos.x + (imageAttr.width * this.stageScale.x));\n        const minY = imagePos.y;\n        const maxY = (imagePos.y + (imageAttr.height * this.stageScale.y));\n        // Override polygon position\n        let x = parseInt(pos.x);\n        let y = parseInt(pos.y);\n        if (minX - pos.x > (this.minXPoint * this.stageScale.x)) {\n          x = parseInt(minX - this.minXPoint * this.stageScale.x);\n        }\n        if (maxX - pos.x < (this.maxXPoint * this.stageScale.x)) {\n          x = parseInt(maxX - (this.maxXPoint * this.stageScale.x));\n        }\n        if (minY - pos.y > (this.minYPoint * this.stageScale.y)) {\n          y = parseInt(minY - this.minYPoint * this.stageScale.y);\n        }\n        if (maxY - pos.y < (this.maxYPoint * this.stageScale.y)) {\n          y = parseInt(maxY - (this.maxYPoint * this.stageScale.y));\n        }\n        return {\n          x,\n          y,\n        };\n      };\n      return dragBoundFunc;\n    },\n  },\n  watch: {\n    getNodeDragBoundFunc: {\n      immediate: true,\n      handler(newFunc) {\n        this.nodeDragBoundFunc = newFunc;\n      },\n    },\n    getPolygonDragBoundFunc: {\n      immediate: true,\n      handler(newFunc) {\n        this.polygonDragBoundFunc = newFunc;\n      },\n    },\n    polygon: {\n      deep: true,\n      immediate: true,\n      handler() {\n        this.internalPolygon = this.polygon;\n      },\n    },\n  },\n  methods: {\n    updatePoints(points) {\n      const polygon = JSON.stringify([[this.convertPixelArrayToRatioArray(points)]]);\n      this.$emit('update:polygon', polygon);\n      this.$emit('transformed');\n    },\n    updatePointsV2(points, index) {\n      const parsedInteralPolygon = JSON.parse(this.internalPolygon);\n      parsedInteralPolygon[index] = this.convertPixelArrayToRatioArrayV2(points);\n      this.internalPolygon = JSON.stringify(parsedInteralPolygon);\n      this.$emit('update:polygon', this.internalPolygon);\n      this.$emit('transformed');\n    },\n    convertPixelArrayToRatioArray(pixelArray) {\n      const ratioArray = new Array(pixelArray.length);\n      for (let i = 0; i < ratioArray.length; i += 1) {\n        if (i % 2 === 0) {\n          ratioArray[i] = pixelArray[i] / this.imageDimensions.width;\n        } else {\n          ratioArray[i] = pixelArray[i] / this.imageDimensions.height;\n        }\n      }\n      return ratioArray;\n    },\n    convertPixelArrayToRatioArrayV2(pixelArray) {\n      const ratioArray = [];\n      for (let i = 0; i < pixelArray.length; i += 2) {\n        ratioArray.push([pixelArray[i] / this.imageDimensions.width, pixelArray[i + 1] / this.imageDimensions.height]);\n      }\n      return ratioArray;\n    },\n    convertRatioArrayToPixelArray(ratioArray) {\n      if (!this.imageDimensions || !ratioArray) return null;\n\n      const pixelArray = new Array(ratioArray.length);\n      for (let i = 0; i < ratioArray.length; i += 1) {\n        if (i % 2 === 0) {\n          pixelArray[i] = ratioArray[i] * this.imageDimensions.width;\n        } else {\n          pixelArray[i] = ratioArray[i] * this.imageDimensions.height;\n        }\n      }\n      return pixelArray;\n    },\n    convertRatioArrayToPixelArrayV2(ratioArray2D) {\n      if (!this.imageDimensions || !ratioArray2D) return null;\n      const pixelArray2D = new Array(ratioArray2D.length);\n      for (let i = 0; i < pixelArray2D.length; i += 1) {\n        const flatten = ratioArray2D[i].flat();\n        const pixelArray = new Array(flatten.length);\n        for (let j = 0; j < flatten.length; j += 1) {\n          if (j % 2 === 0) {\n            pixelArray[j] = flatten[j] * this.imageDimensions.width;\n          } else {\n            pixelArray[j] = flatten[j] * this.imageDimensions.height;\n          }\n        }\n        pixelArray2D[i] = pixelArray;\n      }\n      return pixelArray2D;\n    },\n    handleMouseover(e) {\n      if (this.isAnnotating) { this.$emit('polygon-mouseover-while-annotating', e); return; }\n      this.isMouseOver = true;\n\n      if (!this.isSelected) {\n        this.stageNode.container().style.cursor = \"pointer\";\n      } else {\n        if (!this.editingEnabled) {\n          this.stageNode.container().style.cursor = \"pointer\";\n        }\n        // else {\n        //   this.stageNode.container().style.cursor = \"pointer\";\n        // }\n      }\n    },\n    handleMouseout(e) {\n      if (this.isAnnotating) { this.$emit('polygon-mouseout-while-annotating', e); return; }\n      this.isMouseOver = false;\n      this.stageNode.container().style.cursor = null;\n    },\n    handleNodeMouseover() {\n      this.stageNode.container().style.cursor = \"move\";\n    },\n    handleNodeMouseout() {\n      this.stageNode.container().style.cursor = null;\n    },\n    handleShapeClick(e) {\n      if (this.isAnnotating) { this.$emit('polygon-clicked-while-annotating', e); return; }\n      e.cancelBubble = true;\n      this.$emit('shape-selected');\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","<template>\n  <template v-if=\"pending && !pendingSelected\">\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        fill: fill,\n        opacity: opacity,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n      }\"\n      @pointerclick=\"$emit('pointerclick', $event)\"\n      @mouseover=\"handleMouseover\"\n      @mouseout=\"handleMouseout\"\n    />\n    <!-- Dashed line -->\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        stroke: 'white',\n        opacity: 0.875,\n        strokeWidth: strokeWidth * 1.5,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n      }\"\n    />\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        stroke: '#250E81',\n        opacity: 0.875,\n        strokeWidth: strokeWidth * 1.5,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n        dash: [dashSize, dashSize],\n        dashEnabled: true,\n      }\"\n    />\n  </template>\n  <template v-else-if=\"pending && pendingSelected\">\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        fill: fill,\n        opacity: opacity,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n      }\"\n      @pointerclick=\"$emit('pointerclick', $event)\"\n      @mouseover=\"handleMouseover\"\n      @mouseout=\"handleMouseout\"\n    />\n    <!-- Selected line -->\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        stroke: 'white',\n        opacity: 1,\n        strokeWidth: strokeWidth * 1.5 * 3,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n      }\"\n    />\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        stroke: '#250E81',\n        opacity: 1,\n        strokeWidth: strokeWidth * 1.5 * 2,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n      }\"\n    />\n    <v-line\n      ref=\"line\"\n      :config=\"{\n        identifier: identifier,\n        points: localPoints,\n        stroke: 'white',\n        opacity: 1,\n        strokeWidth: strokeWidth * 1.5,\n        isFocused: isFocused,\n        isDragging: false,\n        closed: closed,\n        scaleX: scaleX,\n        scaleY: scaleX,\n      }\"\n    />\n  </template>\n  <v-line\n    v-else\n    ref=\"line\"\n    :config=\"{\n      identifier: identifier,\n      points: localPoints,\n      fill: fill,\n      stroke: stroke,\n      opacity: opacity,\n      strokeWidth: strokeWidth,\n      isFocused: isFocused,\n      isDragging: false,\n      closed: closed,\n      scaleX: scaleX,\n      scaleY: scaleX,\n      dash: [dashSize, dashSize],\n      dashEnabled: true,\n    }\"\n    @pointerclick=\"$emit('pointerclick', $event)\"\n    @mouseover=\"handleMouseover\"\n    @mouseout=\"handleMouseout\"\n  />\n  <template v-if=\"isFocused && !isDragging\">\n    <v-circle\n      v-for=\"(c, index) in getPolygonCoordinates(localPoints)\"\n      :key=\"index\"\n      :config=\"{\n        x: c.x,\n        y: c.y,\n        radius: nodeRadius,\n        fill: nodeFill,\n        stroke: nodeStroke,\n        strokeWidth: nodeStrokeWidth,\n        draggable: true,\n        dragBoundFunc: nodeDragBoundFunc,\n      }\"\n      :opacity=\"1\"\n      @dragmove=\"handleVertexDragmove($event, index)\"\n      @mouseover=\"handleNodeMouseover\"\n      @mouseout=\"handleNodeMouseout\"\n    />\n  </template>\n</template>\n\n<script>\nimport { debounce } from '@/assets/js/utils.js';\n\nexport default {\n  name: 'Polygon',\n  props: {\n    identifier: {\n      type: [String, Number],\n      default: '',\n    },\n    imageDimensions: {\n      type: Object,\n      default: null,\n    },\n    points: {\n      type: Array,\n      default: () => [],\n    },\n    fill: {\n      type: String,\n      default: '#FF0000',\n    },\n    opacity: {\n      type: Number,\n      default: 0.4,\n    },\n    stroke: {\n      type: String,\n      default: '#FF0000',\n    },\n    strokeWidth: {\n      type: Number,\n      default: 4,\n    },\n    nodeFill: {\n      type: String,\n      default: 'white',\n    },\n    nodeStroke: {\n      type: String,\n      default: 'blue',\n    },\n    nodeStrokeWidth: {\n      type: Number,\n      default: 1,\n    },\n    closed: {\n      type: Boolean,\n      default: true,\n    },\n    draggable: {\n      type: Boolean,\n      default: true,\n    },\n    scaleX: {\n      type: Number,\n      default: 1,\n    },\n    scaleY: {\n      type: Number,\n      default: 1,\n    },\n    nodeRadius: {\n      type: Number,\n      default: 7,\n    },\n    isFocused: {\n      type: Boolean,\n      default: false,\n    },\n    dashEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    dashSize: {\n      type: Number,\n      default: 1,\n    },\n    nodeDragBoundFunc: {\n      type: Function,\n      default: null,\n    },\n    polygonDragBoundFunc: {\n      type: Function,\n      default: null,\n    },\n    pending: {\n      type: Boolean,\n      default: false,\n    },\n    pendingSelected: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'polygon-drag-end', 'polygon-drag-move', 'update:points', 'mouseover', 'mouseout', 'pointerclick', 'node-mouseover', 'node-mouseout',\n  ],\n  data() {\n    return {\n      localPoints: [],\n      isDragging: false,\n    };\n  },\n  computed: {\n    debounceUpdatePoints() {\n      return debounce((e) => { this.updatePoints(e); }, 50);\n    },\n  },\n  watch: {\n    points: {\n      deep: true,\n      handler(newPoints) {\n        this.localPoints = [...newPoints];\n      },\n    },\n  },\n  mounted() {\n    this.localPoints = [...this.points];\n  },\n  methods: {\n    handleMouseover(e) {\n      this.$emit('mouseover', e);\n    },\n    handleMouseout(e) {\n      this.$emit('mouseout', e);\n    },\n    handleNodeMouseover(e) {\n      this.$emit('node-mouseover', e);\n    },\n    handleNodeMouseout(e) {\n      this.$emit('node-mouseout', e);\n    },\n    getPolygonCoordinates(points) {\n      const xyArray = [];\n      let id = 1;\n      for (let i = 0; i < points.length; i += 2) {\n        const point = {\n          x: points[i],\n          y: points[i + 1],\n          id: `${id}`,\n        };\n        xyArray.push(point);\n        id += 1;\n      }\n      return xyArray;\n    },\n    updatePoints() {\n      this.$emit('update:points', this.localPoints);\n    },\n    handleVertexDragmove(e, cID) {\n      this.localPoints[cID * 2] = e.target.attrs.x;\n      this.localPoints[cID * 2 + 1] = e.target.attrs.y;\n      this.debounceUpdatePoints(this.localPoints);\n    },\n    // TODO: implement dragmove with bounds: https://konvajs.org/docs/drag_and_drop/Complex_Drag_and_Drop.html\n    handlePolygonDragmove(e) {\n      this.isDragging = true;\n      this.$emit('polygon-drag-move');\n    },\n    handlePolygonDragend(e) {\n      const points = e.target.points();\n      const transform = e.target.getTransform();\n      this.isDragging = false;\n\n      // Transform the points\n      let transformedPoints = [];\n      for (let i = 0; i < points.length; i += 2) {\n        const point = {\n          x: parseInt(points[i]),\n          y: parseInt(points[i + 1]),\n        };\n        transformedPoints.push(transform.point(point));\n      }\n\n      // Prevent transform from causing overflowing of the image dimensions\n      const minX = Math.min(...transformedPoints.map((p) => p.x));\n      const maxX = Math.max(...transformedPoints.map((p) => p.x));\n      const minY = Math.min(...transformedPoints.map((p) => p.y));\n      const maxY = Math.max(...transformedPoints.map((p) => p.y));\n      if (minX < 0) {\n        transformedPoints = transformedPoints.map((p) => ({ x: p.x - minX, y: p.y }));\n      }\n      if (maxX > this.imageDimensions.width) {\n        transformedPoints = transformedPoints.map((p) => ({ x: p.x - (maxX - this.imageDimensions.width), y: p.y }));\n      }\n      if (minY < 0) {\n        transformedPoints = transformedPoints.map((p) => ({ x: p.x, y: p.y - minY }));\n      }\n      if (maxY > this.imageDimensions.height) {\n        transformedPoints = transformedPoints.map((p) => ({ x: p.x, y: p.y - (maxY - this.imageDimensions.height) }));\n      }\n\n      // Create new polygon point array from the transformed points\n      const newPoints = [];\n      for (const val of transformedPoints) {\n        newPoints.push(val.x);\n        newPoints.push(val.y);\n      }\n\n      // Set new polygon points, reset the transformed position and scale\n      this.localPoints = newPoints.map((p) => parseInt(p));\n      e.target.position({ x: 0, y: 0 });\n      e.target.scale({ x: 1, y: 1 });\n      this.$emit('update:points', this.localPoints);\n      this.$emit('polygon-drag-end');\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { render } from \"./Polygon.vue?vue&type=template&id=6734c410\"\nimport script from \"./Polygon.vue?vue&type=script&lang=js\"\nexport * from \"./Polygon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./KonvaSegmentationPolygon.vue?vue&type=template&id=f0887dfa\"\nimport script from \"./KonvaSegmentationPolygon.vue?vue&type=script&lang=js\"\nexport * from \"./KonvaSegmentationPolygon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-rect\n    v-if=\"isHighlighting\"\n    ref=\"annotationBox\"\n    :config=\"{\n      identifier: identifier,\n      type: 'box',\n      name: name,\n      x: convertedBox.x,\n      y: convertedBox.y,\n      width: convertedBox.width,\n      height: convertedBox.height,\n      fill: fillColor,\n      opacity: 0.325,\n      stroke: color,\n      strokeWidth: 1.325 * borderWidth,\n      shadowEnabled: isHighlighting,\n      shadowColor: 'black',\n      shadowBlur: 3,\n      shadowOffset: { x: 1, y: 1 },\n      shadowOpacity: 1,\n    }\"\n  />\n  <v-rect\n    ref=\"annotationBox\"\n    :config=\"{\n      identifier: identifier,\n      type: 'box',\n      name: name,\n      x: convertedBox.x,\n      y: convertedBox.y,\n      width: convertedBox.width,\n      height: convertedBox.height,\n      fill: fillColor,\n      opacity: 1,\n      stroke: color,\n      strokeWidth: borderWidth,\n      draggable: draggable,\n      dragBoundFunc: dragBoundFunc,\n      dash: [dashSize, dashSize / 1.5],\n      dashEnabled: dashEnabled,\n    }\"\n    @dragstart=\"handleDragStart\"\n    @dragend=\"handleZoneTransformEnd($event)\"\n    @dragmove=\"isBusy = true\"\n    @transformend=\"handleZoneTransformEnd($event)\"\n    @transform=\"isBusy = true\"\n    @pointerclick=\"handleBoxClick($event)\"\n    @mouseover=\"handleMouseover\"\n    @mouseout=\"handleMouseout\"\n    @mousedown=\"handleMousedown\"\n    @mouseup=\"handleMouseup\"\n  />\n  <KonvaTransformer\n    ref=\"transformer\"\n    :nodes=\"isSelected && node ? [node] : []\"\n    :imageNode=\"imageNode\"\n    :stageScale=\"stageScale\"\n    :rotateEnabled=\"false\"\n    :resizeEnabled=\"editingEnabled\"\n    :keepRatio=\"false\"\n    :borderStrokeWidth=\"3\"\n    :borderStroke=\"color\"\n    :borderDash=\"transformerDashSize\"\n    @dragstart=\"(e) => e.cancelBubble = true\"\n    @dragend=\"(e) => e.cancelBubble = true\"\n    @dragmove=\"(e) => e.cancelBubble = true\"\n    @transformend=\"(e) => e.cancelBubble = true\"\n    @transform=\"(e) => e.cancelBubble = true\"\n    @pointerclick=\"(e) => e.cancelBubble = true\"\n    @mouseover=\"(e) => e.cancelBubble = true\"\n    @mouseout=\"(e) => e.cancelBubble = true\"\n    @mousedown=\"(e) => e.cancelBubble = true\"\n    @mouseup=\"(e) => e.cancelBubble = true\"\n  />\n  <v-label\n    v-if=\"displayLabelTag\"\n    :config=\"{\n      x: convertedBox.x - (borderWidth / 2),\n      y: convertedBox.y - (18 / stageScale.x),\n      width: 20,\n      height: 10,\n      fill: color,\n    }\"\n  >\n    <v-tag\n      :config=\"{\n        fill: color,\n      }\"\n    />\n    <v-text\n      :config=\"{\n        text: name,\n        fill: 'white',\n        fontSize: 16 / stageScale.x,\n        stroke: 'black',\n        strokeWidth: 0.4 / stageScale.x,\n        fontFamily: 'Open Sans',\n        fontStyle: 'bold',\n        padding: 2 / stageScale.x,\n      }\"\n    />\n  </v-label>\n</template>\n\n<script>\nimport { roundNumber } from '@/assets/js/utils.js';\nimport KonvaTransformer from './KonvaTransformer.vue';\n\nexport default {\n  name: 'AnnotationBox',\n  components: {\n    KonvaTransformer,\n  },\n  props: {\n    identifier: {\n      type: [String, Number],\n      default: '',\n    },\n    name: {\n      type: String,\n      default: '',\n    },\n    displayLabelTag: {\n      type: Boolean,\n      default: false,\n    },\n    x: {\n      type: Number,\n      default: 0,\n    },\n    y: {\n      type: Number,\n      default: 0,\n    },\n    width: {\n      type: Number,\n      default: 0,\n    },\n    height: {\n      type: Number,\n      default: 0,\n    },\n    fillColor: {\n      type: String,\n      default: '',\n    },\n    isSelected: {\n      type: Boolean,\n      default: false,\n    },\n    isHighlighting: {\n      type: Boolean,\n      default: false,\n    },\n    imageDimensions: {\n      type: Object,\n      default: () => ({ width: 100, height: 100 }),\n    },\n    stageNode: {\n      type: Object,\n      default: () => {},\n    },\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    imageNode: {\n      type: Object,\n      default: () => {},\n    },\n    color: {\n      type: String,\n      default: '#EFC15F',\n    },\n    isAnnotating: {\n      type: Boolean,\n      default: false,\n    },\n    dashEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    editingEnabled: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'shape-selected',\n    'update:x',\n    'update:y',\n    'update:width',\n    'update:height',\n    'transformed',\n    'box-clicked-while-annotating',\n    'box-mouseover-while-annotating',\n    'box-mouseout-while-annotating',\n  ],\n  data() {\n    return {\n      node: null,\n      isBusy: false,\n      isMouseOver: false,\n    };\n  },\n  computed: {\n    draggable() {\n      if (!this.editingEnabled || this.isAnnotating) {\n        return false;\n      }\n      return true;\n    },\n    convertedBox() {\n      return this.convertNormalilzedToPixels(this.x, this.y, this.width, this.height);\n    },\n    borderWidth() {\n      if (this.isSelected && this.editingEnabled) {\n        return 0;\n      }\n      if (this.isHighlighting) {\n        return 5 / this.stageScale.x;\n      }\n      return 4 / this.stageScale.x;\n    },\n    dragBoundFunc() {\n      const dragBoundFunc = (pos) => {\n        const imagePos = this.imageNode.absolutePosition();\n        const imageAttr = this.imageNode.getAttrs();\n        const boxAttr = this.node.getAttrs();\n        // Get drag bounds with image node\n        const minX = imagePos.x;\n        const maxX = (imagePos.x + ((imageAttr.width - boxAttr.width) * this.stageScale.x));\n        const minY = imagePos.y;\n        const maxY = (imagePos.y + ((imageAttr.height - boxAttr.height) * this.stageScale.y));\n        // Override box position\n        const x = Math.max(minX, Math.min(pos.x, maxX));\n        const y = Math.max(minY, Math.min(pos.y, maxY));\n        return {\n          x,\n          y,\n        };\n      };\n      return dragBoundFunc;\n    },\n    dashSize() {\n      const dashBaseSize = 5;\n      const dashMaxSize = 10;\n\n      let dashSize = dashBaseSize / this.stageScale.x;\n      const minDimension = Math.min(this.convertedBox.width, this.convertedBox.height);\n      if (minDimension * this.stageScale.x < dashSize * 2) {\n        dashSize = minDimension / 2;\n      }\n      dashSize = Math.min(dashSize, dashMaxSize);\n      return dashSize;\n    },\n    transformerDashSize() {\n      if (this.dashEnabled) {\n        return [this.dashSize * this.stageScale.x, this.dashSize * this.stageScale.x];\n      }\n      if (!this.editingEnabled && this.isSelected) {\n        return [8 * this.stageScale.x, 4 * this.stageScale.x];\n      }\n      return null;\n    },\n  },\n  mounted() {\n    this.node = this.$refs.annotationBox.getNode();\n  },\n  methods: {\n    handleZoneTransformEnd(e) {\n      e.cancelBubble = true;\n      const target = e.target;\n      const transform = e.target.getTransform().decompose();\n      const normalizedDimensions = this.convertPixelsToNormalized(target.x(), target.y(), target.width() * transform.scaleX, target.height() * transform.scaleY);\n      this.$emit('update:x', roundNumber(normalizedDimensions.x, 3));\n      this.$emit('update:y', roundNumber(normalizedDimensions.y, 3));\n      this.$emit('update:width', roundNumber(normalizedDimensions.width, 3));\n      this.$emit('update:height', roundNumber(normalizedDimensions.height, 3));\n      this.$emit('transformed');\n      this.isBusy = false;\n      target.scale({ x: 1, y: 1 });\n    },\n    handleDragStart(e) {\n      if (this.editingEnabled) {\n        this.stageNode.container().style.cursor = \"grabbing\";\n      }\n      e.cancelBubble = true;\n    },\n    handleMouseover(e) {\n      if (this.isAnnotating) { this.$emit('box-mouseover-while-annotating', e); return; }\n      this.isMouseOver = true;\n\n      if (!this.isSelected) {\n        this.stageNode.container().style.cursor = \"pointer\";\n      } else {\n        if (this.editingEnabled) {\n          this.stageNode.container().style.cursor = \"grab\";\n        } else {\n          this.stageNode.container().style.cursor = \"pointer\";\n        }\n      }\n    },\n    handleMouseout(e) {\n      if (this.isAnnotating) { this.$emit('box-mouseout-while-annotating', e); return; }\n      this.isMouseOver = false;\n      this.stageNode.container().style.cursor = null;\n    },\n    handleMousedown(e) {\n      if (this.isAnnotating) { return; }\n      if (e.evt.button === 0 && !e.evt.ctrlKey) {\n        if (this.editingEnabled) {\n          this.stageNode.container().style.cursor = \"grabbing\";\n        }\n      }\n    },\n    handleMouseup() {\n      if (this.isAnnotating) { return; }\n      if (this.isMouseOver && !this.isSelected) {\n        this.stageNode.container().style.cursor = \"pointer\";\n      } else if (this.isMouseOver && this.isSelected) {\n        if (this.editingEnabled) {\n          this.stageNode.container().style.cursor = \"grab\";\n        }\n      } else {\n        this.stageNode.container().style.cursor = null;\n      }\n    },\n    handleBoxClick(e) {\n      if (this.isAnnotating) { this.$emit('box-clicked-while-annotating', e); return; }\n      e.cancelBubble = true;\n      this.$emit('shape-selected');\n    },\n    convertNormalilzedToPixels(x, y, width, height) {\n      // Box dimensions\n      const newX = Math.round((x) * this.imageDimensions.width);\n      const newY = Math.round((y) * this.imageDimensions.height);\n      const newWidth = Math.round(width * this.imageDimensions.width);\n      const newHeight = Math.round(height * this.imageDimensions.height);\n      return {\n        x: newX, y: newY, width: newWidth, height: newHeight,\n      };\n    },\n    convertPixelsToNormalized(x, y, width, height) {\n      // Box dimensions\n      const newX = x / this.imageDimensions.width;\n      const newY = y / this.imageDimensions.height;\n      const newWidth = width / this.imageDimensions.width;\n      const newHeight = height / this.imageDimensions.height;\n      return {\n        x: newX, y: newY, width: newWidth, height: newHeight,\n      };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import { render } from \"./AnnotationBox.vue?vue&type=template&id=565b223d\"\nimport script from \"./AnnotationBox.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationBox.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-circle\n    v-for=\"(c, index) in clicks\"\n    :key=\"index\"\n    :config=\"{\n      x: c.x,\n      y: c.y,\n      radius: nodeRadius,\n      fill: getNodeFill(c),\n      stroke: nodeStroke,\n      strokeWidth: nodeStrokeWidth,\n      draggable: false,\n    }\"\n    :opacity=\"1\"\n  />\n</template>\n\n<script>\n\nexport default {\n  name: 'SAMClickPoint',\n  props: {\n    clicks: {\n      type: Array,\n      default: () => [],\n    },\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n  },\n  emits: [],\n  data() {\n    return {\n    };\n  },\n  computed: {\n    nodeRadius() {\n      return 5 / this.stageScale.x;\n    },\n    nodeStroke() {\n      return 'blue';\n    },\n    nodeStrokeWidth() {\n      return 1 / this.stageScale.x;\n    },\n  },\n  methods: {\n    getNodeFill(click) {\n      if (click.clickType === 0) {\n        return '#FF1744';\n      }\n      return '#00E676';\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { render } from \"./SAMClickPoint.vue?vue&type=template&id=35f4147c\"\nimport script from \"./SAMClickPoint.vue?vue&type=script&lang=js\"\nexport * from \"./SAMClickPoint.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-rect\n    ref=\"samSelectBox\"\n    :config=\"{\n      fill: 'transparent',\n      stroke: 'white',\n      strokeWidth: strokeWidth,\n      visible: false\n    }\"\n  />\n</template>\n\n<script>\nimport { debounce } from '@/assets/js/utils.js';\nimport useSAMCanvas from '@/composables/canvas/useSAMCanvas.js';\n\nexport default {\n  name: 'SAMSelectBox',\n  props: {\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    stageNode: {\n      type: Object,\n      default: () => {},\n    },\n    imageNode: {\n      type: Object,\n      default: () => {},\n    },\n    samBoxActive: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: ['sam-box-dimensions-changed'],\n  setup(props, ctx) {\n    const { SAMEventBus } = useSAMCanvas();\n    return { SAMEventBus };\n  },\n  data() {\n    return {\n      samSelectBoxNode: null,\n    };\n  },\n  computed: {\n    boxDimensions() {\n      if (this.samSelectBoxNode && this.samSelectBoxNode.getAttrs().visible) {\n        return {\n          x1: this.samSelectBoxNode.x(),\n          y1: this.samSelectBoxNode.y(),\n          x2: this.samSelectBoxNode.x() + this.samSelectBoxNode.width(),\n          y2: this.samSelectBoxNode.y() + this.samSelectBoxNode.height(),\n        };\n      }\n      return null;\n    },\n    debounceHandleBoxDimensionsChanged() {\n      return debounce(() => { this.handleBoxDimensionsChanged(); }, 50);\n    },\n    strokeWidth() {\n      return 2 / this.stageScale.x;\n    },\n  },\n  watch: {\n    boxDimensions() {\n      this.debounceHandleBoxDimensionsChanged();\n    },\n  },\n  mounted() {\n    this.SAMEventBus.on(this.SAMEventListener);\n    this.samSelectBoxNode = this.$refs.samSelectBox.getNode();\n    this.setUpStageMouseEvents();\n  },\n  unmounted() {\n    const stage = this.stageNode;\n    stage.off('mousedown touchstart');\n    stage.off('mousemove touchmove');\n    stage.off('mouseup touchend');\n  },\n  methods: {\n    SAMEventListener(event) {\n      switch (event) {\n      case 'reset':\n        this.reset();\n        break;\n      default:\n      }\n    },\n    handleBoxDimensionsChanged() {\n      this.$emit('sam-box-dimensions-changed', this.boxDimensions);\n    },\n    setUpStageMouseEvents() {\n      const stage = this.stageNode;\n      const konvaImage = this.imageNode;\n      const selectionRectangle = this.samSelectBoxNode;\n      let mousedown = false;\n      let x1; let y1; let x2; let y2;\n\n      stage.on('mousedown touchstart', (e) => {\n        // Do nothing if we mousedown on any shape\n        // if (this.editingEnabled && !this.isAnnotating && e.target !== stage && e.target !== konvaImage) {\n        //   return;\n        // }\n\n        if (!this.samBoxActive) return;\n\n        // Only do selection if left mouse button pressed with ctrl key not held\n        if (e.evt.button === 0 && !e.evt.ctrlKey) {\n          this.stageNode.setAttr('draggable', false);\n        } else {\n          return;\n        }\n\n        e.evt.preventDefault();\n        mousedown = true;\n        x1 = stage.getRelativePointerPosition().x;\n        y1 = stage.getRelativePointerPosition().y;\n        x2 = stage.getRelativePointerPosition().x;\n        y2 = stage.getRelativePointerPosition().y;\n\n        selectionRectangle.visible(true);\n        selectionRectangle.width(0);\n        selectionRectangle.height(0);\n      });\n\n      stage.on('mousemove touchmove', (e) => {\n        if (!this.samBoxActive) return;\n\n        if (mousedown) {\n          e.evt.preventDefault();\n          x2 = stage.getRelativePointerPosition().x;\n          y2 = stage.getRelativePointerPosition().y;\n          selectionRectangle.setAttrs({\n            x: Math.min(x1, x2),\n            y: Math.min(y1, y2),\n            width: Math.abs(x2 - x1),\n            height: Math.abs(y2 - y1),\n          });\n        }\n      });\n\n      stage.on('mouseup touchend', (e) => {\n        if (!this.samBoxActive) return;\n\n        mousedown = false;\n        // Allow image to be dragged again now that selection is complete\n        this.stageNode.setAttr('draggable', true);\n      });\n    },\n    reset() {\n      this.samSelectBoxNode.visible(false);\n      this.samSelectBoxNode.width(0);\n      this.samSelectBoxNode.height(0);\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { render } from \"./SAMSelectBox.vue?vue&type=template&id=46926a8b\"\nimport script from \"./SAMSelectBox.vue?vue&type=script&lang=js\"\nexport * from \"./SAMSelectBox.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-circle\n    v-for=\"(c, index) in clicks\"\n    :key=\"index\"\n    :config=\"{\n      x: c.x,\n      y: c.y,\n      radius: nodeRadius,\n      fill: getNodeFill(c),\n      stroke: nodeStroke,\n      strokeWidth: nodeStrokeWidth,\n      draggable: false,\n    }\"\n    :opacity=\"1\"\n  />\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useSAM2Store } from '@/stores/useSAM2Store.js';\n\n// Props\nconst props = defineProps({\n  stageScale: {\n    type: Object,\n    default: () => ({ x: 1, y: 1 }),\n  },\n  imageId: {\n    type: Number,\n    default: null,\n  },\n});\n\nconst sam2Store = useSAM2Store();\nconst {\n  sam2Options,\n} = storeToRefs(sam2Store);\n\nconst clicks = computed(() => {\n  const allClicks = sam2Options.value.params.clicks;\n  const filteredClicks = allClicks.filter((c) => c.imageId && c.imageId === props.imageId);\n  return filteredClicks;\n});\nconst nodeRadius = computed(() => 5 / props.stageScale.x);\nconst nodeStroke = computed(() => 'blue');\nconst nodeStrokeWidth = computed(() => 1 / props.stageScale.x);\n\nconst getNodeFill = (click) => (click.clickType === 0 ? '#FF1744' : '#00E676');\n</script>\n\n<style>\n\n</style>\n","import script from \"./SAM2ClickPoint.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SAM2ClickPoint.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <v-rect\n    ref=\"samSelectBox\"\n    :config=\"{\n      fill: 'transparent',\n      stroke: 'white',\n      strokeWidth: strokeWidth,\n      visible: false\n    }\"\n  />\n</template>\n\n<script setup>\nimport {\n  ref, computed, watch, onMounted, onUnmounted,\n} from 'vue';\nimport { debounce } from '@/assets/js/utils.js';\nimport useSAMCanvas from '@/composables/canvas/useSAMCanvas.js';\nimport { useSAM2Store } from '@/stores/useSAM2Store.js';\nimport { storeToRefs } from 'pinia';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\n\n// Props\nconst props = defineProps({\n  stageScale: {\n    type: Object,\n    default: () => ({ x: 1, y: 1 }),\n  },\n  stageNode: {\n    type: Object,\n    default: () => {},\n  },\n  imageNode: {\n    type: Object,\n    default: () => {},\n  },\n  imageId: {\n    type: Number,\n    default: null,\n  },\n});\n\n// Composables\nconst { SAMEventBus } = useSAMCanvas();\nconst sam2Store = useSAM2Store();\nconst {\n  sam2Options,\n  selectedObject,\n  initStartFrame,\n} = storeToRefs(sam2Store);\n\nconst visualizationStore = useViewerVisualizationsStore();\nconst {\n  samples,\n  frame,\n} = storeToRefs(visualizationStore);\n\n// Refs\nconst samSelectBox = ref(null);\nconst samSelectBoxNode = ref(null);\n\n// Computed properties\nconst strokeWidth = computed(() => 2 / props.stageScale.x);\n\nconst boxDimensions = computed(() => {\n  if (samSelectBoxNode.value && samSelectBoxNode.value.getAttrs().visible) {\n    return {\n      x1: samSelectBoxNode.value.x(),\n      y1: samSelectBoxNode.value.y(),\n      x2: samSelectBoxNode.value.x() + samSelectBoxNode.value.width(),\n      y2: samSelectBoxNode.value.y() + samSelectBoxNode.value.height(),\n    };\n  }\n  return null;\n});\n\nconst boxObjDimensions = computed(() => sam2Options.value.params.box);\nwatch(boxObjDimensions, () => {\n  if (boxObjDimensions.value.length === 0) {\n    const selectionRectangle = samSelectBoxNode.value;\n    selectionRectangle.visible(false);\n  }\n});\n\n// Lifecycle hooks\nonMounted(() => {\n  SAMEventBus.value.on(SAMEventListener);\n  samSelectBoxNode.value = samSelectBox.value.getNode();\n  setUpStageMouseEvents();\n});\n\nonUnmounted(() => {\n  const stage = props.stageNode;\n  stage.off('mousedown touchstart');\n  stage.off('mousemove touchmove');\n  stage.off('mouseup touchend');\n});\n\n// Methods\nfunction SAMEventListener(event) {\n  if (event === 'reset') {\n    reset();\n  }\n}\n\nfunction handleBoxDimensionsChanged() {\n  if (boxDimensions.value) {\n    sam2Options.value.params.box = [\n      boxDimensions.value.x1,\n      boxDimensions.value.y1,\n      boxDimensions.value.x2,\n      boxDimensions.value.y2,\n    ];\n\n    sam2Options.value.params.boxes = sam2Options.value.params.boxes.filter((box) => box.obj_id !== selectedObject.value);\n    sam2Options.value.params.boxes.push({\n      obj_id: selectedObject.value,\n      imageId: props.imageId,\n      frame_idx: frame.value - initStartFrame.value,\n      box: [\n        boxDimensions.value.x1,\n        boxDimensions.value.y1,\n        boxDimensions.value.x2,\n        boxDimensions.value.y2,\n      ],\n    });\n  }\n}\n\nfunction setUpStageMouseEvents() {\n  const stage = props.stageNode;\n  const konvaImage = props.imageNode;\n  const selectionRectangle = samSelectBoxNode.value;\n  let mousedown = false;\n  let x1; let y1; let x2; let\n    y2;\n\n  stage.on('mousedown touchstart', (e) => {\n    if (e.evt.button === 0 && !e.evt.ctrlKey) {\n      props.stageNode.setAttr('draggable', false);\n    } else {\n      return;\n    }\n\n    e.evt.preventDefault();\n    mousedown = true;\n    x1 = stage.getRelativePointerPosition().x;\n    y1 = stage.getRelativePointerPosition().y;\n    x2 = x1;\n    y2 = y1;\n\n    selectionRectangle.visible(true);\n    selectionRectangle.width(0);\n    selectionRectangle.height(0);\n  });\n\n  stage.on('mousemove touchmove', (e) => {\n    if (!mousedown) return;\n\n    e.evt.preventDefault();\n    x2 = stage.getRelativePointerPosition().x;\n    y2 = stage.getRelativePointerPosition().y;\n    selectionRectangle.setAttrs({\n      x: Math.min(x1, x2),\n      y: Math.min(y1, y2),\n      width: Math.abs(x2 - x1),\n      height: Math.abs(y2 - y1),\n    });\n  });\n\n  stage.on('mouseup touchend', () => {\n    mousedown = false;\n    props.stageNode.setAttr('draggable', true);\n\n    handleBoxDimensionsChanged();\n  });\n}\n\nfunction reset() {\n  if (samSelectBoxNode.value) {\n    samSelectBoxNode.value.visible(false);\n    samSelectBoxNode.value.width(0);\n    samSelectBoxNode.value.height(0);\n  }\n}\n</script>\n\n<style>\n\n</style>\n","import script from \"./SAM2SelectBox.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SAM2SelectBox.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <v-rect\n    v-for=\"box in boxes\"\n    :key=\"box.obj_id\"\n    ref=\"samBoxes\"\n    :config=\"{\n      fill: 'transparent',\n      stroke: 'white',\n      strokeWidth: strokeWidth,\n      visible: true,\n      x: box.box[0],\n      y: box.box[1],\n      width: box.box[2] - box.box[0],\n      height: box.box[3] - box.box[1],\n    }\"\n  />\n</template>\n\n<script setup>\nimport {\n  ref, computed,\n} from 'vue';\nimport { useSAM2Store } from '@/stores/useSAM2Store.js';\nimport { storeToRefs } from 'pinia';\n\n// Props\nconst props = defineProps({\n  stageScale: {\n    type: Object,\n    default: () => ({ x: 1, y: 1 }),\n  },\n  imageId: {\n    type: Number,\n    default: null,\n  },\n});\n\n// Composables\nconst sam2Store = useSAM2Store();\nconst {\n  sam2Options,\n} = storeToRefs(sam2Store);\n\n// Computed properties\nconst strokeWidth = computed(() => 2 / props.stageScale.x);\n\nconst boxes = computed(() => {\n  const allBoxes = sam2Options.value.params.boxes;\n  const filteredBoxes = allBoxes.filter((b) => b.imageId && b.imageId === props.imageId);\n  return filteredBoxes;\n});\n\n</script>\n\n<style>\n\n</style>\n","import script from \"./SAM2Boxes.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SAM2Boxes.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <v-rect\n    ref=\"canvasSelectBox\"\n    :config=\"{\n      fill: 'rgba(0,0,255,0.25)',\n      strokeWidth: strokeWidth,\n      visible: false\n    }\"\n  />\n</template>\n\n<script>\nimport Konva from 'konva';\nimport { debounce } from '@/assets/js/utils.js';\n\nexport default {\n  name: 'CanvasSelectBox',\n  props: {\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    stageNode: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['update:selectedObjects', 'canvas-box-dimensions-changed'],\n  data() {\n    return {\n      canvasSelectBoxNode: null,\n    };\n  },\n  computed: {\n    boxDimensions() {\n      if (this.canvasSelectBoxNode && this.canvasSelectBoxNode.getAttrs().visible) {\n        return {\n          x1: this.canvasSelectBoxNode.x(),\n          y1: this.canvasSelectBoxNode.y(),\n          x2: this.canvasSelectBoxNode.x() + this.canvasSelectBoxNode.width(),\n          y2: this.canvasSelectBoxNode.y() + this.canvasSelectBoxNode.height(),\n        };\n      }\n      return null;\n    },\n    debounceHandleBoxDimensionsChanged() {\n      return debounce(() => { this.handleBoxDimensionsChanged(); }, 50);\n    },\n    strokeWidth() {\n      return 2 / this.stageScale.x;\n    },\n  },\n  watch: {\n    boxDimensions() {\n      this.debounceHandleBoxDimensionsChanged();\n    },\n  },\n  mounted() {\n    this.canvasSelectBoxNode = this.$refs.canvasSelectBox.getNode();\n    this.setUpStageMouseEvents();\n  },\n  unmounted() {\n    const stage = this.stageNode;\n    stage.off('mousedown touchstart');\n    stage.off('mousemove touchmove');\n    stage.off('mouseup touchend');\n  },\n  methods: {\n    handleBoxDimensionsChanged() {\n      this.$emit('canvas-box-dimensions-changed', this.boxDimensions);\n    },\n    setUpStageMouseEvents() {\n      const stage = this.stageNode;\n      const selectionRectangle = this.canvasSelectBoxNode;\n      let mousedown = false;\n      let x1; let y1; let x2; let y2;\n\n      stage.on('mousedown touchstart', (e) => {\n        mousedown = true;\n        // Do nothing if we mousedown on any shape\n        if (this.editingEnabled && !this.isAnnotating && e.target !== stage && e.target.getClassName() !== 'Image') {\n          return;\n        }\n        // Only do selection if left mouse button pressed with ctrl key not held\n        if (e.evt.button === 0 && !e.evt.ctrlKey) {\n          this.stageNode.setAttr('draggable', false);\n        } else {\n          return;\n        }\n        e.evt.preventDefault();\n        x1 = stage.getRelativePointerPosition().x;\n        y1 = stage.getRelativePointerPosition().y;\n        x2 = stage.getRelativePointerPosition().x;\n        y2 = stage.getRelativePointerPosition().y;\n\n        selectionRectangle.x(x1);\n        selectionRectangle.y(y1);\n        const box = selectionRectangle.getClientRect();\n        const shapes = stage.find((shape) => shape.getAttrs().identifier && Konva.Util.haveIntersection(box, shape.getClientRect()));\n\n        if (!selectionRectangle.attrs.visible && shapes.length === 0) {\n          selectionRectangle.visible(true);\n          selectionRectangle.width(0);\n          selectionRectangle.height(0);\n          selectionRectangle.zIndex(selectionRectangle.getParent().children.length - 1);\n        }\n      });\n\n      stage.on('mousemove touchmove', (e) => {\n        if (mousedown) {\n          this.isSelectionDragging = true;\n          e.evt.preventDefault();\n          x2 = stage.getRelativePointerPosition().x;\n          y2 = stage.getRelativePointerPosition().y;\n          if (selectionRectangle.attrs.visible) {\n            selectionRectangle.setAttrs({\n              x: Math.min(x1, x2),\n              y: Math.min(y1, y2),\n              width: Math.abs(x2 - x1),\n              height: Math.abs(y2 - y1),\n            });\n          }\n        }\n      });\n\n      stage.on('mouseup touchend', (e) => {\n        e.evt.preventDefault();\n        mousedown = false;\n\n        // update visibility in timeout, so we can check it in click event\n        setTimeout(() => {\n          selectionRectangle.visible(false);\n          selectionRectangle.x(0);\n          selectionRectangle.y(0);\n          selectionRectangle.width(0);\n          selectionRectangle.height(0);\n          selectionRectangle.zIndex(selectionRectangle.getParent().children.length - 1);\n        });\n\n        if (this.isSelectionDragging) {\n          const box = selectionRectangle.getClientRect();\n          if (selectionRectangle.attrs.visible) {\n            const shapes = stage.find((shape) => shape.getAttrs().identifier && Konva.Util.haveIntersection(box, shape.getClientRect()));\n            const selectedObjects = [];\n            selectedObjects.push(...shapes.map((shape) => shape.getAttrs().identifier));\n            this.$emit('update:selectedObjects', selectedObjects);\n          }\n        }\n\n        this.isSelectionDragging = false;\n\n        // Allow image to be dragged again now that selection is complete\n        this.stageNode.setAttr('draggable', true);\n      });\n    },\n    reset() {\n      this.canvasSelectBoxNode.visible(false);\n      this.canvasSelectBoxNode.width(0);\n      this.canvasSelectBoxNode.height(0);\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { render } from \"./CanvasSelectBox.vue?vue&type=template&id=d0fe218a\"\nimport script from \"./CanvasSelectBox.vue?vue&type=script&lang=js\"\nexport * from \"./CanvasSelectBox.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-rect\n    ref=\"annotationBoxRect\"\n    :config=\"{\n      stroke: stroke,\n      strokeWidth: strokeWidth,\n      visible: false\n    }\"\n  />\n</template>\n\n<script>\nimport { debounce, roundNumber } from '@/assets/js/utils.js';\nimport { v4 as uuidv4 } from 'uuid';\nimport useColorParser from '@/composables/useColorParser.js';\n\nexport default {\n  name: 'AnnotationBoxTool',\n  props: {\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    stageNode: {\n      type: Object,\n      default: () => {},\n    },\n    selectedLabel: {\n      type: Object,\n      default: null,\n    },\n    imageDimensions: {\n      type: Object,\n      default: () => ({ width: 100, height: 100 }),\n    },\n    editingEnabled: {\n      type: Boolean,\n      default: false,\n    },\n    labelColorMap: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['created-annotation-box', 'annotation-box-tool-dimensions-changed'],\n  setup() {\n    const {\n      parseColor,\n    } = useColorParser();\n    return {\n      parseColor,\n    };\n  },\n  data() {\n    return {\n      annotationBoxRectNode: null,\n    };\n  },\n  computed: {\n    boxDimensions() {\n      if (this.annotationBoxRectNode && this.annotationBoxRectNode.getAttrs().visible) {\n        return {\n          x1: this.annotationBoxRectNode.x(),\n          y1: this.annotationBoxRectNode.y(),\n          x2: this.annotationBoxRectNode.x() + this.annotationBoxRectNode.width(),\n          y2: this.annotationBoxRectNode.y() + this.annotationBoxRectNode.height(),\n        };\n      }\n      return null;\n    },\n    debounceHandleBoxDimensionsChanged() {\n      return debounce(() => { this.handleBoxDimensionsChanged(); }, 50);\n    },\n    stroke() {\n      return this.getAnnotationColor();\n    },\n    strokeWidth() {\n      return 4 / this.stageScale.x;\n    },\n  },\n  watch: {\n    boxDimensions() {\n      this.debounceHandleBoxDimensionsChanged();\n    },\n  },\n  mounted() {\n    this.annotationBoxRectNode = this.$refs.annotationBoxRect.getNode();\n    this.setUpStageMouseEvents();\n  },\n  unmounted() {\n    const stage = this.stageNode;\n    stage.off('mousedown touchstart');\n    stage.off('mousemove touchmove');\n    stage.off('mouseup touchend');\n  },\n  methods: {\n    getAnnotationColor() {\n      if (this.selectedLabel && this.selectedLabel.color) {\n        return this.parseColor(this.selectedLabel.color);\n      } else if (this.selectedLabel && this.labelColorMap) {\n        return this.labelColorMap[this.selectedLabel['index']];\n      } else {\n        return '#EFC15F';\n      }\n    },\n    handleBoxDimensionsChanged() {\n      this.$emit('annotation-box-tool-dimensions-changed', this.boxDimensions);\n    },\n    setUpStageMouseEvents() {\n      const stage = this.stageNode;\n      const annotationBoxRectangle = this.annotationBoxRectNode;\n      let mousedown = false;\n      let annotating = false;\n      let x1; let y1; let x2; let y2;\n\n      stage.on('mousedown touchstart', (e) => {\n        mousedown = true;\n        // Only do selection if left mouse button pressed with ctrl key not held\n        if (e.evt.button === 0 && !e.evt.ctrlKey) {\n          this.stageNode.setAttr('draggable', false);\n        } else {\n          return;\n        }\n\n        e.evt.preventDefault();\n        x1 = stage.getRelativePointerPosition().x;\n        y1 = stage.getRelativePointerPosition().y;\n        x2 = stage.getRelativePointerPosition().x;\n        y2 = stage.getRelativePointerPosition().y;\n        if (x1 < 0) return;\n        if (x1 > this.imageDimensions.width) return;\n        if (y1 < 0) return;\n        if (y1 > this.imageDimensions.height) return;\n\n        annotationBoxRectangle.visible(true);\n        annotationBoxRectangle.width(0);\n        annotationBoxRectangle.height(0);\n        annotating = true;\n      });\n\n      stage.on('mousemove touchmove', (e) => {\n        if (mousedown && annotating) {\n          e.evt.preventDefault();\n          x2 = stage.getRelativePointerPosition().x;\n          y2 = stage.getRelativePointerPosition().y;\n\n          if (x2 < 0) { x2 = 0; }\n          if (x2 > this.imageDimensions.width) { x2 = this.imageDimensions.width; }\n          if (y2 < 0) { y2 = 0; }\n          if (y2 > this.imageDimensions.height) { y2 = this.imageDimensions.height; }\n          const x = Math.min(x1, x2);\n          const y = Math.min(y1, y2);\n          const width = Math.abs(x2 - x1);\n          const height = Math.abs(y2 - y1);\n\n          annotationBoxRectangle.setAttrs({\n            x, y, width, height,\n          });\n        }\n      });\n\n      stage.on('mouseup touchend', (e) => {\n        e.evt.preventDefault();\n        mousedown = false;\n\n        if (!annotating) {\n          return;\n        }\n\n        // update visibility in timeout, so we can check it in click event\n        setTimeout(() => {\n          annotationBoxRectangle.visible(false);\n        });\n\n        const annotationBoxRectangleDimensions = annotationBoxRectangle.getAttrs();\n        if (annotationBoxRectangleDimensions.width !== 0 && annotationBoxRectangleDimensions.height !== 0) {\n          let newAnnotationBox = {\n            id: uuidv4(),\n            label_name: this.selectedLabel.name,\n            label_index: this.selectedLabel.index,\n            label_id: this.selectedLabel.id,\n            type: \"box\",\n            x: annotationBoxRectangleDimensions.x,\n            y: annotationBoxRectangleDimensions.y,\n            w: annotationBoxRectangleDimensions.width,\n            h: annotationBoxRectangleDimensions.height,\n            score: 1,\n          };\n          newAnnotationBox = this.convertPixelsToNormalized(newAnnotationBox);\n          this.$emit('created-annotation-box', newAnnotationBox);\n        }\n\n        // Allow image to be dragged again now that selection is complete\n        this.stageNode.setAttr('draggable', true);\n        annotating = false;\n      });\n    },\n    convertPixelsToNormalized(annotation) {\n      const newX = roundNumber(annotation.x / this.imageDimensions.width, 3);\n      const newY = roundNumber(annotation.y / this.imageDimensions.height, 3);\n      const newWidth = roundNumber(annotation.w / this.imageDimensions.width, 3);\n      const newHeight = roundNumber(annotation.h / this.imageDimensions.height, 3);\n      const convertedAnnotation = { ...annotation };\n      convertedAnnotation.x = newX;\n      convertedAnnotation.y = newY;\n      convertedAnnotation.w = newWidth;\n      convertedAnnotation.h = newHeight;\n      return convertedAnnotation;\n    },\n    reset() {\n      this.annotationBoxRectNode.visible(false);\n      this.annotationBoxRectNode.width(0);\n      this.annotationBoxRectNode.height(0);\n    },\n  },\n};\n</script>\n\n<style>\n\n</style>\n","import { render } from \"./AnnotationBoxTool.vue?vue&type=template&id=6757e87a\"\nimport script from \"./AnnotationBoxTool.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationBoxTool.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-rect\n    v-for=\"box in projectedBoxes2D\"\n    :key=\"box\"\n    :config=\"{\n      x: box.x,\n      y: box.y,\n      width: box.width,\n      height: box.height,\n      stroke: '#250E81',\n      strokeWidth: borderWidth,\n    }\"\n  />\n  <v-rect\n    v-for=\"box in projectedBoxes2D\"\n    :key=\"box\"\n    :config=\"{\n      x: box.x,\n      y: box.y,\n      width: box.width,\n      height: box.height,\n      stroke: box.stroke,\n      strokeWidth: borderWidth / 2,\n    }\"\n  />\n</template>\n\n<script>\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\n\nexport default {\n  name: \"Project3Dto2D\",\n  props: {\n    boxes3D: {\n      type: Array,\n      default: () => [],\n    },\n    imageDimensions: {\n      type: Object,\n      default: () => ({ width: 600, height: 300 }),\n    },\n    stageScale: {\n      type: Object,\n      default: () => ({ x: 1, y: 1 }),\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    pending3dBoxes: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  setup(props) {\n    const { map: labelColorMap } = useAnnotationColorMap({ items: props.labels, key: 'index' });\n\n    return {\n      labelColorMap,\n    };\n  },\n  data() {\n    return {\n      node: null,\n      isBusy: false,\n      isMouseOver: false,\n    };\n  },\n  computed: {\n    borderWidth() {\n      return 4 / this.stageScale.x;\n    },\n    projectedBoxes2D() {\n      if (!this.boxes3D.length && !this.pending3dBoxes) return [];\n\n      const allBoxes = [...this.boxes3D, ...this.pending3dBoxes];\n\n      const transformedBoxes3D = allBoxes.map((box) => [\n        0, box.data_json.x, box.data_json.y, box.data_json.z,\n        box.data_json.dx, box.data_json.dy, box.data_json.dz,\n      ]);\n\n      const projectedBoxes = this.projectBoxes(transformedBoxes3D, this.imageDimensions);\n\n      return projectedBoxes.map((box, index) => ({\n        ...box,\n        stroke: this.labelColorMap[allBoxes[index].label_index] || '#FFFFFF',\n      }));\n    },\n  },\n  methods: {\n\n    test() {\n      const inp = [\n        [0, 9.641414, -0.612911, 1.2554842, 0.70922685, 0.7092271, 1.8080416],\n        [0, 3.641414, -0.412911, 3.2554842, 0.20922685, 0.2092271, 2.8080416],\n        [0, 3.641414, -0.412911, 3.2554842, 0.5, 0.5, 0.5],\n      ];\n\n      let output; const sizes = this.project_boxes(inp);\n      console.log(output, sizes);\n    },\n    transpose(matrix) {\n      return matrix[0].map((col, c) => matrix.map((row, r) => matrix[r][c]));\n    },\n\n    multRow(a, r, m) {\n      const nr = a.length; const\n        nc = a[0].length;\n      for (let c = 0; c < nc; c++) {\n        a[r][c] = a[r][c] * m;\n      }\n      return a;\n    },\n    normalizeByLastRow(a) {\n      const nr = a.length; const\n        nc = a[0].length;\n      for (let r = 0; r < nr; r++) {\n        for (let c = 0; c < nc; c++) {\n          a[r][c] = a[r][c] / a[nr - 1][c];\n        }\n      }\n      return a;\n    },\n    maximum(a, b) {\n      const d = [];\n      const nr = a.length; const\n        nc = a[0].length;\n      for (let r = 0; r < nr; r++) {\n        d[r] = [];\n        for (let c = 0; c < nc; c++) {\n          d[r][c] = Math.max(a[r][c], b[r][c]);\n        }\n      }\n      return d;\n    },\n    minimum(a, b) {\n      const nr = a.length; const\n        nc = a[0].length;\n      const d = [];\n      for (let r = 0; r < nr; r++) {\n        d[r] = [];\n        for (let c = 0; c < nc; c++) {\n          d[r][c] = Math.min(a[r][c], b[r][c]);\n        }\n      }\n      return d;\n    },\n    subtract(a, b) {\n      const nr = a.length; const\n        nc = a[0].length;\n      const d = [];\n      for (let r = 0; r < nr; r++) {\n        d[r] = [];\n        for (let c = 0; c < nc; c++) {\n          d[r][c] = a[r][c] - b[r][c];\n        }\n      }\n      return d;\n    },\n    dropLastRow(a) {\n      const nr = a.length; const\n        nc = a[0].length;\n      const b = [];\n      for (let r = 0; r < nr - 1; r++) {\n        b[r] = [];\n        for (let c = 0; c < nc; c++) {\n          b[r][c] = a[r][c];\n        }\n      }\n      return b;\n    },\n\n    multiply(a, b) {\n      const aNumRows = a.length; const aNumCols = a[0].length;\n      const bNumRows = b.length; const bNumCols = b[0].length;\n      const m = new Array(aNumRows); // initialize array of rows\n      for (let r = 0; r < aNumRows; ++r) {\n        m[r] = new Array(bNumCols); // initialize the current row\n        for (let c = 0; c < bNumCols; ++c) {\n          m[r][c] = 0; // initialize the current cell\n          for (let i = 0; i < aNumCols; ++i) {\n            m[r][c] += a[r][i] * b[i][c];\n          }\n        }\n      }\n      return m;\n    },\n\n    getCol(matrix, col) {\n      const column = [];\n      for (let i = 0; i < matrix.length; i++) {\n        column.push(matrix[i][col]);\n      }\n      return column;\n    },\n\n    projectBoxes(bb3d, imageDimensions) {\n      if (!bb3d || bb3d.length === 0 || imageDimensions == null) return [];\n\n      const width = imageDimensions.width;\n      const height = imageDimensions.height;\n\n      /*\n    Projects 3D bounding boxes from real world coordinates into standard\n    2D image coordinates.\n\n    Keyword arguments:\n    bb3d -- The n x 7 bounding box from the annotation file.\n            The format is (label, z, x, y, depth, width, height).\n    width -- the width of the output image (default 1920)\n    height -- the height of the output image (default 1080)\n\n    */\n\n      // Example:\n      /*\n    project_boxes(np.array([\n        [0, 9.641414, -0.612911, 1.2554842, 0.70922685, 0.7092271, 1.8080416],\n        [0, 9.641414, -0.612911, 1.2554842, 0.70922685, 0.7092271, 1.8080416]\n    ]))\n    */\n\n      // Camera matrix that produces bounding boxes in 1920x1080 pixel coordinates\n      const cameraMatrix = [\n        [1260 / 1920, 0, 960 / 1920],\n        [0, 1260 / 1080, 540 / 1080],\n        [0, 0, 1],\n      ];\n\n      // Converts lzxydwh (label, z, x, y, depth, width, height) coulmn vector into\n      // (x_min, y_min, z_min) column vector\n      const zxydwh2xyzmin = [\n        [0, 0, 1, 0, 0, -0.5, 0],\n        [0, 0, 0, 1, 0, 0, -0.5],\n        [0, 1, 0, 0, 0, 0, 0],\n      ];\n\n      // Converts lzxydwh (label, z, x, y, depth, width, height) coulmn vector into\n      // (x_max, y_max, z_max) column vector\n      const zxydwh2xyzmax = [\n        [0, 0, 1, 0, 0, 0.5, 0],\n        [0, 0, 0, 1, 0, 0, 0.5],\n        [0, 1, 0, 0, 0, 0, 0],\n      ];\n\n      // Converts (x, y, 1) column vector from camera coordinate system to the image\n      // coordinate system.\n      const coordinateTransform = [\n        [-1, 0, 1],\n        [0, -1, 1],\n        [0, 0, 1],\n      ];\n\n      const xyzmin = this.multiply(zxydwh2xyzmin, this.transpose(bb3d));\n      let bbmin = this.multiply(cameraMatrix, xyzmin);\n      bbmin = this.normalizeByLastRow(bbmin);\n      bbmin = this.multiply(coordinateTransform, bbmin);\n      bbmin = this.dropLastRow(bbmin);\n      bbmin = this.multRow(bbmin, 0, width);\n      bbmin = this.multRow(bbmin, 1, height);\n\n      const xyzmax = this.multiply(zxydwh2xyzmax, this.transpose(bb3d));\n      let bbmax = this.multiply(cameraMatrix, xyzmax);\n      bbmax = this.normalizeByLastRow(bbmax);\n      bbmax = this.multiply(coordinateTransform, bbmax);\n      bbmax = this.dropLastRow(bbmax);\n      bbmax = this.multRow(bbmax, 0, width);\n      bbmax = this.multRow(bbmax, 1, height);\n\n      const bbmax_ = this.maximum(bbmax, bbmin);\n      bbmin = this.minimum(bbmax, bbmin);\n      let sizes = this.subtract(bbmax_, bbmin);\n\n      bbmin = this.transpose(bbmin);\n      sizes = this.transpose(sizes);\n\n      const boxes = [];\n      for (let k = 0; k < bbmin.length; k++) {\n        const b2 = {\n          x: bbmin[k][0],\n          y: bbmin[k][1],\n          width: sizes[k][0],\n          height: sizes[k][1],\n        };\n\n        boxes.push(b2);\n      }\n\n      return boxes;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import { render } from \"./Project3Dto2D.vue?vue&type=template&id=4d8bdfb0\"\nimport script from \"./Project3Dto2D.vue?vue&type=script&lang=js\"\nexport * from \"./Project3Dto2D.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <v-image\n    ref=\"canvasImage\"\n    :config=\"configImg\"\n    :width=\"imageDimensions.width\"\n    :height=\"imageDimensions.height\"\n  />\n</template>\n\n<script setup>\nimport {\n  computed,\n} from \"vue\";\n// import useProjection from '@/composables/annotationTool/useProjection.js';\n\n// const {\n//   drawPCDPoints,\n// } = useProjection();\n\nconst props = defineProps({\n  // lidarPoints: {\n  //   // three.js Points with buffer geometry\n  //   type: Object,\n  //   default: null,\n  // },\n  lidarProjection: {\n    // three.js Points with buffer geometry\n    type: HTMLImageElement,\n    default: null,\n  },\n  imageDimensions: {\n    type: Object,\n    default: null,\n  },\n  cameraIntrinsic: {\n    type: Array,\n    default: null,\n  },\n});\n\nconst configImg = computed(() => ({\n  fill: 'transparent',\n  x: 0,\n  y: 0,\n  image: props.lidarProjection,\n  width: props.imageDimensions.width,\n  height: props.imageDimensions.height,\n  draggable: false,\n}));\n\n// const canvasImageSrc = ref(null);\n\n// onMounted(async () => {\n//   const projectionImage = await drawPCDPoints(props.lidarPoints, props.imageDimensions.width, props.imageDimensions.height);\n//   canvasImageSrc.value = projectionImage;\n// });\n// watch(() => props.lidarPoints, async () => {\n//   const projectionImage = await drawPCDPoints(props.lidarPoints, props.imageDimensions.width, props.imageDimensions.height);\n//   canvasImageSrc.value = projectionImage;\n// }, { deep: true });\n</script>\n","import script from \"./ProjectLidarTo2D.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ProjectLidarTo2D.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <v-image\n    ref=\"canvasImage\"\n    :config=\"configImg\"\n    :width=\"imageDimensions.width\"\n    :height=\"imageDimensions.height\"\n  />\n</template>\n\n<script setup>\nimport {\n  computed,\n} from \"vue\";\n\nconst props = defineProps({\n  pcdProjection: {\n    // three.js Points with buffer geometry\n    type: HTMLImageElement,\n    default: null,\n  },\n  imageDimensions: {\n    type: Object,\n    default: null,\n  },\n  cameraIntrinsic: {\n    type: Array,\n    default: null,\n  },\n});\n\nconst configImg = computed(() => ({\n  fill: 'transparent',\n  x: 0,\n  y: 0,\n  image: props.pcdProjection,\n  width: props.imageDimensions.width,\n  height: props.imageDimensions.height,\n  draggable: false,\n}));\n</script>\n","import script from \"./ProjectPCDTo2D.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ProjectPCDTo2D.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./AnnotationCanvas.vue?vue&type=template&id=723e253d&scoped=true\"\nimport script from \"./AnnotationCanvas.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationCanvas.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationCanvas.vue?vue&type=style&index=0&id=723e253d&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-723e253d\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"show\" id=\"annotationToolRibbon\" class=\"ribbon\">\n    <div class=\"ribbon__group\">\n      <template v-if=\"hasImage\">\n        <SVGIcon\n          id=\"downloadImageBtn\"\n          class=\"ribbon__button\"\n          aria-label=\"Download image\"\n          :iconName=\"'download'\"\n          :showHover=\"false\"\n          :type=\"''\"\n          :title=\"'Download image'\"\n          :width=\"32\"\n          :height=\"32\"\n          @click=\"downloadImage\"\n        />\n        <hr class=\"ribbon__vr\">\n      </template>\n      <span>{{ zoom }}%</span>\n      <IconButton\n        id=\"zoomToFitBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Zoom To Fit (Space)\"\n        :icon=\"'zoom_to_extents'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Zoom To Fit (Space)'\"\n        @click=\"handleZoomToFit\"\n      />\n      <IconButton\n        id=\"zoomToSelectionBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Zoom To Selection (Selection + Space)\"\n        :disabled=\"!hasSelection\"\n        :icon=\"'zoom_to_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Zoom To Selection (Selection + Space)'\"\n        @click=\"handleZoomToSelection\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'AnnotationToolViewingModeControls',\n  components: {\n    IconButton,\n    SVGIcon,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: true,\n    },\n    hasImage: {\n      type: Boolean,\n      default: true,\n    },\n    zoom: {\n      type: Number,\n      default: 100,\n    },\n    hasSelection: {\n      type: Boolean,\n      default: false,\n    },\n    imageObj: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: [\n    'zoom-to-fit',\n    'zoom-to-selection',\n    'show-image-info',\n    'show-annotation-info',\n    'show-image-metadata',\n    'download-image',\n  ],\n  methods: {\n    handleZoomToFit() {\n      this.$emit('zoom-to-fit');\n    },\n    handleZoomToSelection() {\n      this.$emit('zoom-to-selection');\n    },\n    handleShowImageInfo() {\n      this.$emit('show-image-info');\n    },\n    handleShowAnnotationInfo() {\n      this.$emit('show-annotation-info');\n    },\n    handleShowImageMetadata() {\n      this.$emit('show-image-metadata');\n    },\n    async downloadImage() {\n      this.$emit('download-image');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.ribbon {\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  display: flex;\n  flex-direction: row;\n  width: fit-content;\n  height: 40px;\n  padding: 2px 16px;\n  justify-content: space-between;\n  font-weight: 500;\n  box-shadow: 0 0 3px gray, 0 0 10px gray;\n  border-radius: 4px;\n  backdrop-filter: blur(5px);\n  -webkit-backdrop-filter: blur(5px);\n  z-index: 9;\n  @include themify() {\n    color: themed('ribbon-icons-color');\n    background: themed('ribbon-bg-transparent');\n  }\n\n  &__group {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 8px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 1px;\n    height: 60%;\n    margin: 0;\n  }\n\n  &__button {\n    display: flex;\n    min-width: 22px;\n    height: 22px;\n    color: inherit;\n    background: none;\n    border: none;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: .05em;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover:not(:disabled), &.active:not(:disabled) {\n      @include themify() {\n        box-shadow: 0 0 0 4px themed('icon-hover-color');\n        background-color: themed('icon-hover-color');\n      }\n      border-radius: 4px;\n    }\n\n    &:disabled {\n      cursor: default;\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n:deep(.filter-button) {\n  height: 22px;\n}\n\n</style>\n","import { render } from \"./AnnotationToolViewingModeControls.vue?vue&type=template&id=13a69478&scoped=true\"\nimport script from \"./AnnotationToolViewingModeControls.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationToolViewingModeControls.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationToolViewingModeControls.vue?vue&type=style&index=0&id=13a69478&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-13a69478\"]])\n\nexport default __exports__","<template>\n  <div\n    v-if=\"show && !isReviewMode\"\n    id=\"annotationToolRibbon\"\n    class=\"ribbon\"\n  >\n    <div class=\"ribbon__group\">\n      <span>{{ zoom }}%</span>\n      <IconButton\n        id=\"zoomToFitBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Zoom To Fit (Z)\"\n        :icon=\"'zoom_to_extents'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Zoom To Fit (Z)'\"\n        @click=\"handleZoomToFit\"\n      />\n      <IconButton\n        id=\"zoomToSelectionBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Zoom To Selection (Selection + Z)\"\n        :disabled=\"!hasSelection\"\n        :icon=\"'zoom_to_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Zoom To Selection (Selection + Z)'\"\n        @click=\"handleZoomToSelection\"\n      />\n      <hr class=\"ribbon__vr\">\n      <IconButton\n        id=\"undoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Undo\"\n        :disabled=\"!canUndo\"\n        :icon=\"'undo'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Undo'\"\n        @click=\"handleUndo\"\n      />\n      <IconButton\n        id=\"revertChangesBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Revert All Changes\"\n        :icon=\"'restore'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Revert All Changes'\"\n        @click=\"handleRevertChanges\"\n      />\n      <IconButton\n        id=\"delBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Delete Annotations\"\n        :icon=\"'remove_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Delete Annotations (ctrl + x)'\"\n        @click=\"handleDeleteAnnotationsBulk\"\n      />\n    </div>\n    <div class=\"ribbon__group\">\n      <!-- <IconButton\n        v-if=\"hasSelection\"\n        id=\"showAnnotationInfoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Show Annotation Info\"\n        :icon=\"'auto'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Show Annotation Info'\"\n        @click=\"handleShowAnnotationInfo\"\n      /> -->\n      <hr class=\"ribbon__vr\">\n      <button\n        v-if=\"hasReviewTask\"\n        class=\"button button-secondary ribbon__button-secondary\"\n        :title=\"'Skip Image (Right Arrow)'\"\n        @click=\"handleSkipImage\"\n      >\n        Skip Image\n      </button>\n      <button\n        class=\"button ribbon__button-primary\"\n        :title=\"'Submit Annotations (Enter)'\"\n        @click=\"handleSubmit\"\n      >\n        Submit\n      </button>\n    </div>\n  </div>\n  <div v-if=\"show && isReviewMode\" id=\"annotationToolRibbon\" class=\"ribbon\">\n    <div class=\"ribbon__group\">\n      <IconButton\n        id=\"undoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Undo\"\n        :disabled=\"!canUndo\"\n        :icon=\"'undo'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Undo'\"\n        @click=\"handleUndo\"\n      />\n      <IconButton\n        id=\"revertChangesBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Revert All Changes\"\n        :icon=\"'restore'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Revert All Changes'\"\n        @click=\"handleRevertChanges\"\n      />\n      <IconButton\n        id=\"delBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Delete Annotations\"\n        :icon=\"'remove_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Delete Annotations (ctrl + x)'\"\n        @click=\"handleDeleteAnnotationsBulk\"\n      />\n    </div>\n    <div class=\"ribbon__group\">\n      <IconButton\n        v-if=\"hasSelection\"\n        id=\"showAnnotationInfoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Show Annotation Info\"\n        :icon=\"'auto'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Show Annotation Info'\"\n        @click=\"handleShowAnnotationInfo\"\n      />\n      <button\n        v-if=\"hasReviewTask\"\n        class=\"button button-danger ribbon__button-secondary button-flex\"\n        :title=\"'Delete Image'\"\n        @click=\"handleDeleteImageFromDataset\"\n      >\n        <SVGIcon\n          class=\"me-1\"\n          :iconName=\"'delete'\"\n          :width=\"'20px'\"\n          :height=\"'20px'\"\n        />\n        Delete Image\n      </button>\n      <button\n        v-if=\"hasReviewTask\"\n        class=\"button button-secondary ribbon__button-secondary\"\n        :title=\"'Skip Image (Right Arrow)'\"\n        @click=\"handleSkipImage\"\n      >\n        Skip Image\n      </button>\n      <BasePersistentSplitButton\n        v-model=\"submitType\"\n        class=\"ribbon__button-primary\"\n        title=\"Submit Annotations (Enter)\"\n        :options=\"submitTypes\"\n        @click=\"handleReviewSubmit\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport BasePersistentSplitButton from '@/components/BasePersistentSplitButton.vue';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\n\nexport default {\n  name: 'AnnotationToolRibbon',\n  components: {\n    SVGIcon,\n    IconButton,\n    BasePersistentSplitButton,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: true,\n    },\n    zoom: {\n      type: Number,\n      default: 100,\n    },\n    canUndo: {\n      type: Boolean,\n      default: false,\n    },\n    hasSelection: {\n      type: Boolean,\n      default: false,\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    annotationDisplaySettings: {\n      type: Object,\n      default: null,\n    },\n    isReviewMode: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'zoom-to-fit',\n    'zoom-to-selection',\n    'undo',\n    'revert-changes',\n    'show-annotation-info',\n    'skip',\n    'submit',\n    'submit-all-annotations',\n    'submit-accepted-annotations',\n    'bulk-del-ann',\n    'exit-editor',\n  ],\n  setup() {\n    const {\n      internalImageObj,\n      submitType,\n      skipTaskImage,\n      handleAuditSubmitAllAnnotations,\n      handleAuditSubmitAcceptedAnnotations,\n      deleteTaskImageFromDataset,\n      hasReviewTask,\n    } = useTasks();\n\n    return {\n      internalImageObj,\n      submitType,\n      skipTaskImage,\n      handleAuditSubmitAllAnnotations,\n      handleAuditSubmitAcceptedAnnotations,\n      deleteTaskImageFromDataset,\n      hasReviewTask,\n    };\n  },\n  data() {\n    return {\n      internalAnnotationDisplaySettings: null,\n      SAMActive: false,\n      submitTypes: [\n        { title: 'Submit All Annotations', value: 'submit-all-annotations' },\n        { title: 'Submit Accepted Annotations', value: 'submit-accepted-annotations' },\n      ],\n    };\n  },\n  mounted() {\n    if (this.annotationDisplaySettings) {\n      this.internalAnnotationDisplaySettings = this.annotationDisplaySettings;\n    }\n  },\n  methods: {\n    handleZoomToFit() {\n      this.$emit('zoom-to-fit');\n    },\n    handleZoomToSelection() {\n      this.$emit('zoom-to-selection');\n    },\n    handleRevertChanges() {\n      this.$emit('revert-changes');\n    },\n    handleUndo() {\n      this.$emit('undo');\n    },\n    handleShowAnnotationInfo() {\n      this.$emit('show-annotation-info');\n    },\n    async handleDeleteImageFromDataset() {\n      await this.deleteTaskImageFromDataset(this.internalImageObj?.id)\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          console.error(error);\n          alert(error);\n        });\n    },\n    handleSkipImage() {\n      this.$emit('skip');\n      this.skipTaskImage();\n    },\n    handleSubmit() {\n      this.$emit('submit');\n\n      if (!this.hasReviewTask) {\n        this.$emit('exit-editor');\n      }\n    },\n    async handleReviewSubmit(submitType) {\n      if (submitType === 'submit-all-annotations') {\n        await this.handleAuditSubmitAllAnnotations();\n      } else if (submitType === 'submit-accepted-annotations') {\n        await this.handleAuditSubmitAcceptedAnnotations();\n      }\n\n      if (!this.hasReviewTask) {\n        this.$emit('exit-editor');\n      }\n    },\n    handleEnter() {\n      this.$emit(this.submitType);\n    },\n    handleDeleteAnnotationsBulk() {\n      this.$emit('bulk-del-ann');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.ribbon {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  width: 100%;\n  min-height: 37px;\n  max-height: 37px;\n  padding: 2px 16px;\n  justify-content: space-between;\n  z-index: 10;\n  box-shadow: 0 3px 3px -3px gray, 0 10px 10px -10px gray;\n  color: var(--ribbon-icons-color);\n  background: var(--ribbon-bg);\n  border-left: solid 1px var(--ribbon-border);\n\n  &__group {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 8px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 1px;\n    height: 60%;\n    margin: 0;\n  }\n\n  &__button {\n    display: flex;\n    min-width: 22px;\n    height: 22px;\n    color: inherit;\n    background: none;\n    border: none;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: .05em;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover:not(:disabled), &.active:not(:disabled) {\n      box-shadow: 0 0 0 4px var(--icon-hover-color);\n      background-color: var(--icon-hover-color);\n      border-radius: 4px;\n    }\n\n    &:disabled {\n      cursor: default;\n      color: var(--color-disabled);\n    }\n  }\n\n  &__button-primary {\n    display: flex;\n    height: 28px;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    align-items: center;\n  }\n\n  &__button-secondary {\n    display: flex;\n    height: 28px;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    align-items: center;\n  }\n\n  &__labeled_button {\n    width: auto;\n  }\n}\n\n:deep(.filter-button) {\n  height: 22px;\n}\n\n</style>\n","<template>\n  <v-layout>\n    <v-menu :location=\"'bottom end'\">\n      <template #activator=\"{ props }\">\n        <div class=\"split-btn\">\n          <v-btn\n            class=\"main-btn button\"\n            @click=\"handleMainClick\"\n          >\n            {{ selectedOption.title }}\n          </v-btn>\n          <v-btn\n            class=\"actions-btn button\"\n            v-bind=\"props\"\n          >\n            <v-icon left>mdi-menu-down</v-icon>\n          </v-btn>\n        </div>\n      </template>\n\n      <v-list>\n        <v-list-item\n          v-for=\"(option, index) in options\"\n          :key=\"index\"\n          :value=\"option\"\n          @click=\"handleListItemClick(option)\"\n        >\n          <template #prepend>\n            <div class=\"list-item-prepend\">\n              <SVGIcon\n                v-if=\"selectedOption === option\"\n                :iconName=\"'check'\"\n                :width=\"'20px'\"\n                :height=\"'20px'\"\n              />\n            </div>\n          </template>\n          <v-list-item-title>{{ option.title }}</v-list-item-title>\n        </v-list-item>\n      </v-list>\n    </v-menu>\n  </v-layout>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'BasePersistentSplitButton',\n  components: {\n    SVGIcon,\n  },\n  props: {\n    modelValue: {\n      type: null,\n      default: null,\n    },\n    options: {\n      type: Array,\n      default: () => [\n        { title: 'Option 1', value: 1 },\n        { title: 'Option 2', value: 2 },\n      ],\n    },\n  },\n  emits: ['update:modelValue', 'click'],\n  data() {\n    return {\n      selectedOption: { title: '', value: null },\n    };\n  },\n  watch: {\n    selectedOption() {\n      this.$emit('update:modelValue', this.selectedOption.value);\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.selectedOption = this.options.find((option) => option.value === this.modelValue);\n    } else if (this.options.length > 0) {\n      this.selectedOption = this.options[0];\n    }\n  },\n  methods: {\n    handleListItemClick(option) {\n      this.selectedOption = option;\n    },\n    handleMainClick() {\n      this.$emit('click', this.selectedOption.value);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.main-btn{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n  height: inherit;\n  font-size: inherit;\n}\n.actions-btn{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n  min-width: 35px !important;\n  margin-left: -3.5px;\n  height: inherit;\n  border-left: 1px solid var(--color-primary-300);\n}\n.split-btn{\n  display: flex;\n  height: inherit;\n}\n.list-item-prepend {\n  width: 20px;\n  margin-right: 8px;\n}\n</style>\n","import { render } from \"./BasePersistentSplitButton.vue?vue&type=template&id=94fc0fe8&scoped=true\"\nimport script from \"./BasePersistentSplitButton.vue?vue&type=script&lang=js\"\nexport * from \"./BasePersistentSplitButton.vue?vue&type=script&lang=js\"\n\nimport \"./BasePersistentSplitButton.vue?vue&type=style&index=0&id=94fc0fe8&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-94fc0fe8\"]])\n\nexport default __exports__","import { unref } from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default function useAnnotationDatabase(internalImageObj, internalAnnotations) {\n  const datastore = new DatastoreConnect();\n\n  function createNewAnnotation(annoObj, dest_annotation_set_id) {\n    const annotation = {\n      label_index: annoObj.label_index,\n      label_id: annoObj.label_id,\n      type: annoObj.type,\n      score: 1,\n      image_id: annoObj.image_id,\n      annotation_set_id: dest_annotation_set_id,\n      x: annoObj.x,\n      y: annoObj.y,\n      w: annoObj.w,\n      h: annoObj.h,\n    };\n    if (annoObj.polygon) {\n      annotation.polygon = annoObj.polygon;\n    }\n    if (annoObj.data_url) {\n      annotation.data_url = annoObj.data_url;\n    }\n    if (annoObj.data_json) {\n      annotation.data_json = annoObj.data_json;\n    }\n\n    return annotation;\n  }\n\n  function createExistingAnnotation(annoObj, dest_annotation_set_id) {\n    const annotation = {\n      id: annoObj.id,\n      label_index: annoObj.label_index,\n      label_id: annoObj.label_id,\n      type: annoObj.type,\n      score: 1,\n      image_id: annoObj.image_id,\n      annotation_set_id: dest_annotation_set_id,\n      x: annoObj.x,\n      y: annoObj.y,\n      w: annoObj.w,\n      h: annoObj.h,\n    };\n    if (annoObj.polygon) {\n      annotation.polygon = annoObj.polygon;\n    }\n    if (annoObj.data_url) {\n      annotation.data_url = annoObj.data_url;\n    }\n    if (annoObj.data_json) {\n      annotation.data_json = annoObj.data_json;\n    }\n\n    return annotation;\n  }\n\n  async function createNewAnnotationInDatabase(annoObj, dest_annotation_set_id) {\n    const annotation = createNewAnnotation(annoObj, dest_annotation_set_id);\n    console.log('Create Annotation:', annotation);\n\n    const newAnnotation = await datastore.addAnnotations(annotation)\n      .catch((error) => {\n        // TODO: handle error\n        console.log(error);\n      });\n    if (newAnnotation.error || !newAnnotation.result) {\n      // TODO: handle error\n      return null;\n    }\n    return newAnnotation.result;\n  }\n\n  async function updateExistingAnnotationInDatabase(annoObj, dest_annotation_set_id) {\n    const annotation = createExistingAnnotation();\n    console.log('Update Annotation:', annotation);\n\n    const updatedAnnotation = await datastore.updateAnnotations(annotation)\n      .catch((error) => {\n        // TODO: handle error\n        console.log(error);\n      });\n    if (updatedAnnotation.error || !updatedAnnotation.result) {\n      // TODO: handle error\n      return null;\n    }\n    return updatedAnnotation.result;\n  }\n\n  async function deleteAnnotationInDatabase(annotation_id) {\n    const deletedAnnotation = await datastore.deleteAnnotations({ id: annotation_id })\n      .catch((error) => {\n        // TODO: handle error\n        console.log(error);\n      });\n    if (deletedAnnotation.error || !deletedAnnotation.result) {\n      // TODO: handle error\n      return false;\n    }\n    internalAnnotations.value = [...internalAnnotations.value.filter((anno) => anno.id !== deletedAnnotation.result.id)];\n    return true;\n  }\n\n  function getAnnotationsForDatabase(_initialAnnotations, _newAnnotations, source_annotation_set_id, dest_annotation_set_id, _doneImageOpen) {\n    const hasSourceAnnotationSet = Boolean(source_annotation_set_id);\n    const isAudit = hasSourceAnnotationSet && (source_annotation_set_id !== dest_annotation_set_id);\n    const initialAnnotations = unref(_initialAnnotations);\n    const newAnnotations = unref(_newAnnotations);\n    const doneImageOpen = unref(_doneImageOpen);\n\n    const annotationsToSubmit = {\n      create_annotations: [],\n      update_annotations: [],\n      delete_annotations: [],\n    };\n\n    // Create and update annotations in the database\n    newAnnotations.forEach((anno) => {\n      if (typeof anno.id !== 'number' || (isAudit && anno.annotation_set_id === source_annotation_set_id)) {\n        const newAnno = createNewAnnotation(anno, dest_annotation_set_id);\n        annotationsToSubmit.create_annotations.push(newAnno);\n      } else {\n        const updatedAnno = createExistingAnnotation(anno, dest_annotation_set_id);\n        annotationsToSubmit.update_annotations.push(updatedAnno);\n      }\n    });\n\n    // Delete missing annotations from the database\n    if (initialAnnotations && (!isAudit || doneImageOpen)) {\n      // Find annotations that have been removed from the initialAnnotations array\n      const annotationsToDelete = initialAnnotations.filter((existingAnno) => !newAnnotations.map((anno) => anno.id).includes(existingAnno.id));\n      annotationsToDelete.forEach((anno) => {\n        annotationsToSubmit.delete_annotations.push(anno);\n      });\n    }\n\n    return annotationsToSubmit;\n  }\n\n  return {\n    createNewAnnotationInDatabase,\n    updateExistingAnnotationInDatabase,\n    deleteAnnotationInDatabase,\n    getAnnotationsForDatabase,\n  };\n}\n","import {\n  ref, computed, watch, nextTick,\n} from 'vue';\nimport { useStore } from 'vuex';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nconst doneImages = ref([]);\n\nexport default function useTasksHistory(reviewSettings, internalImageObj, internalAnnotations, currentTaskImage, activeImageIndex) {\n  const store = useStore();\n  const datastore = new DatastoreConnect(store.state.enterpriseServerUrl);\n  const doneImageOpen = computed(() => {\n    if (currentTaskImage.value && internalImageObj.value.id !== currentTaskImage.value.id) {\n      return true;\n    }\n    return false;\n  });\n\n  function startTaskHistory() {\n    // Watch\n    watch(internalAnnotations, (newAnnotations) => {\n      // Previously audited annotations should have status verified\n      if (reviewSettings.value?.reviewTask?.type === 'audit') {\n        newAnnotations.forEach((anno) => {\n          if (doneImageOpen.value) {\n            anno.reviewStatus = 'verified';\n          }\n        });\n      }\n    });\n  }\n\n  // Methods\n  async function getTaskDoneImagesByUser() {\n    const params = {\n      dataset_id: reviewSettings.value.reviewTask.dataset_id,\n      review_task_id: reviewSettings.value.reviewTask.id,\n      annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n      username: store.state.user.user.username,\n    };\n    const resp = await datastore.getTaskDoneImagesByUser(params)\n      .catch((error) => {\n        console.log(error);\n        alert('Failed to get done images');\n      });\n    if (!resp || resp.error || !resp.result) {\n      if (resp.error) {\n        console.error(resp.error);\n        alert(`Failed to get done images\\n${resp.error.message}`);\n      }\n      return { images: [], total_count: 0 };\n    }\n    return resp.result;\n  }\n\n  function switchToTaskImage(imageIndex) {\n    activeImageIndex.value = imageIndex;\n    if (imageIndex >= 0) {\n      internalImageObj.value = doneImages.value[imageIndex];\n    } else {\n      internalImageObj.value = currentTaskImage.value;\n    }\n    nextTick(() => { internalAnnotations.value = (internalImageObj.value.annotations || []); });\n  }\n\n  function switchToNextTaskImage() {\n    if (activeImageIndex.value > -1) {\n      switchToTaskImage(activeImageIndex.value - 1);\n    }\n  }\n\n  function switchToPreviousTaskImage() {\n    if (activeImageIndex.value < (doneImages.value.length - 1)) {\n      switchToTaskImage(activeImageIndex.value + 1);\n    }\n  }\n\n  return {\n    startTaskHistory,\n    doneImages,\n    doneImageOpen,\n    getTaskDoneImagesByUser,\n    switchToTaskImage,\n    switchToNextTaskImage,\n    switchToPreviousTaskImage,\n  };\n}\n","import { defineStore } from 'pinia';\nimport {\n  ref, watch, computed, onUnmounted,\n} from 'vue';\n\nexport const useEditorStore = defineStore('editor', () => {\n  const internalImageObj = ref(null);\n  const internalAnnotations = ref([]);\n  const sequences = ref([]);\n  const labels = ref([]);\n\n  const sequenceId = computed(() => {\n    if (internalImageObj.value.id) {\n      return internalImageObj.value.sequence_id;\n    }\n    return null;\n  });\n\n  function $reset() {\n    internalImageObj.value = null;\n    internalAnnotations.value = [];\n    sequences.value = [];\n    labels.value = [];\n  }\n\n  onUnmounted(() => {\n    $reset();\n  });\n\n  return {\n    internalImageObj,\n    internalAnnotations,\n    sequences,\n    sequenceId,\n    labels,\n    $reset,\n  };\n});\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\nexport const usePCDStore = defineStore('pcd', () => {\n  const pointArray = ref([]);\n  const pcdAnnotations = ref([]);\n  const header = ref('');\n  const fields = ref([]);\n  const scale = ref(1);\n  const enablePCD = ref(false);\n\n  function $reset() {\n    pointArray.value = [];\n    pcdAnnotations.value = [];\n    header.value = '';\n    fields.value = [];\n    scale.value = 1;\n    enablePCD.value = false;\n  }\n\n  return {\n    pointArray,\n    pcdAnnotations,\n    header,\n    fields,\n    scale,\n    enablePCD,\n    $reset,\n  };\n});\n","import {\n  ref, computed, watch, onUnmounted,\n} from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { usePCDStore } from '@/stores/usePCDStore.js';\nimport {\n  Color, BufferAttribute, CanvasTexture, PointsMaterial,\n} from 'three';\nimport { PCDLoader } from 'three/addons/loaders/PCDLoader.js';\nimport * as THREE from 'three';\n\nexport default function usePCD() {\n  const {\n    pointArray,\n    pcdAnnotations,\n    header,\n    fields,\n    scale,\n    enablePCD,\n  } = storeToRefs(usePCDStore());\n  const {\n    $reset,\n  } = usePCDStore();\n\n  onUnmounted(() => {\n    $reset();\n  });\n\n  const SPHERE_TEXTURE = createSphereTexture();\n  // const POINTS_MATERIAL = createPointsMaterial();\n\n  function createSphereTexture() {\n    const tempcanvas = document.createElement('canvas');\n    tempcanvas.width = 64;\n    tempcanvas.height = 64;\n    const ctx = tempcanvas.getContext('2d');\n\n    // Clear the canvas to make it fully transparent\n    ctx.clearRect(0, 0, tempcanvas.width, tempcanvas.height);\n\n    // Draw a circle\n    ctx.fillStyle = 'white';\n    ctx.beginPath();\n    ctx.arc(32, 32, 30, 0, Math.PI * 2);\n    ctx.fill();\n    return new CanvasTexture(tempcanvas);\n  }\n\n  function createPointsMaterial() {\n    const pointsMaterial = new PointsMaterial();\n    pointsMaterial.map = SPHERE_TEXTURE;\n    pointsMaterial.transparent = true;\n    pointsMaterial.size = 0.25;\n    // pointsMaterial.value.sizeAttenuation = false;\n    pointsMaterial.alphaTest = 0.5;\n    // pointsMaterial.value.depthWrite = false;\n    // pointsMaterial.value.blending = THREE.NormalBlending;\n    pointsMaterial.needsUpdate = true;\n    return pointsMaterial;\n  }\n\n  function setPointsMaterial(pointsMaterial) {\n    pointsMaterial.map = SPHERE_TEXTURE;\n    pointsMaterial.transparent = true;\n    pointsMaterial.size = 0.25;\n    pointsMaterial.sizeAttenuation = true;\n    pointsMaterial.alphaTest = 0.5;\n    // pointsMaterial.value.depthWrite = false;\n    // pointsMaterial.value.blending = THREE.NormalBlending;\n    pointsMaterial.color.set(0xFFCC00);\n    pointsMaterial.needsUpdate = true;\n  }\n\n  function parseFields(line) {\n    const lineSplit = line.split(' ');\n    if (lineSplit.length > 2) {\n      lineSplit.shift();\n      fields.value = lineSplit;\n    }\n  }\n\n  // function createTestBufferGeometry(positions, count) {\n  //   const geometry = new BufferGeometry();\n  //   // Populate the position data\n  //   for (let i = 0; i < count; i++) {\n  //     positions[i * 3] = Math.random() * 100; // x\n  //     positions[i * 3 + 1] = Math.random() * 100; // y\n  //     positions[i * 3 + 2] = Math.random() * 100; // z\n  //   }\n\n  //   geometry.setAttribute('position', new BufferAttribute(positions, 3));\n  //   return geometry;\n  // }\n\n  function parsePoints(data) {\n    const points = [];\n\n    const labelIndex = fields.value.indexOf('label');\n\n    data.forEach((line) => {\n      const lineSplit = line.split(' ');\n      if (lineSplit.length > 2) {\n        const px = parseFloat(lineSplit[0]);\n        if (Number.isNaN(px)) return;\n        const py = parseFloat(lineSplit[1]);\n        if (Number.isNaN(py)) return;\n        const pz = parseFloat(lineSplit[2]);\n        if (Number.isNaN(pz)) return;\n\n        const label = parseInt(lineSplit[labelIndex]);\n\n        points.push({\n          raw: lineSplit,\n          position: [px * scale.value, py * scale.value, pz * scale.value],\n          label,\n          selected: false,\n        });\n      }\n    });\n    return points;\n  }\n\n  function jetColormap(val) {\n    const color = new Color();\n\n    const t = Math.max(0, Math.min(1, val)); // Clamp between 0 and 1\n\n    if (t < 0.25) {\n      // Blue to Cyan\n      color.setRGB(0, 4 * t, 1);\n    } else if (t < 0.5) {\n      // Cyan to Green\n      color.setRGB(0, 1, 1 - 4 * (t - 0.25));\n    } else if (t < 0.75) {\n      // Green to Yellow\n      color.setRGB(4 * (t - 0.5), 1, 0);\n    } else {\n      // Yellow to Red\n      color.setRGB(1, 1 - 4 * (t - 0.75), 0);\n    }\n\n    return color;\n  }\n\n  function parsePCDFileAsPointsBuffer(arrayBuffer) {\n    const loader = new PCDLoader();\n    const points = loader.parse(arrayBuffer, 'blob.pcd'); // Parse buffer\n    points.material.size = 3;\n    points.material.sizeAttenuation = false;\n\n    return points;\n  }\n\n  function colorPointsByXValue(points) {\n    const geometry = points.geometry; // Extract geometry from Points\n\n    // Get position attribute (3 values per vertex: x, y, z)\n    const positionAttribute = geometry.attributes.position;\n    const numPoints = positionAttribute.count; // Total number of points\n\n    // Collect all x-values\n    const xValues = [];\n    for (let i = 0; i < numPoints; i++) {\n      xValues.push(positionAttribute.getX(i));\n    }\n\n    // Sort values to find percentiles\n    xValues.sort((a, b) => a - b);\n\n    // Define lower and upper percentile thresholds\n    const lowerPercentile = 0.05; // Ignore bottom 5%\n    const upperPercentile = 0.95; // Ignore top 5%\n\n    // Compute min and max based on percentiles\n    const minX = xValues[Math.floor(lowerPercentile * numPoints)];\n    const maxX = xValues[Math.floor(upperPercentile * numPoints)];\n    const rangeX = maxX - minX;\n\n    // Create color buffer\n    const colors = new Float32Array(numPoints * 3); // RGB for each point\n\n    for (let i = 0; i < numPoints; i++) {\n      let x = positionAttribute.getX(i);\n\n      // Clamp X within the computed min-max range\n      x = Math.max(minX, Math.min(maxX, x));\n\n      // Normalize X between 0 and 1\n      const normalizedX = (x - minX) / rangeX;\n\n      // Convert normalizedX to a Jet colormap (blue → red)\n      const color = jetColormap(normalizedX);\n\n      colors[i * 3] = color.r; // Red\n      colors[i * 3 + 1] = color.g; // Green\n      colors[i * 3 + 2] = color.b; // Blue\n    }\n\n    // Assign colors to geometry\n    geometry.setAttribute('color', new BufferAttribute(colors, 3));\n\n    // Enable vertex colors\n    points.material.vertexColors = true;\n  }\n\n  function getPointsColorByXValue(positionAttribute) {\n    const numPoints = positionAttribute.count; // Total number of points\n\n    // Collect all x-values\n    const xValues = [];\n    for (let i = 0; i < numPoints; i++) {\n      xValues.push(positionAttribute.getX(i));\n    }\n\n    // Sort values to find percentiles\n    xValues.sort((a, b) => a - b);\n\n    // Define lower and upper percentile thresholds\n    const lowerPercentile = 0.05; // Ignore bottom 5%\n    const upperPercentile = 0.95; // Ignore top 5%\n\n    // Compute min and max based on percentiles\n    const minX = xValues[Math.floor(lowerPercentile * numPoints)];\n    const maxX = xValues[Math.floor(upperPercentile * numPoints)];\n    const rangeX = maxX - minX;\n\n    // Create color buffer\n    const colors = []; // RGB for each point\n\n    for (let i = 0; i < numPoints; i++) {\n      let x = positionAttribute.getX(i);\n\n      // Clamp X within the computed min-max range\n      x = Math.max(minX, Math.min(maxX, x));\n\n      // Normalize X between 0 and 1\n      const normalizedX = (x - minX) / rangeX;\n\n      // Convert normalizedX to a Jet colormap (blue → red)\n      const color = jetColormap(normalizedX);\n\n      colors.push(color);\n    }\n\n    return colors;\n  }\n\n  function parsePCDFile(pcdFile) {\n    const lines = pcdFile.split(/\\r?\\n/);\n\n    header.value = lines.slice(0, 11);\n    const data = lines.slice(11);\n\n    header.value.forEach((line) => {\n      if (line.startsWith('FIELDS')) {\n        parseFields(line);\n      }\n    });\n\n    const points = parsePoints(data);\n\n    return points;\n  }\n\n  // TODO: This is no longer valid after switching to buffer geometry\n  // function createPCDFile() {\n  //   const labelIndex = fields.value.indexOf('label');\n\n  //   let newPCDFile = header.value.join('\\n');\n  //   newPCDFile += '\\n';\n\n  //   pointArray.value.forEach((point) => {\n  //     const newPoint = point.raw;\n  //     newPoint[0] = point.position[0] / scale.value;\n  //     newPoint[1] = point.position[1] / scale.value;\n  //     newPoint[2] = point.position[2] / scale.value;\n  //     newPoint[labelIndex] = point.label;\n  //     newPCDFile += `${newPoint.join(' ')}\\n`;\n  //   });\n\n  //   return newPCDFile;\n  // }\n\n  // Function to create a fresh points buffer from raw data. Needed because tres.js clears the geometry when disposed\n  function cloneLidarPointsBuffer(positions, colors) {\n  // Create a new geometry from the original data\n    const geometry = new THREE.BufferGeometry();\n    geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));\n    geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\n\n    // Compute bounds\n    geometry.computeBoundingSphere();\n    geometry.computeBoundingBox();\n\n    // Create material\n    const material = new THREE.PointsMaterial({\n      size: 0.1,\n      vertexColors: true,\n    });\n\n    // Create new points object\n    const points = new THREE.Points(geometry, material);\n    return points;\n  }\n\n  // Function to create a fresh points buffer from raw data. Needed because tres.js clears the geometry when disposed\n  function clonePcdPointsBuffer(positions, colors) {\n  // Create a new geometry from the original data\n    const geometry = new THREE.BufferGeometry();\n    geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));\n\n    // Compute bounds\n    geometry.computeBoundingSphere();\n    geometry.computeBoundingBox();\n\n    // Create material\n    const material = new THREE.PointsMaterial();\n    setPointsMaterial(material);\n\n    // Create new points object\n    const points = new THREE.Points(geometry, material);\n    return points;\n  }\n\n  return {\n    pointArray,\n    pcdAnnotations,\n    header,\n    fields,\n    scale,\n    enablePCD,\n    // setPointsMaterial,\n    // createPointsMaterial,\n    // createTestBufferGeometry,\n    parsePCDFile,\n    parsePCDFileAsPointsBuffer,\n    colorPointsByXValue,\n    getPointsColorByXValue,\n    setPointsMaterial,\n    // createPCDFile,\n    cloneLidarPointsBuffer,\n    clonePcdPointsBuffer,\n  };\n}\n","import {\n  ref, computed, watch, onMounted, onUnmounted, nextTick, onBeforeUnmount,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport useAnnotationDatabase from '@/composables/annotationTool/useAnnotationDatabase.js';\nimport useTaskHistory from '@/composables/annotationTool/useTaskHistory.js';\nimport { useStore } from 'vuex';\nimport { useEditorStore } from '@/stores/useEditorStore.js';\nimport usePCD from '@/composables/annotationTool/usePCD.js';\nimport { storeToRefs } from 'pinia';\n\nlet submitType = ref('submit-all-annotations');\nlet imageFilters = ref(null);\nlet activeImageIndex = ref(-1);\nlet currentTaskImage = ref(null);\nlet pendingTaskImages = ref([]);\nlet isTaskComplete = ref(false);\nlet reviewSettings = null;\nlet remainingImagesCount = ref(0);\nlet totalImagesCount = ref(0);\nlet auditorType = ref('image');\nlet isFetchingNewImage = ref(false);\n\nexport default function useTasks({ reviewSettings: newReviewSettings } = {}) {\n  const datastore = new DatastoreConnect();\n  const store = useStore();\n\n  if (newReviewSettings) {\n    reviewSettings = newReviewSettings;\n  }\n\n  const editorStore = useEditorStore();\n  const {\n    internalImageObj,\n    internalAnnotations,\n  } = storeToRefs(editorStore);\n\n  const {\n    startTaskHistory,\n    doneImages,\n    doneImageOpen,\n    getTaskDoneImagesByUser,\n    switchToTaskImage,\n    switchToNextTaskImage,\n    switchToPreviousTaskImage,\n  } = useTaskHistory(reviewSettings, internalImageObj, internalAnnotations, currentTaskImage, activeImageIndex);\n\n  function startTask() {\n    if (reviewSettings.value?.initialAuditorType) {\n      auditorType.value = reviewSettings.value?.initialAuditorType;\n    }\n\n    watch(isTaskComplete, (isComplete) => {\n      if (isComplete) {\n        currentTaskImage.value = null;\n        pendingTaskImages.value = [];\n        internalImageObj.value = null;\n        internalAnnotations.value = [];\n      }\n    });\n\n    watch(currentTaskImage, async () => {\n      if (hasReviewTask.value) {\n        await getRemainingCount()\n          .then(({ total_images, remaining_images }) => {\n            remainingImagesCount.value = remaining_images;\n            totalImagesCount.value = total_images;\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    });\n\n    watch(currentTaskImage, async (newImage) => {\n      if (newImage) {\n        internalImageObj.value = newImage;\n      } else {\n        internalImageObj.value = null;\n      }\n    });\n\n    watch(auditorType, async () => {\n      isFetchingNewImage.value = true;\n\n      pendingTaskImages.value = await getImageForTask(currentTaskImage.value?.id);\n      if (pendingTaskImages.value?.length > 0) {\n        currentTaskImage.value = pendingTaskImages.value[0];\n      } else {\n        currentTaskImage.value = null;\n      }\n\n      isFetchingNewImage.value = false;\n    });\n\n    watch(currentTaskImage, async () => {\n      if (hasReviewTask.value) {\n        doneImages.value = await getTaskDoneImagesByUser();\n      }\n    });\n\n    onBeforeUnmount(() => {\n      // Clear values or perform cleanup\n      submitType = ref('submit-all-annotations');\n      imageFilters = ref(null);\n      activeImageIndex = ref(-1);\n      currentTaskImage = ref(null);\n      pendingTaskImages = ref([]);\n      isTaskComplete = ref(false);\n      reviewSettings = null;\n      remainingImagesCount = ref(0);\n      totalImagesCount = ref(0);\n      auditorType = ref('image');\n      isFetchingNewImage = ref(false);\n    });\n\n    startTaskHistory();\n  }\n\n  const { getAnnotationsForDatabase } = useAnnotationDatabase(internalImageObj, internalAnnotations);\n\n  // Computed\n\n  const sourceDataset = computed(() => {\n    const datasets = store.state.datasets.datasetList;\n    const dataset_id = reviewSettings.value?.reviewTask?.dataset_id;\n    const dataset = datasets.find((d) => d.id === dataset_id);\n    return dataset;\n  });\n\n  const sourceAnnotationSet = computed(() => {\n    const source_annotation_set_id = reviewSettings.value?.reviewTask?.source_annotation_set_id;\n    const sourceAnnotationSet = sourceDataset.value.annotation_sets.find((as) => as.id === source_annotation_set_id);\n    if (sourceAnnotationSet) {\n      return sourceAnnotationSet;\n    }\n    return null;\n  });\n\n  const hasSourceAnnotationSet = computed(() => Boolean(sourceAnnotationSet.value));\n\n  const destinationAnnotationSet = computed(() => {\n    const dest_annotation_set_id = reviewSettings.value?.reviewTask?.dest_annotation_set_id;\n    return sourceDataset.value.annotation_sets.find((as) => as.id === dest_annotation_set_id);\n  });\n\n  const groups = computed(() => {\n    if (sourceDataset.value?.groups) {\n      return sourceDataset.value.groups;\n    }\n    return [];\n  });\n\n  const hasReviewTask = computed(() => reviewSettings.value.reviewTask?.id);\n\n  const isAuditMode = computed(() => hasSourceAnnotationSet.value && (sourceAnnotationSet.value.id !== destinationAnnotationSet.value.id));\n\n  // Methods\n  async function getImageForTask(image_id) {\n    let imageResult;\n    if (hasReviewTask.value) {\n      const params = {\n        source_annotation_set_id: reviewSettings.value.reviewTask.source_annotation_set_id,\n        review_task_id: reviewSettings.value.reviewTask.id,\n        limit: 3,\n        images_filter: { dataset_id: reviewSettings.value.reviewTask.dataset_id },\n        annotations_filter: {},\n        aggregate_annotations_filter: {},\n      };\n      if (imageFilters.value && imageFilters.value.images_filter) {\n        params.images_filter = imageFilters.value.images_filter;\n      }\n      if (imageFilters.value && imageFilters.value.image_files_filter) {\n        params.image_files_filter = imageFilters.value.image_files_filter;\n      }\n      if (imageFilters.value && imageFilters.value.annotations_filter) {\n        params.annotations_filter = imageFilters.value.annotations_filter;\n      }\n\n      if (reviewSettings.value?.reviewTask.source_annotation_set_id) {\n        params.aggregate_annotations_filter.aggregate_annotation_set_ids = [reviewSettings.value.reviewTask.source_annotation_set_id];\n      }\n\n      if (auditorType.value === 'annotation') {\n        params.annotations_filter.images_with_annotation_set_ids = [reviewSettings.value.reviewTask.source_annotation_set_id];\n      }\n\n      if (image_id) {\n        params.image_id = image_id;\n      } else if (internalImageObj.value?.id) {\n        params.current_image_id = internalImageObj.value.id;\n      }\n\n      if (Object.keys(params.annotations_filter).length === 0) {\n        delete params.annotations_filter;\n      }\n\n      imageResult = await datastore.getLabellingImages(params)\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error.message);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          console.error(error);\n          alert(`Failed to get labelling images\\n${error.message}`);\n        });\n\n      if (!imageResult) {\n        isTaskComplete.value = true;\n      }\n    } else {\n      const params = {\n        id: reviewSettings.value.reviewTask.image_id,\n        annotation_set_id: reviewSettings.value.reviewTask.source_annotation_set_id,\n      };\n      imageResult = await datastore.getImage(params)\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error.message);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          console.error(error);\n          alert(`Failed to get labelling image\\n${error.message}`);\n        });\n      imageResult = [imageResult];\n    }\n\n    return imageResult;\n  }\n\n  async function getRemainingCount() {\n    return datastore.getReviewTaskRemainingCount({\n      review_task_id: reviewSettings.value.reviewTask.id,\n      dataset_id: reviewSettings.value.reviewTask.dataset_id,\n    })\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        throw error;\n      });\n  }\n\n  async function setImageReviewStatusDone({ review_task_id, image_id }) {\n    const params = { review_task_id, image_id };\n    const resp = await datastore.setImageReviewStatusDone(params)\n      .catch((error) => {\n        console.log(error);\n        alert('Failed to set image review status');\n      });\n    if (!resp || resp.error || !resp.result) {\n      if (resp.error) {\n        console.error(resp.error);\n        alert(`Failed to set image review status\\n${resp.error.message}`);\n      }\n    }\n    return resp;\n  }\n\n  async function setupTaskImages() {\n    // Get new image for task\n    pendingTaskImages.value = await getImageForTask();\n    if (pendingTaskImages.value?.length > 0) {\n      currentTaskImage.value = pendingTaskImages.value[0];\n    } else {\n      currentTaskImage.value = null;\n    }\n  }\n\n  async function skipTaskImage() {\n    if (hasReviewTask.value && doneImageOpen.value) {\n      switchToNextTaskImage();\n      getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n      return;\n    }\n\n    await datastore.deleteImageReviewStatus({\n      review_task_id: reviewSettings.value.reviewTask.id,\n      image_id: currentTaskImage.value.id,\n    })\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        console.error(error.message);\n        throw error;\n      });\n    if (pendingTaskImages.value?.length > 1) {\n      currentTaskImage.value = pendingTaskImages.value[1];\n    }\n    pendingTaskImages.value = await getImageForTask();\n  }\n\n  async function skipTaskSequence() {\n    if (hasReviewTask.value && doneImageOpen.value) {\n      switchToNextTaskImage();\n      getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n      return;\n    }\n\n    await datastore.deleteImageReviewStatus({\n      review_task_id: reviewSettings.value.reviewTask.id,\n      sequence_id: currentTaskImage.value.sequence_id,\n    })\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        console.error(error.message);\n        throw error;\n      });\n    if (pendingTaskImages.value?.length > 1) {\n      currentTaskImage.value = pendingTaskImages.value[1];\n    }\n    pendingTaskImages.value = await getImageForTask();\n  }\n\n  async function completeTaskSequence() {\n    if (hasReviewTask.value && doneImageOpen.value) {\n      switchToNextTaskImage();\n      getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n      return;\n    }\n\n    await datastore.setImageReviewStatusDone({\n      review_task_id: reviewSettings.value.reviewTask.id,\n      sequence_id: currentTaskImage.value.sequence_id,\n    })\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        console.error(error.message);\n        throw error;\n      });\n    if (pendingTaskImages.value?.length > 1) {\n      currentTaskImage.value = pendingTaskImages.value[1];\n    }\n    pendingTaskImages.value = await getImageForTask();\n  }\n\n  async function updateTaskImages() {\n    // Get new image for task\n    if (pendingTaskImages.value?.length > 1) {\n      currentTaskImage.value = pendingTaskImages.value[1];\n    } else {\n      currentTaskImage.value = null;\n    }\n\n    pendingTaskImages.value = await getImageForTask();\n    if (currentTaskImage.value === null && pendingTaskImages.value?.length > 0) {\n      // New pending images were found\n      currentTaskImage.value = pendingTaskImages.value[0];\n    }\n  }\n\n  async function switchToImageID(image_id) {\n    // Get new images from the given image_id\n    pendingTaskImages.value = await getImageForTask(image_id);\n    if (pendingTaskImages.value?.length > 0) {\n      currentTaskImage.value = pendingTaskImages.value[0];\n    } else {\n      currentTaskImage.value = null;\n    }\n  }\n\n  function switchToDoneImage(imageObj) {\n    activeImageIndex.value = null;\n    internalImageObj.value = imageObj;\n    const reviewedAnnotations = internalImageObj.value.annotations.filter((anno) => anno.annotation_set_id === reviewSettings.value.reviewTask.dest_annotation_set_id);\n    nextTick(() => { internalAnnotations.value = reviewedAnnotations; });\n  }\n\n  async function updateTaskImageFilters(newFilters) {\n    this.imageFilters = newFilters;\n    // Get new images for task\n    pendingTaskImages.value = await getImageForTask(currentTaskImage.value?.id);\n    if (pendingTaskImages.value?.length > 0) {\n      currentTaskImage.value = pendingTaskImages.value[0];\n    } else {\n      currentTaskImage.value = null;\n    }\n  }\n\n  function handleImageGroupChanged(group_id) {\n    internalImageObj.value.group_id = group_id;\n  }\n\n  async function deleteTaskImageFromDataset(image_id) {\n    const param = {\n      image_ids: [image_id],\n      dataset_id: sourceDataset.value.id,\n    };\n    const deletedResponse = await datastore.deleteImageFromDataset(param)\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch(async (error) => {\n        console.error(error.message);\n        await updateTaskImages();\n        throw error;\n      });\n\n    if (!doneImageOpen.value) {\n      await updateTaskImages();\n    } else {\n      switchToNextTaskImage();\n      await getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n    }\n\n    return deletedResponse;\n  }\n\n  // async function handleAuditSubmitAllAnnotations(initialEditingAnnotations) {\n  //   // Create/Update/Delete annotations in the destination set\n  //   const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n  //   const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n  //   submitAuditAnnotationsToDatabase(initialEditingAnnotations, internalAnnotations.value, source_annotation_set_id, dest_annotation_set_id)\n  //     .then((submittedAnnotations) => {\n  //     // Create Reviews in database\n  //       const createReviewPromises = [];\n  //       if (submittedAnnotations.length > 0) {\n  //         submittedAnnotations.forEach((anno) => {\n  //           const newReview = createAnnotationReviewInDatabase({ annotation_id: anno.id });\n  //           createReviewPromises.push(newReview);\n  //         });\n  //       } else {\n  //         const newReview = createAnnotationReviewInDatabase({ annotation_id: null });\n  //         createReviewPromises.push(newReview);\n  //       }\n  //       Promise.all(createReviewPromises);\n  //     });\n  // }\n\n  // async function handleAuditSubmitAcceptedAnnotations(initialEditingAnnotations) {\n  //   // Create/Update/Delete annotations in the destination set\n  //   const verifiedAnnotations = internalAnnotations.value.filter((anno) => anno.reviewStatus === 'verified');\n  //   const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n  //   const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n  //   submitAuditAnnotationsToDatabase(initialEditingAnnotations, verifiedAnnotations, source_annotation_set_id, dest_annotation_set_id)\n  //     .then((submittedAnnotations) => {\n  //       // Create Reviews in database\n  //       const createReviewPromises = [];\n  //       if (submittedAnnotations.length > 0) {\n  //         submittedAnnotations.forEach((anno) => {\n  //           const newReview = createAnnotationReviewInDatabase({ annotation_id: anno.id });\n  //           createReviewPromises.push(newReview);\n  //         });\n  //       } else {\n  //         const newReview = createAnnotationReviewInDatabase({ annotation_id: null });\n  //         createReviewPromises.push(newReview);\n  //       }\n  //       Promise.all(createReviewPromises);\n  //     });\n  // }\n\n  async function handleAuditSubmitAllAnnotations() {\n    // Submit image audit to the database\n    const initialAnnotations = internalImageObj.value.annotations;\n    const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n    const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n    const annotations = getAnnotationsForDatabase(initialAnnotations, internalAnnotations.value, source_annotation_set_id, dest_annotation_set_id, doneImageOpen.value);\n    const response = await datastore.submitAuditManualAnnotationTask(\n      {\n        create_annotations: annotations.create_annotations,\n        update_annotations: annotations.update_annotations,\n        delete_annotations: annotations.delete_annotations,\n        review_task_id: reviewSettings.value.reviewTask?.id,\n        review_session_id: reviewSettings.value.reviewSession?.id,\n        image_id: internalImageObj.value.id,\n        annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n        group_id: internalImageObj.value.group_id,\n      },\n    );\n\n    if (response.error) {\n      alert(\"Failed to submit\");\n      throw Error(\"Failed to submit\");\n    }\n\n    if (!hasReviewTask.value) {\n      return;\n    }\n\n    // Next done image\n    if (doneImageOpen.value) {\n      switchToNextTaskImage();\n      await getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n      return;\n    }\n\n    // Next Pending Task Image\n    await updateTaskImages();\n  }\n\n  async function handleAuditSubmitAcceptedAnnotations() {\n    // Submit image audit to the database\n    const initialAnnotations = internalImageObj.value.annotations;\n    const verifiedAnnotations = internalAnnotations.value.filter((anno) => anno.reviewStatus === 'verified');\n    const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n    const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n    const annotations = getAnnotationsForDatabase(initialAnnotations, verifiedAnnotations, source_annotation_set_id, dest_annotation_set_id, doneImageOpen.value);\n    const response = await datastore.submitAuditManualAnnotationTask(\n      {\n        create_annotations: annotations.create_annotations,\n        update_annotations: annotations.update_annotations,\n        delete_annotations: annotations.delete_annotations,\n        review_task_id: reviewSettings.value.reviewTask?.id,\n        review_session_id: reviewSettings.value.reviewSession?.id,\n        image_id: internalImageObj.value.id,\n        annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n        group_id: internalImageObj.value.group_id,\n      },\n    );\n\n    if (response.error) {\n      alert(\"Failed to submit\");\n      throw Error(\"Failed to submit\");\n    }\n\n    if (!hasReviewTask.value) {\n      return;\n    }\n\n    // Next done image\n    if (doneImageOpen.value) {\n      switchToNextTaskImage();\n      await getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n      return;\n    }\n\n    // Next Pending Task Image\n    await updateTaskImages();\n  }\n\n  async function handleFrameAuditSubmitAllAnnotations(imageObj) {\n    // Submit image audit to the database\n    const initialAnnotations = imageObj.annotations;\n    const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n    const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n    const annotations = getAnnotationsForDatabase(initialAnnotations, internalAnnotations.value, source_annotation_set_id, dest_annotation_set_id, doneImageOpen.value);\n    const response = await datastore.submitAuditManualAnnotationTask(\n      {\n        create_annotations: annotations.create_annotations,\n        update_annotations: annotations.update_annotations,\n        delete_annotations: annotations.delete_annotations,\n        review_task_id: reviewSettings.value.reviewTask?.id,\n        review_session_id: reviewSettings.value.reviewSession?.id,\n        image_id: imageObj.id,\n        annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n        group_id: imageObj.group_id,\n        sequence_id: imageObj.sequence_id,\n      },\n    );\n\n    if (response.error) {\n      alert(\"Failed to submit\");\n      throw Error(\"Failed to submit\");\n    }\n\n    // Next Pending Task Image\n    // await updateTaskImages();\n  }\n\n  async function handleFrameAuditSubmitAcceptedAnnotations(imageObj) {\n    // Submit image audit to the database\n    const initialAnnotations = imageObj.annotations;\n    const verifiedAnnotations = internalAnnotations.value.filter((anno) => anno.reviewStatus === 'verified');\n    const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n    const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n    const annotations = getAnnotationsForDatabase(initialAnnotations, verifiedAnnotations, source_annotation_set_id, dest_annotation_set_id, doneImageOpen.value);\n    const response = await datastore.submitAuditManualAnnotationTask(\n      {\n        create_annotations: annotations.create_annotations,\n        update_annotations: annotations.update_annotations,\n        delete_annotations: annotations.delete_annotations,\n        review_task_id: reviewSettings.value.reviewTask?.id,\n        review_session_id: reviewSettings.value.reviewSession?.id,\n        image_id: imageObj.id,\n        annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n        group_id: imageObj.group_id,\n        sequence_id: imageObj.sequence_id,\n      },\n    );\n\n    if (response.error) {\n      alert(\"Failed to submit\");\n      throw Error(\"Failed to submit\");\n    }\n\n    // Next Pending Task Image\n    // await updateTaskImages();\n  }\n\n  async function handleLabellingSubmitAnnotations() {\n    // Submit image labelling to the database\n    const initialAnnotations = internalImageObj.value.annotations;\n    const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n    const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n    const annotations = getAnnotationsForDatabase(initialAnnotations, internalAnnotations.value, source_annotation_set_id, dest_annotation_set_id, doneImageOpen.value);\n    const response = await datastore.submitAuditManualAnnotationTask(\n      {\n        create_annotations: annotations.create_annotations,\n        update_annotations: annotations.update_annotations,\n        delete_annotations: annotations.delete_annotations,\n        review_task_id: reviewSettings.value.reviewTask.id,\n        review_session_id: reviewSettings.value.reviewSession?.id,\n        image_id: internalImageObj.value.id,\n        annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n        group_id: internalImageObj.value.group_id,\n      },\n    );\n\n    if (response.error) {\n      alert(\"Failed to submit\");\n      throw Error(\"Failed to submit\");\n    }\n\n    // Next done image\n    if (doneImageOpen.value) {\n      switchToNextTaskImage();\n      await getTaskDoneImagesByUser()\n        .then((newDoneImages) => {\n          doneImages.value = newDoneImages;\n        });\n      return;\n    }\n\n    // Next Pending Task Image\n    await updateTaskImages();\n  }\n\n  async function handleFrameLabellingSubmitAnnotations(imageObj) {\n    // Submit image frame labelling to the database\n    const initialAnnotations = imageObj.annotations;\n    const source_annotation_set_id = reviewSettings.value.reviewTask.source_annotation_set_id;\n    const dest_annotation_set_id = reviewSettings.value.reviewTask.dest_annotation_set_id;\n    const annotations = getAnnotationsForDatabase(initialAnnotations, internalAnnotations.value, source_annotation_set_id, dest_annotation_set_id, doneImageOpen.value);\n    const response = await datastore.submitAuditManualAnnotationTask(\n      {\n        create_annotations: annotations.create_annotations,\n        update_annotations: annotations.update_annotations,\n        delete_annotations: annotations.delete_annotations,\n        review_task_id: reviewSettings.value.reviewTask.id,\n        review_session_id: reviewSettings.value.reviewSession?.id,\n        image_id: imageObj.id,\n        annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n        group_id: imageObj.group_id,\n        sequence_id: imageObj.sequence_id,\n      },\n    );\n\n    if (response.error) {\n      alert(\"Failed to submit\");\n      throw Error(\"Failed to submit\");\n    }\n\n    // Next Pending Task Image\n    // await updateTaskImages();\n  }\n\n  // async function submitPCDFile() {\n  //   const annotation_id = pcdAnnotations.value[0].id;\n  //   const newFile = createPCDFile();\n  //   const dataConnect = new DatastoreConnect();\n  //   await dataConnect.updateAnnotationFile(annotation_id, new Blob([newFile], { type: 'text/plain' }));\n  // }\n\n  function acceptAllAnnotations() {\n    internalAnnotations.value.forEach((anno) => {\n      anno.reviewStatus = 'verified';\n    });\n  }\n\n  async function getTaskSequences() {\n    const dataConnect = new DatastoreConnect();\n    return dataConnect.getFilteredImages({\n      combine_sequence_frames: true,\n      sort_by: \"id\",\n      images_filter: {\n        dataset_id: sourceDataset.value.id,\n      },\n      image_files_filter: {},\n      annotations_filter: {},\n      only_sequences: true,\n      // dataset_id: sourceDataset.value.id,\n    })\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        throw error;\n      });\n  }\n\n  return {\n    startTask,\n    submitType,\n    internalImageObj,\n    internalAnnotations,\n    currentTaskImage,\n    pendingTaskImages,\n    isTaskComplete,\n    sourceDataset,\n    sourceAnnotationSet,\n    hasSourceAnnotationSet,\n    destinationAnnotationSet,\n    isAuditMode,\n    groups,\n    remainingImagesCount,\n    totalImagesCount,\n    auditorType,\n    isFetchingNewImage,\n    imageFilters,\n    hasReviewTask,\n    setImageReviewStatusDone,\n    setupTaskImages,\n    skipTaskImage,\n    skipTaskSequence,\n    completeTaskSequence,\n    updateTaskImages,\n    updateTaskImageFilters,\n    handleImageGroupChanged,\n    deleteTaskImageFromDataset,\n    handleAuditSubmitAllAnnotations,\n    handleAuditSubmitAcceptedAnnotations,\n    handleFrameAuditSubmitAllAnnotations,\n    handleFrameAuditSubmitAcceptedAnnotations,\n    handleLabellingSubmitAnnotations,\n    handleFrameLabellingSubmitAnnotations,\n    acceptAllAnnotations,\n    switchToImageID,\n    switchToDoneImage,\n    getTaskSequences,\n    // Task history\n    activeImageIndex,\n    doneImages,\n    doneImageOpen,\n    getTaskDoneImagesByUser,\n    switchToTaskImage,\n    switchToNextTaskImage,\n    switchToPreviousTaskImage,\n  };\n}\n","import { render } from \"./AnnotationToolRibbon.vue?vue&type=template&id=5663cbd8&scoped=true\"\nimport script from \"./AnnotationToolRibbon.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationToolRibbon.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationToolRibbon.vue?vue&type=style&index=0&id=5663cbd8&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5663cbd8\"]])\n\nexport default __exports__","import usePCD from '@/composables/annotationTool/usePCD.js';\n\nexport default function useProjection() {\n  const {\n    getPointsColorByXValue,\n  } = usePCD();\n\n  const zxydwh2xyzmin = [\n    [0, 0, 1, 0, 0, -0.5, 0],\n    [0, 0, 0, 1, 0, 0, -0.5],\n    [0, 1, 0, 0, 0, 0, 0],\n  ];\n\n  const zxydwh2xyzmax = [\n    [0, 0, 1, 0, 0, 0.5, 0],\n    [0, 0, 0, 1, 0, 0, 0.5],\n    [0, 1, 0, 0, 0, 0, 0],\n  ];\n\n  const coordinateTransform = [\n    [-1, 0, 1],\n    [0, -1, 1],\n    [0, 0, 1],\n  ];\n\n  function transpose(matrix) {\n    return matrix[0].map((col, c) => matrix.map((row, r) => matrix[r][c]));\n  }\n\n  function multRow(a, r, m) {\n    const nr = a.length; const\n      nc = a[0].length;\n    for (let c = 0; c < nc; c++) {\n      a[r][c] = a[r][c] * m;\n    }\n    return a;\n  }\n\n  function normalizeByLastRow(a) {\n    const nr = a.length; const\n      nc = a[0].length;\n    for (let r = 0; r < nr; r++) {\n      for (let c = 0; c < nc; c++) {\n        a[r][c] = a[r][c] / a[nr - 1][c];\n      }\n    }\n    return a;\n  }\n\n  function maximum(a, b) {\n    const d = [];\n    const nr = a.length; const\n      nc = a[0].length;\n    for (let r = 0; r < nr; r++) {\n      d[r] = [];\n      for (let c = 0; c < nc; c++) {\n        d[r][c] = Math.max(a[r][c], b[r][c]);\n      }\n    }\n    return d;\n  }\n\n  function minimum(a, b) {\n    const nr = a.length; const\n      nc = a[0].length;\n    const d = [];\n    for (let r = 0; r < nr; r++) {\n      d[r] = [];\n      for (let c = 0; c < nc; c++) {\n        d[r][c] = Math.min(a[r][c], b[r][c]);\n      }\n    }\n    return d;\n  }\n\n  function subtract(a, b) {\n    const nr = a.length; const\n      nc = a[0].length;\n    const d = [];\n    for (let r = 0; r < nr; r++) {\n      d[r] = [];\n      for (let c = 0; c < nc; c++) {\n        d[r][c] = a[r][c] - b[r][c];\n      }\n    }\n    return d;\n  }\n\n  function dropLastRow(a) {\n    const nr = a.length; const\n      nc = a[0].length;\n    const b = [];\n    for (let r = 0; r < nr - 1; r++) {\n      b[r] = [];\n      for (let c = 0; c < nc; c++) {\n        b[r][c] = a[r][c];\n      }\n    }\n    return b;\n  }\n\n  function multiply(a, b) {\n    const aNumRows = a.length; const aNumCols = a[0].length;\n    const bNumRows = b.length; const bNumCols = b[0].length;\n    const m = new Array(aNumRows); // initialize array of rows\n    for (let r = 0; r < aNumRows; ++r) {\n      m[r] = new Array(bNumCols); // initialize the current row\n      for (let c = 0; c < bNumCols; ++c) {\n        m[r][c] = 0; // initialize the current cell\n        for (let i = 0; i < aNumCols; ++i) {\n          m[r][c] += a[r][i] * b[i][c];\n        }\n      }\n    }\n    return m;\n  }\n\n  function convert3d2d(bb3d, intrinsic) {\n    const [fx, fy, cx, cy] = intrinsic;\n\n    const height = cy * 2;\n    const width = cx * 2;\n\n    // Camera matrix that produces normalized bounding boxes.\n    const cameraMatrix = [\n      [fx / width, 0, cx / width],\n      [0, fy / height, cy / height],\n      [0, 0, 1],\n    ];\n\n    const xyzmin = multiply(zxydwh2xyzmin, transpose(bb3d));\n    let bbmin = multiply(cameraMatrix, xyzmin);\n    bbmin = normalizeByLastRow(bbmin);\n    bbmin = multiply(coordinateTransform, bbmin);\n    bbmin = dropLastRow(bbmin);\n    bbmin = multRow(bbmin, 0, width);\n    bbmin = multRow(bbmin, 1, height);\n\n    const xyzmax = multiply(zxydwh2xyzmax, transpose(bb3d));\n    let bbmax = multiply(cameraMatrix, xyzmax);\n    bbmax = normalizeByLastRow(bbmax);\n    bbmax = multiply(coordinateTransform, bbmax);\n    bbmax = dropLastRow(bbmax);\n    bbmax = multRow(bbmax, 0, width);\n    bbmax = multRow(bbmax, 1, height);\n\n    const bbmax_ = maximum(bbmax, bbmin);\n    bbmin = minimum(bbmax, bbmin);\n    let sizes = subtract(bbmax_, bbmin);\n\n    bbmin = transpose(bbmin);\n    sizes = transpose(sizes);\n\n    const boxes = [];\n    for (let k = 0; k < bbmin.length; k++) {\n      const b2 = {\n        x: bbmin[k][0],\n        y: bbmin[k][1],\n        width: sizes[k][0],\n        height: sizes[k][1],\n      };\n\n      boxes.push(b2);\n    }\n\n    return boxes;\n  }\n\n  // Assuming your intrinsic parameters are like: [fx, fy, cx, cy]\n  async function drawPCDPoints(\n    pcdPoints,\n    image_width,\n    image_height,\n    options = {},\n  ) {\n    if (!pcdPoints || !image_width || !image_height) return null;\n\n    const {\n      radius = 2,\n      camera_fx = 1240.31,\n      camera_fy = 1232.88,\n    } = options;\n\n    const geometry = pcdPoints.geometry;\n    const positionAttribute = geometry.getAttribute('position');\n\n    const colors = getPointsColorByXValue(positionAttribute);\n\n    // Extract the 3D points (position array) from the BufferGeometry.\n    const points = [];\n    const filteredColors = [];\n    for (let i = 0; i < positionAttribute.count; i++) {\n      const x = positionAttribute.getX(i);\n      const y = positionAttribute.getY(i);\n      const z = positionAttribute.getZ(i);\n\n      if (x >= 0) {\n        points.push([0, x, y, z, 0.5, 0.5, 0.5]);\n        filteredColors.push(colors[i]); // Keep color for valid points\n      }\n    }\n\n    // Assuming your intrinsic parameters are like: [fx, fy, cx, cy]\n    // Calculate intrinsic parameters for camera projection (as in the Python code)\n    const cameraIntrinsic = [camera_fx, camera_fy, image_width / 2, image_height / 2]; // Replace with actual values\n\n    // Convert all 3d points to 2d\n    const convertedPoints = convert3d2d(points, cameraIntrinsic);\n\n    // Get 2d point centers\n    const centers_2d = convertedPoints.map((point) => ({\n      x: point.x + (point.width / 2),\n      y: point.y + (point.height / 2),\n    }));\n\n    // Draw the LiDAR image\n    const canvas = document.createElement(\"canvas\");\n    const ctx = canvas.getContext(\"2d\");\n    canvas.width = image_width;\n    canvas.height = image_height;\n    ctx.clearRect(0, 0, image_width, image_height);\n    centers_2d.forEach((center, i) => {\n      const r = Math.floor(filteredColors[i].r * 255);\n      const g = Math.floor(filteredColors[i].g * 255);\n      const b = Math.floor(filteredColors[i].b * 255);\n      ctx.beginPath();\n      ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\n      ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;\n      ctx.fill();\n    });\n\n    // Create and load the image asynchronously\n    const img = new Image();\n    const loadImage = new Promise((resolve) => {\n      img.onload = () => resolve(img);\n      img.src = canvas.toDataURL();\n    });\n\n    // Wait for the image to load\n    const loadedImg = await loadImage;\n    return loadedImg;\n  }\n\n  return {\n    drawPCDPoints,\n  };\n}\n","// workerPool.js\n// import WorkerScript from '@/workers/cacheWorker.js?worker';\n\nexport class WorkerPool {\n  constructor(workerUrl, maxWorkers = 6) {\n    this.maxWorkers = maxWorkers;\n    this.workerQueue = [];\n    this.activeWorkers = 0;\n    this.workerPool = [];\n    this.listeners = [];\n    this.workerStatus = new Map(); // Track busy workers\n\n    for (let i = 0; i < maxWorkers; i++) {\n      //   const worker = new Worker(workerUrl);\n      const worker = new Worker(new URL('./cacheWorker.js', import.meta.url), {\n        type: 'module',\n      });\n      // Track worker status\n      this.workerStatus.set(worker, false); // false = available\n\n      // Listen for messages from each worker\n      worker.onmessage = (event) => {\n        if (event.data.error) {\n          this.handleWorkerError(event.data.error, worker);\n        }\n\n        // console.log('Worker response:', event);\n        this.workerStatus.set(worker, false); // Mark worker as available\n        this.activeWorkers--;\n\n        this.notifyListeners({\n          type: 'result',\n          data: event.data,\n        });\n\n        // Process next task in the queue if available\n        if (this.workerQueue.length > 0) {\n          this.assignTask(this.workerQueue.shift());\n        }\n      };\n\n      // Listen for errors from each worker\n      worker.onerror = (errorEvent) => this.handleWorkerError(errorEvent.error, worker);\n\n      this.workerPool.push(worker);\n    }\n  }\n\n  addTask(taskData) {\n    if (this.activeWorkers < this.maxWorkers) {\n      this.assignTask(taskData);\n    } else {\n      // console.log('Queueing task', taskData);\n      this.workerQueue.push(taskData);\n    }\n  }\n\n  assignTask(taskData) {\n    const worker = this.getAvailableWorker();\n    if (worker) {\n      this.activeWorkers++;\n      this.workerStatus.set(worker, true); // Mark worker as busy\n\n      // Notify that the worker has started processing\n      this.notifyListeners({\n        type: 'started',\n        worker,\n        data: taskData,\n      });\n\n      // console.log('Assigning task:', taskData);\n      worker.postMessage(taskData);\n    } else {\n      console.warn('No available worker, adding to queue');\n      this.workerQueue.push(taskData);\n    }\n  }\n\n  getAvailableWorker() {\n    return [...this.workerStatus.keys()].find((worker) => !this.workerStatus.get(worker));\n  }\n\n  notifyListeners(data) {\n    // console.log('notifyListeners');\n    this.listeners.forEach((listener) => listener(data));\n  }\n\n  onmessage(callback) {\n    // console.log('onmessage');\n    this.listeners.push(callback);\n  }\n\n  terminate() {\n    this.workerPool.forEach((worker) => worker.terminate());\n  }\n\n  clearQueue() {\n    // console.log('Clearing pending tasks');\n    this.workerQueue = [];\n  }\n\n  getQueue() {\n    return this.workerQueue;\n  }\n\n  handleWorkerError(error, worker) {\n    console.error('Worker error:', error.message);\n    this.workerStatus.set(worker, false); // Free up worker\n    this.activeWorkers--; // Prevent deadlock\n\n    // Process next task\n    if (this.workerQueue.length > 0) {\n      this.assignTask(this.workerQueue.shift());\n    }\n  }\n\n  restartWorkers() {\n    // Terminate all existing workers\n    this.workerPool.forEach((worker) => worker.terminate());\n\n    // Clear the worker pool, status map, and queue\n    this.workerPool = [];\n    this.workerStatus.clear();\n    this.workerQueue = [];\n    this.activeWorkers = 0;\n\n    // Create new workers\n    for (let i = 0; i < this.maxWorkers; i++) {\n      const worker = new Worker(new URL('./cacheWorker.js', import.meta.url), {\n        type: 'module',\n      });\n\n      this.workerStatus.set(worker, false); // Mark as available\n\n      worker.onmessage = (event) => {\n        if (event.data.error) {\n          this.handleWorkerError(event.data.error, worker);\n        }\n\n        this.workerStatus.set(worker, false);\n        this.activeWorkers--;\n\n        this.notifyListeners({\n          type: 'result',\n          data: event.data,\n        });\n\n        if (this.workerQueue.length > 0) {\n          this.assignTask(this.workerQueue.shift());\n        }\n      };\n\n      worker.onerror = (errorEvent) => this.handleWorkerError(errorEvent.error, worker);\n\n      this.workerPool.push(worker);\n    }\n  }\n}\n","import { storeToRefs } from 'pinia';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport pLimit from 'p-limit';\nimport { useStore } from 'vuex';\nimport usePCD from '@/composables/annotationTool/usePCD.js';\nimport { decode } from 'fast-png';\nimport { shallowRef, nextTick } from 'vue';\nimport useProjection from '@/composables/annotationTool/useProjection.js';\nimport * as THREE from 'three';\nimport { WorkerPool } from '@/workers/workerPool.js';\n\nexport default function useViewerVisualizations() {\n  const cacheWorkerPool = new WorkerPool('@/workers/cacheWorker.js');\n  const store = useStore();\n  const max_concurrent_req = 6;\n  const limit = pLimit(max_concurrent_req);\n  const bufferLength = 300;\n  const backCache = 20;\n  const cacheTypes = ['pcd'];\n  const blobCacheTypes = ['depthmap'];\n  const arrayBufferCacheTypes = ['lidar'];\n  const fpsSkipMap = {\n    1: { fps: 1, skip: 0 },\n    5: { fps: 5, skip: 0 },\n    10: { fps: 10, skip: 0 },\n    20: { fps: 10, skip: 1 },\n    100: { fps: 10, skip: 10 },\n  };\n\n  const visualizationStore = useViewerVisualizationsStore();\n  const {\n    samples,\n    animationImageCache,\n    frame,\n    playing,\n    buffered,\n    currentAnimationSample,\n    keyframes,\n    doKeyframesExist,\n    frameCount,\n    fps,\n    isInitializingAnimation,\n    abortControllerForCaching,\n    topics,\n    limitAnnotationsToSet,\n  } = storeToRefs(visualizationStore);\n  const {\n    pauseAnimation,\n    addNewSampleToCache,\n    clearSample,\n    updateSample,\n    throttledUpdateSample,\n    resetForNewSequence,\n    getAnimationDelay,\n    $reset,\n  } = visualizationStore;\n\n  const {\n    parsePCDFile, parsePCDFileAsPointsBuffer, colorPointsByXValue, setPointsMaterial,\n  } = usePCD();\n\n  const {\n    drawPCDPoints,\n  } = useProjection();\n\n  function getAnnotationResponseDataType(annotation) {\n    if (cacheTypes.includes(annotation.type)) {\n      return 'text';\n    }\n    if (blobCacheTypes.includes(annotation.type)) {\n      return 'blob';\n    }\n    if (arrayBufferCacheTypes.includes(annotation.type)) {\n      return 'arrayBuffer';\n    }\n    return 'text';\n  }\n\n  async function cacheImages() {\n    cacheWorkerPool.clearQueue();\n\n    const lower = Math.max(0, frame.value - 1 - backCache);\n    const upper = Math.min(frame.value - 1 + bufferLength, samples.value.length - 1);\n    const temp = {};\n\n    // Clear the unloaded cache and the out of range cache\n    for (let key = lower; key <= upper; key++) {\n      if (\n        key in animationImageCache.value\n          && (animationImageCache.value[key]?.loaded\n            || (!animationImageCache.value[key].loaded && animationImageCache.value[key].loading))\n      ) {\n        temp[key] = animationImageCache.value[key];\n      }\n    }\n\n    animationImageCache.value = temp;\n\n    // const samplePromises = [];\n    for (let i = lower; i <= upper; i++) {\n      if (!animationImageCache.value[i]) {\n        addNewSampleToCache(i);\n        // if loadsample is called outside of limit() it will run regardless of limit\n        // samplePromises.push(limit(() => loadSampleToCache(samples.value[i], i, null).catch(() => {\n        //   if (animationImageCache.value[i]) { animationImageCache.value[i].loading = false; }\n        // })));\n        cacheWorkerPool.addTask({ index: i, imageId: samples.value[i], token: store.state.user.token });\n      }\n    }\n    // console.log('samplePromises:', samplePromises.length);\n    // if (samplePromises.length > 0) {\n    //   await Promise.all(samplePromises);\n    // }\n  }\n\n  async function fetchImageObjAndAnnotations(imageId) {\n    return new Promise(async (resolve, reject) => {\n      if (!imageId) {\n        reject(new Error(\"Missing Image Id\"));\n      }\n\n      const dataConnect = new DatastoreConnect();\n      dataConnect.getImage(\n        {\n          id: imageId,\n          get_annotations: true,\n        },\n      )\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw new Error(`Error loading image object`);\n          }\n          resolve(resp.result);\n        })\n        .catch((e) => {\n          console.log(e);\n          reject(e);\n        });\n    });\n  }\n\n  // async function fetchAnnotations(sample, index) {\n  //   return new Promise((resolve, reject) => {\n  //     const dataConnect = new DatastoreConnect();\n  //     try {\n  //       dataConnect.getAnnotations(\n  //         {\n  //           image_id: sample.id,\n  //           annotation_set_id: selectedAnnotationSets.value,\n  //         },\n  //       ).then((data) => {\n  //         if (!data.result || data.error) {\n  //           if (animationImageCache.value[index] && animationImageCache.value[index].annotations) {\n  //             animationImageCache.value[index].annotations = [];\n  //             resolve([]);\n  //           } else {\n  //             // reject(new Error(`Sample value ${index} does not exist. Can not set value \"annotations\"`));\n  //             resolve(null);\n  //           }\n  //         } else {\n  //           if (animationImageCache.value[index] && animationImageCache.value[index].annotations) {\n  //             animationImageCache.value[index].annotations = data.result;\n  //             resolve(data.result);\n  //           } else {\n  //             resolve(null);\n  //             // reject(new Error(`Sample value ${index} does not exist. Can not set value \"annotations\"`));\n  //           }\n  //         }\n  //       }).catch((e) => {\n  //         reject(e);\n  //       });\n  //     } catch (error) {\n  //       reject(error);\n  //     }\n  //   });\n  // }\n\n  async function loadSample(imageId, localSignal) {\n    return new Promise((resolve, reject) => {\n      if (localSignal && localSignal.aborted) {\n        reject(new Error(`Loading sample aborted`));\n      }\n\n      loadImage(imageId)\n        .then(async (image) => {\n          if (localSignal && localSignal.aborted) {\n            reject(new Error(`Loading sample aborted`));\n          }\n          currentAnimationSample.value.image = image;\n          const imageObjAndAnnotations = await fetchImageObjAndAnnotations(imageId);\n          const cacheEntry = await loadAnnotationUrls(image, imageId, null, imageObjAndAnnotations.annotations, localSignal);\n          cacheEntry.image = image;\n          cacheEntry.imageObj = imageObjAndAnnotations;\n          cacheEntry.annotations = imageObjAndAnnotations.annotations;\n          return cacheEntry;\n        })\n        .then((cacheEntry) => {\n          if (localSignal && localSignal.aborted) {\n            reject(new Error(`Loading sample aborted`));\n          } else {\n            currentAnimationSample.value = {\n              ...currentAnimationSample.value,\n              ...cacheEntry,\n              loaded: true,\n            };\n          }\n          resolve();\n        })\n        .catch((e) => {\n          if (localSignal && localSignal.aborted) {\n            reject(new Error(`Loading sample aborted`));\n          }\n          // ignore errors\n          console.warn(e, `Skipped frame`);\n          currentAnimationSample.value.failed = true;\n          currentAnimationSample.value.loaded = true;\n          resolve();\n        });\n    });\n  }\n\n  async function parseAnnotation(annotationCacheEntry, image, annotation, localSignal) {\n    if (annotation.type === 'pcd' && annotation.data) {\n      const pointsBuffer = shallowRef(null);\n      pointsBuffer.value = parsePCDFileAsPointsBuffer(annotation.data);\n      setPointsMaterial(pointsBuffer.value.material);\n      annotationCacheEntry.pcd = annotationCacheEntry.pcd || [];\n      annotationCacheEntry.pcd.push({\n        annotation,\n        pointsBuffer,\n      });\n      if (image) {\n        const projectionImage = await drawPCDPoints(pointsBuffer.value, image.width, image.height, { radius: 4 });\n        annotationCacheEntry.pcdProjections = annotationCacheEntry.pcdProjections || [];\n        annotationCacheEntry.pcdProjections.push(projectionImage);\n      }\n    }\n    if (annotation.type === 'depthmap' && annotation.data) {\n      const resultImage = await convertBlobToGradientImage(annotation.data, localSignal);\n      annotationCacheEntry.depthmap = annotationCacheEntry.depthmap || [];\n      annotationCacheEntry.depthmap.push(resultImage);\n    }\n    if (annotation.type === 'lidar' && annotation.data) {\n      const pointsBuffer = shallowRef(null);\n      pointsBuffer.value = parsePCDFileAsPointsBuffer(annotation.data);\n      colorPointsByXValue(pointsBuffer.value);\n      annotationCacheEntry.lidar = annotationCacheEntry.lidar || [];\n      annotationCacheEntry.lidar.push({\n        annotation,\n        pointsBuffer,\n      });\n      if (image) {\n        const projectionImage = await drawPCDPoints(pointsBuffer.value, image.width, image.height);\n        annotationCacheEntry.lidarProjections = annotationCacheEntry.lidarProjections || [];\n        annotationCacheEntry.lidarProjections.push(projectionImage);\n      }\n    }\n    return annotationCacheEntry;\n  }\n\n  async function loadAnnotationUrls(image, image_id, sampleIndex, annotations, localSignal) {\n    if (localSignal && localSignal.aborted) {\n      Promise.reject(new Error(`Loading sample ${sampleIndex} aborted`));\n    }\n    if (image_id && annotations) {\n      const annotationPromises = [];\n      const dataConnect = new DatastoreConnect();\n      const annotationCacheEntry = {};\n      annotations.forEach((anno) => {\n        if (anno.data_url) {\n          annotationPromises.push(\n            new Promise(async (resolve, reject) => {\n              const data = await dataConnect.getAnnotationFile(anno.id, getAnnotationResponseDataType(anno), null);\n              anno.data = data;\n              await parseAnnotation(annotationCacheEntry, image, anno, localSignal);\n              resolve();\n            }),\n          );\n        } else if (anno.polygon && cacheTypes.includes(anno.type)) {\n          annotationPromises.push(\n            new Promise(async (resolve, reject) => {\n              const textEncoder = new TextEncoder();\n              const arrayBuffer = textEncoder.encode(anno.polygon).buffer;\n              anno.data = arrayBuffer;\n              await parseAnnotation(annotationCacheEntry, image, anno, localSignal);\n              resolve();\n            }),\n          );\n        }\n      });\n      const results = await Promise.allSettled(annotationPromises);\n      const allSuccess = results.every((result) => result.status === 'fulfilled');\n      if (!allSuccess) {\n        if (sampleIndex) {\n          Promise.reject(new Error(`Load annotations for sample ${sampleIndex} missing data`));\n        } else {\n          Promise.reject(new Error(`Load annotations for current sample missing data`));\n        }\n      }\n      return annotationCacheEntry;\n    }\n    if (sampleIndex) {\n      return Promise.reject(new Error(`Load annotations for sample ${sampleIndex} missing data`));\n    } else {\n      return Promise.reject(new Error(`Load annotations for current sample missing data`));\n    }\n  }\n\n  async function loadSampleToCache(imageId, index, localSignal) {\n    return new Promise((resolve, reject) => {\n      if (localSignal && localSignal.aborted) {\n        reject(new Error(`Loading sample ${index} aborted`));\n      }\n      animationImageCache.value[index].loading = true;\n\n      loadImage(imageId, index)\n        .then(async (image) => {\n          if (localSignal && localSignal.aborted) {\n            reject(new Error(`Loading sample ${index} aborted`));\n          } else {\n            const imageObjAndAnnotations = await fetchImageObjAndAnnotations(imageId);\n            const cacheEntry = await loadAnnotationUrls(image, imageId, index, imageObjAndAnnotations.annotations, localSignal);\n            cacheEntry.image = image;\n            cacheEntry.imageObj = imageObjAndAnnotations;\n            cacheEntry.annotations = imageObjAndAnnotations.annotations;\n            return cacheEntry;\n          }\n        })\n        .then((cacheEntry) => {\n          if (localSignal && localSignal.aborted) {\n            reject(new Error(`Loading sample aborted`));\n          } else {\n            if (animationImageCache.value && animationImageCache.value[index]) {\n              animationImageCache.value[index] = {\n                ...animationImageCache.value[index],\n                ...cacheEntry,\n                loaded: true,\n              };\n            }\n          }\n          resolve();\n        })\n        .catch((e) => {\n          // ignore errors\n          console.log(e, `Skipped frame`);\n          if (localSignal && localSignal.aborted) {\n            reject(new Error(`Loading sample aborted`));\n          } else {\n            if (animationImageCache.value && animationImageCache.value[index]) {\n              animationImageCache.value[index].failed = true;\n              animationImageCache.value[index].loaded = true;\n              animationImageCache.value[index].loading = false;\n            }\n            resolve();\n          }\n        });\n    });\n  }\n\n  function loadImage(image_id) {\n    if (image_id) {\n      return new Promise(async (resolve, reject) => {\n        await fetch(`image/redirect/${image_id}`, {\n          method: 'GET',\n          headers: {\n            'Authorization': `Bearer ${store.state.user.token}`,\n          },\n        })\n          .then((response) => {\n            if (!response.ok) {\n              throw new Error(`Error loading image`);\n            }\n            return response.blob();\n          })\n          .then((blob) => {\n            const image = document.createElement('img');\n            image.onerror = (e) => {\n              reject(e);\n            };\n            image.onload = () => {\n              // Add review status to annotation if it exists\n              // if (imageObj.review_status === 'Done' && imageObj.annotations) {\n              //   imageObj.annotations.forEach((anno) => {\n              //     anno.reviewStatus = 'verified';\n              //   });\n              // }\n\n              resolve(image);\n            };\n            image.src = URL.createObjectURL(blob);\n          })\n          .catch((e) => {\n            console.log(e);\n            reject();\n          });\n      });\n    }\n  }\n\n  async function startAnimation() {\n    playing.value = true;\n    const delay = (ms) => new Promise((resolve) => {\n      setTimeout(() => resolve(), ms);\n    }, ms);\n\n    // const lastFrame = Math.max(0, Math.max(...Object.keys(animationImageCache.value).map((e) => parseInt(e))));\n\n    if (frame.value === frameCount.value + 1) {\n      frame.value = 1;\n    }\n\n    while (true) {\n      // Break if paused\n      if (!playing.value) {\n        break;\n      }\n      if (frame.value + 1 <= frameCount.value + 1 && animationImageCache.value?.[frame.value]?.loaded) {\n        let nextFrame = frame.value + 1 + fpsSkipMap[fps.value].skip;\n        if (nextFrame > frameCount.value) {\n          nextFrame = frameCount.value;\n        }\n        frame.value = nextFrame;\n        updateSample();\n        nextTick(() => {\n          cacheImages();\n        });\n      }\n      await delay(getAnimationDelay(fpsSkipMap[fps.value].fps));\n      if (frame.value === frameCount.value + 1) {\n        break;\n      }\n    }\n    playing.value = false;\n  }\n\n  async function convertBlobToGradientImage(uint16Array, localSignal) {\n    try {\n    // Convert the uint16Array to an ArrayBuffer\n      const arrayBuffer = await uint16Array.arrayBuffer();\n\n      // Decode the image\n      const decodedImage = await decode(arrayBuffer);\n      const depthData16Bit = decodedImage.data; // Read as 16-bit data\n      const width = decodedImage.width;\n      const height = decodedImage.height;\n\n      // Calculate min and max depth values\n      let minDepthValue = Infinity;\n      let maxDepthValue = -Infinity;\n\n      for (let i = 0; i < depthData16Bit.length; i++) {\n        const value = depthData16Bit[i];\n        minDepthValue = Math.min(minDepthValue, value);\n        maxDepthValue = Math.max(maxDepthValue, value);\n      }\n\n      // Create OffscreenCanvas\n      const offscreenCanvas = new OffscreenCanvas(width, height);\n      const ctx = offscreenCanvas.getContext('2d');\n\n      // Create ImageData object for the OffscreenCanvas\n      const imageData = ctx.createImageData(width, height);\n      const data = imageData.data;\n\n      // Process each 16-bit depth value and map it to red-blue\n      for (let i = 0; i < depthData16Bit.length; i++) {\n        const depth16Bit = depthData16Bit[i];\n\n        // Normalize depth to a range [0, 1]\n        const normalizedDepth = (depth16Bit - minDepthValue) / (maxDepthValue - minDepthValue);\n\n        // Scale normalized depth to [0, 255]\n        const scaledDepth = Math.floor(normalizedDepth * 255);\n\n        // Map normalized grayscale to red-blue gradient\n        const red = Math.min(255, 2 * scaledDepth); // Red increases as depth decreases\n        const blue = Math.min(255, 2 * (255 - scaledDepth)); // Blue increases as depth increases\n        const green = 0; // No green in the gradient\n\n        // Set pixel color in the image data\n        const pixelIndex = i * 4;\n        data[pixelIndex] = red; // Red\n        data[pixelIndex + 1] = green; // Green\n        data[pixelIndex + 2] = blue; // Blue\n        data[pixelIndex + 3] = 255; // Full opacity\n      }\n\n      // Put the modified pixel data back onto the OffscreenCanvas\n      ctx.putImageData(imageData, 0, 0);\n\n      // Convert the OffscreenCanvas to a blob\n      const newBlob = await offscreenCanvas.convertToBlob();\n\n      // Create an image from the blob\n      return await new Promise((resolve, reject) => {\n        const resultImage = new Image();\n        resultImage.src = URL.createObjectURL(newBlob);\n\n        resultImage.onload = () => {\n          if (localSignal && localSignal.aborted) {\n            console.error(`Loading sample aborted`);\n            reject(new Error(`Loading sample aborted`));\n          } else {\n            resolve(resultImage);\n          }\n        };\n\n        resultImage.onerror = (e) => {\n          reject(new Error(`Error loading image: ${e.message}`));\n        };\n      });\n    } catch (error) {\n      console.error(`Failed to convert blob to gradient image: ${error.message}`);\n      throw error;\n    }\n  }\n\n  // async function convertBlobToGradientImage(uint16Array, sampleIndex, localSignal) {\n  //   const reader = new FileReader();\n\n  //   const arrayBuffer = await uint16Array.arrayBuffer();\n  //   const decodedImage = await decode(arrayBuffer);\n\n  //   reader.onload = () => {\n  //     const depthData16Bit = decodedImage.data; // Read as 16-bit data\n  //     const width = decodedImage.width;\n  //     const height = decodedImage.height;\n  //     let minDepthValue = Infinity;\n  //     let maxDepthValue = -Infinity;\n\n  //     for (let i = 0; i < depthData16Bit.length; i++) {\n  //       const value = depthData16Bit[i];\n\n  //       // Update min and max values\n  //       if (value < minDepthValue) {\n  //         minDepthValue = value;\n  //       }\n  //       if (value > maxDepthValue) {\n  //         maxDepthValue = value;\n  //       }\n  //     }\n  //     // Create OffscreenCanvas\n  //     const offscreenCanvas = new OffscreenCanvas(width, height);\n  //     const ctx = offscreenCanvas.getContext('2d');\n\n  //     // Create ImageData object for the OffscreenCanvas\n  //     const imageData = ctx.createImageData(width, height);\n  //     const data = imageData.data;\n\n  //     // Process each 16-bit depth value and map it to red-blue\n  //     for (let i = 0; i < depthData16Bit.length; i++) {\n  //       const depth16Bit = depthData16Bit[i];\n\n  //       // Normalize depth to a range [0, 1]\n  //       const normalizedDepth = (depth16Bit - minDepthValue) / (maxDepthValue - minDepthValue);\n\n  //       // Scale normalized depth to [0, 255]\n  //       const scaledDepth = Math.floor(normalizedDepth * 255);\n\n  //       // Map normalized grayscale to red-blue gradient\n  //       const red = Math.min(255, 2 * scaledDepth); // Red increases as depth decreases\n  //       const blue = Math.min(255, 2 * (255 - scaledDepth)); // Blue increases as depth increases\n  //       const green = 0; // No green in the gradient\n\n  //       // Set pixel color in the image data\n  //       const pixelIndex = i * 4;\n  //       data[pixelIndex] = red; // Red\n  //       data[pixelIndex + 1] = green; // Green\n  //       data[pixelIndex + 2] = blue; // Blue\n  //       data[pixelIndex + 3] = 255; // Full opacity\n  //     }\n\n  //     // Put the modified pixel data back onto the OffscreenCanvas\n  //     ctx.putImageData(imageData, 0, 0);\n\n  //     // Convert the OffscreenCanvas to a blob and create an image\n  //     offscreenCanvas.convertToBlob().then((newBlob) => {\n  //       const resultImage = new Image();\n  //       resultImage.src = URL.createObjectURL(newBlob);\n  //       resultImage.onload = () => {\n  //         if (localSignal && localSignal.aborted) {\n  //           console.error(`Loading sample ${sampleIndex} aborted`);\n  //           return;\n  //         }\n  //         // animationImageCache.value[sampleIndex].depthmap = animationImageCache.value[sampleIndex].depthmap || [];\n  //         // animationImageCache.value[sampleIndex].depthmap.push(resultImage);\n  //         resolve(resultImage);\n  //       };\n  //       resultImage.onerror = (e) => { console.log(e); };\n  //     });\n  //   };\n\n  //   reader.readAsArrayBuffer(uint16Array);\n  // }\n\n  // const worker = new Worker(new URL('@/workers/cacheWorker.js', import.meta.url), {\n  //   type: 'module',\n  // });\n\n  async function handleImageBlob(blob) {\n    return new Promise((resolve) => {\n      const imgElement = document.createElement(\"img\");\n      imgElement.onload = () => resolve(imgElement);\n      imgElement.src = URL.createObjectURL(blob);\n    });\n  }\n\n  cacheWorkerPool.onmessage((message) => {\n    if (message.type === 'started') {\n      // console.log(`Worker started processing task:`, message.data);\n      handleCacheWorkerStarted(message.data);\n    } else if (message.type === 'result') {\n      // console.log(`Worker completed task:`, message.data);\n      handleCacheWorkerResults(message.data);\n    }\n  });\n\n  async function handleCacheWorkerStarted(data) {\n    animationImageCache.value[data.index].loading = true;\n  }\n\n  async function handleCacheWorkerResults(data) {\n    if (data.error) {\n      if (data.index !== undefined && data.index !== null) {\n        animationImageCache.value[data.index].failed = true;\n      } else {\n        currentAnimationSample.value.failed = true;\n      }\n    }\n\n    const imageBlob = data.imageBlob;\n    let imgElement = null;\n    if (imageBlob) {\n      imgElement = await handleImageBlob(imageBlob);\n    }\n\n    const parsedAnnotations = {};\n\n    // const image = document.createElement('img');\n    // image.onerror = (e) => {\n    //   console.log(e);\n    // };\n    // image.onload = () => {\n    if (data.lidar) {\n      // Reconstruct lidar\n      const lidar = data.lidar;\n      lidar.forEach((item) => {\n        const { annotation, positions, colors } = item;\n\n        // Reconstruct the geometry\n        const geometry = new THREE.BufferGeometry();\n        geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));\n\n        if (colors) {\n          geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\n        }\n\n        geometry.computeBoundingSphere();\n        geometry.computeBoundingBox();\n\n        // Create a material for the points (you can customize it as needed)\n        const material = new THREE.PointsMaterial({ size: 0.1, vertexColors: true });\n\n        // Reconstruct the THREE.Points object\n        const points = new THREE.Points(geometry, material);\n\n        const pointsBuffer = shallowRef(null);\n        pointsBuffer.value = points;\n        item.pointsBuffer = pointsBuffer;\n      });\n\n      // if (data.index) {\n      //   if (animationImageCache.value[data.index]) {\n      //     animationImageCache.value[data.index].lidar = lidar;\n      //   }\n      // } else {\n      //   currentAnimationSample.value.lidar = lidar;\n      // }\n\n      parsedAnnotations.lidar = lidar;\n    }\n\n    if (data.pcd) {\n      // Reconstruct pcd\n      const pcd = data.pcd;\n      pcd.forEach((item) => {\n        const { annotation, positions } = item;\n\n        // Reconstruct the geometry\n        const geometry = new THREE.BufferGeometry();\n        geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));\n\n        geometry.computeBoundingSphere();\n        geometry.computeBoundingBox();\n\n        // Create a material for the points (you can customize it as needed)\n        const material = new THREE.PointsMaterial();\n        setPointsMaterial(material);\n\n        // Reconstruct the THREE.Points object\n        const points = new THREE.Points(geometry, material);\n\n        const pointsBuffer = shallowRef(null);\n        pointsBuffer.value = points;\n        item.pointsBuffer = pointsBuffer;\n      });\n\n      // if (data.index) {\n      //   if (animationImageCache.value[data.index]) {\n      //     animationImageCache.value[data.index].pcd = pcd;\n      //   }\n      // } else {\n      //   currentAnimationSample.value.pcd = pcd;\n      // }\n\n      parsedAnnotations.pcd = pcd;\n    }\n\n    if (data.pcdProjectionBlobs) {\n      const pcdProjectionBlobs = data.pcdProjectionBlobs;\n      const pcdProjections = [];\n      pcdProjectionBlobs.forEach(async (item) => {\n        const imgElement = await handleImageBlob(item);\n        pcdProjections.push(imgElement);\n      });\n      parsedAnnotations.pcdProjections = pcdProjections;\n    }\n\n    if (data.pcdProjectionBlobs) {\n      const pcdProjectionBlobs = data.pcdProjectionBlobs;\n      const pcdProjections = [];\n      pcdProjectionBlobs.forEach(async (item) => {\n        const imgElement = await handleImageBlob(item);\n        pcdProjections.push(imgElement);\n      });\n      parsedAnnotations.pcdProjections = pcdProjections;\n    }\n\n    if (data.lidarProjectionBlobs) {\n      const lidarProjectionBlobs = data.lidarProjectionBlobs;\n      const lidarProjections = [];\n      lidarProjectionBlobs.forEach(async (item) => {\n        const imgElement = await handleImageBlob(item);\n        lidarProjections.push(imgElement);\n      });\n      parsedAnnotations.lidarProjections = lidarProjections;\n    }\n\n    if (data.depthmapBlobs) {\n      const depthmapBlobs = data.depthmapBlobs;\n      const depthmap = [];\n      depthmapBlobs.forEach(async (item) => {\n        const imgElement = await handleImageBlob(item);\n        depthmap.push(imgElement);\n      });\n      parsedAnnotations.depthmap = depthmap;\n    }\n\n    if (data.index !== undefined && data.index !== null) {\n      if (animationImageCache.value[data.index]) {\n        animationImageCache.value[data.index].image = imgElement;\n        animationImageCache.value[data.index].imageObj = data.imageObj;\n        animationImageCache.value[data.index].annotations = data.annotations ?? [];\n        // Dynamically append annotations\n        for (const [key, value] of Object.entries(parsedAnnotations)) {\n          animationImageCache.value[data.index][key] = value;\n        }\n        animationImageCache.value[data.index].loaded = true;\n      }\n    } else {\n      currentAnimationSample.value.image = imgElement;\n      currentAnimationSample.value.imageObj = data.imageObj;\n      currentAnimationSample.value.annotations = data.annotations ?? [];\n      // Dynamically append annotations\n      for (const [key, value] of Object.entries(parsedAnnotations)) {\n        currentAnimationSample.value[key] = value;\n      }\n      currentAnimationSample.value.loaded = true;\n    }\n    // };\n    // image.src = URL.createObjectURL(imageBlob);\n  }\n\n  function processSample({ imageId, annotationSetId, indexToCache }) {\n    return new Promise((resolve, reject) => {\n      const worker = new Worker(new URL('@/workers/cacheWorker.js', import.meta.url), {\n        type: 'module',\n      });\n\n      worker.onmessage = async (message) => {\n        if (indexToCache !== undefined && indexToCache !== null && message.data) {\n          message.data.index = indexToCache;\n        }\n        await handleCacheWorkerResults(message.data);\n        worker.terminate();\n        resolve(message); // Resolve the promise with worker response\n      };\n\n      worker.onerror = (message) => {\n        console.log(\"worker error:\", message);\n        worker.terminate();\n        reject(message);\n      };\n\n      worker.postMessage({ imageId, token: store.state.user.token, annotationSetId });\n    });\n  }\n\n  function abortCaching() {\n    cacheWorkerPool.clearQueue();\n    cacheWorkerPool.terminate();\n  }\n\n  async function recacheAndSetCurrentSample() {\n    const currentFrame = frame.value;\n    addNewSampleToCache(currentFrame - 1);\n    currentAnimationSample.value.loaded = false;\n    cacheWorkerPool.restartWorkers();\n    await processSample({ imageId: samples.value[currentFrame - 1], annotatationSetId: limitAnnotationsToSet.value, indexToCache: currentFrame - 1 });\n    if (currentFrame === frame.value) {\n      updateSample();\n    }\n    nextTick(() => {\n      cacheImages();\n    });\n  }\n\n  return {\n    samples,\n    animationImageCache,\n    frame,\n    playing,\n    buffered,\n    currentAnimationSample,\n    keyframes,\n    doKeyframesExist,\n    frameCount,\n    fps,\n    isInitializingAnimation,\n    topics,\n    cacheWorkerPool,\n\n    cacheImages,\n    handleCacheWorkerStarted,\n    handleCacheWorkerResults,\n    processSample,\n    recacheAndSetCurrentSample,\n    // fetchAnnotations,\n    loadSample,\n    loadSampleToCache,\n    loadImage,\n    abortCaching,\n\n    startAnimation,\n    pauseAnimation,\n    addNewSampleToCache,\n    clearSample,\n    updateSample,\n    throttledUpdateSample,\n    resetForNewSequence,\n    $reset,\n    limitAnnotationsToSet,\n  };\n}\n","<template>\n  <div\n    v-if=\"show && !isReviewMode\"\n    id=\"annotationToolRibbon\"\n    class=\"ribbon\"\n  >\n    <div class=\"ribbon__group\">\n      <span>{{ zoom }}%</span>\n      <IconButton\n        id=\"zoomToFitBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Zoom To Fit (Z)\"\n        :icon=\"'zoom_to_extents'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Zoom To Fit (Z)'\"\n        @click=\"handleZoomToFit\"\n      />\n      <IconButton\n        id=\"zoomToSelectionBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Zoom To Selection (Selection + Z)\"\n        :disabled=\"!hasSelection\"\n        :icon=\"'zoom_to_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Zoom To Selection (Selection + Z)'\"\n        @click=\"handleZoomToSelection\"\n      />\n      <hr class=\"ribbon__vr\">\n      <IconButton\n        id=\"undoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Undo\"\n        :disabled=\"!canUndo\"\n        :icon=\"'undo'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Undo'\"\n        @click=\"handleUndo\"\n      />\n      <IconButton\n        id=\"revertChangesBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Revert All Changes\"\n        :icon=\"'restore'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Revert All Changes'\"\n        @click=\"handleRevertChanges\"\n      />\n      <IconButton\n        id=\"copyBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Copy Annotation\"\n        :icon=\"'copy'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Copy Annotations (ctrl + c)'\"\n        @click=\"handleCopyAnnotation\"\n      />\n      <IconButton\n        id=\"pasteBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Paste Annotation\"\n        :icon=\"'paste'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Paste Annotations (ctrl + v)'\"\n        :disabled=\"!hasCopiedAnnotations\"\n        @click=\"handlePasteAnnotation\"\n      />\n      <IconButton\n        id=\"delBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Delete Annotations\"\n        :icon=\"'remove_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Delete Annotations (ctrl + x)'\"\n        @click=\"handleDeleteAnnotationsBulk\"\n      />\n    </div>\n    <div class=\"ribbon__group\">\n      <!-- <IconButton\n        v-if=\"hasSelection\"\n        id=\"showAnnotationInfoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Show Annotation Info\"\n        :icon=\"'auto'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Show Annotation Info'\"\n        @click=\"handleShowAnnotationInfo\"\n      /> -->\n      <template v-if=\"hasSelection\">\n        <button\n          v-if=\"!isKeyframeSelected\"\n          class=\"button button-secondary ribbon__button-secondary\"\n          :title=\"'Set Keyframe'\"\n          @click=\"handleSetKeyframe\"\n        >\n          Set Keyframe\n        </button>\n        <button\n          v-else\n          class=\"button button-secondary ribbon__button-secondary\"\n          :title=\"'Remove Keyframe'\"\n          @click=\"handleRemoveKeyframe\"\n        >\n          Remove Keyframe\n        </button>\n      </template>\n      <template v-if=\"doKeyframesExist\">\n        <button\n          class=\"button ribbon__button-primary\"\n          :class=\"{'button-spinner': isSubmittingKeyframes}\"\n          :disabled=\"isSubmittingKeyframes\"\n          :title=\"'Remove Keyframe'\"\n          @click=\"handleSubmitKeyframes\"\n        >\n          Submit Keyframes\n        </button>\n      </template>\n      <hr class=\"ribbon__vr\">\n      <!-- <button\n        class=\"button button-secondary ribbon__button-secondary\"\n        :title=\"'Skip Image (Right Arrow)'\"\n        @click=\"handleSkipSequence\"\n      >\n        Skip Sequence\n      </button> -->\n      <button\n        class=\"button ribbon__button-primary\"\n        :title=\"'Submit Annotations (Enter)'\"\n        @click=\"handleLabellingSubmit\"\n      >\n        Submit\n      </button>\n      <button\n        v-if=\"hasReviewTask\"\n        class=\"button ribbon__button-primary\"\n        :title=\"'Finish Editing Sequence'\"\n        @click=\"completeTaskSequence\"\n      >\n        Finish Editing Sequence\n      </button>\n    </div>\n  </div>\n  <div v-if=\"show && isReviewMode\" id=\"annotationToolRibbon\" class=\"ribbon\">\n    <div class=\"ribbon__group\">\n      <IconButton\n        id=\"undoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Undo\"\n        :disabled=\"!canUndo\"\n        :icon=\"'undo'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Undo'\"\n        @click=\"handleUndo\"\n      />\n      <IconButton\n        id=\"revertChangesBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Revert All Changes\"\n        :icon=\"'restore'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Revert All Changes'\"\n        @click=\"handleRevertChanges\"\n      />\n      <IconButton\n        id=\"copyBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Copy Annotation\"\n        :icon=\"'copy'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Copy Annotations (ctrl + c)'\"\n        @click=\"handleCopyAnnotation\"\n      />\n      <IconButton\n        id=\"pasteBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Paste Annotation\"\n        :icon=\"'paste'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Paste Annotations (ctrl + v)'\"\n        :disabled=\"!hasCopiedAnnotations\"\n        @click=\"handlePasteAnnotation\"\n      />\n      <IconButton\n        id=\"delBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Delete Annotations\"\n        :icon=\"'remove_selection'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Delete Annotations (ctrl + x)'\"\n        @click=\"handleDeleteAnnotationsBulk\"\n      />\n    </div>\n    <div class=\"ribbon__group\">\n      <IconButton\n        v-if=\"hasSelection\"\n        id=\"showAnnotationInfoBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Show Annotation Info\"\n        :icon=\"'auto'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Show Annotation Info'\"\n        @click=\"handleShowAnnotationInfo\"\n      />\n      <!-- <button\n        class=\"button button-danger ribbon__button-secondary button-flex\"\n        :title=\"'Delete Image'\"\n        @click=\"handleDeleteImageFromDataset\"\n      >\n        <SVGIcon\n          class=\"me-1\"\n          :iconName=\"'delete'\"\n          :width=\"'20px'\"\n          :height=\"'20px'\"\n        />\n        Delete Image\n      </button> -->\n      <IconButton\n        v-if=\"hasSelection && trackingIdSelected\"\n        id=\"deleteTrackingIdBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Delete All Annotation in Series\"\n        :icon=\"'delete_sweep'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Delete All Annotation in Series'\"\n        @click=\"handleDeleteTrackingIdClicked(trackingIdSelected)\"\n      />\n      <template v-if=\"hasSelection\">\n        <button\n          v-if=\"!isKeyframeSelected\"\n          class=\"button button-secondary ribbon__button-secondary\"\n          :title=\"'Set Keyframe'\"\n          @click=\"handleSetKeyframe\"\n        >\n          Set Keyframe\n        </button>\n        <button\n          v-else\n          class=\"button button-secondary ribbon__button-secondary\"\n          :title=\"'Remove Keyframe'\"\n          @click=\"handleRemoveKeyframe\"\n        >\n          Remove Keyframe\n        </button>\n      </template>\n      <template v-if=\"doKeyframesExist\">\n        <button\n          class=\"button ribbon__button-primary\"\n          :class=\"{'button-spinner': isSubmittingKeyframes}\"\n          :disabled=\"isSubmittingKeyframes\"\n          :title=\"'Remove Keyframe'\"\n          @click=\"handleSubmitKeyframes\"\n        >\n          Submit Keyframes\n        </button>\n        <hr class=\"ribbon__vr\">\n      </template>\n      <!-- <button\n        class=\"button button-secondary ribbon__button-secondary\"\n        :title=\"'Skip Image (Right Arrow)'\"\n        @click=\"handleSkipSequence\"\n      >\n        Skip Sequence\n      </button> -->\n      <BasePersistentSplitButton\n        v-model=\"submitType\"\n        class=\"ribbon__button-primary\"\n        title=\"Submit Annotations (Enter)\"\n        :options=\"submitTypes\"\n        @click=\"handleReviewSubmit\"\n      />\n      <button\n        v-if=\"hasReviewTask\"\n        class=\"button ribbon__button-primary\"\n        :title=\"'Finish Editing Sequence'\"\n        @click=\"completeTaskSequence\"\n      >\n        Finish Editing Sequence\n      </button>\n    </div>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n</template>\n\n<script setup>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport BasePersistentSplitButton from '@/components/BasePersistentSplitButton.vue';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\nimport useViewerVisualizations from '@/composables/useViewerVisualizations.js';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport {\n  ref, toRefs, onMounted, computed, watch,\n} from 'vue';\nimport { storeToRefs } from 'pinia';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\n\nconst props = defineProps({\n  show: {\n    type: Boolean,\n    default: true,\n  },\n  zoom: {\n    type: Number,\n    default: 100,\n  },\n  canUndo: {\n    type: Boolean,\n    default: false,\n  },\n  hasSelection: {\n    type: Boolean,\n    default: false,\n  },\n  labels: {\n    type: Array,\n    default: () => [],\n  },\n  annotationSets: {\n    type: Array,\n    default: () => [],\n  },\n  annotationDisplaySettings: {\n    type: Object,\n    default: null,\n  },\n  isReviewMode: {\n    type: Boolean,\n    default: false,\n  },\n  frameImageObj: {\n    type: Object,\n    default: null,\n  },\n  reviewSettings: {\n    type: Object,\n    default: null,\n  },\n  selectedAnnotations: {\n    type: Array,\n    default: () => [],\n  },\n  copiedAnnotations: {\n    type: Array,\n    default: () => [],\n  },\n});\nconst {\n  show,\n  zoom,\n  canUndo,\n  hasSelection,\n  labels,\n  annotationSets,\n  annotationDisplaySettings,\n  isReviewMode,\n  frameImageObj,\n  reviewSettings,\n  selectedAnnotations,\n  copiedAnnotations,\n} = toRefs(props);\n\nconst emit = defineEmits([\n  'zoom-to-fit',\n  'zoom-to-selection',\n  'undo',\n  'revert-changes',\n  'show-annotation-info',\n  'skip',\n  'submit',\n  'copy',\n  'paste',\n  'bulk-del-ann',\n  'exit-editor',\n]);\n\nconst confirmModal = ref(null);\nconst confirmMessage = ref(null);\nconst confirmMessageHeader = ref(null);\nconst confirmFunction = ref(null);\nconst buttonText = ref(null);\n\nconst {\n  internalImageObj,\n  internalAnnotations,\n  submitType,\n  skipTaskSequence,\n  completeTaskSequence,\n  handleFrameAuditSubmitAllAnnotations,\n  handleFrameAuditSubmitAcceptedAnnotations,\n  handleFrameLabellingSubmitAnnotations,\n  deleteTaskImageFromDataset,\n  hasReviewTask,\n} = useTasks();\n\nconst {\n  recacheAndSetCurrentSample,\n} = useViewerVisualizations();\nconst visualizationStore = useViewerVisualizationsStore();\nconst {\n  animationImageCache, currentAnimationSample, frame, keyframes, doKeyframesExist,\n} = storeToRefs(visualizationStore);\nconst {\n  removeKeyframe, setKeyframeNew, removeAnnotationsFromCache,\n} = visualizationStore;\n\nconst internalAnnotationDisplaySettings = ref(null);\nconst submitTypes = ref([\n  { title: 'Submit All Annotations', value: 'submit-all-annotations' },\n  { title: 'Submit Accepted Annotations', value: 'submit-accepted-annotations' },\n]);\nconst isSubmittingKeyframes = ref(false);\n\nconst isKeyframeSelected = computed(() => {\n  if (selectedAnnotations.value[0]) {\n    const selectedKeyframeObject = keyframes.value.find((keyframeObject) => keyframeObject.id === selectedAnnotations.value[0].id);\n    if (selectedKeyframeObject && Object.keys(selectedKeyframeObject.keyframes).map((key) => parseInt(key)).includes(frame.value)) {\n      return true;\n    }\n  }\n  return false;\n});\n\nconst hasCopiedAnnotations = computed(() => {\n  if (copiedAnnotations.value.length > 0) {\n    return true;\n  }\n  return false;\n});\n\nconst hasAnnotations = computed(() => {\n  if (internalAnnotations.value.length > 0) {\n    return true;\n  }\n  return false;\n});\n\nconst keyframeSelected = computed(() => {\n  if (isKeyframeSelected.value) {\n    return selectedAnnotations.value[0].id;\n  }\n  return null;\n});\n\nconst trackingIdSelected = computed(() => {\n  if (selectedAnnotations?.value[0]?.tracking_id) {\n    return selectedAnnotations.value[0].tracking_id;\n  }\n  return null;\n});\n\nonMounted(async () => {\n  if (annotationDisplaySettings.value) {\n    internalAnnotationDisplaySettings.value = annotationDisplaySettings.value;\n  }\n});\n\nfunction handleZoomToFit() {\n  emit('zoom-to-fit');\n}\n\nfunction handleZoomToSelection() {\n  emit('zoom-to-selection');\n}\n\nfunction handleRevertChanges() {\n  emit('revert-changes');\n}\n\nfunction handleUndo() {\n  emit('undo');\n}\n\nfunction handleShowAnnotationInfo() {\n  emit('show-annotation-info');\n}\n\nasync function handleDeleteImageFromDataset() {\n  const resp = await deleteTaskImageFromDataset(internalImageObj.value?.id)\n    .catch((error) => {\n      alert(error);\n    });\n}\n\nfunction handleSkipSequence() {\n  emit('skip');\n  skipTaskSequence();\n}\n\nfunction handleLabellingSubmit() {\n  handleFrameLabellingSubmitAnnotations(frameImageObj.value);\n  currentAnimationSample.value.imageObj.annotations = internalAnnotations.value;\n  recacheAndSetCurrentSample();\n\n  emit('submit');\n}\n\nfunction handleReviewSubmit(submitType) {\n  if (submitType === 'submit-all-annotations') {\n    handleFrameAuditSubmitAllAnnotations(frameImageObj.value)\n      .then(() => {\n        currentAnimationSample.value.imageObj.review_status = \"Done\";\n      })\n      .catch((err) => {\n        console.error(err);\n      });\n  } else if (submitType === 'submit-accepted-annotations') {\n    handleFrameAuditSubmitAcceptedAnnotations(frameImageObj.value)\n      .then(() => {\n        currentAnimationSample.value.imageObj.review_status = \"Done\";\n      })\n      .catch((err) => {\n        console.error(err);\n      });\n  }\n  currentAnimationSample.value.imageObj.annotations = internalAnnotations.value;\n  recacheAndSetCurrentSample();\n  emit('submit');\n\n  if (!hasReviewTask.value) {\n    emit('exit-editor');\n  }\n}\n\nfunction handleEnter() {\n  emit(submitType.value);\n}\n\n// Keyframes\nfunction handleSetKeyframe() {\n  selectedAnnotations.value.forEach((anno) => {\n    setKeyframeNew(frame.value, currentAnimationSample.value.imageObj, anno);\n  });\n}\n\nfunction handleRemoveKeyframe() {\n  removeKeyframe(keyframeSelected.value);\n}\n\nfunction handleDeleteTrackingIdClicked(trackingId) {\n  confirmMessage.value = 'Are you sure you want to permanently delete all annotations from this keyframe series?';\n  confirmMessageHeader.value = 'Delete Annotations from Series';\n  buttonText.value = 'Delete All';\n  confirmModal.value.showModal();\n  confirmFunction.value = () => { handleDeleteTrackingId(trackingId); };\n}\n\nasync function handleDeleteTrackingId(trackingId) {\n  const dataConnect = new DatastoreConnect();\n  const removedAnnotations = await dataConnect.deleteAnnotationsByTrackingId({\n    tracking_id: trackingId,\n    annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n  })\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error);\n      }\n      return resp.result;\n    })\n    .catch((error) => {\n      console.error(error);\n      throw error;\n    });\n\n  if (removedAnnotations.length > 0) {\n    removeAnnotationsFromCache(removedAnnotations);\n  }\n}\n\n// async function handleSubmitKeyframes() {\n//   const params = [];\n//   keyframeRanges.value.forEach((range) => {\n//     const start = keyframes.value[range[0]];\n//     const end = keyframes.value[range[1]];\n//     start.frame = range[0];\n//     end.frame = range[1];\n//     params.push([start, end]);\n//   });\n\n//   const image_ids = animationImageCache.value.map((item) => item.imageObj.id);\n//   const newAnnotations = await submitKeyframes({\n//     keyframes: params,\n//     image_ids,\n//     sequence_id: internalImageObj.value.sequence_id,\n//     review_task_id: reviewSettings.value.reviewTask.id,\n//     review_session_id: reviewSettings.value.reviewSession.id,\n//     annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n//   })\n//     .catch((error) => {\n//       console.error(error);\n//     });\n\n//   animationImageCache.value.forEach((cacheFrame) => {\n//     if (newAnnotations[cacheFrame.imageObj.id]) {\n//       cacheFrame.annotations = newAnnotations[cacheFrame.imageObj.id];\n//       cacheFrame.imageObj.annotations = newAnnotations[cacheFrame.imageObj.id];\n//     }\n//   });\n\n//   keyframes.value = {};\n// }\n\nasync function handleSubmitKeyframes() {\n  isSubmittingKeyframes.value = true;\n  const image_ids = Object.values(animationImageCache.value).map((item) => item.imageObj.id);\n  const newAnnotations = await submitKeyframes({\n    keyframes: keyframes.value,\n    image_ids,\n    sequence_id: internalImageObj.value.sequence_id,\n    review_task_id: reviewSettings.value.reviewTask.id,\n    review_session_id: reviewSettings.value.reviewSession.id,\n    annotation_set_id: reviewSettings.value.reviewTask.dest_annotation_set_id,\n  })\n    .catch((error) => {\n      console.error(error);\n    });\n\n  console.log(newAnnotations);\n\n  Object.values(animationImageCache.value).forEach((cacheFrame) => {\n    if (newAnnotations[cacheFrame.imageObj.id]) {\n      newAnnotations[cacheFrame.imageObj.id].forEach((anno) => { anno.reviewStatus = \"verified\"; });\n      cacheFrame.annotations = [...cacheFrame.annotations, ...newAnnotations[cacheFrame.imageObj.id]];\n      cacheFrame.imageObj.annotations = [...cacheFrame.imageObj.annotations, ...newAnnotations[cacheFrame.imageObj.id]];\n    }\n  });\n\n  keyframes.value = [];\n  isSubmittingKeyframes.value = false;\n}\n\nasync function submitKeyframes(params) {\n  const dataConnect = new DatastoreConnect();\n  return dataConnect.submitKeyframes(params)\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error);\n      }\n      return resp.result;\n    })\n    .catch((error) => {\n      throw error;\n    });\n}\n\nfunction handleCopyAnnotation() {\n  emit('copy');\n}\n\nfunction handlePasteAnnotation() {\n  emit('paste');\n}\n\nfunction handleDeleteAnnotationsBulk() {\n  emit('bulk-del-ann');\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.ribbon {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  width: 100%;\n  min-height: 37px;\n  max-height: 37px;\n  padding: 2px 16px;\n  justify-content: space-between;\n  z-index: 10;\n  box-shadow: 0 3px 3px -3px gray, 0 10px 10px -10px gray;\n  color: var(--ribbon-icons-color);\n  background: var(--ribbon-bg);\n  border-left: solid 1px var(--ribbon-border);\n\n  &__group {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 8px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 1px;\n    height: 60%;\n    margin: 0;\n  }\n\n  &__button {\n    display: flex;\n    min-width: 22px;\n    height: 22px;\n    color: inherit;\n    background: none;\n    border: none;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: .05em;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover:not(:disabled), &.active:not(:disabled) {\n      box-shadow: 0 0 0 4px var(--icon-hover-color);\n      background-color: var(--icon-hover-color);\n      border-radius: 4px;\n    }\n\n    &:disabled {\n      cursor: default;\n      color: var(--color-disabled);\n    }\n  }\n\n  &__button-primary {\n    display: flex;\n    height: 28px;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    align-items: center;\n  }\n\n  &__button-secondary {\n    display: flex;\n    height: 28px;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    align-items: center;\n  }\n\n  &__labeled_button {\n    width: auto;\n  }\n}\n\n:deep(.filter-button) {\n  height: 22px;\n}\n\n</style>\n","import script from \"./AnnotationToolSequenceRibbon.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./AnnotationToolSequenceRibbon.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./AnnotationToolSequenceRibbon.vue?vue&type=style&index=0&id=090ecebf&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-090ecebf\"]])\n\nexport default __exports__","<template>\n  <div class=\"image-details\">\n    <ul class=\"image-details__list scrollbar\">\n      <li class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'info'\"\n            :width=\"22\"\n            :height=\"22\"\n          />\n        </div>\n        <div v-if=\"annotationObj\" class=\"image-details__list-item-details\">\n          <span>ID</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.id\">{{ annotationObj.id }}</span>\n          </div>\n          <span>Score</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.score\">{{ annotationObj.score }}</span>\n          </div>\n          <span>Label</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.label_index\">{{ annotationObj.label_index }}</span>\n          </div>\n          <span>Date</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <div>\n              <span :title=\"(new Date(annotationObj.date)).toDateString()\">{{ (new Date(annotationObj.date)).toDateString() }}</span>\n              <br>\n              <span :title=\"(new Date(annotationObj.date)).toTimeString()\">{{ (new Date(annotationObj.date)).toTimeString() }}</span>\n            </div>\n          </div>\n          <span>X</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.x\">{{ annotationObj.x }}</span>\n          </div>\n          <span>Y</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.y\">{{ annotationObj.y }}</span>\n          </div>\n          <span>Width</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.w\">{{ annotationObj.w }}</span>\n          </div>\n          <span>Height</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.h\">{{ annotationObj.h }}</span>\n          </div>\n          <span>Annotation Set ID</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.annotation_set_id\">{{ annotationObj.annotation_set_id }}</span>\n          </div>\n        </div>\n        <div v-if=\"!annotationObj\" class=\"image-details__list-item-details\">\n          <span><i>No Annotation Selected</i></span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'AnnotationDetails',\n  components: {\n    SVGIcon,\n  },\n  props: {\n    annotationObj: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  data() {\n    return {\n\n    };\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.image-details {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 300px;\n  max-width: 300px;\n  padding: 0;\n  z-index: 2;\n\n  &__list {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    padding: 0;\n    margin: 0;\n    gap: 16px;\n    overflow-y: auto;\n    list-style-type: none;\n  }\n\n  &__list-item {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    padding: 0 16px;\n  }\n\n  &__list-item-icon {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    width: 40px;\n    min-width: 40px;\n  }\n\n  &__list-item-details {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    text-align: left;\n    overflow: hidden;\n\n    span {\n      font-weight: 600;\n      font-size: 0.9rem;\n      line-height: 1.1rem;\n      overflow: hidden;\n      margin-bottom: 2px;\n      overflow-wrap: anywhere;\n    }\n  }\n\n  &__list-item-sub-details {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    text-align: left;\n\n    span {\n      font-weight: 500;\n      font-size: 0.9rem;\n      display: inline-flex;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n    }\n\n    &._overflow-wrap span {\n      white-space: unset;\n      overflow-wrap: anywhere;\n    }\n  }\n}\n</style>\n","import { render } from \"./AnnotationDetails.vue?vue&type=template&id=2bd29150&scoped=true\"\nimport script from \"./AnnotationDetails.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationDetails.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationDetails.vue?vue&type=style&index=0&id=2bd29150&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2bd29150\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <BaseGalleryGridItem\n    :imageObj=\"imageObj\"\n    :annotations=\"annotations\"\n    :annotationSets=\"annotationSets\"\n    :crop=\"imageCrop\"\n    :cropPadding=\"0.02\"\n    :annotationDisplayType=\"'label'\"\n    :imageQuality=\"'image'\"\n    @click=\"handleImageClicked\"\n    @image-mouseenter=\"handleMouseEnter\"\n    @image-mouseleave=\"handleMouseOut\"\n  >\n    <template #header>\n      <div\n        class=\"card-header\"\n        @click=\"handleImageClicked\"\n        @mouseenter=\"handleMouseEnter\"\n        @mouseleave=\"handleMouseOut\"\n      >\n        <h3\n          class=\"card-header__title\"\n          @mouseenter.stop=\"handleMouseOut\"\n        >\n          <BaseMenu\n            :placement=\"'left-start'\"\n            :appendToBody=\"true\"\n            @closed=\"show_menu = false\"\n          >\n            <button>{{ title }}</button>\n            <template #menu>\n              <ul class=\"label-menu scrollbar\">\n                <li v-for=\"(label, i) in labels\" :key=\"i\">\n                  <BaseMenuButton @click=\"handleLabelChanged(label)\">\n                    <span>{{ label.name }}</span>\n                  </BaseMenuButton>\n                </li>\n              </ul>\n            </template>\n          </BaseMenu>\n        </h3>\n        <IconButton\n          v-model=\"verified\"\n          class=\"verified-icon\"\n          :icon=\"verifiedIcon\"\n          :width=\"20\"\n          :height=\"20\"\n          @click.stop=\"handleVerifiedClicked\"\n        />\n        <!-- <IconButton\n          v-model=\"flagged\"\n          class=\"flag-icon\"\n          :icon=\"flagIcon\"\n          :width=\"20\"\n          :height=\"20\"\n          @click.stop=\"handleFlaggedClicked\"\n        /> -->\n        <IconButton\n          class=\"edit-annotations-icon\"\n          :icon=\"'edit'\"\n          :width=\"20\"\n          :height=\"20\"\n          :type=\"''\"\n          @click.stop=\"handleEditClicked\"\n        />\n      </div>\n    </template>\n    <template #content>\n      <div\n        v-if=\"(flagged || verified || pendingFlagged || pendingVerified)\"\n        class=\"card-backdrop\"\n        :class=\"{'flagged': flagged, 'verified': verified, 'pending-verified': pendingVerified, 'pending-flagged': pendingFlagged}\"\n      />\n    </template>\n  </BaseGalleryGridItem>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport BaseGalleryGridItem from '@/components/DatasetComponent/BaseGalleryGridItem.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\n\nconst Statuses = {\n  Verified: \"verified\",\n  Flagged: \"flagged\",\n  Unreviewed: \"unreviewed\",\n};\n\nexport default {\n  name: 'GalleryGridAnnotationReviewItem',\n  components: {\n    IconButton,\n    BaseGalleryGridItem,\n    BaseMenu,\n    BaseMenuButton,\n  },\n  props: {\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    reviewStatus: {\n      type: String,\n      default: Statuses.Unreviewed,\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Object,\n      default: () => {},\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    annotationSet: {\n      type: Object,\n      default: () => {},\n    },\n    annotation: {\n      type: Object,\n      default: () => {},\n    },\n    originX: {\n      type: Number,\n      default: 0,\n    },\n    originY: {\n      type: Number,\n      default: 0,\n    },\n  },\n  emits: [\n    'grid-item-clicked',\n    'image-deleted',\n    'view-clicked',\n    'edit-clicked',\n    'update:reviewStatus',\n  ],\n  data() {\n    return {\n      verified: false,\n      flagged: false,\n      pendingVerified: false,\n      pendingFlagged: false,\n      localReviewStatus: Statuses.Unreviewed,\n    };\n  },\n  computed: {\n    flagIcon() {\n      if (this.flagged) {\n        return 'flag';\n      }\n      return 'outlined_flag';\n    },\n    verifiedIcon() {\n      if (this.verified) {\n        return 'verified';\n      }\n      return 'done_outline';\n    },\n    unreviewed() {\n      return !this.verified && !this.flagged;\n    },\n    imageCrop() {\n      return {\n        x: this.annotation.x - (this.originX * this.annotation.w),\n        y: this.annotation.y - (this.originY * this.annotation.h),\n        w: this.annotation.w,\n        h: this.annotation.h,\n      };\n    },\n    annotations() {\n      if (this.annotation) {\n        return [this.annotation];\n      }\n      return [];\n    },\n    title() {\n      let title = '';\n      let label = this.annotation.label_index;\n      let score = this.annotation.score;\n      if (this.labels.length > 0) {\n        label = this.labels[this.annotation.label_index]?.name;\n      }\n      title = label;\n      if (this.annotation.score) {\n        score = this.annotation.score;\n        title = `${title} [${score.toPrecision(2)}]`;\n      }\n      return title;\n    },\n  },\n  watch: {\n    verified(verified) {\n      if (verified) {\n        this.localReviewStatus = Statuses.Verified;\n        this.$emit('update:reviewStatus', Statuses.Verified);\n      }\n    },\n    flagged(flagged) {\n      if (flagged) {\n        this.localReviewStatus = Statuses.Flagged;\n        this.$emit('update:reviewStatus', Statuses.Flagged);\n      }\n    },\n    unreviewed(unreviewed) {\n      if (unreviewed) {\n        this.localReviewStatus = Statuses.Unreviewed;\n        this.$emit('update:reviewStatus', Statuses.Unreviewed);\n      }\n    },\n    reviewStatus(status) {\n      this.localReviewStatus = status;\n    },\n    localReviewStatus(status) {\n      if (status === Statuses.Verified) {\n        this.verified = true;\n        this.flagged = false;\n      }\n      if (status === Statuses.Flagged) {\n        this.verified = false;\n        this.flagged = true;\n      }\n      if (status === Statuses.Unreviewed) {\n        this.verified = false;\n        this.flagged = false;\n      }\n    },\n  },\n  async mounted() {\n    this.localReviewStatus = this.reviewStatus;\n  },\n  methods: {\n    handleImageClicked() {\n      this.$emit('grid-item-clicked', this.imageObj);\n      if (this.pendingVerified) {\n        this.verified = true;\n        this.pendingVerified = false;\n      }\n      if (this.pendingFlagged) {\n        this.flagged = true;\n        this.pendingFlagged = false;\n      }\n    },\n    handleVerifiedClicked() {\n      this.flagged = false;\n    },\n    handleFlaggedClicked() {\n      this.verified = false;\n    },\n    handleEditClicked() {\n      this.$emit('edit-clicked', this.annotation);\n    },\n    handleMouseEnter(e) {\n      document.body.addEventListener('keydown', this.handleKeydown);\n      document.body.addEventListener('keyup', this.handleKeyup);\n      if (e.shiftKey && !this.flagged) {\n        this.pendingFlagged = true;\n      } else if (!this.verified) {\n        this.pendingVerified = true;\n      }\n    },\n    handleMouseOut(e) {\n      document.body.removeEventListener('keydown', this.handleKeydown);\n      document.body.removeEventListener('keyup', this.handleKeyup);\n      this.pendingVerified = false;\n      this.pendingFlagged = false;\n    },\n    handleKeydown(e) {\n      if (e.key === 'Shift') {\n        if (this.verified) {\n          this.pendingFlagged = true;\n        } else if (this.flagged) {\n          this.pendingVerified = false;\n          this.pendingFlagged = false;\n        } else {\n          this.pendingVerified = false;\n          this.pendingFlagged = true;\n        }\n      }\n    },\n    handleKeyup(e) {\n      if (e.key === 'Shift') {\n        if (this.pendingFlagged) {\n          this.pendingFlagged = false;\n          if (!this.verified) {\n            this.pendingVerified = true;\n          }\n        }\n      }\n    },\n    handleLabelChanged(label) {\n      this.annotation.label_index = label.index;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.grid-item-container {\n  height: 100%;\n  width: 100%;\n}\n\n.reviewed.grid-item-container:hover {\n  outline: none;\n}\n\n.card-header {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  align-items: center;\n  min-height: 42px;\n  border-bottom: none;\n  padding: 10px 10px 10px 10px;\n  gap: 4px;\n\n  &__title {\n    margin: 0;\n    margin-right: 8px;\n    font-size: 1.25rem;\n    width: 100%;\n\n    button {\n      font-size: inherit;\n      background: transparent;\n      border: none;\n      width: 100%;\n      cursor: pointer;\n\n      @include themify() {\n        box-shadow: 0 0 5px themed('icon-hover-color-primary'), 0 0 1px rgb(0 0 0 / 60%);\n      }\n\n      &:hover {\n        @include themify() {\n          box-shadow: 0 0 8px 3px themed('icon-hover-color-primary'), 0 0 0 1px themed('color-primary');\n        }\n      }\n    }\n  }\n}\n\n.flag-icon, .verified-icon, .edit-annotations-icon {\n  z-index: 3;\n}\n.flag-icon, .verified-icon {\n  @include themify() {\n    color: themed('icon-color-inactive') !important;\n  }\n}\n\n.flag-icon.active {\n  @include themify() {\n    color: themed('color-red') !important;\n  }\n}\n\n.verified-icon.active {\n  @include themify() {\n    color: themed('icon-color-primary') !important;\n  }\n}\n\n.reviewed .flag-icon.icon-button-hover:hover,\n.reviewed .verified-icon.icon-button-hover:hover,\n.reviewed .edit-annotations-icon.icon-button-hover:hover {\n  @include themify() {\n    background-color: themed('icon-hover-color-primary');\n    box-shadow: 0 0 0 4px themed('icon-hover-color-primary');\n  }\n}\n\n.card-backdrop {\n  position: absolute;\n  top: 0px;\n  bottom: 0px;\n  left: 0px;\n  right: 0px;\n  width: 100%;\n  height: 100%;\n  opacity: 0.25;\n  outline: none;\n  z-index: 2;\n  border-radius: inherit;\n  pointer-events: none;\n}\n.card-backdrop.flagged {\n  @include themify() {\n    background: themed('color-red')\n  }\n}\n.card-backdrop.verified {\n  @include themify() {\n    background: themed('color-primary')\n  }\n}\n.card-backdrop.pending-flagged {\n  opacity: 0.125;\n  @include themify() {\n    background: themed('color-red')\n  }\n}\n.card-backdrop.pending-verified {\n  opacity: 0.125;\n  @include themify() {\n    background: themed('color-primary')\n  }\n}\n\n.label-menu {\n  min-width: 100px;\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <div\n    :id=\"imageObj.id\"\n    class=\"grid-item-container\"\n  >\n    <slot name=\"header\" />\n    <div\n      :id=\"imageObj.id\"\n      class=\"grid-item\"\n      @mouseenter=\"$emit('image-mouseenter', $event)\"\n      @mouseleave=\"$emit('image-mouseleave', $event)\"\n    >\n      <slot name=\"image\" />\n      <ImageCanvas\n        :imageId=\"imageObj?.id\"\n        :boxes=\"boxes\"\n        :segmentations=\"segmentations\"\n        :crop=\"crop\"\n        :cropPadding=\"cropPadding\"\n        :imageQuality=\"imageQuality\"\n        :fetchPriority=\"fetchPriority\"\n      />\n    </div>\n    <slot name=\"content\" />\n  </div>\n</template>\n\n<script>\nimport ImageCanvas from '@/components/ImageCanvas.vue';\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport { toRefs } from 'vue';\nimport { getColor } from '@/assets/js/utils.js';\n\nexport default {\n  name: 'BaseGalleryGridItem',\n  components: {\n    ImageCanvas,\n  },\n  props: {\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    annotations: {\n      type: [Array, Object],\n      default: () => [],\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    crop: {\n      type: Object,\n      default: null,\n    },\n    cropPadding: {\n      type: Number,\n      default: 0,\n    },\n    annotationDisplayType: {\n      type: String,\n      default: 'set',\n    },\n    filterAnnotationsBySets: {\n      type: Array,\n      default: null,\n    },\n    filterAnnotationsByLabelIndexes: {\n      type: Array,\n      default: null,\n    },\n    imageQuality: {\n      type: String,\n      default: 'thumbnail',\n    },\n    fetchPriority: {\n      type: String,\n      default: 'auto',\n    },\n  },\n  emits: [\n    'grid-item-clicked', 'image-deleted', 'annotation-list-updated', 'image-mouseenter', 'image-mouseleave',\n  ],\n  setup(props) {\n    const { annotationSets } = toRefs(props);\n    const { map: annotationSetColorMap } = useAnnotationColorMap({ items: annotationSets, key: 'id' });\n    return {\n      annotationSetColorMap,\n    };\n  },\n  data() {\n    return {};\n  },\n  computed: {\n    filteredAnnotations() {\n      let annotationsArray;\n      if (Array.isArray(this.annotations)) {\n        annotationsArray = this.annotations;\n      } else if (typeof this.annotations === 'object') {\n        // Convert object to array if it's not already\n        annotationsArray = [this.annotations];\n      } else {\n        annotationsArray = [];\n      }\n\n      return annotationsArray;\n    },\n    boxes() {\n      if (this.filteredAnnotations?.length > 0) {\n        return this.filteredAnnotations.filter((anno) => anno.type === 'box' || anno.type === 'auto-box').map((anno) => this.convertAnnotationToCanvasBox(anno));\n      }\n      return [];\n    },\n    segmentations() {\n      if (this.filteredAnnotations?.length > 0) {\n        return this.filteredAnnotations.filter((anno) => anno.type === 'seg' || anno.type === 'auto-seg').map((anno) => this.convertAnnotationToSegmentation(anno));\n      }\n      return [];\n    },\n  },\n  methods: {\n    handleImageClicked() {\n      this.$emit('grid-item-clicked', this.imageObj);\n    },\n    convertAnnotationToCanvasBox(anno) {\n      let originX = 0;\n      let originY = 0;\n      let x = anno.x;\n      let y = anno.y;\n      const w = anno.w;\n      const h = anno.h;\n      if (this.annotationSets) {\n        const annoTask = this.annotationSets.find((set) => set.id === anno.annotation_set_id);\n        if (annoTask) {\n          if (annoTask.origin_x) {\n            originX = annoTask.origin_x;\n            x -= originX * anno.w;\n          }\n          if (annoTask.origin_y) {\n            originY = annoTask.origin_y;\n            y -= originY * anno.h;\n          }\n        }\n      }\n      let color;\n      if (anno.color) {\n        color = anno.color;\n      } else {\n        if (this.annotationDisplayType === 'set' && anno.annotation_set_id) {\n          color = this.annotationSetColorMap[anno.annotation_set_id];\n        }\n        if (this.annotationDisplayType === 'label' && anno.label_index >= 0) {\n          color = getColor(anno.label_index);\n        }\n      }\n      let opacity = 1;\n      if (anno.opacity) {\n        opacity = anno.opacity;\n      }\n\n      return {\n        x, y, w, h, color, opacity,\n      };\n    },\n    convertAnnotationToSegmentation(anno) {\n      const polygons = JSON.parse(anno.polygon);\n\n      let color;\n      if (anno.color) {\n        color = anno.color;\n      } else {\n        if (this.annotationDisplayType === 'set' && anno.annotation_set_id) {\n          color = this.annotationSetColorMap[anno.annotation_set_id];\n        }\n        if (this.annotationDisplayType === 'label' && anno.label_index >= 0) {\n          color = getColor(anno.label_index);\n        }\n      }\n\n      return {\n        polygons, color,\n      };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.grid-item-container {\n  // user-select: none;\n  // -moz-user-select: none;\n  // -khtml-user-select: none;\n  // -webkit-user-select: none;\n  // -o-user-select: none;\n\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  border-radius: 6px;\n  cursor: pointer;\n  box-shadow: 1px 2px 6px 1px rgba(0, 0, 0, 0.125), 0 0 1px 1px rgba(0, 0, 0, 0.125);\n  margin: 1px;\n  transition: transform .4s ease;\n  backdrop-filter: blur(20px);\n  -webkit-backdrop-filter: blur(20px);\n  @include themify() {\n    background: themed('image-background-fill');\n    color: themed('text-color');\n  }\n}\n.grid-item-container:hover {\n  @include themify() {\n    outline: 1px solid themed('card-list-hover-outline');\n  }\n}\n\n.grid-item {\n  display: flex;\n  flex: 1 1 auto;\n  position: relative;\n  cursor: pointer;\n  width: inherit;\n  height: 250px;\n  max-height: 250px;\n  min-height: 0;\n}\n</style>\n","import { ref, onBeforeUnmount } from 'vue';\nimport { useFetch } from '@vueuse/core';\nimport { useStore } from 'vuex';\n\nexport default function useFetchImage() {\n  const store = useStore();\n  const url = ref('');\n\n  const {\n    data: _data, execute, isFetching, error, abort, canAbort,\n  } = useFetch(url, {\n    async beforeFetch({ url, options, cancel }) {\n      if (!store.state.user.token) cancel();\n\n      options.headers = {\n        ...options.headers,\n        Authorization: `Bearer ${store.state.user.token}`,\n      };\n\n      return {\n        options,\n      };\n    },\n  }, { immediate: false }).blob();\n\n  function getImage(id) {\n    url.value = `v3/enterprise/image/${id}`;\n    execute();\n  }\n\n  function getThumbnail(id) {\n    url.value = `v3/enterprise/thumbnail/${id}`;\n    execute();\n  }\n\n  return {\n    data: _data, isFetching, error, abort, canAbort, getImage, getThumbnail,\n  };\n}\n","<template>\n  <div ref=\"containerRef\" class=\"image-canvas\">\n    <img\n      v-if=\"imageId && !cancelImgLoad && !crop\"\n      ref=\"imageRef\"\n      class=\"image-canvas__image\"\n      :style=\"zoomShiftTransform\"\n      :src=\"imageSrc\"\n      :fetchpriority=\"fetchPriority\"\n      alt=\"\"\n      @load=\"handleImageLoad\"\n      @error=\"handleImageLoadError\"\n    >\n    <img\n      v-else-if=\"imageId && !cancelImgLoad && crop\"\n      ref=\"imageRef\"\n      class=\"image-canvas__image\"\n      :style=\"zoomShiftTransform\"\n      :src=\"croppedImageSrc\"\n      alt=\"\"\n      @load=\"handleImageLoad\"\n      @error=\"handleCroppedImageLoadError\"\n    >\n    <v-skeleton-loader\n      v-if=\"!imageLoaded\"\n      type=\"image\"\n      class=\"image-loading\"\n    />\n    <canvas\n      v-if=\"imageId && !cancelImgLoad\"\n      v-show=\"showCanvas\"\n      ref=\"canvas\"\n      class=\"image-canvas__canvas\"\n      :style=\"zoomShiftTransform\"\n      @mousemove=\"handleMouseMove\"\n    />\n  </div>\n</template>\n\n<script setup>\nimport useFetchImage from '@/composables/useFetchImage.js';\nimport {\n  ref, watch, computed, onMounted, onBeforeUnmount, nextTick, toRefs,\n} from 'vue';\n\nconst props = defineProps({\n  imageId: {\n    type: Number,\n    default: null,\n  },\n  boxes: {\n    type: Array,\n    default: () => [],\n  },\n  segmentations: {\n    type: Array,\n    default: () => [],\n  },\n  showCanvas: {\n    type: Boolean,\n    default: true,\n  },\n  zoom: {\n    type: Number,\n    default: 2,\n  },\n  zoomShift: {\n    type: Array,\n    default: null,\n  },\n  crop: {\n    type: Object,\n    default: null,\n  },\n  cropPadding: {\n    type: Number,\n    default: 0,\n  },\n  imageQuality: {\n    type: String,\n    default: 'thumbnail',\n  },\n  fetchPriority: {\n    type: String,\n    default: 'auto',\n  },\n});\nconst {\n  imageId, boxes, segmentations, showCanvas, zoom, zoomShift, crop, cropPadding, imageQuality, fetchPriority,\n} = toRefs(props);\n\nconst emit = defineEmits(['update:hoveredBox']);\n\nconst canvas = ref(null);\nconst imageRef = ref(null);\nconst containerRef = ref(null);\nconst imageSrc = ref(null);\nconst croppedImageSrc = ref('');\nconst resizeObserver = ref(null);\nconst containerSize = ref({\n  width: 0,\n  height: 0,\n});\nconst renderedImageDimensions = ref({\n  width: 0,\n  height: 0,\n  top: 0,\n  left: 0,\n  bottom: 0,\n  right: 0,\n});\nconst cancelImgLoad = ref(false);\nconst imageLoaded = ref(false);\n\nconst {\n  data: imageData, isFetching, abort, canAbort, getImage, getThumbnail,\n} = useFetchImage();\n\nfunction getCroppedImage(imageSrc, crop) {\n  const image = new Image();\n  image.fetchpriority = fetchPriority.value;\n\n  image.onload = () => {\n    // Create a dynamic canvas\n    const canvas = document.createElement('canvas');\n    const context = canvas.getContext('2d');\n\n    // Set canvas dimensions\n    canvas.width = image.naturalWidth;\n    canvas.height = image.naturalHeight;\n\n    // Draw the cropped image onto the canvas\n    context.drawImage(\n      image,\n      (crop.x - cropPadding.value) * image.naturalWidth,\n      (crop.y - cropPadding.value) * image.naturalHeight,\n      (crop.w + (2 * cropPadding.value)) * image.naturalWidth,\n      (crop.h + (2 * cropPadding.value)) * image.naturalHeight,\n      0,\n      0,\n      canvas.width,\n      canvas.height,\n    );\n\n    drawAnnotations();\n\n    // Get canvas image as Blob, then set as source\n    canvas.toBlob((blob) => {\n      croppedImageSrc.value = URL.createObjectURL(blob);\n    }, 'image/png', 1.0);\n  };\n\n  image.src = imageSrc;\n}\n\nfunction drawAnnotations() {\n  if (canvas.value) {\n    const ctx = canvas.value.getContext(\"2d\");\n    ctx.clearRect(0, 0, canvas.value.width, canvas.value.height);\n    boxes.value.forEach((box) => {\n      drawBox(box);\n    });\n    segmentations.value.forEach((segmentation) => {\n      drawSegmentation(segmentation);\n    });\n  }\n}\n\nfunction drawBox(box) {\n  if (imageId.value) {\n    // const canvas = this.$refs.canvas;\n    const ctx = canvas.value.getContext(\"2d\");\n\n    // Box dimensions\n    let x; let y; let width; let\n      height;\n    if (crop.value) {\n      const totalCropWidth = (crop.value.w + (2 * cropPadding.value));\n      const totalCropHeight = (crop.value.h + (2 * cropPadding.value));\n      x = Math.round(((box.x - (crop.value.x - cropPadding.value)) / totalCropWidth) * canvas.value.width);\n      y = Math.round(((box.y - (crop.value.y - cropPadding.value)) / totalCropHeight) * canvas.value.height);\n      width = Math.round((box.w / totalCropWidth) * canvas.value.width);\n      height = Math.round((box.h / totalCropHeight) * canvas.value.height);\n    } else {\n      x = Math.round((box.x) * canvas.value.width);\n      y = Math.round((box.y) * canvas.value.height);\n      width = Math.round(box.w * canvas.value.width);\n      height = Math.round(box.h * canvas.value.height);\n    }\n\n    // Set Box styling\n    const boxLineWidth = 2;\n    ctx.lineWidth = boxLineWidth;\n    ctx.strokeStyle = \"#EFC15F\";\n    if (box.color) {\n      ctx.strokeStyle = box.color;\n    }\n    if (box.opacity) {\n      ctx.globalAlpha = box.opacity;\n    } else {\n      ctx.globalAlpha = 1;\n    }\n\n    // Draw the bounding box\n    ctx.beginPath();\n    ctx.rect(x, y, width, height);\n    ctx.stroke();\n\n    // Draw the label\n    // if (result.label || (result.id && result.time)) {\n    //   ctx.font = \"24px Arial\";\n    //   let currentWidth = 0;\n    //   if (result.label) {\n    //     currentWidth += drawLabelText(ctx, result, x, y, boxLineWidth);\n    //   }\n    //   if (result.score) {\n    //     currentWidth += drawLabelScore(ctx, result, x + currentWidth, y, boxLineWidth);\n    //   }\n    // }\n  }\n}\n\nfunction drawSegmentation(seg) {\n  if (imageId.value) {\n    const ctx = canvas.value.getContext(\"2d\");\n\n    // Set Segmentation styling\n    const borderLineWidth = 1;\n    ctx.lineWidth = borderLineWidth;\n    ctx.strokeStyle = hexToRgba(\"#EFC15F\", 1);\n    ctx.fillStyle = hexToRgba(\"#EFC15F\", 0.5);\n    if (seg.color) {\n      ctx.strokeStyle = addOpacityToHSL(seg.color, 1);\n      ctx.fillStyle = addOpacityToHSL(seg.color, 0.5);\n    }\n\n    // Draw each polygon\n    seg.polygons.forEach((polygon) => {\n      ctx.beginPath();\n      for (const vertex of polygon) {\n        ctx.lineTo(vertex[0] * canvas.value.width, vertex[1] * canvas.value.height);\n      }\n      ctx.closePath();\n      ctx.stroke();\n      ctx.fill();\n    });\n  }\n}\n\nfunction handleImageLoad() {\n  try {\n    if (containerRef.value) {\n      containerSize.value.width = containerRef.value.clientWidth;\n      containerSize.value.height = containerRef.value.clientHeight;\n    }\n    if (canvas.value && imageRef.value) {\n      renderedImageDimensions.value = getRenderedImageDimensions(imageRef.value);\n      canvas.value.style.left = `${renderedImageDimensions.value.left}px`;\n      canvas.value.style.top = `${renderedImageDimensions.value.top}px`;\n      canvas.value.style.width = `${renderedImageDimensions.value.width}px`;\n      canvas.value.style.height = `${renderedImageDimensions.value.height}px`;\n\n      canvas.value.width = parseInt(canvas.value.style.width);\n      canvas.value.height = parseInt(canvas.value.style.height);\n    } else {\n      return;\n    }\n\n    boxes.value.forEach((box) => {\n      drawBox(box);\n    });\n    segmentations.value.forEach((seg) => {\n      drawSegmentation(seg);\n    });\n  } catch (err) {\n    console.error(err);\n    handleImageLoadError(err);\n  }\n\n  if ((imageId.value && !crop.value) || (imageId.value && crop.value && croppedImageSrc.value)) {\n    imageLoaded.value = true;\n  }\n}\n\n// Get dimensions of the rendered display image\n// This is not equal to the element dimensions when using 'object-fit: contain'\nfunction getRenderedImageDimensions(image) {\n  const {\n    width, height, naturalWidth, naturalHeight,\n  } = image;\n  const naturalRatio = naturalWidth / naturalHeight;\n  const elementRatio = width / height;\n  const [renderedWidth, renderedHeight] = naturalRatio >= elementRatio ? [width, width / naturalRatio] : [height * naturalRatio, height];\n\n  return {\n    width: Math.round(renderedWidth),\n    height: Math.round(renderedHeight),\n    top: Math.round((height - renderedHeight) / 2),\n    left: Math.round((width - renderedWidth) / 2),\n    bottom: Math.round(((height - renderedHeight) / 2) + height),\n    right: Math.round(((width - renderedWidth) / 2) + width),\n  };\n}\n\nfunction hexToRgba(hex, opacity) {\n  hex = hex.replace(/^#/, ''); // Remove the # symbol\n  const bigint = parseInt(hex, 16);\n  const r = (bigint >> 16) & 255;\n  const g = (bigint >> 8) & 255;\n  const b = bigint & 255;\n  return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n}\n\nfunction addOpacityToHSL(colorString, opacity) {\n  // Parse the HSL color string to get its components\n  const colorValues = colorString.match(/(\\d+(\\.\\d+)?)%?/g).map(parseFloat);\n  const hue = colorValues[0];\n  const saturation = colorValues[1];\n  const lightness = colorValues[2];\n\n  // Convert to HSLA format\n  const hslaColor = `hsla(${hue}, ${saturation}%, ${lightness}%, ${opacity})`;\n\n  return hslaColor;\n}\n\nfunction handleImageLoadError(err) {\n  if (imageId.value) {\n    console.error(err);\n    cancelImgLoad.value = true;\n    imageLoaded.value = false;\n  }\n}\n\nfunction handleCroppedImageLoadError(err) {\n  if (croppedImageSrc.value) {\n    console.error(err);\n    cancelImgLoad.value = true;\n    imageLoaded.value = false;\n  }\n}\n\nfunction handleResize() {\n  handleImageLoad();\n}\n\nfunction findMouseOverBox(mouseX, mouseY) {\n  let hoveredBox;\n  boxes.value.forEach((box) => {\n    if (mouseX > box.x\n            && mouseX < box.x + box.w\n            && mouseY > box.y\n            && mouseY < box.y + box.h) {\n      hoveredBox = box;\n    }\n  });\n  return hoveredBox;\n}\n\nfunction handleMouseMove(e) {\n  const bounds = e.target.getBoundingClientRect();\n  const x = (e.clientX - bounds.left) / bounds.width;\n  const y = (e.clientY - bounds.top) / bounds.height;\n  const box = findMouseOverBox(x, y);\n  if (box) {\n    box.clientX = bounds.left + box.x * bounds.width;\n    box.clientY = bounds.top + box.y * bounds.height;\n    box.clientWidth = box.w * bounds.width;\n    box.clientHeight = box.h * bounds.height;\n  }\n  emit('update:hoveredBox', box);\n}\n\nwatch(imageData, (data) => {\n  if (data) {\n    const src = URL.createObjectURL(data);\n    if (crop.value) {\n      getCroppedImage(src, crop.value);\n    } else {\n      imageSrc.value = src;\n    }\n  }\n});\n\nwatch(boxes, () => {\n  drawAnnotations();\n}, { deep: true });\n\nwatch(segmentations, () => {\n  drawAnnotations();\n}, { deep: true });\n\nwatch(imageId, (id) => {\n  cancelImgLoad.value = false;\n  imageLoaded.value = false;\n\n  getImage(id);\n});\n\nconst zoomShiftTransform = computed(() => {\n  if (zoomShift.value) {\n    return { transform: `scale(${zoom.value}) translateX(${zoomShift.value[0]}px) translateY(${zoomShift.value[1]}px)` };\n  }\n  return null;\n});\n\nonMounted(() => {\n  if (imageId.value) {\n    if (imageQuality.value === 'image') {\n      getImage(imageId.value);\n    } else {\n      getThumbnail(imageId.value);\n    }\n  }\n\n  nextTick(() => {\n    resizeObserver.value = new ResizeObserver(handleResize);\n    if (imageRef.value) {\n      resizeObserver.value.observe(imageRef.value);\n    }\n  });\n});\n\nonBeforeUnmount(() => {\n  if (canAbort.value) {\n    abort();\n  }\n\n  if (imageRef.value) {\n    resizeObserver.value?.unobserve(imageRef.value);\n  } else {\n    resizeObserver.value?.disconnect();\n  }\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n.image-canvas {\n  user-select: none;\n  -moz-user-select: none;\n  -khtml-user-select: none;\n  -webkit-user-select: none;\n  -o-user-select: none;\n\n  position: relative;\n  width: 100%;\n  height: 100%;\n\n  &__canvas {\n    position: absolute;\n    left: 0;\n    top: 0;\n    height: 100%;\n    width: 100%;\n  }\n\n  &__image {\n    position: relative;\n    max-height: 100%;\n    height: 100%;\n    width: 100%;\n    object-fit: contain;\n    margin: auto;\n  }\n}\n\n:deep(.v-skeleton-loader.image-loading) {\n  position: absolute;\n  height: 100%;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  opacity: 0.75;\n  z-index: 2;\n  .v-skeleton-loader__image {\n    height: 100%;\n  }\n}\n\n</style>\n","import script from \"./ImageCanvas.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ImageCanvas.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./ImageCanvas.vue?vue&type=style&index=0&id=630323b0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-630323b0\"]])\n\nexport default __exports__","import { render } from \"./BaseGalleryGridItem.vue?vue&type=template&id=75c9100c&scoped=true\"\nimport script from \"./BaseGalleryGridItem.vue?vue&type=script&lang=js\"\nexport * from \"./BaseGalleryGridItem.vue?vue&type=script&lang=js\"\n\nimport \"./BaseGalleryGridItem.vue?vue&type=style&index=0&id=75c9100c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-75c9100c\"]])\n\nexport default __exports__","import { render } from \"./GalleryGridAnnotationReviewItem.vue?vue&type=template&id=39785215&scoped=true\"\nimport script from \"./GalleryGridAnnotationReviewItem.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryGridAnnotationReviewItem.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryGridAnnotationReviewItem.vue?vue&type=style&index=0&id=39785215&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-39785215\"]])\n\nexport default __exports__","<template>\n  <component\n    :is=\"`v\\-${component}`\"\n    :active=\"active\"\n    :absolute=\"true\"\n    :height=\"56\"\n    :z-index=\"10\"\n    class=\"p-0\"\n  >\n    <v-bottom-sheet\n      v-model=\"showGallery\"\n      :height=\"'100%'\"\n      :z-index=\"10\"\n      :attach=\"true\"\n      :scrim=\"true\"\n      :eager=\"true\"\n      :max-height=\"'calc(100% - 56px)'\"\n      :retain-focus=\"false\"\n    >\n      <v-sheet id=\"annotation-editor-gallery\" class=\"gallery\">\n        <AnnotationEditorGallery\n          :isOpen=\"showGallery\"\n          :dataset=\"dataset\"\n          :reviewSettings=\"reviewSettings\"\n          @image-clicked=\"handleGalleryImageClicked\"\n        />\n      </v-sheet>\n    </v-bottom-sheet>\n    <div class=\"bottom-image-drawer\">\n      <div class=\"bottom-image-drawer__header\">\n        <v-btn\n          :text=\"galleryButtonText\"\n          @click=\"showGallery = !showGallery\"\n        />\n      </div>\n      <template v-if=\"!sequences || (sequences && sequences.length === 0)\">\n        <div class=\"bottom-image-drawer__complete-images\">\n          <button v-if=\"page < (numPages - 1)\" class=\"bottom-image-drawer__navigation-arrow _left\" @click=\"handleLeftNavigation\">\n            <SVGIcon\n              :iconName=\"'chevron_left'\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n            />\n          </button>\n          <div class=\"bottom-image-drawer__complete-images-grid-items\">\n            <div\n              v-for=\"(img, i) in imagesToShow\"\n              :key=\"img.id\"\n              class=\"bottom-image-drawer__grid-item-container\"\n              :class=\"{ active: activeIndex === i }\"\n            >\n              <button\n                class=\"bottom-image-drawer__grid-item\"\n                :class=\"{ active: activeIndex === i }\"\n                @click=\"handleImageClicked(i + (numImagesPerPage * page))\"\n              >\n                <img :src=\"imagesToShowUrls[i]\" class=\"bottom-image-drawer__image\">\n              </button>\n            </div>\n          </div>\n          <button v-if=\"page > 0\" class=\"bottom-image-drawer__navigation-arrow _right\" @click=\"handleRightNavigation\">\n            <SVGIcon\n              :iconName=\"'chevron_right'\"\n              :width=\"'20px'\"\n              :height=\"'20px'\"\n            />\n          </button>\n        </div>\n        <div\n          v-if=\"currentImage\"\n          class=\"bottom-image-drawer__current-images\"\n          :class=\"{ active: activeIndex < 0 }\"\n          @click=\"handleImageClicked(-1)\"\n        >\n          <span>Pending</span>\n          <div class=\"bottom-image-drawer__current-images-grid-items\">\n            <div\n              v-for=\"(pendingImage, i) in pendingImages\"\n              :key=\"pendingImage.id\"\n              class=\"bottom-image-drawer__grid-item\"\n              :style=\"{zIndex: pendingImages.length - i}\"\n            >\n              <img :src=\"pendingImagesUrls[i]\" class=\"bottom-image-drawer__image\">\n            </div>\n          </div>\n        </div>\n      </template>\n      <div v-if=\"sequences && sequences.length > 0\" class=\"bottom-image-drawer__sequences\">\n        <span>Selected Sequence:</span>\n        <select\n          v-model=\"selectedSequence\"\n          class=\"select\"\n          required\n          @change=\"handleSelectedSequenceChanged\"\n        >\n          <option disabled :value=\"''\">Select a Sequence</option>\n          <option v-for=\"(sequence, i) in sequences\" :key=\"i\" :value=\"sequence\">\n            {{ sequence.name }}\n          </option>\n        </select>\n      </div>\n    </div>\n  </component>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport AnnotationEditorGallery from '@/components/DatasetComponent/AnnotationTool/AnnotationEditorGallery.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'AnnotationEditorHistoryDrawer',\n  components: {\n    SVGIcon,\n    AnnotationEditorGallery,\n  },\n  props: {\n    reviewSettings: {\n      type: Object,\n      default: null,\n    },\n    active: {\n      type: Boolean,\n      default: false,\n    },\n    images: {\n      type: Array,\n      default: () => [],\n    },\n    currentImage: {\n      type: Object,\n      default: null,\n    },\n    pendingImages: {\n      type: Array,\n      default: () => [],\n    },\n    activeIndex: {\n      type: Number,\n      default: null,\n    },\n    numImagesPerPage: {\n      type: Number,\n      default: 10,\n    },\n    component: {\n      type: String,\n      default: 'bottom-navigation',\n    },\n    height: {\n      type: Number,\n      default: undefined,\n    },\n    sequences: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['image-clicked', 'gallery-image-clicked', 'update:selectedSequence'],\n  data() {\n    return {\n      page: 0,\n      showGallery: false,\n      dataset: null,\n      selectedSequence: null,\n      imagesToShowUrls: [],\n      pendingImagesUrls: [],\n    };\n  },\n  computed: {\n    numPages() {\n      return Math.ceil(this.images.length / this.numImagesPerPage);\n    },\n    imagesToShow() {\n      return this.images.slice(this.page * this.numImagesPerPage, this.page * this.numImagesPerPage + this.numImagesPerPage);\n    },\n    galleryButtonText() {\n      if (this.showGallery) {\n        return 'Hide Gallery';\n      }\n      return 'Show Gallery';\n    },\n  },\n  watch: {\n    currentImage(currentImage) {\n      if (currentImage.sequence_id) {\n        this.selectedSequence = this.sequences.find((seq) => seq.sequence_id === currentImage.sequence_id);\n      }\n    },\n    imagesToShow(imagesToShow) {\n      imagesToShow.forEach((img, index) => {\n        this.getImageBlobUrl(`v3/enterprise/thumbnail/${img.id}`).then((url) => {\n          this.imagesToShowUrls[index] = url;\n        });\n      });\n    },\n    pendingImages(pendingImagesUrls) {\n      pendingImagesUrls.forEach((img, index) => {\n        this.getImageBlobUrl(`v3/enterprise/thumbnail/${img.id}`).then((url) => {\n          this.pendingImagesUrls[index] = url;\n        });\n      });\n    },\n  },\n  async mounted() {\n    this.getDataset();\n  },\n  methods: {\n    handleImageClicked(imageIndex) {\n      this.$emit('image-clicked', imageIndex);\n    },\n    handleLeftNavigation() {\n      this.page += 1;\n    },\n    handleRightNavigation() {\n      if (this.page > 0) { this.page -= 1; }\n    },\n    async getDataset() {\n      const dataConnect = new DatastoreConnect();\n      this.dataset = await dataConnect.getDatasetById({\n        dataset_id: this?.reviewSettings?.reviewTask?.dataset_id,\n        get_labels: true,\n        get_annotation_sets: true,\n        get_groups: true,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          this.dataset = {};\n          console.error(error);\n        });\n    },\n    async handleGalleryImageClicked(imageObj) {\n      await setTimeout(() => {\n        this.showGallery = false;\n      }, 100);\n      this.$emit('gallery-image-clicked', imageObj.id);\n    },\n    handleSelectedSequenceChanged() {\n      this.$emit('update:selectedSequence', this.selectedSequence);\n    },\n    async getImageBlobUrl(url) {\n      if (url) {\n        const response = await fetch(url, {\n          method: 'GET',\n          headers: {\n            'Authorization': `Bearer ${this.$store.state.user.token}`,\n          },\n        });\n        if (!response.ok) {\n          throw new Error(`Error loading image`);\n        }\n        const blob = await response.blob();\n        return URL.createObjectURL(blob);\n      }\n      return null;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.bottom-image-drawer {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  height: 100%;\n  box-shadow: -1px 1px 1px 0px rgba(0, 0, 0, 0.125) inset;\n  border-left: 1px solid rgba(0,0,0,0.125);\n  z-index: 100;\n  @include themify() {\n    background: themed('color-white-700');\n  }\n\n  &__header {\n    display: flex;\n    padding: 0px 16px;\n    align-items: center;\n\n    button {\n      width: 150px;\n    }\n  }\n\n  &__complete-images {\n    position: relative;\n    display: flex;\n    flex: 1 1 auto;\n    gap: 16px;\n    // padding: 4px 0px;\n    margin-left: 56px;\n    margin-right: 16px;\n    align-items: center;\n    justify-content: center;\n  }\n\n  &__current-images {\n    display: flex;\n    flex-direction: row;\n    flex: 0 0 250px;\n    max-width: 250px;\n    min-width: 250px;\n    gap: 0px;\n    padding: 0px 16px;\n    align-items: center;\n    cursor: pointer;\n    background: var(--gray-500);\n\n    &.active {\n      background: var(--color-primary-400)\n    }\n\n    span {\n      height: fit-content;\n      margin-right: 16px;\n      font-size: 1rem;\n      font-weight: 500;\n      letter-spacing: 0.05em;\n      @include themify() {\n        color: themed('color-white');\n      }\n    }\n\n    .bottom-image-drawer__grid-item:first-of-type {\n      background: rgba(var(--color-white-rgb), 0.85);\n    }\n    .bottom-image-drawer__grid-item:not(:last-of-type) {\n      box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5);\n      border: 1px solid rgba(var(--color-white-rgb), 0.25);\n    }\n    .bottom-image-drawer__grid-item + .bottom-image-drawer__grid-item {\n      margin-left: -34px;\n      opacity: 85%;\n    }\n  }\n\n  &__complete-images-grid-items {\n    position: relative;\n    display: flex;\n    flex-direction: row-reverse;\n    height: 100%;\n  }\n\n  &__current-images-grid-items {\n    position: relative;\n    display: flex;\n    height: 100%;\n    padding: 4px 0;\n  }\n\n  &__grid-item {\n    height: 100%;\n    width: 68px;\n    border: 1px solid rgba(0,0,0,0.375);\n    border-radius: 8px;\n    overflow: hidden;\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.375);\n    background: rgba(var(--color-white-rgb), 1);\n\n    :hover {\n      cursor: pointer;\n    }\n\n    &.active {\n      border: 3px solid var(--color-primary);\n    }\n  }\n\n  &__grid-item-container {\n    height: 100%;\n    padding: 4px 8px;\n    &.active {\n      background: var(--color-primary-400)\n    }\n  }\n\n  &__image {\n    height: 100%;\n  }\n\n  &__navigation-arrow {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    height: 32px;\n    width: 32px;\n    border-radius: 50%;\n    opacity: 0.625;\n    @include themify() {\n      background: themed('color-black');\n    }\n\n    &._left {\n      @include themify() {\n        color: themed('color-white');\n      }\n    }\n    &._right {\n      @include themify() {\n        color: themed('color-white');\n      }\n    }\n  }\n\n  &__sequences {\n    position: relative;\n    display: flex;\n    flex: 1 1 auto;\n    gap: 16px;\n    // padding: 4px 0px;\n    margin-left: 56px;\n    margin-right: 16px;\n    align-items: center;\n    justify-content: center;\n\n    select {\n      width: 200px;\n    }\n  }\n}\n\n.gallery {\n  height: 100%;\n  margin-bottom: 56px;\n  display: flex;\n  flex-direction: column;\n}\n</style>\n","<template>\n  <div class=\"controls-bar\">\n    <DatasetFilter\n      v-model=\"datasetFilters\"\n      :dataset=\"dataset\"\n      :annotationSets=\"annotationSets\"\n      :labels=\"labels\"\n      :types=\"types\"\n    />\n  </div>\n  <GalleryGrid\n    ref=\"galleryGrid\"\n    v-model:page=\"currentPage\"\n    v-model:totalPages=\"totalPagesCount\"\n    :imageList=\"imageList\"\n    :totalImageCount=\"totalImageCount\"\n    :imagesPerPage=\"imagesPerPage\"\n    :annotationSets=\"annotationSets\"\n    class=\"annotation-editor-grid\"\n  >\n    <template #header-start>\n      <div class=\"grid-header-start\">\n        <DisplayAnnotationsFilter\n          v-model=\"annotationDisplaySettings\"\n          :annotationSets=\"annotationSets\"\n          :labels=\"labels\"\n          :showSplitAnnotationOption=\"shouldShowSplitAnnotationOption\"\n        />\n      </div>\n    </template>\n    <template #header-end>\n      <div class=\"grid-header-end\">\n        <div class=\"sort-by\">\n          <GalleryImageSort v-model:sortBy=\"sortBy\" v-model:ascend=\"reverse\" />\n        </div>\n      </div>\n    </template>\n    <template #grid-item>\n      <template v-if=\"isOpen\">\n        <AnnotationEditorGalleryGridItem\n          v-for=\"imageObj in imageList\"\n          :key=\"imageObj.id\"\n          :imageObj=\"imageObj\"\n          :annotations=\"imageObj.annotations\"\n          :annotationSets=\"annotationSets\"\n          :annotationDisplayType=\"colorAnnotationsBy\"\n          :filterAnnotationsBySets=\"getDisplayAnnotationSet(imageObj)\"\n          :filterAnnotationsByLabelIndexes=\"displayLabels\"\n          :labels=\"labels\"\n          :imageReviewStatus=\"imageObj.image_review_status\"\n          :reviewSettings=\"reviewSettings\"\n          :splitAnnotations=\"showSplitAnnotations\"\n          v-bind=\"gridItemDisplayProp\"\n          @grid-item-clicked=\"imageClicked(imageObj)\"\n          @delete-image-from-dataset=\"deleteImageFromDataset\"\n        />\n      </template>\n    </template>\n    <template #empty-state>\n      <GalleryEmptyState ref=\"galleryEmptyState\" :datasetID=\"dataset?.id\" />\n    </template>\n  </GalleryGrid>\n</template>\n\n<script>\nimport DatasetFilter from '@/components/DatasetComponent/DatasetFilters/DatasetFilter.vue';\nimport DisplayAnnotationsFilter from '@/components/DatasetComponent/GalleryComponent/DisplayAnnotationsFilterV2.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport GalleryGrid from '@/components/DatasetComponent/GalleryComponent/GalleryGrid.vue';\nimport AnnotationEditorGalleryGridItem from '@/components/DatasetComponent/GalleryComponent/AnnotationEditorGalleryGridItem.vue';\nimport GalleryEmptyState from '@/components/DatasetComponent/GalleryComponent/GalleryEmptyState.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\nimport GalleryImageSort from '@/components/DatasetComponent/GalleryComponent/GalleryImageSort.vue';\n\nexport default {\n  name: 'AnnotationEditorGallery',\n  components: {\n    GalleryGrid,\n    DatasetFilter,\n    DisplayAnnotationsFilter,\n    AnnotationEditorGalleryGridItem,\n    GalleryEmptyState,\n    SVGIcon,\n    IconButton,\n    GalleryImageSort,\n  },\n  props: {\n    isOpen: {\n      type: Boolean,\n      default: false,\n    },\n    images: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: null,\n    },\n    reviewSettings: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['image-clicked'],\n  setup() {\n    const {\n      internalImageObj,\n      pendingTaskImages,\n      switchToImageID,\n      switchToDoneImage,\n      imageFilters,\n      auditorType,\n      updateTaskImageFilters,\n    } = useTasks();\n\n    return {\n      internalImageObj,\n      pendingTaskImages,\n      switchToImageID,\n      switchToDoneImage,\n      imageFilters,\n      auditorType,\n      updateTaskImageFilters,\n    };\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      imageList: null,\n      imageListPromise: null,\n      imagesPerPage: 40,\n      currentPage: 1,\n      totalPagesCount: 0,\n      totalImageCount: 0,\n      minImageNumber: 0,\n      maxImageNumber: 0,\n      datasetFilters: {},\n      controller: new AbortController(),\n      annotationDisplaySettings: {\n        displayAnnotationSets: { annotation_sets: [] },\n      },\n      sortBy: 'id',\n      reverse: false,\n      filtersUpdated: false,\n    };\n  },\n  computed: {\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n    types() {\n      if (this.dataset) {\n        return this.dataset.annotation_types;\n      }\n      return [];\n    },\n    labels() {\n      if (this.dataset) {\n        return this.dataset.labels;\n      }\n      return [];\n    },\n    annotationSets() {\n      if (this.dataset) {\n        return this.dataset.annotation_sets;\n      }\n      return [];\n    },\n    getImagesParams() {\n      return {\n        ...this.getImagesListParams,\n        ...this.getImagesFilterParams,\n      };\n    },\n    getImagesListParams() {\n      if (!this.dataset) {\n        return null;\n      }\n\n      const limit = this.imagesPerPage;\n      const offset = (this.currentPage - 1) * this.imagesPerPage;\n      const sort_by = this.sortBy;\n      const reverse = this.reverse;\n\n      const params = {\n        sort_by,\n        reverse,\n        offset,\n        limit,\n        get_tags: true,\n      };\n\n      return params;\n    },\n    getImagesFilterParams() {\n      if (!this.dataset) {\n        return null;\n      }\n\n      const params = {\n        images_filter: { dataset_id: this.dataset.id },\n        image_files_filter: {},\n        annotations_filter: {},\n        image_review_status_filter: {},\n        review_task_id: this.reviewSettings?.reviewTask.id,\n        get_annotations: true,\n        image_tags_filter: {},\n      };\n\n      // Images filter\n      if (this.datasetFilters.groupsFilter && this.datasetFilters.groupsFilter.length > 0) {\n        params.images_filter.group_ids = this.datasetFilters.groupsFilter;\n      }\n\n      // Annotations filter\n      if (this.datasetFilters.confidenceRangeFilter) {\n        params.annotations_filter.lower_score = this.datasetFilters.confidenceRangeFilter[0];\n        params.annotations_filter.upper_score = this.datasetFilters.confidenceRangeFilter[1];\n      }\n      if (this.datasetFilters.annotationTypeFilter && this.datasetFilters.annotationTypeFilter.length > 0) {\n        params.annotations_filter.types = this.datasetFilters.annotationTypeFilter;\n      }\n      if (this.datasetFilters.annotationSetFilter && this.datasetFilters.annotationSetFilter.length > 0) {\n        params.annotations_filter.annotation_set_ids = this.datasetFilters.annotationSetFilter.map((set) => set.id);\n      }\n      if (this.datasetFilters.imagesWithAnnotationSetFilter && this.datasetFilters.imagesWithAnnotationSetFilter.length > 0) {\n        params.annotations_filter.images_with_annotation_set_ids = this.datasetFilters.imagesWithAnnotationSetFilter.map((set) => set.id);\n      }\n      if (this.datasetFilters.annotationLabelFilter && this.datasetFilters.annotationLabelFilter.length > 0) {\n        params.annotations_filter.images_with_annotation_label_indexes = this.datasetFilters.annotationLabelFilter;\n      }\n      if (this.datasetFilters.boundingBoxSizeFilter) {\n        Object.entries(this.datasetFilters.boundingBoxSizeFilter).forEach(([key, value]) => {\n          if (key !== 'type' && value) {\n            params.annotations_filter[`${key}_${this.datasetFilters.boundingBoxSizeFilter.type}`] = value;\n          }\n        });\n      }\n\n      // Image files filter\n      if (this.datasetFilters.imageNameFilter && this.datasetFilters.imageNameFilter.length > 0) {\n        params.image_files_filter.image_name = this.datasetFilters.imageNameFilter;\n      }\n      if (this.datasetFilters.timeRangeFilter) {\n        params.image_files_filter.lower_time = this.datasetFilters.timeRangeFilter[0];\n        params.image_files_filter.upper_time = this.datasetFilters.timeRangeFilter[1];\n      }\n      if (this.datasetFilters.dateRangeFilter) {\n        if (this.datasetFilters.dateRangeFilter[0]) {\n          params.image_files_filter.lower_date = new Date(this.datasetFilters.dateRangeFilter[0]).toISOString();\n        }\n        if (this.datasetFilters.dateRangeFilter[1]) {\n          params.image_files_filter.upper_date = new Date(this.datasetFilters.dateRangeFilter[1]).toISOString();\n        }\n      }\n      if (this.datasetFilters.cameraSourceFilter && this.datasetFilters.cameraSourceFilter.length > 0) {\n        params.image_files_filter.image_sources = this.datasetFilters.cameraSourceFilter;\n      }\n\n      if (Object.keys(params.annotations_filter).length === 0) {\n        delete params.annotations_filter;\n      }\n\n      if (this.datasetFilters.imageTagFilter && this.datasetFilters.imageTagFilter.length > 0) {\n        params.image_tags_filter.tag_names = this.datasetFilters.imageTagFilter.map((tag) => tag.name);\n      }\n\n      if (Object.keys(params.image_tags_filter).length === 0) {\n        delete params.image_tags_filter;\n      }\n\n      // if (this.datasetFilters.displayAnnotationsFilter && this.datasetFilters.displayAnnotationsFilter.value.length > 0) {\n      //   if (this.datasetFilters.displayAnnotationsFilter.displayType === 'byAnnotationSets') {\n      //     params.annotations_filter.aggregate_annotation_set_ids = this.datasetFilters.displayAnnotationsFilter.value;\n      //   }\n      //   // if (this.datasetFilters.displayAnnotationsFilter.displayType === 'byAnnotationLabels') {}\n      // }\n\n      return params;\n    },\n    gridItemDisplayProp() {\n      if (!this.datasetFilters?.displayAnnotationsFilter) {\n        return {};\n      }\n      if (this.datasetFilters?.displayAnnotationsFilter?.displayType === 'byAnnotationSets') {\n        return { filterAnnotationsBySets: this.datasetFilters.displayAnnotationsFilter.value };\n      }\n      if (this.datasetFilters?.displayAnnotationsFilter?.displayType === 'byAnnotationLabels') {\n        return { filterAnnotationsByLabelIndexes: this.datasetFilters.displayAnnotationsFilter.value };\n      }\n      return {};\n    },\n    colorAnnotationsBy() {\n      if (this.annotationDisplaySettings?.colorAnnotationsBy?.type) {\n        return this.annotationDisplaySettings?.colorAnnotationsBy?.type;\n      }\n      return 'set';\n    },\n    displayAnnotationSets() {\n      if (this.annotationDisplaySettings?.displayAnnotationSets) {\n        return this.annotationDisplaySettings?.displayAnnotationSets.annotation_sets;\n      }\n\n      return [];\n    },\n    displayLabels() {\n      if (this.annotationDisplaySettings?.displayLabels) {\n        return this.annotationDisplaySettings?.displayLabels.labels;\n      }\n      return [];\n    },\n    shouldShowSplitAnnotationOption() {\n      if (this.auditorType === 'annotation') {\n        return false;\n      }\n      return true;\n    },\n    showSplitAnnotations() {\n      if (this.auditorType === 'annotation') {\n        return true;\n      }\n      return this.annotationDisplaySettings?.splitAnnotations;\n    },\n  },\n  watch: {\n    getImagesParams: {\n      deep: true,\n      async handler(params) {\n        if (!params || !this.isOpen) {\n          return;\n        }\n        this.imageListPromise = new Promise((resolve, reject) => {\n          this.getImages().then((imageList) => {\n            this.imageList = imageList;\n            resolve(imageList);\n          });\n        });\n      },\n    },\n    getImagesFilterParams: {\n      deep: true,\n      handler() {\n        this.filtersUpdated = true;\n      },\n    },\n    isOpen() {\n      if (this.isOpen) {\n        this.handleGalleryOpened();\n      } else {\n        this.handleGalleryClosed();\n      }\n    },\n    imageList: {\n      deep: true,\n      handler(newList) {\n        this.minImageNumber = ((this.currentPage - 1) * this.imagesPerPage) + 1;\n        this.maxImageNumber = ((this.currentPage - 1) * this.imagesPerPage) + newList.length;\n      },\n    },\n    internalImageObj() {\n      if (!this.imageFilters || !this.isOpen) {\n        return;\n      }\n      this.imageListPromise = new Promise((resolve, reject) => {\n        this.getImages().then((imageList) => {\n          this.imageList = imageList;\n          resolve(imageList);\n        });\n      });\n    },\n    pendingTaskImages() {\n      if (!this.imageFilters || !this.isOpen) {\n        return;\n      }\n      this.imageListPromise = new Promise((resolve, reject) => {\n        this.getImages().then((imageList) => {\n          this.imageList = imageList;\n          resolve(imageList);\n        });\n      });\n    },\n  },\n  mounted() {\n    this.annotationDisplaySettings.displayAnnotationSets.annotation_sets.push(this.reviewSettings?.reviewTask.source_annotation_set_id);\n  },\n  methods: {\n    async getSelectionImageCount(params) {\n      const resp = await this.dataConnect.getReviewTaskImageList({ only_count: true, get_tags: true, ...params })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        // TODO: handle error\n        return 0;\n      }\n\n      return resp.result;\n    },\n    async getImages() {\n      this.controller.abort();\n      this.controller = new AbortController();\n      const currentController = this.controller;\n\n      this.totalImageCount = await this.getSelectionImageCount(this.getImagesFilterParams, currentController.signal);\n      if (this.totalImageCount === 0) {\n        return [];\n      }\n\n      // Handle case when currentPage is greater than the new total number of pages\n      if (Math.ceil(this.totalImageCount / this.imagesPerPage) < this.currentPage) {\n        let newPage = Math.ceil(this.totalImageCount / this.imagesPerPage);\n        if (newPage < 1) {\n          newPage = 1;\n        }\n        this.currentPage = newPage;\n        return this.imageList;\n      }\n\n      const imageListParams = {\n        ...this.getImagesListParams,\n        ...this.getImagesFilterParams,\n      };\n      const resp = await this.dataConnect.getReviewTaskImageList(imageListParams, currentController.signal)\n        .catch((error) => {\n          if (currentController.signal.aborted) {\n            return this.imageList;\n          }\n          console.log(error);\n          alert(error);\n          return this.imageList;\n        });\n      if (!resp || resp.error || !resp.result) {\n        if (resp && resp.error) {\n          console.error(resp.error);\n          alert(resp.error.message);\n        }\n        return this.imageList;\n      }\n\n      return resp.result;\n    },\n    async deleteImageFromDataset(imageObj) {\n      const param = {\n        image_ids: [imageObj.id],\n      };\n      const resp = await this.dataConnect.deleteImageFromDataset(param);\n      if (!resp || resp.error || !resp.result) {\n        if (resp && resp.error) {\n          console.error(resp.error);\n        }\n        alert(\"Image failed to delete\");\n      } else {\n        this.imageListPromise = new Promise((resolve, reject) => {\n          this.getImages().then((imageList) => {\n            this.imageList = imageList;\n            resolve(imageList);\n          });\n        });\n      }\n    },\n    async imageClicked(imageObj) {\n      if (imageObj?.image_review_status?.status === 'Done') {\n        this.switchToDoneImage(imageObj);\n        this.$emit('image-clicked', imageObj);\n      } else {\n        await this.switchToImageID(imageObj.id);\n        this.$emit('image-clicked', imageObj);\n      }\n\n      this.imageListPromise = new Promise((resolve, reject) => {\n        this.getImages().then((imageList) => {\n          this.imageList = imageList;\n          resolve(imageList);\n        });\n      });\n    },\n    getDisplayAnnotationSet(imageObj) {\n      if (imageObj?.image_review_status?.status === 'Done') {\n        return [this.reviewSettings?.reviewTask.dest_annotation_set_id];\n      } else if (this.annotationDisplaySettings?.displayAnnotationSets) {\n        return this.annotationDisplaySettings?.displayAnnotationSets.annotation_sets;\n      }\n      return [];\n    },\n    handleGalleryOpened() {\n      this.filtersUpdated = false;\n\n      this.imageListPromise = new Promise((resolve, reject) => {\n        this.getImages().then((imageList) => {\n          this.imageList = imageList;\n          resolve(imageList);\n        });\n      });\n    },\n    handleGalleryClosed() {\n      if (this.filtersUpdated) {\n        this.updateTaskImageFilters(this.getImagesFilterParams);\n      }\n      this.filtersUpdated = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n.grid-header-start {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  height: 100%;\n  align-items: center;\n  gap: 8px;\n}\n\n.grid-header-end {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  height: 100%;\n  align-items: center;\n  gap: 8px;\n  justify-content: flex-end;\n}\n\n#dataset-select {\n  width: 300px;\n}\n\n.gallery-image-count {\n  margin-left: 16px;\n  font-size: 0.75rem;\n  font-weight: 600;\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.sort-by {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n\n  &__select {\n    width: 130px;\n  }\n\n  &__reverse._invert {\n    transform: rotate(180deg);\n  }\n}\n</style>\n","<template>\n  <div ref=\"filters\" class=\"filters\" :class=\"{'_collapse': collapsible && collapse}\">\n    <!-- <template> -->\n    <div class=\"filters__active-and-default-filters scrollbar\">\n      <component\n        :is=\"filter.name\"\n        v-for=\"filter in filterList\"\n        :key=\"filter.key\"\n        v-model=\"filters[filter.key]\"\n        v-model:invert=\"filters[`${filter.key}Invert`]\"\n        v-bind=\"filterProps[filter.key]\"\n      />\n      <button v-if=\"showCopyFilteredImagesBtn\" class=\"button filter-button\" @click=\"$emit('open-copy-filters')\">\n        <span>Copy Filtered Images</span>\n      </button>\n      <button\n        v-if=\"showDeleteFilteredImagesBtn && hasFilters\"\n        class=\"button delete-button\"\n        @click=\"$emit('delete-filtered-images')\"\n      >\n        <span>Delete Filtered Images</span>\n      </button>\n    </div>\n    <IconButton\n      v-if=\"collapsible\"\n      id=\"expand_less\"\n      :icon=\"'expand_less'\"\n      :width=\"'20px'\"\n      :height=\"'20px'\"\n      :type=\"''\"\n      :showHover=\"false\"\n      @click=\"collapse = !collapse\"\n    />\n  </div>\n</template>\n\n<script>\nimport CameraSourceFilter from '@/components/DatasetComponent/DatasetFilters/CameraSourceFilter.vue';\nimport GroupsFilter from '@/components/DatasetComponent/DatasetFilters/GroupsFilter.vue';\nimport BoundingBoxSizeFilter from '@/components/DatasetComponent/DatasetFilters/BoundingBoxSizeFilter.vue';\nimport ConfidenceRangeFilter from '@/components/DatasetComponent/DatasetFilters/ConfidenceRangeFilter.vue';\nimport AnnotationLabelFilter from '@/components/DatasetComponent/DatasetFilters/AnnotationLabelFilter.vue';\nimport AnnotationTypeFilter from '@/components/DatasetComponent/DatasetFilters/AnnotationTypeFilter.vue';\nimport ImageTagFilter from '@/components/DatasetComponent/DatasetFilters/ImageTagFilter.vue';\nimport TimeRangeFilter from '@/components/DatasetComponent/DatasetFilters/TimeRangeFilter.vue';\nimport DateRangeFilter from '@/components/DatasetComponent/DatasetFilters/DateRangeFilter.vue';\nimport ImageReviewStatusFilter from '@/components/DatasetComponent/DatasetFilters/ImageReviewStatusFilter.vue';\nimport ImageNameFilter from '@/components/DatasetComponent/DatasetFilters/ImageNameFilter.vue';\nimport MoreFilters from '@/components/DatasetComponent/DatasetFilters/MoreFilters.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport { computed, toRaw } from 'vue';\nimport useGallery from '@/composables/annotationTool/useGallery.js';\nimport AnnotationSetFilter from '@/components/DatasetComponent/DatasetFilters/AnnotationSetFilter.vue';\nimport ImagesWithAnnotationSetFilter from '@/components/DatasetComponent/DatasetFilters/ImagesWithAnnotationSetFilter.vue';\n\nexport default {\n  name: \"DatasetFilter\",\n  components: {\n    CameraSourceFilter,\n    ConfidenceRangeFilter,\n    AnnotationSetFilter,\n    ImagesWithAnnotationSetFilter,\n    AnnotationLabelFilter,\n    AnnotationTypeFilter,\n    ImageTagFilter,\n    TimeRangeFilter,\n    DateRangeFilter,\n    ImageReviewStatusFilter,\n    ImageNameFilter,\n    MoreFilters,\n    IconButton,\n    GroupsFilter,\n    BoundingBoxSizeFilter,\n  },\n  provide() {\n    return {\n      teleport: computed(() => this.teleport),\n    };\n  },\n  props: {\n    collapsible: {\n      type: Boolean,\n      default: false,\n    },\n    showCopyFilteredImagesBtn: {\n      type: Boolean,\n      default: false,\n    },\n    showDeleteFilteredImagesBtn: {\n      type: Boolean,\n      default: false,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    types: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    modelValue: {\n      type: Object,\n      default: () => {},\n    },\n    filterList: {\n      type: Array,\n      default: () => [\n        { name: 'AnnotationSetFilter', key: 'annotationSetFilter' },\n        // { name: 'ImagesWithAnnotationSetFilter', key: 'imagesWithAnnotationSetFilter' },\n        { name: 'AnnotationLabelFilter', key: 'annotationLabelFilter' },\n        { name: 'AnnotationTypeFilter', key: 'annotationTypeFilter' },\n        { name: 'ImageTagFilter', key: 'imageTagFilter' },\n        { name: 'ConfidenceRangeFilter', key: 'confidenceRangeFilter' },\n        { name: 'TimeRangeFilter', key: 'timeRangeFilter' },\n        { name: 'DateRangeFilter', key: 'dateRangeFilter' },\n        { name: 'CameraSourceFilter', key: 'cameraSourceFilter' },\n        { name: 'GroupsFilter', key: 'groupsFilter' },\n        { name: 'BoundingBoxSizeFilter', key: 'boundingBoxSizeFilter' },\n        { name: 'ImageNameFilter', key: 'imageNameFilter' },\n      ],\n    },\n    additionalFilterList: {\n      type: Array,\n      default: () => [\n        { name: 'AnnotationSetFilter', key: 'annotationSetFilter' },\n      ],\n    },\n  },\n  emits: [\n    'update:modelValue', 'open-copy-filters', 'delete-filtered-images',\n  ],\n  setup() {\n    const {\n      datasetFilters,\n    } = useGallery();\n\n    return {\n      datasetFilters,\n    };\n  },\n  data() {\n    return {\n      showFilters: false,\n      filters: {},\n      collapse: false,\n      teleport: null,\n    };\n  },\n  computed: {\n    filterProps() {\n      return {\n        annotationSetFilter: { annotationSets: this.annotationSets },\n        imagesWithAnnotationSetFilter: { annotationSets: this.annotationSets },\n        annotationLabelFilter: { labels: this.labels },\n        annotationTypeFilter: { dataset: this.dataset },\n        imageTagFilter: { dataset: this.dataset },\n        groupsFilter: { dataset: this.dataset },\n        cameraSourceFilter: { dataset: this.dataset },\n        dateRangeFilter: { dataset: this.dataset },\n      };\n    },\n    filterValue() {\n      const filterKeys = Object.keys(this.filters);\n      return filterKeys\n        .filter((key) => this.filters[key] !== null && this.filters[key].length !== 0)\n        .reduce((result, key) => {\n          result[key] = this.filters[key];\n          return result;\n        }, {});\n    },\n    hasFilters() {\n      return this.filterValue && Object.keys(this.filterValue).length > 0;\n    },\n  },\n  watch: {\n    filterValue: {\n      deep: true,\n      handler() {\n        this.$emit('update:modelValue', this.filterValue);\n      },\n    },\n  },\n  mounted() {\n    this.teleport = this.$refs.filters.parentElement;\n    if (this.$route.query.filter_params) {\n      this.filters = JSON.parse(decodeURI(this.$route.query.filter_params));\n    }\n    // override if store value exists\n    if (this.datasetFilters) {\n      this.filters = this.datasetFilters;\n    }\n  },\n  methods: {\n\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filters {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  width: 100%;\n\n  &._collapse {\n    flex-wrap: nowrap;\n    gap: 12px;\n\n    .filters__active-and-default-filters {\n      margin-bottom: -8px;\n      position: relative;\n      display: flex;\n      flex-direction: row;\n      flex-wrap: nowrap;\n      flex: unset;\n      gap: 12px;\n      overflow-x: auto;\n      overflow-y: hidden;\n    }\n\n    .filters__more-filters {\n      position: relative;\n      display: flex;\n      flex-direction: row;\n      flex: unset;\n      gap: 12px;\n    }\n\n    #expand_less {\n      position: absolute;\n      bottom: -8px;\n      right: -16px;\n      transform: rotateX(180deg);\n      &:hover {\n        @include themify() {\n          background-color: themed('icon-hover-color');\n          border-radius: unset;\n        }\n      }\n    }\n  }\n\n  &__active-and-default-filters {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    flex: 1 1 auto;\n    gap: 12px;\n  }\n\n  &__more-filters {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    flex: 1 1 auto;\n    gap: 12px;\n  }\n\n  #expand_less {\n    position: absolute;\n    bottom: -8px;\n    right: -16px;\n    &:hover {\n      @include themify() {\n        background-color: themed('icon-hover-color');\n        border-radius: unset;\n      }\n    }\n  }\n}\n\n.filter-button {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  height: 30px;\n  border-radius: 6px;\n  padding: 2px 10px;\n  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 20%);\n  gap: 2px;\n  white-space: nowrap;\n  @include themify() {\n    border: 2px solid themed('button-secondary-outlined-border');\n    background: themed('button-secondary-outlined');\n    color: themed('button-secondary-text');\n  }\n\n  &:hover {\n    @include themify() {\n      background: themed('button-secondary-hover-color');\n    }\n  }\n}\n\n.delete-button {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  height: 30px;\n  border-radius: 6px;\n  padding: 2px 10px;\n  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 20%);\n  gap: 2px;\n  white-space: nowrap;\n\n  @include themify() {\n    border: 2px solid themed('button-red-border');\n    background: themed('button-red');\n    color: themed('button-secondary-text');\n  }\n\n  &:hover {\n    @include themify() {\n      background: themed('button-red-hover');\n    }\n  }\n\n  &:disabled {\n    @include themify() {\n      border: 2px solid themed('button-secondary-outlined-border');\n      background: themed('color-disabled');\n    }\n  }\n}\n\n</style>\n","<template>\n  <FilterPopper v-model:show=\"isOpen\">\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Camera Source'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <Transition name=\"fade\" mode=\"out-in\">\n          <div v-if=\"cameraSources && cameraSources.length > 0\">\n            <div v-for=\"(source, i) in cameraSources\" :key=\"i\" class=\"filter-settings__row\">\n              <input\n                :id=\"`cameraSourceFilter-source-${i}`\"\n                v-model=\"selectedCameraSources\"\n                type=\"checkbox\"\n                :name=\"`${source}-${i}`\"\n                :value=\"source\"\n              >\n              <label :for=\"`source-${i}`\">{{ source }}</label><br>\n            </div>\n          </div>\n          <div v-else-if=\"cameraSources\">\n            No camera sources found.\n          </div>\n          <div v-else>\n            <v-skeleton-loader\n              type=\"list-item\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n            <v-skeleton-loader\n              type=\"list-item\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n          </div>\n        </Transition>\n      </div>\n\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"CameraSourceFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      isOpen: false,\n      selectedCameraSources: [],\n      cameraSources: null,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedCameraSources.length > 0;\n    },\n    tagValue() {\n      return this.selectedCameraSources.length.toString();\n    },\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n  },\n  watch: {\n    modelValue(newVal) {\n      this.selectedCameraSources = newVal;\n    },\n    selectedCameraSources() {\n      this.updateFilters();\n    },\n    isOpen(isOpen) {\n      if (isOpen) {\n        const dataConnect = new DatastoreConnect();\n        dataConnect.getDatasetImageSources({ dataset_id: this.dataset.id })\n          .then((resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            this.cameraSources = resp.result;\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n    currentDataset() {\n      this.cameraSources = null;\n      this.selectedCameraSources = [];\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedCameraSources);\n    },\n    clearSelection() {\n      this.selectedCameraSources = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n.fade-enter-active, .fade-leave-active {\n  transition: opacity 0.1s ease;\n}\n.fade-enter-from, .fade-leave-to {\n  opacity: 0;\n}\n\n:deep(.v-skeleton-loader__list-item) {\n  margin: 4px;\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <Popper\n    ref=\"launchTasksPopper\"\n    v-model:show=\"localShow\"\n    :trigger=\"trigger\"\n    :appendToBody=\"appendToBody\"\n    :config=\"popperConfig\"\n    :teleport=\"teleport\"\n  >\n    <template #trigger>\n      <slot :menuOpen=\"localShow\" />\n    </template>\n    <div ref=\"popper\" class=\"popper\">\n      <div class=\"filter-card\">\n        <slot name=\"popper\" />\n      </div>\n    </div>\n  </Popper>\n</template>\n\n<script>\nimport Popper from '@/components/Popper.vue';\nimport { detectOverflow } from '@popperjs/core';\n\nconst overflowPadding = 20;\n\nexport default {\n  name: 'FilterPopper',\n  components: {\n    Popper,\n  },\n  inject: {\n    teleport: {\n      default: null,\n    },\n  },\n  props: {\n    placement: {\n      type: String,\n      default: 'bottom-start',\n    },\n    flip: {\n      type: Boolean,\n      default: true,\n    },\n    offset: {\n      type: Array,\n      default: () => [-4, 4],\n    },\n    trigger: {\n      type: String,\n      default: 'click',\n    },\n    appendToBody: {\n      type: Boolean,\n      default: false,\n    },\n    show: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: ['update:show'],\n  data() {\n    return {\n      localShow: false,\n    };\n  },\n  computed: {\n    detectOverflowModifier() {\n      return {\n        name: 'detectOverflowModifier',\n        enabled: !this.flip,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement === 'right') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.right - overflowPadding}px`;\n          }\n          if (state.placement === 'left') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.left - overflowPadding}px`;\n          }\n        },\n      };\n    },\n    detectHeightOverflowModifier() {\n      return {\n        name: 'detectHeightOverflowModifier',\n        enabled: true,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement.startsWith('bottom')) {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflowPadding}px`;\n          } else if (state.placement.startsWith('left') || state.placement.startsWith('right')) {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflow.top - (overflowPadding * 2)}px`;\n          }\n        },\n      };\n    },\n    popperConfig() {\n      return {\n        placement: this.placement,\n        modifiers: [\n          this.detectOverflowModifier,\n          this.detectHeightOverflowModifier,\n          {\n            name: 'offset',\n            options: {\n              offset: this.offset,\n            },\n          },\n          {\n            name: 'preventOverflow',\n            options: {\n              padding: overflowPadding,\n            },\n          },\n          {\n            name: 'flip',\n            enabled: this.flip,\n          },\n        ],\n      };\n    },\n  },\n  watch: {\n    localShow(show) {\n      this.$emit('update:show', show);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.popper {\n  padding: 4px;\n  color: #000000;\n  margin: 0;\n  z-index: 999;\n}\n\n.filter-card {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  background: #ffffff;\n  box-shadow: 0 1px 4px 0 rgb(0 0 0 / 20%);\n  border-radius: 8px;\n  @include themify() {\n    outline: 1px solid themed('popper-border-light');\n  }\n}\n\n</style>\n","import { render } from \"./FilterPopper.vue?vue&type=template&id=88118166&scoped=true\"\nimport script from \"./FilterPopper.vue?vue&type=script&lang=js\"\nexport * from \"./FilterPopper.vue?vue&type=script&lang=js\"\n\nimport \"./FilterPopper.vue?vue&type=style&index=0&id=88118166&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-88118166\"]])\n\nexport default __exports__","<template>\n  <button class=\"button filter-button\" :class=\"{'_active': active, '_menuOpen': menuOpen, '_error': error}\" @keyup.esc=\"handleCloseFilter\">\n    <slot name=\"button-start\" />\n    <span>{{ name }}</span>\n    <div v-if=\"active\" class=\"filter-tag\"><span>{{ tagValue }}</span></div>\n    <SVGIcon\n      v-else\n      :mirrored=\"menuOpen\"\n      :iconName=\"'expand_more'\"\n      :width=\"'20px'\"\n      :height=\"'20px'\"\n    />\n  </button>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: \"BaseFilterButton\",\n  components: {\n    SVGIcon,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    active: {\n      type: Boolean,\n      default: false,\n    },\n    tagValue: {\n      type: String,\n      default: '',\n    },\n    menuOpen: {\n      type: Boolean,\n      default: false,\n    },\n    error: {\n      type: Boolean,\n      default: false,\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-button {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  height: 30px;\n  gap: 4px;\n  border-radius: 6px;\n  padding: 2px 10px;\n  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 20%);\n  line-height: 20px;\n  width: fit-content;\n  max-width: fit-content;\n  @include themify() {\n    border: 1px solid themed('filter-button-border');\n    background: themed('filter-button-background');\n    color: themed('button-secondary-text');\n  }\n\n  &:hover {\n    @include themify() {\n      background: themed('filter-button-background-hover');\n    }\n  }\n\n  > span {\n    white-space: nowrap;\n  }\n\n  .filter-tag {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 18px;\n    padding: 0 6px;\n    height: 18px;\n    max-width: 100px;\n    min-width: 0;\n    white-space: nowrap;\n    @include themify() {\n      background: themed('color-accent');\n      color: themed('accent-text-color');\n    }\n\n    > span {\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n  }\n\n  &._menuOpen {\n    @include themify() {\n      background: themed('filter-button-menu-open-background');\n      color: themed('filter-button-menu-open-text');\n      border: 1px solid themed('filter-button-menu-open-border');\n    }\n  }\n\n  &._active {\n    @include themify() {\n      background: themed('button-active');\n      color: themed('primary-text-color');\n    }\n  }\n\n  &._error {\n    @include themify() {\n      background: themed('filter-button-background');\n      border: 2px solid themed('color-red-400');\n    }\n  }\n}\n</style>\n","import { render } from \"./BaseFilterButton.vue?vue&type=template&id=5f7c793e&scoped=true\"\nimport script from \"./BaseFilterButton.vue?vue&type=script&lang=js\"\nexport * from \"./BaseFilterButton.vue?vue&type=script&lang=js\"\n\nimport \"./BaseFilterButton.vue?vue&type=style&index=0&id=5f7c793e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5f7c793e\"]])\n\nexport default __exports__","import { render } from \"./CameraSourceFilter.vue?vue&type=template&id=039a4512&scoped=true\"\nimport script from \"./CameraSourceFilter.vue?vue&type=script&lang=js\"\nexport * from \"./CameraSourceFilter.vue?vue&type=script&lang=js\"\n\nimport \"./CameraSourceFilter.vue?vue&type=style&index=0&id=039a4512&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-039a4512\"]])\n\nexport default __exports__","<template>\n  <FilterPopper v-model:show=\"isOpen\">\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Group'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <div v-if=\"groups && groups.length > 0\">\n          <div v-for=\"(group, i) in groups\" :key=\"i\" class=\"filter-settings__row\">\n            <input\n              :id=\"`groupFilter-group-${i}`\"\n              v-model=\"selectedGroups\"\n              type=\"checkbox\"\n              :name=\"`${group}-${i}`\"\n              :value=\"group.id\"\n            >\n            <label :for=\"`groupFilter-group-${i}`\">{{ group.name }}</label><br>\n          </div>\n        </div>\n        <div v-else>\n          No groups in current dataset.\n        </div>\n      </div>\n\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"GroupsFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: null,\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      isOpen: false,\n      selectedGroups: [],\n      groups: null,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedGroups.length > 0;\n    },\n    tagValue() {\n      return this.selectedGroups.length.toString();\n    },\n  },\n  watch: {\n    modelValue(newVal) {\n      this.selectedGroups = newVal;\n    },\n    selectedGroups() {\n      this.updateFilters();\n    },\n    isOpen(isOpen) {\n      if (isOpen) {\n        if (this.dataset.groups) {\n          this.groups = this.dataset?.groups;\n        } else {\n          this.groups = null;\n        }\n      }\n    },\n    dataset() {\n      this.selectedGroups = [];\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedGroups);\n    },\n    clearSelection() {\n      this.selectedGroups = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n.fade-enter-active, .fade-leave-active {\n  transition: opacity 0.1s ease;\n}\n.fade-enter-from, .fade-leave-to {\n  opacity: 0;\n}\n\n:deep(.v-skeleton-loader__list-item) {\n  margin: 4px;\n}\n</style>\n","import { render } from \"./GroupsFilter.vue?vue&type=template&id=6d971bfb&scoped=true\"\nimport script from \"./GroupsFilter.vue?vue&type=script&lang=js\"\nexport * from \"./GroupsFilter.vue?vue&type=script&lang=js\"\n\nimport \"./GroupsFilter.vue?vue&type=style&index=0&id=6d971bfb&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6d971bfb\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Annotation Size'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <div class=\"filter-settings__header switch-container\">\n          <input\n            id=\"pixel\"\n            v-model=\"type\"\n            type=\"radio\"\n            value=\"pixel\"\n          >\n          <label for=\"html\">Pixel</label>\n          <input\n            id=\"percent\"\n            v-model=\"type\"\n            type=\"radio\"\n            value=\"percent\"\n          >\n          <label for=\"percent\">Percent</label>\n        </div>\n        <div class=\"filter-settings__row settings__control-group\">\n          <label class=\"text\">Width</label>\n          <input\n            v-model=\"values.lower_width\"\n            :min=\"lowerBoundWidth\"\n            :max=\"values.upper_width\"\n            type=\"number\"\n            placeholder=\"Min\"\n            @change=\"changeSanitizer\"\n            @input=\"inputSanitizer\"\n          >\n          <span>&#x2013;</span>\n          <input\n            v-model=\"values.upper_width\"\n            :min=\"values.lower_width\"\n            :max=\"upperBoundWidth\"\n            type=\"number\"\n            placeholder=\"Max\"\n            @change=\"changeSanitizer\"\n            @input=\"inputSanitizer\"\n          >\n        </div>\n        <div class=\"filter-settings__row settings__control-group\">\n          <label class=\"text\">Height</label>\n          <input\n            v-model=\"values.lower_height\"\n            :min=\"lowerBoundHeight\"\n            :max=\"values.upper_height\"\n            type=\"number\"\n            placeholder=\"Min\"\n            @change=\"changeSanitizer\"\n            @input=\"inputSanitizer\"\n          >\n          <span>&#x2013;</span>\n          <input\n            v-model=\"values.upper_height\"\n            :min=\"values.lower_height\"\n            :max=\"upperBoundHeight\"\n            type=\"number\"\n            placeholder=\"Max\"\n            @change=\"changeSanitizer\"\n            @input=\"inputSanitizer\"\n          >\n        </div>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport { debounce, inputSanitizer, changeSanitizer } from '@/assets/js/utils.js';\n\nexport default {\n  name: \"BoundingBoxSizeFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Object,\n      default: null,\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      type: 'pixel',\n      values: {\n        lower_height: null,\n        upper_height: null,\n        lower_width: null,\n        upper_width: null,\n      },\n      lowerBoundHeight: 0,\n      upperBoundHeight: 0,\n      lowerBoundWidth: 0,\n      upperBoundWidth: 0,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.values.lower_height > 0 || this.values.upper_height > 0 || this.values.lower_width > 0 || this.values.upper_width > 0;\n    },\n    tagValue() {\n      let count = 0;\n      Object.keys(this.values).forEach((val) => {\n        if (this.values[val] > 0) {\n          count += 1;\n        }\n      });\n\n      return count.toString();\n    },\n  },\n  watch: {\n    type() {\n      this.clearSelection();\n      this.updateBounds(this.type);\n    },\n    values: {\n      deep: true,\n      handler() {\n        this.debouncedUpdateFilters();\n      },\n    },\n    modelValue() {\n      if (this.modelValue) {\n        this.values.lower_height = this.modelValue.lower_height;\n        this.values.upper_height = this.modelValue.upper_height;\n        this.values.lower_width = this.modelValue.lower_width;\n        this.values.upper_width = this.modelValue.upper_width;\n        this.values.type = this.modelValue.type;\n      }\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = debounce(this.updateFilters, 500);\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.values.lower_height = this.modelValue.lower_height;\n      this.values.upper_height = this.modelValue.upper_height;\n      this.values.lower_width = this.modelValue.lower_width;\n      this.values.upper_width = this.modelValue.upper_width;\n      this.values.type = this.modelValue.type;\n    }\n    this.updateBounds(this.type);\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    updateFilters() {\n      this.$emit('update:modelValue', { ...this.values, type: this.type });\n    },\n    clearSelection() {\n      this.values.lower_height = null;\n      this.values.upper_height = null;\n      this.values.lower_width = null;\n      this.values.upper_width = null;\n      this.values.type = 'pixel';\n    },\n    updateBounds(type) {\n      if (type === 'percent') {\n        this.lowerBoundHeight = 0;\n        this.upperBoundHeight = 1;\n        this.lowerBoundWidth = 0;\n        this.upperBoundWidth = 1;\n      }\n      if (type === 'pixel') {\n        this.lowerBoundHeight = null;\n        this.upperBoundHeight = null;\n        this.lowerBoundWidth = null;\n        this.upperBoundWidth = null;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  align-items: center;\n  min-width: 350px;\n  overflow: auto;\n\n  &__header {\n    display: flex;\n    flex-direction: row;\n\n    span {\n      font-size: 0.9rem;\n    }\n    .text {\n      width: 60%;\n      font-size: 0.9rem;\n    }\n  }\n\n  &__row {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n\n    span {\n      font-size: 0.9rem;\n    }\n    .text {\n      width: 60%;\n      font-size: 0.9rem;\n    }\n\n    input {\n      margin: 5px 10px;\n    }\n  }\n\n  .switch-container {\n    margin: 5px 5px 5px auto;\n\n    span{\n      text-align: right;\n      margin-left: 5px;\n    }\n    input[type=\"radio\"] {\n        margin-left: 20px;\n        accent-color: var(--color-primary-400);\n    }\n    label {\n        margin-left: 5px;\n    }\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n/* Chrome, Safari, Edge, Opera */\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\n/* Firefox */\ninput[type=number] {\n  -moz-appearance: textfield;\n}\n</style>\n","import { render } from \"./BoundingBoxSizeFilter.vue?vue&type=template&id=738d2538&scoped=true\"\nimport script from \"./BoundingBoxSizeFilter.vue?vue&type=script&lang=js\"\nexport * from \"./BoundingBoxSizeFilter.vue?vue&type=script&lang=js\"\n\nimport \"./BoundingBoxSizeFilter.vue?vue&type=style&index=0&id=738d2538&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-738d2538\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Confidence'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <span>{{ lowerValue }}</span>\n        <RangeSlider\n          v-model:valueLower=\"lowerValue\"\n          v-model:valueUpper=\"upperValue\"\n          :step=\"step\"\n          :min=\"min\"\n          :max=\"max\"\n          :showMiddle=\"false\"\n        />\n        <span>{{ upperValue }}</span>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport RangeSlider from '@/components/RangeSlider.vue';\nimport * as utils from '@/assets/js/utils.js';\n\nexport default {\n  name: \"ConfidenceRangeFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n    RangeSlider,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: null,\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      min: 0,\n      max: 1,\n      lowerValue: 0.0,\n      upperValue: 1.0,\n      step: 0.01,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.lowerValue > 0 || this.upperValue < 1;\n    },\n    tagValue() {\n      return `${this.lowerValue.toFixed(2)} - ${this.upperValue.toFixed(2)}`;\n    },\n  },\n  watch: {\n    lowerValue() {\n      this.debouncedUpdateFilters();\n    },\n    upperValue() {\n      this.debouncedUpdateFilters();\n    },\n    modelValue() {\n      if (this.modelValue) {\n        this.lowerValue = this.modelValue[0];\n        this.upperValue = this.modelValue[1];\n      }\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 600);\n  },\n  methods: {\n    async updateFilters() {\n      if (!this.isActive) {\n        this.$emit('update:modelValue', null);\n        return;\n      }\n      this.$emit('update:modelValue', [this.lowerValue, this.upperValue]);\n    },\n    clearSelection() {\n      this.lowerValue = 0.0;\n      this.upperValue = 1.0;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: row;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 350px;\n  min-height: 50px;\n  justify-content: center;\n  align-items: center;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n    text-align: center;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./ConfidenceRangeFilter.vue?vue&type=template&id=4b02195b&scoped=true\"\nimport script from \"./ConfidenceRangeFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ConfidenceRangeFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ConfidenceRangeFilter.vue?vue&type=style&index=0&id=4b02195b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4b02195b\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Images With Annotation Labels'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div v-if=\"labels && Object.values(labels).length > 0\" class=\"filter-settings scrollbar\">\n        <div v-for=\"(label, i) in labels\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`annotationLabelFilter-${label.name}-${i}`\"\n            v-model=\"selectedLabels\"\n            type=\"checkbox\"\n            :name=\"`selected-labels`\"\n            :value=\"label.index\"\n          >\n          <label :for=\"`annotationLabelFilter-${label.name}-${i}`\">{{ label.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        Please define a label.\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"AnnotationLabelFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedLabels: [],\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedLabels.length > 0;\n    },\n    tagValue() {\n      return this.selectedLabels.length.toString();\n    },\n  },\n  watch: {\n    labels: {\n      deep: true,\n      immediate: true,\n      handler() {\n        this.selectedLabels = [];\n      },\n    },\n    modelValue(newVal) {\n      this.selectedLabels = newVal;\n    },\n    selectedLabels() {\n      this.updateFilters();\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedLabels);\n    },\n    clearSelection() {\n      this.selectedLabels = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    text-align: center;\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./AnnotationLabelFilter.vue?vue&type=template&id=3ea8b77e&scoped=true\"\nimport script from \"./AnnotationLabelFilter.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationLabelFilter.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationLabelFilter.vue?vue&type=style&index=0&id=3ea8b77e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3ea8b77e\"]])\n\nexport default __exports__","<template>\n  <FilterPopper v-model:show=\"isOpen\">\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Images With Annotation Types'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <Transition name=\"fade\" mode=\"out-in\">\n          <div v-if=\"internalTypes && internalTypes.length > 0\">\n            <div v-for=\"(type, i) in internalTypes\" :key=\"i\" class=\"filter-settings__row\">\n              <input\n                :id=\"`annotationTypeFilter-type-${i}`\"\n                v-model=\"selectedTypes\"\n                type=\"checkbox\"\n                :name=\"`${type}-${i}`\"\n                :value=\"type\"\n              >\n              <label :for=\"`${type}-${i}`\">{{ getTypeDisplayString(type) }}</label><br>\n            </div>\n          </div>\n          <div v-else-if=\"internalTypes\">\n            No annotation type\n          </div>\n          <div v-else>\n            <v-skeleton-loader\n              type=\"list-item\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n            <v-skeleton-loader\n              type=\"list-item\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n          </div>\n        </Transition>\n      </div>\n      <div v-if=\"selectedTypes.length > 0\" class=\"filter-settings filter-settings-extra\">\n        <div class=\"filter-settings__row\">\n          <input\n            :id=\"`annotationTypeFilter-type-invert`\"\n            v-model=\"isInvertSelected\"\n            type=\"checkbox\"\n            :name=\"`invert`\"\n          >\n          <label :for=\"`invert`\">Invert Selection</label>\n        </div>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"AnnotationTypeFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n    'update:invert',\n  ],\n  setup() {\n    const {\n      getTypeDisplayString,\n    } = useAnnotationType();\n    return {\n      getTypeDisplayString,\n    };\n  },\n  data() {\n    return {\n      isOpen: false,\n      selectedTypes: [],\n      internalTypes: null,\n      isInvertSelected: false,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedTypes.length > 0;\n    },\n    tagValue() {\n      return this.selectedTypes.length.toString();\n    },\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n  },\n  watch: {\n    types: {\n      deep: true,\n      immediate: true,\n      handler() {\n        this.selectedTypes = [];\n      },\n    },\n    modelValue(newVal) {\n      this.selectedTypes = newVal;\n    },\n    isInvertSelected() {\n      this.updateFilters();\n    },\n    selectedTypes() {\n      this.updateFilters();\n    },\n    isOpen(isOpen) {\n      if (isOpen) {\n        const dataConnect = new DatastoreConnect();\n        dataConnect.getDatasetAnnotationTypes({ dataset_id: this.dataset.id })\n          .then((resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            this.internalTypes = resp.result;\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n  },\n  mounted() {\n    this.isInvertSelected = this.invert;\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedTypes);\n\n      if (!this.selectedTypes || this.selectedTypes.length === 0) {\n        this.isInvertSelected = null;\n      }\n      this.$emit('update:invert', this.isInvertSelected);\n    },\n    clearSelection() {\n      this.selectedTypes = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n      display: flex;\n      align-items: center;\n  }\n\n  &__row + &__row {\n    margin-top: 5px;\n  }\n\n  & input[type=checkbox] {\n      margin-right: 12px;\n  }\n}\n\n.filter-settings-extra {\n  border-top: 1px solid rgba(140, 140, 140, 0.375);\n  border-radius: 0;\n}\n\n.filter-footer {\nmin-height: 38px;\nwidth: 100%;\nborder-top: 1px solid rgba(140,140,140,0.375);\npadding: 8px;\ntext-align: center;\n\n.clear-button {\n    text-align: center;\n    @include themify() {\n    color: themed('color-danger');\n    }\n\n    &[disabled] {\n    @include themify() {\n        color: themed('color-disabled');\n    }\n    }\n}\n}\n</style>\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\nexport const useAnnotationTypeStore = defineStore('anntypes', () => {\n  const selectedDisplayTypes = ref([]);\n  const jsonViewerShowTypes = ref({\n    image: true,\n    box: true,\n    seg: true,\n    pcd: false,\n    json: false,\n    '3dbox': false,\n    depthmap: false,\n  });\n\n  function $reset() {\n    selectedDisplayTypes.value = [];\n    jsonViewerShowTypes.value = {\n      image: true,\n      box: true,\n      seg: true,\n      pcd: false,\n      json: false,\n      '3dbox': false,\n      depthmap: false,\n    };\n  }\n\n  return {\n    jsonViewerShowTypes,\n    selectedDisplayTypes,\n    $reset,\n  };\n});\n","import {\n  onUnmounted,\n} from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useAnnotationTypeStore } from '@/stores/useAnnotationTypeStore.js';\n\nexport default function useAnnotationType() {\n  const {\n    selectedDisplayTypes,\n    jsonViewerShowTypes,\n  } = storeToRefs(useAnnotationTypeStore());\n\n  const {\n    $reset,\n  } = useAnnotationTypeStore();\n\n  onUnmounted(() => {\n    $reset();\n  });\n\n  const ALL_TYPES = [\n    {\n      key: 'pcd',\n      display: 'Radar Point Cloud',\n    },\n    {\n      key: 'imu',\n      display: 'Pose',\n    },\n    {\n      key: 'gps',\n      display: 'Location',\n    },\n    {\n      key: 'radar',\n      display: 'Radar',\n    },\n    {\n      key: 'lidar',\n      display: 'LiDAR Point Cloud',\n    },\n    {\n      key: 'box',\n      display: '2D Bounding Box',\n    },\n    {\n      key: '3dbox',\n      display: '3D Bounding Box',\n    },\n    {\n      key: 'seg',\n      display: '2D Polygon',\n    },\n    {\n      key: 'mask',\n      display: 'Mask File',\n    },\n    {\n      key: 'scales',\n      display: 'Scales File',\n    },\n    {\n      key: 'cube',\n      display: 'Cube File',\n    },\n    {\n      key: 'depthmap',\n      display: 'Depth Map',\n    },\n  ];\n\n  function getTypeDisplayString(str) {\n    let result = \"\";\n    switch (str) {\n    case 'pcd':\n      result = \"Point Cloud Data\";\n      break;\n    case 'radar':\n      result = \"Radar\";\n      break;\n    case 'gps':\n      result = \"Location\";\n      break;\n    case 'imu':\n      result = \"Pose\";\n      break;\n    case 'box':\n      result = \"2D Bounding Box\";\n      break;\n    case 'seg':\n      result = \"2D Polygon\";\n      break;\n    case 'mask':\n      result = \"Mask File\";\n      break;\n    case '3dbox':\n      result = \"3D Bounding Box\";\n      break;\n    case 'cube':\n      result = \"Cube File\";\n      break;\n    case 'scales':\n      result = \"Scales File\";\n      break;\n    case 'depthmap':\n      result = \"Depth Map\";\n      break;\n    default:\n      result = str;\n      break;\n    }\n    return result;\n  }\n\n  return {\n    getTypeDisplayString,\n    ALL_TYPES,\n    jsonViewerShowTypes,\n    selectedDisplayTypes,\n  };\n}\n","import { render } from \"./AnnotationTypeFilter.vue?vue&type=template&id=1ceeaf86&scoped=true\"\nimport script from \"./AnnotationTypeFilter.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationTypeFilter.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationTypeFilter.vue?vue&type=style&index=0&id=1ceeaf86&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1ceeaf86\"]])\n\nexport default __exports__","<template>\n  <FilterPopper v-model:show=\"isOpen\">\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Image Tags'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <Transition name=\"fade\" mode=\"out-in\">\n          <div v-if=\"internalTags && internalTags.length > 0\">\n            <div v-for=\"(tag, i) in internalTags\" :key=\"i\" class=\"filter-settings__row\">\n              <input\n                :id=\"`annotationTagFilter-tag-${i}`\"\n                v-model=\"selectedTags\"\n                type=\"checkbox\"\n                :name=\"`${tag.name}-${i}`\"\n                :value=\"tag\"\n              >\n              <label :for=\"`${tag.name}-${i}`\">{{ tag.name }}</label><br>\n            </div>\n          </div>\n          <div v-else-if=\"internalTags\">\n            No image tag\n          </div>\n          <div v-else>\n            <v-skeleton-loader\n              type=\"list-item\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n            <v-skeleton-loader\n              type=\"list-item\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n          </div>\n        </Transition>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"AnnotationTagFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      isOpen: false,\n      selectedTags: [],\n      internalTags: null,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedTags.length > 0;\n    },\n    tagValue() {\n      return this.selectedTags.length.toString();\n    },\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n  },\n  watch: {\n    modelValue(newVal) {\n      this.selectedTags = newVal;\n    },\n    selectedTags() {\n      this.updateFilters();\n    },\n    isOpen(isOpen) {\n      if (isOpen) {\n        const dataConnect = new DatastoreConnect();\n        dataConnect.listTagsForDataset({ dataset_id: this.dataset.id })\n          .then((resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            this.internalTags = resp.result;\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n    currentDataset() {\n      this.internalTags = null;\n      this.selectedTags = [];\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedTags);\n    },\n    clearSelection() {\n      this.selectedTags = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n      display: flex;\n      align-items: center;\n  }\n\n  &__row + &__row {\n    margin-top: 5px;\n  }\n\n  & input[type=checkbox] {\n      margin-right: 12px;\n  }\n}\n\n.filter-settings-extra {\n  border-top: 1px solid rgba(140, 140, 140, 0.375);\n  border-radius: 0;\n}\n\n.filter-footer {\nmin-height: 38px;\nwidth: 100%;\nborder-top: 1px solid rgba(140,140,140,0.375);\npadding: 8px;\ntext-align: center;\n\n.clear-button {\n    text-align: center;\n    @include themify() {\n    color: themed('color-danger');\n    }\n\n    &[disabled] {\n    @include themify() {\n        color: themed('color-disabled');\n    }\n    }\n}\n}\n</style>\n","import { render } from \"./ImageTagFilter.vue?vue&type=template&id=d504c382&scoped=true\"\nimport script from \"./ImageTagFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ImageTagFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ImageTagFilter.vue?vue&type=style&index=0&id=d504c382&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d504c382\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Time Range'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <div class=\"slider-container\">\n          <span>{{ Math.floor( lowerValue ) }}:{{ lowerValue % 1 ? '30' : '00' }}</span>\n          <RangeSlider\n            v-model:valueLower=\"lowerValue\"\n            v-model:valueUpper=\"upperValue\"\n            :step=\"step\"\n            :min=\"min\"\n            :max=\"max\"\n            :showMiddle=\"false\"\n            :flip=\"flip\"\n          />\n          <IconButton\n            class=\"filter-settings__flip-slider mx-1\"\n            :class=\"{'_active': flip}\"\n            :height=\"'24px'\"\n            :width=\"'24px'\"\n            :icon=\"'flip'\"\n            @click=\"flip = !flip\"\n          />\n          <span>{{ Math.floor( upperValue ) }}:{{ upperValue % 1 ? '30' : '00' }}</span>\n        </div>\n        <p class=\"disclaimer\">Time ranges displayed are in UTC.</p>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport RangeSlider from '@/components/RangeSlider.vue';\nimport * as utils from '@/assets/js/utils.js';\n\nexport default {\n  name: \"TimeRangeFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n    RangeSlider,\n    IconButton,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: null,\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      min: 0,\n      max: 24,\n      lowerValue: 0,\n      upperValue: 24,\n      step: 0.5,\n      flip: false,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.lowerValue !== 0 || this.upperValue !== 24;\n    },\n    tagValue() {\n      const lower = `${Math.floor(this.lowerValue)}:${this.lowerValue % 1 ? '30' : '00'}`;\n      const upper = `${Math.floor(this.upperValue)}:${this.upperValue % 1 ? '30' : '00'}`;\n      if (this.flip) {\n        return `${upper}-${lower}`;\n      }\n      return `${lower}-${upper}`;\n    },\n  },\n  watch: {\n    lowerValue() {\n      this.debouncedUpdateFilters();\n    },\n    upperValue() {\n      this.debouncedUpdateFilters();\n    },\n    flip() {\n      this.debouncedUpdateFilters();\n    },\n    modelValue() {\n      this.lowerValue = this.timeToDecimal(this.modelValue[0]);\n      this.upperValue = this.timeToDecimal(this.modelValue[1]);\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 600);\n  },\n  methods: {\n    timeToDecimal(timeStr) {\n    // Split the string by the colon\n      const [hours, minutes] = timeStr.split(':').map(Number);\n\n      // Convert hours and minutes to decimal\n      const decimalTime = hours + (minutes / 60);\n\n      return decimalTime;\n    },\n    updateFilters() {\n      if (!this.isActive) {\n        this.$emit('update:modelValue', null);\n        return;\n      }\n\n      if (this.flip) {\n        this.$emit('update:modelValue', [\n          `${Math.floor(this.upperValue)}:${this.upperValue % 1 ? '30' : '00'}`,\n          `${Math.floor(this.lowerValue)}:${this.lowerValue % 1 ? '30' : '00'}`,\n        ]);\n      } else {\n        this.$emit('update:modelValue', [\n          `${Math.floor(this.lowerValue)}:${this.lowerValue % 1 ? '30' : '00'}`,\n          `${Math.floor(this.upperValue)}:${this.upperValue % 1 ? '30' : '00'}`,\n        ]);\n      }\n    },\n    clearSelection() {\n      this.lowerValue = 0;\n      this.upperValue = 24;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 350px;\n  min-height: 50px;\n  justify-content: center;\n  align-items: center;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n  }\n\n  &__flip-slider._active {\n    transform: rotate(180deg);\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n.slider-container {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  gap: 8px;\n}\n\n.disclaimer {\n    margin-top: 2px;\n    text-align: left;\n    font-weight: 600;\n    font-style: italic;\n    line-height: 1.15;\n    font-size: 0.875rem;\n    color: var(--body-text-color-secondary);\n  }\n</style>\n","import { render } from \"./TimeRangeFilter.vue?vue&type=template&id=354aed10&scoped=true\"\nimport script from \"./TimeRangeFilter.vue?vue&type=script&lang=js\"\nexport * from \"./TimeRangeFilter.vue?vue&type=script&lang=js\"\n\nimport \"./TimeRangeFilter.vue?vue&type=style&index=0&id=354aed10&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-354aed10\"]])\n\nexport default __exports__","<template>\n  <FilterPopper v-model:show=\"isOpen\" :appendToBody=\"true\">\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Date Range'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <Transition name=\"fade\" mode=\"out-in\">\n          <div v-if=\"initialized\" class=\"date-container\">\n            <v-date-picker\n              v-model=\"startDate\"\n              :max=\"maxDateFormatted\"\n              :min=\"minDateFormatted\"\n              title=\"Select Start Date\"\n              elevation=\"3\"\n              color=\"#250E81\"\n            />\n            <v-date-picker\n              v-model=\"endDate\"\n              :max=\"maxDateFormatted\"\n              :min=\"minDateFormatted\"\n              title=\"Select End Date\"\n              elevation=\"3\"\n              color=\"#250E81\"\n            />\n          </div>\n          <div v-else class=\"date-range-loader\">\n            <v-skeleton-loader\n              type=\"date-picker-days\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n            <v-skeleton-loader\n              type=\"date-picker-days\"\n              theme=\"primary\"\n              color=\"transparent\"\n            />\n          </div>\n        </Transition>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport * as utils from '@/assets/js/utils.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"DateRangeFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Array,\n      default: null,\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      isOpen: false,\n      startDate: null,\n      endDate: null,\n      minDate: null,\n      maxDate: null,\n      initialized: false,\n    };\n  },\n\n  computed: {\n    currentYear() {\n      const currentDate = new Date();\n      return currentDate.getFullYear();\n    },\n    isActive() {\n      if (!this.startDate || !this.endDate || !this.minDate || !this.maxDate) {\n        return false;\n      }\n      // Ensure that startDate and endDate are not null\n      const startDateValid = this.startDate !== null;\n      const endDateValid = this.endDate !== null;\n\n      // Check if startDate and endDate are different from minDate and maxDate\n      const startDateDifferent = startDateValid && this.startDate.getTime() !== this.minDate.getTime();\n      const endDateDifferent = endDateValid && this.endDate.getTime() !== this.maxDate.getTime();\n\n      // Return true if both startDate and endDate are set and different from minDate and maxDate\n      return (startDateValid || endDateValid) && (startDateDifferent || endDateDifferent);\n    },\n    tagValue() {\n      let startDate = '';\n      let endDate = '';\n      if (this.startDate) {\n        startDate = new Date(this.startDate);\n        startDate = `${startDate.getMonth() + 1}/${startDate.getDate()}/${startDate.getFullYear()}`;\n      }\n\n      if (this.endDate) {\n        endDate = new Date(this.endDate);\n        endDate = `${endDate.getMonth() + 1}/${endDate.getDate()}/${endDate.getFullYear()}`;\n      }\n\n      if (this.startDate || this.endDate) {\n        return `${startDate} - ${endDate}`;\n      }\n      return '';\n    },\n    minDateFormatted() {\n      if (!this.minDate) return undefined;\n      const year = this.minDate.getUTCFullYear();\n      const month = String(this.minDate.getUTCMonth() + 1).padStart(2, '0'); // Months are zero-indexed\n      const day = String(this.minDate.getUTCDate()).padStart(2, '0');\n      const formattedDate = `${year}-${month}-${day}`;\n      return formattedDate;\n    },\n    maxDateFormatted() {\n      if (!this.maxDate) return undefined;\n      const year = this.maxDate.getUTCFullYear();\n      const month = String(this.maxDate.getUTCMonth() + 1).padStart(2, '0'); // Months are zero-indexed\n      const day = String(this.maxDate.getUTCDate()).padStart(2, '0');\n      const formattedDate = `${year}-${month}-${day}`;\n      return formattedDate;\n    },\n  },\n  watch: {\n    startDate() {\n      this.debouncedUpdateFilters();\n    },\n    endDate() {\n      this.debouncedUpdateFilters();\n    },\n    isOpen(isOpen) {\n      if (isOpen) {\n        const dataConnect = new DatastoreConnect();\n        dataConnect.getDatasetDateRange({ dataset_id: this.dataset.id })\n          .then((resp) => {\n            this.initialized = true;\n            if (resp.error) {\n              throw resp.error;\n            }\n            if (resp.result) {\n              this.minDate = new Date(resp.result.min_date);\n              this.maxDate = new Date(resp.result.max_date);\n\n              // Set time parts to 00:00:00\n              this.minDate.setHours(0, 0, 0, 0);\n              this.maxDate.setHours(0, 0, 0, 0);\n\n              if (!this.startDate) {\n                this.startDate = this.minDate;\n              }\n              if (!this.endDate) {\n                this.endDate = this.maxDate;\n              }\n            }\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n    modelValue(newTime, oldTime) {\n      if (oldTime && newTime) {\n        const oldStartTime = new Date(oldTime[0]);\n        const oldEndTime = new Date(oldTime[1]);\n        const newStartTime = new Date(newTime[0]);\n        const newEndTime = new Date(newTime[1]);\n\n        if (oldStartTime.getTime() !== newStartTime.getTime() && oldEndTime.getTime() !== newEndTime.getTime()) {\n          this.startDate = new Date(newTime[0]);\n          this.endDate = new Date(newTime[1]);\n        }\n      } else if (!oldTime && newTime) {\n        this.startDate = new Date(newTime[0]);\n        this.endDate = new Date(newTime[1]);\n      }\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 600);\n    this.minDate = new Date(1990, 0, 1, 0, 0, 0, 0);\n    this.maxDate = new Date(this.currentYear, 0, 1, 0, 0, 0, 0);\n  },\n  methods: {\n    updateFilters() {\n      if (!this.isActive) {\n        this.$emit('update:modelValue', null);\n        return;\n      }\n      if (this.startDate || this.endDate) {\n        this.$emit('update:modelValue', [\n          `${this.startDate ? this.startDate : ''}`,\n          `${this.endDate ? this.endDate : ''}`,\n        ]);\n        return;\n      }\n      this.$emit('update:modelValue', undefined);\n    },\n    clearSelection() {\n      if (this.minDate) {\n        this.startDate = this.minDate;\n      } else {\n        this.startDate = null;\n      }\n\n      if (this.maxDate) {\n        this.endDate = this.maxDate;\n      } else {\n        this.endDate = null;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n:deep{\n  .filter-tag {\n    max-width: 152px !important;\n  }\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 16px;\n  border-radius: inherit;\n  gap: 16px;\n  min-height: 50px;\n  align-items: center;\n  overflow-y: auto;\n  overflow-x: hidden;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n.date-container {\n  display: flex;\n  flex-direction: row;\n  min-width: 500px;\n  gap: 16px;\n}\n\n.date-range-loader {\n  display: flex;\n  flex-direction: row;\n  min-width: 668px;\n  gap: 16px;\n\n}\n</style>\n","import { render } from \"./DateRangeFilter.vue?vue&type=template&id=e59e7806&scoped=true\"\nimport script from \"./DateRangeFilter.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeFilter.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeFilter.vue?vue&type=style&index=0&id=e59e7806&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e59e7806\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Review Status'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <div v-for=\"(reviewStatus, i) in reviewStatuses\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`imageReviewStatusFilter-reviewStatus-${i}`\"\n            v-model=\"selectedReviewStatuses\"\n            type=\"checkbox\"\n            :name=\"`${reviewStatus.key}-${i}`\"\n            :value=\"reviewStatus.key\"\n          >\n          <label :for=\"`reviewStatus-${i}`\">{{ reviewStatus.name }}</label><br>\n        </div>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"ImageReviewStatusFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    reviewStatuses: {\n      type: Array,\n      default: () => [\n        { name: 'Unreviewed', key: 'unreviewed' },\n        { name: 'Reviewed', key: 'reviewed' },\n        { name: 'Verified', key: 'verified' },\n        { name: 'Flagged', key: 'flagged' },\n      ],\n    },\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedReviewStatuses: [],\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedReviewStatuses.length > 0;\n    },\n    tagValue() {\n      return this.selectedReviewStatuses.length.toString();\n    },\n  },\n  watch: {\n    modelValue(newVal) {\n      this.selectedReviewStatuses = newVal;\n    },\n    selectedReviewStatuses() {\n      this.updateFilters();\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedReviewStatuses);\n    },\n    clearSelection() {\n      this.selectedReviewStatuses = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./ImageReviewStatusFilter.vue?vue&type=template&id=7aa28120&scoped=true\"\nimport script from \"./ImageReviewStatusFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ImageReviewStatusFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ImageReviewStatusFilter.vue?vue&type=style&index=0&id=7aa28120&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7aa28120\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Image Name'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"settings__control-group scrollbar\">\n        <input\n          v-model=\"value\"\n          class=\"select\"\n          type=\"text\"\n          placeholder=\"'cat' or 'cat.jpg'\"\n        >\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport * as utils from '@/assets/js/utils.js';\n\nexport default {\n  name: \"ImageNameFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: String,\n      default: '',\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      value: '',\n    };\n  },\n  computed: {\n    isActive() {\n      return this.value.length > 0;\n    },\n    tagValue() {\n      return this.value;\n    },\n  },\n  watch: {\n    value() {\n      this.debouncedUpdateFilters();\n    },\n    modelValue() {\n      this.value = this.modelValue;\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 600);\n  },\n  mounted() {\n    this.value = this.modelValue;\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.value);\n    },\n    clearSelection() {\n      this.value = '';\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\ninput[type=\"text\"] {\n  width: 200px;\n  margin: 15px;\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./ImageNameFilter.vue?vue&type=template&id=bb37a96c&scoped=true\"\nimport script from \"./ImageNameFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ImageNameFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ImageNameFilter.vue?vue&type=style&index=0&id=bb37a96c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-bb37a96c\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <button class=\"button filter-button\" :class=\"{'_menuOpen': menuOpen}\" @keyup.esc=\"handleCloseFilter\">\n        <span>More Filters</span>\n        <SVGIcon\n          :iconName=\"'add'\"\n          :width=\"'18px'\"\n        />\n      </button>\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <div v-for=\"(filter, i) in filters\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`moreFilters-filters-${i}`\"\n            type=\"checkbox\"\n            :name=\"`${filter.name}-${i}`\"\n            :value=\"filter.name\"\n          >\n          <label :for=\"`filters-${i}`\">{{ filter.name }}</label><br>\n        </div>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: \"MoreFilters\",\n  components: {\n    FilterPopper,\n    SVGIcon,\n  },\n  props: {\n  },\n  data() {\n    return {\n      filters: [\n        { name: 'Additional Filter 1' },\n        { name: 'Additional Filter 2' },\n        { name: 'Additional Filter 3' },\n      ],\n    };\n  },\n  methods: {\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-button {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  height: 30px;\n  border-radius: 6px;\n  padding: 2px 10px;\n  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 20%);\n  gap: 2px;\n  background: transparent;\n  white-space: nowrap;\n  @include themify() {\n    border: 2px solid themed('button-secondary-outlined-border');\n    background: themed('button-secondary-outlined');\n    color: themed('button-secondary-text');\n  }\n\n  &._active {\n    @include themify() {\n      background: themed('button-active');\n    }\n  }\n\n  &._menuOpen {\n    @include themify() {\n      background: themed('filter-button-menu-open-background');\n      color: themed('filter-button-menu-open-text');\n      border: 1px solid themed('filter-button-menu-open-border');\n    }\n  }\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n}\n</style>\n","import { render } from \"./MoreFilters.vue?vue&type=template&id=46493aca&scoped=true\"\nimport script from \"./MoreFilters.vue?vue&type=script&lang=js\"\nexport * from \"./MoreFilters.vue?vue&type=script&lang=js\"\n\nimport \"./MoreFilters.vue?vue&type=style&index=0&id=46493aca&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-46493aca\"]])\n\nexport default __exports__","import { defineStore } from 'pinia';\nimport {\n  ref, computed, onBeforeMount,\n} from 'vue';\n\nexport const useGalleryStore = defineStore('gallery', {\n  state: () => {\n    const datasetFilters = ref({});\n    const annotationDisplaySettings = ref(null);\n    const imageDisplaySettings = ref(['showName', 'showSequences']);\n    const currentDatasetID = ref(0);\n    const internalCurrentDataset = ref({});\n    const combineSequenceFrames = ref(false);\n    const sortBy = ref('id');\n    const reverse = ref(false);\n    const currentPage = ref(1);\n    const imagesPerPage = ref(40);\n    const imageList = ref(null);\n    const totalImageCount = ref(0);\n    const getImagesParams = ref({});\n    const getImagesFilterParams = ref({});\n    const executing = ref(false);\n    const isFetchingImages = ref(false);\n\n    const totalPages = computed(() => Math.ceil(totalImageCount.value / imagesPerPage.value));\n\n    function setImageParams(params) {\n      combineSequenceFrames.value = params.combine_sequence_frames;\n      sortBy.value = params.sort_by;\n      reverse.value = params.reverse;\n    }\n\n    function setDatasetFilters(params) {\n      datasetFilters.value = { ...params };\n    }\n\n    function $reset() {\n      datasetFilters.value = {};\n      annotationDisplaySettings.value = null;\n      imageDisplaySettings.value = ['showName', 'showSequences'];\n      currentDatasetID.value = 0;\n      internalCurrentDataset.value = {};\n      currentPage.value = 1;\n      reverse.value = false;\n      combineSequenceFrames.value = false;\n      sortBy.value = 'id';\n      imagesPerPage.value = 40;\n      imageList.value = null;\n      totalImageCount.value = 0;\n      getImagesParams.value = {};\n      getImagesFilterParams.value = {};\n      executing.value = false;\n      isFetchingImages.value = false;\n    }\n\n    return {\n      datasetFilters,\n      annotationDisplaySettings,\n      imageDisplaySettings,\n      reverse,\n      combineSequenceFrames,\n      sortBy,\n      currentDatasetID,\n      internalCurrentDataset,\n      currentPage,\n      imagesPerPage,\n      imageList,\n      totalImageCount,\n      totalPages,\n      getImagesParams,\n      getImagesFilterParams,\n      executing,\n      isFetchingImages,\n      setImageParams,\n      setDatasetFilters,\n      $reset,\n    };\n  },\n  persist: true,\n});\n","import { ref, computed } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useGalleryStore } from '@/stores/useGalleryStore.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default function useGallery() {\n  const controller = ref(new AbortController());\n\n  const {\n    datasetFilters,\n    annotationDisplaySettings,\n    imageDisplaySettings,\n    reverse,\n    currentDatasetID,\n    internalCurrentDataset,\n    sortBy,\n    currentPage,\n    totalPages,\n    imagesPerPage,\n    imageList,\n    totalImageCount,\n    executing,\n    combineSequenceFrames,\n    isFetchingImages,\n  } = storeToRefs(useGalleryStore());\n\n  const {\n    setImageParams,\n    setDatasetFilters,\n    $reset,\n  } = useGalleryStore();\n\n  function getImagesParams() {\n    const params = {\n      get_annotations: true,\n      get_tags: true,\n      combine_sequence_frames: combineSequenceFrames.value,\n      sort_by: sortBy.value,\n      reverse: reverse.value,\n      offset: (currentPage.value - 1) * imagesPerPage.value,\n      limit: imagesPerPage.value,\n    };\n\n    return params;\n  }\n\n  function getImagesFilterParams() {\n    const params = {\n      images_filter: { dataset_id: currentDatasetID.value },\n      image_files_filter: {},\n      annotations_filter: {},\n      image_tags_filter: {},\n    };\n\n    // Images filter\n    if (datasetFilters.value.groupsFilter && datasetFilters.value.groupsFilter.length > 0) {\n      params.images_filter.group_ids = datasetFilters.value.groupsFilter;\n    }\n\n    // Annotations filter\n    if (datasetFilters.value.confidenceRangeFilter) {\n      params.annotations_filter.lower_score = datasetFilters.value.confidenceRangeFilter[0];\n      params.annotations_filter.upper_score = datasetFilters.value.confidenceRangeFilter[1];\n    }\n    if (datasetFilters.value.annotationTypeFilter && datasetFilters.value.annotationTypeFilter.length > 0) {\n      params.annotations_filter.types = datasetFilters.value.annotationTypeFilter;\n\n      if (datasetFilters.value.annotationTypeFilterInvert) {\n        params.annotations_filter.types_inverse = true;\n      }\n    }\n    if (datasetFilters.value.annotationSetFilter && datasetFilters.value.annotationSetFilter.length > 0) {\n      params.annotations_filter.annotation_set_ids = datasetFilters.value.annotationSetFilter.map((set) => set.id);\n    }\n    if (datasetFilters.value.imagesWithAnnotationSetFilter && datasetFilters.value.imagesWithAnnotationSetFilter.length > 0) {\n      params.annotations_filter.images_with_annotation_set_ids = datasetFilters.value.imagesWithAnnotationSetFilter.map((set) => set.id);\n    }\n    if (datasetFilters.value.annotationLabelFilter && datasetFilters.value.annotationLabelFilter.length > 0) {\n      params.annotations_filter.images_with_annotation_label_indexes = datasetFilters.value.annotationLabelFilter;\n    }\n    if (datasetFilters.value.boundingBoxSizeFilter) {\n      Object.entries(datasetFilters.value.boundingBoxSizeFilter).forEach(([key, value]) => {\n        if (key !== 'type' && value) {\n          params.annotations_filter[`${key}_${datasetFilters.value.boundingBoxSizeFilter.type}`] = value;\n        }\n      });\n    }\n\n    // Image files filter\n    if (datasetFilters.value.imageNameFilter && datasetFilters.value.imageNameFilter.length > 0) {\n      params.image_files_filter.image_name = datasetFilters.value.imageNameFilter;\n    }\n    if (datasetFilters.value.timeRangeFilter) {\n      params.image_files_filter.lower_time = datasetFilters.value.timeRangeFilter[0];\n      params.image_files_filter.upper_time = datasetFilters.value.timeRangeFilter[1];\n    }\n    if (datasetFilters.value.dateRangeFilter) {\n      if (datasetFilters.value.dateRangeFilter[0]) {\n        params.image_files_filter.lower_date = new Date(datasetFilters.value.dateRangeFilter[0]).toISOString();\n      }\n      if (datasetFilters.value.dateRangeFilter[1]) {\n        params.image_files_filter.upper_date = new Date(datasetFilters.value.dateRangeFilter[1]).toISOString();\n      }\n    }\n    if (datasetFilters.value.cameraSourceFilter && datasetFilters.value.cameraSourceFilter.length > 0) {\n      params.image_files_filter.image_sources = datasetFilters.value.cameraSourceFilter;\n    }\n\n    // Tags\n    if (datasetFilters.value.imageTagFilter && datasetFilters.value.imageTagFilter.length > 0) {\n      params.image_tags_filter.tag_names = datasetFilters.value.imageTagFilter.map((tag) => tag.name);\n    }\n\n    if (Object.keys(params.annotations_filter).length === 0) {\n      delete params.annotations_filter;\n    }\n\n    if (Object.keys(params.image_tags_filter).length === 0) {\n      delete params.image_tags_filter;\n    }\n\n    return params;\n  }\n\n  async function getSelectionImageCount(filterParams) {\n    const dataConnect = new DatastoreConnect();\n    const resp = await dataConnect.getFilteredImages({\n      only_count: true,\n      combine_sequence_frames: getImagesParams().combine_sequence_frames,\n      ...filterParams,\n    })\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        console.error(error);\n        return 0;\n      });\n\n    return resp;\n  }\n\n  async function getImages() {\n    if (currentDatasetID.value === 0) {\n      totalImageCount.value = 0;\n      return [];\n    }\n\n    if (internalCurrentDataset.value && internalCurrentDataset.value.parked_at !== \"0001-01-01T00:00:00Z\") {\n      return [];\n    }\n\n    isFetchingImages.value = true;\n    const dataConnect = new DatastoreConnect();\n    controller.value.abort();\n    controller.value = new AbortController();\n\n    totalImageCount.value = await getSelectionImageCount(getImagesFilterParams(), controller.value.signal);\n    if (totalImageCount.value === 0) {\n      isFetchingImages.value = false;\n      return [];\n    }\n\n    // Handle case when currentPage is greater than the new total number of pages\n    if (Math.ceil(totalImageCount.value / imagesPerPage.value) < currentPage.value) {\n      let newPage = Math.ceil(totalImageCount.value / imagesPerPage.value);\n      if (newPage < 1) {\n        newPage = 1;\n      }\n      currentPage.value = newPage;\n      return imageList.value;\n    }\n\n    const imageListParams = {\n      ...getImagesParams(),\n      ...getImagesFilterParams(),\n    };\n    const resp = await dataConnect.getFilteredImages(imageListParams, controller.value.signal)\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        console.error(error);\n        return [];\n      });\n\n    isFetchingImages.value = false;\n\n    return resp;\n  }\n\n  async function deleteFilteredImages() {\n    if (currentDatasetID.value === 0) {\n      totalImageCount.value = 0;\n      return [];\n    }\n\n    if (internalCurrentDataset.value && internalCurrentDataset.value.parked_at !== \"0001-01-01T00:00:00Z\") {\n      return [];\n    }\n\n    const dataConnect = new DatastoreConnect();\n    controller.value.abort();\n    controller.value = new AbortController();\n\n    const resp = await dataConnect.deleteFilteredImages({\n      ...getImagesParams(),\n      ...getImagesFilterParams(),\n    });\n    if (!resp || resp.error || !resp.result) {\n      // TODO: handle error\n      return 0;\n    }\n\n    return resp.result;\n  }\n\n  async function handleGetPreviousImage(currentImageObj) {\n    executing.value = true;\n    let resultImageObj = currentImageObj;\n    const index = imageList.value.findIndex((img) => img.id === currentImageObj.id);\n    if ((index - 1) >= 0) {\n      const previousImageObj = imageList.value[(index - 1)];\n      resultImageObj = previousImageObj;\n    } else if (currentPage.value > 1) {\n      currentPage.value -= 1;\n      // Await new images before setting previous image\n      const promise = new Promise((resolve, reject) => {\n        getImages().then((list) => {\n          imageList.value = list;\n          resolve(list);\n        });\n      });\n      await promise.then((list) => {\n        const nextImageObj = list[imagesPerPage.value - 1];\n        resultImageObj = nextImageObj;\n      });\n    }\n    executing.value = false;\n    return resultImageObj;\n  }\n\n  async function handleGetNextImage(currentImageObj) {\n    executing.value = true;\n    let resultImageObj = currentImageObj;\n    const index = imageList.value.findIndex((img) => img.id === currentImageObj.id);\n    if ((index + 1) < imagesPerPage.value) {\n      const nextImageObj = imageList.value[(index + 1)];\n      resultImageObj = nextImageObj;\n    } else {\n      currentPage.value += 1;\n      // Await new images before setting next image\n      const promise = new Promise((resolve, reject) => {\n        getImages().then((list) => {\n          imageList.value = list;\n          resolve(list);\n        });\n      });\n      await promise.then((list) => {\n        const nextImageObj = list[0];\n        resultImageObj = nextImageObj;\n      });\n    }\n    executing.value = false;\n    return resultImageObj;\n  }\n\n  function getHasPreviousImage(currentImageObj) {\n    if (!imageList.value) {\n      return false;\n    }\n    if (currentPage.value === 1) {\n      const index = imageList.value.findIndex((img) => img.id === currentImageObj.id);\n      if (index === 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  function getHasNextImage(currentImageObj) {\n    if (!imageList.value) {\n      return false;\n    }\n    if (currentPage.value === totalPages.value) {\n      const index = imageList.value.findIndex((img) => img.id === currentImageObj.id);\n      if ((index + 1) === imageList.value.length) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  return {\n    datasetFilters,\n    annotationDisplaySettings,\n    imageDisplaySettings,\n    reverse,\n    combineSequenceFrames,\n    sortBy,\n    currentDatasetID,\n    internalCurrentDataset,\n    currentPage,\n    totalPages,\n    imagesPerPage,\n    imageList,\n    totalImageCount,\n    getImages,\n    deleteFilteredImages,\n    getImagesParams,\n    getImagesFilterParams,\n    handleGetPreviousImage,\n    handleGetNextImage,\n    getHasPreviousImage,\n    getHasNextImage,\n    setImageParams,\n    setDatasetFilters,\n    executing,\n    isFetchingImages,\n    $reset,\n  };\n}\n","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Annotation Sets'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div v-if=\"annotationSets && annotationSets.length > 0\" class=\"filter-settings scrollbar\">\n        <div v-for=\"(set, i) in annotationSets\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`annotationSetFilter-set-${i}`\"\n            v-model=\"selectedSets\"\n            type=\"checkbox\"\n            :name=\"`${set.name}-${i}`\"\n            :value=\"set\"\n          >\n          <label :title=\"`${set.name}`\" :for=\"`set-${i}`\">{{ set.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        Please define an annotation set.\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"AnnotationSetFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n    invert: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedSets: [],\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedSets.length > 0;\n    },\n    tagValue() {\n      return this.selectedSets.length.toString();\n    },\n  },\n  watch: {\n    annotationSets: {\n      deep: true,\n      immediate: true,\n      handler() {\n        this.selectedSets = [];\n      },\n    },\n    modelValue(newVal) {\n      this.selectedSets = newVal;\n    },\n    selectedSets() {\n      this.updateFilters();\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedSets);\n    },\n    clearSelection() {\n      this.selectedSets = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  max-width: 300px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & label {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./AnnotationSetFilter.vue?vue&type=template&id=f73820d2&scoped=true\"\nimport script from \"./AnnotationSetFilter.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationSetFilter.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationSetFilter.vue?vue&type=style&index=0&id=f73820d2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f73820d2\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Images With Annotation Sets'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div v-if=\"annotationSets && annotationSets.length > 0\" class=\"filter-settings scrollbar\">\n        <div v-for=\"(set, i) in annotationSets\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`imagesWithAnnotationSetFilter-set-${i}`\"\n            v-model=\"selectedSets\"\n            type=\"checkbox\"\n            :name=\"`${set.name}-${i}`\"\n            :value=\"set\"\n          >\n          <label :title=\"`${set.name}`\" :for=\"`set-${i}`\">{{ set.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        Please define an annotation set.\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"ImagesWithAnnotationSetFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedSets: [],\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedSets.length > 0;\n    },\n    tagValue() {\n      return this.selectedSets.length.toString();\n    },\n  },\n  watch: {\n    annotationSets: {\n      deep: true,\n      immediate: true,\n      handler() {\n        this.selectedSets = [];\n      },\n    },\n    modelValue(newVal) {\n      this.selectedSets = newVal;\n    },\n    selectedSets() {\n      this.updateFilters();\n    },\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedSets);\n    },\n    clearSelection() {\n      this.selectedSets = [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  max-width: 300px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & label {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./ImagesWithAnnotationSetFilter.vue?vue&type=template&id=ec0a0726&scoped=true\"\nimport script from \"./ImagesWithAnnotationSetFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ImagesWithAnnotationSetFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ImagesWithAnnotationSetFilter.vue?vue&type=style&index=0&id=ec0a0726&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ec0a0726\"]])\n\nexport default __exports__","import { render } from \"./DatasetFilter.vue?vue&type=template&id=19f8a8c2&scoped=true\"\nimport script from \"./DatasetFilter.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetFilter.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetFilter.vue?vue&type=style&index=0&id=19f8a8c2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-19f8a8c2\"]])\n\nexport default __exports__","<template>\n  <div class=\"annotation-display-filter-button\">\n    <FilterPopper>\n      <template #default=\"{ menuOpen }\">\n        <button class=\"button sets-toggle-button\" :class=\"{'active': menuOpen || displayActive}\">\n          Display Annotation Sets\n          <SVGIcon\n            :mirrored=\"menuOpen\"\n            :iconName=\"'expand_more'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n        </button>\n      </template>\n      <template #popper>\n        <div class=\"filter-settings scrollbar\">\n          <template v-for=\"(set, index) in annotationSets\" :key=\"index\">\n            <label\n              :for=\"`menuItem-${uid}-${set.name}-${index}`\"\n              class=\"filter-settings__row filter-settings__row-button\"\n            >\n              <div class=\"filter-settings__row-button-check me-2\">\n                <SVGIcon\n                  v-if=\"menuValue.displayAnnotationSets.annotation_sets.includes(set.id)\"\n                  :iconName=\"'check'\"\n                  :height=\"'20px'\"\n                  :width=\"'20px'\"\n                />\n              </div>\n              <input\n                :id=\"`menuItem-${uid}-${set.name}-${index}`\"\n                v-model=\"menuValue.displayAnnotationSets.annotation_sets\"\n                type=\"checkbox\"\n                :value=\"set.id\"\n              >\n              <div class=\"filter-settings__row-button-legend\" :style=\"{ background: annotationSetColorMap[set.id] }\" />\n              <span>{{ set.name }}</span>\n            </label>\n          </template>\n        </div>\n      </template>\n    </FilterPopper>\n    <button\n      v-if=\"showSplitAnnotationOption && menuValue.displayAnnotationSets.annotation_sets.length > 0\"\n      class=\"sets-toggle-button\"\n      :class=\"{'active': splitActive}\"\n      title=\"Split Annotation Display\"\n      @click=\"handleSplitAnnotations\"\n    >\n      <SVGIcon\n        :iconName=\"'call_split'\"\n        :height=\"'20px'\"\n        :width=\"'20px'\"\n      />\n    </button>\n    <FilterPopper>\n      <button class=\"settings-toggle-button\" title=\"Annotation Display Settings\" @click.stop=\"\">\n        <SVGIcon\n          :iconName=\"'settings'\"\n          :width=\"24\"\n          :height=\"24\"\n        />\n      </button>\n      <template #popper>\n        <div class=\"filter-settings\">\n          <template v-for=\"(menuItem, index) in menuItems\" :key=\"index\">\n            <FilterPopper\n              :placement=\"'right-start'\"\n              :offset=\"[-4,0]\"\n              :trigger=\"'hover'\"\n            >\n              <button\n                class=\"filter-settings__row filter-settings__row-button\"\n                @mouseover=\"hoveredDisplayType = menuItem.key\"\n                @focusin=\"hoveredDisplayType = menuItem.key\"\n              >\n                <label :for=\"`menuItem-${menuItem.key}`\">{{ menuItem.label }}</label>\n                <SVGIcon\n                  class=\"filter-settings__row-button-chevron-right\"\n                  :iconName=\"'chevron_right'\"\n                  :height=\"'20px'\"\n                  :width=\"'20px'\"\n                />\n              </button>\n              <template #popper>\n                <div v-if=\"hoveredDisplayType === menuItem.key && menuValue[menuItem.key]\" class=\"filter-settings scrollbar\">\n                  <template v-for=\"(submenuItem, submenuIndex) in menuItem.submenu\" :key=\"submenuIndex\">\n                    <!-- Radio -->\n                    <label\n                      v-if=\"submenuItem.type === 'radio'\"\n                      :for=\"`menuItem-${uid}-${submenuItem.value}-${submenuIndex}`\"\n                      class=\"filter-settings__row filter-settings__row-button\"\n                    >\n                      <div class=\"filter-settings__row-button-check me-2\">\n                        <SVGIcon\n                          v-if=\"menuValue[menuItem.key][submenuItem.group] === submenuItem.value\"\n                          :iconName=\"'check'\"\n                          :height=\"'20px'\"\n                          :width=\"'20px'\"\n                        />\n                      </div>\n                      <input\n                        :id=\"`menuItem-${uid}-${submenuItem.value}-${submenuIndex}`\"\n                        v-model=\"menuValue[menuItem.key][submenuItem.group]\"\n                        type=\"radio\"\n                        :name=\"menuItem.key\"\n                        :value=\"submenuItem.value\"\n                      >\n                      <span>{{ submenuItem.label }}</span>\n                    </label>\n                    <!-- Checkbox -->\n                    <label\n                      v-else-if=\"submenuItem.type === 'checkbox'\"\n                      :for=\"`menuItem-${uid}-${submenuItem.value}-${submenuIndex}`\"\n                      class=\"filter-settings__row filter-settings__row-button\"\n                    >\n                      <div class=\"filter-settings__row-button-check me-2\">\n                        <SVGIcon\n                          v-if=\"menuValue[menuItem.key][submenuItem.group].includes(submenuItem.value)\"\n                          :iconName=\"'check'\"\n                          :height=\"'20px'\"\n                          :width=\"'20px'\"\n                        />\n                      </div>\n                      <input\n                        :id=\"`menuItem-${uid}-${submenuItem.value}-${submenuIndex}`\"\n                        v-model=\"menuValue[menuItem.key][submenuItem.group]\"\n                        type=\"checkbox\"\n                        :value=\"submenuItem.value\"\n                      >\n                      <div v-if=\"submenuItem.color\" class=\"filter-settings__row-button-legend\" :style=\"{ background: submenuItem.color }\" />\n                      <span>{{ submenuItem.label }}</span>\n                    </label>\n                  </template>\n                </div>\n              </template>\n            </FilterPopper>\n          </template>\n        </div>\n      </template>\n    </FilterPopper>\n  </div>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport { toRefs } from 'vue';\n\nlet uid = 0;\n\nexport default {\n  name: \"DisplayAnnotationsFilter\",\n  components: {\n    FilterPopper,\n    SVGIcon,\n  },\n  props: {\n    annotationSets: {\n      type: Array,\n      default: null,\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Object,\n      default: null,\n    },\n    showSplitAnnotationOption: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  setup(props) {\n    const { labels, annotationSets } = toRefs(props);\n    const { map: labelColorMap } = useAnnotationColorMap({ items: labels, key: 'index' });\n    const { map: annotationSetColorMap } = useAnnotationColorMap({ items: annotationSets, key: 'id' });\n    return {\n      labelColorMap,\n      annotationSetColorMap,\n    };\n  },\n  data() {\n    uid += 1;\n    return {\n      menuValue: {\n        displayAnnotationSets: {\n          annotation_sets: [],\n        },\n        displayLabels: {\n          labels: [],\n        },\n        colorAnnotationsBy: {\n          type: \"label\",\n        },\n        splitAnnotations: false,\n      },\n      hoveredDisplayType: null,\n      selectedAnnotationSets: [],\n      selectedAnnotationLabels: {},\n      uid: `DisplayAnnotationsFilter-${uid}`,\n    };\n  },\n  computed: {\n    labelMenuItems() {\n      if (this.labels.length > 0) {\n        return this.labels.map((label) => ({\n          key: label.index, value: label.index, label: label.name, type: 'checkbox', group: 'labels', default: true,\n        }));\n      }\n      return [];\n    },\n    menuItems() {\n      return [\n        {\n          key: 'displayLabels',\n          label: 'Labels to Display',\n          submenu: [...this.labelMenuItems],\n        },\n        {\n          key: 'colorAnnotationsBy',\n          label: 'Color Annotations By',\n          submenu: [\n            {\n              value: 'label', label: 'Label', type: 'radio', group: 'type', default: true,\n            },\n            {\n              value: 'set', label: 'Annotation Set', type: 'radio', group: 'type',\n            },\n          ],\n        },\n      ];\n    },\n    dataReady() {\n      if (this.annotationSets && this.labels) {\n        return true;\n      }\n      return false;\n    },\n    displayActive() {\n      return this.menuValue?.displayAnnotationSets?.annotation_sets?.length > 0;\n    },\n    splitActive() {\n      return this.menuValue?.splitAnnotations;\n    },\n  },\n  watch: {\n    dataReady: {\n      immediate: true,\n      handler(ready) {\n        if (ready) {\n          this.mapMenuItemValue(this.menuItems, this.menuValue);\n        }\n      },\n    },\n    menuValue: {\n      deep: true,\n      handler(menuValue) {\n        this.$emit('update:modelValue', menuValue);\n      },\n    },\n    labels() {\n      this.mapMenuItemValue(this.menuItems, this.menuValue);\n    },\n    annotationSets(newSets) {\n      this.menuValue.displayAnnotationSets.annotation_sets = this.menuValue?.displayAnnotationSets?.annotation_sets\n        .filter((existingSet) => newSets.includes(existingSet));\n    },\n    'menuValue.displayAnnotationSets.annotation_sets': {\n      handler(annotation_sets) {\n        if (Object.keys(annotation_sets).length === 0) {\n          this.menuValue.splitAnnotations = false;\n        }\n      },\n    },\n  },\n  mounted() {\n    this.$nextTick(() => {\n      if (this.modelValue) {\n        Object.keys(this.modelValue).forEach((key) => {\n          this.menuValue[key] = this.modelValue[key];\n        });\n      }\n      this.$emit('update:modelValue', this.menuValue);\n    });\n  },\n  methods: {\n    // TODO: Simplify this so all values are on first level of the result object (even if it is a submenu value)\n    mapMenuItemValue(menuItems, parentValue) {\n      menuItems.forEach((item) => {\n        if (item.submenu) {\n          parentValue[item.key] = {};\n          // Get unique groups\n          const groups = item.submenu.map((submenuItem) => ({ group: submenuItem.group, type: submenuItem.type })).reduce((unique, o) => {\n            if (!unique.some((obj) => obj.label === o.label && obj.value === o.value)) {\n              unique.push(o);\n            }\n            return unique;\n          }, []);\n          if (groups) {\n            groups.forEach((group) => {\n              if (group.type === 'radio') {\n                parentValue[item.key][group.group] = null;\n              }\n              if (group.type === 'checkbox') {\n                parentValue[item.key][group.group] = [];\n              }\n            });\n          }\n        } else if (item.default) {\n          if (item.group) {\n            if (item.type === 'radio') {\n              parentValue[item.group] = item.value;\n            }\n            if (item.type === 'checkbox') {\n              parentValue[item.group].push(item.value);\n            }\n          } else {\n            parentValue[item.key] = item.default;\n          }\n        }\n\n        if (item.submenu) {\n          this.mapMenuItemValue(item.submenu, parentValue[item.key]);\n        }\n      });\n    },\n    handleSplitAnnotations() {\n      this.menuValue.splitAnnotations = !this.menuValue.splitAnnotations;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  border-radius: inherit;\n  text-transform: none;\n  min-width: 100px;\n\n  &.scrollbar {\n    overflow: auto;\n  }\n\n  &__row {\n    display: flex;\n    align-items: center;\n    position: relative;\n    max-width: 500px;\n  }\n\n  &__row-button {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n    background: transparent;\n    border: none;\n    padding: 6px 8px;\n    cursor: pointer;\n\n    &:first-of-type {\n      border-top-left-radius: inherit;\n      border-top-right-radius: inherit;\n    }\n    &:last-of-type {\n      border-bottom-left-radius: inherit;\n      border-bottom-right-radius: inherit;\n    }\n\n    &:hover {\n      background: rgba(0,0,0,0.125);\n    }\n    &:focus-within {\n      background: rgba(0,0,0,0.125);\n    }\n\n    &> * {\n      pointer-events: none;\n    }\n\n    input {\n      -webkit-appearance: none;\n      -moz-appearance: none;\n      appearance: none;\n      opacity: 0;\n      margin: 0;\n    }\n\n    span, label {\n      font-size: 0.9rem;\n      font-weight: 500;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n  }\n\n  &__row-button-check {\n    width: 20px;\n    min-width: 20px;\n    height: 20px;\n    min-height: 20px;\n    @include themify() {\n      color: themed('filter-button-list-row-button-selected')\n    }\n  }\n\n  &__row-button-legend {\n    min-width: 10px;\n    min-height: 10px;\n    margin-right: 12px;\n    border-radius: 100%;\n  }\n\n  &__row-button-chevron-right {\n    margin-left: auto;\n    padding-left: 4px;\n  }\n}\n\n.sets-toggle-button, .settings-toggle-button {\n  background: white;\n\n}\n\n.annotation-display-filter-button {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 26px;\n  padding: 0;\n  box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n  @include themify() {\n    color: themed('body-text-color')\n  }\n}\n\n.sets-toggle-button {\n  display: flex;\n  align-items: center;\n  height: 100%;\n  flex: 1 1 auto;\n  padding: 4px 8px;\n  gap: 2px;\n  border-right: solid 1px rgba(0,0,0,0.5);\n  color: inherit;\n\n  &:hover {\n    box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.2) inset;\n    background: rgba(var(--color-primary-100-rgb), 0.5);\n  }\n\n  &:active {\n    opacity: 1;\n  }\n\n  &.active {\n    @include themify() {\n      box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.5) inset;\n      background: rgba(var(--color-primary-100-rgb), 0.8);\n    }\n  }\n}\n\n.settings-toggle-button {\n  display: flex;\n  align-items: center;\n  padding: 0 4px;\n  color: inherit;\n\n  &:active {\n    opacity: 1;\n  }\n}\n</style>\n","import { render } from \"./DisplayAnnotationsFilterV2.vue?vue&type=template&id=8ab1afda&scoped=true\"\nimport script from \"./DisplayAnnotationsFilterV2.vue?vue&type=script&lang=js\"\nexport * from \"./DisplayAnnotationsFilterV2.vue?vue&type=script&lang=js\"\n\nimport \"./DisplayAnnotationsFilterV2.vue?vue&type=style&index=0&id=8ab1afda&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-8ab1afda\"]])\n\nexport default __exports__","<template>\n  <div id=\"gallery-component-container\" class=\"gallery\">\n    <template v-if=\"!doneFetch\">\n      <slot name=\"overlay\" />\n    </template>\n    <div v-if=\"doneFetch && imageList && imageList.length == 0\" class=\"empty-state\">\n      <slot name=\"empty-state\" />\n    </div>\n    <template v-if=\"imageList && imageList.length > 0\">\n      <div v-if=\"showHeader\" class=\"gallery__header\">\n        <div class=\"gallery__header-row\">\n          <div class=\"header-slot _start\">\n            <slot name=\"header-first-row-start\" />\n          </div>\n          <div class=\"header-slot _end\">\n            <slot name=\"header-first-row-end\" />\n          </div>\n        </div>\n        <div class=\"gallery__header-row\">\n          <div class=\"header-slot _start\">\n            <slot name=\"header-second-row-start\" />\n          </div>\n          <div class=\"header-slot _end\">\n            <slot name=\"header-second-row-end\" />\n          </div>\n        </div>\n      </div>\n      <div\n        v-if=\"doneFetch\"\n        ref=\"gridContainer\"\n        class=\"gallery__grid-container\"\n        :style=\"gridContainerStyles\"\n      >\n        <div\n          v-if=\"!hasGridItemSlot\"\n          id=\"gallery\"\n          ref=\"gallery\"\n          class=\"gallery__grid scrollbar\"\n          @scroll=\"handleScroll\"\n        >\n          <GalleryGridItem\n            v-for=\"imageObj in imageList\"\n            :key=\"imageObj.id\"\n            :imageObj=\"imageObj\"\n            :annotationSets=\"annotationSets\"\n            @image-deleted=\"$emit('image-deleted')\"\n            @grid-item-clicked=\"handleImageClicked(imageObj)\"\n          />\n          <slot name=\"grid-item\" />\n        </div>\n        <div\n          v-else\n          id=\"gallery\"\n          ref=\"gallery\"\n          class=\"gallery__grid scrollbar\"\n          :style=\"gridItemStyles\"\n          @scroll=\"handleScroll\"\n        >\n          <slot name=\"grid-item\" />\n        </div>\n      </div>\n    </template>\n  </div>\n</template>\n\n<script>\n\nimport {\n  ref, computed,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport GalleryGridItem from './GalleryGridItem.vue';\n\nexport default {\n  name: 'GalleryGrid',\n  components: {\n    GalleryGridItem,\n  },\n  props: {\n    doneFetch: {\n      type: Boolean,\n      default: true,\n    },\n    imageList: {\n      type: Array,\n      default: () => [],\n    },\n    selectedImages: {\n      type: Array,\n      default: () => [],\n    },\n    totalImageCount: {\n      type: Number,\n      default: 0,\n    },\n    imagesPerPage: {\n      type: Number,\n      default: 40,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    gridItemScale: {\n      type: Number,\n      default: null,\n    },\n    minGridItemHeight: {\n      type: Number,\n      default: 250,\n    },\n    minGridItemWidth: {\n      type: Number,\n      default: 250,\n    },\n    showHeader: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: [\n    'update:page', 'update:totalPages', 'grid-item-clicked', 'image-deleted', 'scrolled-to-end', 'update:selectedImages',\n  ],\n  setup(_, { slots }) {\n    const hasGridItemSlot = computed(() => slots['grid-item'] && slots['grid-item']());\n    const gridContainer = ref(null);\n\n    return {\n      gridContainer,\n      hasGridItemSlot,\n    };\n  },\n  data() {\n    return {\n      scrollTop: 0,\n      imageOffset: -1,\n      imageLimit: 40,\n    };\n  },\n  computed: {\n    gridItemStyles() {\n      let style;\n      if (this.gridItemScale < 1) {\n        style = {\n          '--grid-item-width': `${this.minGridItemWidth + (this.gridItemScale * this.minGridItemWidth)}px`,\n          // '--grid-item-height': `${this.minGridItemHeight}px`,\n        };\n      }\n      if (this.gridItemScale === 1) {\n        style = {\n          '--grid-item-width': `100%`,\n          // '--grid-item-height': `100%`,\n        };\n      }\n      return style;\n    },\n    gridContainerStyles() {\n      if (this.gridItemScale === 1) {\n        return {\n          'justify-content': 'center',\n        };\n      }\n      return null;\n    },\n  },\n  watch: {\n    selectedImages: {\n      deep: true,\n      handler() {\n        if (this.selectedImages && this.selectedImages.length > 0) {\n          const selectedIDs = this.selectedImages.map((e) => e.id);\n          this.selectedItemsSet = new Set(selectedIDs);\n        } else {\n          this.selectedItemsSet = new Set([]);\n        }\n      },\n    },\n    // selectedItemsSet: {\n    //   handler() {\n    //     this.$emit('update:selectedImages', this.imageList.filter((e) => this.selectedItemsSet.has(e.id)).map((e) => e.id));\n    //   },\n    // },\n  },\n  created() {\n    this.dsConn = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n\n  methods: {\n    handleImageClicked(imageObj) {\n      this.$emit('grid-item-clicked', imageObj);\n    },\n  },\n};\n</script>\n\n<style>\n  #gallery-page-selector li button {\n    padding: 1px 6px;\n  }\n</style>\n\n<style lang=\"scss\" scoped>\n\n.gallery-image-count {\n  margin-left: 16px;\n  font-size: 0.75rem;\n  font-weight: 600;\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.gallery {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  overflow: hidden;\n  position: relative;\n\n  &__header {\n    display: flex;\n    flex-direction: column;\n  }\n\n  &__header-row {\n    display: flex;\n    margin: 20px 20px 0 20px;\n\n    .header-slot:first-of-type {\n      justify-content: flex-start;\n    }\n    .header-slot:not(:first-of-type) {\n      justify-content: flex-end;\n    }\n  }\n\n  &__grid-container {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    min-height: 0;\n  }\n\n  &__grid {\n    --grid-item-width: 250px;\n    // --grid-item-height: 250px;\n    display: grid;\n    grid-template-columns: repeat(auto-fill, var(--grid-item-width));\n    // grid-auto-rows: var(--grid-item-height);\n    grid-gap: 20px 20px;\n    // height: auto;\n    padding: 0 20px 15px 20px;\n    margin: 20px 0 20px 0;\n    overflow: auto;\n    transition: all 0.5s;\n  }\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.header-slot {\n  display:flex;\n\n  &._start {\n    justify-content: flex-start;\n    flex: 1 1 30%;\n  }\n\n  &._end {\n    justify-content: flex-end;\n    flex: 1 1 60%;\n  }\n}\n\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <div\n    :id=\"imageObj.id\"\n    class=\"grid-item-container\"\n    @click=\"handleImageClicked\"\n    @mouseover=\"mouseHover=true\"\n    @mouseleave=\"mouseHover=false\"\n  >\n    <div class=\"card-header\">\n      <h3 class=\"card-title\">{{ imageObj.name ? imageObj.name : \"-\" }}</h3>\n      <IconButton\n        v-if=\"mouseHover\"\n        class=\"delete-icon\"\n        :icon=\"'delete'\"\n        :width=\"36\"\n        :height=\"36\"\n        @click.stop=\"handleDeleteClicked\"\n      />\n    </div>\n    <div :class=\"['grid-item', {'failed': imageObj.status === 'failed'}, {'import preload': imageObj.status === 'loading'}]\">\n      <ImageCanvas\n        :imageSrc=\"imageSrc\"\n        :boxes=\"boxes\"\n      />\n    </div>\n    <div class=\"image-body\">\n      <div v-if=\"allLabelNames && allLabelNames.length > 0\" data-type=\"labels\" class=\"image-details-row\">\n        <div class=\"description\">Labels:&nbsp;</div>\n        <div class=\"labels\">\n          <template v-for=\"(label, i) in allLabelNames\" :key=\"label\">\n            <span v-if=\"i !== allLabelNames.length - 1\">{{ label }},&nbsp;</span>\n            <span v-else>{{ label }}</span>\n          </template>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport ImageCanvas from '@/components/ImageCanvas.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\nimport showError from '../../../assets/js/error-message';\n\nexport default {\n  name: 'GalleryGridItem',\n  components: {\n    ImageCanvas,\n    IconButton,\n  },\n  props: {\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: [\n    'image-clicked', 'image-deleted',\n  ],\n  data() {\n    return {\n      dsConn: null,\n      datastoreURL: null,\n      mouseHover: false,\n      renderedImageDimensions: {\n        width: 0,\n        height: 0,\n        top: 0,\n        left: 0,\n        bottom: 0,\n        right: 0,\n      },\n    };\n  },\n  computed: {\n    imageSrc() {\n      if (!this.imageObj.id) {\n        return '';\n      }\n      return `v3/enterprise/image/${this.imageObj.id}`;\n    },\n    allLabelIDs() {\n      if (this.imageObj.annotations) {\n        return [...new Set(this.imageObj.annotations.map((anno) => anno.label))].sort((a, b) => a - b);\n      }\n      return [];\n    },\n    allLabelNames() {\n      if (this.allLabelIDs.length > 0 && this.labels.length > 0) {\n        return this.allLabelIDs.map((id) => this.labels[id].name);\n      }\n      return this.allLabelIDs;\n    },\n    boxes() {\n      if (this.imageObj.annotations) {\n        return this.imageObj.annotations.map((anno) => {\n          let originX = 0;\n          let originY = 0;\n          const annoTask = this.annotationSets.find((task) => task.id === anno.annotation_set_id);\n          if (annoTask) {\n            if (annoTask.origin_x) {\n              originX = annoTask.origin_x;\n            }\n            if (annoTask.origin_y) {\n              originY = annoTask.origin_y;\n            }\n          }\n          return { ...anno, originX, originY };\n        });\n      }\n      return [];\n    },\n  },\n  created() {\n    const protocol = window.location.protocol;\n    const host = window.location.host.split(':')[0];\n    this.datastoreURL = `${protocol}//${host}:10912`;\n    // this.datastoreURL = 'http://ubuntuqa.office.au-zone.com:10912';\n    this.dsConn = new DatastoreConnect(this.datastoreURL);\n    this.enterpriseServerUrl = this.$store.state.enterpriseServerUrl;\n  },\n  methods: {\n    showError,\n    handleImageLoadError() {\n      const img = this.$refs.gridItemImg;\n      // Retry in 500 ms if image loading errors\n      console.log('Loading gallery image failed. Retrying...');\n      setTimeout(() => {\n        img.src = this.imageSrc;\n      }, 500);\n    },\n    handleImageClicked() {\n      this.$emit('image-clicked', this.imageObj);\n    },\n    handleDeleteClicked() {\n      window.api.invoke('confirm', {\n        type: 'question',\n        buttons: ['Yes', 'Cancel'],\n        detail: 'Are you sure you want to remove this image from the current project?',\n      })\n        .then((result) => {\n          if (result === 0) {\n            this.deleteImage(this.imageObj.id);\n          }\n        })\n        .catch((err) => {\n          console.log(err);\n        });\n    },\n    handleInfoClicked() {\n      this.dsConn.getImageObject(this.imageObj.id)\n        .then((data) => {\n          window.api.send('confirm', {\n            buttons: ['OK'],\n            detail: `Image ID: ${data.id}\\nImage Group: ${data.group}\\nImage Height: ${data.height} px\\nImage Width: ${data.width} px\\nImage Type: ${data.mime}`,\n          });\n        })\n        .catch((err) => showError('Failed to shuffle dataset:', err));\n    },\n    deleteImage(imageID) {\n      // Remove image from cache\n      const datastoreURL = sessionStorage.getItem('datastore');\n      const img_url = `${datastoreURL}/v1/images/${imageID}`;\n      const img_url_orig = `${img_url}?original=1`;\n      URL.revokeObjectURL(img_url);\n      URL.revokeObjectURL(img_url_orig);\n\n      this.dsConn.deleteImage(imageID)\n        .then(() => {\n          this.$emit('image-deleted');\n        })\n        .catch((error) => {\n          showError('Failed to delete image:', error);\n        });\n    },\n    drawBox(annotation) {\n      if (this.imageSrc) {\n        const canvas = this.$refs.gridItemCanvas;\n        const ctx = canvas.getContext(\"2d\");\n\n        // Box dimensions\n        const x = Math.round(annotation.x * canvas.width);\n        const y = Math.round(annotation.y * canvas.height);\n        const width = Math.round(annotation.w * canvas.width);\n        const height = Math.round(annotation.h * canvas.height);\n\n        // Set Box styling\n        const boxLineWidth = 4;\n        ctx.lineWidth = boxLineWidth;\n        ctx.strokeStyle = \"#EFC15F\";\n\n        // Draw the bounding box\n        ctx.beginPath();\n        ctx.rect(x, y, width, height);\n        ctx.stroke();\n\n        // Draw the label\n        // if (result.label || (result.id && result.time)) {\n        //   ctx.font = \"24px Arial\";\n        //   let currentWidth = 0;\n        //   if (result.label) {\n        //     currentWidth += drawLabelText(ctx, result, x, y, boxLineWidth);\n        //   }\n        //   if (result.score) {\n        //     currentWidth += drawLabelScore(ctx, result, x + currentWidth, y, boxLineWidth);\n        //   }\n        // }\n      }\n    },\n    drawBoundingBoxes() {\n      const canvas = this.$refs.gridItemCanvas;\n      const img = this.$refs.gridItemImg;\n      const v = this.getRenderedSize(img.width, img.height, img.naturalWidth, img.naturalHeight);\n      canvas.style.width = `${img.width}px`;\n      canvas.style.height = `${img.height}px`;\n      canvas.width = v[0];\n      canvas.height = v[1];\n      const context = canvas.getContext('2d');\n      context.drawImage(img, 0, 0, v[0], v[1]);\n      if (this.imageObj.annotations && this.imageObj.annotations.length !== 0) {\n        this.imageObj.annotations.forEach((a) => {\n          context.beginPath();\n          const xRatio = a.x / this.imageObj.width;\n          const yRatio = a.y / this.imageObj.height;\n          const widthRatio = a.w / this.imageObj.width;\n          const heightRatio = a.h / this.imageObj.height;\n          context.rect(\n            v[0] * xRatio,\n            v[1] * yRatio,\n            v[0] * widthRatio,\n            v[1] * heightRatio,\n          );\n          context.strokeStyle = \"blue\";\n          context.stroke();\n        });\n      }\n      img.remove();\n    },\n    // Get dimensions of the rendered display image\n    // This is not equal to the element dimensions when using 'object-fit: contain'\n    getRenderedImageDimensions(image) {\n      const {\n        width, height, naturalWidth, naturalHeight,\n      } = image;\n      const naturalRatio = naturalWidth / naturalHeight;\n      const elementRatio = width / height;\n      const [renderedWidth, renderedHeight] = naturalRatio >= elementRatio ? [width, width / naturalRatio] : [height * naturalRatio, height];\n\n      return {\n        width: Math.round(renderedWidth),\n        height: Math.round(renderedHeight),\n        top: Math.round((height - renderedHeight) / 2),\n        left: Math.round((width - renderedWidth) / 2),\n        bottom: Math.round(((height - renderedHeight) / 2) + height),\n        right: Math.round(((width - renderedWidth) / 2) + width),\n      };\n    },\n    handleImageLoad(e) {\n      const canvas = this.$refs.gridItemCanvas;\n      const image = this.$refs.gridItemImg;\n      if (canvas && image) {\n        this.renderedImageDimensions = this.getRenderedImageDimensions(e.target);\n        canvas.style.left = `${this.renderedImageDimensions.left}px`;\n        canvas.style.top = `${this.renderedImageDimensions.top}px`;\n        canvas.style.width = `${this.renderedImageDimensions.width}px`;\n        canvas.style.height = `${this.renderedImageDimensions.height}px`;\n      }\n\n      this.imageObj.annotations.forEach((anno) => {\n        this.drawBox(anno);\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.grid-item-container {\n  user-select: none;\n  -moz-user-select: none;\n  -khtml-user-select: none;\n  -webkit-user-select: none;\n  -o-user-select: none;\n\n  position: relative;\n  border-radius: 8px;\n  cursor: pointer;\n  box-shadow: 0 2px 5px 0 rgb(0 0 0 / 40%);\n  margin: 1px;\n  transition: transform .4s ease;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('text-color');\n  }\n}\n\n.grid-item {\n  position: relative;\n  cursor: pointer;\n  width: inherit;\n  height: 150px;\n  margin: 0 10px;\n  @include themify() {\n    background: themed('image-background-fill');\n  }\n}\n\n.grid-item-container:hover {\n  @include themify() {\n    outline: 1px solid themed('card-list-hover-outline');\n  }\n}\n\n.preload:before {\n  content: \"Imported\";\n  text-transform: uppercase;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  position: absolute;\n  top: 10px;\n  left: 10px;\n  right: 10px;\n  bottom: 10px;\n  border: 1px dashed var(--v-primary-base);\n  color: var(--v-primary-base);\n}\n\n.import:before {\n  content: \"Queued\";\n  text-transform: uppercase;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  position: absolute;\n  top: 10px;\n  left: 10px;\n  right: 10px;\n  bottom: 10px;\n  border: 1px dashed var(--v-secondary-base);\n  color: var(--v-secondaryText-base);\n}\n\n.failed:before {\n  content: \"Failed\";\n  text-transform: uppercase;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  position: absolute;\n  top: 10px;\n  left: 10px;\n  right: 10px;\n  bottom: 10px;\n  border: 1px dashed var(--v-error-base);\n  color: var(--v-secondaryText-base);\n}\n\n.delete-icon {\n  position: absolute;\n  top: 10px;\n  right: 10px;\n  z-index: 10;\n  background: white;\n  border: 6px solid white;\n  border-radius: 100%;\n  box-shadow: 0 0px 5px 0 rgb(0 0 0 / 38%);\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.delete-icon:hover {\n  border: 5px solid transparent;\n  border-radius: 100%;\n}\n\n.image-body {\n  height: fit-content;\n  margin: 10px;\n  font-size: 14px;\n  text-align: left;\n}\n\n.card-header {\n  border-bottom: none;\n  padding: 10px 10px 4px 10px;\n}\n.card-title {\n  font-size: 0.75rem;\n  margin: 0px;\n}\n\n.image-details-row {\n  display: flex;\n  align-items: center;\n}\n\n.image-details-row  + .image-details-row {\n  margin-top: 3px;\n}\n\n.description {\n  font-weight: bold;\n  margin: 1px 1px 1px 0;\n  min-width: 50px;\n}\n\n.value {\n  max-width: 100px;\n  margin: 1px 1px 1px 5px;\n}\n\n.multi-row {\n  display: block;\n}\n</style>\n","let timeofLastErrorMessage = 0;\n\nfunction showError(title, message) {\n  const timeNow = Date.now();\n  const msSinceLastMessage = timeNow - timeofLastErrorMessage;\n  if (msSinceLastMessage > 500) { // 500ms between error messages\n    timeofLastErrorMessage = timeNow;\n    console.log(`${title} ${message}`);\n  }\n}\n\nexport default showError;\n","import { render } from \"./GalleryGridItem.vue?vue&type=template&id=7b733e85&scoped=true\"\nimport script from \"./GalleryGridItem.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryGridItem.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryGridItem.vue?vue&type=style&index=0&id=7b733e85&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7b733e85\"]])\n\nexport default __exports__","import { render } from \"./GalleryGrid.vue?vue&type=template&id=4dfa33e0&scoped=true\"\nimport script from \"./GalleryGrid.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryGrid.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryGrid.vue?vue&type=style&index=0&id=4dfa33e0&lang=css\"\nimport \"./GalleryGrid.vue?vue&type=style&index=1&id=4dfa33e0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4dfa33e0\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <template v-if=\"splitAnnotations\">\n    <div class=\"grid-group-label\"><label>{{ imageObj.name }}</label></div>\n    <template v-for=\"(annotation, index) in filteredAnnotations\" :key=\"index\">\n      <BaseGalleryGridItem\n        :imageObj=\"imageObj\"\n        :annotations=\"annotation\"\n        :annotationSets=\"annotationSets\"\n        :annotationDisplayType=\"annotationDisplayType\"\n        :filterAnnotationsBySets=\"filterAnnotationsBySets\"\n        :filterAnnotationsByLabelIndexes=\"filterAnnotationsByLabelIndexes\"\n        :crop=\"annotation\"\n        :cropPadding=\"0.05\"\n        class=\"image-review-status-grid-item\"\n        :class=\"{'_unselectable': !canSelectImage()}\"\n        :imageQuality=\"'image'\"\n        :fetchPriority=\"'low'\"\n        @click=\"handleImageClicked\"\n        @mouseover=\"mouseHover=true\"\n        @mouseleave=\"mouseHover=false\"\n      >\n        <template #header>\n          <div v-if=\"imageReviewStatus?.status !== 'Pending'\" class=\"gallery-card-header\">\n            <IconButton\n              v-if=\"mouseHover\"\n              class=\"delete-icon\"\n              :icon=\"'delete'\"\n              :width=\"36\"\n              :height=\"36\"\n              @click.stop=\"handleDeleteClicked\"\n            />\n          </div>\n        </template>\n        <template #content>\n          <div\n            v-if=\"imageReviewStatus\"\n            class=\"overlay\"\n            :class=\"`_${imageReviewStatus?.status}`\"\n            :style=\"{ '--reviewer': `'${imageReviewStatus?.username}'` }\"\n          />\n          <GalleryGridItemLabelTags\n            :labels=\"labels\"\n            :annotationList=\"annotation\"\n          />\n        </template>\n      </BaseGalleryGridItem>\n    </template>\n    <div class=\"grid-group-fill\" />\n  </template>\n  <template v-else>\n    <BaseGalleryGridItem\n      :imageObj=\"imageObj\"\n      :annotations=\"filteredAnnotations\"\n      :annotationSets=\"annotationSets\"\n      :annotationDisplayType=\"annotationDisplayType\"\n      :filterAnnotationsBySets=\"filterAnnotationsBySets\"\n      :filterAnnotationsByLabelIndexes=\"filterAnnotationsByLabelIndexes\"\n      class=\"image-review-status-grid-item\"\n      :class=\"{'_unselectable': !canSelectImage()}\"\n      @click=\"handleImageClicked\"\n      @mouseover=\"mouseHover=true\"\n      @mouseleave=\"mouseHover=false\"\n    >\n      <template #header>\n        <div v-if=\"imageReviewStatus?.status !== 'Pending'\" class=\"gallery-card-header\">\n          <IconButton\n            v-if=\"mouseHover\"\n            class=\"delete-icon\"\n            :icon=\"'delete'\"\n            :width=\"36\"\n            :height=\"36\"\n            @click.stop=\"handleDeleteClicked\"\n          />\n        </div>\n      </template>\n      <template #content>\n        <div\n          v-if=\"imageReviewStatus\"\n          class=\"overlay\"\n          :class=\"`_${imageReviewStatus?.status}`\"\n          :style=\"{ '--reviewer': `'${imageReviewStatus?.username}'` }\"\n        />\n        <GalleryGridItemLabelTags\n          :labels=\"labels\"\n          :annotationList=\"filteredAnnotations\"\n        />\n      </template>\n    </BaseGalleryGridItem>\n  </template>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport BaseGalleryGridItem from '@/components/DatasetComponent/BaseGalleryGridItem.vue';\nimport GalleryGridItemLabelTags from '@/components/DatasetComponent/GalleryComponent/GalleryGridItemLabelTags.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'AnnotationEditorGalleryGridItem',\n  components: {\n    BaseGalleryGridItem,\n    GalleryGridItemLabelTags,\n    IconButton,\n  },\n  props: {\n    title: {\n      type: String,\n      default: '',\n    },\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    annotations: {\n      type: Array,\n      default: () => [],\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    annotationDisplayType: {\n      type: String,\n      default: 'set',\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    filterAnnotationsBySets: {\n      type: Array,\n      default: null,\n    },\n    filterAnnotationsByLabelIndexes: {\n      type: Array,\n      default: null,\n    },\n    imageReviewStatus: {\n      type: Object,\n      default: null,\n    },\n    reviewSettings: {\n      type: Object,\n      default: null,\n    },\n    splitAnnotations: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'grid-item-clicked', 'delete-image-from-dataset',\n  ],\n  data() {\n    return {\n      dsConn: null,\n      datastoreURL: null,\n      mouseHover: false,\n      renderedImageDimensions: {\n        width: 0,\n        height: 0,\n        top: 0,\n        left: 0,\n        bottom: 0,\n        right: 0,\n      },\n    };\n  },\n  computed: {\n    filteredAnnotations() {\n      if (this.annotations?.length > 0) {\n        // Create boxes for the annotations to be displayed\n        let filteredAnnotationList = this.annotations;\n        if (this.filterAnnotationsBySets?.length >= 0) {\n          filteredAnnotationList = filteredAnnotationList.filter((anno) => this.filterAnnotationsBySets.includes(anno.annotation_set_id));\n        }\n        if (this.filterAnnotationsByLabelIndexes?.length >= 0) {\n          filteredAnnotationList = filteredAnnotationList.filter((anno) => this.filterAnnotationsByLabelIndexes.includes(anno.label_index));\n        }\n        return filteredAnnotationList;\n      }\n      return [];\n    },\n  },\n  created() {\n    this.enterpriseServerUrl = this.$store.state.enterpriseServerUrl;\n    this.dsConn = new DatastoreConnect(this.enterpriseServerUrl);\n  },\n  methods: {\n    handleImageClicked() {\n      this.$emit('grid-item-clicked', this.imageObj);\n    },\n    handleDeleteClicked() {\n      this.$emit('delete-image-from-dataset', this.imageObj);\n    },\n    canSelectImage() {\n      if (!this.imageReviewStatus || this.reviewSettings.reviewSession.reviewer === this.imageReviewStatus.username) {\n        return true;\n      }\n      return false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.delete-icon {\n  position: absolute;\n  top: 10px;\n  right: 10px;\n  z-index: 10;\n  background: white;\n  border: 6px solid white;\n  border-radius: 100%;\n  box-shadow: 0 0px 5px 0 rgb(0 0 0 / 38%);\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.delete-icon:hover {\n  border: 5px solid transparent;\n  border-radius: 100%;\n}\n\n.overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: 6px;\n  z-index: 3;\n\n  &._Pending {\n    background: rgba(var(--color-primary-rgb), 0.25);\n    border: 2px solid var(--color-primary);\n    &::after {\n      background-color: var(--color-primary);\n      color: var(--primary-text-color);\n    }\n  }\n\n  &._Done {\n    background: rgba(var(--color-success-rgb), 0.25);\n    border: 2px solid var(--color-success);\n    &::after {\n      background-color: var(--color-success);\n      color: var(--primary-text-color);\n    }\n  }\n\n  &::after {\n    content: var(--reviewer);\n    font-weight: 600;\n    padding: 5px 10px;\n    position: absolute;\n    top: -10px;\n    left: 50%;\n    transform: translateX(-50%);\n    border-radius: 5px;\n  }\n}\n\n.image-review-status-grid-item {\n  &._unselectable {\n    outline: none !important;\n    cursor: not-allowed;\n  }\n}\n\n.grid-group-fill {\n  grid-column-end: -1;\n}\n\n.grid-group-label {\n  display: flex;\n  grid-column-start: 1;\n  grid-column-end: -1;\n  height: 40px;\n  position: relative;\n\n  label {\n    position: absolute;\n    bottom: 0;\n    transform: translate(0, 25%);\n    font-weight: 700;\n  }\n}\n</style>\n","<template>\n  <div\n    v-if=\"(allLabelNames && allLabelNames.length > 0) || showName || showTags\"\n    class=\"details\"\n    :title=\"imgName ? imgName : 'Unknown'\"\n    @click.stop\n  >\n    <div v-if=\"showName\" data-type=\"labels\" class=\"details__row\">\n      <div class=\"details__name\">\n        <p class=\"details__name-content\">{{ imgName ? imgName : \"Unknown\" }}</p>\n        <p v-if=\"imgName && uuid\" class=\"\">{{ uuid }}</p>\n      </div>\n    </div>\n    <div v-if=\"allLabelNames && allLabelNames.length > 0\" data-type=\"labels\" class=\"details__row mt-2\">\n      <div class=\"details__description\">Labels&nbsp;</div>\n      <div class=\"details__tags\">\n        <template v-for=\"label in allLabelNames\" :key=\"label\">\n          <span class=\"id-tag\" :style=\"tagColor(label.index)\">{{ label.name }}</span>\n        </template>\n      </div>\n    </div>\n    <div v-if=\"showTags\" data-type=\"tags\" class=\"details__row mt-2\">\n      <div class=\"details__description\">Tags&nbsp;</div>\n      <div v-if=\"allTagNames && allTagNames.length > 0\" class=\"details__tags\">\n        <v-chip-group column>\n          <v-chip\n            v-for=\"tag in allTagNames.sort()\"\n            :key=\"tag\"\n            variant=\"outlined\"\n            density=\"compact\"\n            closable\n            close-icon=\"mdi-close\"\n            :ripple=\"false\"\n            :link=\"false\"\n            @click:close.prevent=\"removeTagsForImages(tag)\"\n          >\n            {{ tag }}\n          </v-chip>\n        </v-chip-group>\n        <!-- <template v-for=\"tag in allTagNames\" :key=\"tag\">\n          <span class=\"id-tag\">{{ tag }}</span>\n        </template> -->\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport { toRefs } from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'GalleryGridItemLabelTags',\n  props: {\n    tags: {\n      type: Array,\n      default: () => [],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    annotationList: {\n      type: [Array, Object],\n      default: () => [],\n    },\n    imageId: {\n      type: Number,\n      default: null,\n    },\n    imgName: {\n      type: String,\n      default: \"\",\n    },\n    showName: {\n      type: Boolean,\n      default: false,\n    },\n    showTags: {\n      type: Boolean,\n      default: false,\n    },\n    uuid: {\n      type: String,\n      default: \"\",\n    },\n  },\n  setup(props) {\n    const { labels } = toRefs(props);\n    const { map: labelColorMap } = useAnnotationColorMap({ items: labels, key: 'index' });\n    return {\n      labelColorMap,\n    };\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(),\n    };\n  },\n  computed: {\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n    allLabelIndexes() {\n      let annotationsArray;\n      if (Array.isArray(this.annotationList)) {\n        annotationsArray = this.annotationList;\n      } else if (typeof this.annotationList === 'object') {\n        // Convert object to array if it's not already\n        annotationsArray = [this.annotationList];\n      } else {\n        annotationsArray = [];\n      }\n\n      if (annotationsArray) {\n        return [...new Set(annotationsArray.map((anno) => anno.label_index))].sort((a, b) => a - b);\n      }\n      return [];\n    },\n    allLabelNames() {\n      if (this.allLabelIndexes.length > 0) {\n        return this.allLabelIndexes.map((index) => {\n          const lbl = this.labels.find((label) => label.index === index);\n          if (lbl) {\n            return lbl;\n          } else {\n            // use the index as name\n            return {\n              index,\n              name: index.toString(),\n            };\n          }\n        });\n      }\n      return this.allLabelIndexes;\n    },\n    allTagNames() {\n      if (this.tags && this.tags.length > 0) {\n        return this.tags.map((e) => {\n          if (typeof e === \"string\") {\n            return e;\n          } else if (typeof e === \"object\") {\n            return e.name;\n          }\n          return e;\n        });\n      }\n      return [];\n    },\n  },\n  methods: {\n    tagColor(index) {\n      const color = this.labelColorMap[index];\n      return {\n        borderColor: color,\n        background: `hsla(${color},70%,50%,0.75)`,\n      };\n    },\n    getHue(color) {\n      const r = parseInt(color.substring(0, 2), 16) / 255;\n      const g = parseInt(color.substring(2, 4), 16) / 255;\n      const b = parseInt(color.substring(4, 6), 16) / 255;\n      let hue;\n      if ((r >= g) && (g >= b)) {\n        hue = (60 * (g - b)) / (r - b);\n      } else if ((g > r) && (r >= b)) {\n        hue = 60 * (2 - (r - b) / (g - b));\n      }\n      return hue;\n    },\n    async removeTagsForImages(tag_name) {\n      await this.dataConnect.removeTagForImages({\n        dataset_id: this.currentDataset.id,\n        image_ids: [this.imageId],\n        tag_names: [tag_name],\n      })\n        .then((resp) => {\n          if (resp.error) {\n            throw resp.error;\n          }\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.details {\n  flex: 1 1 auto;\n  height: fit-content;\n  padding: 10px;\n  font-size: 14px;\n  text-align: left;\n  border-top: 1px solid rgba(0,0,0,0.1);\n  border-bottom-left-radius: inherit;\n  border-bottom-right-radius: inherit;\n  cursor: default;\n  user-select: initial;\n  @include themify() {\n    background: themed('image-details-background-fill');\n  }\n\n  &__row {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n  }\n\n  &__row + .tags__row {\n    margin-top: 3px;\n  }\n\n  &__description {\n    font-size: 0.75rem;\n    font-weight: bold;\n    padding-right: 12px;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  &__tags {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    gap: 6px;\n    @include themify() {\n      color: themed('color-black');\n    }\n  }\n\n  &__name {\n    display: flex;\n    flex-direction: column;\n    position: relative;\n    width: 100%;\n    line-height: 1.2rem;\n    border-radius: 4px;\n  }\n  &__name-content {\n    display: -webkit-box;\n    width: 100%;\n    font-size: 12px;\n    font-weight: 700;\n    margin: 0;\n    -webkit-line-clamp: 2;\n    line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    line-break: anywhere;\n  }\n}\n\n.id-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 4px 6px;\n  line-height: 1;\n  font-size: 0.625rem;\n  font-weight: 700;\n  border: 2px solid;\n  box-shadow: 0px 0px 1px rgb(0 0 0 / 25%), 0px 1px 4px rgb(0 0 0 / 25%);\n  @include themify() {\n    color: themed('color-black');\n  }\n}\n\n:deep(.v-chip-group) {\n  padding: 0;\n}\n\n:deep(.v-chip__close) {\n  display: none;\n}\n\n:deep(.v-chip) {\n  margin: 0 8px 4px 0;\n\n  &:hover {\n    .v-chip__close {\n      max-height: 14px !important;\n      max-width: 14px !important;\n      font-size: 14px !important;\n      margin-inline-start: 4px !important;\n      margin-inline-end: -2px !important;\n      display: flex;\n    }\n  }\n}\n\n:deep(.v-chip--variant-outlined) {\n  border: 2px solid;\n  @include themify() {\n    color: themed('color-black');\n  }\n}\n\n:deep(.v-chip.v-chip--size-default) {\n  padding: 4px 6px;\n}\n\n:deep(.v-chip__content) {\n  font-size: 0.625rem;\n  font-weight: 700;\n}\n</style>\n","import { render } from \"./GalleryGridItemLabelTags.vue?vue&type=template&id=36b8e01a&scoped=true\"\nimport script from \"./GalleryGridItemLabelTags.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryGridItemLabelTags.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryGridItemLabelTags.vue?vue&type=style&index=0&id=36b8e01a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-36b8e01a\"]])\n\nexport default __exports__","import { render } from \"./AnnotationEditorGalleryGridItem.vue?vue&type=template&id=44e1b162&scoped=true\"\nimport script from \"./AnnotationEditorGalleryGridItem.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationEditorGalleryGridItem.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationEditorGalleryGridItem.vue?vue&type=style&index=0&id=44e1b162&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-44e1b162\"]])\n\nexport default __exports__","<template>\n  <div class=\"empty-state\">\n    <svg width=\"100%\" height=\"500px\">\n      <use href=\"@/assets/img/empty_dataset.svg#empty_dataset\" />\n    </svg>\n    <SVGIcon\n      class=\"empty-state__cloud-upload-icon\"\n      :iconName=\"'cloud_upload'\"\n      :width=\"'100%'\"\n      :height=\"'200px'\"\n    />\n    <div class=\"empty-state__message\">\n      <h3>No images found.</h3>\n      <p>Drag and drop images into the gallery or <button class=\"button-link\" @click=\"handleImportClicked\"><strong>IMPORT</strong></button> to get started.</p>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'GalleryEmptyState',\n  components: {\n    SVGIcon,\n  },\n  props: {\n  },\n  emits: ['import-clicked'],\n  created() {\n    this.dsConn = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    handleImportClicked() {\n      this.$emit('import-clicked');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: fit-content;\n  margin: auto;\n\n  & svg {\n    @include themify() {\n      fill: themed('color-primary');\n    }\n  }\n\n  &__cloud-upload-icon {\n    position: absolute;\n    top: 22%;\n  }\n\n  &__message {\n    text-align: center;\n    position: absolute;\n    top: 60%;\n    @include themify() {\n      color: themed('body-text-color');\n    }\n\n    h2 {\n      margin-bottom: 12px;\n    }\n\n    p {\n      margin: 0;\n    }\n  }\n}\n\n</style>\n","import { render } from \"./GalleryEmptyState.vue?vue&type=template&id=f7d9eaaa&scoped=true\"\nimport script from \"./GalleryEmptyState.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryEmptyState.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryEmptyState.vue?vue&type=style&index=0&id=f7d9eaaa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f7d9eaaa\"]])\n\nexport default __exports__","<template>\n  <div class=\"annotation-display-filter-button\">\n    <FilterPopper>\n      <template #default=\"{ menuOpen }\">\n        <button class=\"button sets-toggle-button\" :class=\"{'active': menuOpen}\">\n          Sort By\n          <SVGIcon\n            :mirrored=\"menuOpen\"\n            :iconName=\"'expand_more'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n        </button>\n      </template>\n      <template #popper>\n        <div class=\"sort-settings scrollbar\">\n          <template v-for=\"sort, idx in sortTypes\" :key=\"idx\">\n            <label\n              :for=\"`menuItem-${sort.value}`\"\n              class=\"sort-settings__row sort-settings__row-button\"\n              @click=\"() => selectedSort = sort.value\"\n            >\n              <div class=\"sort-settings__row-button-check me-2\">\n                <SVGIcon\n                  v-if=\"selectedSort===sort.value\"\n                  :iconName=\"'check'\"\n                  :height=\"'20px'\"\n                  :width=\"'20px'\"\n                />\n              </div>\n              <span>{{ sort.name }}</span>\n            </label>\n          </template>\n        </div>\n      </template>\n    </FilterPopper>\n    <FilterPopper\n      :placement=\"'right-start'\"\n      :offset=\"[-4,0]\"\n    >\n      <button class=\"settings-toggle-button\" title=\"List By\" @click.stop=\"listAscend = !listAscend\">\n        <SVGIcon\n          :iconName=\"'arrow_upward'\"\n          :width=\"18\"\n          :height=\"24\"\n          :class=\"{_invert: !listAscend}\"\n        />\n      </button>\n    </FilterPopper>\n  </div>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: \"GalleryImageSort\",\n  components: {\n    FilterPopper,\n    SVGIcon,\n  },\n  props: {\n    sortBy: {\n      type: String,\n      default: 'id',\n    },\n    ascend: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: [\n    'update:sortBy',\n    'update:ascend',\n  ],\n  data() {\n    return {\n      sortTypes: [{\n        name: 'Image ID',\n        value: 'id',\n      }, {\n        name: 'Filename',\n        value: 'name',\n      }, {\n        name: 'Date Taken',\n        value: 'date',\n      }],\n      listAscend: false,\n      selectedSort: 'id',\n    };\n  },\n  watch: {\n    selectedSort() {\n      this.$emit('update:sortBy', this.selectedSort);\n    },\n    listAscend() {\n      this.$emit('update:ascend', this.listAscend);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.sets-toggle-button, .settings-toggle-button {\n  background: white;\n\n}\n\n.sort-settings {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  border-radius: inherit;\n  text-transform: none;\n  min-width: 100px;\n\n  &.scrollbar {\n    overflow: auto;\n  }\n\n  &__row {\n    display: flex;\n    align-items: center;\n    position: relative;\n    max-width: 500px;\n  }\n\n  &__row-button {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n    background: transparent;\n    border: none;\n    padding: 6px 8px;\n    cursor: pointer;\n\n    &:first-of-type {\n      border-top-left-radius: inherit;\n      border-top-right-radius: inherit;\n    }\n    &:last-of-type {\n      border-bottom-left-radius: inherit;\n      border-bottom-right-radius: inherit;\n    }\n\n    &:hover {\n      background: rgba(0,0,0,0.125);\n    }\n    &:focus-within {\n      background: rgba(0,0,0,0.125);\n    }\n\n    &> * {\n      pointer-events: none;\n    }\n\n    input {\n      -webkit-appearance: none;\n      -moz-appearance: none;\n      appearance: none;\n      opacity: 0;\n      margin: 0;\n    }\n\n    span, label {\n      font-size: 0.9rem;\n      font-weight: 500;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n  }\n\n  &__row-button-check {\n    width: 20px;\n    min-width: 20px;\n    height: 20px;\n    min-height: 20px;\n    @include themify() {\n      color: themed('filter-button-list-row-button-selected')\n    }\n  }\n\n  &__row-button-legend {\n    min-width: 10px;\n    min-height: 10px;\n    margin-right: 12px;\n    border-radius: 100%;\n  }\n\n  &__row-button-chevron-right {\n    margin-left: auto;\n    padding-left: 4px;\n  }\n}\n\n.annotation-display-filter-button {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 26px;\n  padding: 0;\n  box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n  @include themify() {\n    color: themed('body-text-color')\n  }\n}\n\n.sets-toggle-button {\n  display: flex;\n  align-items: center;\n  height: 100%;\n  flex: 1 1 auto;\n  padding: 4px 8px;\n  gap: 2px;\n  border-right: solid 1px rgba(0,0,0,0.5);\n  color: inherit;\n\n  &:hover {\n    box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.2) inset;\n    background: rgba(var(--color-primary-100-rgb), 0.5);\n  }\n\n  &:active {\n    opacity: 1;\n  }\n\n  &.active {\n    @include themify() {\n      box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.5) inset;\n      background: rgba(var(--color-primary-100-rgb), 0.8);\n    }\n  }\n}\n\n.settings-toggle-button {\n  display: flex;\n  align-items: center;\n  padding: 0 4px;\n  color: inherit;\n\n  &:active {\n    opacity: 1;\n  }\n}\n\n._invert {\n    transform: rotate(180deg);\n  }\n</style>\n","import { render } from \"./GalleryImageSort.vue?vue&type=template&id=5394c00c&scoped=true\"\nimport script from \"./GalleryImageSort.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryImageSort.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryImageSort.vue?vue&type=style&index=0&id=5394c00c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5394c00c\"]])\n\nexport default __exports__","import { render } from \"./AnnotationEditorGallery.vue?vue&type=template&id=7241e944&scoped=true\"\nimport script from \"./AnnotationEditorGallery.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationEditorGallery.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationEditorGallery.vue?vue&type=style&index=0&id=7241e944&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7241e944\"]])\n\nexport default __exports__","import { render } from \"./AnnotationEditorHistoryDrawer.vue?vue&type=template&id=6343fc27&scoped=true\"\nimport script from \"./AnnotationEditorHistoryDrawer.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationEditorHistoryDrawer.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationEditorHistoryDrawer.vue?vue&type=style&index=0&id=6343fc27&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6343fc27\"]])\n\nexport default __exports__","<template>\n  <div\n    id=\"annotation-editor-container\"\n    ref=\"annotationReviewContainer\"\n    tabindex=\"-1\"\n  >\n    <v-layout\n      :full-height=\"true\"\n      class=\"flex-column\"\n    >\n      <div\n        ref=\"annotationReview\"\n        class=\"annotation-editor\"\n      >\n        <div class=\"annotation-editor__details\">\n          <div class=\"annotation-editor__sidebar annotation-editor__image-details\">\n            <h3 class=\"annotation-editor__sidebar-heading\">Image Details</h3>\n            <ImageDetails\n              v-if=\"displayImage\"\n              :imageObj=\"displayImage\"\n              :options=\"imageDetailSettings\"\n              :sourceDataset=\"sourceDataset\"\n              @image-group-changed=\"handleImageGroupChanged\"\n            />\n          </div>\n          <div class=\"annotation-editor__sidebar  annotation-editor__annotation-details\">\n            <h3 class=\"annotation-editor__sidebar-heading\">Annotation Details</h3>\n            <div class=\"annotation-editor__annotation-details-inner\">\n              <AnnotationReviewAnnotationDetails v-if=\"annotation\" :annotationObj=\"annotation\" />\n            </div>\n            <template v-if=\"annotationCount > 0\">\n              <div v-if=\"!isFetchingNewImage && imageLoadedOnCanvas\" class=\"annotation-editor__annotation-progress\">\n                <p>Annotation {{ activeAnnotationIndex + 1 }} / {{ annotationCount }}</p>\n                <div class=\"annotation-editor__annotation-nodes\">\n                  <div\n                    v-for=\"(anno, index) in annotations\"\n                    :key=\"index\"\n                    :class=\"{_verified: anno.reviewStatus === 'verified', _rejected: anno.reviewStatus === 'rejected', _active: index === activeAnnotationIndex}\"\n                  >\n                    <div />\n                  </div>\n                </div>\n              </div>\n              <div v-else class=\"annotation-editor__annotation-progress p-0\">\n                <v-skeleton-loader\n                  type=\"sentences\"\n                  theme=\"primary\"\n                  color=\"transparent\"\n                  :height=\"80\"\n                />\n              </div>\n            </template>\n          </div>\n        </div>\n        <div class=\"annotation-editor__content\">\n          <div class=\"annotation-editor__image\" :class=\"{_verified: annotation?.reviewStatus === 'verified', _rejected: annotation?.reviewStatus === 'rejected'}\">\n            <div class=\"annotation-editor__image-header\">\n              <div class=\"card-header\">\n                <h3 class=\"card-header__title\">\n                  <BaseMenu\n                    :placement=\"'left-start'\"\n                    :appendToBody=\"true\"\n                    @closed=\"show_menu = false\"\n                  >\n                    <button>{{ annotationTitle }}</button>\n                    <template #menu=\"{closeMenu}\">\n                      <ul class=\"label-menu scrollbar\">\n                        <li v-for=\"(label, i) in labels\" :key=\"i\">\n                          <BaseMenuButton @click=\"handleLabelChanged(label), closeMenu()\">\n                            <span>{{ label.name }}</span>\n                          </BaseMenuButton>\n                        </li>\n                      </ul>\n                    </template>\n                  </BaseMenu>\n                </h3>\n                <SVGIcon\n                  v-if=\"annotation?.reviewStatus === 'verified'\"\n                  class=\"review-status-icon verified-icon _verified\"\n                  :iconName=\"verifiedIcon\"\n                  :width=\"20\"\n                  :height=\"20\"\n                />\n                <SVGIcon\n                  v-if=\"annotation?.reviewStatus === 'rejected'\"\n                  class=\"review-status-icon rejected-icon _rejected\"\n                  :iconName=\"rejectedIcon\"\n                  :width=\"20\"\n                  :height=\"20\"\n                />\n              </div>\n            </div>\n            <div class=\"annotation-editor__image-canvas\">\n              <AnnotationCanvas\n                v-if=\"displayImage\"\n                ref=\"annotationCanvas\"\n                :annotations=\"canvasAnnotationArray\"\n                :imageObj=\"displayImage\"\n                :labels=\"labels\"\n                :editingEnabled=\"true\"\n                :shouldZoomToFit=\"false\"\n                :enableSAM=\"false\"\n                :isAuditMode=\"isAuditMode\"\n                @image-loaded=\"imageLoadedOnCanvas = true\"\n              />\n              <div v-else class=\"no-image-remaining\"><span>No Images Remaining</span></div>\n              <v-skeleton-loader\n                v-if=\"isFetchingNewImage || !imageLoadedOnCanvas\"\n                type=\"image\"\n                class=\"image-loading\"\n              />\n            </div>\n          </div>\n          <div class=\"annotation-editor__controls\">\n            <v-btn class=\"key-button\" density=\"comfortable\" @click=\"handleEnter\">\n              <div class=\"key\">ENTER</div>\n              <span>Accept</span>\n            </v-btn>\n            <v-btn class=\"key-button\" density=\"comfortable\" @click=\"handleSpace\">\n              <div class=\"key\">SPACE</div>\n              <span>Reject</span>\n            </v-btn>\n            <v-btn class=\"key-button\" density=\"comfortable\" @click=\"handleLeftArrow\">\n              <div class=\"key\">&#8592;</div>\n              <span>Previous</span>\n            </v-btn>\n            <v-btn class=\"key-button\" density=\"comfortable\" @click=\"handleRightArrow\">\n              <div class=\"key\">&#8594;</div>\n              <span>Next</span>\n            </v-btn>\n            <v-btn class=\"key-button\" density=\"comfortable\" @click=\"handleShiftRightArrow\">\n              <div class=\"key\">SHIFT</div>\n              <div class=\"key ms-1\">&#8594;</div>\n              <span>NEXT IMAGE</span>\n            </v-btn>\n            <v-btn class=\"key-button\" density=\"comfortable\" @click=\"handleDelete\">\n              <div class=\"key\">DELETE</div>\n              <span>DELETE IMAGE</span>\n            </v-btn>\n            <v-btn\n              v-if=\"zoomedIn\"\n              class=\"key-button\"\n              density=\"comfortable\"\n              @click=\"handleZKey\"\n            >\n              <div class=\"key\">Z</div>\n              <span>ZOOM OUT</span>\n            </v-btn>\n            <v-btn\n              v-else\n              class=\"key-button\"\n              density=\"comfortable\"\n              @click=\"handleZKey\"\n            >\n              <div class=\"key\">Z</div>\n              <span>ZOOM IN</span>\n            </v-btn>\n          </div>\n        </div>\n        <div class=\"annotation-editor__sidebar annotation-editor__sidebar-hotkeys\">\n          <h3 class=\"annotation-editor__sidebar-heading\">Label Hotkeys</h3>\n          <div class=\"annotation-editor__sidebar-hotkeys-inner _scroll scrollbar\">\n            <ul class=\"annotation-editor__label-hotkeys\">\n              <li v-for=\"label in labels\" :key=\"label.index\" @click=\"handleLabelListClick(label)\">\n                <span>{{ label.name }}</span>\n                <div>\n                  <div v-for=\"(key, index) in getLabelKeyArray(label)\" :key=\"index\" class=\"key\">{{ key }}</div>\n                </div>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <AnnotationEditorHistoryDrawer\n        v-if=\"reviewSettings !== null && reviewSettings !== undefined\"\n        :reviewSettings=\"reviewSettings\"\n        :active=\"true\"\n        :images=\"doneImages\"\n        :currentImage=\"currentTaskImage\"\n        :pendingImages=\"pendingImages\"\n        :activeIndex=\"activeImageIndex\"\n        :component=\"'footer'\"\n        :height=\"56\"\n        @image-clicked=\"handleTaskImageClicked\"\n      />\n    </v-layout>\n  </div>\n</template>\n\n<script>\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport AnnotationEditorHistoryDrawer from '@/components/DatasetComponent/AnnotationTool/AnnotationEditorHistoryDrawer.vue';\nimport ImageDetails from '@/components/DatasetComponent/AnnotationTool/ImageDetails.vue';\nimport AnnotationReviewAnnotationDetails from '@/components/DatasetComponent/AnnotationTool/AnnotationReviewAnnotationDetails.vue';\nimport { useKeyModifier } from '@vueuse/core';\nimport AnnotationCanvas from '@/components/DatasetComponent/AnnotationTool/AnnotationCanvas.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\n\nexport default {\n  name: 'AnnotationReview',\n  components: {\n    BaseMenu,\n    BaseMenuButton,\n    SVGIcon,\n    AnnotationEditorHistoryDrawer,\n    ImageDetails,\n    AnnotationReviewAnnotationDetails,\n    AnnotationCanvas,\n  },\n  props: {\n    reviewSettings: {\n      type: Object,\n      default: null,\n    },\n    activeImageIndex: {\n      type: Number,\n      default: -1,\n    },\n    currentTaskImage: {\n      type: Object,\n      default: () => {},\n    },\n    pendingImages: {\n      type: Array,\n      default: () => [],\n    },\n    annotations: {\n      type: Array,\n      default: () => [],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    originX: {\n      type: Number,\n      default: 0,\n    },\n    originY: {\n      type: Number,\n      default: 0,\n    },\n    enableAnnotationNavigation: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: [\n    'image-clicked',\n  ],\n  setup() {\n    const shiftState = useKeyModifier('Shift');\n\n    const {\n      internalImageObj,\n      isFetchingNewImage,\n      sourceDataset,\n      skipTaskImage,\n      deleteTaskImageFromDataset,\n      handleImageGroupChanged,\n      updateTaskImages,\n      switchToNextTaskImage,\n      getTaskDoneImagesByUser,\n      handleAuditSubmitAcceptedAnnotations,\n      switchToPreviousTaskImage,\n      doneImages,\n      isAuditMode,\n    } = useTasks();\n\n    return {\n      internalImageObj,\n      isFetchingNewImage,\n      shiftState,\n      sourceDataset,\n      skipTaskImage,\n      deleteTaskImageFromDataset,\n      handleImageGroupChanged,\n      updateTaskImages,\n      switchToNextTaskImage,\n      getTaskDoneImagesByUser,\n      handleAuditSubmitAcceptedAnnotations,\n      switchToPreviousTaskImage,\n      doneImages,\n      isAuditMode,\n    };\n  },\n  data() {\n    return {\n      title: 'Annotation Review',\n      activeAnnotationIndex: 0,\n      keysPressedWhileShiftHeld: [],\n      imageLoadedOnCanvas: false,\n      dataConnect: new DatastoreConnect(),\n      zoomedIn: true,\n    };\n  },\n  computed: {\n    displayImage() {\n      return this.isFetchingNewImage ? {} : this.internalImageObj;\n    },\n    imageCrop() {\n      if (this.annotation) {\n        return {\n          x: this.annotation.x - (this.originX * this.annotation.w),\n          y: this.annotation.y - (this.originY * this.annotation.h),\n          w: this.annotation.w,\n          h: this.annotation.h,\n        };\n      }\n      return null;\n    },\n    annotation() {\n      if (this.annotations.length && this.activeAnnotationIndex >= 0 && !this.isFetchingNewImage && this.imageLoadedOnCanvas) {\n        return this.annotations[this.activeAnnotationIndex];\n      }\n      return null;\n    },\n    canvasAnnotationArray() {\n      if (this.annotation && this.imageLoadedOnCanvas) {\n        return [this.annotation];\n      }\n      return [];\n    },\n    verifiedIcon() {\n      if (this.annotation?.reviewStatus === 'verified') {\n        return 'verified';\n      }\n      return 'done_outline';\n    },\n    rejectedIcon() {\n      if (this.annotation?.reviewStatus === 'rejected') {\n        return 'dangerous';\n      }\n      return 'dangerous_outlined';\n    },\n    hasPreviousAnnotation() {\n      if (this.activeAnnotationIndex > 0) {\n        return true;\n      } else if (this.activeAnnotationIndex === 0 && this.doneImages.length > 0) {\n        return true;\n      }\n      return this.activeAnnotationIndex > 0;\n    },\n    hasNextAnnotation() {\n      return this.activeAnnotationIndex < this.annotations.length - 1;\n    },\n    annotationTitle() {\n      if (this.annotation) {\n        let title = '';\n        let label = this.annotation.label_index;\n        let score = this.annotation.score;\n        if (this.labels.length > 0) {\n          label = this.labels[this.annotation.label_index]?.name;\n        }\n        title = label;\n        if (this.annotation.score != null) {\n          score = this.annotation.score;\n          title = `${title} [${score.toPrecision(2)}]`;\n        }\n        return title;\n      }\n      return '';\n    },\n    annotationCount() {\n      return this.annotations.length;\n    },\n    reviewedAnnotationCount() {\n      return this.annotations.filter((anno) => anno.reviewStatus).length;\n    },\n    verifiedAnnotationCount() {\n      return this.annotations.filter((anno) => anno.reviewStatus === 'verified').length;\n    },\n    hotkeyLabelMap() {\n      return Object.fromEntries(\n        Object\n          .entries(this.labelHotkeyMap)\n          .map(([key, value]) => [value, key]),\n      );\n    },\n    imageDetailSettings() {\n      return {\n        showName: true,\n        showDate: true,\n        showFileLocation: false,\n        showExternalURL: false,\n        showImageLocation: this.displayImage.latitude !== 0 && this.displayImage.longitude !== 0,\n        showCameraSource: Boolean(this.displayImage.source),\n      };\n    },\n    labelHotkeyMap() {\n      const labelHotkeyMap = {};\n      this.labels.forEach((label) => {\n        if (label.index < 9) {\n          labelHotkeyMap[label.index] = (label.index + 1).toString().split('').join('_');\n        } else {\n          labelHotkeyMap[label.index] = `SHIFT_${(label.index + 1 - 10).toString().split('').join('_')}`;\n        }\n      });\n      return labelHotkeyMap;\n    },\n  },\n  watch: {\n    internalImageObj() {\n      this.imageLoadedOnCanvas = false;\n      if (this.activeAnnotationIndex === -1) {\n        this.activeAnnotationIndex = this.internalImageObj.annotations.length - 1;\n      } else {\n        this.activeAnnotationIndex = 0;\n      }\n    },\n    shiftState(pressed) {\n      if (!pressed) {\n        this.handleLabelHotkey(`SHIFT_${this.keysPressedWhileShiftHeld.join('_')}`);\n        this.keysPressedWhileShiftHeld = [];\n      }\n    },\n    annotation() {\n      if (this.imageLoadedOnCanvas && this.annotation) {\n        if (this.zoomedIn) {\n          this.$nextTick(() => {\n            this.$refs.annotationCanvas.zoomToBox({\n              x1: this.annotation.x,\n              x2: this.annotation.x + this.annotation.w,\n              y1: this.annotation.y,\n              y2: this.annotation.y + this.annotation.h,\n            });\n          });\n        } else {\n          this.$refs.annotationCanvas.zoomToFitImage();\n        }\n      } else if (this.imageLoadedOnCanvas && !this.annotation) {\n        this.$refs.annotationCanvas.zoomToFitImage();\n      }\n    },\n    imageLoadedOnCanvas(isLoaded) {\n      if (isLoaded && !this.annotation) {\n        this.$refs.annotationCanvas.zoomToFitImage();\n      }\n    },\n  },\n  async mounted() {\n    window.addEventListener('keyup', this.handleKeyup);\n\n    await this.$nextTick();\n    await this.$nextTick();\n    document.querySelector('#annotation-editor-container').focus();\n  },\n  beforeUnmount() {\n    window.removeEventListener('keyup', this.handleKeyup);\n  },\n  methods: {\n    handleLeftArrow() {\n      if (this.isFetchingNewImage) return;\n\n      this.getPreviousAnnotation();\n    },\n    handleRightArrow() {\n      if (this.isFetchingNewImage) return;\n\n      if (this.shiftState) {\n        this.handleShiftRightArrow();\n      } else {\n        this.getNextAnnotation();\n      }\n    },\n    handleShiftRightArrow() {\n      if (this.isFetchingNewImage) return;\n\n      this.isFetchingNewImage = true;\n      this.skipTaskImage()\n        .catch((error) => {\n          console.error(error);\n          // TODO: handle error\n        });\n      this.isFetchingNewImage = false;\n    },\n    handleEnter() {\n      if (this.isFetchingNewImage) return;\n\n      if (this.annotation) {\n        this.annotation.reviewStatus = 'verified';\n      }\n      this.getNextAnnotation();\n    },\n    handleSpace() {\n      if (this.isFetchingNewImage) return;\n\n      if (this.annotation) {\n        this.annotation.reviewStatus = 'rejected';\n      }\n      this.getNextAnnotation();\n    },\n    async handleDelete() {\n      if (this.isFetchingNewImage) return;\n\n      this.isFetchingNewImage = true;\n      await this.deleteTaskImageFromDataset(this.internalImageObj?.id)\n        .catch((error) => {\n          console.error(error);\n          // TODO: handle error\n        });\n      this.isFetchingNewImage = false;\n    },\n    handleZKey() {\n      if (this.isFetchingNewImage) return;\n\n      if (this.zoomedIn) {\n        this.zoomedIn = false;\n        this.$refs.annotationCanvas.zoomToFitImage();\n      } else {\n        this.zoomedIn = true;\n        this.$refs.annotationCanvas.zoomToBox({\n          x1: this.annotation.x,\n          x2: this.annotation.x + this.annotation.w,\n          y1: this.annotation.y,\n          y2: this.annotation.y + this.annotation.h,\n        });\n      }\n    },\n    getNextAnnotation() {\n      if (this.reviewedAnnotationCount === this.annotationCount && this.activeImageIndex === -1 && this.activeAnnotationIndex === this.annotations.length - 1) {\n        this.getNewImage();\n        return;\n      } else if (this.reviewedAnnotationCount === this.annotationCount && this.activeAnnotationIndex === this.annotations.length - 1) {\n        this.getNextImage();\n        return;\n      }\n\n      if (this.activeAnnotationIndex < this.annotations.length - 1) {\n        this.activeAnnotationIndex += 1;\n      } else {\n        this.activeAnnotationIndex = 0;\n      }\n    },\n    getPreviousAnnotation() {\n      if (this.activeAnnotationIndex > 0) {\n        this.activeAnnotationIndex -= 1;\n      } else if (this.activeAnnotationIndex === 0) {\n        this.getPreviousImage();\n        // Set to -1 so it can be set to the last annotation when the next image loads\n        this.activeAnnotationIndex = -1;\n      } else {\n        this.getPreviousImage();\n        // Set to -1 so it can be set to the last annotation when the next image loads\n        this.activeAnnotationIndex = -1;\n      }\n    },\n    async getNextImage() {\n      // TODO reset boolean if fetch error\n      this.isFetchingNewImage = true;\n      await this.handleAuditSubmitAcceptedAnnotations(this.initialEditingAnnotations);\n      if (!this.doneImageOpen) {\n        await this.updateTaskImages();\n      } else {\n        this.switchToNextTaskImage();\n        await this.getTaskDoneImagesByUser()\n          .then((doneImages) => {\n            this.doneImages = doneImages;\n          });\n      }\n      this.isFetchingNewImage = false;\n    },\n    getPreviousImage() {\n    // TODO reset boolean if fetch error\n      this.isFetchingNewImage = true;\n      this.switchToPreviousTaskImage();\n      this.isFetchingNewImage = false;\n    },\n    async getNewImage() {\n      // TODO reset boolean if fetch error\n      this.isFetchingNewImage = true;\n      await this.handleAuditSubmitAcceptedAnnotations(this.initialEditingAnnotations);\n      this.isFetchingNewImage = false;\n    },\n    getLabelKeyArray(label) {\n      const hotkey = this.labelHotkeyMap[(label.index).toString()];\n      if (hotkey) {\n        return hotkey.split('_');\n      }\n      return [];\n    },\n    getLabelKeys(label) {\n      const keys = [];\n      if (label.index < 9) {\n        keys.push(label.index + 1);\n      } else {\n        keys.push(0);\n        if (label.index) {\n          keys.push(...(label.index - 8).toString().split(''));\n        }\n      }\n      return keys;\n    },\n    handleKeyup(e) {\n      if (this.isFetchingNewImage) return;\n\n      switch (e.key) {\n      case 'ArrowRight':\n        e.stopPropagation();\n        this.handleRightArrow();\n        break;\n      case 'ArrowLeft':\n        e.stopPropagation();\n        this.handleLeftArrow();\n        break;\n      case 'Enter':\n        e.stopPropagation();\n        this.handleEnter();\n        break;\n      case ' ':\n        e.stopPropagation();\n        this.handleSpace();\n        break;\n      case 'Delete':\n        e.stopPropagation();\n        this.handleDelete();\n        break;\n      case 'z':\n      case 'Z':\n        e.stopPropagation();\n        this.handleZKey();\n        break;\n      default:\n        if (this.shiftState && ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'].includes(String.fromCharCode(e.keyCode))) {\n          this.keysPressedWhileShiftHeld.push(String.fromCharCode(e.keyCode));\n        } else if (['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'].includes(e.key)) {\n          this.handleLabelHotkey(e.key);\n        }\n      }\n    },\n    handleLabelHotkey(hotkey) {\n      if (this.hotkeyLabelMap[hotkey]) {\n        const selectedLabel = this.labels.find((l) => l.index.toString() === this.hotkeyLabelMap[hotkey]);\n        this.annotation.label_index = selectedLabel.index;\n        this.annotation.label_id = selectedLabel.id;\n        this.annotation.label_name = selectedLabel.name;\n        this.annotation.reviewStatus = 'verified';\n        this.getNextAnnotation();\n      }\n    },\n    handleTaskImageClicked(imageIndex) {\n      this.isFetchingNewImage = true;\n      this.activeAnnotationIndex = 0;\n      this.$emit('image-clicked', imageIndex);\n      this.$refs.annotationReviewContainer.focus();\n      this.isFetchingNewImage = false;\n    },\n    handleLabelChanged(label) {\n      this.annotation.label_index = label.index;\n      this.annotation.label_id = label.id;\n      this.annotation.label_name = label.name;\n    },\n    handleLabelListClick(label) {\n      this.annotation.label_index = label.index;\n      this.annotation.label_id = label.id;\n      this.annotation.label_name = label.name;\n      this.annotation.reviewStatus = 'verified';\n      this.getNextAnnotation();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n#annotation-editor-container {\n  height: 100%;\n  width: 100%;\n\n  &:focus {\n    outline: none;\n  }\n}\n\n.annotation-editor {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  padding: 24px;\n  gap: 24px;\n  width: 100%;\n  height: inherit;\n  overflow: hidden;\n  background: var(--color-white-700);\n\n  &__sidebar {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 25%;\n    border-radius: 6px;\n    min-width: 150px;\n    // padding: 16px;\n    text-align: left;\n    background: var(--color-white-100);\n    box-shadow: 1px 2px 6px 1px rgba(0, 0, 0, 0.125), 0 0 1px 1px rgba(0, 0, 0, 0.125);\n    overflow: hidden;\n\n    &._scroll {\n      overflow: auto;\n    }\n  }\n\n  &__sidebar-heading {\n    padding-left: 16px;\n    color: var(--color-primary);\n    font-size: 0.875rem;\n    font-weight: 600;\n    letter-spacing: 0.05em;\n    text-transform: uppercase;\n    margin-bottom: 6px;\n  }\n\n  &__sidebar-hotkeys {\n    padding: 16px 0;\n    max-width: 260px;\n    flex: 0 0 auto;\n  }\n\n  &__sidebar-hotkeys-inner {\n    padding: 0 16px;\n    &._scroll {\n      overflow: auto;\n    }\n  }\n\n  &__details {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    max-width: min-content;\n    gap: 24px;\n  }\n\n  &__image-details {\n    flex: 0 0 min-content;\n    padding: 16px 0;\n  }\n\n  &__annotation-details {\n    flex: 1 1 100%;\n    padding: 16px 0 0;\n  }\n\n  &__annotation-details-inner {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    overflow: hidden;\n  }\n\n  &__annotation-progress {\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n    padding: 16px;\n    background: var(--color-primary-400);\n    color: var(--primary-text-color);\n    font-weight: 500;\n  }\n\n  &__annotation-nodes {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 4px;\n\n    > div {\n      display: flex;\n      width: 20px;\n      height: 20px;\n      align-items: center;\n      justify-content: center;\n\n      div {\n        width: 12px;\n        height: 12px;\n        border-radius: 50%;\n        border: 2px solid var(--color-accent);\n        background: transparent;\n      }\n    }\n\n    div._active {\n      background: rgba(var(--color-white-rgb),0.125);\n      border: 1px solid rgba(var(--color-white-rgb), 0.5);\n    }\n    div._verified {\n      div {\n        background: var(--color-success);\n        border: none;\n      }\n    }\n    div._rejected {\n      div {\n        background: var(--color-danger);\n        border: none;\n      }\n    }\n  }\n\n  &__content {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    min-width: 1px;\n  }\n\n  &__image {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    width: 100%;\n    min-height: 0;\n    box-shadow: 1px 2px 6px 1px rgba(0, 0, 0, 0.125), 0 0 1px 1px rgba(0, 0, 0, 0.125);\n    border-radius: 6px;\n    overflow: hidden;\n  }\n\n  &__image-header {\n    width: 100%;\n    height: 48px;\n    border-radius: 6px;\n  }\n\n  &__image-canvas {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    border-top: 1px solid rgba(0, 0, 0, 0.125);\n    min-height: 0;\n  }\n\n  &__controls {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: center;\n    padding: 24px 0 0 0;\n    gap: 8px;\n    font-weight: 500;\n    font-size: 1rem;\n    user-select: none;\n\n    & > div {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n  }\n\n  &__label-hotkeys {\n    list-style: none;\n\n    li {\n      display: flex;\n      justify-content: space-between;\n      padding: 3px 4px;\n\n      span {\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        overflow: hidden;\n        margin-right: 6px;\n      }\n\n      div:first-of-type {\n        display: flex;\n        gap: 6px;\n      }\n    }\n\n    li:hover {\n      padding: 2px 3px;\n      border: 1px solid var(--color-primary);\n      border-radius: 6px;\n      background: rgba(0,0,0,0.0625);\n      cursor: pointer;\n    }\n  }\n}\n\n.header {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  align-items: center;\n  justify-content: flex-end;\n  padding: 0 20px;\n}\n\n.card-header {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  align-items: center;\n  min-height: 42px;\n  border-bottom: none;\n  padding: 10px 10px 10px 10px;\n  gap: 4px;\n  z-index: 2;\n\n  &__title {\n    margin: 0;\n    margin-right: 8px;\n    font-size: 1.25rem;\n    width: 100%;\n\n    button {\n      font-size: inherit;\n      background: transparent;\n      border: none;\n      width: 100%;\n      cursor: pointer;\n\n      @include themify() {\n        box-shadow: 0 0 5px themed('icon-hover-color-primary'), 0 0 1px rgb(0 0 0 / 60%);\n      }\n\n      &:hover {\n        @include themify() {\n          box-shadow: 0 0 8px 3px themed('icon-hover-color-primary'), 0 0 0 1px themed('color-primary');\n        }\n      }\n    }\n  }\n}\n\n.key {\n  box-sizing: border-box;\n  padding: 4px;\n  line-height: 1;\n  font-size: 12px;\n  text-align: center;\n  width: fit-content;\n  color: #555;\n  border-color: var(--gray-400);\n  border-style: solid;\n  text-shadow: 0 0.5px 1px #777, 0 2px 6px #f2f2f2;\n  border-width: 1px;\n  border-radius: 4px;\n  background: -webkit-linear-gradient(top, #f9f9f9 0%, #D2D2D2 80%, #c0c0c0 100%);\n  font-family: sans-serif;\n  display: inline-block;\n  transition: box-shadow 0.3s ease, transform 0.15s ease;\n}\n\n.key-button {\n  padding: 0 8px;\n\n  span {\n    margin-left: 4px;\n  }\n}\n\n.label-menu {\n  min-width: 100px;\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n\n.review-status-icon {\n  color: var(--)\n}\n\n._rejected {\n  &.verified-icon {\n    color: rgba(white, 0.375);\n  }\n  &.rejected-icon {\n    color: darkred;\n  }\n  :deep(.grid-item-container) {\n    background: rgba(var(--color-danger-rgb), 0.90) !important;\n  }\n}\n._verified {\n  &.verified-icon {\n    color: var(--color-primary);\n  }\n  &.rejected-icon {\n    color: rgba(white, 0.375);\n  }\n  :deep(.grid-item-container) {\n    background: rgba(var(--color-primary-rgb), 0.5) !important;\n  }\n}\n\n:deep(.grid-item-container) {\n  flex: 1 1 auto;\n  z-index: 2;\n}\n\n:deep(.v-skeleton-loader.image-loading) {\n  position: absolute;\n  height: 100%;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  opacity: 0.75;\n  z-index: 2;\n  .v-skeleton-loader__image {\n    height: 100%;\n  }\n}\n\n:deep(.v-skeleton-loader > *) {\n  height: 100%;\n  display: flex;\n}\n\n:deep(.image-details__list) {\n  gap: 16px;\n}\n\n.no-image-remaining {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  height: 100%;\n  font-size: 1.5rem;\n  font-weight: 600;\n  color: var(--color-primary);\n}\n\n</style>\n","<template>\n  <div class=\"image-details\">\n    <ul class=\"image-details__list scrollbar\">\n      <li class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'hashtag'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n        </div>\n        <div class=\"image-details__list-item-details\">\n          <span :title=\"`${ imageObj.id }`\">{{ imageObj.id }}</span>\n        </div>\n      </li>\n      <li v-if=\"options.showName\" class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'image'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n        </div>\n        <div class=\"image-details__list-item-details\">\n          <span :title=\"`${ imageObj.name }`\">{{ imageObj.name }}</span>\n          <div class=\"image-details__list-item-sub-details\">\n            <span :title=\"`${ imageObj.width }w x ${ imageObj.height }h`\">{{ imageObj.width }}w x {{ imageObj.height }}h</span>\n          </div>\n        </div>\n      </li>\n      <li v-if=\"options.showDate\" class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'event'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n        </div>\n        <div class=\"image-details__list-item-details\">\n          <span :title=\"(new Date(imageObj.date)).toUTCString()\">{{ (new Date(imageObj.date)).toUTCString() }}</span>\n        </div>\n      </li>\n      <li v-if=\"options.showFileLocation\" class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'folder'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n        </div>\n        <div class=\"image-details__list-item-details\">\n          <span>File Location</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"imageObj.url\">{{ imageObj.url }}</span>\n          </div>\n          <!-- <span v-if=\"options.showExternalURL\">External URL</span>\n          <div v-if=\"options.showExternalURL\" class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span v-if=\"imageObj.ext_url\" :title=\"imageObj.ext_url\">{{ imageObj.ext_url }}</span>\n            <span v-else><i>No External URL</i></span>\n          </div> -->\n        </div>\n      </li>\n      <li v-if=\"options.showImageLocation\" class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'place'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n        </div>\n        <div class=\"image-details__list-item-details\">\n          <span>Image Location</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"`${ imageObj.latitude }, ${ imageObj.longitude }`\">{{ imageObj.latitude }}, {{ imageObj.longitude }}</span>\n          </div>\n        </div>\n      </li>\n      <li v-if=\"options.showCameraSource\" class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'photo_camera'\"\n            :width=\"20\"\n            :height=\"20\"\n          />\n        </div>\n        <div class=\"image-details__list-item-details\">\n          <span>Camera</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span v-if=\"imageObj.source\" :title=\"imageObj.source\">{{ imageObj.source }}</span>\n            <span v-else><i>Unknown Device</i></span>\n          </div>\n        </div>\n      </li>\n      <li v-if=\"groups.length > 0\" class=\"image-details__list-item\">\n        <div class=\"image-group\">\n          <label class=\"image-group__label\">Group</label>\n          <ImageGroupSelector v-model=\"imageGroupID\" :groups=\"groups\" />\n        </div>\n      </li>\n    </ul>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport ImageGroupSelector from '@/components/ImageGroupSelector.vue';\n\nexport default {\n  name: 'ImageDetails',\n  components: {\n    SVGIcon,\n    ImageGroupSelector,\n  },\n  props: {\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    options: {\n      type: Object,\n      default: () => ({\n        showName: true,\n        showDate: true,\n        showFileLocation: true,\n        showExternalURL: true,\n        showImageLocation: true,\n        showCameraSource: true,\n      }),\n    },\n    sourceDataset: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['image-group-changed'],\n  data() {\n    return {\n      imageGroupID: null,\n    };\n  },\n  computed: {\n    groups() {\n      if (this.sourceDataset?.groups) {\n        return this.sourceDataset.groups;\n      }\n      return [];\n    },\n  },\n  watch: {\n    imageObj() {\n      this.imageGroupID = this.imageObj.group_id;\n    },\n    imageGroupID() {\n      this.$emit('image-group-changed', (this.imageGroupID || null));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.image-details {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 300px;\n  max-width: 300px;\n  padding: 0;\n  z-index: 2;\n\n  &__list {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    padding: 0;\n    margin: 0;\n    gap: 8px;\n    overflow-y: auto;\n    list-style-type: none;\n  }\n\n  &__list-item {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    padding: 0 16px;\n  }\n\n  &__list-item-icon {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    width: 40px;\n    min-width: 40px;\n  }\n\n  &__list-item-details {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    text-align: left;\n    overflow: hidden;\n\n    span {\n      font-weight: 600;\n      font-size: 0.9rem;\n      line-height: 1.1rem;\n      overflow: hidden;\n      margin-bottom: 2px;\n      overflow-wrap: anywhere;\n    }\n  }\n\n  &__list-item-sub-details {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    text-align: left;\n\n    span {\n      font-weight: 500;\n      font-size: 0.9rem;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n    }\n\n    &._overflow-wrap span {\n      white-space: unset;\n      overflow-wrap: anywhere;\n    }\n  }\n}\n\n.image-group {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: 100%;\n\n  &__label {\n    color: var(--body-text-color-secondary);\n    font-size: 0.75rem;\n    font-weight: 600;\n    letter-spacing: 0.05em;\n    text-transform: uppercase;\n    margin-bottom: 2px;\n  }\n}\n</style>\n","<template>\n  <div class=\"radio-group\">\n    <template v-for=\"(group, index) in groups\" :key=\"index\">\n      <input\n        :id=\"`option-${group.name}`\"\n        v-model=\"selectedGroup\"\n        type=\"radio\"\n        name=\"mode-selector\"\n        :value=\"group\"\n      >\n      <label\n        :for=\"`option-${group.name}`\"\n        :style=\"{ flex: flexStyles }\"\n        :title=\"group.name\"\n        @click.prevent=\"toggleSelection(group)\"\n      >\n        {{ group.name }}\n      </label>\n    </template>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  name: 'ImageGroupSelector',\n  props: {\n    groups: {\n      type: Array,\n      default: () => [],\n    },\n    imageObj: {\n      type: Object,\n      default: null,\n    },\n    modelValue: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['update:modelValue', 'change'],\n  data() {\n    return {\n      selectedGroup: null,\n    };\n  },\n  computed: {\n    flexStyles() {\n      return this.groups.length === 3 ? '1 1 33.333%' : '1 1 50%';\n    },\n  },\n  watch: {\n    modelValue() {\n      if (this.modelValue !== this.selectedGroup?.id) {\n        this.selectedGroup = this.groups.find((group) => group.id === this.modelValue) || null;\n      }\n    },\n    selectedGroup() {\n      this.$emit('update:modelValue', this.selectedGroup?.id);\n      this.$emit('change', this.selectedGroup?.id);\n    },\n    imageObj() {\n      if (this.imageObj && 'group_id' in this.imageObj) {\n        this.selectedGroup = this.groups.find((group) => group.id === this.imageObj.group_id) || null;\n      }\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.selectedGroup = this.groups.find((group) => group.id === this.modelValue) || null;\n    }\n  },\n  methods: {\n    toggleSelection(group) {\n      if (this.selectedGroup === group) {\n        this.selectedGroup = null;\n      } else {\n        this.selectedGroup = group;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.radio-group {\n  width: 100%;\n  margin: 0;\n  flex-wrap: wrap;\n  display: flex;\n\n  input[type=radio] + label {\n    padding: 6px;\n    min-width: 0;\n    font-size: 0.875rem;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n  }\n}\n</style>\n","import { render } from \"./ImageGroupSelector.vue?vue&type=template&id=52bd067a&scoped=true\"\nimport script from \"./ImageGroupSelector.vue?vue&type=script&lang=js\"\nexport * from \"./ImageGroupSelector.vue?vue&type=script&lang=js\"\n\nimport \"./ImageGroupSelector.vue?vue&type=style&index=0&id=52bd067a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-52bd067a\"]])\n\nexport default __exports__","import { render } from \"./ImageDetails.vue?vue&type=template&id=71ac8808&scoped=true\"\nimport script from \"./ImageDetails.vue?vue&type=script&lang=js\"\nexport * from \"./ImageDetails.vue?vue&type=script&lang=js\"\n\nimport \"./ImageDetails.vue?vue&type=style&index=0&id=71ac8808&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-71ac8808\"]])\n\nexport default __exports__","<template>\n  <div class=\"image-details\">\n    <ul class=\"image-details__list scrollbar\">\n      <li class=\"image-details__list-item\">\n        <div class=\"image-details__list-item-icon\">\n          <SVGIcon\n            :iconName=\"'info'\"\n            :width=\"30\"\n            :height=\"30\"\n          />\n        </div>\n        <div v-if=\"annotationObj\" class=\"image-details__list-item-details\">\n          <span>Date</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <div>\n              <span :title=\"(new Date(annotationObj.date)).toDateString()\">{{ (new Date(annotationObj.date)).toDateString() }}</span>\n              <br>\n              <span :title=\"(new Date(annotationObj.date)).toTimeString()\">{{ (new Date(annotationObj.date)).toTimeString() }}</span>\n            </div>\n          </div>\n          <span>X</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.x\">{{ annotationObj.x }}</span>\n          </div>\n          <span>Y</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.y\">{{ annotationObj.y }}</span>\n          </div>\n          <span>Width</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.w\">{{ annotationObj.w }}</span>\n          </div>\n          <span>Height</span>\n          <div class=\"image-details__list-item-sub-details _overflow-wrap\">\n            <span :title=\"annotationObj.h\">{{ annotationObj.h }}</span>\n          </div>\n        </div>\n        <div v-if=\"!annotationObj\" class=\"image-details__list-item-details\">\n          <span><i>No Annotation Selected</i></span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'AnnotationDetails',\n  components: {\n    SVGIcon,\n  },\n  props: {\n    annotationObj: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  data() {\n    return {\n\n    };\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.image-details {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 300px;\n  max-width: 300px;\n  padding: 0;\n  z-index: 2;\n\n  &__list {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    padding: 0;\n    margin: 0;\n    gap: 32px;\n    overflow-y: auto;\n    list-style-type: none;\n  }\n\n  &__list-item {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    padding: 0 16px;\n  }\n\n  &__list-item-icon {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    width: 40px;\n    min-width: 40px;\n  }\n\n  &__list-item-details {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    text-align: left;\n    overflow: hidden;\n\n    span {\n      font-weight: 600;\n      font-size: 1rem;\n      line-height: 1.25rem;\n      overflow: hidden;\n      margin-bottom: 2px;\n      overflow-wrap: anywhere;\n    }\n  }\n\n  &__list-item-sub-details {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    text-align: left;\n\n    span {\n      font-weight: 500;\n      font-size: 0.875rem;\n      display: inline-flex;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n    }\n\n    &._overflow-wrap span {\n      white-space: unset;\n      overflow-wrap: anywhere;\n    }\n  }\n}\n</style>\n","import { render } from \"./AnnotationReviewAnnotationDetails.vue?vue&type=template&id=4d5c0c7e&scoped=true\"\nimport script from \"./AnnotationReviewAnnotationDetails.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationReviewAnnotationDetails.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationReviewAnnotationDetails.vue?vue&type=style&index=0&id=4d5c0c7e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d5c0c7e\"]])\n\nexport default __exports__","import { render } from \"./AnnotationReview.vue?vue&type=template&id=037c6c8a&scoped=true\"\nimport script from \"./AnnotationReview.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationReview.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationReview.vue?vue&type=style&index=0&id=037c6c8a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-037c6c8a\"]])\n\nexport default __exports__","<template>\n  <div class=\"progress-card\">\n    <div class=\"progress-card__text\">\n      <span>Progress</span>\n      <div class=\"progress-card__text-value\">\n        <SVGIcon\n          :iconName=\"'image'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <span>{{ (totalImagesCount - remainingImagesCount) }} / {{ totalImagesCount }}</span>\n      </div>\n    </div>\n    <div class=\"progress-card__bar\">\n      <v-progress-circular\n        :rotate=\"360\"\n        :width=\"3\"\n        :model-value=\"taskProgress\"\n        color=\"color-primary\"\n      >\n        <template #default><span>{{ taskProgress }} %</span></template>\n      </v-progress-circular>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\nimport {\n  computed,\n} from 'vue';\n\nexport default {\n  name: 'TaskProgressCard',\n  components: {\n    SVGIcon,\n  },\n  setup(props, ctx) {\n    const {\n      remainingImagesCount,\n      totalImagesCount,\n    } = useTasks();\n\n    const taskProgress = computed(() => {\n      if (totalImagesCount.value !== 0) {\n        return Math.floor(((totalImagesCount.value - remainingImagesCount.value) / totalImagesCount.value) * 100);\n      }\n      return 0;\n    });\n\n    return {\n      remainingImagesCount,\n      totalImagesCount,\n      taskProgress,\n    };\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.progress-card {\n  display: flex;\n  flex-direction: row;\n  width: fit-content;\n  border-radius: 8px;\n  background: var(--color-primary-400);\n\n  &__text {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin: 2px 8px;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--primary-text-color-secondary);\n    align-items: flex-start;\n    white-space: nowrap;\n  }\n\n  &__text-value {\n    display: flex;\n    flex-direction: row;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--primary-text-color);\n    white-space: nowrap;\n    gap: 4px;\n  }\n\n  &__bar {\n    display: flex;\n    width: 100%;\n    margin: 2px 8px;\n    font-size: 0.625rem;\n    color: var(--color-accent);\n    align-items: center;\n    justify-content: center;\n    .v-progress-circular span {\n      color: var(--primary-text-color);\n    }\n  }\n}\n</style>\n","import { render } from \"./TaskProgressCard.vue?vue&type=template&id=73cd0600&scoped=true\"\nimport script from \"./TaskProgressCard.vue?vue&type=script&lang=js\"\nexport * from \"./TaskProgressCard.vue?vue&type=script&lang=js\"\n\nimport \"./TaskProgressCard.vue?vue&type=style&index=0&id=73cd0600&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-73cd0600\"]])\n\nexport default __exports__","<template>\n  <div class=\"active-time-card\">\n    <div class=\"active-time-card__text\">\n      <span>Active Time</span>\n      <div class=\"active-time-card__text-value\">\n        <SVGIcon\n          :iconName=\"'clock'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <div class=\"active-time-card__text-time\">\n          <span v-if=\"activeTimeFormatted.hours\">{{ activeTimeFormatted.hours }}h</span>\n          <span v-if=\"activeTimeFormatted.minutes\">{{ activeTimeFormatted.hours ? activeTimeFormatted.minutes.toString().padStart(2, '0') : activeTimeFormatted.minutes }}m</span>\n          <span>{{ activeTimeFormatted.minutes ? activeTimeFormatted.seconds.toString().padStart(2, '0') : activeTimeFormatted.seconds }}s</span>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport useActiveTimer from '@/composables/useActiveTimer.js';\nimport {\n  ref, watch,\n} from 'vue';\n\nexport default {\n  name: 'TaskActiveTimeCard',\n  components: {\n    SVGIcon,\n  },\n  setup(props, ctx) {\n    // Setup Timer\n    const {\n      activeTime, activeTimeFormatted, resume: resumeActiveTimer, pause: pauseActiveTimer,\n    } = useActiveTimer(10 * 1000);\n    return {\n      activeTimeFormatted,\n    };\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.active-time-card {\n  display: flex;\n  flex-direction: row;\n  width: fit-content;\n  border-radius: 8px;\n  background: var(--color-primary-400);\n\n  &__text {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin: 2px 8px;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--primary-text-color-secondary);\n    align-items: flex-start;\n    white-space: nowrap;\n  }\n\n  &__text-value {\n    display: flex;\n    flex-direction: row;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--primary-text-color);\n    white-space: nowrap;\n    gap: 4px;\n  }\n\n  &__text-time {\n    display: flex;\n    flex-direction: row;\n    gap: 4px;\n  }\n}\n</style>\n","import {\n  ref, computed, watch,\n} from 'vue';\nimport { useIdle, useIntervalFn } from '@vueuse/core';\n\nexport default function useActiveTimer(timeout) {\n  const activeTime = ref(0);\n  const { idle } = useIdle(timeout);\n  const { resume, pause } = useIntervalFn(() => {\n    activeTime.value += 1;\n  }, 1000);\n  const activeTimeFormatted = computed(() => {\n    const hours = Math.floor(activeTime.value / 3600);\n    const remainingSeconds = activeTime.value % 3600;\n    const minutes = Math.floor(remainingSeconds / 60);\n    const seconds = Math.round(remainingSeconds % 60);\n\n    return { hours, minutes, seconds };\n  });\n  watch(idle, (isIdle) => {\n    if (isIdle) {\n      pause();\n    } else {\n      resume();\n    }\n  });\n\n  return {\n    activeTime, activeTimeFormatted, resume, pause,\n  };\n}\n","import { render } from \"./TaskActiveTimeCard.vue?vue&type=template&id=2e5e8234&scoped=true\"\nimport script from \"./TaskActiveTimeCard.vue?vue&type=script&lang=js\"\nexport * from \"./TaskActiveTimeCard.vue?vue&type=script&lang=js\"\n\nimport \"./TaskActiveTimeCard.vue?vue&type=style&index=0&id=2e5e8234&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2e5e8234\"]])\n\nexport default __exports__","<template>\n  <div class=\"dataset-and-destination-card\">\n    <div class=\"dataset-and-destination-card__text\">\n      <span>Source Dataset</span>\n      <div class=\"dataset-and-destination-card__text-value\">\n        <SVGIcon\n          :iconName=\"'database'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <span>{{ sourceDataset.name }}</span>\n      </div>\n    </div>\n    <div v-if=\"sourceAnnotationSet\" class=\"dataset-and-destination-card__text\">\n      <span>Source Annotation Set</span>\n      <div class=\"dataset-and-destination-card__text-value\">\n        <SVGIcon\n          :iconName=\"'set'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <span>{{ sourceAnnotationSet }}</span>\n      </div>\n    </div>\n    <div class=\"dataset-and-destination-card__text\">\n      <span>Destination Annotation Set</span>\n      <div class=\"dataset-and-destination-card__text-value\">\n        <SVGIcon\n          :iconName=\"'set'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <span>{{ destinationAnnotationSet }}</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nexport default {\n  name: 'TaskDatasetAndDestinationCard',\n  components: {\n    SVGIcon,\n  },\n  props: {\n    reviewSettings: {\n      type: Object,\n      default: null,\n    },\n  },\n  computed: {\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n    sourceDataset() {\n      const dataset_id = this.reviewSettings?.reviewTask?.dataset_id;\n      const dataset = this.datasets.find((d) => d.id === dataset_id);\n      return dataset;\n    },\n    annotationSets() {\n      return this.sourceDataset.annotation_sets;\n    },\n    sourceAnnotationSet() {\n      const source_annotation_set_id = this.reviewSettings?.reviewTask?.source_annotation_set_id;\n      const sourceAnnotationSet = this.annotationSets.find((as) => as.id === source_annotation_set_id);\n      return sourceAnnotationSet?.name;\n    },\n    destinationAnnotationSet() {\n      const dest_annotation_set_id = this.reviewSettings?.reviewTask?.dest_annotation_set_id;\n      const destAnnotationSet = this.annotationSets.find((as) => as.id === dest_annotation_set_id);\n      return destAnnotationSet.name;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.dataset-and-destination-card {\n  display: flex;\n  flex-direction: row;\n  width: fit-content;\n  border-radius: 8px;\n  background: var(--color-primary-400);\n\n  &__text {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    margin: 2px 8px;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--primary-text-color-secondary);\n    align-items: flex-start;\n    white-space: nowrap;\n  }\n\n  &__text-value {\n    display: flex;\n    flex-direction: row;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--primary-text-color);\n    white-space: nowrap;\n    gap: 4px;\n  }\n}\n</style>\n","import { render } from \"./TaskDatasetAndDestinationCard.vue?vue&type=template&id=01aee198&scoped=true\"\nimport script from \"./TaskDatasetAndDestinationCard.vue?vue&type=script&lang=js\"\nexport * from \"./TaskDatasetAndDestinationCard.vue?vue&type=script&lang=js\"\n\nimport \"./TaskDatasetAndDestinationCard.vue?vue&type=style&index=0&id=01aee198&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-01aee198\"]])\n\nexport default __exports__","<template>\n  <div class=\"annotation-tool-select\">\n    <v-select\n      v-model=\"selectedTool\"\n      label=\"Audit Tool Type\"\n      :items=\"options\"\n      density=\"compact\"\n      variant=\"outlined\"\n      bg-color=\"transparent\"\n      hide-details=\"true\"\n    >\n      <template #item=\"{ props }\">\n        <v-list-item v-bind=\"props\" :subtitle=\"props.subtitle\" />\n      </template>\n    </v-select>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  name: 'AuditToolSelect',\n  props: {\n    modelValue: {\n      type: String,\n      default: 'image',\n    },\n  },\n  emits: ['update:modelValue'],\n  data() {\n    return {\n      options: [\n        {\n          title: 'Image', value: 'image', props: { subtitle: 'Audit the full image with all annotations' },\n        }, {\n          title: 'Annotation', value: 'annotation', props: { subtitle: 'Audit individual annotations' },\n        },\n      ],\n      selectedTool: 'image',\n    };\n  },\n  watch: {\n    modelValue() {\n      this.selectedTool = this.modelValue;\n    },\n    selectedTool() {\n      this.$emit('update:modelValue', this.selectedTool);\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.selectedTool = this.modelValue;\n    }\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.annotation-tool-select {\n  display: flex;\n  flex-direction: row;\n  min-width: 182px;\n}\n\n.key {\n  box-sizing: border-box;\n  padding: 4px;\n  line-height: 1;\n  font-size: 12px;\n  text-align: center;\n  width: fit-content;\n  color: #555;\n  border-color: var(--gray-400);\n  border-style: solid;\n  text-shadow: 0 0.5px 1px #777, 0 2px 6px #f2f2f2;\n  border-width: 1px;\n  border-radius: 4px;\n  background: -webkit-linear-gradient(top, #f9f9f9 0%, #D2D2D2 80%, #c0c0c0 100%);\n  font-family: sans-serif;\n  display: inline-block;\n  transition: box-shadow 0.3s ease, transform 0.15s ease;\n}\n</style>\n","import { render } from \"./AuditToolSelect.vue?vue&type=template&id=eb62dbc0&scoped=true\"\nimport script from \"./AuditToolSelect.vue?vue&type=script&lang=js\"\nexport * from \"./AuditToolSelect.vue?vue&type=script&lang=js\"\n\nimport \"./AuditToolSelect.vue?vue&type=style&index=0&id=eb62dbc0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-eb62dbc0\"]])\n\nexport default __exports__","import {\n  ref, onBeforeUnmount, watch,\n} from 'vue';\n\nexport default function useAnnotationEditorModalHotkeys(hotkeys) {\n  const areListenersActive = ref(false);\n\n  const attachEventListeners = () => {\n    window.addEventListener('keydown', handleKeyDown, true);\n    window.addEventListener('keyup', handleKeyUp);\n  };\n\n  const detachEventListeners = () => {\n    window.removeEventListener('keydown', handleKeyDown, true);\n    window.removeEventListener('keyup', handleKeyUp);\n  };\n\n  const setEventListenersActive = (isActive) => {\n    areListenersActive.value = isActive;\n\n    if (isActive) {\n      attachEventListeners();\n    } else {\n      detachEventListeners();\n    }\n  };\n\n  const activateListeners = () => {\n    setEventListenersActive(true);\n  };\n\n  const deactivateListeners = () => {\n    setEventListenersActive(false);\n  };\n\n  onBeforeUnmount(() => {\n    window.removeEventListener('keydown', handleKeyDown, true);\n    window.removeEventListener('keyup', handleKeyUp);\n  });\n\n  async function handleKeyDown(event) {\n    switch (event.key) {\n    case 'Enter':\n      event.preventDefault();\n      event.stopPropagation();\n      document.querySelector('#annotation-editor-modal').focus();\n      break;\n    case ' ':\n      event.preventDefault();\n      event.stopPropagation();\n      document.querySelector('#annotation-editor-modal').focus();\n      break;\n    case '=':\n    case '-':\n      event.preventDefault();\n      event.stopPropagation();\n      hotkeys.value[event.key]();\n      break;\n    default:\n      break;\n    }\n  }\n\n  async function handleKeyUp(event) {\n    let key = event.key;\n    if (event.ctrlKey || event.metaKey) {\n      key = `ctrl,${key}`;\n    }\n    if (hotkeys.value[key] === '-' || hotkeys.value[key] === '=') {\n      return;\n    }\n    if (hotkeys.value[key]) {\n      hotkeys.value[key]();\n    }\n  }\n\n  return {\n    activateListeners,\n    deactivateListeners,\n    areListenersActive,\n  };\n}\n","<script setup>\nimport { ref, watch, toRefs } from 'vue';\nimport { useEventListener, useMouseInElement, useVModel } from '@vueuse/core';\n\nconst props = defineProps({\n  min: { type: Number, default: 0 },\n  max: { type: Number, default: 100 },\n  secondary: { type: Number, default: 0 },\n  modelValue: { type: Number, required: true },\n  step: { type: Number, default: null },\n});\nconst {\n  max,\n} = toRefs(props);\n\nconst emit = defineEmits(['update:modelValue', 'scrubbing-end', 'scrubbing']);\n\nconst scrubber = ref();\nconst scrubbing = ref(false);\nconst pendingValue = ref(0);\n\nuseEventListener('mouseup', () => { if (scrubbing.value) { emit('scrubbing-end'); } scrubbing.value = false; });\n\nconst value = useVModel(props, 'modelValue', emit);\nconst { elementX, elementWidth } = useMouseInElement(scrubber);\n\nwatch([scrubbing, elementX], () => {\n  const progress = Math.max(0, Math.min(1, (elementX.value) / elementWidth.value));\n  if (props.step) {\n    pendingValue.value = roundToStep((progress * (props.max - props.min)) + props.min, props.step);\n  } else {\n    pendingValue.value = (progress * (props.max - props.min)) + props.min;\n  }\n  if (scrubbing.value && max.value > 0) {\n    value.value = pendingValue.value;\n    emit('scrubbing', value.value);\n  }\n});\n\nfunction emitScrubbing() {\n  if (max.value > 0) {\n    emit('scrubbing', pendingValue.value); // Emit the initial frame value on mousedown\n  }\n}\n\nfunction roundToStep(progress, step) {\n  // Ensure step is greater than 0 to avoid division by zero\n  if (step <= 0) {\n    throw new Error(\"Step size must be greater than 0\");\n  }\n\n  // Round the progress value based on the step size\n  const roundedValue = Math.round(progress / step) * step;\n\n  return roundedValue;\n}\n\n</script>\n\n<template>\n  <div ref=\"scrubber\" class=\"scrubber\" @mousedown=\"scrubbing = true; emitScrubbing()\">\n    <div v-if=\"max > 0\" class=\"scrubber-bar\">\n      <div class=\"secondary-bar\" :style=\"{ transform: `translateX(${((secondary - min) / (max - min)) * 100 - 100}%)` }\" />\n      <div class=\"primary-bar\" :style=\"{ transform: `translateX(${((value - min) / (max - min)) * 100 - 100}%)` }\" />\n    </div>\n    <div v-else class=\"scrubber-bar\" />\n    <div class=\"scrub-time\" :class=\"{ 'show': scrubbing }\">\n      <slot v-if=\"max > 0\" :pending-value=\"pendingValue\" :position=\"`${Math.max(0, Math.min(elementX, elementWidth))}px`\" />\n    </div>\n  </div>\n</template>\n\n<style lang=\"scss\" scoped>\n\n.scrubber {\n  position: relative;\n  height: 6px;\n  border-radius: 0.25rem;\n  cursor: pointer;\n  user-select: none;\n  background-color: rgba(0,0,0,0.125);\n}\n\n/* Styles for the scrubber */\n// .scrubber:hover {\n//   background-color: rgba(0, 0, 0, 0.5);\n// }\n\n/* Styles for the inner containers */\n.scrubber-bar {\n  position: relative;\n  overflow: hidden;\n  height: 100%;\n  width: 100%;\n  border-radius: 0.25rem;\n}\n\n.secondary-bar {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  background-color: rgba(0,0,0,0.375);\n  z-index: 1;\n}\n\n.primary-bar {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  background-color: var(--color-primary);\n  z-index: 2;\n}\n\n.scrub-time {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  opacity: 0;\n  transition: opacity 0.3s ease;\n  z-index: 999;\n}\n\n.scrub-time.show, .scrub-time:hover {\n  opacity: 1;\n}\n\n</style>\n","import script from \"./Scrubber.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./Scrubber.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./Scrubber.vue?vue&type=style&index=0&id=eddcf1e6&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-eddcf1e6\"]])\n\nexport default __exports__","<template>\n  <v-footer\n    class=\"p-0 footer\"\n  >\n    <div class=\"controls\">\n      <Scrubber\n        v-model=\"videoPlayerStore.currentTime\"\n        :max=\"videoPlayerStore.duration\"\n        :secondary=\"endBuffer\"\n      >\n        <template #default=\"{ position, pendingValue }\">\n          <div\n            class=\"time-popup\"\n            :style=\"{ left: position }\"\n          >\n            {{ formatDuration(pendingValue) }}\n          </div>\n        </template>\n      </Scrubber>\n      <div class=\"controls__bottom\">\n        <button class=\"controls__play-button\" @click=\"videoPlayerStore.playing = !videoPlayerStore.playing\">\n          <SVGIcon\n            v-if=\"!videoPlayerStore.playing\"\n            :iconName=\"'play'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n          <SVGIcon\n            v-else\n            :iconName=\"'pause'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n        </button>\n        <button ref=\"volumeButton\" class=\"controls__volume-button\" @click=\"videoPlayerStore.muted = !videoPlayerStore.muted\">\n          <SVGIcon\n            v-if=\"videoPlayerStore.muted\"\n            :iconName=\"'volume_off'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n          <SVGIcon\n            v-else\n            :iconName=\"'volume_up'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n        </button>\n        <div class=\"controls__volume-bar\" :class=\"{'_show': isVolumeButtonHovered}\">\n          <Scrubber\n            ref=\"volumeBar\"\n            v-model=\"videoPlayerStore.volume\"\n            :max=\"1\"\n          />\n        </div>\n        <div\n          class=\"flex flex-col flex-1 text-sm ml-2\"\n        >\n          {{ formatDuration(videoPlayerStore.currentTime) }} / {{ formatDuration(videoPlayerStore.duration) }}\n        </div>\n      </div>\n    </div>\n  </v-footer>\n</template>\n\n<script setup>\nimport Scrubber from '@/components/DatasetComponent/AnnotationTool/VideoControls/Scrubber.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport { useVideoPlayerStore } from '@/stores/useVideoPlayerStore.js';\nimport { ref, computed } from 'vue';\nimport { useElementHover } from '@vueuse/core';\n\nconst videoPlayerStore = useVideoPlayerStore();\n\nconst endBuffer = computed(() => (videoPlayerStore.buffered.length > 0 ? videoPlayerStore.buffered[videoPlayerStore.buffered.length - 1][1] : 0));\n\nconst volumeButton = ref();\nconst isVolumeButtonHovered = useElementHover(volumeButton);\n\nfunction formatDuration(seconds) {\n  return new Date(1000 * seconds).toISOString().slice(14, 19);\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.footer {\n  z-index: 10;\n  border-left: 1px solid rgba(0,0,0,0.25);\n  min-height: 48px;\n  background: var(--body-color);\n}\n\n.controls {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 100%;\n  width: 100%;\n  height: 100%;\n  padding: 0 1rem;\n\n  &__bottom {\n    display: flex;\n    flex: 1 1 auto;\n    flex-direction: row;\n    align-items: center;\n  }\n\n  button:hover {\n    background: rgba(0,0,0,0.125);\n  }\n\n  &__play-button {\n    width: 28px;\n    height: 28px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  &__volume-button {\n    width: 28px;\n    height: 28px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  &__volume-bar {\n    width: 0;\n    height: 100%;\n    justify-content: center;\n    display: flex;\n    flex-direction: column;\n    transition: margin .2s cubic-bezier(.4,0,1,1),width .2s cubic-bezier(.4,0,1,1);\n  }\n  &__volume-bar._show, &__volume-bar:hover {\n    width: 116px;\n    padding: 0 8px;\n    transition: margin .2s cubic-bezier(.4,0,1,1),width .2s cubic-bezier(.4,0,1,1);\n  }\n}\n\n.time-popup {\n  position: absolute;\n  transform: translateX(-50%);\n  background-color: #000;\n  border-radius: 0.375rem;\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n  bottom: 0;\n  margin-bottom: 1rem;\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  font-size: 0.75rem;\n  color: #fff;\n}\n\n</style>\n","import script from \"./VideoControls.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./VideoControls.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./VideoControls.vue?vue&type=style&index=0&id=7c687f5a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-7c687f5a\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"show\" id=\"samToolbar\" class=\"sam-toolbar\">\n    <!-- Servers -->\n    <div class=\"sam-toolbar__group\">\n      <div v-if=\"fetchingCloudInstances\" id=\"loading-servers\" class=\"servers__loading\">\n        <div class=\"loader-ring\"><div /><div /><div /><div /></div>\n        <span>Loading Servers</span>\n      </div>\n      <div v-if=\"servers && servers.length === 0\" class=\"servers__not-found\">\n        <span>No AIGT Servers Found</span>\n      </div>\n      <div v-if=\"servers && servers.length > 0\" id=\"servers\" class=\"sam-toolbar__group form__control-group\">\n        <!-- <label>Group</label> -->\n        <select\n          id=\"servers-select\"\n          v-model=\"sam2Server\"\n          class=\"select\"\n          required\n        >\n          <option :key=\"'servers-null'\" :value=\"''\">Select Server</option>\n          <option v-for=\"option in servers\" :key=\"`servers-${option.id}`\" :value=\"option.ip\">\n            {{ option.name }}\n          </option>\n        </select>\n      </div>\n    </div>\n\n    <div v-if=\"samOptions?.ip\" class=\"sam-toolbar__group\">\n      <div v-if=\"hasSAMImageEmbeddingError\" class=\"sam-error\">\n        <span class=\"sam-error__icon\" />\n      </div>\n      <span v-else-if=\"!hasSAMImageEmbedding\" class=\"sam-loader\" />\n      <div v-else class=\"sam-ready\">\n        <span class=\"sam-ready__icon\" />\n      </div>\n    </div>\n    <div v-if=\"samOptions?.ip\" class=\"sam-toolbar__group\">\n      <div class=\"sam-toolbar__button-container\">\n        <IconButton\n          id=\"SAMhoverAndClickToolAddBtn\"\n          aria-label=\"SAM Hover and Click (Add)\"\n          class=\"sam-toolbar__button\"\n          :class=\"{active: pointType === 'add'}\"\n          :icon=\"'cursor'\"\n          :showHover=\"false\"\n          :type=\"''\"\n          :width=\"20\"\n          :height=\"20\"\n          :title=\"'SAM Hover and Click (Left Click: positive point, Right Click: negative point)'\"\n          :disabled=\"!hasSAMImageEmbedding\"\n          @click=\"handleSAMHoverAndClickAdd\"\n        />\n        <SVGIcon\n          id=\"SAMhoverAndClickToolBtn\"\n          class=\"sam-toolbar__button-pointer-overlay\"\n          :iconName=\"'add_box_outlined'\"\n        />\n      </div>\n      <div class=\"sam-toolbar__button-container\">\n        <IconButton\n          id=\"SAMhoverAndClickToolMinusBtn\"\n          aria-label=\"SAM Hover and Click (Minus)\"\n          class=\"sam-toolbar__button\"\n          :class=\"{active: pointType === 'minus'}\"\n          :icon=\"'cursor'\"\n          :showHover=\"false\"\n          :type=\"''\"\n          :width=\"20\"\n          :height=\"20\"\n          :title=\"'SAM Hover and Click (Minus)'\"\n          :disabled=\"!hasSAMImageEmbedding\"\n          @click=\"handleSAMHoverAndClickMinus\"\n        />\n        <SVGIcon\n          id=\"SAMhoverAndClickToolBtn\"\n          class=\"sam-toolbar__button-pointer-overlay\"\n          :iconName=\"'minus_box_outlined'\"\n        />\n      </div>\n      <IconButton\n        id=\"SAMhoverAndClickToolBtn\"\n        aria-label=\"SAM Box Tool\"\n        class=\"sam-toolbar__button\"\n        :class=\"{active: pointType === 'box'}\"\n        :icon=\"'highlight_alt'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'SAM Box Tool'\"\n        :width=\"20\"\n        :height=\"20\"\n        :disabled=\"!hasSAMImageEmbedding\"\n        @click=\"handleSAMAddBox\"\n      />\n    </div>\n    <div v-if=\"samOptions?.ip\" class=\"sam-toolbar__group\">\n      <button class=\"button button-sm sam-toolbar__button _secondary\" :disabled=\"!hasSAMImageEmbedding\" @click=\"handleSAMReset\">Reset</button>\n      <button\n        class=\"button button-sm sam-toolbar__button\"\n        :class=\"{'button-spinner': isCreatingPolygon}\"\n        :disabled=\"!hasSAMImageEmbedding || isCreatingPolygon\"\n        :title=\"`Create Annotation (c)`\"\n        @click=\"handleCreatePolygon\"\n      >\n        Create Annotation\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport useSAMCanvas from '@/composables/canvas/useSAMCanvas.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'SAMToolbar',\n  components: {\n    IconButton,\n    SVGIcon,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: true,\n    },\n    canUndo: {\n      type: Boolean,\n      default: false,\n    },\n    hasSAMImageEmbedding: {\n      type: Boolean,\n      default: false,\n    },\n    hasSAMImageEmbeddingError: {\n      type: Boolean,\n      default: false,\n    },\n    samOptions: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: [\n    'undo',\n    'sam-add-point',\n    'sam-minus-point',\n    'sam-add-box',\n    'sam-create-polygon',\n    'update:samOptions',\n  ],\n  setup(props, ctx) {\n    const { SAMEventBus, handleCreateSAMPolygon, isCreatingPolygon } = useSAMCanvas();\n    return { SAMEventBus, handleCreateSAMPolygon, isCreatingPolygon };\n  },\n  data() {\n    return {\n      servers: null,\n      fetchingCloudInstances: true,\n      sam2Server: '',\n    };\n  },\n  computed: {\n    pointType() {\n      return this.samOptions.params.pointType;\n    },\n  },\n  watch: {\n    sam2Server(selectedServer) {\n      const samOptions = this.samOptions;\n      samOptions.ip = selectedServer;\n      this.$emit('update:samOptions', samOptions);\n    },\n  },\n  async mounted() {\n    if (this.mode) {\n      this.internalMode = this.mode;\n    }\n\n    this.servers = await this.listCloudInstances();\n    if (this.servers.length > 0) {\n      this.sam2Server = this.servers[0].ip;\n      const samOptions = this.samOptions;\n      samOptions.ip = this.sam2Server;\n      this.$emit('update:samOptions', samOptions);\n    }\n  },\n  methods: {\n    handleUndo() {\n      this.$emit('undo');\n    },\n    handleSAMReset() {\n      const samOptions = this.samOptions;\n      samOptions.params.clicks = [];\n      samOptions.params.box = [];\n      this.$emit('update:samOptions', samOptions);\n      this.SAMEventBus.emit('reset');\n    },\n    handleSAMHoverAndClickAdd() {\n      const samOptions = this.samOptions;\n      if (samOptions.mode === 'hover_and_click' && samOptions.params.pointType === 'add') {\n        samOptions.mode = null;\n        samOptions.params.pointType = null;\n      } else {\n        samOptions.mode = 'hover_and_click';\n        samOptions.params.pointType = 'add';\n        this.$emit('sam-add-point');\n      }\n      this.$emit('update:samOptions', samOptions);\n    },\n    handleSAMHoverAndClickMinus() {\n      const samOptions = this.samOptions;\n      if (samOptions.mode === 'hover_and_click' && samOptions.params.pointType === 'minus') {\n        samOptions.mode = null;\n        samOptions.params.pointType = null;\n      } else {\n        samOptions.mode = 'hover_and_click';\n        samOptions.params.pointType = 'minus';\n        this.$emit('sam-minus-point');\n      }\n      this.$emit('update:samOptions', samOptions);\n    },\n    handleSAMAddBox() {\n      const samOptions = this.samOptions;\n      if (samOptions.mode === 'drag_box' && samOptions.params.pointType === 'box') {\n        samOptions.mode = null;\n        samOptions.params.pointType = null;\n      } else {\n        samOptions.mode = 'drag_box';\n        samOptions.params.pointType = 'box';\n        this.$emit('sam-add-box');\n      }\n      this.$emit('update:samOptions', samOptions);\n    },\n    async handleCreatePolygon() {\n      await this.handleCreateSAMPolygon();\n      this.SAMEventBus.emit('reset');\n    },\n    async listCloudInstances() {\n      this.fetchingCloudInstances = true;\n      const dataConnect = new DatastoreConnect();\n      return dataConnect.listCloudInstances({ filter: \"\" })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          this.fetchingCloudInstances = false;\n          return resp.result;\n        })\n        .catch((error) => {\n          this.fetchingCloudInstances = false;\n          throw error;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.sam-toolbar {\n  display: flex;\n  flex-direction: row;\n\n  &__group {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 12px;\n  }\n\n  &__group + &__group {\n    margin-left: 15px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 1px;\n    height: 60%;\n    margin: 0;\n  }\n\n  &__title {\n    font-weight: 700;\n    font-size: 0.9rem;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n\n  &__button-container {\n    position: relative;\n  }\n\n  &__button {\n    border-radius: 4px !important;\n\n    &._secondary {\n      color: inherit;\n      background: none;\n      border: none;\n      box-shadow: none;\n\n      &:hover:not(:disabled), &.active:not(:disabled) {\n        background-color: var(--icon-hover-color);\n      }\n\n      &:disabled {\n        box-shadow: none !important;\n        background-color: transparent !important;\n        cursor: default;\n        color: var(--color-disabled) !important;\n      }\n    }\n\n  }\n\n  &__button-pointer-overlay {\n    display: flex;\n    position: absolute;\n    width: 14px;\n    height: 14px;\n    top: -3px;\n    right: -2px;\n    pointer-events: none;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n\n  &__labeled_button {\n    width: auto;\n  }\n}\n\n.sam-loader {\n  animation: rotation 1s linear infinite;\n  box-sizing: border-box;\n  width: 18px;\n  height: 18px;\n  border-radius: 50%;\n  display: inline-block;\n  border-right: 3px solid transparent;\n  @include themify() {\n    border-top: 3px solid themed('color-accent-500');\n  }\n\n  &::after {\n    content: '';\n    box-sizing: border-box;\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 18px;\n    height: 18px;\n    border-radius: 50%;\n    border-left: 3px solid transparent;\n    @include themify() {\n      border-bottom: 3px solid themed('color-primary-500');\n    }\n  }\n\n  @keyframes rotation {\n    0% {\n      transform: rotate(0deg);\n    }\n    100% {\n      transform: rotate(360deg);\n    }\n  }\n}\n\n.sam-ready {\n  box-sizing: border-box;\n  width: 18px;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  &__icon {\n    display: inline-block;\n    width: 14px;\n    height: 14px;\n    border-radius: 50%;\n    @include themify() {\n      background: themed('color-success');\n    }\n  }\n}\n\n.sam-error {\n  box-sizing: border-box;\n  width: 18px;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  &__icon {\n    display: inline-block;\n    width: 14px;\n    height: 14px;\n    border-radius: 50%;\n    @include themify() {\n      background: themed('color-error');\n    }\n  }\n}\n\n#servers-select {\n  border-radius: 3px;\n  height: 28px;\n}\n\n.servers {\n  &__loading {\n    display: flex;\n    align-items: center;\n    font-style: italic;\n    height: 100%;\n\n    span {\n      margin-left: 8px;\n    }\n  }\n\n  &__not-found {\n    display: flex;\n    align-items: center;\n    font-style: italic;\n  }\n}\n\n</style>\n","import { render } from \"./SAMToolbar.vue?vue&type=template&id=3d21af6b&scoped=true\"\nimport script from \"./SAMToolbar.vue?vue&type=script&lang=js\"\nexport * from \"./SAMToolbar.vue?vue&type=script&lang=js\"\n\nimport \"./SAMToolbar.vue?vue&type=style&index=0&id=3d21af6b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3d21af6b\"]])\n\nexport default __exports__","<template>\n  <v-expansion-panel\n    v-for=\"topic in listedTopics\"\n    :key=\"topic.key\"\n    :value=\"topic.key\"\n  >\n    <template #title>\n      <div>\n        <span>{{ topic.display }}</span>\n      </div>\n    </template>\n    <template #text>\n      <ul class=\"annotation-list scrollbar\">\n        <li\n          v-for=\"(annotation, j) in groupedAnnotations[topic.key]\"\n          :key=\"annotation.id\"\n          class=\"_hover\"\n          :class=\"{_active: selectedAnnotationIdentifiers.includes(annotation.id)}\"\n          @click=\"handleAnnotationClicked(annotation, j)\"\n          @mouseover=\"handleAnnotationListItemHovered(annotation, true)\"\n          @mouseleave=\"handleAnnotationListItemHovered(annotation, false)\"\n        >\n          <span>{{ labelIndexToName(annotation.label_index) }}</span>\n          <div>\n            <IconButton\n              id=\"editor-delete-annotation-btn\"\n              :icon=\"'delete'\"\n              :width=\"20\"\n              :height=\"20\"\n              :type=\"'click'\"\n              @click.stop=\"() => emit('delete-annotation', annotation)\"\n            />\n          </div>\n        </li>\n      </ul>\n    </template>\n  </v-expansion-panel>\n  <!-- <div v-else class=\"empty\">\n    <p>No Annotations  Found</p>\n  </div> -->\n</template>\n\n<script setup>\nimport {\n  ref, computed, watch, toRefs,\n} from 'vue';\nimport { storeToRefs } from 'pinia';\nimport IconButton from '@/components/IconButton.vue';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\n\nconst {\n  allTypes,\n} = useAnnotationType();\n\nconst props = defineProps({\n  annotations: { type: Array, default: () => [] },\n  labels: { type: Array, default: () => [] },\n  selectedAnnotationIdentifiers: { type: Array, default: () => [] },\n  hoveredAnnotationListIdentifier: { type: [String, Number], default: null },\n});\nconst { annotations } = toRefs(props);\n\nconst listedTopics = computed(() => {\n  if (groupedAnnotations.value) {\n    return allTypes.value.filter((e) => Object.keys(groupedAnnotations.value).includes(e.key));\n  } else { return []; }\n});\n\nconst emit = defineEmits(['item-clicked', 'delete-annotation', 'hovered-annotation']);\n\nconst hoveredAnnotationListItem = ref(null);\nfunction handleAnnotationListItemHovered(annotation, hovered) {\n  if (hovered) {\n    hoveredAnnotationListItem.value = annotation;\n    emit('hovered-annotation', annotation.id);\n  } else if (hoveredAnnotationListItem.value.id === annotation.id) {\n    hoveredAnnotationListItem.value = null;\n    emit('hovered-annotation', null);\n  }\n}\n\nconst groupedAnnotations = computed(() => {\n  const groupedData = {};\n  annotations.value.forEach((item) => {\n    const itemType = item.type;\n    if (!groupedData[itemType]) {\n      groupedData[itemType] = [];\n    }\n    groupedData[itemType].push(item);\n  });\n  return groupedData;\n});\n\nfunction labelIndexToName(index) {\n  if (props.labels.length > 0) {\n    const labelObj = props.labels.find((label) => label.index === index);\n    if (labelObj) {\n      return labelObj.name;\n    }\n  }\n  return index;\n}\n\nasync function handleAnnotationClicked(annotation, index) {\n  emit('item-clicked', annotation, index);\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.annotation-list {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 50%;\n  padding: 8px 0 0 0;\n  margin: 0;\n  overflow-y: auto;\n  list-style-type: none;\n  height: 100%;\n  min-height: 0;\n\n  li {\n    user-select: none;\n    -moz-user-select: none;\n    -khtml-user-select: none;\n    -webkit-user-select: none;\n    -o-user-select: none;\n    flex-direction: row;\n    display: flex;\n    align-items: center;\n    margin-bottom: unset;\n    min-height: 30px;\n    height: fit-content;\n    padding: 4px 8px;\n    font-size: 0.875rem;\n    border: 1px solid transparent;\n\n    button {\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n\n    span {\n      margin-right: auto;\n    }\n\n    &._active {\n      background: rgba(140,140,140,0.2);\n      cursor: pointer;\n\n      @include themify() {\n        border: 1px solid black;\n        border-left: 4px solid themed('color-primary');\n      }\n    }\n  }\n\n  li._hover {\n    &:hover {\n      background: rgba(140,140,140,0.2);\n      cursor: pointer;\n    }\n  }\n\n  &__symbol {\n    width: 16px;\n    height: 16px;\n    margin-right: 8px;\n  }\n\n  &__box-symbol {\n    border: 2px solid;\n  }\n}\n\n.empty {\n  font-style: italic;\n  padding: 16px 8px;\n  margin: 8px;\n  color: var(--body-text-color-secondary);\n  border: dashed 2px rgba(var(--color-primary-rgb), 0.5);\n  border-radius: 8px;\n}\n</style>\n","import script from \"./AnnotationList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./AnnotationList.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./AnnotationList.vue?vue&type=style&index=0&id=83dcb010&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-83dcb010\"]])\n\nexport default __exports__","import { defineStore } from 'pinia';\nimport { ref, watch, computed } from 'vue';\n\nexport const useEditorControlsStore = defineStore('editorControls', () => {\n  const selectedLabel = ref(null);\n  const currentCanvasTool = ref('pointer');\n  const current3DCanvasTool = ref('3d-pointer');\n\n  function $reset() {\n    selectedLabel.value = null;\n  }\n\n  return {\n    selectedLabel,\n    currentCanvasTool,\n    current3DCanvasTool,\n    $reset,\n  };\n});\n","<template>\n  <div v-if=\"show\" id=\"annotationToolRibbon\" class=\"ribbon\">\n    <div class=\"ribbon__group\">\n      <IconButton\n        id=\"frontViewBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Front View\"\n        :icon=\"'border_outer_line'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Front View'\"\n        @click=\"handleFrontView\"\n      />\n      <IconButton\n        id=\"topViewBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Top View\"\n        :icon=\"'border_top_line'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Top View'\"\n        @click=\"handleTopView\"\n      />\n      <hr class=\"ribbon__vr\">\n      <IconButton\n        id=\"perspectiveCameraBtn\"\n        v-model=\"usePerspectiveCamera\"\n        class=\"ribbon__button\"\n        aria-label=\"Perspective Camera\"\n        :icon=\"'perspective'\"\n        :showHover=\"false\"\n        :type=\"'toggle'\"\n        :title=\"'Perspective Camera'\"\n        :allowClick=\"!usePerspectiveCamera\"\n      />\n      <IconButton\n        id=\"orthographicCameraBtn\"\n        v-model=\"useOrthographicCamera\"\n        class=\"ribbon__button\"\n        aria-label=\"Orthographic Camera\"\n        :icon=\"'orthographic'\"\n        :showHover=\"false\"\n        :type=\"'toggle'\"\n        :title=\"'Orthographic Camera'\"\n        :allowClick=\"!useOrthographicCamera\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport IconButton from '@/components/IconButton.vue';\nimport {\n  ref, watch, toRefs,\n} from 'vue';\n\nconst props = defineProps({\n  show: { type: Boolean, default: false },\n});\nconst {\n  show,\n} = toRefs(props);\nconst emit = defineEmits(['front-view', 'top-view', 'perspective-camera', 'orthographic-camera']);\n\nconst usePerspectiveCamera = ref(true);\nconst useOrthographicCamera = ref(false);\n\nconst handleFrontView = () => {\n  emit('front-view');\n};\n\nconst handleTopView = () => {\n  emit('top-view');\n};\n\nwatch(usePerspectiveCamera, (isEnabled) => {\n  if (isEnabled) {\n    useOrthographicCamera.value = false;\n    emit('perspective-camera');\n  }\n});\n\nwatch(useOrthographicCamera, (isEnabled) => {\n  if (isEnabled) {\n    usePerspectiveCamera.value = false;\n    emit('orthographic-camera');\n  }\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n.ribbon {\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  display: flex;\n  flex-direction: row;\n  width: fit-content;\n  height: 40px;\n  padding: 2px 16px;\n  justify-content: space-between;\n  font-weight: 500;\n  box-shadow: 0 0 3px gray, 0 0 10px gray;\n  border-radius: 4px;\n  backdrop-filter: blur(5px);\n  -webkit-backdrop-filter: blur(5px);\n  z-index: 10;\n  @include themify() {\n    color: themed('ribbon-icons-color');\n    background: themed('ribbon-bg-transparent');\n  }\n\n  &__group {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 8px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 1px;\n    height: 60%;\n    margin: 0;\n  }\n\n  &__button {\n    display: flex;\n    min-width: 22px;\n    height: 22px;\n    color: inherit;\n    background: none;\n    border: none;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: .05em;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover:not(:disabled), &.active:not(:disabled) {\n      @include themify() {\n        box-shadow: 0 0 0 4px themed('icon-hover-color');\n        background-color: themed('icon-hover-color');\n      }\n      border-radius: 4px !important;\n    }\n\n    &:disabled {\n      cursor: default;\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n:deep(.filter-button) {\n  height: 22px;\n}\n\n</style>\n","import script from \"./AnnotationToolViewingMode3DControls.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./AnnotationToolViewingMode3DControls.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./AnnotationToolViewingMode3DControls.vue?vue&type=style&index=0&id=008c6ff6&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-008c6ff6\"]])\n\nexport default __exports__","<template>\n  <AnnotationToolViewingMode3DControls\n    :show=\"true\"\n    @top-view=\"handleTopView\"\n    @front-view=\"handleFrontView\"\n    @perspective-camera=\"switchToPerspectiveCamera\"\n    @orthographic-camera=\"switchToOrthographicCamera\"\n  />\n  <TresCanvas\n    ref=\"canvas\"\n    v-bind=\"gl\"\n    render-mode=\"on-demand\"\n  >\n    <TresPerspectiveCamera\n      v-if=\"cameraType === 'perspective'\"\n      ref=\"cameraPerspective\"\n      :position=\"cameraPerspectivePosition\"\n      :up=\"upDirection\"\n      :fov=\"45\"\n      :look-at=\"lookAt\"\n    />\n    <TresOrthographicCamera\n      v-else-if=\"cameraType === 'orthographic'\"\n      ref=\"cameraOrthographic\"\n      :up=\"upDirection\"\n      :position=\"cameraOrthographicPosition\"\n    />\n    <OrbitControls\n      ref=\"controls\"\n      make-default\n      :enableDamping=\"true\"\n      :dampingFactor=\"1\"\n    />\n    <TransformControls\n      v-if=\"transformEnabled\"\n      ref=\"transformControls\"\n      :object=\"transformObject\"\n      :mode=\"transformMode\"\n      @mouse-up=\"handleTransformMouseUp(transformObject)\"\n    />\n    <TresGroup v-if=\"showTypes?.pcd\" ref=\"pointArrayGroup\">\n      <primitive\n        v-for=\"pointObj in processPcd(pointArray)\"\n        :key=\"pointObj.annotation.id\"\n        :object=\"pointObj.pointsBuffer\"\n      />\n    </TresGroup>\n\n    <TresGroup v-if=\"showTypes?.pcd\" ref=\"pointGroup\">\n      <primitive\n        v-for=\"pointObj in processPcd(points)\"\n        :key=\"pointObj.annotation.id\"\n        :object=\"pointObj.pointsBuffer\"\n      />\n    </TresGroup>\n\n    <TresGroup v-if=\"showTypes?.lidar\" ref=\"lidarGroup\">\n      <primitive\n        v-for=\"lidarObj in processLidar(lidar)\"\n        :key=\"lidarObj.annotation.id\"\n        :object=\"lidarObj.pointsBuffer\"\n      />\n    </TresGroup>\n\n    <TresGroup\n      v-if=\"showTypes?.['3dbox']\"\n      ref=\"boxGroup\"\n      :invalidateBoxes=\"invalidateBoxes\"\n    >\n      <TresMesh\n        v-for=\"(box, boxIndex) in boxes3d\"\n        :ref=\"(object) => boxRefsFn(object, boxIndex, box)\"\n        :key=\"box.id\"\n        :position=\"[box.data_json.x, box.data_json.y, box.data_json.z]\"\n        @click=\"(el, intersection, pointerEvent) => handleBoxClicked(box, el, intersection, pointerEvent)\"\n        @pointer-enter=\"(el) => handleBoxPointerEnter(el)\"\n        @pointer-leave=\"(object) => handleBoxPointerLeave(object)\"\n      >\n        <TresBoxGeometry :args=\"[box.data_json.dx, box.data_json.dy, box.data_json.dz, 1, 1, 1]\" />\n        <primitive v-if=\"!invalidateBoxes\" :object=\"getBoxTopEdges(box.data_json.dx, box.data_json.dy, box.data_json.dz, box.label_index, 0.003)\" />\n        <primitive v-if=\"!invalidateBoxes\" :object=\"getBoxBottomEdges(box.data_json.dx, box.data_json.dy, box.data_json.dz, box.label_index, 0.003)\" />\n        <primitive v-if=\"!invalidateBoxes\" :object=\"getBoxLeftEdges(box.data_json.dx, box.data_json.dy, box.data_json.dz, box.label_index, 0.003)\" />\n        <primitive v-if=\"!invalidateBoxes\" :object=\"getBoxRightEdges(box.data_json.dx, box.data_json.dy, box.data_json.dz, box.label_index, 0.003)\" />\n        <TresLineDashedMaterial\n          :color=\"getLabelColor(box.label_index)\"\n          :wireframe=\"false\"\n          :transparent=\"true\"\n          :opacity=\"0.25\"\n        />\n      </TresMesh>\n    </TresGroup>\n    <TresAmbientLight :intensity=\"1\" />\n    <TresGridHelper\n      ref=\"grid\"\n      :args=\"[10, 10]\"\n      :intensity=\"0.2\"\n      :rotateX=\"Math.PI/2\"\n    />\n    <TresAxesHelper :args=\"[10]\" />\n  </TresCanvas>\n</template>\n\n<script setup>\nimport AnnotationToolViewingMode3DControls from '@/components/DatasetComponent/AnnotationTool/AnnotationToolViewingMode3DControls.vue';\nimport { TresCanvas } from '@tresjs/core';\nimport { OrbitControls, TransformControls } from '@tresjs/cientos';\nimport {\n  ref, reactive, shallowRef, computed, onMounted, onUnmounted, watch, toRefs, nextTick,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport usePCD from '@/composables/annotationTool/usePCD.js';\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport * as THREE from 'three';\nimport gsap from 'gsap';\nimport { v4 as uuidv4 } from 'uuid';\nimport useColorParser from '@/composables/useColorParser.js';\nimport { Line2 } from 'three/examples/jsm/lines/Line2.js';\nimport { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js';\nimport { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js';\n\nconst props = defineProps({\n  imageObj: { type: Object, default: () => {} },\n  annotations: { type: Array, default: () => [] },\n  pendingAnnotations: { type: Array, default: () => [] },\n  updatedAnnotations: { type: Array, default: () => [] },\n  annotationCache: { type: Object, default: () => {} },\n  labels: { type: Array, default: () => [] },\n  selectedLabel: { type: Object, default: null },\n  selectedLabels: { type: Object, default: null },\n  selectedAnnotationSets: { type: Array, default: () => [] },\n  isAuditMode: { type: Boolean, default: false },\n  points: { type: Array, default: null },\n  lidar: { type: Array, default: null },\n  currentTool: { type: String, default: null },\n  selectedAnnotationIdentifiers: { type: Array, default: () => [] },\n  showTypes: { type: Object, default: () => {} },\n});\nconst {\n  imageObj,\n  annotations,\n  pendingAnnotations,\n  annotationCache,\n  labels,\n  selectedLabel,\n  selectedLabels,\n  selectedAnnotationSets,\n  isAuditMode,\n  points,\n  lidar,\n  currentTool,\n  selectedAnnotationIdentifiers,\n  showTypes,\n} = toRefs(props);\n\nconst emit = defineEmits(['update:updatedAnnotations', 'create-annotation', 'update:selectedAnnotationIdentifiers']);\n\nconst {\n  pointArray,\n  pcdAnnotations,\n  parsePCDFile,\n  parsePCDFileAsPointsBuffer,\n  setPointsMaterial,\n  cloneLidarPointsBuffer,\n  clonePcdPointsBuffer,\n} = usePCD();\n\nconst {\n  parseColor,\n} = useColorParser();\n\nconst gl = reactive({\n  clearColor: '#2B3846',\n  shadows: true,\n  alpha: false,\n  shadowMapType: THREE.BasicShadowMap,\n  outputEncoding: THREE.SRGBColorSpace,\n  toneMapping: THREE.NoToneMapping,\n});\n\nconst canvas = ref(null);\nconst grid = ref(null);\nconst cameraPerspective = shallowRef(null);\nconst cameraOrthographic = shallowRef(null);\nconst controls = ref(null);\nconst transformControls = ref(null);\nconst scene = ref(null);\nconst renderer = ref(null);\nconst raycaster = ref(null);\nconst cameraType = ref('perspective');\nconst cameraPerspectivePosition = ref([-5, 5, 5]);\nconst cameraOrthographicPosition = ref([-10, 0, 0]);\nconst upDirection = [0, 0, 1];\nconst lookAt = ref([0, 0, 0]);\nconst pointMeshGroup = ref(null);\nconst transformObject = ref(null);\nconst transformMode = ref('translate');\nconst transformEnabled = ref(false);\nconst selectedObjects = ref({\n  boxes: [],\n});\n\nconst boxRefs = shallowRef([]);\nconst boxRefsFn = (object, boxIndex, box) => {\n  if (object) {\n    object.userData.annotation = box;\n    boxRefs.value[boxIndex] = object;\n  } else {\n    boxRefs.value.splice(boxIndex, 1);\n  }\n};\nconst invalidateBoxes = ref(false);\n\nconst currentCamera = computed(() => {\n  if (cameraType.value === 'perspective') {\n    return cameraPerspective.value;\n  } else if (cameraType.value === 'orthographic') {\n    return cameraOrthographic.value;\n  }\n  return cameraPerspective.value;\n});\n\nconst boxes3d = computed(() => [\n  ...annotations.value.filter((anno) => {\n    const isLabelSelected = !selectedLabels.value || selectedLabels.value?.includes(anno.label_index);\n    const isAnnotationSetSelected = !selectedAnnotationSets.value || selectedAnnotationSets.value?.includes(anno.annotation_set_id);\n    return anno.type === \"3dbox\" && isLabelSelected && (isAnnotationSetSelected || isAuditMode.value);\n  }),\n  ...pendingAnnotations.value.filter((anno) => anno.type === \"3dbox\" && anno.image_id === imageObj.value?.id),\n]);\n\nfunction processLidar(lidarToProcess) {\n  if (!lidarToProcess) return [];\n\n  return lidarToProcess.map((item) => {\n    // Create a fresh copy of the lidar data\n    const clonedItem = {\n      annotation: item.annotation,\n      // Make a deep copy of the original data\n      pointsBuffer: cloneLidarPointsBuffer(item.positions, item.colors),\n    };\n    return clonedItem;\n  });\n}\n\n// Add a computed property to create fresh copies of pcd data. Needed because tres.js clears the geometry when disposed.\n// Remove if tres version updated\nfunction processPcd(pcdToProcess) {\n  if (!pcdToProcess) return [];\n\n  return pcdToProcess.map((item) => {\n    // Create a fresh copy of the points data\n    const clonedItem = {\n      annotation: item.annotation,\n      // Make a deep copy of the original data\n      pointsBuffer: clonePcdPointsBuffer(item.positions, item.colors),\n    };\n    return clonedItem;\n  });\n}\n\nwatch(labels, () => {\n  deselectAllBoxes();\n  invalidateBoxes.value = true;\n  nextTick(() => {\n    invalidateBoxes.value = false;\n  });\n});\n\nwatch(annotations, async (newAnnotations) => {\n  if (newAnnotations) {\n    pcdAnnotations.value = newAnnotations.filter((anno) => anno.type === \"pcd\");\n  }\n});\n\nwatch(pcdAnnotations, async () => {\n  getPointArray();\n});\n\nwatch(currentTool, async (newTool) => {\n  if (['translate-object', 'scale-object'].includes(currentTool.value)) {\n    if (transformEnabled.value && transformObject.value) {\n      if (currentTool.value === 'translate-object') transformMode.value = 'translate';\n      if (currentTool.value === 'scale-object') transformMode.value = 'scale';\n    }\n    if (selectedObjects.value.boxes.length > 0) {\n      const selectedBox = boxRefs.value.find((boxRef) => boxRef.userData.selected);\n      if (selectedBox) {\n        transformObject.value = selectedBox;\n        transformEnabled.value = true;\n      }\n    }\n  } else {\n    transformEnabled.value = false;\n    transformObject.value = null;\n  }\n});\n\nwatch(imageObj, (newImageObj) => {\n  transformEnabled.value = false;\n  transformObject.value = null;\n});\n\nwatch(selectedAnnotationIdentifiers, () => {\n  selectedObjects.value.boxes = selectedObjects.value.boxes.filter((selectedBox) => selectedAnnotationIdentifiers.value.includes(selectedBox.id));\n  updateBoxSelection();\n});\n\nonMounted(async () => {\n  window.addEventListener('keyup', handleKeyEvent);\n\n  renderer.value = canvas.value.context.renderer.value;\n  renderer.value.setPixelRatio(window.devicePixelRatio);\n  scene.value = canvas.value.context.scene.value;\n  raycaster.value = canvas.value.context.raycaster.value;\n  pcdAnnotations.value = annotations.value.filter((anno) => anno.type === \"pcd\");\n  getPointArray();\n\n  enableCanvasClick();\n});\n\nonUnmounted(() => {\n  window.removeEventListener('keyup', handleKeyEvent);\n});\n\nfunction handleKeyEvent(event) {\n  if (event.key === 'Delete') {\n    deleteObjects();\n  }\n}\n\nasync function getPointArray() {\n  // Reset point array for each annotation\n  pointArray.value = [];\n  if (!points.value && pcdAnnotations.value.length > 0) {\n    for (const annotation of pcdAnnotations.value) {\n      if (annotation.polygon !== \"\") {\n        // Convert polygon to ArrayBuffer\n        const textEncoder = new TextEncoder();\n        const arrayBuffer = textEncoder.encode(annotation.polygon).buffer;\n        annotation.data = arrayBuffer;\n        // Process points buffer and material\n        const pointsBuffer = shallowRef(null);\n        pointsBuffer.value = parsePCDFileAsPointsBuffer(annotation.data);\n        setPointsMaterial(pointsBuffer.value.material);\n        // Add annotation and pointsBuffer to pointArray\n        pointArray.value.push({\n          annotation,\n          pointsBuffer,\n        });\n      } else {\n        const dataConnect = new DatastoreConnect();\n        const arrayBuffer = await dataConnect.getAnnotationFile(annotation.id, 'arrayBuffer');\n        if (arrayBuffer) {\n          annotation.data = arrayBuffer;\n          // Process points buffer and material\n          const pointsBuffer = shallowRef(null);\n          pointsBuffer.value = parsePCDFileAsPointsBuffer(annotation.data);\n          setPointsMaterial(pointsBuffer.value.material);\n          // Add annotation and pointsBuffer to pointArray\n          pointArray.value.push({\n            annotation,\n            pointsBuffer,\n          });\n        }\n      }\n    }\n  } else {\n    pointArray.value = [];\n  }\n}\n\nfunction handleBoxClicked(box, el, intersection, pointerEvent) {\n  if (currentTool.value === '3d-pointer') {\n    if (el.object.geometry.type === 'BoxGeometry') {\n      selectBox(el.object, box);\n    }\n  }\n\n  if (['translate-object', 'scale-object'].includes(currentTool.value)) {\n    if (currentTool.value === 'translate-object') transformMode.value = 'translate';\n    if (currentTool.value === 'scale-object') transformMode.value = 'scale';\n\n    deselectAllBoxes();\n    selectBox(el.object, box);\n    transformObject.value = el.object;\n    transformEnabled.value = true;\n  }\n\n  if (currentTool.value === '3d-edit-label') {\n    el.object.userData.annotation.label_index = selectedLabel.value.index;\n    const material = el.object.material.clone();\n    material.color.set(getLabelColor(selectedLabel.value?.index));\n\n    el.object.material = material;\n    const lineMaterial = el.object.children[0].material.clone();\n    lineMaterial.color.set(getLabelColor(selectedLabel.value?.index));\n    el.object.children[0].material = lineMaterial;\n    emit('update:updatedAnnotations', JSON.parse(JSON.stringify(annotations.value)));\n  }\n}\n\n// Handle point colors\nconst { map: labelColorMap } = useAnnotationColorMap({ items: labels, key: 'index' });\nfunction getLabelColor(index) {\n  if (index !== undefined && index !== null) {\n    const targetLabel = labels.value.find((e) => e.index === index);\n    if (targetLabel && targetLabel.color) {\n      return parseColor(targetLabel.color).slice(0, -2);\n    } else if (labelColorMap.value[index]) {\n      return labelColorMap.value[index];\n    }\n  }\n  return '#250E81';\n}\n\nfunction getBoxTopEdges(dx, dy, dz, label, lineWidth = 0.001) {\n  const vertices = [\n    // Front face edges\n    [-dx / 2, -dy / 2, dz / 2],\n    [dx / 2, -dy / 2, dz / 2],\n    [dx / 2, dy / 2, dz / 2],\n    [-dx / 2, dy / 2, dz / 2],\n    [-dx / 2, -dy / 2, dz / 2],\n  ];\n\n  const lineGeometry = new LineGeometry();\n  lineGeometry.setPositions(vertices.flat());\n\n  const lineMaterial = new LineMaterial({\n    color: getLabelColor(label),\n    linewidth: lineWidth,\n  });\n\n  const line = new Line2(lineGeometry, lineMaterial);\n  return line;\n}\n\nfunction getBoxBottomEdges(dx, dy, dz, label, lineWidth = 0.001) {\n  const vertices = [\n    // Front face edges\n    [-dx / 2, -dy / 2, -dz / 2],\n    [dx / 2, -dy / 2, -dz / 2],\n    [dx / 2, dy / 2, -dz / 2],\n    [-dx / 2, dy / 2, -dz / 2],\n    [-dx / 2, -dy / 2, -dz / 2],\n  ];\n\n  const lineGeometry = new LineGeometry();\n  lineGeometry.setPositions(vertices.flat());\n\n  const lineMaterial = new LineMaterial({\n    color: getLabelColor(label),\n    linewidth: lineWidth,\n  });\n\n  const line = new Line2(lineGeometry, lineMaterial);\n  return line;\n}\n\nfunction getBoxLeftEdges(dx, dy, dz, label, lineWidth = 0.001) {\n  const vertices = [\n    // Front face edges\n    [-dx / 2, dy / 2, -dz / 2],\n    [dx / 2, dy / 2, -dz / 2],\n    [dx / 2, dy / 2, dz / 2],\n    [-dx / 2, dy / 2, dz / 2],\n    [-dx / 2, dy / 2, -dz / 2],\n  ];\n\n  const lineGeometry = new LineGeometry();\n  lineGeometry.setPositions(vertices.flat());\n\n  const lineMaterial = new LineMaterial({\n    color: getLabelColor(label),\n    linewidth: lineWidth,\n  });\n\n  const line = new Line2(lineGeometry, lineMaterial);\n  return line;\n}\n\nfunction getBoxRightEdges(dx, dy, dz, label, lineWidth = 0.001) {\n  const vertices = [\n    // Front face edges\n    [-dx / 2, -dy / 2, -dz / 2],\n    [dx / 2, -dy / 2, -dz / 2],\n    [dx / 2, -dy / 2, dz / 2],\n    [-dx / 2, -dy / 2, dz / 2],\n    [-dx / 2, -dy / 2, -dz / 2],\n  ];\n\n  const lineGeometry = new LineGeometry();\n  lineGeometry.setPositions(vertices.flat());\n\n  const lineMaterial = new LineMaterial({\n    color: getLabelColor(label),\n    linewidth: lineWidth,\n  });\n\n  const line = new Line2(lineGeometry, lineMaterial);\n  return line;\n}\n\nasync function handleTopView() {\n  controls.value.value.enableDamping = false;\n  controls.value.value.enabled = false;\n  gsap.to(currentCamera.value.position, {\n    duration: 1,\n    x: 0,\n    y: 0,\n    z: 20,\n    ease: 'power3.out',\n    onComplete: () => {\n      controls.value.value.enableDamping = true;\n      controls.value.value.enabled = true;\n    },\n  });\n  gsap.to(currentCamera.value.up, {\n    delay: 0.1,\n    duration: 1,\n    x: 1,\n    y: 0,\n    z: 0,\n    ease: 'power3.out',\n  });\n  gsap.to(controls.value.value.target, {\n    delay: 0.1,\n    duration: 1,\n    x: 0,\n    y: 0,\n    z: 0,\n    ease: 'power3.out',\n  });\n}\n\nasync function handleFrontView() {\n  controls.value.value.enableDamping = false;\n  controls.value.value.enabled = false;\n  gsap.to(currentCamera.value.position, {\n    delay: 0.1,\n    duration: 1,\n    x: -10,\n    y: 0,\n    z: 0,\n    ease: 'power3.out',\n    onComplete: () => {\n      controls.value.value.enableDamping = true;\n      controls.value.value.enabled = true;\n    },\n  });\n  gsap.to(currentCamera.value.up, {\n    delay: 0.1,\n    duration: 1,\n    x: 0,\n    y: 0,\n    z: 1,\n    ease: 'power3.out',\n  });\n  gsap.to(controls.value.value.target, {\n    delay: 0.1,\n    duration: 1,\n    x: 0,\n    y: 0,\n    z: 0,\n    ease: 'power3.out',\n  });\n}\n\nasync function switchToPerspectiveCamera() {\n  const currentUp = cameraOrthographic.value.up.clone();\n  cameraOrthographicPosition.value = cameraOrthographic.value.position.clone();\n  cameraPerspectivePosition.value = cameraOrthographicPosition.value;\n  cameraPerspectivePosition.value = cameraOrthographicPosition.value;\n\n  // Switch camera type\n  cameraType.value = 'perspective';\n  await nextTick();\n\n  cameraPerspective.value.up = currentUp;\n  cameraPerspective.value.updateProjectionMatrix();\n\n  controls.value.value.object = cameraPerspective.value;\n  controls.value.value.update();\n}\n\nasync function switchToOrthographicCamera() {\n  const currentUp = cameraPerspective.value.up.clone();\n  cameraPerspectivePosition.value = cameraPerspective.value.position.clone();\n  cameraOrthographicPosition.value = cameraPerspectivePosition.value;\n  // Get matching perspective to orthographic zoom\n  const distance = cameraPerspective.value.position.distanceTo(controls.value.value.target);\n  const halfWidth = frustumWidthAtDistance(cameraPerspective.value, distance) / 2;\n  const halfHeight = frustumHeightAtDistance(cameraPerspective.value, distance) / 2;\n\n  // Switch camera type\n  cameraType.value = 'orthographic';\n  await nextTick();\n\n  // Set matching perspective to orthographic zoom\n  cameraOrthographic.value.zoom = 1;\n  cameraOrthographic.value.top = halfHeight;\n  cameraOrthographic.value.bottom = -halfHeight;\n  cameraOrthographic.value.left = -halfWidth;\n  cameraOrthographic.value.right = halfWidth;\n  cameraOrthographic.value.up = currentUp;\n  cameraOrthographic.value.updateProjectionMatrix();\n\n  controls.value.value.object = cameraOrthographic.value;\n  controls.value.value.update();\n}\n\nfunction frustumHeightAtDistance(camera, distance) {\n  const vFov = (camera.fov * Math.PI) / 180;\n  return Math.tan(vFov / 2) * distance * 2;\n}\n\nfunction frustumWidthAtDistance(camera, distance) {\n  return frustumHeightAtDistance(camera, distance) * camera.aspect;\n}\n\nasync function handleTransformMouseUp(object) {\n  const newAnnotations = JSON.parse(JSON.stringify(annotations.value));\n  const transformAnnotation = newAnnotations.find((anno) => anno.id === object.userData.annotation.id);\n\n  transformAnnotation.data_json.x = object.position.x;\n  transformAnnotation.data_json.y = object.position.y;\n  transformAnnotation.data_json.z = object.position.z;\n  transformAnnotation.data_json.dx *= object.scale.x;\n  transformAnnotation.data_json.dy *= object.scale.y;\n  transformAnnotation.data_json.dz *= object.scale.z;\n  object.scale.set(1, 1, 1);\n\n  emit('update:updatedAnnotations', JSON.parse(JSON.stringify(newAnnotations)));\n\n  invalidateBoxes.value = true;\n  nextTick(() => {\n    invalidateBoxes.value = false;\n  });\n}\n\nfunction handleCanvasClick(event) {\n  if (currentTool.value === '3d-pointer') {\n    // Deselect currently selected boxes\n    const intersects = raycaster.value.intersectObjects(scene.value.children);\n    const boxIntersects = intersects.filter((i) => i.object.type === 'Mesh' && i.object.geometry.type === 'BoxGeometry');\n    if (boxIntersects.length === 0) {\n      deselectAllBoxes();\n    }\n  }\n\n  if (currentTool.value === '3d-box') {\n    const intersects = raycaster.value.intersectObjects(scene.value.children);\n    const gridIntersects = intersects.filter((i) => i.object.type === 'GridHelper');\n\n    if (gridIntersects.length > 0 && selectedLabel.value) {\n      console.log(selectedLabel.value);\n      // Create new box at average of grid intersects\n      const new3DBox = {\n        id: uuidv4(),\n        label_name: selectedLabel.value.name,\n        label_index: selectedLabel.value.index,\n        label_id: selectedLabel.value.id,\n        type: \"3dbox\",\n        x: 0,\n        y: 0,\n        w: 0,\n        h: 0,\n        score: 1,\n        data_json: {\n          dx: 0.5,\n          dy: 0.5,\n          dz: 0.5,\n          id: uuidv4(),\n          label_name: selectedLabel.value.name,\n          label_index: selectedLabel.value.index,\n          x: (gridIntersects.map((i) => i.point.x).reduce((a, c) => a + c, 0)) / gridIntersects.length,\n          y: (gridIntersects.map((i) => i.point.y).reduce((a, c) => a + c, 0)) / gridIntersects.length,\n          z: 0,\n        },\n        image_id: imageObj.value.id,\n      };\n      emit('create-annotation', new3DBox);\n\n      // Rerenders the boxes\n      invalidateBoxes.value = true;\n      nextTick(() => {\n        invalidateBoxes.value = false;\n      });\n    }\n  }\n}\n\nfunction disableCanvasClick() {\n  const canvasEl = renderer.value.domElement;\n  canvasEl.removeEventListener('click', handleCanvasClick);\n}\n\nfunction enableCanvasClick() {\n  const canvasEl = renderer.value.domElement;\n  canvasEl.addEventListener('click', handleCanvasClick);\n}\n\nfunction handleBoxPointerEnter(el) {\n  if (['3d-pointer', '3d-edit-label', 'translate-object', 'scale-object'].includes(currentTool.value) && !el.object.userData.selected) {\n    const material = el.object.material.clone();\n    material.opacity = 0.375;\n    el.object.material = material;\n  }\n}\n\nfunction handleBoxPointerLeave(object) {\n  if (['3d-pointer', '3d-edit-label', 'translate-object', 'scale-object'].includes(currentTool.value) && !object.userData.selected) {\n    const material = object.material.clone();\n    material.opacity = 0.25;\n    object.material = material;\n  }\n}\n\nfunction selectBox(object, box) {\n  selectedObjects.value.boxes.push(box);\n  emit('update:selectedAnnotationIdentifiers', selectedObjects.value.boxes.map((box) => box.id));\n  object.userData.selected = true;\n  const material = object.material.clone();\n  material.opacity = 0.5;\n  object.material = material;\n}\n\nfunction deselectAllBoxes(object, box) {\n  boxRefs.value.forEach((o) => {\n    if (o.userData.selected) {\n      o.userData.selected = false;\n      const material = o.material.clone();\n      material.opacity = 0.25;\n      o.material = material;\n    }\n  });\n  selectedObjects.value.boxes = [];\n  emit('update:selectedAnnotationIdentifiers', selectedObjects.value.boxes.map((box) => box.id));\n}\n\nfunction updateBoxSelection() {\n  boxRefs.value.forEach((o) => {\n    if (selectedAnnotationIdentifiers.value.includes(o.userData.annotation.id)) {\n      o.userData.selected = true;\n      if (o.material) {\n        const material = o.material.clone();\n        material.opacity = 0.5;\n        o.material = material;\n      }\n    } else {\n      o.userData.selected = false;\n      if (o.material) {\n        const material = o.material.clone();\n        material.opacity = 0.25;\n        o.material = material;\n      }\n    }\n  });\n}\n\nfunction deleteObjects() {\n  deleteSelectedBoxes(selectedObjects.value.boxes);\n}\n\nfunction deleteSelectedBoxes(selectedBoxes) {\n  const updatedAnnotations = annotations.value.filter((box) => !selectedBoxes.map((selectedBox) => selectedBox.id).includes(box.id));\n  emit('update:updatedAnnotations', JSON.parse(JSON.stringify(updatedAnnotations)));\n\n  // Rerenders the boxes\n  invalidateBoxes.value = true;\n  nextTick(() => {\n    invalidateBoxes.value = false;\n  });\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import script from \"./PointCloudViewer.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./PointCloudViewer.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <JsonViewItem\n    :class=\"[{ 'root-item': true, dark: colorScheme === 'dark' }]\"\n    :data=\"parsed\"\n    :maxDepth=\"maxDepth\"\n    :canSelect=\"hasSelectedListener\"\n    :loading=\"loading\"\n    :selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n    :itemId=\"itemId\"\n    :removable=\"removable\"\n    @update:selected=\"itemSelected\"\n    @open-in-full=\"$emit('open-in-full')\"\n    @opened=\"$emit('opened')\"\n    @selected=\"$emit('selected')\"\n    @remove-annotation=\"(params) => $emit('remove-annotation', params)\"\n  />\n</template>\n\n<script>\nimport JsonViewItem from './JsonViewItem.vue';\n\nconst JsonDataType = {\n  ARRAY: 'array',\n  VALUE: 'value',\n  OBJECT: 'object',\n};\n\nconst ColorMode = {\n  LIGHT: 'light',\n  DARK: 'dark',\n};\n\nexport default {\n  name: 'JsonView',\n  components: { JsonViewItem },\n  props: {\n    data: {\n      type: Object,\n      required: true,\n    },\n    rootKey: {\n      type: String,\n      required: false,\n      default: 'root',\n    },\n    maxDepth: {\n      type: Number,\n      required: false,\n      default: 1,\n    },\n    colorScheme: {\n      type: String,\n      required: false,\n      default: ColorMode.LIGHT,\n    },\n    loading: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    selectedAnnotationIdentifiers: {\n      type: Object,\n      default: null,\n    },\n    itemId: {\n      type: [Number, String],\n      default: null,\n    },\n    removable: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: ['update:selected', 'opened', 'open-in-full', 'selected', 'remove-annotation'],\n  computed: {\n    parsed() {\n      if (typeof this.data === 'object') {\n        return this.build(this.rootKey, { ...this.data }, 0, '', true);\n      }\n      return {\n        id: this.data.id,\n        key: this.rootKey,\n        type: JsonDataType.VALUE,\n        path: '',\n        depth: 0,\n        value: this.data,\n      };\n    },\n    hasSelectedListener() {\n      return !!this.$attrs.onSelected;\n    },\n  },\n  methods: {\n    build(key, val, depth, path, includeKey) {\n      if (this.isObject(val)) {\n        // Build Object\n        const children = [];\n        for (const [childKey, childValue] of Object.entries(val)) {\n          children.push(\n            this.build(\n              childKey,\n              childValue,\n              depth + 1,\n              includeKey ? `${path}${key}.` : `${path}`,\n              true,\n            ),\n          );\n        }\n        return {\n          key,\n          type: JsonDataType.OBJECT,\n          depth,\n          path,\n          length: children.length,\n          children,\n        };\n      } else if (this.isArray(val)) {\n        // Build Array\n        const children = [];\n        for (let i = 0; i < val.length; i++) {\n          children.push(\n            this.build(\n              i.toString(),\n              val[i],\n              depth + 1,\n              includeKey ? `${path}${key}[${i}].` : `${path}`,\n              false,\n            ),\n          );\n        }\n        return {\n          key,\n          type: JsonDataType.ARRAY,\n          depth,\n          path,\n          length: children.length,\n          children,\n        };\n      } else {\n        // Build Value\n        return {\n          key,\n          type: JsonDataType.VALUE,\n          path: includeKey ? path + key : path.slice(0, -1),\n          depth,\n          value: val,\n        };\n      }\n    },\n    isObject: (val) => typeof val === 'object' && val !== null && !Array.isArray(val),\n    isArray: (val) => Array.isArray(val),\n    itemSelected(data) {\n      this.$emit('update:selected', data);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.root-item {\n\n  --vjc-key-color: $color-primary;\n  --vjc-arrow-size: 6px;\n  --vjc-arrow-color: #444;\n  --vjc-hover-color: rgba(116, 115, 115, 0.2);\n\n  margin-left: 0;\n  height: 100%;\n}\n\n.root-item.dark {\n  --vjc-key-color: #80d8ff;\n  --vjc-valueKey-color: #fdf6e3;\n  --vjc-hover-color: rgba(255, 255, 255, 0.2);\n  --vjc-arrow-color: #fdf6e3;\n}\n\n</style>\n","<template>\n  <div class=\"json-view-item\">\n    <!-- Handle Objects and Arrays-->\n    <div v-if=\"data.type === 'object' || data.type === 'array'\">\n      <div class=\"item-title\" :class=\"{'selected': selectedAnnotationIdentifiers?.includes(itemId)}\">\n        <button\n          class=\"data-key\"\n          :aria-expanded=\"open ? 'true' : 'false'\"\n          :class=\"{'display-none': data.key === ''}\"\n          @click.stop=\"handleOpen\"\n        >\n          <span :class=\"{'chevron-arrow': data.key !== '', opened: open}\" />\n        </button>\n        <span class=\"data-title\" @click.stop=\"handleSelect\">{{ data.key }}</span>\n        <IconButton\n          v-if=\"removable\"\n          class=\"icon\"\n          :icon=\"'delete'\"\n          :width=\"18\"\n          :height=\"18\"\n          @click=\"removeAnnotation\"\n        />\n        <!-- <IconButton\n          v-if=\"data.key.includes('pcd') || data.key.includes('mask') || data.key.includes('radar')\"\n          class=\"icon\"\n          :icon=\"'open_in_full'\"\n          :width=\"18\"\n          :height=\"18\"\n          @click=\"openInFull()\"\n        /> -->\n      </div>\n      <json-view-item\n        v-for=\"child in data.children\"\n        v-show=\"open\"\n        :key=\"getKey(child)\"\n        :data=\"child\"\n        :maxDepth=\"maxDepth\"\n        :canSelect=\"canSelect\"\n        :loading=\"loading\"\n        @update:selected=\"bubbleSelected\"\n      />\n    </div>\n    <!-- Handle Leaf Values -->\n    <div\n      v-if=\"data.key === 'raw_file'\"\n      class=\"file-raw scrollbar\"\n      title=\"Copy to Clipboard\"\n      @click=\"copyToClipboard(dataValue)\"\n    >\n      <v-skeleton-loader\n        v-if=\"loading\"\n        type=\"paragraph\"\n        color=\"transparent\"\n        :width=\"'100%'\"\n      />\n      <span v-else><pre>{{ dataValue }}</pre></span>\n    </div>\n    <template v-if=\"data.key === 'segments'\">\n      <div\n        class=\"segment-col\"\n        title=\"Copy to Clipboard\"\n        @click=\"copyToClipboard(JSON.stringify(dataValue))\"\n      >\n        <span class=\"segment-key\">{{ data.key }}</span>\n        <span class=\"segment-raw\">{{ dataValue }}</span>\n      </div>\n    </template>\n    <div\n      v-if=\"data.key !== 'raw_file' && data.key !== 'segments' && data.type === 'value'\"\n      :class=\"{'value-key' : true, 'can-select': canSelect}\"\n      :role=\"canSelect ? 'button' : undefined\"\n      :tabindex=\"canSelect ? '0' : undefined\"\n      @click=\"emitSelect(data)\"\n      @keyup.enter=\"emitSelect(data)\"\n      @keyup.space=\"emitSelect(data)\"\n    >\n      <span class=\"value-key\">{{ data.key }}</span>\n      <span class=\"value-item\" :title=\"dataValue\" :style=\"getValueStyle(data.value)\">{{ dataValue }}</span>\n    </div>\n  </div>\n</template>\n\n<script>\n\nimport IconButton from '@/components/IconButton.vue';\n\nconst JsonDataType = {\n  ARRAY: 'array',\n  VALUE: 'value',\n  OBJECT: 'object',\n};\n\nconst ColorMode = {\n  LIGHT: 'light',\n  DARK: 'dark',\n};\n\nexport default {\n  name: 'JsonViewItem',\n  components: {\n    IconButton,\n  },\n  props: {\n    data: {\n      required: true,\n      type: Object,\n    },\n    maxDepth: {\n      type: Number,\n      required: false,\n      default: 1,\n    },\n    canSelect: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    loading: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    selectedAnnotationIdentifiers: {\n      type: Object,\n      default: null,\n    },\n    itemId: {\n      type: [Number, String],\n      default: 0,\n    },\n    removable: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: ['update:selected', 'opened', 'open-in-full', 'selected', 'remove-annotation'],\n  data() {\n    return {\n      open: false,\n      selected: false,\n    };\n  },\n  computed: {\n    lengthString() {\n      switch (this.data.type) {\n      case JsonDataType.ARRAY:\n        return this.data.length === 1\n          ? `${this.data.length} element`\n          : `${this.data.length} elements`;\n      case JsonDataType.OBJECT:\n        return this.data.length === 1\n          ? `${this.data.length} property`\n          : `${this.data.length} properties`;\n      default:\n        return '';\n      }\n    },\n    dataValue() {\n      if (this.data.key === 'raw_file' || this.data.key === 'segments') {\n        return this.data.value;\n      }\n      if (typeof this.data.value === 'string') {\n        return JSON.stringify(this.data.value).replace(/['\"]+/g, '');\n      } else if (!Number.isNaN(this.data.value)) {\n        if (!Number.isInteger(this.data.value)) {\n          return Number(this.data.value).toFixed(3);\n        } else {\n          return Number(this.data.value);\n        }\n      } else if (typeof this.data.value === 'undefined') {\n        return 'undefined';\n      }\n      return '';\n    },\n  },\n  methods: {\n    removeAnnotation() {\n      this.$emit('remove-annotation', this.itemId);\n    },\n    emitSelect(data) {\n      this.$emit('update:selected', {\n        key: data.key,\n        value: data.type === JsonDataType.VALUE ? data.value : undefined,\n        path: data.path,\n      });\n    },\n    bubbleSelected(data) {\n      this.$emit('update:selected', data);\n    },\n    getKey(value) {\n      if (!Number.isNaN(value.key)) {\n        return `${value.key}:`;\n      } else {\n        return `\"${value.key}\":`;\n      }\n    },\n    getValueStyle(value) {\n      switch (typeof value) {\n      case 'string':\n        return { color: 'var(--vjc-string-color)' };\n      case 'number':\n        return { color: 'var(--vjc-number-color)' };\n      case 'boolean':\n        return { color: 'var(--vjc-boolean-color)' };\n      case 'object':\n        return { color: 'var(--vjc-null-color)' };\n      case 'undefined':\n        return { color: 'var(--vjc-null-color)' };\n      default:\n        return { color: 'var(--vjc-valueKey-color)' };\n      }\n    },\n    async copyToClipboard(str) {\n      try {\n        if (navigator?.clipboard?.writeText) {\n          await navigator.clipboard.writeText(str.replace(/['\"]+/g, ''));\n        }\n      } catch (err) {\n        console.error(err);\n      }\n    },\n    openInFull(data) {\n      this.$emit('open-in-full', data);\n    },\n    handleOpen() {\n      this.open = !this.open;\n      if (this.open) {\n        this.$emit('opened');\n      }\n    },\n    handleSelect() {\n      this.selected = !this.selected;\n      this.$emit('selected');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.json-view-item {\n  margin-left: 10px;\n  margin-bottom: 5px;\n}\n\n.item-title {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  font-weight: 600;\n  height: 30px;\n\n  &:hover {\n    background-color: var(--vjc-hover-color);\n  }\n  &.selected {\n    background-color: var(--vjc-hover-color);\n  }\n\n  &:hover {\n    .icon {\n      visibility: visible;\n    }\n  }\n}\n\n.icon {\n  visibility: hidden;\n  margin-right: 15px;\n}\n\n.value-key {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  color: var(--vjc-valueKey-color);\n  font-weight: 600;\n  margin-left: 5px;\n  border-radius: 2px;\n  padding: 5px 5px 5px 5px;\n  font-size: 0.9rem;\n  height: 20px;\n\n  &.can-select {\n    cursor: pointer;\n\n    &:hover {\n      background-color: rgba(0, 0, 0, 0.08);\n    }\n\n    &:focus {\n      outline: 2px solid var(--vjc-hover-color);\n    }\n  }\n}\n\n.value-key:hover {\n  background-color: tint-color($color-primary-100, 70%);\n}\n\n.file-raw {\n  height: 150px;\n  overflow-y: scroll;\n  span{\n    height: 100%;\n  }\n  pre {\n    font-size: 0.8rem;\n    padding: 4px;\n    border-radius: 5px;\n    border: 1px solid transparent;\n    white-space: pre-wrap;\n    font-family: 'Courier New', monospace !important;\n  }\n}\n\n.file-raw:hover {\n  cursor: copy;\n  pre {\n    border: 1px dashed var(--color-primary-300);\n    background-color: tint-color($color-primary-100, 70%);\n  }\n}\n\nspan.value-key {\n  width: 90px;\n  min-width: 90px;\n}\n\nspan.value-item {\n  width: 100%;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.segment-col {\n  display: flex;\n  flex-direction: column;\n  padding-left: 10px;\n  font-weight: 600;\n  font-size: 0.9rem;\n  height: fit-content;\n}\n\n.segment-col:hover {\n  cursor: copy;\n  span {\n    background-color: tint-color($color-primary-100, 70%);\n  }\n}\n\n.segment-key {\n  padding-left: 10px;\n}\n\n.segment-raw {\n  height: fit-content;\n  padding-left: 20px;\n  font-weight: 500;\n}\n\n.data-title {\n  width: 100%;\n  cursor: pointer;\n}\n\n.data-key {\n  // Button overrides\n  font-size: 0.9rem;\n  font-family: inherit;\n  border: 0;\n  background-color: transparent;\n  width: fit-content;\n\n  // Normal styles\n  color: var(--vjc-key-color);\n  display: flex;\n  align-items: center;\n  border-radius: 2px;\n  font-weight: 600;\n  cursor: pointer;\n  white-space: nowrap;\n  padding: 5px;\n  margin-left: 10px;\n\n  &::-moz-focus-inner {\n    border: 0;\n  }\n\n  .properties {\n    font-weight: 300;\n    opacity: 0.9;\n    margin-left: 4px;\n    user-select: none;\n  }\n}\n\n.chevron-arrow {\n  flex-shrink: 0;\n  border-right: 2px solid var(--vjc-arrow-color);\n  border-bottom: 2px solid var(--vjc-arrow-color);\n  width: var(--vjc-arrow-size);\n  height: var(--vjc-arrow-size);\n  margin-right: 12px;\n  margin-left: 7px;\n  transform: rotate(-45deg);\n\n  &.opened {\n    margin-top: -3px;\n    transform: rotate(45deg);\n  }\n}\n\n.display-none {\n  display: none\n}\n\n</style>\n","import { render } from \"./JsonViewItem.vue?vue&type=template&id=4f305b82&scoped=true\"\nimport script from \"./JsonViewItem.vue?vue&type=script&lang=js\"\nexport * from \"./JsonViewItem.vue?vue&type=script&lang=js\"\n\nimport \"./JsonViewItem.vue?vue&type=style&index=0&id=4f305b82&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4f305b82\"]])\n\nexport default __exports__","import { render } from \"./JsonView.vue?vue&type=template&id=74595ad4&scoped=true\"\nimport script from \"./JsonView.vue?vue&type=script&lang=js\"\nexport * from \"./JsonView.vue?vue&type=script&lang=js\"\n\nimport \"./JsonView.vue?vue&type=style&index=0&id=74595ad4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-74595ad4\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <Popper\n    v-model:show=\"localShow\"\n    :config=\"popperConfig\"\n    :trigger=\"'click'\"\n    :appendToBody=\"appendToBody\"\n  >\n    <template #trigger>\n      <div\n        class=\"label-color\"\n        :style=\"sizeStyle\"\n        :class=\"{'checkered-background' : (!color || color === '')}\"\n      />\n    </template>\n    <div class=\"color-picker\">\n      <v-color-picker\n        v-model=\"localColor\"\n        :modes=\"['rgb', 'hex']\"\n        flat\n        @click.stop\n      />\n      <div class=\"footer\">\n        <button\n          class=\"button modal-cancel-button\"\n          @click=\"handleCancelClicked\"\n        >\n          Cancel\n        </button>\n        <button\n          class=\"button modal-action-button\"\n          @click=\"handleNewColorPicked\"\n        >\n          Confirm\n        </button>\n      </div>\n    </div>\n  </Popper>\n</template>\n\n<script>\n\nimport Popper from '@/components/Popper.vue';\nimport { detectOverflow } from '@popperjs/core';\nimport useColorParser from '@/composables/useColorParser.js';\n\nconst overflowPadding = 20;\n\nexport default {\n  name: 'ColorPicker',\n  components: {\n    Popper,\n  },\n  props: {\n    placement: {\n      type: String,\n      default: 'right',\n    },\n    offset: {\n      type: Array,\n      default: () => [-4, 4],\n    },\n    flip: {\n      type: Boolean,\n      default: true,\n    },\n    appendToBody: {\n      type: Boolean,\n      default: false,\n    },\n    show: {\n      type: Boolean,\n      default: false,\n    },\n    color: {\n      type: [Number, String],\n      default: null,\n    },\n    width: {\n      type: [Number, String],\n      default: null,\n    },\n    height: {\n      type: [Number, String],\n      default: null,\n    },\n    radius: {\n      type: Number,\n      default: 4,\n    },\n    labelColorMap: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['update:show', 'update:color', 'new-color'],\n  setup() {\n    const {\n      parseColor,\n    } = useColorParser();\n    return {\n      parseColor,\n    };\n  },\n  data() {\n    return {\n      localShow: false,\n      localColor: '#00000000',\n      colorPickerParent: null,\n    };\n  },\n  computed: {\n    body() {\n      return document.body;\n    },\n    sizeStyle() {\n      let width = this.width;\n      let height = this.height;\n      if (typeof this.width === 'number') {\n        width = `${width}px`;\n      }\n      if (typeof this.height === 'number') {\n        height = `${height}px`;\n      }\n      return {\n        width,\n        height,\n        'min-width': width,\n        'min-height': height,\n        'background': this.color ? this.parseColor(this.color) : '#000000',\n        'border-radius': `${this.radius}px`,\n        'border': `0.1px solid grey`,\n      };\n    },\n    detectOverflowModifier() {\n      return {\n        name: 'detectOverflowModifier',\n        enabled: !this.flip,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement === 'right') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.right - overflowPadding}px`;\n          }\n          if (state.placement === 'left') {\n            state.styles.popper.maxWidth = `${state.elements.popper.offsetWidth - overflow.left - overflowPadding}px`;\n          }\n        },\n      };\n    },\n    detectHeightOverflowModifier() {\n      return {\n        name: 'detectHeightOverflowModifier',\n        enabled: true,\n        phase: 'main',\n        requiresIfExists: ['offset'],\n        fn({ state }) {\n          const overflow = detectOverflow(state);\n          if (state.placement.startsWith('bottom')) {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflowPadding}px`;\n          } else if (state.placement.startsWith('left') || state.placement.startsWith('right')) {\n            state.styles.popper.maxHeight = `${state.elements.popper.offsetHeight - overflow.bottom - overflow.top - (overflowPadding * 2)}px`;\n          }\n        },\n      };\n    },\n    popperConfig() {\n      return {\n        placement: this.placement,\n        strategy: 'fixed',\n        modifiers: [\n          this.detectOverflowModifier,\n          this.detectHeightOverflowModifier,\n          {\n            name: 'offset',\n            options: {\n              offset: this.offset,\n            },\n          },\n          {\n            name: 'preventOverflow',\n            options: {\n              padding: overflowPadding,\n            },\n          },\n          {\n            name: 'flip',\n            enabled: this.flip,\n          },\n        ],\n      };\n    },\n  },\n  watch: {\n    localShow(show) {\n      this.$emit('update:show', show);\n    },\n    color: {\n      immediate: true,\n      handler(c) {\n        if (c) {\n          this.localColor = this.parseColor(c);\n        }\n      },\n    },\n    localColor(color) {\n      if (typeof color === 'string') {\n        let colorCode = color.slice(1);\n        if (colorCode.length === 6) {\n          colorCode += 'FF';\n        }\n        this.$emit('update:color', this.hexToUint32(colorCode));\n      }\n    },\n  },\n  methods: {\n    hexToUint32(hexString) {\n      let value = parseInt(hexString, 16);\n      if (Number.isNaN(value)) {\n        throw new Error('Invalid hexadecimal string');\n      }\n\n      // Ensure the value is within the 32-bit unsigned integer range\n      if (value < 0) {\n        value += 2 ** 32;\n      } else if (value > 0xFFFFFFFF) {\n        value %= (2 ** 32);\n      }\n      return value;\n    },\n    uint32ToHex(uint32Value) {\n      if (typeof uint32Value !== 'number' || uint32Value < 0 || uint32Value > 0xFFFFFFFF || !Number.isInteger(uint32Value)) {\n        throw new TypeError('Input must be a valid 32-bit unsigned integer');\n      }\n\n      // Convert the number to a hexadecimal string\n      const hexString = uint32Value.toString(16);\n\n      // Pad the string with leading zeros to ensure it has 8 characters\n      return `#${hexString.padStart(8, '0').toUpperCase()}`;\n    },\n    handleCancelClicked() {\n      this.localColor = null;\n      this.$emit('new-color', null);\n      this.localShow = false;\n    },\n    handleNewColorPicked() {\n      if (typeof this.localColor === 'string') {\n        let colorCode = this.localColor.slice(1);\n        if (colorCode.length === 6) {\n          colorCode += 'FF';\n        }\n        if (colorCode.length === 8) {\n          colorCode = colorCode.slice(0, -2);\n          colorCode += 'FF';\n        }\n        this.$emit('new-color', this.hexToUint32(colorCode));\n        this.localShow = false;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.popper {\n  padding: 4px;\n  color: #000000;\n  margin: 0;\n  z-index: 1500;\n}\n\n.checkered-background {\n  background:\n    repeating-conic-gradient(#b5b4b4 0% 25%, transparent 0% 50%)\n      50% / 10px 10px !important;\n}\n\n.color-picker {\n  position: relative;\n}\n\n:deep() {\n  .v-color-picker__controls {\n    height: 220px;\n  }\n}\n\n.footer {\n  position: absolute;\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 2rem;\n  justify-content: flex-end;\n  top: 310px;\n  left: 70px;\n\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n</style>\n","import { render } from \"./ColorPicker.vue?vue&type=template&id=0ff3825e&scoped=true\"\nimport script from \"./ColorPicker.vue?vue&type=script&lang=js\"\nexport * from \"./ColorPicker.vue?vue&type=script&lang=js\"\n\nimport \"./ColorPicker.vue?vue&type=style&index=0&id=0ff3825e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0ff3825e\"]])\n\nexport default __exports__","<template>\n  <div class=\"utilities\">\n    <div class=\"utilities__buttons\">\n      <slot name=\"utilities-slot\" />\n    </div>\n    <button class=\"dropdown-toggle-all\" @click=\"toggleDropdownAll\"><span>{{ openedDropdowns.length > 0 ? 'Collapse All' : 'Expand All' }}</span></button>\n  </div>\n  <div class=\"json-raw-viewer scrollbar\">\n    <v-expansion-panels v-model=\"openedDropdowns\" multiple>\n      <v-expansion-panel v-if=\"imageObj\" value=\"image\" class=\"panel\">\n        <v-expansion-panel-title class=\"panel__title\" title=\"Image\">\n          <div class=\"panel__title-text\">\n            <span>Image</span>\n            <!-- <IconButton\n              v-model=\"internalShowTypes['image']\"\n              aria-label=\"Toggle Visibility\"\n              title=\"Toggle Visibility\"\n              class=\"ms-2\"\n              :icon=\"'visibility_off'\"\n              :iconActive=\"'visibility'\"\n              :width=\"21\"\n              :height=\"21\"\n              :type=\"'toggle-icon'\"\n              :showHover=\"true\"\n            /> -->\n          </div>\n        </v-expansion-panel-title>\n        <v-expansion-panel-text class=\"panel__text\">\n          <div class=\"row panel__item\">\n            <div class=\"col-12 settings__control-group\">\n              <ImageDetails :imageObj=\"imageObj\" />\n            </div>\n          </div>\n        </v-expansion-panel-text>\n      </v-expansion-panel>\n      <v-expansion-panel value=\"annotation-sets\" class=\"panel\">\n        <v-expansion-panel-title class=\"panel__title\" title=\"Annotation Sets\">\n          <div class=\"panel__title-text\">\n            <span>Annotation Sets</span>\n            <label for=\"set\" class=\"panel__radio-label\" title=\"Color Annotations by Sets\">\n              <input\n                id=\"set\"\n                v-model=\"displayColorBy\"\n                type=\"radio\"\n                value=\"set\"\n                class=\"color-radio set icon\"\n                @click.stop=\"\"\n              >\n              <template v-if=\"!isEditing\">\n                <SVGIcon\n                  v-if=\"displayColorBy === 'set'\"\n                  :iconName=\"'invert_colors'\"\n                  :width=\"'21px'\"\n                  :height=\"'21px'\"\n                  class=\"radio-icon\"\n                  :class=\"{ 'active-icon': displayColorBy==='set' }\"\n                  @click.stop=\"\"\n                />\n                <SVGIcon\n                  v-else\n                  :iconName=\"'invert_colors_off'\"\n                  :width=\"'21px'\"\n                  :height=\"'21px'\"\n                  @click.stop=\"\"\n                />\n              </template>\n            </label>\n          </div>\n        </v-expansion-panel-title>\n        <v-expansion-panel-text class=\"panel__text chkbox-list\">\n          <v-checkbox\n            v-for=\"s in annotationSets\"\n            :key=\"`set-checkbox-${s.id}`\"\n            v-model=\"internalSelectedAnnotationSets\"\n            :value=\"s['id']\"\n            :hide-details=\"true\"\n            :disabled=\"Boolean(fixedAnnotationSet)\"\n            density=\"compact\"\n            class=\"chkbx-li\"\n          >\n            <template #label>\n              <div class=\"annset-legend-color\" :style=\"{ background: annotationSetColorMap[s.id] }\" />\n              <div class=\"check-box-text\">\n                {{ s['name'] }}\n              </div>\n            </template>\n            <template #append>\n              <IconButton\n                aria-label=\"Toggle Visibility\"\n                title=\"Edit Annotations\"\n                :icon=\"'edit'\"\n                :width=\"22\"\n                :height=\"22\"\n                :type=\"'click'\"\n                :showHover=\"true\"\n                @click=\"handleEditAnnotations(s)\"\n              />\n            </template>\n          </v-checkbox>\n        </v-expansion-panel-text>\n      </v-expansion-panel>\n      <v-expansion-panel value=\"labels\" class=\"panel\">\n        <v-expansion-panel-title class=\"panel__title\" title=\"Labels\">\n          <div class=\"panel__title-text\">\n            <span>Labels</span>\n            <label for=\"label\" class=\"panel__radio-label\" title=\"Color Annotations by Labels\">\n              <input\n                id=\"label\"\n                v-model=\"displayColorBy\"\n                type=\"radio\"\n                value=\"label\"\n                class=\"color-radio label icon\"\n                @click.stop=\"\"\n              >\n              <template v-if=\"!isEditing\">\n                <SVGIcon\n                  v-if=\"displayColorBy==='label'\"\n                  :iconName=\"'invert_colors'\"\n                  :width=\"'21px'\"\n                  :height=\"'21px'\"\n                  class=\"radio-icon\"\n                  :class=\"{ 'active-icon':displayColorBy==='label' }\"\n                  @click.stop=\"\"\n                />\n                <SVGIcon\n                  v-else\n                  :iconName=\"'invert_colors_off'\"\n                  :width=\"'21px'\"\n                  :height=\"'21px'\"\n                  class=\"radio-icon\"\n                  @click.stop=\"\"\n                />\n              </template>\n            </label>\n          </div>\n        </v-expansion-panel-title>\n        <v-expansion-panel-text class=\"panel__text label-list-wrapper scrollbar\">\n          <ul class=\"label-list\">\n            <li\n              v-for=\"label in labels\"\n              :key=\"`label-checkbox-${label.id}`\"\n              class=\"chkbox-flex-row\"\n              :class=\"{_active: selectedLabelForAudit && selectedLabelForAudit.id === label.id && isEditing,\n                       _hover: true && isEditing,\n                       _pointer: isEditing}\"\n              @click=\"handleLabelListItemClicked(label)\"\n            >\n              <v-checkbox\n                v-model=\"internalSelectedLabels\"\n                :value=\"label.index\"\n                :hide-details=\"true\"\n                density=\"compact\"\n                class=\"chkbx-li label-chkbox\"\n                @click.stop\n              />\n              <div class=\"label-color-name\">\n                <ColorPicker\n                  :color=\"getColor(label)\"\n                  :appendToBody=\"true\"\n                  :width=\"16\"\n                  :height=\"16\"\n                  :radius=\"0\"\n                  :offset=\"[-10, 20]\"\n                  @new-color=\"(color) => stopEditingColor(i, label, color)\"\n                />\n                <span class=\"check-box-text\">{{ label.name }}</span>\n              </div>\n            </li>\n          </ul>\n        </v-expansion-panel-text>\n      </v-expansion-panel>\n      <v-expansion-panel value=\"topics\" class=\"panel\">\n        <v-expansion-panel-title class=\"panel__title\" title=\"Topics\">\n          <div class=\"panel__title-text\">\n            <span>Topics {{ listedTopics && listedTopics.length > 0 ? `(${listedTopics.length})` : '' }}</span>\n            <BaseMenu\n              v-if=\"!hideAddTopics\"\n              :placement=\"'bottom-start'\"\n              :offset=\"[0,0]\"\n              :appendToBody=\"true\"\n              trigger=\"hover\"\n            >\n              <template #menu>\n                <div class=\"topic-selector-text scrollbar\">\n                  <div class=\"chkbox-list\">\n                    <v-checkbox\n                      v-for=\"s in ALL_TYPES\"\n                      :key=\"s.key\"\n                      v-model=\"selectedTopics\"\n                      :value=\"s.key\"\n                      :hide-details=\"true\"\n                      density=\"compact\"\n                      class=\"chkbx-li\"\n                      :disabled=\"groupedAnnotations && Object.keys(groupedAnnotations).includes(s.key)\"\n                    >\n                      <template #label>\n                        <div class=\"check-box-text\">\n                          {{ s.display }}\n                        </div>\n                      </template>\n                    </v-checkbox>\n                  </div>\n                </div>\n              </template>\n              <SVGIcon\n                :iconName=\"'add'\"\n                class=\"topic-selector-icon\"\n                :width=\"'22px'\"\n                :height=\"'22px'\"\n                @click.stop=\"\"\n              />\n            </BaseMenu>\n          </div>\n        </v-expansion-panel-title>\n        <v-expansion-panel-text class=\"panel__text nowrap\">\n          <v-expansion-panels v-model=\"openedTopics\" multiple>\n            <v-expansion-panel\n              v-for=\"topic in listedTopics\"\n              :key=\"topic.key\"\n              class=\"panel\"\n              :value=\"topic.key\"\n            >\n              <v-expansion-panel-title class=\"panel__title\" :title=\"topic.display\">\n                <div class=\"panel__title-text topic-title\">\n                  <span>{{ topic.display }}</span>\n                  <div v-if=\"!topic.unknown\">\n                    <IconButton\n                      v-if=\"displayProjection && topic.key in displayProjection\"\n                      :modelValue=\"displayProjection[topic.key]\"\n                      aria-label=\"Toggle 2D Projection\"\n                      title=\"Toggle 2D Projection\"\n                      class=\"ms-2\"\n                      :icon=\"'screen_share'\"\n                      :iconActive=\"'screen_share_filled'\"\n                      :width=\"21\"\n                      :height=\"21\"\n                      :type=\"'toggle-icon'\"\n                      :showHover=\"true\"\n                      @click=\"toggleDisplayProjection(topic.key)\"\n                    />\n                    <IconButton\n                      v-if=\"displayLabelTags && topic.key in displayLabelTags && jsonViewerShowTypes[topic.key]\"\n                      :modelValue=\"displayLabelTags[topic.key]\"\n                      aria-label=\"Toggle Display Labels\"\n                      title=\"Toggle Display Labels\"\n                      class=\"ms-2\"\n                      :icon=\"'tag'\"\n                      :iconActive=\"'tag_filled'\"\n                      :width=\"21\"\n                      :height=\"21\"\n                      :type=\"'toggle-icon'\"\n                      :showHover=\"true\"\n                      @click=\"toggleDisplayLabelTags(topic.key)\"\n                    />\n                    <IconButton\n                      v-model=\"jsonViewerShowTypes[topic.key]\"\n                      aria-label=\"Toggle Visibility\"\n                      title=\"Toggle Visibility\"\n                      class=\"ms-2\"\n                      :icon=\"'visibility_off'\"\n                      :iconActive=\"'visibility'\"\n                      :width=\"21\"\n                      :height=\"21\"\n                      :type=\"'toggle-icon'\"\n                      :showHover=\"true\"\n                    />\n                  </div>\n                </div>\n              </v-expansion-panel-title>\n              <v-expansion-panel-text class=\"panel__text\">\n                <div\n                  v-for=\"annotation in groupedAnnotations[topic.key]\"\n                  :key=\"annotation.id\"\n                  class=\"row panel__item\"\n                >\n                  <div class=\"col-12 settings__control-group\">\n                    <template v-if=\"annotation.type==='pcd' || annotation.type==='radar' || annotation.type==='mask'\">\n                      <div class=\"raw-text\">\n                        <JsonView\n                          :data=\"{ 'raw_file': annotation['raw'] }\"\n                          :rootKey=\"`${annotation.type}_${annotation.id}`\"\n                          :itemId=\"annotation.id\"\n                          :loading=\"loadingRaw\"\n                          :selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n                          @open-in-full=\"openInFull(annotation)\"\n                          @selected=\"handleAnnotationOpened(annotation)\"\n                        />\n                      </div>\n                    </template>\n                    <template v-else-if=\"annotation.type==='box' || annotation.type==='seg'\">\n                      <div class=\"json-tree\">\n                        <JsonView\n                          :data=\"formatAnnotation(annotation)\"\n                          :rootKey=\"annotation.label_name ? `${annotation.label_name}`: `${annotation.label_index}`\"\n                          :itemId=\"annotation.id\"\n                          :selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n                          :removable=\"true\"\n                          @selected=\"handleSelect(annotation)\"\n                          @remove-annotation=\"handleDeleteAnnotation\"\n                        />\n                      </div>\n                    </template>\n                    <template v-else-if=\"annotation.type==='3dbox'\">\n                      <div class=\"json-tree\">\n                        <JsonView\n                          :data=\"formatDataJson(annotation)\"\n                          :rootKey=\"annotation.label_name ? `${annotation.label_name}`: `${annotation.label_index}`\"\n                          :itemId=\"annotation.id\"\n                          :selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n                          :removable=\"true\"\n                          @selected=\"handleSelect(annotation)\"\n                          @remove-annotation=\"handleDeleteAnnotation\"\n                        />\n                      </div>\n                    </template>\n                    <template v-else>\n                      <div class=\"json-tree\">\n                        <JsonView\n                          :data=\"formatDataJson(annotation)\"\n                          :rootKey=\"`${annotation.type}_${annotation.id}`\"\n                          :itemId=\"annotation.id\"\n                          :selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n                          @selected=\"handleSelect(annotation)\"\n                        />\n                      </div>\n                    </template>\n                  </div>\n                </div>\n              </v-expansion-panel-text>\n            </v-expansion-panel>\n          </v-expansion-panels>\n        </v-expansion-panel-text>\n      </v-expansion-panel>\n    </v-expansion-panels>\n  </div>\n</template>\n\n<script setup>\nimport JsonView from '@/components/JSONViewer/JsonView.vue';\nimport {\n  ref, computed, onMounted, watch, toRefs, toRaw,\n} from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useRoute } from 'vue-router';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport useAnnotationColorMap from '@/composables/useAnnotationColorMap.js';\nimport ImageDetails from '@/components/DatasetComponent/AnnotationTool/ImageDetails.vue';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport ColorPicker from '@/components/ColorPicker.vue';\n\nconst props = defineProps({\n  imageObj: { type: Object, default: null },\n  labels: { type: Array, default: () => [] },\n  annotationSets: { type: Array, default: () => [] },\n  selectedAnnotationSets: { type: Array, default: null },\n  fixedAnnotationSet: { type: Object, default: null },\n  displayLabelTags: { type: Object, default: null },\n  displayProjection: { type: Object, default: null },\n  colorAnnotationsBy: { type: String, default: 'set' },\n  groupedAnnotations: { type: Object, default: () => {} },\n  hideAddTopics: { type: Boolean, default: false },\n  selectedLabels: { type: Array, default: () => [] },\n  selectedLabel: { type: Object, default: () => {} },\n  selectedAnnotationIdentifiers: { type: Array, default: () => [] },\n  isEditing: { type: Boolean, default: true },\n});\n\nconst {\n  imageObj,\n  labels,\n  annotationSets,\n  fixedAnnotationSet,\n  groupedAnnotations,\n  hideAddTopics,\n  selectedAnnotationIdentifiers,\n  selectedLabel,\n} = toRefs(props);\n\nconst {\n  ALL_TYPES,\n  selectedDisplayTypes,\n  jsonViewerShowTypes,\n} = useAnnotationType();\n\nconst selectedTopics = ref([]);\n\nconst internalAnnotations = ref(null);\n\nconst internalSelectedAnnotationSets = ref([]);\n\nconst internalSelectedLabels = ref([]);\n\nconst emit = defineEmits([\n  'item-clicked',\n  'update:displayLabelTags',\n  'update:displayProjection',\n  'update:selectedAnnotationSets',\n  'open-in-full',\n  'update:selectedLabels',\n  'update:selectedLabel',\n  'update:colorAnnotationsBy',\n  'edit-for-annotation-set',\n  'select-annotations', 'new-color', 'remove-annotation',\n]);\n\nconst dataConnect = new DatastoreConnect();\n\nconst openedDropdowns = ref(['topics']);\n\nconst openedTopics = ref([]);\n\nconst displayColorBy = ref('label');\n\nconst loadingRaw = ref(false);\n\nconst listedTopics = computed(() => {\n  const allTypeKeys = ALL_TYPES.map((at) => at.key);\n  const unknownTypes = selectedTopics.value.filter((t) => !allTypeKeys.includes(t)).map((t) => ({ key: t, display: t, unknown: true }));\n  return [...ALL_TYPES.filter((e) => selectedTopics.value.includes(e.key)), ...unknownTypes];\n});\n\nconst selectedLabelForAudit = ref(labels.value ? labels.value[0] : {});\n\nwatch(groupedAnnotations, () => {\n  if (groupedAnnotations.value) {\n    selectedTopics.value = Object.keys(groupedAnnotations.value);\n  }\n}, { deep: true, immediate: true });\n\nwatch(listedTopics, () => {\n  if (listedTopics.value) {\n    selectedDisplayTypes.value = listedTopics.value;\n  }\n}, { immediate: true });\n\nwatch(internalSelectedAnnotationSets, () => {\n  emit('update:selectedAnnotationSets', internalSelectedAnnotationSets.value);\n}, { deep: true });\n\nwatch(internalSelectedLabels, () => {\n  emit('update:selectedLabels', internalSelectedLabels.value);\n}, { deep: true });\n\nwatch(displayColorBy, () => {\n  emit('update:colorAnnotationsBy', displayColorBy.value);\n}, { deep: true });\n\nwatch(annotationSets, () => {\n  if (annotationSets.value.length > 0 && internalSelectedAnnotationSets.value.length === 0) {\n    internalSelectedAnnotationSets.value = [annotationSets.value[0].id];\n  }\n}, { deep: true });\n\nwatch(labels, () => {\n  if (labels.value.length > 0) {\n    // if the selected label for audit's identifier is not in the label list\n    if (selectedLabelForAudit.value) {\n      const isSelectedLabelInList = labels.value.find((e) => e.id === selectedLabelForAudit.value.id);\n      if (!isSelectedLabelInList) {\n        selectedLabelForAudit.value = labels.value[0];\n        if (internalSelectedLabels.value.length === 0) {\n          internalSelectedLabels.value = labels.value.map((e) => e.index);\n        }\n      }\n    } else {\n      selectedLabelForAudit.value = labels.value[0];\n      if (internalSelectedLabels.value.length === 0) {\n        internalSelectedLabels.value = labels.value.map((e) => e.index);\n      }\n    }\n  }\n}, { deep: true });\n\nwatch(fixedAnnotationSet, () => {\n  internalSelectedAnnotationSets.value = [fixedAnnotationSet.value.id];\n}, { deep: true });\n\nif (fixedAnnotationSet.value) {\n  internalSelectedAnnotationSets.value = [fixedAnnotationSet.value.id];\n} else if (annotationSets.value.length > 0) {\n  internalSelectedAnnotationSets.value = [annotationSets.value[0].id];\n} else {\n  internalSelectedAnnotationSets.value = [];\n}\n\n// Setup annotation color maps\nconst { map: labelColorMap } = useAnnotationColorMap({ items: labels, key: 'index' });\nconst { map: annotationSetColorMap } = useAnnotationColorMap({ items: annotationSets, key: 'id' });\n\nfunction stopEditingColor(i, label, color) {\n  if (!color || color === '') {\n    return;\n  }\n\n  const params = {\n    label_id: label.id,\n    label_index: label.index,\n    label_name: label.name,\n    label_color: color,\n  };\n\n  emit('new-color', params);\n}\n\nfunction filterAnnotationsBySet(anns, sets) {\n  if (sets) {\n    return anns.filter((anno) => sets.includes(anno.annotation_set_id));\n  }\n  return anns;\n}\n\nfunction formatAnnotation(annotation) {\n  const label = labels.value.find((e) => e.id === annotation.label_id);\n  const result = {};\n  if (annotation.type === \"seg\") {\n    result.segments = annotation.polygon;\n    if (label) {\n      result.label_name = label.name;\n      result.label_index = label.index;\n    } else {\n      result.label_name = \"\";\n      result.label_index = 0;\n    }\n  } else if (annotation.type === \"box\") {\n    result.segments = annotation.polygon;\n    result.x = annotation.x;\n    result.y = annotation.y;\n    result.w = annotation.w;\n    result.h = annotation.h;\n    result.score = annotation.score;\n    result['size_%'] = annotation.w * annotation.h;\n    result['size_px'] = (annotation.w * annotation.h) * imageObj.value.width * imageObj.value.height;\n    if (label) {\n      result.label_name = label.name;\n      result.label_index = label.index;\n    } else {\n      result.label_name = \"\";\n      result.label_index = 0;\n    }\n  }\n  return result;\n}\n\nfunction formatDataJson(annotation) {\n  const label = labels.value.find((e) => e.id === annotation.label_id);\n  let result = {};\n  if (annotation.type === \"3dbox\") {\n    result.x = annotation[\"data_json\"].x;\n    result.y = annotation[\"data_json\"].y;\n    result.z = annotation[\"data_json\"].z;\n    result.dx = annotation[\"data_json\"].dx;\n    result.dy = annotation[\"data_json\"].dy;\n    result.dz = annotation[\"data_json\"].dz;\n    if (label) {\n      result.label_name = label.name;\n      result.label_index = label.index;\n    } else {\n      result.label_name = \"\";\n      result.label_index = 0;\n    }\n  } else {\n    result = annotation['data_json'];\n  }\n  return result;\n}\n\nasync function readFile(annotation) {\n  loadingRaw.value = true;\n  const data = await dataConnect.getAnnotationFile(annotation.id)\n    .catch((error) => {\n      console.log(error);\n      return '';\n    });\n  loadingRaw.value = false;\n  return data;\n}\n\nasync function handleAnnotationOpened(annotation) {\n  if (annotation.data_url && !annotation.raw) {\n    annotation.raw = await readFile(annotation);\n  } else if (annotation.polygon && !annotation.raw) {\n    annotation.raw = annotation.polygon;\n  }\n}\n\nfunction handleSelect(annotation) {\n  emit('select-annotations', annotation);\n}\n\nfunction handleLabelListItemClicked(label) {\n  if (selectedLabelForAudit.value !== label) {\n    selectedLabelForAudit.value = label;\n    emit('update:selectedLabel', label);\n  }\n}\n\nconst route = useRoute();\n\nonMounted(() => {\n  if (route.query.showTypes) {\n    jsonViewerShowTypes.value = JSON.parse(decodeURI(route.query.showTypes));\n  }\n  if (route.query.annotationDisplaySettings) {\n    const annotationDisplaySettings = JSON.parse(decodeURI(route.query.annotationDisplaySettings));\n    internalSelectedLabels.value = annotationDisplaySettings.displayLabels.labels;\n    internalSelectedAnnotationSets.value = annotationDisplaySettings.displayAnnotationSets.annotation_sets;\n    displayColorBy.value = annotationDisplaySettings.colorAnnotationsBy.type;\n  } else {\n    if (labels.value.length > 0 && internalSelectedLabels.value.length === 0) {\n      internalSelectedLabels.value = labels.value.map((e) => e.index);\n    }\n  }\n});\n\nfunction handleEditAnnotations(annotationSet) {\n  emit('edit-for-annotation-set', annotationSet);\n}\n\nfunction handleDeleteAnnotation(annotation) {\n  emit('remove-annotation', annotation);\n}\n\nfunction getColor(label) {\n  let color = \"\";\n  color = label.color ? label.color : labelColorMap.value[label.index];\n  return color;\n}\n\nfunction toggleDropdownAll() {\n  if (openedDropdowns.value.length === 0) {\n    openedDropdowns.value = ['image', 'annotation-sets', 'labels', 'topics'];\n  } else {\n    openedDropdowns.value = [];\n  }\n}\n\nfunction toggleDisplayLabelTags(key) {\n  emit('update:displayLabelTags', { ...props.displayLabelTags, [key]: !props.displayLabelTags[key] });\n}\n\nfunction toggleDisplayProjection(key) {\n  emit('update:displayProjection', { ...props.displayProjection, [key]: !props.displayProjection[key] });\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.dropdown-toggle-all {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n\n  span {\n    // margin: 5px 15px 0 5px;\n    font-size: 0.95rem;\n    font-weight: 600;\n    color: var(--color-primary);\n    cursor: pointer;\n\n    &:hover {\n      color: rgb(147, 146, 146);\n    }\n  }\n}\n\n.json-raw-viewer {\n  display: flex;\n  width: 100%;\n  overflow-y: auto;\n}\n.panel {\n  padding: 0 !important;\n  border-radius: 0;\n\n  &__title {\n    height: 30px;\n    min-height: 0;\n    padding: 5px 5px 5px 15px;\n    font-weight: 600;\n    border-radius: 0;\n    border-bottom: 0.5px solid rgb(132, 130, 130);\n  }\n\n  &__title-text {\n    display: flex;\n    width: 100%;\n    margin: 0 10px 0 0;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n\n  }\n\n  .topic-title {\n    margin-left: 10px;\n  }\n\n  &__text {\n    background: none;\n    // border-bottom: 0.5px solid rgb(132, 130, 130);\n    // overflow-y: auto;\n    height: fit-content;\n  }\n\n  &__item {\n    display: flex;\n    flex-direction: row;\n  }\n\n  &__item > * {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  &__radio-label {\n    width: 21px;\n    height:21px;\n\n    .icon {\n      cursor: pointer;\n    }\n\n    .icon:hover {\n      @include themify() {\n        background-color: themed('icon-hover-color');\n        border-radius: 100%;\n        box-shadow: 0 0 0 4px themed('icon-hover-color');\n      }\n    }\n  }\n\n  :deep() {\n    .v-expansion-panel-title--active {\n      min-height: 0;\n    }\n  }\n}\n\n.topic-selector-icon {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.topic-selector-text {\n  min-width: 180px;\n  width:fit-content;\n  min-height: 200px;\n  max-height: 400px;\n  padding-right: 10px;\n  overflow-y: auto;\n}\n\n.raw-text {\n  width: 100%;\n  text-align: left;\n  font-size: 0.9rem;\n}\n\n.json-tree {\n  width: 100%;\n  text-align: left;\n  font-size: 0.9rem;\n}\npre{\n  width: 100%;\n  overflow-x: scroll;\n}\n\n.label-list {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 50%;\n  margin: 0;\n  list-style-type: none;\n\n  li {\n    user-select: none;\n    -moz-user-select: none;\n    -khtml-user-select: none;\n    -webkit-user-select: none;\n    -o-user-select: none;\n    flex-direction: row;\n    display: flex;\n    align-items: center;\n    margin-bottom: unset;\n    height: 30px;\n    padding: 4px 8px;\n    font-size: 0.9rem;\n    font-weight: 600;\n    border: 1px solid transparent;\n    border-left: 4px solid transparent;\n\n    button {\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n\n    span {\n      margin-right: auto;\n    }\n\n    &._active {\n      background: rgba(140,140,140,0.2);\n      cursor: pointer;\n\n      @include themify() {\n        border: 1px solid black;\n        border-left: 4px solid themed('color-primary');\n      }\n    }\n  }\n\n  li+li {\n    margin-top: 5px;\n  }\n\n  li._hover {\n    &:hover {\n      background: rgba(140,140,140,0.2);\n      cursor: pointer;\n    }\n  }\n\n  li._pointer {\n    cursor: pointer;\n  }\n\n  &__symbol {\n    width: 16px;\n    height: 16px;\n    margin-right: 8px;\n  }\n\n  &__box-symbol {\n    border: 2px solid;\n  }\n\n  .chkbox-flex-row {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n\n    .label-color-name{\n      display: flex;\n      flex-direction: row;\n      align-items: center;\n\n      span {\n        margin-left: 10px;\n      }\n    }\n  }\n}\n\n.check-box-text {\n    font-size: 0.9rem;\n    color: #181a1f;\n    font-weight: 600;\n    letter-spacing: 0;\n  }\n\n.label-chkbox {\n    width: fit-content;\n  }\n\n.annset-legend-color {\n  min-width: 16px;\n  min-height: 16px;\n  margin-right: 8px;\n  border-radius: 100%;\n  border: 0.1px solid grey;\n}\n\n:deep() {\n  .v-label {\n      opacity: 1!important;\n    }\n\n  .v-expansion-panel--active {\n      margin-top: 0;\n    }\n\n  .v-expansion-panel--after-active {\n    margin-top: 0;\n  }\n  .v-selection-control__wrapper {\n    margin-right: 5px;\n  }\n\n  .nowrap>.v-expansion-panel-text__wrapper {\n    padding: 0\n  }\n\n  .label-list-wrapper {\n    overflow-y: auto;\n  }\n\n  .label-list-wrapper>.v-expansion-panel-text__wrapper {\n    max-height: 300px;\n    height: fit-content;\n    padding-left: 0 !important;\n  }\n\n}\n\n.color-radio {\n  position: absolute;\n  opacity: 0;\n  width: 30px;\n  height: 30px;\n}\n\n.radio-icon:hover,\n.radio-icon:focus-visible {\n  @include themify() {\n    background-color: themed('icon-hover-color');\n    border-radius: 100%;\n    box-shadow: 0 0 0 4px themed('icon-hover-color');\n  }\n}\n\n.active-icon {\n  @include themify() {\n    color: themed('icon-color-primary');\n    border-radius: 100%;\n  }\n}\n\n.utilities {\n  display: flex;\n  flex-direction: row;\n  height: 30px;\n  margin: 4px 6px;\n  gap: 4px;\n\n  &__buttons {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    align-items: center;\n  }\n}\n\n</style>\n","import script from \"./JsonRawViewer.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./JsonRawViewer.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./JsonRawViewer.vue?vue&type=style&index=0&id=481b6da2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-481b6da2\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"bulkDeleteModal\"\n    :title=\"'Delete Annotations'\"\n    @closed=\"clearData\"\n  >\n    <template #modal-main>\n      <form\n        id=\"form\"\n        class=\"form container scrollbar\"\n        novalidate\n        @change=\"handleFormChange\"\n        @submit.prevent=\"\"\n      >\n        <v-select\n          v-model=\"selectedTypes\"\n          clearable\n          chips\n          label=\"Annotation Types\"\n          :items=\"selectedDisplayTypes.filter(e => e.key !== 'image')\"\n          item-title=\"display\"\n          item-value=\"key\"\n          multiple\n          variant=\"outlined\"\n          class=\"mt-1\"\n        />\n        <div class=\"row\">\n          <div class=\"col-12 form__control-group\">\n            <label class=\"required\">Annotation Set</label>\n            <select v-model=\"annotationSet\" class=\"select\" required>\n              <option disabled :value=\"null\">Select an Annotation Set</option>\n              <option v-for=\"annSet in annotationSets\" :key=\"annSet.id\" :value=\"annSet.id\">\n                {{ annSet.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <div v-if=\"frameCount > 1\" class=\"row mt-3\">\n          <div class=\"form__control-group\">\n            <label class=\"text\">Delete Annotation in Frames</label>\n            <div class=\"frame-input\">\n              <input\n                v-model=\"lower\"\n                :min=\"min\"\n                :max=\"max\"\n                type=\"number\"\n                placeholder=\"Min\"\n                @change=\"changeSanitizer\"\n                @input=\"inputSanitizer\"\n              >\n              <span>&#x2013;</span>\n              <input\n                v-model=\"upper\"\n                :min=\"min\"\n                :max=\"max\"\n                type=\"number\"\n                placeholder=\"Max\"\n                @change=\"changeSanitizer\"\n                @input=\"inputSanitizer\"\n              >\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <v-checkbox\n            :key=\"`del-all`\"\n            v-model=\"deleteAll\"\n            density=\"compact\"\n            :hide-details=\"true\"\n          >\n            <template #label>\n              <span class=\"delete-all-chkbox\">{{ frameCount > 1 ? 'Delete for all images in sequence' : 'Delete for all images in dataset' }}</span>\n            </template>\n          </v-checkbox>\n        </div>\n      </form>\n      <div v-if=\"message\" class=\"row mb-1 result-container\">\n        <div v-if=\"message\" class=\"result\" :class=\"[error ? 'error' : 'success']\">\n          <span><pre>{{ message }}</pre></span>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button button-delete\"\n          :disabled=\"selectedTypes.length === 0 || !annotationSet\"\n          @click=\"handleDeleteClicked\"\n        >\n          Delete\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script setup>\nimport {\n  ref, computed, onMounted, toRefs,\n} from 'vue';\nimport Modal from '@/components/Modal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { storeToRefs } from 'pinia';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\n\nconst props = defineProps({\n  frameCount: {\n    type: Number,\n    default: 0,\n  },\n  imageObj: {\n    type: Object,\n    default: null,\n  },\n  annotationSets: {\n    type: Array,\n    default: () => [],\n  },\n});\n\ndefineExpose({ showModal });\n\nconst {\n  samples,\n} = storeToRefs(useViewerVisualizationsStore());\n\nconst {\n  frameCount,\n  imageObj,\n  annotationSets,\n} = toRefs(props);\n\nconst {\n  selectedDisplayTypes,\n} = useAnnotationType();\n\nconst emit = defineEmits(['closed', 'deleted']);\nconst bulkDeleteModal = ref(null);\nconst selectedTypes = ref([]);\nconst upper = ref(1);\nconst lower = ref(1);\nconst min = ref(1);\nconst max = ref(1);\nconst annotationSet = ref(null);\nconst message = ref('');\nconst error = ref(false);\nconst deleteAll = ref(false);\n\nfunction showModal() {\n  bulkDeleteModal.value.showModal();\n  if (frameCount.value > 1) {\n    max.value = frameCount.value;\n    upper.value = frameCount.value;\n  }\n}\n\nfunction clearData() {\n  selectedTypes.value = [];\n  upper.value = 1;\n  lower.value = 1;\n  min.value = 1;\n  max.value = 1;\n  annotationSet.value = null;\n  message.value = '';\n  error.value = false;\n  deleteAll.value = false;\n}\n\nasync function handleDeleteClicked() {\n  const dataConnect = new DatastoreConnect();\n  const params = {\n    annotation_set_id: annotationSet.value,\n    annotation_types: selectedTypes.value,\n    sequence_id: imageObj.value.type === 'sequence' ? imageObj.value.sequence_id : null,\n    image_ids: samples.value.slice(lower.value - 1, upper.value),\n    delete_all: deleteAll.value,\n  };\n  await dataConnect.deleteAnnotationBulk(params)\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        message.value = resp.error;\n        error.value = true;\n      } else {\n        message.value = \"Delete in progress\";\n        error.value = false;\n        emit('deleted');\n      }\n    });\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.form {\n  padding: 0.75rem 3rem;\n  min-width: 480px;\n  overflow-y: scroll;\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n#form {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  padding: 0.75rem 3rem;\n  overflow: auto;\n  position: relative;\n}\n\n.frame-input {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n\n  span {\n    display: flex;\n    align-items: center;\n    font-size: 0.9rem;\n    margin: 0 10px;\n\n  }\n  .text {\n    width: 60%;\n    font-size: 0.9rem;\n  }\n\n  input {\n    margin: 5px 0;\n  }\n}\n\n.delete-all-chkbox{\n  color: #383c48;\n  font-size: 14px;\n  font-weight: 600;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 3px 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.result-container {\n  justify-content: center;\n}\n\n.success {\n  text-align: left;\n  @include themify() {\n    background: rgba(115, 206, 115, 0.5) ;\n    color: themed('color-success');\n    border: 1px solid themed('color-success');\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error');\n    border: 1px solid themed('color-error');\n  }\n}\n:deep {\n  .v-label {\n    opacity: 1 !important;\n  }\n}\n\n</style>\n","import script from \"./BulkDeleteAnnotationModal.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./BulkDeleteAnnotationModal.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./BulkDeleteAnnotationModal.vue?vue&type=style&index=0&id=46b5ea92&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-46b5ea92\"]])\n\nexport default __exports__","<template>\n  <!-- <AnnotationToolViewingModeControls\n    @zoom-to-fit=\"handleZoomToFit\"\n  /> -->\n  <div\n    id=\"konva-container\"\n    ref=\"konvaContainer\"\n    class=\"konva-container\"\n  >\n    <v-stage\n      v-show=\"showDepthMap\"\n      ref=\"stage\"\n      :config=\"configKonva\"\n      @pointermove=\"debounceHandleMouseover\"\n    >\n      <v-layer>\n        <KonvaImage\n          ref=\"konvaImage\"\n          :imagePath=\"imagePath\"\n          :imageId=\"imageObj?.id\"\n          :showPointerAxes=\"true\"\n          :useImageCacheOnly=\"true\"\n          :imageCacheElem=\"imageCacheElem\"\n          @image-loaded=\"handleImageLoaded\"\n        />\n      </v-layer>\n      <v-layer>\n        <v-rect ref=\"textBox\" :config=\"configTextBox\" />\n        <v-text ref=\"textNode\" :config=\"configText\" />\n      </v-layer>\n    </v-stage>\n  </div>\n</template>\n\n<script>\nimport { debounce, roundNumber } from '@/assets/js/utils.js';\nimport {\n  ref, toRefs, onMounted, computed,\n} from 'vue';\nimport { useResizeObserver, useDebounceFn } from '@vueuse/core';\nimport useZoom from '@/composables/canvas/useZoom.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport { decode as fastPNGDecode } from 'fast-png';\nimport { storeToRefs } from 'pinia';\nimport KonvaImage from './KonvaImage.vue';\n\nexport default {\n  name: \"DepthMapViewer\",\n  components: {\n    KonvaImage,\n  },\n  props: {\n    shouldZoomToFit: {\n      type: Boolean,\n      default: true,\n    },\n    currentTool: {\n      type: String,\n      default: 'pointer',\n    },\n    showDepthMap: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'new-coordinates',\n  ],\n  setup(props, ctx) {\n    const visualizationStore = useViewerVisualizationsStore();\n\n    const {\n      currentAnimationSample,\n      mouse,\n    } = storeToRefs(visualizationStore);\n\n    let expose = {};\n\n    // Setup canvas\n    const konvaContainer = ref(null);\n    const imageDimensions = ref(null);\n    const stage = ref(null);\n    const stageNode = ref(null);\n    const stageScale = ref({ x: 1, y: 1 });\n    const configKonva = ref({\n      width: 100,\n      height: 100,\n    });\n    const configText = ref({\n      text: \"\",\n      x: 100,\n      y: 100,\n      fontSize: 24,\n      fontFamily: 'Open Sans',\n      fill: 'white',\n    });\n    const configTextBox = ref({\n      x: 100,\n      y: 100,\n      height: 1,\n      width: 1,\n      fill: 'red',\n    });\n    onMounted(() => {\n      stageNode.value = stage.value.getStage();\n    });\n    const imageComponent = computed(() => 'KonvaImage');\n\n    // Setup canvas objects\n    const canvasObjects = ref({});\n    const selectedObjects = ref([]);\n    const selectedNodes = computed(() => Object.entries(canvasObjects.value)\n      .map(([key, val]) => { if ((selectedObjects.value.map((v) => v.toString())).includes(key)) return val.node; })\n      .filter((node) => node));\n\n    // Setup canvas zoom and resize\n    const {\n      zoomToFitImage, zoomToSelection: baseZoomToSelection, handleCanvasZoomScroll,\n    } = useZoom(konvaContainer, imageDimensions, stageNode, stageScale);\n    function zoomToSelection() {\n      baseZoomToSelection(selectedNodes);\n    }\n    function handleCanvasResize() {\n      configKonva.value.width = konvaContainer.value.clientWidth;\n      configKonva.value.height = konvaContainer.value.clientHeight;\n      zoomToFitImage();\n    }\n    useResizeObserver(konvaContainer, useDebounceFn(handleCanvasResize, 15));\n    // useResizeObserver(konvaContainer, () => setTimeout(handleCanvasResize, 0));\n    expose = {\n      ...expose,\n      zoomToFitImage,\n      zoomToSelection,\n    };\n\n    ctx.expose(expose);\n\n    return {\n      currentAnimationSample,\n      konvaContainer,\n      stage,\n      imageDimensions,\n      stageNode,\n      stageScale,\n      configKonva,\n      imageComponent,\n      canvasObjects,\n      selectedObjects,\n      selectedNodes,\n      zoomToFitImage,\n      zoomToSelection,\n      handleCanvasZoomScroll,\n      handleCanvasResize,\n      configText,\n      configTextBox,\n      mouse,\n    };\n  },\n  data() {\n    return {\n      isSelectionMousedown: false,\n      imageNode: null,\n      textNode: null,\n      imagePointerCoordinates: null,\n      internalAnnotations: [],\n      mouseoverObjectWhileAnnotating: null,\n      decodedImage: null,\n      imagePath: null,\n    };\n  },\n  computed: {\n    debounceHandleMouseover() {\n      return debounce(() => { this.handleMouseover(); }, 2);\n    },\n    stageReady() {\n      return Boolean(this.stageNode && this.imageNode && this.imageDimensions && this.stageScale);\n    },\n    imageCacheElem() {\n      return this.currentAnimationSample?.depthmap ? this.currentAnimationSample.depthmap[0] : null;\n    },\n    imageObj() {\n      return this.currentAnimationSample?.imageObj ? this.currentAnimationSample.imageObj : null;\n    },\n    depthmapAnn() {\n      const anns = this.currentAnimationSample?.annotations ? this.currentAnimationSample.annotations : null;\n      return anns.find((e) => e.type === 'depthmap');\n    },\n  },\n  watch: {\n    mouse: {\n      deep: true,\n      immediate: true,\n      handler() {\n        this.handleMouseCoordinates(this.mouse);\n      },\n    },\n  },\n  mounted() {\n    this.imageNode = this.$refs.konvaImage.getImageNode();\n    this.textNode = this.$refs.textNode.getNode();\n  },\n  methods: {\n    async getImageBlob() {\n      if (!this.imageCacheElem && this.depthmapAnn) {\n        const dataConnect = new DatastoreConnect();\n        const blob = await dataConnect.getAnnotationFile(this.depthmapAnn.id, 'blob');\n        this.imagePath = URL.createObjectURL(blob);\n        return blob;\n      } else if (this.imageCacheElem && this.depthmapAnn) {\n        const dataConnect = new DatastoreConnect();\n        const blob = await dataConnect.getAnnotationFile(this.depthmapAnn.id, 'blob');\n        this.imagePath = null;\n        return blob;\n      } else {\n        this.imagePath = null;\n        return null;\n      }\n    },\n    async handleImageLoaded(data) {\n      const blob = await this.getImageBlob();\n      this.imageDimensions = { width: data.width, height: data.height };\n      await this.$nextTick();\n      this.stageNode.scale(\n        { x: 1, y: 1 },\n      );\n      if (this.shouldZoomToFit) { await this.$nextTick(this.zoomToFitImage); }\n      if (data.url && blob) {\n        try {\n          const arrayBuffer = await blob.arrayBuffer();\n          this.decodedImage = (await fastPNGDecode(arrayBuffer));\n        } catch (err) {\n          console.log(err);\n        }\n      }\n    },\n    get16BitValueAt(x, y) {\n      if (this.decodedImage.depth !== 16) {\n        console.log(\"Image is not 16 bit depth\");\n        return;\n      }\n\n      if (this.decodedImage.channels !== 1) {\n        console.log(\"Image is not grayscale\");\n        return;\n      }\n\n      const index = (y * this.decodedImage.width + x);\n\n      return (this.decodedImage.data[index] / 100).toFixed(2);\n    },\n    handleMouseCoordinates(mouse) {\n      if (mouse.offsetX && mouse.offsetY && this.decodedImage) {\n        const elemWidth = this.textNode.textWidth;\n        const elemHeight = this.textNode.textHeight;\n        const relPtr = {\n          x: mouse.offsetX * this.imageDimensions.width,\n          y: mouse.offsetY * this.imageDimensions.height,\n        };\n        this.configText.x = relPtr.x + 8;\n        this.configText.y = relPtr.y - 48;\n        this.configTextBox.x = relPtr.x + 8;\n        this.configTextBox.y = relPtr.y - 48;\n\n        if (relPtr.x + elemWidth + 10 >= this.imageDimensions.width) {\n          // hitting right border\n          this.configText.x = relPtr.x - 5 - elemWidth;\n          this.configTextBox.x = relPtr.x - 5 - elemWidth;\n        }\n        if (relPtr.y - elemHeight - 10 <= 0) {\n          // hitting top border\n          this.configText.y = relPtr.y + 5;\n          this.configTextBox.y = relPtr.y + 5;\n        }\n        this.configText.text = `(${Math.round(relPtr.x)}, ${Math.round(relPtr.y)}, ${this.get16BitValueAt(Math.round(relPtr.x), Math.round(relPtr.y))} m)`;\n        this.configTextBox.width = elemWidth;\n        this.configTextBox.height = elemHeight;\n        this.configText.fontSize = 0.022 * this.imageNode.attrs.width;\n      } else {\n        this.configText.text = '';\n        this.configTextBox.width = 0;\n        this.configTextBox.height = 0;\n      }\n    },\n    handleMouseover() {\n      // Tell image to get new pointer position now that it has been registered\n      this.$refs.konvaImage?.handleImagePointerMove();\n    },\n    handleZoomToFit() {\n      this.zoomToFitImage();\n    },\n    handleZoomToSelection() {\n      this.zoomToSelection();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.konva-container {\n  width: 100%;\n  height: 100%;\n  z-index: 2;\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100' %3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%239C92AC' fill-opacity='0.125'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\");\n  background-repeat: repeat;\n  background-color: var(--canvas-background);\n\n}\n</style>\n","import { render } from \"./DepthMapViewer.vue?vue&type=template&id=851b058e&scoped=true\"\nimport script from \"./DepthMapViewer.vue?vue&type=script&lang=js\"\nexport * from \"./DepthMapViewer.vue?vue&type=script&lang=js\"\n\nimport \"./DepthMapViewer.vue?vue&type=style&index=0&id=851b058e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-851b058e\"]])\n\nexport default __exports__","<template>\n  <div id=\"drawingToolModeControls\" class=\"ribbon\">\n    <div class=\"ribbon__group\">\n      <IconButton\n        id=\"selectToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Pointer Tool (q)\"\n        :icon=\"'cursor'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Pointer Tool (q)'\"\n        :width=\"24\"\n        :height=\"24\"\n        :class=\"{ 'selected': mode === 'pointer' }\"\n        @click=\"handleSetDrawingMode('pointer')\"\n      />\n      <IconButton\n        id=\"pointToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Point Tool (p)\"\n        :icon=\"'dotted_line'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Point Tool (p)'\"\n        :width=\"24\"\n        :height=\"24\"\n        :class=\"{ 'selected': mode === 'line' }\"\n        @click=\"handleSetDrawingMode('line')\"\n      />\n      <IconButton\n        id=\"brushToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Brush Tool (w)\"\n        :icon=\"'brush_icon'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Brush Tool (w)'\"\n        :width=\"24\"\n        :height=\"24\"\n        :class=\"{ 'selected': mode === 'brush' }\"\n        @click=\"handleSetDrawingMode('brush')\"\n      />\n      <IconButton\n        v-if=\"shouldEnableEraser\"\n        id=\"eraserToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Eraser Tool (e)\"\n        :icon=\"'eraser_icon'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Eraser Tool (e)'\"\n        :width=\"24\"\n        :height=\"24\"\n        :class=\"{ 'selected': mode === 'eraser' }\"\n        @click=\"handleSetDrawingMode('eraser')\"\n      />\n      <IconButton\n        id=\"boxToolBtn\"\n        class=\"ribbon__button\"\n        :class=\"{ 'selected': mode === 'box' }\"\n        aria-label=\"2D Bounding Box Tool (b)\"\n        :icon=\"'box-tool'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :width=\"24\"\n        :height=\"24\"\n        :title=\"'Box Tool (b)'\"\n        @click=\"handleSetDrawingMode('box')\"\n      />\n      <IconButton\n        id=\"samToolBtn\"\n        class=\"ribbon__button\"\n        :class=\"{ 'selected': mode === 'sam' }\"\n        aria-label=\"AI Image Segment Tool (a)\"\n        :icon=\"'sam-image'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :width=\"24\"\n        :height=\"24\"\n        :title=\"'AI Image Segment Tool (a)'\"\n        @click=\"handleSetDrawingMode('sam')\"\n      />\n      <IconButton\n        id=\"sam2ToolBtn\"\n        class=\"ribbon__button\"\n        :class=\"{ 'selected': mode === 'sam2' }\"\n        aria-label=\"AI Video Segment Tool (a)\"\n        :icon=\"'sam-video'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :width=\"24\"\n        :height=\"24\"\n        :title=\"'AI Video Segment Tool (a)'\"\n        @click=\"handleSetDrawingMode('sam2')\"\n      />\n      <IconButton\n        id=\"colorToolBtn\"\n        class=\"ribbon__button\"\n        :class=\"{ 'selected': mode === 'color' }\"\n        aria-label=\"Edit Label (l)\"\n        :icon=\"'tag'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :width=\"24\"\n        :height=\"24\"\n        :title=\"'Edit Label (l)'\"\n        @click=\"handleSetDrawingMode('color')\"\n      />\n      <hr v-if=\"mode === 'brush' || mode === 'eraser'\" class=\"ribbon__vr\">\n      <IconButton\n        v-if=\"mode === 'brush' || mode === 'eraser'\"\n        id=\"increaseSizeBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Increase Cursor Size (=)\"\n        :icon=\"'add_box_outlined'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Increase Cursor Size (=)'\"\n        :width=\"24\"\n        :height=\"24\"\n        @click=\"increaseCursorSize\"\n      />\n      <IconButton\n        v-if=\"mode === 'brush' || mode === 'eraser'\"\n        id=\"decreaseSizeBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Decrease Cursor Size (-)\"\n        :icon=\"'minus_box_outlined'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Decrease Cursor Size (-)'\"\n        :width=\"24\"\n        :height=\"24\"\n        @click=\"decreaseCursorSize\"\n      />\n    </div>\n  </div>\n  <div v-if=\"mode==='sam'\" class=\"sam-ribbon\">\n    <SAMToolbar\n      v-if=\"samOptions?.enabled\"\n      v-model:samOptions=\"samOptions\"\n      :hasSAMImageEmbedding=\"hasSAMImageEmbedding\"\n      :hasSAMImageEmbeddingError=\"hasSAMImageEmbeddingError\"\n    />\n  </div>\n</template>\n\n<script setup>\nimport IconButton from '@/components/IconButton.vue';\nimport { storeToRefs } from 'pinia';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport {\n  ref, toRefs, watch, computed,\n} from 'vue';\nimport SAMToolbar from '@/components/DatasetComponent/AnnotationTool/SAMToolbar.vue';\n\nconst props = defineProps({\n  mode: { type: String, default: '' },\n  size: { type: Number, default: 0 },\n  imageDimensions: { type: Object, default: () => {} },\n  shouldEnableEraser: { type: Boolean, default: false },\n  hasSAMImageEmbedding: { type: Boolean, default: false },\n  hasSAMImageEmbeddingError: { type: Boolean, default: false },\n  samOptions: { type: Object, default: null },\n});\n\nconst {\n  mode,\n  imageDimensions,\n  shouldEnableEraser,\n  hasSAMImageEmbedding,\n  hasSAMImageEmbeddingError,\n  samOptions,\n} = toRefs(props);\n\nconst emit = defineEmits([\n  'update:mode',\n  'update:samActive',\n  'update-cursor-size',\n]);\n\nconst visualizationStore = useViewerVisualizationsStore();\nconst {\n  frame,\n} = storeToRefs(visualizationStore);\n\nconst drawCursorSize = ref(0);\n\n// SAM\nconst isSAMActive = computed(() => mode.value === 'sam');\nwatch(isSAMActive, (isSamActive) => {\n  emit('update:samActive', isSamActive);\n});\n\nwatch(frame, () => {\n  emit('update:samActive', false);\n});\n\nwatch(drawCursorSize, () => {\n  emit('update-cursor-size', drawCursorSize.value);\n});\n\nwatch(imageDimensions, (dimensions) => {\n  if (Object.keys(dimensions).length > 0) {\n    drawCursorSize.value = 0.04 * dimensions.width;\n  }\n}, { deep: true });\n\nfunction increaseCursorSize() {\n  if (drawCursorSize.value < (0.2 * imageDimensions.value.width)) {\n    drawCursorSize.value *= 1.3;\n  }\n}\nfunction decreaseCursorSize() {\n  if (drawCursorSize.value > (0.001 * imageDimensions.value.width)) {\n    drawCursorSize.value /= 1.3;\n  }\n}\n\nfunction handleSetDrawingMode(newDrawingMode) {\n  emit('update:mode', newDrawingMode);\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.ribbon {\n  position: absolute;\n  top: 8px;\n  left: 8px;\n  display: flex;\n  flex-direction: column;\n  width: fit-content;\n  width: 40px;\n  padding: 16px 2px;\n  justify-content: space-between;\n  font-weight: 500;\n  box-shadow: 0 0 3px gray, 0 0 10px gray;\n  border-radius: 4px;\n  backdrop-filter: blur(5px);\n  -webkit-backdrop-filter: blur(5px);\n  z-index: 5;\n  align-items: center;\n  @include themify() {\n    color: themed('ribbon-icons-color');\n    background: themed('ribbon-bg-transparent');\n  }\n\n  &__group {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 8px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 100%;\n    height: 1px;\n    margin-top: 5px;\n  }\n\n  &__button {\n    display: flex;\n    min-width: 22px;\n    height: 22px;\n    color: inherit;\n    background: none;\n    border: none;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: .05em;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover:not(:disabled), &.active:not(:disabled) {\n      @include themify() {\n        box-shadow: 0 0 0 4px themed('icon-hover-color');\n        background-color: themed('icon-hover-color');\n      }\n      border-radius: 4px;\n    }\n\n    &:disabled {\n      cursor: default;\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n\n  &__button + &__button {\n      margin-top: 5px;\n  }\n\n  .icon-button + .icon-button {\n      margin-left: 0px !important;\n  }\n\n  .selected {\n      @include themify() {\n        box-shadow: 0 0 0 4px hsl(0, 1%, 66%);\n        background-color: hsl(0, 1%, 66%);\n      }\n      border-radius: 4px;\n    }\n}\n\n.sam-ribbon {\n  position: absolute;\n  top: 8px;\n  left: 65px;\n  display: flex;\n  flex-direction: row;\n  width: fit-content;\n  height: 40px;\n  padding: 2px 16px;\n  justify-content: space-between;\n  font-weight: 500;\n  box-shadow: 0 0 3px gray, 0 0 10px gray;\n  border-radius: 4px;\n  backdrop-filter: blur(5px);\n  -webkit-backdrop-filter: blur(5px);\n  z-index: 10;\n  @include themify() {\n    color: themed('ribbon-icons-color');\n    background: themed('ribbon-bg-transparent');\n  }\n}\n\n:deep(.filter-button) {\n  height: 22px;\n}\n\n</style>\n","import script from \"./DrawingToolModeControls.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./DrawingToolModeControls.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./DrawingToolModeControls.vue?vue&type=style&index=0&id=6d86cb8a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6d86cb8a\"]])\n\nexport default __exports__","<template>\n  <div id=\"drawingToolModeControls\" class=\"ribbon\">\n    <div class=\"ribbon__group\">\n      <IconButton\n        id=\"3dPointerToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Pointer Tool (q)\"\n        :icon=\"'cursor'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Pointer Tool (q)'\"\n        :width=\"22\"\n        :height=\"22\"\n        :class=\"{ 'selected': current3DCanvasTool === '3d-pointer' }\"\n        @click=\"emit('update:current3DCanvasTool', '3d-pointer')\"\n      />\n      <IconButton\n        id=\"3dBoxToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"New 3D Box (b)\"\n        :icon=\"'cube'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'New 3D Box (b)'\"\n        :width=\"22\"\n        :height=\"22\"\n        :class=\"{ 'selected': current3DCanvasTool === '3d-box' }\"\n        @click=\"emit('update:current3DCanvasTool', '3d-box')\"\n      />\n      <IconButton\n        id=\"3dEditLabelToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Edit Label (l)\"\n        :icon=\"'tag'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Edit Label (l)'\"\n        :width=\"22\"\n        :height=\"22\"\n        :class=\"{ 'selected': current3DCanvasTool === '3d-edit-label' }\"\n        @click=\"emit('update:current3DCanvasTool', '3d-edit-label')\"\n      />\n      <IconButton\n        id=\"translateObjectToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Translate Object (g)\"\n        :icon=\"'drag_drop'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Translate Object (g)'\"\n        :width=\"22\"\n        :height=\"22\"\n        :class=\"{ 'selected': current3DCanvasTool === 'translate-object' }\"\n        @click=\"emit('update:current3DCanvasTool', 'translate-object')\"\n      />\n      <IconButton\n        id=\"scaleObjectToolBtn\"\n        class=\"ribbon__button\"\n        aria-label=\"Scale Object (s)\"\n        :icon=\"'scale'\"\n        :showHover=\"false\"\n        :type=\"''\"\n        :title=\"'Scale Object (s)'\"\n        :width=\"22\"\n        :height=\"22\"\n        :class=\"{ 'selected': current3DCanvasTool === 'scale-object' }\"\n        @click=\"emit('update:current3DCanvasTool', 'scale-object')\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport IconButton from '@/components/IconButton.vue';\n\ndefineProps({\n  current3DCanvasTool: { type: String, default: '' },\n});\n\nconst emit = defineEmits(['update:current3DCanvasTool']);\n\n</script>\n\n<style lang=\"scss\" scoped>\n.ribbon {\n  position: absolute;\n  top: 8px;\n  left: 8px;\n  display: flex;\n  flex-direction: column;\n  width: fit-content;\n  width: 40px;\n  padding: 16px 2px;\n  justify-content: space-between;\n  font-weight: 500;\n  box-shadow: 0 0 3px gray, 0 0 10px gray;\n  border-radius: 4px;\n  backdrop-filter: blur(5px);\n  -webkit-backdrop-filter: blur(5px);\n  z-index: 5;\n  align-items: center;\n  @include themify() {\n    color: themed('ribbon-icons-color');\n    background: themed('ribbon-bg-transparent');\n  }\n\n  &__group {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 8px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 100%;\n    height: 1px;\n    margin-top: 5px;\n  }\n\n  &__button {\n    display: flex;\n    min-width: 22px;\n    height: 22px;\n    color: inherit;\n    background: none;\n    border: none;\n    font-size: 0.875rem;\n    line-height: 1rem;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: .05em;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover:not(:disabled), &.active:not(:disabled) {\n      @include themify() {\n        box-shadow: 0 0 0 4px themed('icon-hover-color');\n        background-color: themed('icon-hover-color');\n      }\n      border-radius: 4px;\n    }\n\n    &:disabled {\n      cursor: default;\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n\n  &__button + &__button {\n      margin-top: 5px;\n  }\n\n  .icon-button + .icon-button {\n      margin-left: 0px !important;\n  }\n\n  .selected {\n      @include themify() {\n        box-shadow: 0 0 0 4px hsl(0, 1%, 66%);\n        background-color: hsl(0, 1%, 66%);\n      }\n      border-radius: 4px;\n    }\n}\n\n:deep(.filter-button) {\n  height: 22px;\n}\n\n</style>\n","import script from \"./DrawingToolModeControls3d.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./DrawingToolModeControls3d.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./DrawingToolModeControls3d.vue?vue&type=style&index=0&id=38924a17&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-38924a17\"]])\n\nexport default __exports__","import script from \"./VisualizationPane.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./VisualizationPane.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./VisualizationPane.vue?vue&type=style&index=0&id=296910df&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-296910df\"]])\n\nexport default __exports__","<template>\n  <BaseMenu\n    :placement=\"'bottom-start'\"\n    :appendToBody=\"true\"\n    @closed=\"show_layout_menu = false\"\n  >\n    <IconButton\n      v-model=\"show_layout_menu\"\n      :icon=\"'settings'\"\n      :width=\"22\"\n      :height=\"22\"\n    />\n    <template #menu=\"{closeMenu}\">\n      <ul>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('canvas'), closeMenu()\">\n            <!-- <SVGIcon\n              :iconName=\"'canvas'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            /> -->\n            <span>2D Canvas</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('3d-canvas'), closeMenu()\">\n            <!-- <SVGIcon\n              :iconName=\"'3d_canvas'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            /> -->\n            <span>3D Canvas</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('depth-map'), closeMenu()\">\n            <!-- <SVGIcon\n              :iconName=\"'depth_map'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            /> -->\n            <span>Depth Map</span>\n          </BaseMenuButton>\n        </li>\n      </ul>\n    </template>\n  </BaseMenu>\n</template>\n\n<script setup>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\n\nconst emit = defineEmits(['visualization-selected']);\n\nfunction handleClick(visualization) {\n  emit('visualization-selected', visualization);\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import script from \"./SelectVisualizationMenu.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SelectVisualizationMenu.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <div\n    class=\"pane-header\"\n    draggable=\"true\"\n    @dragstart=\"handleDragStart\"\n  >\n    <div class=\"pane-header__start\" />\n    <div class=\"pane-header__end\">\n      <SelectVisualizationMenu @visualization-selected=\"handleVisualizationSelect\" />\n      <IconButton\n        v-if=\"!hasOnlyOneDisplay && paneValue !== 'canvas'\"\n        class=\"\"\n        :type=\"'click'\"\n        :icon=\"'close'\"\n        :width=\"20\"\n        :height=\"20\"\n        @click=\"close\"\n      />\n    </div>\n  </div>\n  <div\n    :id=\"`pane-${location.join('_')}`\"\n    ref=\"pane\"\n    class=\"pane\"\n    :class=\"{'_drag-over': isOverDropZone, '_background': !Boolean(paneValue)}\"\n    @click=\"(e) => handlePaneClick\"\n  />\n</template>\n\n<script setup>\nimport { useDropZone } from '@vueuse/core';\nimport {\n  ref,\n} from 'vue';\nimport IconButton from '@/components/IconButton.vue';\nimport SelectVisualizationMenu from '@/components/DatasetComponent/AnnotationTool/SelectVisualizationMenu.vue';\n\nconst emit = defineEmits(['drop', 'close', 'visualization-selected']);\n\nconst pane = ref(null);\n\nconst { location, paneValue } = defineProps({\n  location: {\n    type: Array,\n    default: null,\n  },\n  paneValue: {\n    type: String,\n    default: null,\n  },\n  hasOnlyOneDisplay: {\n    type: Boolean,\n    default: false,\n  },\n});\n\nfunction handleVisualizationSelect(visualization) {\n  emit('visualization-selected', { visualization, location });\n}\n\nfunction handleDragStart(e) {\n  if (paneValue) {\n    e.dataTransfer.setData('text/plain', paneValue);\n  }\n}\n\nfunction close() {\n  emit('close');\n}\n\nfunction onDrop(files, event, location) {\n  const draggedVisualization = event.dataTransfer.getData('text/plain');\n  if (draggedVisualization) {\n    emit('drop', { draggedVisualization, location });\n  }\n}\nfunction onOver(files, event) {\n  console.log(files, event);\n}\nfunction onEnter(files, event) {\n  console.log(files, event);\n}\nfunction onLeave(files, event) {\n  console.log(files, event);\n}\nfunction testDragDataTypes(types) {\n  if (types.length === 0) {\n    return true;\n  }\n  return false;\n}\nconst { isOverDropZone } = useDropZone(pane, {\n  onDrop: (files, event) => onDrop(files, event, location),\n  // onOver,\n  // onEnter,\n  // onLeave,\n  dataTypes: testDragDataTypes,\n  multiple: true,\n  preventDefaultForUnhandled: false,\n});\n\nfunction handlePaneClick() {\n\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.pane {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  // flex: 1 0 50%;\n  min-width: 0;\n  height: 100%;\n  width: 100%;\n  min-height: 0;\n\n  &._background {\n    background: linear-gradient(45deg, #f0f0f0 25%, #e0e0e0 25%, #e0e0e0 50%, #f0f0f0 50%, #f0f0f0 75%, #e0e0e0 75%, #e0e0e0 100%);\n    background-size: 20px 20px;\n  }\n\n  &._border {\n    border: 2px solid lightgray;\n  }\n\n  &._active {\n    border: 2px dotted var(--color-primary-300);\n  }\n\n  &._drag-over {\n    background: rgba(var(--color-primary-rgb), 0.125)\n  }\n}\n\n.pane-header {\n  display: flex;\n  flex-direction: row;\n  position: relative;\n  width: 100%;\n  height: 30px;\n  background: white;\n  justify-content: center;\n  cursor: grab;\n\n  &__start {\n    display: flex;\n    flex: 1 1 auto;\n    align-items: center;\n    padding-left: 6px;\n  }\n  &__end {\n    display: flex;\n    flex: 0 1 auto;\n    align-items: center;\n    padding-right: 6px;\n  }\n}\n\n</style>\n","import script from \"./VisualizationContainer.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./VisualizationContainer.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./VisualizationContainer.vue?vue&type=style&index=0&id=f111fa76&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-f111fa76\"]])\n\nexport default __exports__","<template>\n  <div class=\"displays\">\n    <div v-if=\"loading\" id=\"loading-visualization\">\n      <div class=\"lds-ring\"><div /><div /><div /><div /></div>\n    </div>\n    <SplitterGroup\n      id=\"splitter-group-1\"\n      class=\"splitter-group-main\"\n      direction=\"vertical\"\n    >\n      <template v-for=\"i in layout.length\" :key=\"`splitter-group-1-panel-${i}`\">\n        <SplitterPanel\n          :id=\"`splitter-group-1-row-${i}`\"\n          :min-size=\"20\"\n          class=\"splitter-panel _row\"\n        >\n          <SplitterGroup\n            :id=\"`splitter-group-1-row-${i}-group`\"\n            class=\"splitter-group\"\n            direction=\"horizontal\"\n          >\n            <template v-for=\"j in layout[i - 1].length\" :key=\"`splitter-group-1-column-${i}-panel-${j}`\">\n              <SplitterPanel\n                :id=\"`splitter-group-1-column-${i}-panel-${j}`\"\n                :min-size=\"20\"\n                class=\"splitter-panel\"\n              >\n                <VisualizationContainer\n                  :location=\"[i - 1, j - 1]\"\n                  :paneValue=\"layout[i - 1][j - 1]\"\n                  :hasOnlyOneDisplay=\"hasOnlyOneDisplay\"\n                  @close=\"handleClose(i - 1, j - 1)\"\n                  @drop=\"(e) => emit('drop', e)\"\n                  @visualization-selected=\"(e) => $emit('visualization-selected', e)\"\n                />\n              </SplitterPanel>\n              <SplitterResizeHandle\n                v-if=\"j != layout[i - 1].length\"\n                :id=\"`splitter-group-1-column-${i}-resize-handle-${j}`\"\n                class=\"splitter-handle _vertical\"\n              />\n            </template>\n          </SplitterGroup>\n        </SplitterPanel>\n        <SplitterResizeHandle\n          v-if=\"i !== layout.length\"\n          :id=\"`splitter-group-1-resize-handle-${i}`\"\n          class=\"splitter-handle _horizontal\"\n        />\n      </template>\n    </SplitterGroup>\n  </div>\n</template>\n\n<script setup>\nimport VisualizationContainer from '@/components/DatasetComponent/AnnotationTool/VisualizationContainer.vue';\nimport { SplitterGroup, SplitterPanel, SplitterResizeHandle } from 'radix-vue';\nimport { computed } from 'vue';\n\nconst emit = defineEmits(['update:layout', 'drop', 'visualization-selected']);\n\nconst { loading, layout } = defineProps({\n  loading: {\n    type: Boolean,\n    default: false,\n  },\n  layout: {\n    type: Array,\n    default: () => [[null]],\n  },\n});\n\nfunction handleClose(row, col) {\n  const newLayout = JSON.parse(JSON.stringify(layout));\n\n  if (layout[row] && layout[row][col] !== undefined) {\n    newLayout[row].splice(col, 1); // Remove the value at the specified row and column\n  }\n\n  // Check if the subarray is empty, and remove the subarray if it is\n  if (newLayout[row].length === 0) {\n    newLayout.splice(row, 1); // Remove the subarray entirely\n  }\n\n  emit('update:layout', newLayout);\n}\n\nconst hasOnlyOneDisplay = computed(() => {\n  if (layout?.length === 1 && layout?.[0]?.length === 1) {\n    return true;\n  }\n  return false;\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.splitter-group-main {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  flex: 1 1 auto;\n}\n\n.splitter-group {\n  width: 100%;\n  flex: 1 1 auto;\n}\n\n.splitter-panel {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-direction: column;\n\n  &._row {\n    width: 100%;\n  }\n\n  &._column {\n    height: 100%;\n  }\n}\n\n.splitter-handle {\n  background: rgba(0,0,0,0.175);\n  transition-delay: 0s;\n\n  &[data-state=\"hover\"] {\n    background: var(--color-primary);\n    outline: solid 1px var(--color-primary);\n    z-index: 2;\n    transition-delay: 0.3s;\n  }\n\n  &[data-state=\"drag\"] {\n    background: var(--color-primary);\n  }\n\n  &._vertical {\n    width: 2px;\n    height: 100%;\n  }\n\n  &._horizontal {\n    height: 2px;\n    width: 100%;\n  }\n}\n\n.displays {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  min-height: 0;\n\n  // display: grid;\n  // grid-template-columns: repeat(2, 1fr);\n  // grid-template-rows: repeat(2, 1fr);\n  // gap: 10px;\n}\n\n#loading-visualization {\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: 100%;\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 100;\n  background: rgba(0, 0, 0, 0.25);\n}\n\n.lds-ring {\n  /* change color here */\n  color: var(--color-primary);\n}\n.lds-ring,\n.lds-ring div {\n  box-sizing: border-box;\n}\n.lds-ring {\n  display: inline-block;\n  position: relative;\n  width: 80px;\n  height: 80px;\n}\n.lds-ring div {\n  box-sizing: border-box;\n  display: block;\n  position: absolute;\n  width: 64px;\n  height: 64px;\n  margin: 8px;\n  border: 8px solid currentColor;\n  border-radius: 50%;\n  animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n  border-color: currentColor transparent transparent transparent;\n}\n.lds-ring div:nth-child(1) {\n  animation-delay: -0.45s;\n}\n.lds-ring div:nth-child(2) {\n  animation-delay: -0.3s;\n}\n.lds-ring div:nth-child(3) {\n  animation-delay: -0.15s;\n}\n@keyframes lds-ring {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n</style>\n","import script from \"./VisualizationDisplays.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./VisualizationDisplays.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./VisualizationDisplays.vue?vue&type=style&index=0&id=14ca66c2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-14ca66c2\"]])\n\nexport default __exports__","<template>\n  <BaseMenu\n    :placement=\"'bottom-start'\"\n    :appendToBody=\"true\"\n    @closed=\"show_layout_menu = false\"\n  >\n    <IconButton\n      v-model=\"show_layout_menu\"\n      :icon=\"'dashboard'\"\n      :width=\"22\"\n      :height=\"22\"\n    />\n    <template #menu=\"{closeMenu}\">\n      <ul>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('layout_single'), closeMenu()\">\n            <SVGIcon\n              :iconName=\"'layout_single'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            />\n            <span>Single</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('layout_2_columns'), closeMenu()\">\n            <SVGIcon\n              :iconName=\"'layout_2_columns'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            />\n            <span>2 Columns</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('layout_2x1'), closeMenu()\">\n            <SVGIcon\n              :iconName=\"'layout_2x1'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            />\n            <span>2x1</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('layout_2x2'), closeMenu()\">\n            <SVGIcon\n              :iconName=\"'layout_2x2'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            />\n            <span>2x2</span>\n          </BaseMenuButton>\n        </li>\n      </ul>\n    </template>\n  </BaseMenu>\n</template>\n\n<script setup>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\n\nconst emit = defineEmits(['layout-selected']);\n\nfunction handleClick(layout) {\n  emit('layout-selected', layout);\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import script from \"./SelectLayoutMenu.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SelectLayoutMenu.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <BaseMenu\n    :placement=\"'bottom-start'\"\n    :appendToBody=\"true\"\n    @closed=\"show_layout_menu = false\"\n  >\n    <IconButton\n      id=\"layout-add-btn\"\n      v-model=\"show_layout_menu\"\n      :icon=\"'layout_add'\"\n      :width=\"22\"\n      :height=\"22\"\n    />\n    <template #menu=\"{closeMenu}\">\n      <ul>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('canvas'), closeMenu()\">\n            <!-- <SVGIcon\n              :iconName=\"'canvas'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            /> -->\n            <span>2D Canvas</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('3d-canvas'), closeMenu()\">\n            <!-- <SVGIcon\n              :iconName=\"'3d_canvas'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            /> -->\n            <span>3D Canvas</span>\n          </BaseMenuButton>\n        </li>\n        <li>\n          <BaseMenuButton @click.stop=\"handleClick('depth-map'), closeMenu()\">\n            <!-- <SVGIcon\n              :iconName=\"'depth_map'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            /> -->\n            <span>Depth Map</span>\n          </BaseMenuButton>\n        </li>\n      </ul>\n    </template>\n  </BaseMenu>\n</template>\n\n<script setup>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\n\nconst emit = defineEmits(['layout-selected']);\n\nfunction handleClick(layout) {\n  emit('layout-selected', layout);\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n#layout-add-btn {\n  color: var(--color-primary);\n}\n</style>\n","import script from \"./AddVisualizationMenu.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./AddVisualizationMenu.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./AddVisualizationMenu.vue?vue&type=style&index=0&id=b44c9040&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-b44c9040\"]])\n\nexport default __exports__","import {\n  ref, watch,\n} from 'vue';\n\nexport default function usePCD() {\n  const visualizationLocations = ref({});\n  const layouts = {\n    layout_single: [[null]],\n    layout_2_columns: [[null, null]],\n    layout_2x1: [[null, null], [null]],\n    layout_2x2: [[null, null], [null, null]],\n  };\n  const layout = ref([\n    ['canvas'],\n  ]);\n\n  function handleAddVisualization(visualization) {\n    if (visualization) {\n      const layoutHasVisualization = checkForNestedArrayValue(layout.value, visualization);\n      if (!layoutHasVisualization) {\n        const wasReplaced = replaceFirstNull(layout.value, visualization);\n        if (!wasReplaced) {\n          layout.value[0].push(visualization);\n        }\n      }\n    }\n  }\n\n  function replaceFirstNull(arr, newValue) {\n    for (let i = 0; i < arr.length; i++) {\n      if (Array.isArray(arr[i])) {\n        // If the current element is an array, recurse into it\n        const result = replaceFirstNull(arr[i], newValue);\n        if (result) return true; // Stop once we have replaced the first null\n      } else if (arr[i] === null) {\n        // If a null is found, replace it with the new value\n        arr[i] = newValue;\n        return true; // Return true to indicate a replacement was made\n      }\n    }\n    return false; // Return false if no null was found\n  }\n\n  function handleVisualizationSelected(e) {\n    if (e.visualization) {\n      removeNestedArrayValue(layout.value, e.visualization);\n      setNestedArrayValue(layout.value, e.location, e.visualization);\n    }\n  }\n\n  function handleVisualizationContainerDrop(e) {\n    if (e.draggedVisualization) {\n      const currentLocation = visualizationLocations.value[e.draggedVisualization];\n      const targetValue = getNestedArrayValue(layout.value, e.location);\n      setNestedArrayValue(layout.value, currentLocation, targetValue);\n      setNestedArrayValue(layout.value, e.location, e.draggedVisualization);\n    }\n  }\n\n  function handleLayoutSelected(layoutSelected) {\n    const newLayout = structuredClone(layouts[layoutSelected]);\n\n    const existingVisualizations = layout.value.flatMap((row) => row).filter((value) => value !== null);\n\n    let index = 0; // Keep track of the current index in the 1D array\n    function traverseAndFill(arr) {\n      for (let i = 0; i < arr.length; i++) {\n        if (Array.isArray(arr[i])) {\n        // If the current element is an array, recursively traverse it\n          traverseAndFill(arr[i]);\n        } else if (arr[i] === null && index < existingVisualizations.length) {\n        // If the element is null, replace it with the next value from the 1D array\n          arr[i] = existingVisualizations[index];\n          index += 1;\n        }\n      }\n    }\n    traverseAndFill(newLayout);\n\n    layout.value = newLayout;\n  }\n\n  function checkForNestedArrayValue(arr, value) {\n    for (let i = 0; i < arr.length; i++) {\n      if (Array.isArray(arr[i])) {\n        // If the element is an array, recurse into it\n        if (checkForNestedArrayValue(arr[i], value)) return true;\n      } else if (arr[i] === value) {\n        // If the specific value is found, return true\n        return true;\n      }\n    }\n    // Return false if the specific value is not found\n    return false;\n  }\n\n  function getNestedArrayValue(layout, indices) {\n    const indicesClone = JSON.parse(JSON.stringify(indices));\n    // Navigate to the second-to-last index\n    const lastIndex = indicesClone.pop(); // Remove the last index for assignment\n    const targetArray = indicesClone.reduce((acc, currentIndex) => acc[currentIndex], layout);\n\n    // Set the value at the specified index\n    return targetArray[lastIndex];\n  }\n\n  function setNestedArrayValue(layout, indices, value) {\n    const indicesClone = JSON.parse(JSON.stringify(indices));\n    // Navigate to the second-to-last index\n    const lastIndex = indicesClone.pop(); // Remove the last index for assignment\n    const targetArray = indicesClone.reduce((acc, currentIndex) => acc[currentIndex], layout);\n\n    // Set the value at the specified index\n    targetArray[lastIndex] = value;\n  }\n\n  function removeNestedArrayValue(array, valueToRemove) {\n    for (let i = 0; i < array.length; i++) {\n      if (Array.isArray(array[i])) {\n        // If the current element is an array, recurse into it\n        removeNestedArrayValue(array[i], valueToRemove);\n      } else if (array[i] === valueToRemove) {\n        // If the element matches the value to remove, set it to null\n        array[i] = null;\n      }\n    }\n  }\n\n  function mapNonNullValues(array) {\n    const map = {};\n\n    function traverse(arr, currentIndex = []) {\n      for (let i = 0; i < arr.length; i++) {\n        const newIndex = currentIndex.concat(i); // Build up the index for this element\n\n        if (Array.isArray(arr[i])) {\n          // If the current element is an array, recursively traverse it\n          traverse(arr[i], newIndex);\n        } else if (arr[i] !== null) {\n          // If the element is not null, map the value to its index\n          map[arr[i]] = newIndex;\n        }\n      }\n    }\n\n    traverse(array);\n    return map;\n  }\n\n  function getLocationId(location) {\n    return `#pane-${location.join('_')}`;\n  }\n\n  watch(layout, (newLayout) => {\n    const result = mapNonNullValues(newLayout);\n    visualizationLocations.value = result;\n  }, { immediate: true, deep: true });\n\n  return {\n    handleAddVisualization,\n    handleVisualizationSelected,\n    handleVisualizationContainerDrop,\n    getLocationId,\n    handleLayoutSelected,\n    visualizationLocations,\n    layout,\n  };\n}\n","import DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { ref, computed } from 'vue';\n\nexport default function useImagesFetch() {\n  const dataConnect = new DatastoreConnect();\n  const controller = ref(new AbortController());\n\n  function getImagesFilterParams(filters) {\n    const params = {\n      images_filter: {},\n      image_files_filter: {},\n      annotations_filter: {},\n    };\n\n    // Images filter\n    if (filters.groupsFilter && filters.groupsFilter.length > 0) {\n      params.images_filter.group_ids = filters.groupsFilter;\n    }\n\n    // Annotations filter\n    if (filters.confidenceRangeFilter) {\n      params.annotations_filter.lower_score = filters.confidenceRangeFilter[0];\n      params.annotations_filter.upper_score = filters.confidenceRangeFilter[1];\n    }\n    if (filters.annotationSetFilter && filters.annotationSetFilter.length > 0) {\n      params.annotations_filter.annotation_set_ids = filters.annotationSetFilter.map((set) => set.id);\n    }\n    if (filters.imagesWithAnnotationSetFilter && filters.imagesWithAnnotationSetFilter.length > 0) {\n      params.annotations_filter.images_with_annotation_set_ids = filters.imagesWithAnnotationSetFilter.map((set) => set.id);\n    }\n    if (filters.annotationLabelFilter && filters.annotationLabelFilter.length > 0) {\n      params.annotations_filter.images_with_annotation_label_indexes = filters.annotationLabelFilter;\n    }\n    if (filters.boundingBoxSizeFilter) {\n      Object.entries(filters.boundingBoxSizeFilter).forEach(([key, value]) => {\n        if (key !== 'type' && value) {\n          params.annotations_filter[`${key}_${filters.boundingBoxSizeFilter.type}`] = value;\n        }\n      });\n    }\n\n    // Image files filter\n    if (filters.imageNameFilter && filters.imageNameFilter.length > 0) {\n      params.image_files_filter.image_name = filters.imageNameFilter;\n    }\n    if (filters.timeRangeFilter) {\n      params.image_files_filter.lower_time = filters.timeRangeFilter[0];\n      params.image_files_filter.upper_time = filters.timeRangeFilter[1];\n    }\n    if (filters.dateRangeFilter) {\n      if (filters.dateRangeFilter[0]) {\n        params.image_files_filter.lower_date = new Date(filters.dateRangeFilter[0]).toISOString();\n      }\n      if (filters.dateRangeFilter[1]) {\n        params.image_files_filter.upper_date = new Date(filters.dateRangeFilter[1]).toISOString();\n      }\n    }\n    if (filters.cameraSourceFilter && filters.cameraSourceFilter.length > 0) {\n      params.image_files_filter.image_sources = filters.cameraSourceFilter;\n    }\n\n    // if (filters.displayAnnotationsFilter && filters.displayAnnotationsFilter.value.length > 0) {\n    //   if (filters.displayAnnotationsFilter.displayType === 'byAnnotationSets') {\n    //     params.annotations_filter.aggregate_annotation_set_ids = filters.displayAnnotationsFilter.value;\n    //   }\n    //   // if (filters.displayAnnotationsFilter.displayType === 'byAnnotationLabels') {}\n    // }\n\n    return params;\n  }\n\n  async function getImages(filters, {\n    get_annotations = true,\n    sort_by = 'id',\n    reverse = false,\n    offset = 0,\n    limit = undefined,\n    only_count = false,\n    only_ids = false,\n  } = {}, signal) {\n    const imageListParams = {\n      ...{\n        get_annotations,\n        sort_by,\n        reverse,\n        offset,\n        limit,\n        only_count,\n        only_ids,\n      },\n      ...filters,\n    };\n    const imageList = await dataConnect.getFilteredImages(imageListParams, signal)\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        if (signal.aborted) {\n          throw Error(\"aborted\");\n        }\n        console.log(error);\n        alert(error);\n        return [];\n      });\n\n    return imageList;\n  }\n\n  async function getLabellingSequenceFrames(filters, {\n    get_annotations = true,\n    sort_by = 'id',\n    reverse = false,\n    offset = 0,\n    limit = undefined,\n    source_annotation_set_id = undefined,\n    annotations_filter = undefined,\n    aggregate_annotations_filter = undefined,\n    review_task_id = undefined,\n    only_ids = false,\n  } = {}, signal) {\n    const imageListParams = {\n      ...{\n        get_annotations,\n        sort_by,\n        reverse,\n        offset,\n        limit,\n        source_annotation_set_id,\n        annotations_filter,\n        aggregate_annotations_filter,\n        review_task_id,\n        only_ids,\n      },\n      ...filters,\n    };\n    const imageList = await dataConnect.getLabellingSequenceFrames(imageListParams, signal)\n      .then((resp) => {\n        if (resp.error !== undefined) {\n          throw Error(resp.error.message);\n        }\n        return resp.result;\n      })\n      .catch((error) => {\n        if (signal.aborted) {\n          throw Error(\"aborted\");\n        }\n        console.log(error);\n        alert(error);\n        return [];\n      });\n\n    return imageList;\n  }\n\n  return {\n    controller,\n    getImages,\n    getLabellingSequenceFrames,\n  };\n}\n","<template>\n  <div ref=\"gridContainer\" class=\"grid-container scrollbar\">\n    <div ref=\"gridHeader\" class=\"grid-header\" />\n    <div class=\"grid-content\">\n      <div class=\"timeline-labels\">\n        <span v-for=\"d in data\" :key=\"d.id\">{{ d.id }}</span>\n      </div>\n      <div ref=\"timeline\" class=\"timeline\" />\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport * as d3 from 'd3';\nimport {\n  ref, toRefs, computed, onMounted, watch, nextTick,\n} from 'vue';\n\nconst props = defineProps({\n  data: {\n    type: Object,\n    default: null,\n  },\n  frame: {\n    type: Number,\n    default: 0,\n  },\n  frameCount: {\n    type: Number,\n    default: 0,\n  },\n});\nconst {\n  data,\n  frame,\n  frameCount,\n} = toRefs(props);\n\nconst emit = defineEmits(['update:frame', 'update:data']);\n\nconst margin = {\n  top: 0, right: 20, bottom: 5, left: 0,\n};\nconst labelMargin = 100;\nconst gridContainer = ref(null);\nconst gridHeader = ref(null);\nconst timeline = ref(null);\nconst scrubberPosition = ref(1);\nconst scrubberHeight = ref(10);\nconst lineCoordinates = ref({\n  x1: 0, y1: 0, x2: 0, y2: 0,\n});\n\nconst rowHeight = 30;\nconst frameWidth = 20;\nconst height = computed(() => Math.max((data.value.length * rowHeight) - margin.top - margin.bottom, 0));\nconst width = computed(() => Math.max((frameWidth * frameCount.value) - margin.left - margin.right, 0));\n\nlet svg = null;\nlet svgGroup = null;\nlet xAxis = null;\nlet yAxis = null;\nlet svgHeader = null;\nlet svgHeaderGroup = null;\nlet xAxisHeader = null;\nlet line = null;\nconst scrubber = ref(null);\nlet xScale = null;\nlet yScale = null;\n\nconst keyframes = computed(() => data.value.flatMap((d, i) => Object.entries(d.keyframes).map(([frame, properties]) => ({\n  rowIndex: i, id: d.id, frame: parseInt(frame), properties,\n}))));\n\nconst keyframeRanges = computed(() => {\n  const ranges = [];\n  data.value.forEach((keyframeObject, keyframeObjectIndex) => {\n    const keys = Object.keys(keyframeObject.keyframes).map((key) => parseInt(key)).sort((a, b) => a - b);\n    keys.forEach((key, i) => {\n      if (!keyframeObject.keyframes[key].end) {\n        if (keys[i + 1]) {\n          ranges.push({ y: keyframeObjectIndex, x1: keys[i], x2: keys[i + 1] });\n        } else {\n          ranges.push({ y: keyframeObjectIndex, x1: keys[i], x2: frameCount.value });\n        }\n      }\n    });\n  });\n  return ranges;\n});\n\nwatch(data, () => {\n  nextTick(() => {\n    updateChart();\n  });\n}, { deep: true });\n\nwatch(frame, () => {\n  scrubberPosition.value = frame.value;\n  moveScrubber();\n});\n\nwatch(scrubberPosition, () => {\n  emit('update:frame', scrubberPosition.value);\n});\n\nwatch(frameCount, () => {\n  updateChart();\n});\n\nfunction scrollToFrame(frame) {\n  gridContainer.value.scrollTo({ left: (frame - 2) * frameWidth, behavior: 'smooth' });\n}\n\nfunction createGrid() {\n  svg = d3.select(timeline.value)\n    .append(\"svg\")\n    .attr(\"width\", width.value + margin.left + margin.right)\n    .attr(\"height\", height.value + margin.top + margin.bottom)\n    .on('click', handleTimelineClick);\n\n  svgGroup = svg\n    .append(\"g\")\n    .attr(\"transform\", `translate(${margin.left},${margin.top})`);\n\n  xScale = d3.scaleLinear()\n    .domain([1, frameCount.value])\n    .range([0, width.value]);\n\n  yScale = d3.scaleLinear()\n    .domain([0, data.value.length])\n    .range([0, height.value]);\n\n  xAxis = d3.axisTop(xScale)\n    .ticks(frameCount.value)\n    .tickSize(height.value)\n    .tickFormat(\"\");\n\n  yAxis = d3.axisLeft(yScale)\n    .ticks(data.value.length)\n    .tickSize(-width.value)\n    .tickFormat(\"\");\n\n  svgGroup.append(\"g\")\n    .attr('id', 'x-axis')\n    .attr(\"class\", \"axis\")\n    .attr(\"transform\", `translate(0,${height.value})`)\n    .call(xAxis);\n\n  svgGroup.append(\"g\")\n    .attr('id', 'y-axis')\n    .attr(\"class\", \"axis\")\n    .call(yAxis);\n\n  // Add line element\n  lineCoordinates.value.x1 = xScale(scrubberPosition.value);\n  lineCoordinates.value.x2 = xScale(scrubberPosition.value);\n  lineCoordinates.value.y2 = height.value;\n  line = svgGroup.append(\"line\")\n    .attr(\"class\", \"scrubber-line\")\n    .attr(\"stroke-width\", 2)\n    .attr(\"x1\", lineCoordinates.value.x1)\n    .attr(\"y1\", lineCoordinates.value.y1)\n    .attr(\"x2\", lineCoordinates.value.x2)\n    .attr(\"y2\", lineCoordinates.value.y2);\n\n  // Add keyframe range lines element\n  svgGroup\n    .selectAll(\".keyframe-range\")\n    .data(keyframeRanges.value)\n    .enter()\n    .append(\"line\")\n    .attr(\"class\", \"keyframe-range\")\n    .attr(\"x1\", (d) => xScale(d.x1))\n    .attr(\"y1\", (d) => yScale(d.y + 0.5))\n    .attr(\"x2\", (d) => xScale(d.x2))\n    .attr(\"y2\", (d) => yScale(d.y + 0.5));\n\n  // Add circles for data points\n  svgGroup\n    .selectAll(\".circle\")\n    .data(keyframes.value)\n    .enter()\n    .append(\"circle\")\n    .attr(\"class\", \"circle\")\n    .attr(\"cx\", (d) => xScale(d.frame))\n    .attr(\"cy\", (d) => yScale(d.rowIndex + 0.5))\n    .attr(\"r\", 5)\n    .classed(\"_end\", (d) => d.properties.end)\n    .on('click', handleKeyframeNodeClick);\n\n  createHeader();\n}\n\nfunction createHeader() {\n  svgHeader = d3.select(gridHeader.value)\n    .append(\"svg\")\n    .attr(\"width\", width.value + labelMargin + margin.left + margin.right)\n    .attr(\"height\", 32)\n    .on('click', handleTimelineClick);\n\n  svgHeaderGroup = svgHeader\n    .append(\"g\")\n    .attr(\"transform\", `translate(${labelMargin},0)`);\n\n  xAxisHeader = d3.axisTop(xScale)\n    .ticks(frameCount.value)\n    .tickSize(10)\n    .tickFormat((d) => (d % 5 === 0 ? d : \"\"));\n\n  svgHeaderGroup.append(\"g\")\n    .attr('id', 'header')\n    .attr(\"class\", \"axis\")\n    .attr(\"transform\", `translate(0,${30})`)\n    .call(xAxisHeader);\n\n  // Add scrubber handle (as a square)\n  scrubber.value = svgHeaderGroup.append(\"rect\")\n    .attr(\"class\", \"scrubber\")\n    .attr(\"x\", xScale(scrubberPosition.value) - (scrubberHeight.value / 2))\n    .attr(\"y\", 32 - scrubberHeight.value)\n    .attr(\"width\", scrubberHeight.value)\n    .attr(\"height\", scrubberHeight.value)\n    .call(d3.drag()\n      .on(\"drag\", (event) => {\n        const newX = Math.max(0, Math.min(width.value, event.x));\n        scrubberPosition.value = snapToTick(xScale.invert(newX));\n        moveScrubber();\n      }));\n}\n\nfunction moveScrubber() {\n  scrubber.value.attr(\"x\", xScale(scrubberPosition.value) - (scrubberHeight.value / 2));\n  updateLineCoordinates(xScale(scrubberPosition.value));\n}\n\nfunction updateChart() {\n  updateHeader();\n  updateAxes();\n  updateScrubber();\n  updateKeyframes();\n}\n\nfunction updateHeader() {\n  xScale.domain([1, frameCount.value]).range([0, width.value]);\n  svgHeaderGroup.selectAll('#header').call(xAxisHeader.ticks(frameCount.value).tickSize(10));\n  svgHeader.attr(\"width\", width.value + labelMargin + margin.left + margin.right);\n}\n\nfunction updateAxes() {\n  yScale.domain([0, data.value.length]).range([0, height.value]);\n  xScale.domain([1, frameCount.value]).range([0, width.value]);\n  svg.selectAll('#y-axis').call(yAxis.ticks(data.value.length).tickSize(-width.value));\n  svg.selectAll('#x-axis').attr(\"transform\", `translate(0,${height.value})`).call(xAxis.ticks(frameCount.value).tickSize(height.value));\n  svg.attr(\"height\", height.value);\n  svg.attr(\"width\", width.value);\n}\n\nfunction updateScrubber() {\n  lineCoordinates.value.y2 = height.value;\n\n  line\n    .attr(\"x1\", lineCoordinates.value.x1)\n    .attr(\"y1\", lineCoordinates.value.y1)\n    .attr(\"x2\", lineCoordinates.value.x2)\n    .attr(\"y2\", lineCoordinates.value.y2);\n}\n\nfunction updateKeyframes() {\n  svgGroup\n    .selectAll(\".keyframe-range\")\n    .data(keyframeRanges.value)\n    .join(\n      (enter) => enter.selectAll(\".keyframe-range\")\n        .data(keyframeRanges.value)\n        .enter()\n        .append(\"line\")\n        .attr(\"class\", \"keyframe-range\")\n        .attr(\"x1\", (d) => xScale(d.x1))\n        .attr(\"y1\", (d) => yScale(d.y + 0.5))\n        .attr(\"x2\", (d) => xScale(d.x2))\n        .attr(\"y2\", (d) => yScale(d.y + 0.5))\n        .lower(),\n      (update) => update\n        .attr(\"x1\", (d) => xScale(d.x1))\n        .attr(\"y1\", (d) => yScale(d.y + 0.5))\n        .attr(\"x2\", (d) => xScale(d.x2))\n        .attr(\"y2\", (d) => yScale(d.y + 0.5)),\n      (exit) => exit.remove(),\n    );\n\n  svgGroup\n    .selectAll(\".circle\")\n    .data(keyframes.value)\n    .join(\n      (enter) => enter.selectAll(\".circle\")\n        .data(keyframes.value)\n        .enter()\n        .append(\"circle\")\n        .attr(\"class\", \"circle\")\n        .attr(\"cx\", (d) => xScale(d.frame))\n        .attr(\"cy\", (d) => yScale(d.rowIndex + 0.5))\n        .attr(\"r\", 5)\n        .classed(\"_end\", (d) => d.properties?.end)\n        .on('click', handleKeyframeNodeClick)\n        .raise(),\n      (update) => update\n        .attr(\"cx\", (d) => xScale(d.frame))\n        .attr(\"cy\", (d) => yScale(d.rowIndex + 0.5))\n        .classed(\"_end\", (d) => d.properties?.end),\n      (exit) => exit.remove(),\n    );\n}\n\nfunction updateLineCoordinates(newX) {\n  const {\n    x1, y1, x2, y2,\n  } = lineCoordinates.value;\n  lineCoordinates.value = {\n    x1: newX, y1, x2: newX, y2,\n  };\n  line\n    .attr(\"x1\", lineCoordinates.value.x1)\n    .attr(\"y1\", lineCoordinates.value.y1)\n    .attr(\"x2\", lineCoordinates.value.x2)\n    .attr(\"y2\", lineCoordinates.value.y2);\n}\n\nfunction snapToTick(value) {\n  const nearestTick = Math.round(value);\n  return nearestTick;\n}\n\nfunction handleKeyframeNodeClick(event, d) {\n  const tempData = JSON.parse(JSON.stringify(data.value));\n  tempData[d.rowIndex].keyframes[d.frame].end = !tempData[d.rowIndex].keyframes[d.frame].end;\n  emit('update:data', tempData);\n}\n\nfunction handleTimelineClick(event) {\n  const [x] = d3.pointer(event, svg.node()); // Get the x-coordinate of the click relative to the SVG element\n  const clickedFrame = xScale.invert(x); // Convert the x-coordinate to the corresponding frame value\n  scrubberPosition.value = snapToTick(clickedFrame);\n  moveScrubber();\n}\n\nonMounted(() => {\n  scrubberPosition.value = frame.value;\n  createGrid();\n\n  scrollToFrame(frame.value);\n});\n</script>\n\n<style>\n.grid-container {\n  max-height: 250px;\n  overflow-x: auto;\n  overflow-y: auto;\n  display: flex;\n  flex-direction: column;\n}\n\n.grid-header {\n  position: sticky;\n  top: 0px;\n  display: flex;\n  align-items: flex-start;\n  height: 30px;\n  width: fit-content;\n  background: white;\n  z-index: 2;\n}\n\n.grid-content {\n  display: flex;\n  flex-direction: row;\n  background: var(--color-white-700);\n}\n\n.timeline {\n  display: flex;\n  justify-content: flex-start;\n  flex: 1 1 auto;\n}\n\n.timeline-labels {\n  display: flex;\n  flex-direction: column;\n  min-width: 100px;\n  max-width: 100px;\n  position: sticky;\n  left: 0;\n  background: white;\n\n  & span {\n    height: 30px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    text-wrap: nowrap;\n  }\n}\n\n.axis line {\n  stroke: rgba(0, 0, 0, 0.125);\n  stroke-opacity: 0.7;\n  shape-rendering: crispEdges;\n}\n\n.scrubber {\n  cursor: pointer;\n  fill: var(--color-primary);\n}\n\n.scrubber-line {\n  stroke: var(--color-primary);\n}\n\n.line {\n  pointer-events: none;\n}\n\n.circle {\n  fill: var(--color-accent);\n  stroke: var(--color-primary);\n  stroke-width: 1;\n  cursor: pointer;\n}\n\n.circle._end {\n  fill: transparent;\n  stroke: var(--color-accent);\n  stroke-width: 2;\n}\n\n.keyframe-range {\n  stroke: var(--color-accent);\n  stroke-opacity: 0.625;\n  stroke-width: 3;\n}\n\n</style>\n","import script from \"./KeyframeTimeline2.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./KeyframeTimeline2.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./KeyframeTimeline2.vue?vue&type=style&index=0&id=1fdd5f3f&lang=css\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <div class=\"animation-controls\">\n    <div class=\"timeline\">\n      <Scrubber\n        v-model=\"frame\"\n        :min=\"1\"\n        :max=\"frameCount\"\n        :secondary=\"buffered\"\n        :step=\"1\"\n        @scrubbing-end=\"doneScrubbing\"\n      >\n        <template #default=\"{ position, pendingValue }\">\n          <div\n            class=\"scrubber-popup\"\n            :style=\"{ left: position }\"\n          >\n            {{ formatScrubberValue(pendingValue) }}\n          </div>\n          <div\n            class=\"scrubber-thumb\"\n            :style=\"{ left: position }\"\n          />\n        </template>\n      </Scrubber>\n    </div>\n    <div class=\"controls\">\n      <div class=\"controls__start\">\n        <span v-if=\"frame && frameCount\">{{ frame }} / {{ frameCount }}</span>\n        <SVGIcon\n          v-if=\"isLoadingSampleFailed\"\n          v-tooltip=\"`Sample failed to load: Missing key`\"\n          class=\"warning-icon ms-1\"\n          :iconName=\"'warning'\"\n          :width=\"'20px'\"\n          :height=\"'20px'\"\n        />\n      </div>\n      <div class=\"controls__buttons\">\n        <IconButton\n          :icon=\"'skip_previous'\"\n          :width=\"24\"\n          :height=\"24\"\n          :type=\"'click'\"\n          @click=\"handleSkipPrevious\"\n        />\n        <IconButton\n          v-model=\"playing\"\n          aria-label=\"Play/Pause\"\n          :icon=\"'play'\"\n          :iconActive=\"'pause'\"\n          :width=\"32\"\n          :height=\"32\"\n          :type=\"'toggle-icon'\"\n          :showHover=\"true\"\n          @click=\"handlePlayButtonClick\"\n        />\n        <IconButton\n          :icon=\"'skip_next'\"\n          :width=\"24\"\n          :height=\"24\"\n          :type=\"'click'\"\n          @click=\"handleSkipNext\"\n        />\n      </div>\n      <div class=\"controls__end\">\n        <!-- <div class=\"annotation-search\">\n          <AnnotationExpandingSearch\n            :labels=\"labels\"\n            @previous=\"handlePreviousAnnotationClicked\"\n            @next=\"handleNextAnnotationClicked\"\n          />\n        </div> -->\n        <BaseMenu\n          :placement=\"'bottom-start'\"\n          :appendToBody=\"true\"\n          @closed=\"show_playback_menu = false\"\n        >\n          <IconButton\n            v-model=\"show_playback_menu\"\n            title=\"Playback Speed\"\n            :icon=\"'playback_speed'\"\n            :width=\"24\"\n            :height=\"24\"\n            class=\"ms-auto\"\n          />\n          <template #menu>\n            <div class=\"input-buttons scrollbar\">\n              <template v-for=\"(option, index) in playback_options\" :key=\"index\">\n                <label\n                  :for=\"`menuItem-${option.value}`\"\n                  class=\"input-buttons__row input-buttons__row-button\"\n                >\n                  <div class=\"input-buttons__row-button-check me-2\">\n                    <SVGIcon\n                      v-if=\"fps === option.value\"\n                      :iconName=\"'check'\"\n                      :height=\"'20px'\"\n                      :width=\"'20px'\"\n                    />\n                  </div>\n                  <input\n                    :id=\"`menuItem-${option.value}`\"\n                    v-model=\"fps\"\n                    type=\"radio\"\n                    :value=\"option.value\"\n                  >\n                  <span>{{ option.name }}</span>\n                </label>\n              </template>\n            </div>\n          </template>\n        </BaseMenu>\n        <SVGIcon\n          v-if=\"currentAnimationSample && currentAnimationSample?.imageObj?.review_status == 'Done'\"\n          class=\"verified_badge\"\n          :iconName=\"'verified_filled'\"\n          :width=\"'24px'\"\n          :height=\"'24px'\"\n        />\n      </div>\n    </div>\n    <div>\n      <KeyframeTimeline2\n        v-if=\"doKeyframesExist\"\n        v-model:frame=\"frame\"\n        v-model:data=\"keyframes\"\n        :frameCount=\"frameCount\"\n        class=\"mt-2 mb-2\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport {\n  ref, onMounted, onUnmounted, watch, toRefs, computed, nextTick, shallowRef,\n} from 'vue';\nimport useImagesFetch from '@/composables/useImagesFetch.js';\nimport IconButton from '@/components/IconButton.vue';\nimport Scrubber from '@/components/DatasetComponent/AnnotationTool/VideoControls/Scrubber.vue';\nimport KeyframeTimeline2 from '@/components/DatasetComponent/AnnotationTool/KeyframeTimeline2.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport useViewerVisualizations from '@/composables/useViewerVisualizations.js';\nimport useGallery from '@/composables/annotationTool/useGallery.js';\nimport { useStore } from 'vuex';\nimport * as THREE from 'three';\n\nconst props = defineProps({\n  imagesParams: {\n    type: Object,\n    default: null,\n  },\n  currentImage: {\n    type: Object,\n    default: null,\n  },\n  isTask: {\n    type: Boolean,\n    default: false,\n  },\n  reviewSettings: {\n    type: Object,\n    default: null,\n  },\n  labels: {\n    type: Array,\n    default: () => [],\n  },\n  selectedAnnotationSets: {\n    type: Array,\n    default: () => [],\n  },\n});\nconst {\n  imagesParams,\n  currentImage,\n  selectedAnnotationSets,\n} = toRefs(props);\n\n// const worker = new Worker(new URL('@/workers/cacheWorker.js', import.meta.url), {\n//   type: 'module',\n// });\n\n// worker.onmessage = (message) => {\n//   handleCacheWorkerResults(message.data);\n// };\n\n// worker.onerror = (message) => {\n//   console.log(\"worker error:\", message);\n// };\n\nconst store = useStore();\n\nconst emit = defineEmits(['samples-loaded']);\ndefineExpose({ handleSkipPrevious, handleSkipNext, handleClearCache });\n\nconst show_playback_menu = ref(false);\nconst playback_options = ref([\n  {\n    value: 1,\n    name: '1 FPS',\n  },\n  {\n    value: 5,\n    name: '5 FPS',\n  },\n  {\n    value: 10,\n    name: '10 FPS',\n  },\n  {\n    value: 20,\n    name: '20 FPS',\n  },\n  {\n    value: 100,\n    name: '100 FPS',\n  },\n]);\n\nconst {\n  samples,\n  animationImageCache,\n  frame,\n  playing,\n  buffered,\n  currentAnimationSample,\n  keyframes,\n  doKeyframesExist,\n  frameCount,\n  fps,\n  isInitializingAnimation,\n  topics,\n  cacheWorkerPool,\n\n  cacheImages,\n  processSample,\n  loadSample,\n  loadSampleToCache,\n  abortCaching,\n\n  startAnimation,\n  pauseAnimation,\n  addNewSampleToCache,\n  clearSample,\n  updateSample,\n  throttledUpdateSample,\n  resetForNewSequence,\n  $reset,\n  limitAnnotationsToSet,\n} = useViewerVisualizations(selectedAnnotationSets.value);\n\nconst {\n  getImagesFilterParams,\n} = useGallery();\n\nconst { controller, getImages, getLabellingSequenceFrames } = useImagesFetch();\n\nconst imagesFilterParams = computed(() => getImagesFilterParams());\n\nasync function doneScrubbing() {\n  playing.value = false;\n  if (!isInitializingAnimation.value && frameCount.value > 0) {\n    if (\n      !animationImageCache.value[frame.value - 1]\n        || !animationImageCache.value[frame.value - 1].loaded\n    ) {\n      addNewSampleToCache(frame.value - 1);\n      clearSample();\n      cacheWorkerPool.restartWorkers();\n      await processSample({ imageId: samples.value[frame.value - 1], annotationSetId: limitAnnotationsToSet.value, indexToCache: frame.value - 1 });\n      updateSample();\n    }\n  }\n  nextTick(() => {\n    cacheImages();\n  });\n}\n\nonMounted(async () => {\n  resetForNewSequence();\n\n  loadFirstImage();\n});\n\nonUnmounted(async () => {\n  abortCaching();\n  $reset();\n});\n\nasync function loadFirstImage() {\n  if (controller.value) {\n    controller.value.abort();\n  }\n  controller.value = new AbortController();\n  const currentSignal = controller.value.signal;\n\n  isInitializingAnimation.value = true;\n\n  // Load sample to the currentAnimationSample\n  const firstSample = {\n    image: null,\n    imageObj: null,\n    annotations: [],\n    loaded: false,\n  };\n  currentAnimationSample.value = firstSample;\n\n  if (props.isTask) {\n    limitAnnotationsToSet.value = props.reviewSettings.reviewTask.source_annotation_set_id;\n  } else {\n    limitAnnotationsToSet.value = null;\n  }\n\n  await processSample({ imageId: currentImage.value.id, annotationSetId: limitAnnotationsToSet.value });\n  updateSample();\n\n  isInitializingAnimation.value = false;\n\n  // let images = [];\n  if (props.isTask) {\n    const filters = {\n      images_filter: {\n        sequence_id: currentImage.value.sequence_id,\n      },\n      image_files_filter: {},\n    };\n    filters.images_filter.dataset_id = props.reviewSettings.reviewTask.dataset_id;\n    filters.aggregate_annotations_filter = { ...filters.aggregate_annotations_filter, aggregate_annotation_set_ids: [props.reviewSettings.reviewTask.dest_annotation_set_id] };\n    const options = {\n      sort_by: 'id',\n      reverse: false,\n      offset: 0,\n      source_annotation_set_id: props.reviewSettings.reviewTask.source_annotation_set_id,\n      annotations_filter: null,\n      aggregate_annotations_filter: { aggregate_annotation_set_ids: [props.reviewSettings.reviewTask.dest_annotation_set_id] },\n      review_task_id: props.reviewSettings.reviewTask.id,\n      only_ids: true,\n    };\n    samples.value = await getLabellingSequenceFrames(filters, options, currentSignal)\n      .catch((err) => {\n        console.log(err);\n        throw Error(err);\n      });\n  } else {\n    const filters = {\n      ...imagesFilterParams.value,\n    };\n    filters.images_filter.dataset_id = currentImage.value.dataset_id;\n    filters.images_filter.sequence_id = currentImage.value.sequence_id;\n    const params = {\n      ...imagesParams.value,\n      combine_sequence_frames: true,\n      get_annotations: false,\n      limit: 0,\n      offset: 0,\n      only_ids: true,\n    };\n    // const options = {\n    //   get_annotations: false,\n    //   sort_by: 'id',\n    //   reverse: false,\n    //   offset: 0,\n    // };\n    samples.value = await getImages(filters, params, currentSignal)\n      .catch((err) => {\n        throw Error(err);\n      });\n  }\n\n  emit('samples-loaded', samples.value);\n\n  const offset = samples.value.findIndex((e) => e === currentImage.value.id);\n\n  frameCount.value = samples.value.length;\n  if (offset) {\n    frame.value = offset + 1;\n  } else {\n    frame.value = 1;\n  }\n\n  if (!currentSignal.aborted) {\n    nextTick(() => {\n      cacheImages();\n    });\n  }\n}\n\nwatch(frame, (newFrame, oldFrame) => {\n  if (oldFrame === 0) return; // Don't let this function set the sample for first image\n  if (samples.value.length > 0) {\n    if (!playing.value) {\n      throttledUpdateSample();\n    }\n  }\n});\n\nfunction formatScrubberValue(v) {\n  return v;\n}\n\nfunction handlePlayButtonClick() {\n  playing.value ? pauseAnimation() : startAnimation();\n}\n\nasync function handleSkipPrevious() {\n  if (frame.value > 1) {\n    frame.value -= 1;\n\n    if (!animationImageCache.value[frame.value - 1]?.loaded) {\n      addNewSampleToCache(frame.value - 1);\n      clearSample();\n      cacheWorkerPool.restartWorkers();\n      await processSample({ imageId: samples.value[frame.value - 1], annotationSetId: limitAnnotationsToSet.value, indexToCache: frame.value - 1 });\n      updateSample();\n    }\n    nextTick(() => {\n      cacheImages();\n    });\n  }\n}\n\nasync function handleSkipNext() {\n  if (frame.value < samples.value.length) {\n    frame.value += 1;\n  } else {\n    frame.value = 1;\n  }\n  if (!animationImageCache.value[frame.value - 1]?.loaded) {\n    addNewSampleToCache(frame.value - 1);\n    clearSample();\n    cacheWorkerPool.restartWorkers();\n    await processSample({ imageId: samples.value[frame.value - 1], annotationSetId: limitAnnotationsToSet.value, indexToCache: frame.value - 1 });\n    updateSample();\n  }\n  nextTick(() => {\n    cacheImages();\n  });\n}\n\nfunction handleClearCache() {\n  animationImageCache.value = [];\n}\n\nwatch(currentImage, async () => {\n  resetForNewSequence();\n  loadFirstImage();\n});\n\nconst isLoadingSampleFailed = computed(() => {\n  if (currentAnimationSample.value?.failed) {\n    return true;\n  }\n\n  return false;\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n.animation-controls {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  min-height: 70px;\n  padding: 0 8px;\n  z-index: 10;\n  border-left: 1px solid rgba(0,0,0,0.25);\n  background: var(--body-color);\n}\n\n.timeline {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  height: 20px;\n  padding: 8px 0;\n}\n\n.controls {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  justify-content: center;\n  align-items: center;\n  width: 100%;\n  min-height: 50px;\n\n  &__start {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    flex: 1 1 1px;\n  }\n\n  &__end {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    flex: 1 1 1px;\n    gap: 8px;\n  }\n\n  &__input {\n    max-width: 100px;\n  }\n\n  &__buttons {\n    max-width: 100px;\n  }\n}\n\n.scrubber-popup {\n  position: absolute;\n  transform: translateX(-50%);\n  background-color: #000;\n  border-radius: 0.375rem;\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n  bottom: 0;\n  margin-bottom: 1rem;\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  font-size: 0.75rem;\n  color: #fff;\n  pointer-events: none;\n}\n.scrubber-thumb {\n  position: absolute;\n  transform: translate(-50%, 7px);\n  background-color: var(--color-primary-400);\n  height: 18px;\n  width: 4px;\n  bottom: 0;\n}\n\n.verified_badge {\n  color: var(--color-success);\n}\n\n.fps-input {\n  max-width: 100px;\n}\n\n.annotation-search {\n  padding: 4px 0px;\n  margin-left: auto;\n  max-width: 300px;\n}\n\n.input-buttons {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  border-radius: inherit;\n  text-transform: none;\n  min-width: 100px;\n\n  &.scrollbar {\n    overflow: auto;\n  }\n\n  &__row {\n    display: flex;\n    align-items: center;\n    position: relative;\n    max-width: 500px;\n  }\n\n  &__row-button {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n    background: transparent;\n    border: none;\n    padding: 6px 8px;\n    cursor: pointer;\n\n    &:first-of-type {\n      border-top-left-radius: inherit;\n      border-top-right-radius: inherit;\n    }\n    &:last-of-type {\n      border-bottom-left-radius: inherit;\n      border-bottom-right-radius: inherit;\n    }\n\n    &:hover {\n      background: rgba(0,0,0,0.125);\n    }\n    &:focus-within {\n      background: rgba(0,0,0,0.125);\n    }\n\n    &> * {\n      pointer-events: none;\n    }\n\n    input {\n      -webkit-appearance: none;\n      -moz-appearance: none;\n      appearance: none;\n      opacity: 0;\n      margin: 0;\n    }\n\n    span, label {\n      font-size: 0.9rem;\n      font-weight: 500;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n  }\n\n  &__row-button-check {\n    width: 20px;\n    min-width: 20px;\n    height: 20px;\n    min-height: 20px;\n    @include themify() {\n      color: themed('filter-button-list-row-button-selected')\n    }\n  }\n}\n\n.warning-icon {\n  color: var(--color-error)\n}\n</style>\n","import script from \"./AnimationControlsV2.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./AnimationControlsV2.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./AnimationControlsV2.vue?vue&type=style&index=0&id=02efae32&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-02efae32\"]])\n\nexport default __exports__","<template>\n  <div id=\"samToolbar\" class=\"sam-sidebar\">\n    <!-- Server -->\n    <div class=\"sam-sidebar__section\">\n      <h2 class=\"sam-sidebar__title\">1. Select Server</h2>\n      <div v-if=\"fetchingCloudInstances\" id=\"loading-servers\" class=\"servers__loading\">\n        <div class=\"loader-ring\"><div /><div /><div /><div /></div>\n        <span>Loading Servers</span>\n      </div>\n      <div v-else-if=\"sam2Server && !isSam2ServerFound\" id=\"loading-servers\" class=\"servers__loading mb-2\">\n        <div class=\"loader-ring\"><div /><div /><div /><div /></div>\n        <span>Attempting to connect to server</span>\n      </div>\n      <div v-if=\"servers && servers.length === 0\" class=\"servers__not-found\">\n        <span>No AIGT Servers Found</span>\n      </div>\n      <div v-if=\"servers && servers.length > 0\" id=\"servers\" class=\"form__control-group\">\n        <!-- <label>Group</label> -->\n        <select\n          id=\"servers-select\"\n          v-model=\"sam2Server\"\n          class=\"select\"\n          required\n        >\n          <option :key=\"'servers-null'\" :value=\"''\">Select Server</option>\n          <option v-for=\"option in servers\" :key=\"`servers-${option.id}`\" :value=\"option.ip\">\n            {{ option.name }}\n          </option>\n        </select>\n      </div>\n    </div>\n\n    <!-- Initialize State -->\n    <div v-if=\"servers && servers.length > 0 && isSam2ServerFound\" class=\"sam-sidebar__section init-state\">\n      <h2 class=\"sam-sidebar__title\">\n        2. Initialize State\n        <div v-if=\"hasInitState\" class=\"sam-ready\">\n          <span class=\"sam-ready__icon\" />\n        </div>\n        <div v-else-if=\"initError\" class=\"sam-error\" :title=\"initError\">\n          <span class=\"sam-error__icon\" />\n        </div>\n      </h2>\n      <div class=\"init-state__inputs\">\n        <v-number-input\n          v-model=\"initStartFrame\"\n          :min=\"1\"\n          :reverse=\"false\"\n          :height=\"24\"\n          :clientHeight=\"24\"\n          :width=\"120\"\n          controlVariant=\"stacked\"\n          label=\"Start Frame\"\n          density=\"compact\"\n          variant=\"outlined\"\n          :hide-details=\"true\"\n          :disabled=\"isInitializingState || hasInitState\"\n        />\n        <v-number-input\n          v-model=\"initEndFrame\"\n          :min=\"initStartFrame + 1\"\n          :max=\"numFrames\"\n          :reverse=\"false\"\n          :height=\"24\"\n          :clientHeight=\"24\"\n          :width=\"120\"\n          controlVariant=\"stacked\"\n          label=\"End Frame\"\n          density=\"compact\"\n          variant=\"outlined\"\n          :hide-details=\"true\"\n          :disabled=\"isInitializingState || hasInitState\"\n        />\n      </div>\n      <template v-if=\"isInitializingState || hasInitState\">\n        <button\n          v-if=\"hasInitState\"\n          class=\"button button-sm sam-toolbar__button _secondary\"\n          :disabled=\"!hasInitState\"\n          @click=\"handleSAMInitReset\"\n        >\n          Reset State\n        </button>\n      </template>\n      <button\n        v-if=\"!hasInitState\"\n        class=\"button button-sm sam-toolbar__button\"\n        :class=\"{'button-spinner': isInitializingState}\"\n        :disabled=\"!sam2Server || isInitializingState\"\n        :title=\"`Init State`\"\n        @click=\"handleInitState\"\n      >\n        {{ isInitializingState ? initDetail : \"Initialize State\" }}\n      </button>\n    </div>\n\n    <!-- Controls -->\n    <!-- <div v-if=\"sam2Server && hasInitState\" class=\"sam-sidebar__section controls\">\n      <h2 class=\"sam-sidebar__title\">Controls</h2>\n      <div class=\"controls__buttons\">\n        <div class=\"sam-toolbar__button-container\">\n          <IconButton\n            id=\"SAMhoverAndClickToolAddBtn\"\n            aria-label=\"SAM Hover and Click (Add)\"\n            class=\"sam-toolbar__button\"\n            :class=\"{active: pointType === 'add'}\"\n            :icon=\"'cursor'\"\n            :showHover=\"true\"\n            :type=\"''\"\n            :width=\"20\"\n            :height=\"20\"\n            :title=\"'SAM Hover and Click (Left Click: positive point, Right Click: negative point)'\"\n            :disabled=\"!hasInitState\"\n            @click=\"handleSAMHoverAndClickAdd\"\n          />\n          <SVGIcon\n            id=\"SAMhoverAndClickToolBtn\"\n            class=\"sam-toolbar__button-pointer-overlay\"\n            :iconName=\"'add_box_outlined'\"\n          />\n        </div>\n        <div class=\"sam-toolbar__button-container\">\n          <IconButton\n            id=\"SAMhoverAndClickToolMinusBtn\"\n            aria-label=\"SAM Hover and Click (Minus)\"\n            class=\"sam-toolbar__button\"\n            :class=\"{active: pointType === 'minus'}\"\n            :icon=\"'cursor'\"\n            :showHover=\"true\"\n            :type=\"''\"\n            :width=\"20\"\n            :height=\"20\"\n            :title=\"'SAM Hover and Click (Minus)'\"\n            :disabled=\"!hasInitState\"\n            @click=\"handleSAMHoverAndClickMinus\"\n          />\n          <SVGIcon\n            id=\"SAMhoverAndClickToolBtn\"\n            class=\"sam-toolbar__button-pointer-overlay\"\n            :iconName=\"'minus_box_outlined'\"\n          />\n        </div>\n        <IconButton\n          id=\"SAMhoverAndClickToolBtn\"\n          aria-label=\"SAM Box Tool\"\n          class=\"sam-toolbar__button\"\n          :class=\"{active: pointType === 'box'}\"\n          :icon=\"'highlight_alt'\"\n          :showHover=\"true\"\n          :type=\"''\"\n          :title=\"'SAM Box Tool'\"\n          :width=\"20\"\n          :height=\"20\"\n          :disabled=\"!hasInitState\"\n          @click=\"handleSAMAddBox\"\n        />\n        <IconButton\n          id=\"SAMClearAllBtn\"\n          aria-label=\"Clear All\"\n          class=\"sam-toolbar__button\"\n          :icon=\"'clear_all'\"\n          :showHover=\"true\"\n          :type=\"''\"\n          :title=\"'Clear All'\"\n          :width=\"20\"\n          :height=\"20\"\n          :disabled=\"!hasInitState\"\n          @click=\"handleSAMRemoveObject\"\n        />\n      </div>\n    </div> -->\n\n    <!-- Objects -->\n    <div v-if=\"sam2Server && hasInitState\" class=\"sam-sidebar__section objects\">\n      <h2 class=\"sam-sidebar__title\">\n        3. Select Objects\n        <IconButton\n          id=\"SAMAddObjectBtn\"\n          aria-label=\"Add Object\"\n          class=\"sam-toolbar__button\"\n          :icon=\"'add'\"\n          :showHover=\"true\"\n          :type=\"''\"\n          :title=\"'Add Object'\"\n          :width=\"20\"\n          :height=\"20\"\n          @click=\"handleSAMAddObject\"\n        />\n      </h2>\n      <div class=\"objects__cards scrollbar\">\n        <div\n          v-for=\"(obj_id, i) in objects\"\n          :key=\"obj_id\"\n          class=\"objects-card\"\n          :class=\"{_selected: selectedObject === obj_id}\"\n          @click=\"selectedObject = obj_id\"\n        >\n          <h2 class=\"objects-card__title\">\n            {{ objectsLabelMap[obj_id] ? uppercaseFirstLetter(objectsLabelMap[obj_id].name) : 'Object' }} {{ i + 1 }}\n            <div v-if=\"isAddingNewPointsOrBox && selectedObject === obj_id\" title=\"Waiting for server\" class=\"ms-1\">\n              <div class=\"loader-ring\"><div /><div /><div /><div /></div>\n            </div>\n          </h2>\n          <template v-if=\"selectedObject === obj_id\">\n            <div class=\"objects-card__buttons\">\n              <div class=\"sam-toolbar__button-container\">\n                <IconButton\n                  id=\"SAMhoverAndClickToolAddBtn\"\n                  aria-label=\"SAM Hover and Click (Add)\"\n                  class=\"sam-toolbar__button\"\n                  :class=\"{active: pointType === 'add'}\"\n                  :icon=\"'cursor'\"\n                  :showHover=\"true\"\n                  :type=\"''\"\n                  :width=\"20\"\n                  :height=\"20\"\n                  :title=\"'SAM Hover and Click (Left Click: positive point, Right Click: negative point)'\"\n                  :disabled=\"!hasInitState\"\n                  @click=\"handleSAMHoverAndClickAdd\"\n                />\n                <SVGIcon\n                  id=\"SAMhoverAndClickToolBtn\"\n                  class=\"sam-toolbar__button-pointer-overlay\"\n                  :iconName=\"'add_box_outlined'\"\n                />\n              </div>\n              <div class=\"sam-toolbar__button-container\">\n                <IconButton\n                  id=\"SAMhoverAndClickToolMinusBtn\"\n                  aria-label=\"SAM Hover and Click (Minus)\"\n                  class=\"sam-toolbar__button\"\n                  :class=\"{active: pointType === 'minus'}\"\n                  :icon=\"'cursor'\"\n                  :showHover=\"true\"\n                  :type=\"''\"\n                  :width=\"20\"\n                  :height=\"20\"\n                  :title=\"'SAM Hover and Click (Minus)'\"\n                  :disabled=\"!hasInitState\"\n                  @click=\"handleSAMHoverAndClickMinus\"\n                />\n                <SVGIcon\n                  id=\"SAMhoverAndClickToolBtn\"\n                  class=\"sam-toolbar__button-pointer-overlay\"\n                  :iconName=\"'minus_box_outlined'\"\n                />\n              </div>\n              <IconButton\n                id=\"SAMhoverAndClickToolBtn\"\n                aria-label=\"SAM Box Tool\"\n                class=\"sam-toolbar__button\"\n                :class=\"{active: pointType === 'box'}\"\n                :icon=\"'highlight_alt'\"\n                :showHover=\"true\"\n                :type=\"''\"\n                :title=\"'SAM Box Tool'\"\n                :width=\"20\"\n                :height=\"20\"\n                :disabled=\"!hasInitState\"\n                @click=\"handleSAMAddBox\"\n              />\n              <!-- <IconButton\n                id=\"SAMUndoBtn\"\n                aria-label=\"Undo\"\n                class=\"sam-toolbar__button\"\n                :icon=\"'undo'\"\n                :showHover=\"true\"\n                :type=\"''\"\n                :title=\"'Undo'\"\n                :width=\"20\"\n                :height=\"20\"\n                :disabled=\"!hasInitState\"\n                @click=\"handleSAMUndo\"\n              /> -->\n              <button\n                v-if=\"hasInitState\"\n                class=\"button button-sm sam-toolbar__button _secondary flex-icon-button ms-auto\"\n                aria-label=\"Clear Object\"\n                :title=\"'Clear Object'\"\n                :disabled=\"!hasInitState\"\n                @click=\"handleSAMClearAllPromptsInFrame(obj_id)\"\n              >\n                Clear\n              </button>\n            </div>\n          </template>\n          <template v-else>\n            <div class=\"objects-card__buttons\">\n              <button\n                class=\"button button-sm sam-toolbar__button _secondary flex-icon-button objects-card__edit-button\"\n                aria-label=\"Edit Object\"\n                :title=\"'Edit Object'\"\n                :disabled=\"!hasInitState\"\n                @click=\"selectedObject = obj_id\"\n              >\n                <SVGIcon\n                  :iconName=\"'edit'\"\n                  :width=\"16\"\n                  :height=\"16\"\n                  class=\"me-1\"\n                />\n                Edit Object {{ i + 1 }}\n              </button>\n              <button\n                class=\"button button-sm sam-toolbar__button _secondary flex-icon-button\"\n                aria-label=\"Clear Object\"\n                :title=\"'Clear Object'\"\n                :disabled=\"!hasInitState\"\n                @click=\"handleSAMClearAllPromptsInFrame(obj_id)\"\n              >\n                <SVGIcon\n                  :iconName=\"'delete'\"\n                  :width=\"16\"\n                  :height=\"16\"\n                  class=\"me-1\"\n                />\n                Clear\n              </button>\n            </div>\n          </template>\n          <IconButton\n            v-if=\"hasInitState\"\n            :icon=\"'close'\"\n            :width=\"16\"\n            :height=\"16\"\n            class=\"objects-card__close\"\n            aria-label=\"Remove Object\"\n            :title=\"'Remove Object'\"\n            :disabled=\"!hasInitState\"\n            @click=\"handleSAMRemoveObject(obj_id)\"\n          />\n        </div>\n      </div>\n      <button\n        v-if=\"hasInitState\"\n        class=\"button button-sm sam-toolbar__button _secondary flex-icon-button\"\n        :disabled=\"!hasInitState\"\n        @click=\"handleSAMReset\"\n      >\n        <SVGIcon\n          :iconName=\"'replay'\"\n          :width=\"16\"\n          :height=\"16\"\n          class=\"me-1\"\n        />\n        Start Over\n      </button>\n    </div>\n\n    <!-- Propagate -->\n    <div v-if=\"sam2Server && hasInitState\" class=\"sam-sidebar__section propagate\">\n      <h2 class=\"sam-sidebar__title\">4. Propagate</h2>\n      <div class=\"propagate__buttons\">\n        <div class=\"propagate__buttons-main\">\n          <button\n            class=\"button button-sm sam-toolbar__button propagate__action-button\"\n            :class=\"{'button-spinner': isPropagating}\"\n            :disabled=\"!hasInitState || isPropagating || sam2Annotations.length === 0\"\n            :title=\"`Propagate`\"\n            @click=\"handlePropagate\"\n          >\n            {{ isPropagating ? propagateDetail : \"Propagate\" }}\n          </button>\n          <IconButton\n            id=\"SAMReversePropagateBtn\"\n            v-model=\"reversePropagateEnabled\"\n            aria-label=\"Reverse Propagate\"\n            class=\"sam-toolbar__button\"\n            :icon=\"'swap_horiz'\"\n            :showHover=\"true\"\n            :type=\"'toggle'\"\n            :title=\"'Reverse Propagate'\"\n            :width=\"20\"\n            :height=\"20\"\n            :disabled=\"!hasInitState\"\n          />\n        </div>\n        <button\n          v-if=\"isPropagating\"\n          class=\"button button-sm sam-toolbar__button propagate__cancel-button _danger\"\n          :class=\"{'button-spinner': isCancellingPropagation}\"\n          :disabled=\"isCancellingPropagation\"\n          @click=\"handleCancelPropagation\"\n        >\n          Stop Propagation\n        </button>\n      </div>\n    </div>\n\n    <!-- Finish -->\n    <div v-if=\"sam2Server && hasInitState\" class=\"sam-sidebar__section propagate\">\n      <h2 class=\"sam-sidebar__title\"> 5. Save Pending Segmentations for Entire Sequence</h2>\n      <div id=\"pending-annotation-counts\" class=\"mb-2\">\n        <div v-if=\"sam2Annotations.length > 0\" class=\"tag\">\n          <div class=\"tag__count\"><span>{{ sam2Annotations.length }}</span></div>\n          <span class=\"tag__label ms-2\">Segmentations</span>\n        </div>\n        <div v-if=\"aigt2dAnnotations.length > 0\" class=\"tag\">\n          <div class=\"tag__count\"><span>{{ aigt2dAnnotations.length }}</span></div>\n          <span class=\"tag__label ms-2\">2D Boxes</span>\n        </div>\n        <div v-if=\"aigt3dAnnotations.length > 0\" class=\"tag\">\n          <div class=\"tag__count\"><span>{{ aigt3dAnnotations.length }}</span></div>\n          <span class=\"tag__label ms-2\">3D Boxes</span>\n        </div>\n      </div>\n      <button\n        class=\"button button-sm sam-toolbar__button\"\n        :class=\"{'button-spinner': isCreatingAnnotations}\"\n        :disabled=\"!hasInitState || isPropagating || isCreatingAnnotations || sam2Annotations.length <= 0\"\n        :title=\"`Propagate`\"\n        @click=\"handleSaveSAM2Annotations\"\n      >\n        Save Pending Segmentations\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport {\n  ref, watch, computed, onMounted, onUnmounted,\n} from 'vue';\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport { useSAM2Store } from '@/stores/useSAM2Store.js';\nimport { storeToRefs } from 'pinia';\nimport { useEditorStore } from '@/stores/useEditorStore.js';\nimport { useEditorControlsStore } from '@/stores/useEditorControlsStore.js';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useTimeoutPoll } from '@vueuse/core';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\nimport { uppercaseFirstLetter } from '@/assets/js/utils';\n\n// Props\nconst props = defineProps({\n\n});\n\nconst emit = defineEmits([]);\n\nconst sam2Store = useSAM2Store();\nconst {\n  sam2Server,\n  isSam2ServerFound,\n  sam2Options,\n  sam2Active,\n  sam2Annotations,\n  sam2LastPropagatedAnnotations,\n  aigt3dAnnotations,\n  aigt3dLastPropagatedAnnotations,\n  aigt2dAnnotations,\n  aigt2dLastPropagatedAnnotations,\n  isInitializingState,\n  hasInitState,\n  initStatus,\n  initDetail,\n  initProgress,\n  initTotal,\n  initError,\n  initStartFrame,\n  initEndFrame,\n  isPropagating,\n  propagateStatus,\n  propagateDetail,\n  propagateProgress,\n  propagateTotal,\n  propagateLastAnnotationIndex,\n  shouldClearNextPoints,\n  isCreatingAnnotations,\n  reversePropagateEnabled,\n  objects,\n  objectsLabelMap,\n  selectedObject,\n  isAddingNewPointsOrBox,\n  isCancellingPropagation,\n} = storeToRefs(sam2Store);\nconst { getFrameAndObjectSAM2LastPropagatedAnnotations, getFrameAndObjectAigt3dLastPropagatedAnnotations, getFrameAndObjectAigt2dLastPropagatedAnnotations } = sam2Store;\n\nconst pointType = computed(() => sam2Options.value.params.pointType);\n\nconst servers = ref(null);\nconst fetchingCloudInstances = ref(false);\n\nconst clicks = computed(() => [...sam2Options.value.params.clicks]);\nwatch(clicks, (newClicks, oldClicks) => {\n  const clicksToAdd = newClicks.filter((click) => !oldClicks.includes(click));\n  if (clicksToAdd.length > 0) {\n    handleAddNewPointsOrBox({ clicks: clicksToAdd });\n  }\n}, { deep: true });\n\nconst box = computed(() => [...sam2Options.value.params.box]);\nwatch(box, async (newBox) => {\n  if (newBox && newBox.length > 0) {\n    await handleAddNewPointsOrBox({ box: newBox });\n    sam2Options.value.params.box = [];\n  }\n}, { deep: true });\n\nconst editorStore = useEditorStore();\nconst {\n  sequenceId,\n  labels,\n} = storeToRefs(editorStore);\n\nconst { selectedLabel } = storeToRefs(useEditorControlsStore());\n\nconst visualizationStore = useViewerVisualizationsStore();\nconst {\n  samples,\n  frame,\n} = storeToRefs(visualizationStore);\nconst { addNewAnnotationsArrayToCache } = visualizationStore;\nconst numFrames = computed(() => samples.value.length);\nwatch(numFrames, () => {\n  if (numFrames.value && numFrames.value > 0) {\n    initEndFrame.value = numFrames.value;\n  }\n}, { immediate: true });\nwatch(frame, () => {\n  if (!hasInitState.value) {\n    initStartFrame.value = frame.value;\n  }\n}, { immediate: true });\n\nconst {\n  destinationAnnotationSet,\n} = useTasks();\n\nconst { isActive: isFetchServerHealthActive, pause: pauseFetchServerHealth, resume: resumeFetchServerHealth } = useTimeoutPoll(fetchServerHealth, 500);\nconst { isActive: isFetchInitStatusActive, pause: pauseFetchInitStatus, resume: resumeFetchInitStatus } = useTimeoutPoll(fetchInitStatus, 500);\nconst { isActive: isFetchPropagateActive, pause: pauseFetchPropagateStatus, resume: resumeFetchPropagateStatus } = useTimeoutPoll(fetchPropagateStatus, 500);\nconst { isActive: isFetchAnnotationsActive, pause: pauseFetchAnnotationsStatus, resume: resumeFetchAnnotationsStatus } = useTimeoutPoll(fetchAnnotationsStatus, 1000);\n\nwatch(sam2Server, () => {\n  if (sam2Server.value) {\n    resumeFetchServerHealth();\n  }\n}, { immediate: true });\nwatch(isSam2ServerFound, () => {\n  if (isSam2ServerFound.value) {\n    pauseFetchServerHealth();\n  }\n});\n\nonMounted(async () => {\n  servers.value = await listCloudInstances();\n  if (servers.value.length > 0) {\n    sam2Server.value = servers.value[0].ip;\n  }\n\n  if (objects.value.length === 0) {\n    const uuid = uuidv4();\n    objects.value.push(uuid);\n    selectedObject.value = uuid;\n  }\n});\n\nonUnmounted(async () => {\n  pauseFetchServerHealth();\n  pauseFetchInitStatus();\n  pauseFetchPropagateStatus();\n  pauseFetchAnnotationsStatus();\n});\n\nasync function handleSAMReset() {\n  propagateStatus.value = '';\n  propagateDetail.value = '';\n  propagateProgress.value = 0;\n  propagateTotal.value = 0;\n\n  // Reset SAM2 Controls\n  sam2Options.value.params.pointType = null;\n  sam2Options.value.params.clicks = [];\n  sam2Options.value.params.box = [];\n  sam2Options.value.params.boxes = [];\n  objects.value = [];\n  selectedObject.value = null;\n  handleSAMAddObject();\n  // Reset AIGT annotations\n  sam2Annotations.value = [];\n  aigt3dAnnotations.value = [];\n  aigt2dAnnotations.value = [];\n  // Reset SAM2 State\n  const isResetSuccessful = await handleResetSAMState();\n  console.log(\"reset successful:\", isResetSuccessful);\n}\n\nasync function handleSAMInitReset() {\n  initStatus.value = '';\n  initDetail.value = '';\n  initProgress.value = 0;\n  initTotal.value = 0;\n  initError.value = '';\n  propagateStatus.value = '';\n  propagateDetail.value = '';\n  propagateProgress.value = 0;\n  propagateTotal.value = 0;\n\n  // Reset SAM2 Controls\n  sam2Options.value.params.pointType = null;\n  sam2Options.value.params.clicks = [];\n  sam2Options.value.params.box = [];\n  sam2Options.value.params.boxes = [];\n  objects.value = [];\n  selectedObject.value = null;\n  handleSAMAddObject();\n  // Reset SAM2 annotations\n  sam2Annotations.value = [];\n  aigt3dAnnotations.value = [];\n  aigt2dAnnotations.value = [];\n  // Reset SAM2 State\n  const isResetSuccessful = await handleResetSAMState();\n  console.log(\"reset successful:\", isResetSuccessful);\n\n  if (isResetSuccessful) {\n    hasInitState.value = false;\n  }\n}\n\nfunction handleSAMHoverAndClickAdd() {\n  if (sam2Options.value.mode === 'hover_and_click' && sam2Options.value.params.pointType === 'add') {\n    sam2Options.value.mode = null;\n    sam2Options.value.params.pointType = null;\n  } else {\n    sam2Options.value.mode = 'hover_and_click';\n    sam2Options.value.params.pointType = 'add';\n  }\n}\n\nfunction handleSAMHoverAndClickMinus() {\n  if (sam2Options.value.mode === 'hover_and_click' && sam2Options.value.params.pointType === 'minus') {\n    sam2Options.value.mode = null;\n    sam2Options.value.params.pointType = null;\n  } else {\n    sam2Options.value.mode = 'hover_and_click';\n    sam2Options.value.params.pointType = 'minus';\n  }\n}\n\nfunction handleSAMAddBox() {\n  if (sam2Options.value.mode === 'drag_box' && sam2Options.value.params.pointType === 'box') {\n    sam2Options.value.mode = null;\n    sam2Options.value.params.pointType = null;\n  } else {\n    sam2Options.value.mode = 'drag_box';\n    sam2Options.value.params.pointType = 'box';\n  }\n}\n\nasync function handleInitStateWs() {\n  isInitializingState.value = true;\n\n  const socket = new WebSocket(`ws://${sam2Server.value}:80/ws/aigt/init_state?sequence_id=${sequenceId.value}&start_frame=${initStartFrame.value - 1}&end_frame=${initEndFrame.value - 1}`);\n\n  socket.onopen = () => {\n    console.log('WebSocket connection established');\n  };\n\n  socket.onmessage = (event) => {\n    try {\n      const message = JSON.parse(event.data);\n      console.log('Received:', message);\n\n      if (message?.progress) {\n        initProgress.value = message.progress;\n      }\n      if (message?.total) {\n        initTotal.value = message.total;\n      }\n      if (message?.status) {\n        initStatus.value = message.status;\n      }\n      if (message?.detail) {\n        initDetail.value = message.detail;\n      }\n      if (message.status === \"complete\") {\n        isInitializingState.value = false;\n        hasInitState.value = true;\n      }\n      if (message.status === \"error\") {\n        isInitializingState.value = false;\n        hasInitState.value = false;\n        initError.value = message.detail;\n      }\n    } catch (error) {\n      console.error('Error parsing WebSocket message:', error);\n    }\n  };\n\n  socket.onerror = (error) => {\n    console.error('WebSocket error:', error);\n    isInitializingState.value = false;\n    initError.value = error;\n  };\n\n  socket.onclose = (event) => {\n    isInitializingState.value = false;\n    if (event.wasClean) {\n      console.log(`WebSocket closed cleanly, code=${event.code}, reason=${event.reason}`);\n    } else {\n      console.error('WebSocket connection closed unexpectedly');\n    }\n  };\n}\n\nasync function handleInitState({ clicks = null, box = null }) {\n  console.log('handleInitState');\n  isInitializingState.value = true;\n\n  // Request payload\n  const requestData = {\n    sequence_id: sequenceId.value,\n    annotation_set_id: destinationAnnotationSet.value?.id,\n    start_frame: initStartFrame.value - 1,\n    end_frame: initEndFrame.value - 1,\n  };\n\n  // Sending a POST request\n  const result = await fetch(`aigt/init_state?ip=${sam2Server.value}`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(requestData),\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error starting init state`);\n      }\n      return response.json();\n    })\n    .catch((error) => {\n      console.log(error);\n      isInitializingState.value = false;\n      initError.value = error;\n      return null;\n    });\n\n  // Parse the JSON response\n  console.log(\"result:\", result);\n\n  if (result && !isFetchInitStatusActive.value) {\n    resumeFetchInitStatus();\n  }\n}\n\nasync function handlePropagate() {\n  console.log('handlePropagate');\n  isPropagating.value = true;\n  propagateLastAnnotationIndex.value = 0;\n  propagateStatus.value = '';\n  propagateDetail.value = '';\n  propagateProgress.value = 0;\n  propagateTotal.value = 0;\n\n  const startFrameIdx = getFirstClickOrBoxFrameIndex();\n\n  // Request payload\n  const requestData = {\n    start_frame_idx: startFrameIdx,\n    max_frame_num_to_track: (initEndFrame.value - initStartFrame.value + 1) - 1,\n    reverse: reversePropagateEnabled.value,\n    sequence_id: sequenceId.value,\n    image_ids: samples.value.slice(\n      initStartFrame.value - 1,\n      initEndFrame.value,\n    ),\n    annotation_set_id: destinationAnnotationSet.value?.id,\n  };\n\n  if (reversePropagateEnabled.value) {\n    const lastFrameIdx = getLastClickOrBoxFrameIndex();\n    requestData.start_frame_idx = lastFrameIdx;\n    requestData.max_frame_num_to_track = (lastFrameIdx - initStartFrame.value + 1);\n  }\n\n  // Sending a POST request\n  const result = await fetch(`aigt/propagate?ip=${sam2Server.value}`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(requestData),\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error starting propagation`);\n      }\n      return response.json();\n    })\n    .catch((error) => {\n      console.log(error);\n      isPropagating.value = false;\n      return null;\n    });\n\n  // Parse the JSON response\n  console.log(\"result:\", result);\n\n  if (result && !isFetchPropagateActive.value) {\n    resumeFetchPropagateStatus();\n    resumeFetchAnnotationsStatus();\n  }\n}\n\nasync function handleAddNewPointsOrBox({ clicks = null, box = null }) {\n  console.log('handleAddNewPointsOrBox');\n\n  if (box && (box[2] - box[0] === 0 || box[3] - box[1] === 0)) {\n    return;\n  }\n\n  let points;\n  let labels;\n  if (clicks) {\n    points = clicks.map((click) => [click.x, click.y]);\n    labels = clicks.map((click) => click.clickType);\n  }\n\n  const obj_id = selectedObject.value;\n\n  // Request payload\n  const requestData = {\n    ann_frame_idx: (frame.value - initStartFrame.value),\n    ann_obj_id: obj_id,\n    points: clicks ? points : undefined,\n    box: box || undefined,\n    labels: clicks ? labels : undefined,\n    clear_old_points: shouldClearNextPoints.value || box !== null,\n    normalize_coords: true,\n    sequence_id: sequenceId.value,\n    image_id: samples.value[frame.value - 1],\n    annotation_set_id: destinationAnnotationSet.value?.id,\n  };\n\n  const timeout = setTimeout(() => {\n    isAddingNewPointsOrBox.value = true;\n  }, 3000);\n\n  // Sending a POST request\n  const result = await fetch(`aigt/add_new_points_or_box?ip=${sam2Server.value}`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(requestData),\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error adding new point or box`);\n      }\n      return response.json();\n    })\n    .catch((err) => {\n      console.log(err);\n      clearTimeout(timeout);\n      isAddingNewPointsOrBox.value = false;\n      alert(err);\n      return null;\n    });\n  clearTimeout(timeout);\n  isAddingNewPointsOrBox.value = false;\n\n  // console.log(result);\n  if (!result || result.length === 0) {\n    return null;\n  }\n\n  // Clear any points if a box was added\n  if (box !== null) {\n    sam2Options.value.params.clicks = sam2Options.value.params.clicks.filter((click) => click.obj_id !== obj_id);\n  }\n\n  console.log(!objectsLabelMap.value[obj_id]);\n  if (!objectsLabelMap.value[obj_id]) {\n    objectsLabelMap.value[obj_id] = selectedLabel.value;\n  }\n\n  result.segmentations.forEach((resultAnno) => {\n    if (resultAnno.obj_id !== obj_id) return;\n\n    console.log(resultAnno);\n    if (resultAnno?.polygon && resultAnno?.obj_id && resultAnno?.frame_idx >= 0) {\n    // console.log(result.polygon);\n      const newAnnotationPolygon = {\n        id: uuidv4(),\n        label_index: objectsLabelMap.value[obj_id].index,\n        label_id: objectsLabelMap.value[obj_id].id,\n        label_name: objectsLabelMap.value[obj_id].name,\n        type: \"seg\",\n        polygon: JSON.stringify(resultAnno.polygon),\n        score: 1,\n        reviewStatus: 'verified',\n        image_id: samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx],\n        annotation_set_id: destinationAnnotationSet.value?.id,\n        object_reference: resultAnno.obj_id,\n        pending: true,\n      };\n      console.log(newAnnotationPolygon);\n\n      // Add the new annotation. Merge to existing annotation of the same object if it exists\n      sam2Annotations.value = [\n        ...sam2Annotations.value.filter((anno) => {\n          const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n          const isSameObject = anno.object_reference === resultAnno.obj_id;\n          return !(isSameImage && isSameObject);\n        }),\n        newAnnotationPolygon,\n      ];\n    }\n  });\n\n  result.boxes3d.forEach((resultAnno) => {\n    if (resultAnno.obj_id !== obj_id) return;\n\n    if (resultAnno?.box3d && resultAnno?.obj_id) {\n      const new3DBox = {\n        id: uuidv4(),\n        label_index: objectsLabelMap.value[obj_id].index,\n        label_id: objectsLabelMap.value[obj_id].id,\n        label_name: objectsLabelMap.value[obj_id].name,\n        type: \"3dbox\",\n        x: 0,\n        y: 0,\n        w: 0,\n        h: 0,\n        score: 1,\n        data_json: {\n          x: resultAnno.box3d[0],\n          y: resultAnno.box3d[1],\n          z: resultAnno.box3d[2],\n          dx: resultAnno.box3d[3],\n          dy: resultAnno.box3d[4],\n          dz: resultAnno.box3d[5],\n        },\n        image_id: resultAnno.image_id,\n        annotation_set_id: resultAnno.annotation_set_id,\n        object_reference: resultAnno.obj_id,\n        pending: true,\n      };\n\n      // Add the new annotation. Merge to existing annotation of the same object if it exists\n      aigt3dAnnotations.value = [\n        ...aigt3dAnnotations.value.filter((anno) => {\n          const isSameImage = anno.image_id === resultAnno.image_id;\n          const isSameObject = anno.object_reference === resultAnno.obj_id;\n          return !(isSameImage && isSameObject);\n        }),\n        new3DBox,\n      ];\n    }\n  });\n\n  result.boxes2d.forEach((resultAnno) => {\n    if (resultAnno.obj_id !== obj_id) return;\n\n    if (resultAnno?.box2d && resultAnno?.obj_id) {\n      const new2DBox = {\n        id: uuidv4(),\n        label_index: objectsLabelMap.value[obj_id].index,\n        label_id: objectsLabelMap.value[obj_id].id,\n        label_name: objectsLabelMap.value[obj_id].name,\n        type: \"box\",\n        x: resultAnno.box2d.x,\n        y: resultAnno.box2d.y,\n        w: resultAnno.box2d.w,\n        h: resultAnno.box2d.h,\n        score: 1,\n        image_id: samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx],\n        annotation_set_id: destinationAnnotationSet.value?.id,\n        object_reference: resultAnno.obj_id,\n        pending: true,\n      };\n\n      // Add the new annotation. Merge to existing annotation of the same object if it exists\n      aigt2dAnnotations.value = [\n        ...aigt2dAnnotations.value.filter((anno) => {\n          const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n          const isSameObject = anno.object_reference === resultAnno.obj_id;\n          return !(isSameImage && isSameObject);\n        }),\n        new2DBox,\n      ];\n    }\n  });\n\n  // Parse the JSON response\n  console.log(\"result:\", result);\n  return result;\n}\n\nasync function handlePropagateWs() {\n  isPropagating.value = true;\n\n  const socket = new WebSocket(`ws://${sam2Server.value}:80/ws/aigt/propagate?start_frame_idx=${0}&max_frame_num_to_track=${samples.value.length}&reverse=${false}`);\n\n  socket.onopen = () => {\n    console.log('WebSocket connection established');\n  };\n\n  socket.onmessage = (event) => {\n    try {\n      const message = JSON.parse(event.data);\n      console.log('Received:', message);\n\n      // if (message.status === \"complete\") {\n      //   isInitializingState.value = false;\n      //   hasInitState.value = true;\n      // }\n      if (message?.progress) {\n        propagateProgress.value = message.progress;\n      }\n      if (message?.total) {\n        propagateTotal.value = message.total;\n      }\n      if (message?.status) {\n        propagateStatus.value = message.status;\n      }\n      if (message?.detail) {\n        propagateDetail.value = message.detail;\n      }\n      if (message?.polygon && message?.frame_idx >= 0) {\n        const newAnnotationPolygon = {\n          id: uuidv4(),\n          label_index: objectsLabelMap.value[message.obj_id].index,\n          label_id: objectsLabelMap.value[message.obj_id].id,\n          label_name: objectsLabelMap.value[message.obj_id].name,\n          type: \"seg\",\n          polygon: JSON.stringify(message.polygon),\n          score: 1,\n          reviewStatus: 'verified',\n          image_id: samples.value[(initStartFrame.value - 1) + message.frame_idx],\n          annotation_set_id: destinationAnnotationSet.value?.id,\n          pending: true,\n        };\n\n        sam2Annotations.value = [...sam2Annotations.value, newAnnotationPolygon];\n      }\n      if (message.status === \"error\") {\n        isPropagating.value = false;\n        // initError.value = message.detail;\n      }\n    } catch (error) {\n      console.error('Error parsing WebSocket message:', error);\n    }\n  };\n\n  socket.onerror = (error) => {\n    console.error('WebSocket error:', error);\n    isPropagating.value = false;\n    // initError.value = error;\n  };\n\n  socket.onclose = (event) => {\n    isPropagating.value = false;\n    if (event.wasClean) {\n      console.log(`WebSocket closed cleanly, code=${event.code}, reason=${event.reason}`);\n    } else {\n      console.error('WebSocket connection closed unexpectedly');\n    }\n  };\n}\n\nasync function handleResetSAMState() {\n  // Sending a POST request\n  return fetch(`aigt/reset_state?ip=${sam2Server.value}`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error resetting state`);\n      }\n      return true;\n    })\n    .catch((err) => {\n      console.log(err);\n      return false;\n    });\n}\n\nasync function handleCancelPropagation() {\n  isCancellingPropagation.value = true;\n  // Sending a POST request\n  return fetch(`aigt/cancel_propagation?ip=${sam2Server.value}`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error cancelling propagation`);\n      }\n      isCancellingPropagation.value = false;\n      return true;\n    })\n    .catch((err) => {\n      console.log(err);\n      isCancellingPropagation.value = false;\n      return false;\n    });\n}\n\nasync function handleSAMClearAllPromptsInFrame(clicked_obj_id) {\n  // Reset SAM2 Controls\n  sam2Options.value.params.clicks = sam2Options.value.params.clicks.filter((click) => click.obj_id !== clicked_obj_id);\n  sam2Options.value.params.boxes = sam2Options.value.params.boxes.filter((box) => box.obj_id !== clicked_obj_id);\n\n  await postClearAllPromptsInFrame(clicked_obj_id, frame.value - initStartFrame.value);\n\n  // Reset SAM2 annotations\n  const sam2AnnotationsWithoutSameObjIdAndImageId = sam2Annotations.value.filter((sam2anno) => !(sam2anno.object_reference === clicked_obj_id && sam2anno.image_id === samples.value[frame.value - 1]));\n  const lastProagatedSAM2Annotations = getFrameAndObjectSAM2LastPropagatedAnnotations(samples.value[frame.value - 1], clicked_obj_id);\n  sam2Annotations.value = [...sam2AnnotationsWithoutSameObjIdAndImageId, ...lastProagatedSAM2Annotations];\n  // Reset Aigt 3d annotations\n  const aigt3dAnnotationsWithoutSameObjIdAndImageId = aigt3dAnnotations.value.filter((anno) => !(anno.object_reference === clicked_obj_id && anno.image_id === samples.value[frame.value - 1]));\n  const lastProagatedAigt3dAnnotations = getFrameAndObjectAigt3dLastPropagatedAnnotations(samples.value[frame.value - 1], clicked_obj_id);\n  aigt3dAnnotations.value = [...aigt3dAnnotationsWithoutSameObjIdAndImageId, ...lastProagatedAigt3dAnnotations];\n  // Reset Aigt 2d annotations\n  const aigt2dAnnotationsWithoutSameObjIdAndImageId = aigt2dAnnotations.value.filter((anno) => !(anno.object_reference === clicked_obj_id && anno.image_id === samples.value[frame.value - 1]));\n  const lastProagatedAigt2dAnnotations = getFrameAndObjectAigt2dLastPropagatedAnnotations(samples.value[frame.value - 1], clicked_obj_id);\n  aigt2dAnnotations.value = [...aigt2dAnnotationsWithoutSameObjIdAndImageId, ...lastProagatedAigt2dAnnotations];\n}\n\nasync function postClearAllPromptsInFrame(obj_id, frame_idx) {\n  const requestData = {\n    obj_id,\n    frame_idx,\n  };\n\n  // Sending a POST request\n  return fetch(`aigt/clear_all_prompts_in_frame?ip=${sam2Server.value}`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(requestData),\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error clearing all prompts in frame`);\n      }\n      return response;\n    })\n    .catch((err) => {\n      console.log(err);\n      throw err;\n    });\n}\n\nasync function handleRemoveObject(obj_id) {\n  const requestData = {\n    obj_id,\n  };\n\n  // Sending a POST request\n  return fetch(`aigt/remove_object?ip=${sam2Server.value}`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(requestData),\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error adding new point or box`);\n      }\n      return true;\n    })\n    .catch((err) => {\n      console.log(err);\n      return false;\n    });\n}\n\nasync function listCloudInstances() {\n  fetchingCloudInstances.value = true;\n  const dataConnect = new DatastoreConnect();\n  return dataConnect.listCloudInstances({ task_types: [\"aigt\"] })\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error);\n      }\n      fetchingCloudInstances.value = false;\n      return resp.result;\n    })\n    .catch((error) => {\n      fetchingCloudInstances.value = false;\n      throw error;\n    });\n}\n\nasync function handleSAMRemoveObject(clicked_obj_id) {\n  // Reset SAM2 Controls\n  sam2Options.value.params.clicks = sam2Options.value.params.clicks.filter((click) => click.obj_id !== clicked_obj_id);\n  sam2Options.value.params.boxes = sam2Options.value.params.boxes.filter((box) => box.obj_id !== clicked_obj_id);\n  // Reset SAM2 annotations\n  const sam2AnnotationsWithoutObjId = sam2Annotations.value.filter((sam2anno) => sam2anno.object_reference !== clicked_obj_id);\n  sam2Annotations.value = [...sam2AnnotationsWithoutObjId];\n  // Reset 3D annotations\n  const aigt3dAnnotationsWithoutObjId = aigt3dAnnotations.value.filter((aigt3danno) => aigt3danno.object_reference !== clicked_obj_id);\n  aigt3dAnnotations.value = [...aigt3dAnnotationsWithoutObjId];\n  // Reset 2D annotations\n  const aigt2dAnnotationsWithoutObjId = aigt2dAnnotations.value.filter((aigt2danno) => aigt2danno.object_reference !== clicked_obj_id);\n  aigt2dAnnotations.value = [...aigt2dAnnotationsWithoutObjId];\n  // Remove object\n  objects.value = objects.value.filter((obj) => obj !== clicked_obj_id);\n  if (clicked_obj_id === selectedObject.value) {\n    selectedObject.value = null;\n  }\n  delete objectsLabelMap.value[clicked_obj_id];\n  // Disable clicks mode if no object remaining\n  if (objects.value.length === 0) {\n    sam2Options.value.mode = null;\n    sam2Options.value.params.pointType = null;\n  }\n  handleRemoveObject(clicked_obj_id);\n}\n\nasync function handleSaveSAM2Annotations() {\n  isCreatingAnnotations.value = true;\n  const dataConnect = new DatastoreConnect();\n  return dataConnect.addAnnotationsBulk({ annotations: [...sam2Annotations.value, ...aigt3dAnnotations.value, ...aigt2dAnnotations.value] })\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error);\n      }\n\n      return resp.result;\n    })\n    .then(async (newAnnotations) => {\n      console.log(newAnnotations);\n      // Set label_index and label_name for new annotations\n      // TODO: remove the necessity to do this\n      newAnnotations.forEach((anno) => {\n        const label = labels.value.find((e) => e.id === anno.label_id);\n        anno.label_index = label.index;\n        anno.label_name = label.name;\n      });\n\n      // Update cache with new annotations\n      addNewAnnotationsArrayToCache(newAnnotations);\n\n      // Reset SAM2\n      await handleSAMReset();\n\n      isCreatingAnnotations.value = false;\n    })\n    .catch((error) => {\n      isCreatingAnnotations.value = false;\n      throw error;\n    });\n}\n\nasync function fetchInitStatus() {\n  console.log('fetchInitStatus');\n\n  // Sending a POST request\n  const result = await fetch(`aigt/status?ip=${sam2Server.value}`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error fetching init state status`);\n      }\n      return response.json();\n    })\n    .catch((err) => {\n      console.log(err);\n      return null;\n    });\n\n  // Parse the JSON response\n  console.log(\"result:\", result);\n\n  if (result?.progress) {\n    initProgress.value = result.progress;\n  }\n  if (result?.total) {\n    initTotal.value = result.total;\n  }\n  if (result?.status) {\n    initStatus.value = result.status;\n  }\n  if (result?.detail) {\n    initDetail.value = result.detail;\n  }\n  if (result && result.status === 'complete') {\n    isInitializingState.value = false;\n    hasInitState.value = true;\n    pauseFetchInitStatus();\n  }\n  if (result && result.status === 'error') {\n    isInitializingState.value = false;\n    hasInitState.value = false;\n    initError.value = result.detail;\n    pauseFetchInitStatus();\n  }\n}\n\nasync function fetchPropagateStatus() {\n  // Sending a POST request\n  const result = await fetch(`aigt/status?ip=${sam2Server.value}`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error fetching propagation status`);\n      }\n      return response.json();\n    })\n    .catch((err) => {\n      console.log(err);\n      return null;\n    });\n\n  // Parse the JSON response\n  console.log(\"result:\", result);\n\n  if (result?.progress) {\n    propagateProgress.value = result.progress;\n  }\n  if (result?.total) {\n    propagateTotal.value = result.total;\n  }\n  if (result?.status) {\n    propagateStatus.value = result.status;\n  }\n  if (result?.detail) {\n    propagateDetail.value = result.detail;\n  }\n  // if (result?.polygon && result?.frame_idx >= 0) {\n  //   const newAnnotationPolygon = {\n  //     id: uuidv4(),\n  //     label_index: selectedLabel.value.index,\n  //     label_id: selectedLabel.value.id,\n  //     label_name: selectedLabel.value.name,\n  //     type: \"seg\",\n  //     polygon: JSON.stringify(result.polygon),\n  //     score: 1,\n  //     reviewStatus: 'verified',\n  //     image_id: samples.value[(initStartFrame.value - 1) + result.frame_idx],\n  //     pending: true,\n  //   };\n\n  //   sam2Annotations.value = [...sam2Annotations.value, newAnnotationPolygon];\n  // }\n  if (result && result.status === 'cancelled') {\n    isPropagating.value = false;\n    pauseFetchPropagateStatus();\n    pauseFetchAnnotationsStatus();\n    // Check for annotations one more time\n    fetchAnnotationsStatus();\n  }\n  if (result && result.status === 'complete') {\n    isPropagating.value = false;\n    pauseFetchPropagateStatus();\n    pauseFetchAnnotationsStatus();\n    // Check for annotations one more time\n    fetchAnnotationsStatus();\n  }\n  if (result && result.status === 'error') {\n    isPropagating.value = false;\n    pauseFetchPropagateStatus();\n    pauseFetchAnnotationsStatus();\n    // Check for annotations one more time\n    fetchAnnotationsStatus();\n  }\n}\n\nasync function fetchAnnotationsStatus() {\n  console.log('fetchAnnotationsStatus');\n\n  // Sending a POST request\n  const result = await fetch(`aigt/annotations?ip=${sam2Server.value}&last_index=${propagateLastAnnotationIndex.value}`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error fetching propagation status`);\n      }\n      return response.json();\n    })\n    .catch((err) => {\n      console.log(err);\n      return null;\n    });\n\n  // Parse the JSON response\n  if (result?.last_index) {\n    propagateLastAnnotationIndex.value = result.last_index;\n  }\n  if (result?.annotations) {\n    const polygonAnnotations = result.annotations.filter((anno) => 'polygon' in anno);\n    const box3dAnnotations = result.annotations.filter((anno) => 'box3d' in anno);\n    const box2dAnnotations = result.annotations.filter((anno) => 'box2d' in anno);\n\n    polygonAnnotations.forEach((resultAnno) => {\n      if (resultAnno?.polygon && resultAnno?.frame_idx >= 0) {\n        const newAnnotationPolygon = {\n          id: uuidv4(),\n          label_index: objectsLabelMap.value[resultAnno.obj_id].index,\n          label_id: objectsLabelMap.value[resultAnno.obj_id].id,\n          label_name: objectsLabelMap.value[resultAnno.obj_id].name,\n          type: \"seg\",\n          polygon: JSON.stringify(resultAnno.polygon),\n          score: 1,\n          reviewStatus: 'verified',\n          image_id: samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx],\n          annotation_set_id: destinationAnnotationSet.value?.id,\n          object_reference: resultAnno.obj_id,\n          pending: true,\n        };\n\n        // Add the new annotation. Merge to existing annotation of the same object if it exists\n        sam2Annotations.value = [\n          ...sam2Annotations.value.filter((anno) => {\n            const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n            const isSameObject = anno.object_reference === resultAnno.obj_id;\n            return !(isSameImage && isSameObject);\n          }),\n          newAnnotationPolygon,\n        ];\n        sam2LastPropagatedAnnotations.value = [\n          ...sam2LastPropagatedAnnotations.value.filter((anno) => {\n            const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n            const isSameObject = anno.object_reference === resultAnno.obj_id;\n            return !(isSameImage && isSameObject);\n          }),\n          newAnnotationPolygon,\n        ];\n      }\n    });\n\n    box3dAnnotations.forEach((resultAnno) => {\n      if (resultAnno?.box3d && resultAnno?.obj_id) {\n        const new3DBox = {\n          id: uuidv4(),\n          label_index: objectsLabelMap.value[resultAnno.obj_id].index,\n          label_id: objectsLabelMap.value[resultAnno.obj_id].id,\n          label_name: objectsLabelMap.value[resultAnno.obj_id].name,\n          type: \"3dbox\",\n          x: 0,\n          y: 0,\n          w: 0,\n          h: 0,\n          score: 1,\n          data_json: {\n            x: resultAnno.box3d[0],\n            y: resultAnno.box3d[1],\n            z: resultAnno.box3d[2],\n            dx: resultAnno.box3d[3],\n            dy: resultAnno.box3d[4],\n            dz: resultAnno.box3d[5],\n          },\n          image_id: resultAnno.image_id,\n          annotation_set_id: resultAnno.annotation_set_id,\n          object_reference: resultAnno.obj_id,\n          pending: true,\n        };\n\n        // Add the new annotation. Merge to existing annotation of the same object if it exists\n        aigt3dAnnotations.value = [\n          ...aigt3dAnnotations.value.filter((anno) => {\n            const isSameImage = anno.image_id === resultAnno.image_id;\n            const isSameObject = anno.object_reference === resultAnno.obj_id;\n            return !(isSameImage && isSameObject);\n          }),\n          new3DBox,\n        ];\n        aigt3dLastPropagatedAnnotations.value = [\n          ...aigt3dLastPropagatedAnnotations.value.filter((anno) => {\n            const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n            const isSameObject = anno.object_reference === resultAnno.obj_id;\n            return !(isSameImage && isSameObject);\n          }),\n          new3DBox,\n        ];\n      }\n    });\n\n    box2dAnnotations.forEach((resultAnno) => {\n      if (resultAnno?.box2d && resultAnno?.obj_id) {\n        const new2DBox = {\n          id: uuidv4(),\n          label_index: objectsLabelMap.value[resultAnno.obj_id].index,\n          label_id: objectsLabelMap.value[resultAnno.obj_id].id,\n          label_name: objectsLabelMap.value[resultAnno.obj_id].name,\n          type: \"box\",\n          x: resultAnno.box2d.x,\n          y: resultAnno.box2d.y,\n          w: resultAnno.box2d.w,\n          h: resultAnno.box2d.h,\n          score: 1,\n          image_id: samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx],\n          annotation_set_id: destinationAnnotationSet.value?.id,\n          object_reference: resultAnno.obj_id,\n          pending: true,\n        };\n\n        // Add the new annotation. Merge to existing annotation of the same object if it exists\n        aigt2dAnnotations.value = [\n          ...aigt2dAnnotations.value.filter((anno) => {\n            const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n            const isSameObject = anno.object_reference === resultAnno.obj_id;\n            return !(isSameImage && isSameObject);\n          }),\n          new2DBox,\n        ];\n        aigt2dLastPropagatedAnnotations.value = [\n          ...aigt2dLastPropagatedAnnotations.value.filter((anno) => {\n            const isSameImage = anno.image_id === samples.value[(initStartFrame.value - 1) + resultAnno.frame_idx];\n            const isSameObject = anno.object_reference === resultAnno.obj_id;\n            return !(isSameImage && isSameObject);\n          }),\n          new2DBox,\n        ];\n      }\n    });\n  }\n}\n\nfunction handleSAMAddObject() {\n  const uuid = uuidv4();\n  objects.value.push(uuid);\n  selectedObject.value = uuid;\n}\n\nfunction getFirstClickOrBoxFrameIndex() {\n  const boxes = sam2Options.value.params.boxes;\n  const clicks = sam2Options.value.params.clicks;\n  const minBoxFrameIdx = boxes.reduce((min, obj) => (obj.frame_idx < min ? obj.frame_idx : min), initEndFrame.value);\n  const minClickFrameIdx = clicks.reduce((min, obj) => (obj.frame_idx < min ? obj.frame_idx : min), initEndFrame.value);\n  return Math.min(minBoxFrameIdx, minClickFrameIdx);\n}\n\nfunction getLastClickOrBoxFrameIndex() {\n  const boxes = sam2Options.value.params.boxes;\n  const clicks = sam2Options.value.params.clicks;\n  const maxBoxFrameIdx = boxes.reduce((max, obj) => (obj.frame_idx > max ? obj.frame_idx : max), 0);\n  const maxClickFrameIdx = clicks.reduce((max, obj) => (obj.frame_idx > max ? obj.frame_idx : max), 0);\n  return Math.max(maxBoxFrameIdx, maxClickFrameIdx);\n}\n\nasync function fetchServerHealth() {\n  if (!sam2Server.value) return;\n\n  const result = await fetch(`aigt/health?ip=${sam2Server.value}`, {\n    method: \"GET\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  })\n    .then(async (response) => {\n      if (!response.ok) {\n        const text = await response.text();\n        switch (response.status) {\n        case 502:\n          if (text.includes(\"DNS lookup failed\")) {\n            throw new Error(\"Error: The server could not be found. Check the IP or domain.\");\n          } else if (text.includes(\"Connection refused\")) {\n            throw new Error(\"Error: The target server is unavailable.\");\n          } else {\n            throw new Error(`Bad Gateway: ${text}`);\n          }\n        case 504:\n          throw new Error(\"Gateway Timeout: The target server did not respond in time.\");\n        default:\n          break;\n        }\n        throw new Error(`Error fetching server health`);\n      }\n      return true;\n    })\n    .catch(() => false);\n\n  isSam2ServerFound.value = result;\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.sam-toolbar {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n\n  &__group {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 12px;\n  }\n\n  &__group + &__group {\n    margin-left: 12px;\n  }\n\n  &__vr {\n    display: flex;\n    width: 1px;\n    height: 60%;\n    margin: 0 8px;\n  }\n\n  &__title {\n    font-weight: 700;\n    font-size: 0.9rem;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n\n  &__button-container {\n    position: relative;\n  }\n\n  &__button {\n    border-radius: 4px !important;\n\n    &._secondary {\n      color: inherit;\n      background: none;\n      border: none;\n      box-shadow: none;\n\n      &:hover:not(:disabled), &.active:not(:disabled) {\n        background-color: var(--icon-hover-color);\n        // box-shadow: 0 0 0 4px rgba(140, 140, 140, 0.2);\n      }\n\n      &:disabled {\n        box-shadow: none !important;\n        background-color: transparent !important;\n        cursor: default;\n        color: var(--color-disabled) !important;\n      }\n    }\n\n    &._danger {\n      color: var(--color-white);\n      background: var(--color-danger);\n      border: none;\n      box-shadow: none;\n\n      &:hover:not(:disabled), &.active:not(:disabled) {\n        background-color: var(--color-danger-400);\n        // box-shadow: 0 0 0 4px rgba(140, 140, 140, 0.2);\n      }\n\n      &:disabled {\n        box-shadow: none !important;\n        background-color: transparent !important;\n        cursor: default;\n        color: var(--color-disabled) !important;\n      }\n    }\n\n  }\n\n  &__button-pointer-overlay {\n    display: flex;\n    position: absolute;\n    width: 14px;\n    height: 14px;\n    top: -3px;\n    right: -2px;\n    pointer-events: none;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n\n  &__labeled_button {\n    width: auto;\n  }\n}\n\n.sam-loader {\n  animation: rotation 1s linear infinite;\n  box-sizing: border-box;\n  width: 18px;\n  height: 18px;\n  border-radius: 50%;\n  display: inline-block;\n  border-right: 3px solid transparent;\n  @include themify() {\n    border-top: 3px solid themed('color-accent-500');\n  }\n\n  &::after {\n    content: '';\n    box-sizing: border-box;\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 18px;\n    height: 18px;\n    border-radius: 50%;\n    border-left: 3px solid transparent;\n    @include themify() {\n      border-bottom: 3px solid themed('color-primary-500');\n    }\n  }\n\n  @keyframes rotation {\n    0% {\n      transform: rotate(0deg);\n    }\n    100% {\n      transform: rotate(360deg);\n    }\n  }\n}\n\n.sam-ready {\n  box-sizing: border-box;\n  width: 18px;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  &__icon {\n    display: inline-block;\n    width: 14px;\n    height: 14px;\n    border-radius: 50%;\n    @include themify() {\n      background: themed('color-success');\n    }\n  }\n}\n\n.sam-error {\n  box-sizing: border-box;\n  width: 18px;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  &__icon {\n    display: inline-block;\n    width: 14px;\n    height: 14px;\n    border-radius: 50%;\n    @include themify() {\n      background: themed('color-error');\n    }\n  }\n}\n\n#servers-select {\n  border-radius: 3px;\n  height: 28px;\n}\n\n.servers {\n  &__loading {\n    display: flex;\n    align-items: center;\n    font-style: italic;\n    height: 100%;\n\n    span {\n      margin-left: 8px;\n    }\n  }\n\n  &__not-found {\n    display: flex;\n    align-items: center;\n    font-style: italic;\n  }\n}\n\n.v-number-input * {\n  --v-input-control-height: 28px;\n  --v-input-padding-top: 0px;\n  --v-field-input-padding-top: 0px;\n  --v-field-input-padding-bottom: 0px;\n  --v-field-padding-bottom: 0px;\n  --v-icon-size-multiplier: 0.5;\n}\n\n.v-text-field * {\n  --v-input-control-height: 28px;\n  --v-input-padding-top: 0px;\n  --v-field-input-padding-top: 0px;\n  --v-field-input-padding-bottom: 0px;\n  --v-field-padding-bottom: 0px;\n  --v-icon-size-multiplier: 0.5;\n  // --v-field-padding-start: 0;\n  // --v-field-padding-end: 0;\n}\n\n.sam-sidebar {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  flex: 1 1 auto;\n  min-height: 0;\n\n  &__section {\n    display: flex;\n    flex-direction: column; /* Stack title and list vertically */\n    // margin-bottom: 8px;\n    border-bottom: 1px solid #ced4da;\n    width: 100%;\n    padding: 12px 12px 12px 12px;\n    flex: 0 1 auto;\n    min-height: 0;\n  }\n\n  &__title {\n    display: flex;\n    align-items: center;\n    text-align: left;\n    font-size: 1rem;\n    font-weight: 600;\n    color: var(--body-text-color-secondary);\n    padding-bottom: 12px;\n    letter-spacing: 0.025em;\n    gap: 6px;\n  }\n}\n\n.init-state {\n  h2 {\n    display: flex;\n    flex-direction: row;\n  }\n\n  &__inputs {\n    display: flex;\n    flex-direction: row;\n    gap: 8px;\n    padding-bottom: 8px;\n  }\n}\n\n.controls {\n  &__buttons {\n    display: flex;\n    flex-direction: row;\n    gap: 12px;\n  }\n}\n\n.propagate {\n  &__buttons {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n    align-items: center;\n    width: 100%;\n  }\n\n  &__buttons-main {\n    display: flex;\n    flex-direction: row;\n    gap: 12px;\n    align-items: center;\n    width: 100%;\n  }\n\n  &__action-button {\n    flex: 1 1 auto;\n  }\n\n  &__cancel-button {\n    width: 100%;\n  }\n}\n\n.objects {\n  flex: 1 1 auto;\n\n  &__cards {\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n    overflow: auto;\n    padding: 4px;\n    flex: 1 1 auto;\n    margin-bottom: 12px;\n  }\n}\n\n.objects-card {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  background: var(--color-white-600);\n  border-radius: 4px;\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n  padding: 8px;\n  cursor: pointer;\n\n  &._selected {\n    outline: 3px solid var(--color-primary);\n  }\n\n  &__title {\n    text-align: left;\n    font-size: 0.875rem;\n    font-weight: 600;\n    color: var(--color-primary);\n    padding-bottom: 12px;\n    letter-spacing: 0.025em;\n    display: flex;\n    flex-direction: row;\n  }\n\n  &__buttons {\n    display: flex;\n    flex-direction: row;\n    gap: 12px;\n    align-items: center;\n  }\n\n  &__edit-button {\n    flex: 1 1 auto;\n  }\n\n  &__close {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n  }\n}\n\n#pending-annotation-counts {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  gap: 4px;\n}\n\n.tag {\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  border-radius: 18px;\n  border: 2px solid var(--color-primary);\n  padding: 2px 4px;\n\n  &__count {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 18px;\n    padding: 0 6px;\n    height: 18px;\n    width: fit-content;\n    background: var(--color-accent);\n  }\n\n  &__label {\n    font-weight: 600;\n    letter-spacing: 0.025em;\n    font-size: 0.875rem;\n    line-height: 1;\n  }\n}\n</style>\n","import script from \"./SAM2Sidebar.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SAM2Sidebar.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./SAM2Sidebar.vue?vue&type=style&index=0&id=181ed3fa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-181ed3fa\"]])\n\nexport default __exports__","<template>\n  <Modal\n    id=\"annotation-editor-modal\"\n    ref=\"imageModal\"\n    :fullScreen=\"true\"\n    :closeWithEscapeKey=\"false\"\n    @keydown.tab.stop.prevent=\"\"\n    @closed=\"handleModalClosed\"\n  >\n    <template #modal-header-prepend>\n      <div class=\"modal-prepend-header__logo\" v-html=\"auzone_log_svg\" />\n    </template>\n    <template #modal-header-title-description>\n      <div class=\"image-title-description\">\n        <span class=\"mt-0 mb-0 title\" :title=\"title\">{{ title }}</span>\n        <span class=\"mt-0 mb-0 subtitle\" :title=\"subtitle\">{{ subtitle }}</span>\n      </div>\n    </template>\n    <template #modal-header>\n      <div class=\"header\">\n        <div class=\"review-task-header\">\n          <AuditToolSelect v-if=\"hasReviewTask && sourceAnnotationSet\" v-model=\"auditorType\" />\n          <div class=\"review-task-header-info scrollbar\">\n            <TaskDatasetAndDestinationCard :reviewSettings=\"reviewSettings\" />\n            <TaskProgressCard v-if=\"hasReviewTask\" />\n            <TaskActiveTimeCard v-if=\"hasReviewTask\" />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-main>\n      <template v-if=\"auditorType === 'image'\">\n        <v-layout :full-height=\"true\" style=\"z-index: 9;\" class=\"flex-column\">\n          <div\n            ref=\"modalDisplay\"\n            class=\"display\"\n            :tabindex=\"selectedAnnotations.length > 0\"\n          >\n            <BaseSidebar :collapsible=\"false\">\n              <div class=\"annotation-editor-modal__sidebar\">\n                <JsonRawViewer\n                  v-model:selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n                  v-model:selectedLabels=\"annotationDisplaySettings.displayLabels.labels\"\n                  v-model:selectedLabel=\"selectedLabel\"\n                  v-model:displayProjection=\"displayProjection\"\n                  :labels=\"labels\"\n                  :imageObj=\"displayImageObj\"\n                  :annotationSets=\"annotationSets\"\n                  :fixedAnnotationSet=\"annotationSetToEdit\"\n                  :groupedAnnotations=\"groupedAnnotations\"\n                  :selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n                  :isEditing=\"true\"\n                  @remove-annotation=\"handleAnnotationDeleteClicked\"\n                  @select-annotations=\"handleSelectAnnotationFromSidebar\"\n                  @new-color=\"(params)=>$emit('new-color', params)\"\n                >\n                  <template #utilities-slot>\n                    <AddVisualizationMenu @layout-selected=\"handleAddVisualization\" />\n                    <SelectLayoutMenu @layout-selected=\"handleLayoutSelected\" />\n                  </template>\n                </JsonRawViewer>\n                <template v-if=\"groups.length > 0\">\n                  <div class=\"image-group\">\n                    <label class=\"image-group__label\">Group</label>\n                    <ImageGroupSelector :imageObj=\"displayImageObj\" :groups=\"groups\" @change=\"handleImageGroupChanged\" />\n                  </div>\n                </template>\n              </div>\n            </BaseSidebar>\n\n            <div class=\"visualization\">\n              <AnnotationToolSequenceRibbon\n                v-if=\"internalEditAsSequence && isSequence\"\n                :zoom=\"zoom\"\n                :canUndo=\"prevInternalAnnotations !== null\"\n                :hasSelection=\"selectedAnnotationIdentifiers.length > 0\"\n                :annotationSets=\"annotationSets\"\n                :labels=\"labels\"\n                :annotationDisplaySettings=\"annotationDisplaySettings\"\n                :isReviewMode=\"isAuditMode\"\n                :frameImageObj=\"displayImageObj\"\n                :reviewSettings=\"reviewSettings\"\n                :selectedAnnotations=\"selectedAnnotations\"\n                :copiedAnnotations=\"copiedAnnotations\"\n                @zoom-to-fit=\"handleZoomToFit\"\n                @zoom-to-selection=\"handleZoomToSelection\"\n                @undo=\"handleUndo\"\n                @revert-changes=\"handleRevertChanges\"\n                @show-annotation-info=\"showAnnotationInfo = true\"\n                @submit=\"handleSequenceSubmit\"\n                @copy=\"handleCopyAnnotations\"\n                @paste=\"handlePasteAnnotations\"\n                @bulk-del-ann=\"handleDeleteAnnotationBulk\"\n                @exit-editor=\"handleModalClosed\"\n              />\n              <AnnotationToolRibbon\n                v-else\n                :zoom=\"zoom\"\n                :canUndo=\"prevInternalAnnotations !== null\"\n                :hasSelection=\"selectedAnnotationIdentifiers.length > 0\"\n                :annotationSets=\"annotationSets\"\n                :labels=\"labels\"\n                :annotationDisplaySettings=\"annotationDisplaySettings\"\n                :isReviewMode=\"isAuditMode\"\n                @zoom-to-fit=\"handleZoomToFit\"\n                @zoom-to-selection=\"handleZoomToSelection\"\n                @undo=\"handleUndo\"\n                @revert-changes=\"handleRevertChanges\"\n                @show-annotation-info=\"showAnnotationInfo = true\"\n                @submit=\"handleSubmit\"\n                @bulk-del-ann=\"handleDeleteAnnotationBulk\"\n                @exit-editor=\"handleModalClosed\"\n              />\n              <VisualizationDisplays\n                ref=\"visualizationDisplays\"\n                v-model:layout=\"layout\"\n                :loading=\"isInitializingAnimation || (internalEditAsSequence && isSequence && isLoadingSample)\"\n                @drop=\"handleVisualizationContainerDrop\"\n                @visualization-selected=\"handleVisualizationSelected\"\n              />\n              <div v-if=\"internalEditAsSequence && isSequence\" class=\"visualization__horizontal-divider\" />\n              <AnimationControls\n                v-if=\"internalEditAsSequence && isSequence && internalImageObj\"\n                ref=\"animationControls\"\n                :currentImage=\"internalImageObj\"\n                :isTask=\"true\"\n                :reviewSettings=\"reviewSettings\"\n                :labels=\"labels\"\n                :selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n              />\n            </div>\n\n            <BaseSidebar v-if=\"drawMode === 'sam2'\" :collapsible=\"false\">\n              <div class=\"annotation-editor-modal__sidebar\">\n                <SAM2Sidebar />\n              </div>\n            </BaseSidebar>\n\n            <BaseSidebar\n              :title=\"'Annotation Info'\"\n              :closeable=\"true\"\n              :collapsible=\"false\"\n              :placement=\"'right'\"\n              :show=\"showAnnotationInfo\"\n              @closed=\"showAnnotationInfo = false\"\n            >\n              <AnnotationDetails :annotationObj=\"selectedAnnotationInfo\" />\n            </BaseSidebar>\n            <BaseSidebar\n              v-if=\"isAuditMode && reviewSettings && submitType === 'submit-accepted-annotations'\"\n              class=\"annotation-review-sidebar\"\n              :title=\"'Annotation Review'\"\n              :closeable=\"false\"\n              :collapsible=\"false\"\n              :placement=\"'right'\"\n              :show=\"true\"\n            >\n              <div class=\"annotation-review-sidebar__buttons\">\n                <button\n                  class=\"button button-sm button-secondary\"\n                  :title=\"'Accept All Annotations'\"\n                  @click=\"acceptAllAnnotations\"\n                >\n                  Accept All Annotations\n                </button>\n              </div>\n              <div class=\"annotation-review-sidebar__annotations scrollbar\" @scroll=\"handleAnnotationScroll\">\n                <div\n                  v-for=\"(annotationObj, index) in internalAnnotations\"\n                  :key=\"index\"\n                  class=\"annotation-review-sidebar__snap-container\"\n                >\n                  <GalleryGridAnnotationReviewItem\n                    v-model:reviewStatus=\"annotationObj.reviewStatus\"\n                    :imageObj=\"displayImageObj\"\n                    :annotationSets=\"annotationSets\"\n                    :annotationSet=\"annotationSetToEdit\"\n                    :labels=\"labels\"\n                    :annotation=\"annotationObj\"\n                    @edit-clicked=\"handleAnnotationReviewItemEdit\"\n                  />\n                </div>\n              </div>\n            </BaseSidebar>\n          </div>\n          <AnnotationEditorHistoryDrawer\n            v-if=\"hasReviewTask && reviewSettings !== null && reviewSettings !== undefined\"\n            :active=\"true\"\n            :images=\"doneImages\"\n            :currentImage=\"currentTaskImage\"\n            :pendingImages=\"pendingTaskImages\"\n            :activeIndex=\"activeImageIndex\"\n            :component=\"'footer'\"\n            :height=\"56\"\n            :reviewSettings=\"reviewSettings\"\n            :sequences=\"sequences\"\n            @image-clicked=\"handleTaskImageClicked\"\n            @update:selected-sequence=\"handleSelectedSequenceChanged\"\n          />\n        </v-layout>\n      </template>\n      <template v-else-if=\"auditorType === 'annotation'\">\n        <AnnotationReview\n          v-if=\"hasSourceAnnotationSet && reviewSettings\"\n          ref=\"annotationReview\"\n          :reviewSettings=\"reviewSettings\"\n          :activeImageIndex=\"activeImageIndex\"\n          :currentTaskImage=\"currentTaskImage\"\n          :pendingImages=\"pendingTaskImages\"\n          :annotations=\"internalAnnotations\"\n          :labels=\"labels\"\n          @image-clicked=\"handleTaskImageClicked\"\n        />\n      </template>\n\n      <template v-if=\"showLayouts\">\n        <VisualizationPane v-if=\"visualizationLocations?.canvas\" :paneType=\"'canvas'\" :to=\"getLocationId(visualizationLocations.canvas)\">\n          <AnnotationToolViewingModeControls\n            :hasImage=\"displayImageObj && 'id' in displayImageObj\"\n            :zoom=\"zoom\"\n            :hasSelection=\"selectedAnnotationIdentifiers.length > 0\"\n            @zoom-to-fit=\"handleZoomToFit\"\n            @zoom-to-selection=\"handleZoomToSelection\"\n            @download-image=\"downloadImage\"\n          />\n          <DrawingToolModeControls\n            v-model:mode=\"drawMode\"\n            v-model:size=\"drawCursorSize\"\n            v-model:samActive=\"samOptions.enabled\"\n            :shouldEnableEraser=\"selectedAnnotationIdentifiers.length === 1\"\n            :imageDimensions=\"imageDimensions\"\n            :hasSAMImageEmbedding=\"hasSAMImageEmbedding\"\n            :hasSAMImageEmbeddingError=\"hasSAMImageEmbeddingError\"\n            :samOptions=\"samOptions\"\n            :sam2Options=\"sam2Options\"\n            @update-cursor-size=\"handleCursorSizeUpdated\"\n          />\n          <div\n            ref=\"annotationTool\"\n            class=\"annotation-tool\"\n          >\n            <AnnotationCanvas\n              v-if=\"displayImageObj\"\n              ref=\"annotationCanvas\"\n              v-model:updatedAnnotations=\"internalAnnotations\"\n              v-model:scale=\"annotationToolScale\"\n              v-model:selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n              v-model:hasSAMImageEmbedding=\"hasSAMImageEmbedding\"\n              v-model:hasSAMImageEmbeddingError=\"hasSAMImageEmbeddingError\"\n              :selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n              :selectedLabels=\"annotationDisplaySettings.displayLabels.labels\"\n              :currentTool=\"currentCanvasTool\"\n              :annotations=\"internalAnnotations\"\n              :annotationSets=\"annotationSets\"\n              :imageObj=\"displayImageObj\"\n              :labels=\"labels\"\n              :selectedLabel=\"selectedLabel\"\n              :colorBy=\"colorBy\"\n              :showAnnotations=\"showAnnotations\"\n              :editingEnabled=\"true\"\n              :samOptions=\"samOptions\"\n              :useImageCacheOnly=\"internalEditAsSequence && isSequence ? true : false\"\n              :imageCacheElem=\"currentAnimationSample?.image\"\n              :highlightedAnnotationIdentifier=\"hoveredAnnotationListIdentifier\"\n              :isAuditMode=\"isAuditMode\"\n              :enableSAM=\"true\"\n              :displayProjection=\"displayProjection\"\n              :showTypes=\"showTypes\"\n              :drawMode=\"drawMode\"\n              :drawCursorSize=\"drawCursorSize\"\n              :doneVertexDraw=\"doneVertexDraw\"\n              :lidarProjections=\"currentAnimationSample?.lidarProjections\"\n              :pcdProjections=\"currentAnimationSample?.pcdProjections\"\n              :pendingAnnotations=\"pendingAnnotations\"\n              @create-annotation=\"createNewInternalAnnotation\"\n              @image-loaded=\"handleImageLoaded\"\n              @remove-annotation=\"handleAnnotationDeleteClicked\"\n            />\n            <div v-else-if=\"isMounted && !internalEditAsSequence\" id=\"no-image-remaining\">No Images Remaining</div>\n          </div>\n          <VideoControls v-if=\"isVideo\" />\n        </VisualizationPane>\n\n        <VisualizationPane v-if=\"visualizationLocations?.['3d-canvas']\" :to=\"getLocationId(visualizationLocations['3d-canvas'])\">\n          <PointCloudViewer\n            v-model:updatedAnnotations=\"internalAnnotations\"\n            v-model:selectedAnnotationIdentifiers=\"selectedAnnotationIdentifiers\"\n            :imageObj=\"displayImageObj\"\n            :annotations=\"internalAnnotations\"\n            :pendingAnnotations=\"aigt3dAnnotations\"\n            :labels=\"labels\"\n            :selectedLabel=\"selectedLabel\"\n            :selectedLabels=\"annotationDisplaySettings.displayLabels.labels\"\n            :selectedAnnotationSets=\"annotationDisplaySettings.displayAnnotationSets.annotation_sets\"\n            :isAuditMode=\"isAuditMode\"\n            :currentTool=\"current3DCanvasTool\"\n            :showTypes=\"showTypes\"\n            :points=\"currentAnimationSample?.pcd\"\n            :lidar=\"currentAnimationSample?.lidar\"\n            @create-annotation=\"createNewInternalAnnotation\"\n          />\n          <DrawingToolModeControls3d\n            v-model:current3DCanvasTool=\"current3DCanvasTool\"\n          />\n        </VisualizationPane>\n\n        <VisualizationPane v-if=\"visualizationLocations?.['depth-map']\" :to=\"getLocationId(visualizationLocations['depth-map'])\">\n          <DepthMapViewer\n            :showDepthMap=\"showTypes?.depthmap\"\n          />\n        </VisualizationPane>\n      </template>\n    </template>\n  </Modal>\n  <BulkDeleteAnnotationModal\n    ref=\"bulkDeleteModal\"\n    :frameCount=\"frameCount\"\n    :imageObj=\"internalImageObj\"\n    :annotationSets=\"annotationSets\"\n    @deleted=\"handleAnnotationBulkDeleteComplete\"\n  />\n</template>\n\n<script setup>\nimport Modal from '@/components/Modal.vue';\nimport BaseSidebar from '@/components/BaseSidebar.vue';\nimport AnnotationCanvas from '@/components/DatasetComponent/AnnotationTool/AnnotationCanvas.vue';\nimport AnnotationToolRibbon from '@/components/DatasetComponent/AnnotationTool/AnnotationToolRibbon.vue';\nimport AnnotationToolSequenceRibbon from '@/components/DatasetComponent/AnnotationTool/AnnotationToolSequenceRibbon.vue';\nimport AnnotationDetails from '@/components/DatasetComponent/AnnotationTool/AnnotationDetails.vue';\nimport GalleryGridAnnotationReviewItem from '@/components/DatasetComponent/GalleryComponent/GalleryGridAnnotationReviewItem.vue';\nimport AnnotationEditorHistoryDrawer from '@/components/DatasetComponent/AnnotationTool/AnnotationEditorHistoryDrawer.vue';\nimport AnnotationReview from '@/components/DatasetComponent/AnnotationTool/AnnotationReview.vue';\nimport TaskProgressCard from '@/components/DatasetComponent/AnnotationTool/TaskProgressCard.vue';\nimport TaskActiveTimeCard from '@/components/DatasetComponent/AnnotationTool/TaskActiveTimeCard.vue';\nimport TaskDatasetAndDestinationCard from '@/components/DatasetComponent/AnnotationTool/TaskDatasetAndDestinationCard.vue';\nimport AuditToolSelect from '@/components/DatasetComponent/AnnotationTool/AuditToolSelect.vue';\nimport ImageGroupSelector from '@/components/ImageGroupSelector.vue';\nimport { roundNumber } from '@/assets/js/utils.js';\nimport {\n  ref, toRefs, watch, computed, onMounted, onUnmounted, nextTick, toRaw,\n} from 'vue';\nimport useTasks from '@/composables/annotationTool/useTasks.js';\nimport useAnnotationEditorModalHotkeys from '@/composables/annotationTool/useAnnotationEditorModalHotkeys.js';\nimport useImageViewerHotkeys from '@/composables/annotationTool/useImageViewerHotkeys.js';\nimport { auzone_logo } from \"@/assets/js/icons\";\nimport VideoControls from '@/components/DatasetComponent/AnnotationTool/VideoControls/VideoControls.vue';\nimport ToolsSidebar from '@/components/DatasetComponent/AnnotationTool/ToolsSidebar.vue';\nimport { useViewerVisualizationsStore } from '@/stores/useViewerVisualizationsStore.js';\nimport { useEditorControlsStore } from '@/stores/useEditorControlsStore.js';\nimport { useEditorStore } from '@/stores/useEditorStore.js';\nimport { storeToRefs } from 'pinia';\nimport PointCloudViewer from '@/components/DatasetComponent/AnnotationTool/PointCloudViewer.vue';\nimport JsonRawViewer from '@/components/DatasetComponent/AnnotationTool/JsonRawViewer.vue';\nimport { useStore } from 'vuex';\nimport AnnotationToolViewingModeControls from '@/components/DatasetComponent/AnnotationTool/AnnotationToolViewingModeControls.vue';\nimport useSAMCanvas from '@/composables/canvas/useSAMCanvas.js';\nimport BulkDeleteAnnotationModal from '@/components/DatasetComponent/AnnotationTool/BulkDeleteAnnotationModal.vue';\nimport { v4 as uuidv4 } from 'uuid';\nimport DepthMapViewer from '@/components/DatasetComponent/AnnotationTool/DepthMapViewer.vue';\nimport DrawingToolModeControls from '@/components/DatasetComponent/AnnotationTool/DrawingToolModeControls.vue';\nimport DrawingToolModeControls3d from '@/components/DatasetComponent/AnnotationTool/DrawingToolModeControls3d.vue';\nimport VisualizationPane from '@/components/DatasetComponent/AnnotationTool/VisualizationPane.vue';\nimport VisualizationDisplays from '@/components/DatasetComponent/AnnotationTool/VisualizationDisplays.vue';\nimport SelectLayoutMenu from '@/components/DatasetComponent/AnnotationTool/SelectLayoutMenu.vue';\nimport AddVisualizationMenu from '@/components/DatasetComponent/AnnotationTool/AddVisualizationMenu.vue';\nimport useVisualizationDisplays from '@/composables/annotationTool/useVisualizationDisplays.js';\nimport AnimationControls from '@/components/DatasetComponent/AnnotationTool/AnimationControlsV2.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { useSAM2Store } from '@/stores/useSAM2Store.js';\nimport SAM2Sidebar from '@/components/DatasetComponent/AnnotationTool/SAM2Sidebar.vue';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\n\nconst props = defineProps({\n  initialLabels: {\n    type: Array,\n    default: () => [],\n  },\n  reviewSettings: {\n    type: Object,\n    default: null,\n  },\n  initialAnnotationDisplaySettings: {\n    type: Object,\n    default: () => (\n      {\n        displayAnnotationSets: { annotation_sets: [] },\n        displayLabels: { labels: [] },\n        colorAnnotationsBy: { type: \"label\" },\n      }\n    ),\n  },\n  initialAuditorType: {\n    type: String,\n    default: 'image',\n  },\n  editAsSequence: {\n    type: Boolean,\n    default: true,\n  },\n});\nconst {\n  reviewSettings,\n  initialAnnotationDisplaySettings,\n  initialAuditorType,\n  editAsSequence,\n} = toRefs(props);\n\nconst store = useStore();\n\nconst emit = defineEmits(['closed', 'new-color']);\n\nconst editorStore = useEditorStore();\nconst {\n  internalImageObj,\n  internalAnnotations,\n  sequences,\n  labels,\n} = storeToRefs(editorStore);\nonUnmounted(() => {\n  editorStore.$dispose();\n});\nlabels.value = props.initialLabels;\n\nconst {\n  jsonViewerShowTypes: showTypes,\n} = useAnnotationType();\n\nconst auzone_log_svg = ref(auzone_logo);\nconst imageModal = ref(null);\nconst annotationCanvas = ref(null);\nconst prevInternalAnnotations = ref(null);\nconst annotationSetToEdit = ref(null);\nconst selectedAnnotationIdentifiers = ref([]);\nconst bulkDeleteModal = ref(null);\n\nconst annotationDisplaySettings = ref({\n  displayAnnotationSets: { annotation_sets: initialAnnotationDisplaySettings.value.displayAnnotationSets.annotation_sets },\n  displayLabels: { labels: initialAnnotationDisplaySettings.value.displayLabels.labels },\n  colorAnnotationsBy: { type: initialAnnotationDisplaySettings.value.colorAnnotationsBy.type },\n});\nconst displayProjection = ref({\n  '3dbox': false,\n  lidar: false,\n  pcd: false,\n});\nconst annotationToolScale = ref(1);\nconst showAnnotations = ref(true);\nconst showMetadata = ref(false);\nconst showAnnotationInfo = ref(false);\nconst hoveredAnnotationListIdentifier = ref(null);\nconst activePane = ref(null);\nconst isMounted = ref(false);\nconst internalEditAsSequence = ref(true);\n\n// Draw mode\nconst drawMode = ref('pointer');\nconst drawCursorSize = ref(0);\nconst doneVertexDraw = ref(false);\n\n// SAM\nconst samOptions = ref({\n  enabled: false,\n  mode: null,\n  params: {\n    pointType: null,\n    clicks: [],\n    box: [],\n  },\n});\nconst hasSAMImageEmbedding = ref(false);\nconst hasSAMImageEmbeddingError = ref(false);\nfunction handleEnableSAMToggled(isEnabled) {\n  samOptions.value.enabled = isEnabled;\n}\nwatch(samOptions, (newSamOptions) => {\n  store.commit('annotationTool/toggleSAMEnabled', newSamOptions.enabled);\n}, { deep: true });\n\n// SAM2\nconst sam2Store = useSAM2Store();\nconst { $reset: resetSAM2 } = sam2Store;\nconst {\n  sam2Server,\n  sam2Options,\n  sam2Annotations,\n  aigt3dAnnotations,\n  aigt2dAnnotations,\n  sam2Active,\n} = storeToRefs(sam2Store);\nonMounted(() => {\n  resetSAM2();\n});\nonUnmounted(() => {\n  resetSAM2();\n});\nconst isSAM2Selected = computed(() => drawMode.value === 'sam2');\nwatch(isSAM2Selected, (_isSAM2Selected) => {\n  sam2Options.value.enabled = _isSAM2Selected;\n});\n\nconst initialEditingAnnotations = computed(() => {\n  const initialImageAnnotations = internalImageObj.value.annotations;\n  if (annotationSetToEdit.value && initialImageAnnotations) {\n    return filterAnnotationsBySet(JSON.parse(JSON.stringify(initialImageAnnotations)), [annotationSetToEdit.value.id]);\n  }\n  return [];\n});\n\nconst annotationIdentifierMap = computed(() => {\n  const newAnnotationIdentifierMap = {};\n  internalAnnotations.value.forEach((anno, i) => {\n    newAnnotationIdentifierMap[anno.id] = anno;\n  });\n  return newAnnotationIdentifierMap;\n});\n\n// Setup Tasks\nconst {\n  startTask,\n  currentTaskImage,\n  pendingTaskImages,\n  sourceDataset,\n  sourceAnnotationSet,\n  hasSourceAnnotationSet,\n  destinationAnnotationSet,\n  isAuditMode,\n  groups,\n  auditorType,\n  hasReviewTask,\n  setupTaskImages,\n  handleImageGroupChanged,\n  handleLabellingSubmitAnnotations,\n  acceptAllAnnotations,\n  activeImageIndex,\n  doneImages,\n  switchToTaskImage,\n  submitType,\n  handleAuditSubmitAllAnnotations,\n  handleAuditSubmitAcceptedAnnotations,\n  handleFrameAuditSubmitAllAnnotations,\n  handleFrameAuditSubmitAcceptedAnnotations,\n  skipTaskImage,\n  getTaskSequences,\n} = useTasks({ reviewSettings });\nstartTask();\n\n// Controls\nconst { selectedLabel, currentCanvasTool, current3DCanvasTool } = storeToRefs(useEditorControlsStore());\nonUnmounted(() => {\n  const { $reset } = useEditorControlsStore();\n  $reset();\n});\n\n// Create hotkeys\nconst canvasHotkeys = {\n  'Escape': () => {\n    if (activePane.value === 'canvas') {\n      selectedAnnotationIdentifiers.value = [];\n      drawMode.value = 'pointer';\n      nextTick(() => {\n        imageModal.value.focus();\n      });\n    } else if (activePane.value === '3d-canvas') {\n      selectedAnnotationIdentifiers.value = [];\n      selectedLabel.value = labels.value[0];\n      current3DCanvasTool.value = '3d-pointer';\n      nextTick(() => {\n        imageModal.value.focus();\n      });\n    }\n  },\n  'c': async () => {\n    if (!samOptions.value.enabled || !SAMImageEmbedding.value || !SAMSession.value) return;\n    await handleCreateSAMPolygon();\n    SAMEventBus.value.emit('reset');\n  },\n  'z': () => {\n    handleZKey();\n  },\n};\nconst canvas3DHotkeys = {\n  'q': () => { current3DCanvasTool.value = '3d-pointer'; },\n  'b': () => { current3DCanvasTool.value = '3d-box'; },\n  'l': () => { current3DCanvasTool.value = '3d-edit-label'; },\n  'g': () => { current3DCanvasTool.value = 'translate-object'; },\n  's': () => { current3DCanvasTool.value = 'scale-object'; },\n  'Escape': async () => {\n    selectedAnnotationIdentifiers.value = [];\n    selectedLabel.value = labels.value[0];\n    current3DCanvasTool.value = '3d-pointer';\n    nextTick(() => {\n      imageModal.value.focus();\n    });\n  },\n};\nconst toolHotkeys = ref({\n  ...canvasHotkeys,\n});\nconst auditHotkeys = ref({\n  'v': () => {\n    selectedAnnotations.value.forEach((anno) => {\n      anno.reviewStatus = 'verified';\n    });\n  },\n  'V': () => {\n    selectedAnnotations.value.forEach((anno) => {\n      anno.reviewStatus = 'unreviewed';\n    });\n  },\n  ' ': () => {\n    selectedAnnotations.value.forEach((anno) => {\n      if (anno.reviewStatus === 'verified') {\n        anno.reviewStatus = 'unreviewed';\n      } else {\n        anno.reviewStatus = 'verified';\n      }\n    });\n  },\n  'Enter': async () => {\n    if (submitType.value === 'submit-all-annotations') {\n      if (internalEditAsSequence.value && isSequence.value) {\n        handleFrameAuditSubmitAllAnnotations(displayImageObj.value);\n        currentAnimationSample.value.imageObj.annotations = internalAnnotations.value;\n        handleSequenceSubmit();\n      } else {\n        handleAuditSubmitAllAnnotations();\n      }\n    } else if (submitType.value === 'submit-accepted-annotations') {\n      if (internalEditAsSequence.value && isSequence.value) {\n        handleFrameAuditSubmitAcceptedAnnotations(displayImageObj.value);\n        currentAnimationSample.value.imageObj.annotations = internalAnnotations.value;\n        handleSequenceSubmit();\n      } else {\n        handleAuditSubmitAcceptedAnnotations();\n      }\n    }\n  },\n});\nconst drawToolHotKeys = ref({\n  'q': () => {\n    if (activePane.value === 'canvas') {\n      drawMode.value = 'pointer';\n    } else if (activePane.value === '3d-canvas') {\n      current3DCanvasTool.value = '3d-pointer';\n    }\n  },\n  'b': () => {\n    if (activePane.value === 'canvas') {\n      drawMode.value = \"box\";\n    } else if (activePane.value === '3d-canvas') {\n      current3DCanvasTool.value = '3d-box';\n    }\n  },\n  'a': () => {\n    if (activePane.value === 'canvas') {\n      drawMode.value = \"sam\";\n    }\n  },\n  'w': () => {\n    if (activePane.value === 'canvas') {\n      drawMode.value = \"brush\";\n    }\n  },\n  'l': () => {\n    if (activePane.value === 'canvas') {\n      drawMode.value = 'color';\n    } else if (activePane.value === '3d-canvas') {\n      current3DCanvasTool.value = '3d-edit-label';\n    }\n  },\n  'p': () => {\n    if (activePane.value === 'canvas') {\n      drawMode.value = 'line';\n    }\n  },\n  'e': () => {\n    if (activePane.value === 'canvas') {\n      if (selectedAnnotationIdentifiers.value.length === 1) {\n        drawMode.value = \"eraser\";\n      }\n    }\n  },\n  '=': () => {\n    if (activePane.value === 'canvas') {\n      if (drawCursorSize.value < (0.2 * imageDimensions.value.width)) {\n        drawCursorSize.value *= 1.3;\n      }\n    }\n  },\n  '-': () => {\n    if (activePane.value === 'canvas') {\n      if (drawCursorSize.value > (0.001 * imageDimensions.value.width)) {\n        drawCursorSize.value /= 1.3;\n      }\n    }\n  },\n});\n\nwatch(drawMode, () => {\n  if (drawMode.value !== \"line\") {\n    nextTick(() => { doneVertexDraw.value = true; });\n  } else {\n    nextTick(() => { doneVertexDraw.value = false; });\n  }\n  if (drawMode.value === \"sam\") {\n    selectedAnnotationIdentifiers.value = [];\n  }\n});\n\nfunction handleCursorSizeUpdated(v) {\n  drawCursorSize.value = v;\n}\n\nconst imageAuditHotkeys = ref({\n  'ArrowRight': async () => {\n    await skipTaskImage();\n  },\n});\nconst sequenceAuditHotkeys = ref({\n  'ArrowLeft': async () => {\n    animationControls.value.handleSkipPrevious();\n  },\n  'ArrowRight': async () => {\n    animationControls.value.handleSkipNext();\n  },\n});\nconst imageEditorHotkeys = computed(() => ({\n  'Delete': async () => {\n    if (selectedAnnotationIdentifiers.value.length > 0) {\n      const annotationsToDelete = selectedAnnotationIdentifiers.value.map((identifier) => annotationIdentifierMap.value[identifier]);\n      internalAnnotations.value = [...internalAnnotations.value.filter((anno) => !annotationsToDelete.includes(anno))];\n      selectedAnnotationIdentifiers.value = [];\n    }\n  },\n  'ctrl,c': () => {\n    handleCopyAnnotations();\n  },\n  'ctrl,v': () => {\n    handlePasteAnnotations();\n  },\n  'ctrl,x': () => {\n    handleDeleteAnnotationBulk();\n  },\n  ...auditHotkeys.value,\n  ...(internalEditAsSequence.value && isSequence.value ? sequenceAuditHotkeys.value : imageAuditHotkeys.value),\n  ...toolHotkeys.value,\n  ...drawToolHotKeys.value,\n}));\n\nconst {\n  areListenersActive,\n  activateListeners: activateImageAuditListeners,\n  deactivateListeners: deactivateImageAuditListeners,\n} = useAnnotationEditorModalHotkeys(imageEditorHotkeys);\nwatch(auditorType, (auditorTypeVal) => {\n  if (auditorTypeVal !== 'image') {\n    deactivateImageAuditListeners();\n  } else {\n    if (!areListenersActive.value) {\n      activateImageAuditListeners();\n    }\n  }\n\n  // Toggle showing the visualizations\n  if (auditorTypeVal === 'annotation') {\n    showLayouts.value = false;\n  } else {\n    nextTick(() => {\n      showLayouts.value = true;\n    });\n  }\n});\n\nconst imageDimensions = ref({});\n\n// const {\n//   activateListeners: activateImageViewerListeners,\n//   deactivateListeners: deactivateImageViewerListeners,\n// } = useImageViewerHotkeys(ctx);\n\nif (reviewSettings.value?.initialAuditorType === 'image') {\n  activateImageAuditListeners();\n}\n// else if (!isTask.value) {\n//   activateImageViewerListeners();\n// }\n\n// Zoom\nfunction handleZoomToFit() {\n  annotationCanvas.value.zoomToFitImage();\n}\nfunction handleZoomToSelection() {\n  annotationCanvas.value.zoomToSelection();\n}\nfunction handleZKey() {\n  if (selectedAnnotationIdentifiers.value.length > 0) {\n    annotationCanvas.value.zoomToSelection();\n  } else {\n    annotationCanvas.value.zoomToFitImage();\n  }\n}\nconst zoom = computed(() => roundNumber(annotationToolScale.value * 100, 0));\n\nfunction filterAnnotationsBySet(annotations, sets) {\n  if (sets) {\n    // should return all those with the current annotation set and those without\n    // the ones without annotation set are recently created\n    return annotations.filter((anno) => sets.includes(anno.annotation_set_id) || !anno.annotation_set_id);\n  }\n  return annotations;\n}\nfunction filterAnnotationsByLabelIndexes(annotations, labelIndexes) {\n  if (labelIndexes) {\n    return annotations.filter((anno) => labelIndexes.includes(anno.label_index));\n  }\n  return annotations;\n}\nfunction filterAnnotations(annotations) {\n  if (!annotations) {\n    return [];\n  }\n  const filteredAnnotations = JSON.parse(JSON.stringify(annotations));\n  return filteredAnnotations;\n}\n\n// Computed\nconst title = computed(() => (internalImageObj.value?.name ? internalImageObj.value.name : ''));\nconst subtitle = computed(() => (internalImageObj.value?.type === 'sequence' && internalImageObj.value?.uuid ? internalImageObj.value.uuid : ''));\nconst isVideo = computed(() => internalImageObj.value?.type === 'video');\nconst isSequence = computed(() => Boolean(internalImageObj.value?.sequence_id));\nconst colorBy = computed(() => annotationDisplaySettings.value?.colorAnnotationsBy?.type);\nconst displayImageObj = computed(() => {\n  if (internalEditAsSequence.value && isSequence.value && currentAnimationSample.value) {\n    return currentAnimationSample.value.imageObj;\n  }\n  return internalImageObj.value;\n});\nconst selectedAnnotations = computed(() => selectedAnnotationIdentifiers.value.map((identifier) => annotationIdentifierMap.value[identifier]));\nconst selectedAnnotationInfo = computed(() => {\n  if (selectedAnnotationIdentifiers.value.length > 0) {\n    return annotationIdentifierMap.value[selectedAnnotationIdentifiers.value[0]];\n  }\n  return null;\n});\nconst showPanes = computed(() => {\n  const showCanvasTypes = ['image', 'box', 'seg'];\n  const showDepthTypes = ['depthmap'];\n  return {\n    showCanvas: showCanvasTypes.some((key) => showTypes.value[key]),\n    showDepthMap: showDepthTypes.some((key) => showTypes.value[key]),\n  };\n});\n// const showPanesCount = computed(() => Object.values(showPanes.value).filter(Boolean).length);\nconst annotationSets = computed(() => sourceDataset.value.annotation_sets);\n\nconst groupedAnnotations = computed(() => {\n  if (internalEditAsSequence.value && isSequence.value && currentAnimationSample.value) {\n    // For animation\n    const groupedData = {};\n    topics.value.forEach((key) => {\n      groupedData[key] = [];\n    });\n\n    const totalAnnotations = [...internalAnnotations.value, ...Object.values(pendingAnnotations.value).flat()];\n    const filteredAnnotations = filterAnnotationsBySet(totalAnnotations, annotationDisplaySettings.value.displayAnnotationSets.annotation_sets);\n    filteredAnnotations.forEach((item) => {\n      const itemType = item.type;\n      if (!groupedData[itemType]) {\n        groupedData[itemType] = [];\n      }\n      groupedData[itemType].push(item);\n    });\n    return groupedData;\n  } else {\n    // For non-animation\n    if (!internalAnnotations.value) return {};\n\n    const groupedData = {};\n    const filteredAnnotations = filterAnnotationsBySet(internalAnnotations.value, annotationDisplaySettings.value.displayAnnotationSets.annotation_sets);\n    filteredAnnotations.forEach((item) => {\n      const itemType = item.type;\n      if (!groupedData[itemType]) {\n        groupedData[itemType] = [];\n      }\n      groupedData[itemType].push(item);\n    });\n    return groupedData;\n  }\n});\n\n// Watchers\n\nwatch(internalImageObj, async () => {\n  internalAnnotations.value = filterAnnotations(internalImageObj.value?.annotations);\n  nextTick(() => { prevInternalAnnotations.value = null; });\n\n  if (isSequence.value) {\n    topics.value = await getTopics();\n  }\n});\n\nwatch(internalAnnotations, (newAnnotations, prevAnnotations) => {\n  prevInternalAnnotations.value = JSON.parse(JSON.stringify(prevAnnotations || []));\n}, { deep: true });\n\nwatch(annotationSetToEdit, () => {\n  internalAnnotations.value = filterAnnotations(internalAnnotations.value);\n}, { deep: true });\n\nwatch(annotationDisplaySettings, () => {\n  internalAnnotations.value = filterAnnotations(internalAnnotations.value);\n}, { deep: true });\n\nwatch(imageDimensions, () => {\n  if (imageDimensions.value) {\n    drawCursorSize.value = 0.04 * imageDimensions.value.width;\n  }\n});\n\nwatch(showTypes, () => {\n  if (showTypes.value.pcd || showTypes.value['3dbox'] || showTypes.value.lidar) {\n    handleAddVisualization(\"3d-canvas\");\n  }\n  if (showTypes.value.depthmap) {\n    handleAddVisualization(\"depth-map\");\n  }\n}, { deep: true });\n\nonMounted(async () => {\n  selectedLabel.value = labels.value[0];\n\n  imageModal.value.showModal();\n  if (showPanes.value.showCanvas) {\n    activePane.value = 'canvas';\n  }\n\n  if (hasSourceAnnotationSet.value) {\n    annotationSetToEdit.value = sourceAnnotationSet.value;\n  } else {\n    annotationSetToEdit.value = destinationAnnotationSet.value;\n  }\n\n  // Initial SAM options\n  if (store.state.annotationTool && reviewSettings.value?.reviewTask.type === 'label') {\n    samOptions.value.enabled = store.state.annotationTool.samEnabled;\n  } else {\n    samOptions.value.enabled = false;\n  }\n\n  internalEditAsSequence.value = editAsSequence.value;\n\n  // Get all sequences for the dataset\n  if (hasReviewTask.value) {\n    sequences.value = await getTaskSequences();\n  }\n\n  // Setup image and annotations\n  await setupTaskImages();\n\n  isMounted.value = true;\n});\n\n// Methods\nasync function createNewInternalAnnotation(annotation) {\n  if (isAuditMode.value) {\n    annotation.reviewStatus = 'verified';\n  }\n\n  annotation.annotation_set_id = destinationAnnotationSet.value.id;\n\n  internalAnnotations.value = [...toRaw(internalAnnotations.value), annotation];\n}\n\nfunction handleTaskImageClicked(imageIndex) {\n  switchToTaskImage(imageIndex);\n  // if (isAuditMode.value) {\n  //   if (imageIndex >= 0) {\n  //     annotationSetToEdit.value = destinationAnnotationSet.value;\n  //   } else {\n  //     annotationSetToEdit.value = sourceAnnotationSet.value;\n  //   }\n  // }\n}\n\nfunction handleAnnotationBulkDeleteComplete() {\n  animationControls.value.handleClearCache();\n}\n\nfunction handleModalClosed() {\n  selectedAnnotationIdentifiers.value = [];\n  emit('closed');\n}\n\nfunction handleUndo() {\n  if (prevInternalAnnotations.value) {\n    internalAnnotations.value = JSON.parse(JSON.stringify(prevInternalAnnotations.value || []));\n    nextTick(() => { prevInternalAnnotations.value = null; });\n  }\n}\n\nfunction handleRevertChanges() {\n  if (currentAnimationSample.value) {\n    internalAnnotations.value = filterAnnotations(currentAnimationSample.value.imageObj?.annotations);\n  } else {\n    internalAnnotations.value = filterAnnotations(internalImageObj.value?.annotations);\n  }\n}\n\n// Copy and paste annotation\nconst copiedAnnotations = ref([]);\nfunction handleCopyAnnotations() {\n  copiedAnnotations.value = [...JSON.parse(JSON.stringify(selectedAnnotations.value)).map((item) => {\n    item.id = uuidv4();\n    item.reviewStatus = 'verified';\n    return item;\n  })];\n}\nfunction handlePasteAnnotations() {\n  internalAnnotations.value = [...internalAnnotations.value, ...copiedAnnotations.value];\n}\n\nfunction handleDeleteAnnotationBulk() {\n  bulkDeleteModal.value.showModal();\n}\n\nasync function handleAnnotationReviewItemEdit(annotation) {\n  const annotationIdentifier = Object.keys(annotationIdentifierMap.value).find((key) => annotationIdentifierMap.value[key] === annotation);\n  selectedAnnotationIdentifiers.value = [annotationIdentifier];\n  await nextTick();\n  annotationCanvas.value.zoomToSelection();\n}\n\nasync function handleSubmit() {\n  // Editing through labelling task\n  await handleLabellingSubmitAnnotations();\n}\n\nfunction handleSequenceSubmit() {\n  // Go to next frame\n  if (frame.value + 1 <= animationImageCache.value.length) {\n    frame.value += 1;\n  }\n}\n\n// function handleToggleTool() {\n//   if (hasSourceAnnotationSet.value) {\n//     if (auditorType.value === 'annotation') {\n//       auditorType.value = 'image';\n//     } else {\n//       auditorType.value = 'annotation';\n//     }\n//   }\n// }\n\nfunction handleHoveredAnnotation(identifier) {\n  hoveredAnnotationListIdentifier.value = identifier;\n}\n\nfunction handleDeleteAnnotationFromList(annotationToDelete) {\n  internalAnnotations.value = [...internalAnnotations.value.filter((anno) => anno.id !== annotationToDelete.id)];\n}\n\nfunction handlePaneClick(event, pane) {\n  activePane.value = pane;\n\n  if (pane === 'canvas') {\n    toolHotkeys.value = canvasHotkeys;\n  } else if (pane === '3d-canvas') {\n    toolHotkeys.value = canvas3DHotkeys;\n  }\n\n  if (pane === '3d-canvas' && current3DCanvasTool.value === '3d-box') {\n    event.stopPropagation();\n  }\n}\n\nfunction handleSelectedSequenceChanged(selectedSequence) {\n  currentTaskImage.value = selectedSequence;\n}\n\nfunction handleSelectAnnotationFromSidebar(anns) {\n  if (anns) {\n    selectedAnnotationIdentifiers.value = [anns.id];\n  }\n}\n\nfunction handleImageLoaded(dimensions) {\n  imageDimensions.value = dimensions;\n}\n\n// Visualizations\nconst animationControls = ref(null);\nconst {\n  currentAnimationSample,\n  keyframeAnnotations,\n  topics,\n  isInitializingAnimation,\n  frame,\n  frameCount,\n  animationImageCache,\n} = storeToRefs(useViewerVisualizationsStore());\nconst showLayouts = ref(true);\nif (auditorType.value === 'annotation') {\n  showLayouts.value = false;\n}\nonUnmounted(() => {\n  const { $reset } = useViewerVisualizationsStore();\n  $reset();\n});\nwatch(currentAnimationSample, () => {\n  if (currentAnimationSample.value) {\n    internalAnnotations.value = [\n      ...filterAnnotations(currentAnimationSample.value.imageObj?.annotations),\n      ...keyframeAnnotations.value,\n    ];\n  }\n}, { deep: true });\nconst isLoadingSample = computed(() => {\n  if (currentAnimationSample.value) {\n    return !currentAnimationSample.value.loaded;\n  } else if (internalEditAsSequence.value && isSequence.value) {\n    return true;\n  }\n  return false;\n});\nwatch(displayImageObj, () => {\n  if (drawMode.value === 'sam') {\n    drawMode.value = 'pointer';\n  }\n  nextTick(() => {\n    selectedAnnotationIdentifiers.value = [];\n    if (hasSourceAnnotationSet.value) {\n      if (displayImageObj.value?.review_status === \"Done\") {\n        annotationSetToEdit.value = destinationAnnotationSet.value;\n      } else {\n        annotationSetToEdit.value = sourceAnnotationSet.value;\n      }\n    } else {\n      annotationSetToEdit.value = destinationAnnotationSet.value;\n    }\n  });\n});\n\n// Setup all topics in sequence\nasync function getTopics() {\n  const dataConnect = new DatastoreConnect();\n  const topicsResp = await dataConnect.getDatasetTopics({ dataset_id: internalImageObj.value.dataset_id });\n  if (!topicsResp.result || topicsResp.error) {\n    return null;\n  }\n  return topicsResp.result;\n}\n\n// SAM\nconst {\n  SAMEventBus, handleCreateSAMPolygon, SAMImageEmbedding, SAMSession,\n} = useSAMCanvas();\n\nfunction handleAnnotationDeleteClicked(identifier) {\n  internalAnnotations.value = [...internalAnnotations.value.filter((anno) => anno.id !== identifier)];\n  selectedAnnotationIdentifiers.value = [];\n}\n\nconst {\n  handleAddVisualization,\n  handleVisualizationSelected,\n  handleVisualizationContainerDrop,\n  handleLayoutSelected,\n  visualizationLocations,\n  getLocationId,\n  layout,\n} = useVisualizationDisplays();\n\nasync function downloadImage() {\n  const url = `v3/enterprise/image/${displayImageObj.value.id}`;\n  const headers = new Headers({\n    'Authorization': `Bearer ${store.state.user.token}`,\n  });\n\n  try {\n    const response = await fetch(url, { headers });\n    if (!response.ok) {\n      throw new Error('Network response was not ok');\n    }\n    const blob = await response.blob();\n    const blobUrl = window.URL.createObjectURL(blob);\n\n    const link = document.createElement('a');\n    link.href = blobUrl;\n    link.download = displayImageObj.value.name || displayImageObj.value.id || 'download';\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n    window.URL.revokeObjectURL(blobUrl);\n  } catch (error) {\n    console.error('Error downloading the image:', error);\n  }\n}\n\nconst pendingAnnotations = computed(() => ({\n  'seg': [...sam2Annotations.value].filter((anno) => anno.image_id === displayImageObj.value?.id),\n  '3dbox': [...aigt3dAnnotations.value].filter((anno) => anno.image_id === displayImageObj.value?.id),\n  '2dbox': [...aigt2dAnnotations.value].filter((anno) => anno.image_id === displayImageObj.value?.id),\n}));\n\n</script>\n\n<style lang=\"scss\" scoped>\n.display {\n  display: flex;\n  flex-direction: row;\n  position: relative;\n  width: 100%;\n  height: 100%;\n  outline: none;\n  overflow: hidden;\n}\n\n.header {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: flex-end;\n  min-width: 0;\n  flex: 1 1 auto;\n}\n\n.image-title-description{\n  display: flex;\n  flex-direction: column;\n  text-align: left;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  min-width: 100px;\n  overflow: hidden;\n  flex: 1 1 fit-content;\n  max-width: fit-content;\n\n  .title {\n    font-size: 1rem;\n    font-weight: 600;\n  }\n  .subtitle {\n    font-size: 0.8rem;\n    font-weight: 500;\n  }\n}\n\n.visualization {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  position: relative;\n  min-width: 0;\n\n  &__horizontal-divider {\n    outline: solid 2px gray;\n    z-index: 2;\n  }\n\n  &__vertical-divider {\n    min-width: 3px;\n    max-width: 3px;\n    background: var(--color-primary-400);\n    z-index: 2;\n  }\n}\n\n.annotation-editor-modal {\n  &__sidebar {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    width: 300px;\n    min-width: 300px;\n    padding: 0;\n    z-index: 2;\n    @include themify() {\n      background: themed('color-white-100');\n    }\n\n    h3 {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      min-height: 40px;\n      padding: 4px 8px;\n      margin: 0;\n      text-align: left;\n      box-shadow: 0px 1px 3px grey;\n      @include themify() {\n        background: themed('color-white-900');\n      }\n    }\n  }\n}\n\n.annotation-tool {\n  display: flex;\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  flex: 1 1 auto;\n  min-height: 0;\n  @include themify() {\n    background: themed('image-background-fill');\n  }\n}\n\n.annotation-review-sidebar {\n  @include themify() {\n    background: themed('color-white-100');\n  }\n\n  &__buttons {\n    width: 100%;\n    padding: 0 16px;\n\n    button {\n      width: 100%;\n    }\n  }\n\n  &__annotations {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    width: 300px;\n    height: 100%;\n    overflow-y: auto;\n    scroll-snap-type: y mandatory;\n  }\n\n  &__snap-container {\n    scroll-snap-align: center;\n    min-height: calc(100% / 3);\n    align-items: center;\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    justify-content: center;\n    padding: 16px;\n\n    &._active {\n      background: rgb(0,0,0,0.125);\n    }\n  }\n}\n\n.modal-prepend-header {\n  &__logo {\n    min-width: 56px;\n    height: 36px;\n  }\n}\n\n.review-task-header {\n  display: flex;\n  flex-direction: row;\n  gap: 16px;\n  width: 100%;\n  justify-content: flex-end;\n}\n\n.review-task-header-info {\n  display: flex;\n  flex-direction: row;\n  gap: 16px;\n  flex: 1 1 auto;\n  min-width: 100px;\n  overflow-x: auto;\n  max-width: fit-content;\n}\n\n#no-image-remaining {\n  font-size: 1.5rem;\n  font-weight: 600;\n  color: var(--color-primary);\n}\n\n.image-group {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  padding: 8px;\n\n  &__label {\n    color: var(--body-text-color-secondary);\n    font-size: 0.75rem;\n    font-weight: 600;\n    letter-spacing: 0.05em;\n    text-transform: uppercase;\n    margin-bottom: 2px;\n  }\n}\n\n:deep(.v-expansion-panel-text__wrapper) {\n  padding: 8px 12px 16px;\n}\n:deep(.v-expansion-panel-title__overlay) {\n  pointer-events: none;\n}\n\n</style>\n","import script from \"./AnnotationEditorModal.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./AnnotationEditorModal.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./AnnotationEditorModal.vue?vue&type=style&index=0&id=6ef1e0cb&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6ef1e0cb\"]])\n\nexport default __exports__","import { defineStore } from 'pinia';\nimport { ref, watch, computed } from 'vue';\n\nexport const useDepthMapStore = defineStore('depth', () => {\n  const depthMapFile = ref(null);\n  const depthAnnotations = ref([]);\n  const enableDepthMap = ref(false);\n\n  function $reset() {\n    depthMapFile.value = ref(null);\n    depthAnnotations.value = ref([]);\n    enableDepthMap.value = false;\n  }\n\n  return {\n    depthMapFile,\n    enableDepthMap,\n    depthAnnotations,\n    $reset,\n  };\n});\n","import {\n  ref, computed, watch, onUnmounted,\n} from 'vue';\nimport { storeToRefs } from 'pinia';\nimport { useDepthMapStore } from '@/stores/useDepthMapStore.js';\n\nexport default function useDepthMap() {\n  const {\n    depthMapFile,\n    depthAnnotations,\n    enableDepthMap,\n  } = storeToRefs(useDepthMapStore());\n  const {\n    $reset,\n  } = useDepthMapStore();\n\n  onUnmounted(() => {\n    $reset();\n  });\n\n  function parseDepthMapFile(file) {\n    const array = [];\n\n    return array;\n  }\n\n  return {\n    depthMapFile,\n    enableDepthMap,\n    depthAnnotations,\n    parseDepthMapFile,\n  };\n}\n","import { render } from \"./AnnotationViewer.vue?vue&type=template&id=aa6aa4ec&scoped=true\"\nimport script from \"./AnnotationViewer.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationViewer.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationViewer.vue?vue&type=style&index=0&id=aa6aa4ec&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-aa6aa4ec\"]])\n\nexport default __exports__","<template>\n  <!-- <PageLoader\n    v-if=\"!loadingFinished\"\n    :width=\"'200px'\"\n    :height=\"'250px'\"\n    :text=\"'Fetching Data'\"\n  /> -->\n  <!-- <template v-else> -->\n  <div class=\"controls-bar\">\n    <span />\n    <button class=\"button button-sm\" @click=\"openCreateModal\">Create</button>\n  </div>\n  <div v-if=\"isFetching\" id=\"loading-visualization\"><div class=\"lds-ring\"><div /><div /><div /><div /></div></div>\n\n  <div v-else-if=\"!isFetching && notEmpty\" class=\"manager-card-container scrollbar\">\n    <DatasetCard\n      v-for=\"(d, i) in internalDatasetList\"\n      :key=\"i\"\n      :annotationSets=\"d.annotation_sets\"\n      :labels=\"d.labels\"\n      :dataset=\"d\"\n      :selected=\"d.id === currentDatasetID\"\n      class=\"list-card\"\n      @update:annotation-sets=\"(sets) => setDatasetAnnotationSets(d, sets)\"\n      @update:labels=\"(labels) => setDatasetLabels(d, labels)\"\n      @copy-annset=\"handleOpenAnnotationCopy(set, d)\"\n      @delete-dataset=\"openConfirmDeleteDatasetModal(d)\"\n      @copy-dataset=\"handleCopyDatasetClicked(d)\"\n      @clicked=\"handleSelectDataset(d)\"\n      @create-annset=\"handleCreateAnnotationSet(d)\"\n      @delete-annset=\"(params) => openConfirmDeleteAnnsetModal(params)\"\n      @create-label=\"handleCreateLabel(d)\"\n      @label-created=\"handleUpdateLabel(d)\"\n      @update-label=\"handleUpdateLabel(d)\"\n      @deleted-label=\"(label) => handleLabelDeletedEvent(label, d)\"\n      @open-dataset-access-management=\"handleOpenDatasetAccessManagement\"\n      @refresh=\"refreshDatasetCard(d)\"\n      @open-import=\"openImportModal(d)\"\n      @open-export=\"openExportModal(d)\"\n      @open-upload=\"openUploadModal(d)\"\n      @edit-dataset=\"openUpdateModal(d)\"\n      @freeze-dataset=\"(isFrozen) => handleToggleFreeze(d, isFrozen)\"\n      @import-annset=\"openImportAnnsetModal(d)\"\n      @create-groups=\"openCreateGroupsModal(d)\"\n      @delete-group=\"(group) => openConfirmDeleteGroupModal(group)\"\n      @to-gallery=\"handleNavigateToGallery(d)\"\n      @generate-token=\"handleOpenGenerateTokenModal(d)\"\n      @open-conf-matrix=\"(set) => handleOpenConfMatrix(d, set)\"\n      @open-description=\"(set) => handleUpdateAnnotationSet(d, set)\"\n      @park-dataset=\"handleParkDatasetEvent(d)\"\n      @unpark-dataset=\"handleUnparkDatasetEvent(d)\"\n      @add-snapshot=\"handleOpenAddSnapshotModal(d)\"\n      @dismiss-error=\"dismissError(d)\"\n      @generate-hash=\"(set) => generateHash(d, set)\"\n    />\n  </div>\n  <div\n    v-else\n    class=\"empty-state\"\n  >\n    <svg width=\"80%\" height=\"80%\">\n      <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n    </svg>\n    <div class=\"empty-state__message\">\n      <h2>No dataset to display.</h2>\n    </div>\n  </div>\n  <DatasetCreateModal\n    ref=\"createDatasetModal\"\n    @create-dataset=\"createDataset\"\n  />\n  <DatasetUpdateModal\n    ref=\"updateDatasetModal\"\n    :dataset=\"modalDataset\"\n    @edit-dataset=\"(params) => updateDataset(params, modalDataset)\"\n  />\n  <DatasetCopyModal\n    v-if=\"showCopyModal\"\n    ref=\"copyDatasetModal\"\n    v-model:show=\"showCopyModal\"\n    :datasets=\"internalDatasetList\"\n    :source=\"modalDataset\"\n    @copy-complete=\"(destDatasetID) => refreshDatasetCard(getDatasetWithID(destDatasetID))\"\n    @closed=\"modalDataset = null\"\n    @copy-in-progress=\"(dataset) => refreshDatasetCard(dataset)\"\n  />\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :note=\"confirmNote\"\n    :buttonClass=\"buttonClass\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n  <AnnSetCopyModal\n    ref=\"copyAnnSetModal\"\n    :datasets=\"internalDatasetList\"\n    :sourceDataset=\"copyAnnotationSetDataset\"\n    @clear-copy=\"clearCopyAnnset\"\n    @copy-complete=\"$emit('copy-complete')\"\n  />\n  <CreateAnnotationSetModal\n    ref=\"createAnnotationSetModal\"\n    :dataset=\"modalDataset\"\n    @annotation-set-created=\"handleAnnotationSetCreatedEvent(modalDataset)\"\n    @annotation-set-created-error=\"handleAnnotationSetCreatedErrorEvent\"\n  />\n  <UpdateAnnotationSetModal\n    ref=\"updateAnnotationSetModal\"\n    :annotationSet=\"modalAnnotationSet\"\n    @annotation-set-updated=\"handleAnnotationSetUpdatedEvent(modalDataset)\"\n  />\n  <CreateLabelsModal\n    ref=\"createLabelsModal\"\n    :dataset=\"modalDataset\"\n    @label-created=\"handleLabelCreatedEvent(modalDataset)\"\n  />\n  <ManageDatasetAccess\n    ref=\"manageDatasetAccessModal\"\n    :modalDataset=\"modalDataset\"\n    @refresh-datasets=\"handleAccessUpdated(modalDataset)\"\n  />\n  <DatasetExportModal\n    ref=\"datasetExportModal\"\n    :datasets=\"internalDatasetList\"\n    :exportDataset=\"impexDataset\"\n    @export-started=\"(data) => handleStartExport(impexDataset,data)\"\n  />\n  <UploadImagesModal\n    v-if=\"showUploadModal\"\n    ref=\"uploadImagesModal\"\n    v-model:show=\"showUploadModal\"\n    :datasetID=\"modalDataset ? modalDataset.id : null\"\n    :annotationSets=\"modalDataset ? modalDataset.annotation_sets : null\"\n    @refresh=\"refreshDatasetCard(modalDataset)\"\n    @upload-error=\"handleUploadError\"\n  />\n  <GenerateTokenModal\n    ref=\"generateTokenModal\"\n    :modalDataset=\"modalDataset\"\n  />\n  <CreateGroupsModal\n    ref=\"createGroupsModal\"\n    :dataset=\"modalDataset\"\n    @created-groups=\"refreshDatasetCard(modalDataset)\"\n  />\n  <ConfusionMatrixModal\n    ref=\"confusionMatrixModal\"\n  />\n  <SnapshotAddModal\n    ref=\"addSnapshotModal\"\n    :mode=\"'add'\"\n    :inputDataset=\"modalDataset\"\n    :inputProject=\"currentProject\"\n    :projects=\"projectList\"\n    @add-snapshot=\"refreshDatasetCard(modalDataset)\"\n  />\n</template>\n\n<script>\nimport ManageDatasetAccess from '@/components/DatasetComponent/DatasetManagement/ManageDatasetAccess.vue';\nimport CreateLabelsModal from '@/components/DatasetComponent/DatasetManagement/CreateLabelsModal.vue';\nimport DatasetCard from \"@/components/DatasetComponent/DatasetManagement/DatasetCard.vue\";\nimport DatasetCopyModal from \"@/components/DatasetComponent/DatasetManagement/DatasetCopyModal.vue\";\nimport DatasetCreateModal from \"@/components/DatasetComponent/DatasetManagement/DatasetCreateModal.vue\";\nimport DatasetUpdateModal from \"@/components/DatasetComponent/DatasetManagement/DatasetUpdateModal.vue\";\nimport AnnSetCopyModal from '@/components/DatasetComponent/DatasetManagement/AnnSetCopyModal.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport CreateAnnotationSetModal from '@/components/DatasetComponent/DatasetManagement/CreateAnnotationSetModal.vue';\nimport UpdateAnnotationSetModal from '@/components/DatasetComponent/DatasetManagement/UpdateAnnotationSetModal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport DatasetExportModal from '@/components/DatasetComponent/DatasetManagement/DatasetExportModal.vue';\nimport UploadImagesModal from '@/components/DatasetComponent/UploadImagesModal.vue';\nimport CreateGroupsModal from '@/components/DatasetComponent/DatasetManagement/CreateGroupsModal.vue';\nimport GenerateTokenModal from '@/components/DatasetComponent/DatasetManagement/GenerateAPITokenModal.vue';\nimport ConfusionMatrixModal from '@/components/DatasetComponent/DatasetManagement/ConfusionMatrixModal.vue';\nimport SnapshotAddModal from '@/components/Snapshots/SnapshotAddModal.vue';\nimport { toRaw } from 'vue';\n\nexport default {\n  name: 'DatasetManagement',\n  components: {\n    DatasetCard,\n    DatasetCopyModal,\n    DatasetCreateModal,\n    ConfirmModal,\n    AnnSetCopyModal,\n    CreateAnnotationSetModal,\n    UpdateAnnotationSetModal,\n    CreateLabelsModal,\n    ManageDatasetAccess,\n    DatasetExportModal,\n    DatasetUpdateModal,\n    UploadImagesModal,\n    CreateGroupsModal,\n    GenerateTokenModal,\n    ConfusionMatrixModal,\n    SnapshotAddModal,\n  },\n  emits: [\n    'create-dataset', 'copy-complete', 'delete-dataset', 'select-dataset', 'update:datasetList', 'edit-dataset',\n  ],\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      loadingFinished: true,\n      toDelete: null,\n      copyAnnotationSet: null,\n      copyAnnotationSetDataset: null,\n      confirmMessage: null,\n      confirmNote: null,\n      confirmMessageHeader: null,\n      buttonClass: \"button-delete\",\n      buttonText: \"\",\n      modalAnnotationSet: null,\n      modalDataset: null,\n      isImport: false,\n      isUpdate: false,\n      impexDataset: null,\n      confirmFunction: null,\n      datasetAccessList: [],\n      showUploadModal: false,\n      showCopyModal: false,\n      showSnapshotsModal: false,\n      controllers: [],\n      isFetching: false,\n      interval: null,\n    };\n  },\n  computed: {\n    notEmpty() {\n      return this.internalDatasetList && this.internalDatasetList.length > 0;\n    },\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n    currentDatasetID() {\n      return this.currentDataset ? this.currentDataset.id : 0;\n    },\n    internalDatasetList: {\n      get() {\n        return this.$store.state.datasets.datasetList;\n      },\n      set(value) {\n        this.$store.commit('datasets/setDatasetList', value);\n      },\n    },\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n  },\n  watch: {\n    async currentProject() {\n      await this.getDatasets();\n      // Asynchronously get annotation set counts\n      const promises = this.internalDatasetList.map((d) => this.getAnnotationSetsForDataset(d).then((refreshedAnnotationSets) => {\n        this.setDatasetAnnotationSets(d, refreshedAnnotationSets);\n      }));\n      await this.getDatasetsDetails();\n      await Promise.all(promises);\n    },\n  },\n  created() {\n    this.unsubscribe = this.$store.subscribe((mutation, state) => {\n      if (mutation.type === 'tasks/updateImportTaskStatus') {\n        if (mutation.payload.data.status === 'complete') {\n          const taskID = mutation.payload.taskID;\n          if (state.tasks.importTasks[taskID].dataset_id) {\n            this.refreshDatasetCard(this.getDatasetWithID(state.tasks.importTasks[taskID].dataset_id));\n          }\n        }\n      }\n      if (mutation.type === 'tasks/updateExportTaskStatus') {\n        const taskID = mutation.payload.taskID;\n        if (mutation.payload.data.status === 'complete') {\n          if (state.tasks.exportTasks[taskID].dataset_id) {\n            const dsID = state.tasks.exportTasks[taskID].dataset_id;\n            this.$store.commit('notifications/updateDatasetsNotifications', {\n              dataset_id: dsID,\n              key: 'downloads',\n              value: this.$store.state.notifications.datasets[dsID] ? this.$store.state.notifications.datasets[dsID]['downloads'] + 1 : 1,\n            });\n          }\n        }\n      }\n    });\n  },\n  unmounted() {\n    this.abortAllSignals();\n  },\n  beforeUnmount() {\n    this.stopStatusInterval();\n    this.unsubscribe();\n  },\n  async mounted() {\n    await this.getDatasets();\n    // Asynchronously get annotation set counts\n    const promises = this.internalDatasetList.map((d) => this.getAnnotationSetsForDataset(d).then((refreshedAnnotationSets) => {\n      this.setDatasetAnnotationSets(d, refreshedAnnotationSets);\n    }));\n    await this.getDatasetsDetails();\n    await Promise.all(promises);\n    this.startStatusInterval();\n  },\n  methods: {\n    setDatasetAnnotationSets(d, sets) {\n      const index = this.getDatasetIndex(d);\n      this.$store.commit('datasets/setDatasetAnnotationSets', { index, sets });\n    },\n    setDatasetLabels(d, labels) {\n      const index = this.getDatasetIndex(d);\n      this.$store.commit('datasets/setDatasetLabels', { index, labels });\n    },\n    setDataset(dataset) {\n      const index = this.getDatasetIndex(dataset);\n      this.$store.commit('datasets/setDataset', { index, dataset });\n    },\n    async getDatasetsDetails() {\n      const currentProject = this.$store.state.projects.currentProject;\n      if (currentProject) {\n        const params = {\n          project_id: currentProject.id,\n          get_num_images: true,\n          get_labels: true,\n          get_num_labels: true,\n          get_annotation_sets: true,\n          get_groups: true,\n          get_parked: true,\n          get_docker_tasks: true,\n        };\n        await this.dataConnect.getDatasetList(params)\n          .then((resp) => {\n            if (!resp.error) {\n              const temp = resp.result;\n\n              const shallowDatasets = JSON.parse(JSON.stringify(this.internalDatasetList));\n              shallowDatasets.forEach((e, i) => {\n                temp[i].annotation_sets?.forEach((set, j) => {\n                  temp[i].annotation_sets[j].num_images = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_images : 0;\n                  temp[i].annotation_sets[j].num_annotations = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_annotations : 0;\n                });\n                shallowDatasets[i].annotation_sets = temp[i].annotation_sets;\n                shallowDatasets[i].numImages = temp[i].numImages ? temp[i].numImages : 0;\n                shallowDatasets[i].labels = temp[i].labels ? temp[i].labels : [];\n                shallowDatasets[i].numLabels = temp[i].numLabels ? temp[i].numLabels : 0;\n                shallowDatasets[i].groups = temp[i].groups ? temp[i].groups : [];\n              });\n\n              this.internalDatasetList = shallowDatasets;\n            }\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      }\n    },\n    async getDatasets() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          get_parked: true,\n          get_docker_tasks: true,\n        };\n        this.isFetching = true;\n        await this.dataConnect.getDatasetList(params)\n          .then((resp) => {\n            if (resp.error) {\n              this.internalDatasetList = [];\n              this.isFetching = false;\n            } else {\n              let temp = resp.result;\n              temp = temp.map((e) => {\n                e.annotation_sets = [];\n                e.numImages = null;\n                e.labels = null;\n                e.numLabels = null;\n                e.groups = null;\n                return e;\n              });\n\n              this.internalDatasetList = temp;\n\n              if (this.modalDataset) {\n                const ds = this.internalDatasetList.find((e) => e.id === this.modalDataset.id);\n                if (ds) {\n                  this.modalDataset = ds;\n                }\n              }\n              this.isFetching = false;\n            }\n          })\n          .catch((error) => {\n          // TODO: handle error\n            this.isFetching = false;\n            console.log(error);\n          });\n      } else {\n        this.internalDatasetList = [];\n      }\n    },\n    handleOpenAnnotationCopy(set, d) {\n      this.copyAnnotationSet = set;\n      this.copyAnnotationSetDataset = d;\n      this.openCopyAnnSetModal();\n    },\n    handleSelectDataset(d) {\n      this.$store.commit('datasets/setCurrentDataset', d);\n    },\n    openConfirmDeleteDatasetModal(d) {\n      this.confirmMessage = `Are you sure you want to move dataset \"${d.name}\" to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Dataset';\n      this.buttonText = \"Delete\";\n      this.buttonClass = \"button-delete\";\n      this.toDelete = d;\n      this.confirmFunction = () => this.deleteDataset();\n      this.$refs.confirmModal.showModal();\n    },\n    async deleteDataset() {\n      const param = {\n        name: this.toDelete.name,\n        id: this.toDelete.id,\n      };\n      await this.dataConnect.deleteDataset(param)\n        .then(() => {\n          const dsList = [...this.internalDatasetList];\n          const toRemove = this.internalDatasetList.find((e) => e.id === this.toDelete.id);\n          dsList.splice(dsList.indexOf(toRemove), 1);\n          this.internalDatasetList = dsList;\n        })\n        .catch((err) => {\n          console.log(err);\n        });\n      this.toDelete = null;\n    },\n    openConfirmDeleteAnnsetModal(s) {\n      this.confirmMessage = `Are you sure you want to move annotation set \"${s.name}\" to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Annotation Set';\n      this.buttonText = \"Remove\";\n      this.buttonClass = \"button-delete\";\n      this.toDelete = s;\n      this.confirmFunction = () => this.deleteAnnset();\n      this.$refs.confirmModal.showModal();\n    },\n    async deleteAnnset() {\n      await this.dataConnect.deleteAnnotationSet({ annotation_set_id: this.toDelete.id })\n        .then((data) => {\n          if (!data.error) {\n            const d = this.internalDatasetList.find((e) => e.id === this.toDelete.dataset_id);\n            this.handleAnnotationSetDeletedEvent(d);\n\n            this.toDelete = null;\n          }\n        })\n        .catch((error) => {\n          console.log('Failed to retrieve sets:', error);\n        });\n    },\n    openConfirmDeleteGroupModal(group) {\n      this.confirmMessage = `Are you sure you want to delete group with name \"${group.name}\"?`;\n      this.confirmMessageHeader = 'Delete Group';\n      this.buttonText = \"Delete\";\n      this.buttonClass = \"button-delete\";\n      this.toDelete = group;\n      this.confirmFunction = () => this.deleteGroup();\n      this.$refs.confirmModal.showModal();\n    },\n    async deleteGroup() {\n      await this.dataConnect.deleteGroup({ group_id: this.toDelete.id })\n        .then((data) => {\n          if (!data.error) {\n            const d = this.internalDatasetList.find((e) => e.id === this.toDelete.dataset_id);\n            this.modalDataset = null;\n            this.refreshDatasetCard(d);\n\n            this.toDelete = null;\n          }\n        })\n        .catch((error) => {\n          console.log('Failed to retrieve sets:', error);\n        });\n    },\n    openCreateModal() {\n      this.$refs.createDatasetModal.showModal();\n    },\n    openUpdateModal(d) {\n      this.modalDataset = d;\n      this.$refs.updateDatasetModal.showModal();\n    },\n    closeCreateModal() {\n      this.$refs.createDatasetModal.closeModal();\n    },\n    closeUpdateModal() {\n      this.modalDataset = null;\n      this.$refs.updateDatasetModal.closeModal();\n    },\n    openExportModal(d) {\n      this.impexDataset = d;\n      this.$nextTick(() => {\n        this.$refs.datasetExportModal.showModal();\n      });\n    },\n    openUploadModal(d) {\n      this.modalDataset = d;\n      this.showUploadModal = true;\n    },\n    openSnapshotsModal(d) {\n      this.modalDataset = d;\n      this.showSnapshotsModal = true;\n    },\n    openImportAnnsetModal(d) {\n      this.modalDataset = d;\n      this.$refs.importAnnsetModal.showModal();\n    },\n    handleStartExport(d, task) {\n      if (task) {\n        this.$store.commit('tasks/addExportTask', {\n          taskID: task.id, docker_task_id: task.id, type: task.name, dataset_id: d.id,\n        });\n      }\n    },\n    closeExportModal() {\n      this.$refs.datasetExportModal.closeModal();\n    },\n    async updateDataset(params, d) {\n      await this.dataConnect.updateDataset(params)\n        .then((data) => {\n          if (data.result) {\n            this.refreshDatasetCard(d);\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n    handleCopyDatasetClicked(d) {\n      this.modalDataset = d;\n      this.showCopyModal = true;\n    },\n    clearCopyAnnset() {\n      this.copyAnnotationSetDataset = null;\n    },\n    async handleCopyAnnSetCompleted() {\n      await this.refreshDatasetInfo(this.copyAnnotationSetDataset);\n    },\n    handleCreateAnnotationSet(dataset) {\n      this.modalDataset = dataset;\n      this.$nextTick(() => {\n        this.$refs.createAnnotationSetModal.showModal();\n      });\n    },\n    handleUpdateAnnotationSet(dataset, annset) {\n      this.modalDataset = dataset;\n      this.modalAnnotationSet = annset;\n      this.$nextTick(() => {\n        this.$refs.updateAnnotationSetModal.showModal();\n      });\n    },\n    async handleAnnotationSetCreatedEvent(dataset) {\n      this.modalDataset = null;\n      await this.refreshDatasetCard(dataset);\n    },\n    async handleAnnotationSetUpdatedEvent(dataset) {\n      this.modalDataset = null;\n      this.modalAnnotationSet = null;\n      await this.refreshDatasetCard(dataset);\n    },\n    async handleAnnotationSetCreatedErrorEvent(error) {\n      if (error.message.includes(\"limit reached\")) {\n        this.confirmMessage = `Not enough credits to perform this operation.`;\n        this.confirmMessageHeader = 'Insufficient Credits';\n        this.buttonText = \"\";\n        this.$refs.confirmModal.showModal();\n      }\n    },\n    async handleAnnotationSetDeletedEvent(dataset) {\n      this.modalDataset = null;\n      await this.refreshDatasetCard(dataset);\n    },\n    handleCreateLabel(dataset) {\n      this.modalDataset = dataset;\n      this.$nextTick(() => {\n        this.$refs.createLabelsModal.showModal();\n      });\n    },\n    handleUpdateLabel(dataset) {\n      this.refreshLabels(dataset);\n    },\n    async handleLabelCreatedEvent(dataset) {\n      this.modalDataset = null;\n      await this.refreshDatasetCard(dataset);\n    },\n    async handleLabelDeletedEvent(label, dataset) {\n      this.confirmMessage = `Are you sure you want to delete label '${label.name}'. All annotations with this label name will be deleted.`;\n      this.confirmNote = `Only use this feature if you have no annotations with this label name, or you want to remove all annotations with this label name.`;\n      this.confirmMessageHeader = 'Delete Label';\n      this.buttonText = \"Confirm\";\n      this.buttonClass = \"\";\n      this.confirmFunction = async () => {\n        await this.dataConnect.deleteLabel({ label_id: label.id })\n          .then(async () => {\n            await this.refreshDatasetCard(dataset);\n          })\n          .catch((error) => {\n            console.log('Failed to delete label:', error);\n          });\n      };\n\n      this.$refs.confirmModal.showModal();\n    },\n    async refreshDatasetCard(d) {\n      await this.refreshDatasetInfo(d);\n      this.refreshAnnotationSets(d);\n      this.refreshLabels(d);\n    },\n    async refreshDatasetInfo(d) {\n      const newDatasetInfo = await this.getDatasetInfo(d);\n      this.setDataset(newDatasetInfo);\n    },\n    async refreshAnnotationSets(d) {\n      const refreshedAnnotationSets = await this.getAnnotationSetsForDataset(d);\n      this.setDatasetAnnotationSets(d, refreshedAnnotationSets);\n    },\n    async refreshLabels(d) {\n      const refreshedLabels = await this.getLabelListForDataset(d);\n      this.setDatasetLabels(d, refreshedLabels);\n    },\n    openCopyAnnSetModal() {\n      this.$refs.copyAnnSetModal.showModal();\n    },\n    async getDatasetInfo(dataset) {\n      const resp = await this.dataConnect.getDatasetById({\n        dataset_id: dataset.id,\n        get_num_images: true,\n        get_num_labels: true,\n        get_num_annotations: true,\n        get_groups: true,\n        get_docker_tasks: true,\n      })\n        .catch((error) => {\n          console.log('Failed to retrieve dataset:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return null;\n      }\n      return resp.result;\n    },\n    async getAnnotationSetsForDataset(dataset) {\n      const controller = new AbortController();\n      this.controllers.push(controller);\n\n      const resp = await this.dataConnect.getAnnotationSets({\n        dataset_id: dataset.id,\n        get_num_annotations: true,\n        get_num_images: true,\n        get_labels: true,\n      }, controller.signal)\n        .catch((error) => {\n          console.log('Failed to retrieve sets:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async getLabelListForDataset(dataset) {\n      const resp = await this.dataConnect.getLabelList({ dataset_id: dataset.id })\n        .catch((error) => {\n          console.log('Failed to retrieve labels:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    getDatasetIndex(dataset) {\n      return this.internalDatasetList.indexOf(this.internalDatasetList.find((d) => d.id === dataset.id));\n    },\n    getDatasetWithID(datasetID) {\n      return this.internalDatasetList.find((d) => d.id === datasetID);\n    },\n    handleOpenDatasetAccessManagement(dataset) {\n      this.modalDataset = dataset;\n      this.$nextTick(() => {\n        this.$refs.manageDatasetAccessModal.showModal();\n      });\n    },\n    async handleAccessUpdated(d) {\n      await this.refreshDatasetInfo(d)\n        .then(() => {\n          if (this.modalDataset) {\n            const ds = this.internalDatasetList.find((e) => e.id === this.modalDataset.id);\n            if (ds) {\n              this.modalDataset = ds;\n            }\n          }\n        });\n      this.refreshAnnotationSets(d);\n      this.refreshLabels(d);\n    },\n    async getExportList() {\n      await this.dataConnect.getExportList()\n        .catch((error) => {\n          console.log('Failed to retrieve sets:', error);\n        });\n    },\n    async handleCancelDockerTask(dataset, taskID) {\n      await this.dataConnect.deleteDockerTask({ docker_task_id: taskID })\n        .then(async (data) => {\n          if (data.result) {\n            await this.refreshDatasetInfo(dataset);\n          }\n        });\n    },\n    async createDataset(params) {\n      this.closeCreateModal();\n      const updatedParams = {\n        ...params,\n        project_id: this.currentProject.id,\n      };\n      const createDatasetResp = await this.dataConnect.createDataset(updatedParams)\n        .catch((error) => {\n          console.log(error);\n        });\n      if (!createDatasetResp || createDatasetResp.error || !createDatasetResp.result) {\n        if (createDatasetResp.error.message.includes(\"limit reached\")) {\n          this.confirmMessage = `You haved reached the limit for number of datasets. Delete unused datasets or upgrade your package.`;\n          this.confirmMessageHeader = 'Limit Reached';\n          this.buttonText = \"\";\n          this.$refs.confirmModal.showModal();\n        } else if (createDatasetResp.error.message !== \"\") {\n          this.confirmMessage = createDatasetResp.error.message.charAt(0).toUpperCase() + createDatasetResp.error.message.slice(1);\n          this.confirmMessageHeader = 'Error';\n          this.buttonText = \"\";\n        }\n        return;\n      }\n\n      const dsList = [...this.internalDatasetList];\n      createDatasetResp.result.groups = [];\n      dsList.unshift(createDatasetResp.result);\n      this.internalDatasetList = dsList;\n\n      // Create owner dataset access for newly created dataset\n      // await this.dataConnect.addDatasetAccess({\n      //   username: this.$store.state.user.user.username,\n      //   dataset_id: createDatasetResp.result.id,\n      //   role: 'owner',\n      // })\n      //   .then(() => {\n      //     const dsList = [...this.internalDatasetList];\n      //     dsList.unshift(createDatasetResp.result);\n      //     this.internalDatasetList = dsList;\n      //   })\n      //   .catch((error) => {\n      //     console.log(error);\n      //   });\n    },\n    async handleToggleFreeze(d, isFrozen) {\n      await this.dataConnect.freezeDataset({\n        dataset_id: d.id,\n        is_frozen: isFrozen,\n      })\n        .then(async (data) => {\n          if (data.result) {\n            await this.refreshDatasetCard(d);\n          }\n        });\n    },\n    async handleUploadError(data) {\n      this.confirmMessage = data.confirmMessage;\n      this.confirmMessageHeader = data.confirmMessageHeader;\n      this.buttonText = \"\";\n      this.$refs.confirmModal.showModal();\n    },\n    openCreateGroupsModal(d) {\n      this.modalDataset = d;\n      this.$refs.createGroupsModal.showModal();\n    },\n    async handleNavigateToGallery(d) {\n      this.handleSelectDataset(d);\n      await this.$nextTick();\n      this.$router.push({ path: '/datasets/gallery/main' });\n    },\n    handleOpenGenerateTokenModal(d) {\n      this.modalDataset = d;\n      this.$refs.generateTokenModal.showModal();\n    },\n    handleOpenConfMatrix(d, set) {\n      this.handleSelectDataset(d);\n      this.$store.commit('datasets/setConfMatrixTargetSet', set);\n      this.$refs.confusionMatrixModal.showModal();\n    },\n    handleParkDatasetEvent(d) {\n      this.confirmMessage = `Are you sure you want to park dataset '${d.name}'. This would prevent any action to this dataset, including viewing or training. Parked images are charged at half the original image storage cost`;\n      this.confirmNote = `Reactivating the parked dataset in less than 3 days will incur a fee (Total cost is equal to original image storage cost).`;\n      this.confirmMessageHeader = 'Park Dataset';\n      this.buttonText = \"Confirm\";\n      this.buttonClass = \"\";\n      this.confirmFunction = () => this.parkDataset(d);\n      this.$refs.confirmModal.showModal();\n    },\n    async parkDataset(d) {\n      await this.dataConnect.parkDataset({\n        dataset_id: d.id,\n      })\n        .then((data) => {\n          if (!data.error) {\n            this.refreshDatasetCard(d);\n          }\n          this.$store.commit('notifications/updateNotifications', true);\n        })\n        .catch((e) => console.log(e));\n    },\n    handleUnparkDatasetEvent(d) {\n      const dateDiff = Number(Math.abs(new Date() - new Date(d.parked_at)) / 8.64e7).toFixed(2);\n      this.confirmMessage = `Are you sure you want to activate dataset '${d.name}'? This will resume activities for this dataset. All images are charged at the original image storage cost.`;\n      if (dateDiff <= 3.0) {\n        this.confirmNote = `Duration: ${dateDiff} days. Reactivating this dataset now will incur a fee for every day of parked storage at half the original image storage cost.`;\n      } else {\n        this.confirmNote = null;\n      }\n      this.confirmMessageHeader = 'Activate Dataset';\n      this.buttonText = \"Confirm\";\n      this.buttonClass = \"\";\n      this.confirmFunction = () => this.unparkDataset(d);\n      this.$refs.confirmModal.showModal();\n    },\n    async unparkDataset(d) {\n      await this.dataConnect.unparkDataset({\n        dataset_id: d.id,\n      })\n        .then((data) => {\n          if (!data.error) {\n            this.refreshDatasetCard(d);\n          }\n\n          this.$store.commit('notifications/updateNotifications', true);\n        })\n        .catch((e) => console.log(e));\n    },\n    abortAllSignals() {\n      this.controllers.forEach((controller) => {\n        controller.abort();\n      });\n    },\n    refreshPage() {\n      this.getDatasets();\n      this.getDatasetsDetails();\n    },\n    handleOpenAddSnapshotModal(d) {\n      this.modalDataset = d;\n      this.$refs.addSnapshotModal.showModal();\n    },\n    async startStatusInterval() {\n      function sleep(time) {\n        return new Promise((resolve) => {\n          setTimeout(resolve, time);\n        });\n      }\n      await sleep(5000);\n      this.interval = setInterval(\n        () => {\n          this.internalDatasetList.forEach((dataset) => {\n            if (dataset.docker_task_id && dataset.docker_task) {\n              if (!dataset.docker_task.status.toLowerCase().includes('complete')\n                  && !dataset.docker_task.status.toLowerCase().includes('error')\n                  && !dataset.docker_task.status.toLowerCase().includes('terminate')) {\n                this.refreshDatasetCard(dataset);\n              }\n            }\n          });\n        },\n        5000,\n      );\n    },\n    stopStatusInterval() {\n      clearInterval(this.interval);\n    },\n    async dismissError(d) {\n      await this.dataConnect.updateDataset({ dataset_id: d.id, docker_task_id: null })\n        .then((data) => {\n          if (data.result) {\n            this.refreshDatasetCard(d);\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n    async generateHash(d, set) {\n      await this.dataConnect.GetDatasetAnnotationsHash({ dataset_id: d.id, annotation_set_id: set.id })\n        .then((data) => {\n          if (data.result && !data.error) {\n            const annotationSets = structuredClone(toRaw(d.annotation_sets));\n            const index = annotationSets.findIndex((item) => item.id === set.id);\n            if (index > -1) {\n              annotationSets[index].hashed_id = data.result;\n              this.setDatasetAnnotationSets(d, annotationSets);\n            }\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n.manager-card-container {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(370px, 1fr));\n  grid-auto-rows: 470px;\n  width: 100%;\n  gap: 16px;\n  padding: 16px;\n  overflow-y: auto;\n  flex: 1 1 auto;\n}\n\n.list-card {\n  height: 100%;\n  width: 100%;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n#loading-visualization {\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: 100%;\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 100;\n  background: transparent;\n}\n\n.lds-ring {\n  /* change color here */\n  color: var(--color-primary);\n}\n.lds-ring,\n.lds-ring div {\n  box-sizing: border-box;\n}\n.lds-ring {\n  display: inline-block;\n  position: relative;\n  width: 80px;\n  height: 80px;\n}\n\n.lds-ring div {\n  box-sizing: border-box;\n  display: block;\n  position: absolute;\n  width: 64px;\n  height: 64px;\n  margin: 8px;\n  border: 8px solid currentColor;\n  border-radius: 50%;\n  animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n  border-color: currentColor transparent transparent transparent;\n}\n.lds-ring div:nth-child(1) {\n  animation-delay: -0.45s;\n}\n.lds-ring div:nth-child(2) {\n  animation-delay: -0.3s;\n}\n.lds-ring div:nth-child(3) {\n  animation-delay: -0.15s;\n}\n@keyframes lds-ring {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n</style>\n","<template>\n  <Modal\n    ref=\"datasetAccessModal\"\n    :title=\"modalDataset ? modalDataset.name : 'Manage Dataset Access'\"\n    :width=\"'700px'\"\n    @closed=\"resetData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div v-if=\"shareMode === 'custom'\" class=\"row mt-2\">\n          <div class=\"header-buttons\">\n            <button\n              class=\"button button-back\"\n              aria-label=\"Back\"\n              :title=\"'Back'\"\n              :class=\"{ 'invisible' : mode !== 'new' }\"\n              @click=\"() => mode = 'users'\"\n            >\n              <SVGIcon\n                class=\"me-1\"\n                :iconName=\"'chevron_left'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Back</span>\n            </button>\n            <button\n              class=\"button button-mode\"\n              aria-label=\"Add Users\"\n              :title=\"'Add New Users'\"\n              :class=\"{ 'invisible' : mode !== 'users' }\"\n              @click=\"() => mode = 'new'\"\n            >\n              <SVGIcon\n                class=\"me-1\"\n                :iconName=\"'person_add'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Add Users</span>\n            </button>\n          </div>\n        </div>\n        <div v-if=\"mode === 'users'\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"label required\">Access Sharing</label>\n            <div class=\"value permission-list\">\n              <div class=\"role-grid-single-row\">\n                <v-radio-group\n                  v-model=\"shareMode\"\n                  :density=\"'compact'\"\n                  :hide-details=\"true\"\n                >\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"default\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Project sharing</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Use sharing permissions from parent project.</span>\n                  </div>\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"custom\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Custom sharing</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Share this dataset with selected members, using custom permissions.</span>\n                  </div>\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"private\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Private</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Only you can access this dataset.</span>\n                  </div>\n                </v-radio-group>\n              </div>\n            </div>\n          </div>\n        </div>\n        <template v-if=\"mode === 'users'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Users with access to this dataset</label>\n              <ul class=\"mt-1 users scrollbar\">\n                <li\n                  v-for=\"(user, index) in accessListByType\"\n                  :key=\"index\"\n                  class=\"users__list-item\"\n                >\n                  <div class=\"users__container\" :class=\"{ 'slashed': remove.indexOf(user.username) > -1 }\">\n                    <div class=\"users__icon\">\n                      <UserIcon\n                        v-if=\"user.username\"\n                        :user=\"user\"\n                        :size=\"'32px'\"\n                      />\n                    </div>\n                    <div class=\"users__content\">\n                      <span class=\"users__username\">{{ user.first_name && user.last_name ? `${user.first_name} ${user.last_name}` : user.username }}</span>\n                      <span class=\"users__email\">{{ user.email }}</span>\n                    </div>\n                    <template v-if=\"(user.username === currentUser.username ) || shareMode==='default'\">\n                      <div class=\"users__role\">\n                        <template v-if=\"user.dataset_read && !user.dataset_write && !user.annotator_write\">\n                          <SVGIcon\n                            :iconName=\"'visibility'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Viewer</span>\n                        </template>\n                        <template v-else-if=\"user.dataset_write\">\n                          <SVGIcon\n                            :iconName=\"'edit'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Editor</span>\n                        </template>\n                        <template v-else-if=\"user.dataset_read && !user.dataset_write && (user.annotator_read && user.annotator_write)\">\n                          <SVGIcon\n                            :iconName=\"'tag'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Auditor</span>\n                        </template>\n                        <template v-else>\n                          <span>No Access</span>\n                        </template>\n                      </div>\n                    </template>\n                    <template v-else>\n                      <BaseMenu\n                        :placement=\"'bottom-end'\"\n                        :appendToBody=\"true\"\n                      >\n                        <div class=\"users__role editable\">\n                          <template v-if=\"user.dataset_read && !user.dataset_write && !user.annotator_write\">\n                            <SVGIcon\n                              :iconName=\"'visibility'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Viewer</span>\n                          </template>\n                          <template v-else-if=\"user.dataset_write\">\n                            <SVGIcon\n                              :iconName=\"'edit'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Editor</span>\n                          </template>\n                          <template v-else-if=\"user.dataset_read && !user.dataset_writed && (user.annotator_read && user.annotator_write)\">\n                            <SVGIcon\n                              :iconName=\"'tag'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Auditor</span>\n                          </template>\n                          <template v-else>\n                            <span>No Access</span>\n                          </template>\n                          <SVGIcon\n                            :iconName=\"'chevron_left'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"dropdown-role\"\n                          />\n                        </div>\n                        <template #menu=\"{closeMenu}\">\n                          <ul>\n                            <li>\n                              <BaseMenuButton @click=\"selectAccess(user, 'viewer'), closeMenu()\">\n                                <SVGIcon\n                                  :iconName=\"'visibility'\"\n                                  :width=\"'22px'\"\n                                  :height=\"'22px'\"\n                                />\n                                <span>Viewer</span>\n                              </BaseMenuButton>\n                            </li>\n                            <li>\n                              <BaseMenuButton @click=\"selectAccess(user, 'editor'), closeMenu()\">\n                                <SVGIcon\n                                  :iconName=\"'edit'\"\n                                  :width=\"'22px'\"\n                                  :height=\"'22px'\"\n                                />\n                                <span>Editor</span>\n                              </BaseMenuButton>\n                            </li>\n                          </ul>\n                          <hr>\n                          <ul>\n                            <li>\n                              <BaseMenuButton class=\"_danger\" @click.stop=\"toggleRemoveAccess(user.username), closeMenu()\">\n                                <template v-if=\"remove.indexOf(user.username) > -1\">\n                                  <SVGIcon\n                                    :iconName=\"'close'\"\n                                    :width=\"'22px'\"\n                                    :height=\"'22px'\"\n                                  />\n                                  <span>Cancel</span>\n                                </template>\n                                <template v-else>\n                                  <SVGIcon\n                                    :iconName=\"'trash'\"\n                                    :width=\"'22px'\"\n                                    :height=\"'22px'\"\n                                  />\n                                  <span>Remove Access</span>\n                                </template>\n                              </BaseMenuButton>\n                            </li>\n                          </ul>\n                        </template>\n                      </BaseMenu>\n                    </template>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </template>\n        <template v-else-if=\"mode === 'new'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Add users by name or e-mail</label>\n            </div>\n          </div>\n          <div class=\"row\">\n            <v-combobox\n              v-model=\"userInputValue\"\n              class=\"combobox\"\n              chips\n              clearable\n              multiple\n              :density=\"'comfortable'\"\n              :hide-details=\"true\"\n              :label=\"'Add People'\"\n              :items=\"formatOrgUserListObject\"\n              :item-title=\"(obj) => obj['username']\"\n              :item-value=\"(obj) => obj['username']\"\n              :return-object=\"false\"\n              variant=\"outlined\"\n            />\n          </div>\n          <div class=\"row mt-2\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Permissions</label>\n            </div>\n          </div>\n          <div class=\"row mt-2\">\n            <label class=\"label\">Dataset</label>\n            <div class=\"value permission-list\">\n              <div class=\"role-grid\">\n                <div class=\"chkbx-li\">\n                  <v-checkbox\n                    v-model=\"role_viewer\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                  >\n                    <template #label>\n                      <div class=\"label-text\">Viewer</div>\n                    </template>\n                  </v-checkbox>\n                </div>\n                <div class=\"chkbx-li\">\n                  <v-checkbox\n                    v-model=\"role_writer\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                  >\n                    <template #label>\n                      <div class=\"label-text\">Editor</div>\n                    </template>\n                  </v-checkbox>\n                </div>\n              </div>\n            </div>\n          </div>\n        </template>\n        <div v-if=\"message\" class=\"row mt-2\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          v-if=\"mode === 'users'\"\n          class=\"button modal-action-button\"\n          :disabled=\"!hasChanges && !hasRemoved && !hasAccessModeChange\"\n          @click=\"confirmChanges\"\n        >\n          Confirm\n        </button>\n        <button\n          v-else-if=\"mode === 'new'\"\n          class=\"button modal-action-button\"\n          @click=\"addAccess\"\n        >\n          Add Users\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport { deepCompare } from '@/assets/js/utils.js';\nimport { toRaw } from 'vue';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: 'DatasetAccessModal',\n  components: {\n    Modal,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    UserIcon,\n  },\n  props: {\n    modalDataset: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['refresh-datasets'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      mode: 'users',\n      originalDatasetAccessList: [],\n      datasetAccessList: [],\n      orgUserList: [],\n      userInputValue: [],\n      remove: [],\n      role_viewer: true,\n      role_writer: false,\n      project_read: true,\n      project_write: false,\n      dataset_read: true,\n      dataset_write: false,\n      trainer_read: true,\n      trainer_write: false,\n      annotator_read: true,\n      annotator_write: false,\n      message: '',\n      originalShareMode: '',\n      shareMode: '',\n    };\n  },\n  computed: {\n    currentUser() {\n      return this.$store.state.user.user;\n    },\n    formatOrgUserListObject() {\n      if (this.orgUserList.length > 0) {\n        const temp = this.orgUserList.map((e) => ({ username: e.username, email: e.email }));\n        return temp.filter((e) => this.datasetAccessList.find((el) => el.username === e.username) === undefined);\n      } else {\n        return [];\n      }\n    },\n    hasRemoved() {\n      if (this.remove.length > 0) {\n        return true;\n      }\n      return false;\n    },\n    hasChanges() {\n      let tempChange = false;\n      this.datasetAccessList.forEach((dataset_access, index) => {\n        if (!this.deepCompare(dataset_access, this.originalDatasetAccessList[index])) {\n          tempChange = true;\n        }\n      });\n      return tempChange;\n    },\n    hasAccessModeChange() {\n      if (this.originalShareMode !== this.shareMode && this.shareMode !== 'custom') {\n        return true;\n      }\n      return false;\n    },\n    accessListByType() {\n      if (this.shareMode === 'default' || this.shareMode === 'custom') {\n        return this.datasetAccessList;\n      } else if (this.shareMode === 'private') {\n        return this.datasetAccessList.filter((e) => e.username === this.currentUser.username);\n      } else {\n        return [];\n      }\n    },\n  },\n  watch: {\n    shareMode(r) {\n      if (r === 'default') {\n        this.mode = 'users';\n        this.datasetAccessList = structuredClone(toRaw(this.originalDatasetAccessList));\n      }\n    },\n    role_writer(value) {\n      if (value) {\n        this.role_viewer = true;\n      }\n    },\n    modalDataset: {\n      immediate: true,\n      handler() {\n        this.shareMode = this.modalDataset ? this.modalDataset.permission_type : 'default';\n        this.originalShareMode = this.modalDataset ? this.modalDataset.permission_type : 'default';\n      },\n    },\n  },\n  async mounted() {\n    if (this.currentUser) {\n      this.orgUserList = await this.getUsersListByOrganization(this.currentUser.organization_id);\n    }\n  },\n  methods: {\n    deepCompare,\n    toggleRemoveAccess(username) {\n      const index = this.remove.indexOf(username);\n      if (index < 0) {\n        this.remove.push(username);\n      } else {\n        this.remove.splice(index, 1);\n      }\n    },\n    showModal() {\n      this.$refs.datasetAccessModal.showModal();\n      this.getDatasetAccessList();\n      this.shareMode = this.modalDataset ? this.modalDataset.permission_type : 'default';\n      this.originalShareMode = this.modalDataset ? this.modalDataset.permission_type : 'default';\n    },\n    closeModal() {\n      this.resetData();\n    },\n    resetData() {\n      this.datasetAccessList = [];\n      this.originalDatasetAccessList = [];\n      this.organizationDefaultAccessList = [];\n      this.userInputValue = [];\n      this.message = \"\";\n      this.remove = [];\n      this.mode = 'users';\n    },\n    async getUsersListByOrganization(id) {\n      const resp = await this.dsConn.getUserListByOrganization({\n        organization_id: id,\n      })\n        .catch((error) => {\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async getDatasetAccessList() {\n      if (this.modalDataset) {\n        await this.dsConn.getDatasetAccessList({ dataset_id: this.modalDataset.id })\n          .then((data) => {\n            if (data.result) {\n              const temp = data.result;\n              temp.sort((a, b) => {\n                if (a.last_name < b.last_name) {\n                  return -1;\n                }\n                if (a.last_name > b.last_name) {\n                  return 1;\n                }\n                // names must be equal\n                return 0;\n              });\n\n              this.datasetAccessList = temp;\n              this.originalDatasetAccessList = structuredClone(temp);\n            } else {\n              this.resetData();\n            }\n          })\n          .catch((e) => {\n            console.log(e);\n          });\n      }\n    },\n    async confirmChanges() {\n      this.message = \"\";\n      const promises = [];\n      const deleted_ids = [];\n      const updated_dataset_access = [];\n      if (this.hasAccessModeChange && this.shareMode === 'default') {\n        promises.push(this.revertDatasetAccessToDefault());\n      } else if (this.hasAccessModeChange && this.shareMode === 'private') {\n        promises.push(this.setDatasetAccessToPrivate());\n      } else if (this.shareMode === 'custom') {\n        this.accessListByType.filter((e) => this.remove.indexOf(e.username) > -1).forEach((dataset_access, index) => {\n          deleted_ids.push(dataset_access.username);\n        });\n        if (this.hasChanges) {\n          this.accessListByType.filter((e) => this.remove.indexOf(e.username) < 0).forEach((dataset_access, index) => {\n            updated_dataset_access.push(dataset_access);\n          });\n        }\n\n        if (deleted_ids.length > 0) {\n          promises.push(this.deleteDatasetAccess(deleted_ids));\n        }\n\n        if (updated_dataset_access.length > 0) {\n          promises.push(this.updateDatasetAccess(updated_dataset_access));\n        }\n      }\n\n      await Promise.all(promises)\n        .then(async () => {\n          this.getDatasetAccessList();\n          this.remove = [];\n          this.$emit('refresh-datasets');\n        });\n    },\n    async revertDatasetAccessToDefault() {\n      await this.dsConn.revertDatasetAccessToDefault({\n        dataset_id: this.modalDataset.id,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async setDatasetAccessToPrivate() {\n      await this.dsConn.setDatasetAccessToPrivate({\n        dataset_id: this.modalDataset.id,\n        username: this.currentUser.username,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async updateDatasetAccess(dataset_access_list) {\n      await this.dsConn.updateDatasetAccess({\n        dataset_id: this.modalDataset.id,\n        dataset_access_list,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async deleteDatasetAccess(dataset_access_usernames) {\n      await this.dsConn.deleteDatasetAccess({\n        dataset_id: this.modalDataset.id,\n        dataset_access_usernames,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    selectAccess(user, role) {\n      switch (role) {\n      case 'viewer':\n        user.project_read = true;\n        user.project_write = false;\n        user.dataset_read = true;\n        user.dataset_write = false;\n        user.trainer_read = true;\n        user.trainer_write = false;\n        user.annotator_read = true;\n        user.annotator_write = false;\n        break;\n      case 'editor':\n        user.project_read = true;\n        user.project_write = true;\n        user.dataset_read = true;\n        user.dataset_write = true;\n        user.trainer_read = true;\n        user.trainer_write = true;\n        user.annotator_read = true;\n        user.annotator_write = true;\n        break;\n      default:\n        break;\n      }\n    },\n    async addAccess() {\n      this.message = \"\";\n      const orginalNameMap = this.originalDatasetAccessList.map((e) => e.username);\n      const overlap = this.userInputValue.some((r) => orginalNameMap.includes(r));\n      if (this.userInputValue.length === 0) {\n        this.message = \"Please select one or more users.\";\n        return;\n      }\n      if (overlap) {\n        this.message = \"One or more users already has access to this dataset.\";\n        return;\n      }\n      const permissions = {};\n      if (this.role_viewer) {\n        permissions.project_read = true;\n        permissions.project_write = false;\n        permissions.dataset_read = true;\n        permissions.dataset_write = false;\n        permissions.trainer_read = true;\n        permissions.trainer_write = false;\n        permissions.annotator_read = true;\n        permissions.annotator_write = false;\n      } else if (this.role_writer) {\n        permissions.project_read = true;\n        permissions.project_write = true;\n        permissions.dataset_read = true;\n        permissions.dataset_write = true;\n        permissions.trainer_read = true;\n        permissions.trainer_write = true;\n        permissions.annotator_read = true;\n        permissions.annotator_write = true;\n      } else {\n        this.message = \"Missing permissions.\";\n        return;\n      }\n\n      await this.dsConn.addDatasetAccess({\n        dataset_id: this.modalDataset.id,\n        usernames: this.userInputValue,\n        permissions,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.userInputValue = [];\n            this.getDatasetAccessList();\n            this.remove = [];\n            this.mode = 'users';\n            this.$emit('refresh-datasets');\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 480px;\n  overflow: visible;\n}\n\n.header-buttons{\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n\n  .invisible {\n    visibility: hidden;\n  }\n}\n\n.combobox {\n  margin: 1px 0;\n  width: 100%;\n  padding-top: 8px;\n  border-radius: 8px;\n}\n\n.users {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  list-style: none;\n  width: 100%;\n  max-height: 450px;\n  padding: 0 15px 0 15px;\n  margin: 0;\n  overflow-y: scroll;\n\n  &__list-item {\n    margin: 0px -8px;\n    padding: 4px 8px;\n\n    &:hover {\n      background: var(--hover-background);\n    }\n  }\n\n  &__container {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n  }\n\n  &__icon {\n    padding-right: 16px;\n  }\n\n  &__initials {\n    display: flex;\n    flex: 0 0 auto;\n    width: 32px;\n    height: 32px;\n    // cursor: pointer;\n    border: none;\n    border-radius: 50%;\n    background: #053c8f;\n    color: white;\n    justify-content: center;\n    align-items: center;\n  }\n\n  &__content {\n    display: flex;\n    flex-direction: column;\n    text-align: left;\n    flex: 1 1 auto;\n  }\n\n  &__username {\n    font-weight: 600;\n    font-size: 16px;\n  }\n\n  &__email {\n    font-weight: 400;\n    font-size: 12px;\n  }\n\n  &__role {\n    border-radius: 32px;\n    height: 34px;\n    width: 102px;\n    padding: 2px 0 2px 2px;\n    font-size: 0.9rem;\n    font-weight: 600;\n    display: flex;\n    align-items: center;\n    justify-content: flex-end;\n  }\n\n  .slashed {\n    position: relative;\n  }\n\n  .slashed::after {\n    content: \"\";\n    position: absolute;\n    width: 100%;\n    height: 1px;\n    top: 50%;\n    left: -10px;\n    background: var(--color-red-600);\n  }\n\n  .dropdown-role{\n    margin-left: 5px;\n  }\n\n  .editable {\n    .dropdown-role {\n        transform: rotate(-90deg);\n      }\n  }\n\n  .editable:hover {\n    padding: 2px 0 2px 2px;\n    background: rgba(185, 184, 184, 0.5);\n    cursor: pointer;\n  }\n\n  .role-icon {\n    margin-right: 5px;\n  }\n}\n\n.italic {\n  font-style: italic;\n}\n\n.removing {\n  font-weight: 600;\n  @include themify() {\n    color: themed('color-red-600');\n  }\n}\n\n.button-mode {\n  background: none;\n  height: 35px;\n  color: var(--body-text-color);\n  padding: 10px 10px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  text-transform: capitalize;\n  font-size: 0.9rem;\n  font-weight: 550;\n  border: 1px solid rgb(76, 76, 76);\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n\n  &.active {\n    border: 1px solid transparent;\n    background: var(--color-primary);\n    color: var(--button-text-color);\n  }\n}\n\n.button-back {\n  background: none;\n  color: var(--body-text-color);\n  padding: 10px 6px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  border-radius: 4px;\n  text-transform: capitalize;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n}\n\n.remove-row {\n  justify-content: flex-end;\n  &__button {\n    font-weight: 600;\n    font-size: 14px;\n    width: fit-content;\n    margin-right: 5px;\n    border-radius: 20px;\n    padding: 2px 5px 2px 5px;\n    color: var(--color-red-600);\n    border: 1px solid var(--color-red-600);\n\n    &:hover{\n      cursor: pointer;\n      background: rgba(red, 0.1);\n    }\n  }\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: start;\n  width: 130px;\n  margin-top: 10px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n\n}\n\n.row > .value {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr 1fr;\n  grid-auto-rows: auto;\n  width: 100%;\n}\n\n.role-grid-single-row {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr;\n  grid-auto-rows: auto;\n\n  .label-text {\n    width: 200px;\n  }\n}\n\n.permission-list {\n  display: flex;\n  flex-direction: column !important;\n  width: 100%;\n\n  &__title {\n    margin: 5px 0 5px 0;\n    font-size: 1rem;\n    font-weight: 600;\n    color: rgba(rgb(0, 0, 0), 0.7);\n  }\n}\n\n.chkbx-li {\n  display: flex;\n  flex-direction: column;\n  align-items: start;\n\n  &__subtitle {\n    text-align: left;\n    margin-left: 30px;\n    font-size: 0.85rem;\n    color: rgba(grey, 0.95);\n  }\n}\n\n.chkbx-li +.chkbx-li {\n  margin-top: 10px;\n}\n\n.label-text {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin-left: 2px;\n  width: 100px;\n}\n\n:deep() {\n  .v-label {\n    opacity: 1 !important;\n  }\n  .v-expansion-panel:not(:first-child)::after {\n    border-style: none;\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n</style>\n","import { render } from \"./ManageDatasetAccess.vue?vue&type=template&id=17a66072&scoped=true\"\nimport script from \"./ManageDatasetAccess.vue?vue&type=script&lang=js\"\nexport * from \"./ManageDatasetAccess.vue?vue&type=script&lang=js\"\n\nimport \"./ManageDatasetAccess.vue?vue&type=style&index=0&id=17a66072&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-17a66072\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createLabelsModal\"\n    :title=\"'Create New Labels'\"\n    @closed=\"clearData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Labels</label>\n            <textarea\n              ref=\"labels\"\n              v-model=\"labels\"\n              placeholder=\"Comma-separated values, eg. label1,label2,etc.\"\n              rows=\"4\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"createLabels\"\n        >\n          Create Labels\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'CreateLabelsModal',\n  components: {\n    Modal,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: { 'label-created': null },\n  data() {\n    return {\n      labels: '',\n    };\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    showModal() {\n      this.$refs.createLabelsModal.showModal();\n      this.$nextTick(() => {\n        this.$refs.labels.focus();\n      });\n    },\n    clearData() {\n      this.labels = '';\n    },\n    closeModal() {\n      this.labels = '';\n      this.$refs.createLabelsModal.closeModal();\n    },\n    isJSON(str) {\n      try {\n        JSON.parse(str);\n        return true;\n      } catch (e) {\n        return false;\n      }\n    },\n    parseInput(input) {\n      if (this.isJSON(input)) {\n        return JSON.parse(input);\n      } else {\n        return input; // or you can return input.split(\",\") if you expect comma-separated strings\n      }\n    },\n    async createLabels() {\n      if (!this.labels) {\n        console.error('Missing labels');\n        return;\n      }\n      let l = this.parseInput(this.labels);\n      if (typeof l === 'object') {\n        await this.dataConnect.addLabel2({\n          dataset_id: this.dataset.id,\n          labels: l,\n        })\n          .then((data) => {\n            this.closeModal();\n            this.$emit('label-created');\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      } else if (typeof l === 'string') {\n        l = l.split(\",\");\n        await this.dataConnect.addLabel({\n          dataset_id: this.dataset.id,\n          label_names: l,\n        })\n          .then((data) => {\n            this.closeModal();\n            this.$emit('label-created');\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      }\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n</style>\n","import { render } from \"./CreateLabelsModal.vue?vue&type=template&id=4b6fd9b7&scoped=true\"\nimport script from \"./CreateLabelsModal.vue?vue&type=script&lang=js\"\nexport * from \"./CreateLabelsModal.vue?vue&type=script&lang=js\"\n\nimport \"./CreateLabelsModal.vue?vue&type=style&index=0&id=4b6fd9b7&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4b6fd9b7\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <BaseCard\n    :id=\"`dataset-${dataset.name}`\"\n    ref=\"card\"\n    :title=\"cardTitle\"\n    class=\"dataset-card\"\n    :class=\"{ 'dataset-selected': selected }\"\n    @edit-mode=\"(mode) => editTitle = mode\"\n    @apply-edit=\"handleApplyEdit\"\n  >\n    <template #title-start>\n      <div v-tooltip=\"dataset.docker_task ? dataset.docker_task.message : 'Dataset available for use'\">\n        <SVGIcon\n          :iconName=\"getDatasetStatusIcon()\"\n          class=\"dataset-status-icon\"\n          :class=\"getDatasetStatus()\"\n          :width=\"'28px'\"\n          :height=\"'28px'\"\n          @click.stop=\"handleWarning\"\n        />\n      </div>\n    </template>\n    <template #header>\n      <div class=\"icon-container\">\n        <IconButton\n          v-if=\"!isParked\"\n          v-tooltip=\"`Navigate to Gallery`\"\n          class=\"refresh-icon\"\n          :icon=\"'gallery_thumbnail'\"\n          :width=\"22\"\n          :height=\"22\"\n          :type=\"''\"\n          @click.stop=\"handleGalleryClicked\"\n        />\n        <IconButton\n          v-if=\"!isParked\"\n          v-tooltip=\"`Refresh ${dataset.name}`\"\n          class=\"refresh-icon\"\n          :icon=\"'refresh'\"\n          :width=\"22\"\n          :height=\"22\"\n          :type=\"''\"\n          @click.stop=\"handleRefreshClicked\"\n        />\n        <BaseMenu\n          :placement=\"'bottom-start'\"\n          @closed=\"show_menu = false\"\n        >\n          <IconButton\n            v-model=\"show_menu\"\n            class=\"refresh-icon\"\n            :icon=\"'more_vert'\"\n            :width=\"22\"\n            :height=\"22\"\n          />\n          <template #menu=\"{closeMenu}\">\n            <ul>\n              <!--\n              <li v-if=\"!isParked && canWrite && !isFrozen\">\n                <BaseMenuButton v-tooltip=\"'Pause activities for current dataset. You will not be able to edit, upload to this dataset while paused'\" @click.stop=\"handleFreezeDataset(1), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'pause_circle'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Pause Activities</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && canWrite && isFrozen\">\n                <BaseMenuButton  v-tooltip=\"'Resume activities for current dataset'\" @click.stop=\"handleFreezeDataset(0), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'play_circle'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Resume Activities</span>\n                </BaseMenuButton>\n              </li>\n              -->\n              <li v-if=\"!isParked && canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Edit dataset name and description'\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"handleEditClicked(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'edit'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Edit Info</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && (canWrite || user.role === 'admin' || user.role === 'super')\">\n                <BaseMenuButton\n                  v-tooltip=\"'View and manage access for dataset'\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"handleManageAccess(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'people'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Manage Access</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Import data to dataset'\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"openUploadDataset(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'import'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Import</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && (canWrite || canRead)\">\n                <BaseMenuButton\n                  v-tooltip=\"'Download data from dataset'\"\n                  @click.stop=\"openExportDataset(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'export'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Export</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Create snapshot from dataset'\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"handleOpenSnapshot(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'database_sync'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Create Snapshot</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Copy images from source dataset to destination'\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"handleCopyClicked(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'copy_white'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Copy Dataset</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && (canWrite || canRead)\">\n                <BaseMenuButton\n                  v-tooltip=\"'View dataset analytics'\"\n                  @click.stop=\"openAnalytics(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'insights'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Analytics</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && (canWrite || canRead)\">\n                <BaseMenuButton\n                  v-tooltip=\"'View dataset images on map. This is only supported when images have location metadata'\"\n                  @click.stop=\"openMap(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'map'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>View on Map</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && (canWrite)\">\n                <BaseMenuButton\n                  v-tooltip=\"'Generate API Token for dataset'\"\n                  @click.stop=\"generateAPIToken(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'token'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Generate API Token</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"!isParked && canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Disable actions on  the dataset. This will reduce the storage billing rate for data while parked'\"\n                  @click.stop=\"parkDataset(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'parking'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Park Dataset</span>\n                </BaseMenuButton>\n              </li>\n              <li v-else-if=\"isParked && canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Enable actions on  the dataset. Storage price will return to normal rates'\"\n                  @click.stop=\"unparkDataset(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'play'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Activate Dataset</span>\n                </BaseMenuButton>\n              </li>\n              <li v-if=\"canWrite\">\n                <BaseMenuButton\n                  v-tooltip=\"'Move dataset to recycle bin. Dataset will be billed at normal rate until it is purged'\"\n                  :class=\"{ '_danger' : !isFrozen}\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"deleteDataset(), closeMenu()\"\n                >\n                  <SVGIcon\n                    :iconName=\"'trash'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                  />\n                  <span>Move to Recycle Bin</span>\n                </BaseMenuButton>\n              </li>\n            </ul>\n          </template>\n        </BaseMenu>\n      </div>\n    </template>\n    <template #body>\n      <BaseTextExpander v-if=\"dataset.description\" :text=\"dataset.description\" class=\"mt-2\" />\n      <div class=\"card-detail-box-row mt-2\">\n        <div class=\"card-detail-box\">\n          <div class=\"card-detail-box__badge\">\n            <div class=\"card-detail-box__icon\">\n              <SVGIcon\n                :iconName=\"'image'\"\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n              />\n            </div>\n            <div class=\"card-detail-box__details\">\n              <h3 class=\"card-detail-box__details-title\">Images</h3>\n              <span class=\"card-detail-box__details-value\">{{ dataset.numImages ? dataset.numImages : '--' }}</span>\n            </div>\n          </div>\n        </div>\n        <div class=\"card-detail-box\">\n          <div class=\"card-detail-box__badge\">\n            <div class=\"card-detail-box__icon\">\n              <SVGIcon\n                :iconName=\"'tag'\"\n                :width=\"'24px'\"\n                :height=\"'24px'\"\n              />\n            </div>\n            <div class=\"card-detail-box__details\">\n              <h3 class=\"card-detail-box__details-title\">Labels</h3>\n              <span class=\"card-detail-box__details-value\">{{ dataset.numLabels ? dataset.numLabels : '--' }}</span>\n              <div class=\"card-detail-box__icon-container\">\n                <DatasetCardLabelsPopper\n                  v-if=\"!isParked\"\n                  :dataset=\"dataset\"\n                  :labels=\"labels\"\n                  :disableDelete=\"!canWrite\"\n                  :permissions=\"permissions\"\n                  @delete-label=\"(label) => handleDeleteLabelClicked(label)\"\n                  @update-label=\"$emit('update-label')\"\n                  @label-created=\"$emit('label-created')\"\n                />\n                <IconButton\n                  v-if=\"canWrite && !isParked\"\n                  v-tooltip=\"'Add new labels from an array of string'\"\n                  class=\"create-label-icon\"\n                  :icon=\"'add'\"\n                  :width=\"20\"\n                  :height=\"20\"\n                  :type=\"''\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"createLabel\"\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <template v-if=\"checkDockerTaskProgress()\">\n        <TaskStatusBars :task=\"dataset.docker_task\" class=\"status-bars\" />\n      </template>\n      <template v-else>\n        <template v-if=\"!isParked\">\n          <div class=\"card-detail-box _groups mt-2\">\n            <div class=\"card-detail-box__badge _bottom-border\">\n              <div v-tooltip=\"`Groups ars useful to separate images into 'train' and 'validate' groups for workflow.`\" class=\"card-detail-box__icon\">\n                <SVGIcon\n                  :iconName=\"'split'\"\n                  :width=\"'24px'\"\n                  :height=\"'24px'\"\n                />\n              </div>\n              <div class=\"card-detail-box__details\">\n                <h3 class=\"card-detail-box__details-title\">Groups</h3>\n                <span class=\"card-detail-box__details-value\">{{ dataset.groups ? dataset.groups.length : '--' }}</span>\n                <div class=\"card-detail-box__icon-container\">\n                  <IconButton\n                    v-if=\"canWrite\"\n                    class=\"create-annset-icon\"\n                    :icon=\"'add'\"\n                    :width=\"20\"\n                    :height=\"20\"\n                    :type=\"''\"\n                    :disabled=\"isFrozen\"\n                    @click.stop=\"createGroupClicked\"\n                  />\n                </div>\n              </div>\n            </div>\n            <div v-if=\"dataset.groups && dataset.groups.length > 0\" class=\"group-li-container scrollbar\">\n              <GroupListItem\n                v-for=\"(g,i) in dataset.groups\"\n                :key=\"i\"\n                :name=\"g.name\"\n                :count=\"g.count\"\n                @delete-group=\"$emit('delete-group', g)\"\n              />\n            </div>\n          </div>\n\n          <div class=\"card-detail-box mt-2\">\n            <div class=\"card-detail-box__badge _bottom-border\">\n              <div\n                v-tooltip=\"`Annotation sets are collections of annotation and sensor data for images in the dataset.\n              One image can have annotations and sensro data that belong to different annotation sets.\n              This is usefull for comparing outputs from different sources.`\"\n                class=\"card-detail-box__icon\"\n              >\n                <SVGIcon\n                  :iconName=\"'set'\"\n                  :width=\"'24px'\"\n                  :height=\"'24px'\"\n                />\n              </div>\n              <div class=\"card-detail-box__details\">\n                <h3 class=\"card-detail-box__details-title\">Annotation Sets</h3>\n                <span class=\"card-detail-box__details-value\">{{ numAnnotationSets }}</span>\n                <div class=\"card-detail-box__icon-container\">\n                  <!-- <IconButton\n                  v-if=\"isOwner || isEditor || isAdmin\"\n                  class=\"create-annset-icon\"\n                  :icon=\"'export'\"\n                  :width=\"20\"\n                  :height=\"20\"\n                  :type=\"''\"\n                  :disabled=\"isFrozen\"\n                  @click.stop=\"importAnnotationSet\"\n                /> -->\n                  <IconButton\n                    v-if=\"canWrite\"\n                    class=\"create-annset-icon\"\n                    :icon=\"'add'\"\n                    :width=\"20\"\n                    :height=\"20\"\n                    :type=\"''\"\n                    :disabled=\"isFrozen\"\n                    @click.stop=\"createAnnotationSetClicked\"\n                  />\n                </div>\n              </div>\n            </div>\n            <div v-if=\"!annotationSetsLoading\" class=\"annset-li-container scrollbar\">\n              <AnnotationSetListItem\n                v-for=\"(s,i) in internalAnnotationSets\"\n                :key=\"i\"\n                v-model:numImg=\"s.num_images\"\n                v-model:numAnnotations=\"s.num_annotations\"\n                v-model:hashId=\"s.hashed_id\"\n                :annotationSet=\"s\"\n                :isFrozen=\"isFrozen\"\n                @copy-annset=\"handleCopyAnnSetClicked(s)\"\n                @delete-annset=\"$emit('delete-annset', s)\"\n                @open-conf-matrix=\"$emit('open-conf-matrix', s)\"\n                @open-description=\"$emit('open-description', s)\"\n                @generate-hash=\"$emit('generate-hash', s)\"\n              />\n            </div>\n            <div v-else class=\"loading-container\">\n              <InlineLoader :width=\"'30px'\" :height=\"'30px'\" :border=\"'7px'\" />\n            </div>\n          </div>\n        </template>\n        <template v-else>\n          <div class=\"parked-dataset-status\">\n            <SVGIcon\n              class=\"parking-icon\"\n              :iconName=\"'parking'\"\n              :width=\"'50%'\"\n              :height=\"'50%'\"\n            />\n            <p class=\"date-text\">Parked Date: {{ formatTime(dataset.parked_at) }}</p>\n          </div>\n        </template>\n      </template>\n    </template>\n    <template #footer>\n      <EncodedIdField\n        :id=\"dataset.id\"\n        :type=\"'dataset'\"\n      />\n    </template>\n  </BaseCard>\n</template>\n<script>\nimport BaseCard from '@/components/BaseCard.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport BaseTextExpander from '@/components/BaseTextExpander.vue';\nimport AnnotationSetListItem from '@/components/DatasetComponent/DatasetManagement/AnnotationSetListItem.vue';\nimport GroupListItem from '@/components/DatasetComponent/DatasetManagement/GroupListItem.vue';\nimport { useToast } from 'vue-toast-notification';\nimport EncodedIdField from '@/components/EncodedIdField.vue';\nimport TaskStatusBars from '@/components/TaskStatusBars.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\nimport IconButton from '../../IconButton.vue';\nimport DatasetCardLabelsPopper from '../DatasetCardLabelsPopper.vue';\nimport SVGIcon from '../../SVGIcon.vue';\nimport InlineLoader from '../../InlineLoader.vue';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nexport default {\n  name: 'DatasetCard',\n  components: {\n    IconButton,\n    DatasetCardLabelsPopper,\n    SVGIcon,\n    InlineLoader,\n    BaseCard,\n    BaseMenu,\n    BaseMenuButton,\n    BaseTextExpander,\n    AnnotationSetListItem,\n    GroupListItem,\n    EncodedIdField,\n    TaskStatusBars,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: [\n    'delete-dataset',\n    'copy-dataset',\n    'copy-annset',\n    'clicked',\n    'create-annset',\n    'delete-annset',\n    'create-label',\n    'deleted-label',\n    'refresh',\n    'update:annotation-sets',\n    'update:labels',\n    'open-dataset-access-management',\n    'edit-dataset',\n    'edit-annset',\n    'open-export',\n    'open-import',\n    'open-upload',\n    'freeze-dataset', 'import-annset', 'create-groups',\n    'delete-group', 'to-gallery', 'open-analytics',\n    'open-map', 'generate-token', 'open-conf-matrix',\n    'open-description', 'park-dataset', 'unpark-dataset', 'update-label', 'label-created', 'add-snapshot', 'dismiss-error', 'generate-hash',\n  ],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      loading: false,\n      show_menu: false,\n      annotationSetsLoading: false,\n      editTitle: false,\n      statusType: '',\n      permissions: null,\n    };\n  },\n  computed: {\n    datasetNotifications() {\n      return this.$store.state.notifications.datasets[this.dataset.id];\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    canWrite() {\n      return this.permissions && this.permissions.dataset_write;\n    },\n    canRead() {\n      return this.permissions && this.permissions.dataset_read;\n    },\n    isAdmin() {\n      return this.user.role === 'super' || this.user.role === 'admin';\n    },\n    isFrozen() {\n      return this.dataset.is_frozen;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    isParked() {\n      return this.dataset && this.dataset['parked_at'] !== \"0001-01-01T00:00:00Z\";\n    },\n    internalAnnotationSets: {\n      get() { return this.annotationSets; },\n      set(v) { this.$emit('update:annotation-sets', v); },\n    },\n    cardTitle() {\n      if (this.dataset?.name) {\n        return this.isDebugMode ? `(${this.dataset.id}) ${this.dataset.name}` : `${this.dataset.name}`;\n      }\n      return '';\n    },\n    numAnnotationSets() {\n      if (this.internalAnnotationSets && this.internalAnnotationSets.length) {\n        return this.internalAnnotationSets.length;\n      }\n      return 0;\n    },\n  },\n  watch: {\n    dataset: {\n      deep: true,\n      handler(d) {\n        if (d && d.annotation_sets) {\n          this.internalAnnotationSets = d.annotation_sets;\n        }\n      },\n    },\n  },\n  mounted() {\n    // this.datasetAccessList = await this.getDatasetAccessList(this.dataset.id);\n    this.GetPermissionsForCurrentUser();\n  },\n  methods: {\n    checkDockerTaskProgress() {\n      return this.dataset.docker_task_id && this.dataset.docker_task && this.dataset.docker_task.data\n      && (!this.dataset.docker_task.status.toLowerCase().includes('complete'));\n    },\n    handleWarning() {\n      if (this.dataset && this.dataset.docker_task_id && this.dataset.docker_task) {\n        if (this.dataset.docker_task.status === 'error' || this.dataset.docker_task.status === 'terminated') {\n          $toast.open({\n            queue: true,\n            duration: 0,\n            message: `Error occured during dataset operation. Dismiss this warning to continue.`,\n            type: 'error',\n            position: 'top',\n            onDismiss: () => { this.$emit('dismiss-error'); },\n          });\n        }\n      }\n    },\n    getDatasetStatusIcon() {\n      if (this.dataset && this.dataset.docker_task_id && this.dataset.docker_task) {\n        if (this.dataset.docker_task.status === 'complete') {\n          return 'check_circle';\n        } else if (this.dataset.docker_task.status === 'error' || this.dataset.docker_task.status === 'terminated') {\n          return 'warning';\n        } else {\n          return 'ellipsis';\n        }\n      } else {\n        return 'check_circle';\n      }\n    },\n    getDatasetStatus() {\n      if (this.dataset && this.dataset.docker_task_id && this.dataset.docker_task) {\n        if (this.dataset.docker_task.status === 'complete') {\n          return 'available';\n        } else if (this.dataset.docker_task.status === 'error' || this.dataset.docker_task.status === 'terminated') {\n          return 'warning';\n        } else {\n          return 'running';\n        }\n      } else {\n        return 'available';\n      }\n    },\n    formatTime(str) {\n      if (!str || str === \"\") {\n        return \"\";\n      } else {\n        return `${new Date(str).toLocaleTimeString('default', {\n          year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n        })}`;\n      }\n    },\n    async GetPermissionsForCurrentUser() {\n      const user = this.$store.state.user.user;\n      await this.dsConn.getDatasetAccessForSingleUser({\n        dataset_id: this.dataset.id,\n        username: user.username,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getDatasetAccessList(dataset_id) {\n      const resp = await this.dsConn.getDatasetAccessList({\n        dataset_id,\n      })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        // TODO: handle error\n        return null;\n      }\n      return resp.result;\n    },\n    handleCopyClicked() {\n      this.$emit('copy-dataset');\n    },\n    handleOpenSnapshot() {\n      this.$emit('add-snapshot');\n    },\n    deleteDataset() {\n      this.$emit('delete-dataset');\n    },\n    handleCopyAnnSetClicked(set) {\n      this.$emit('copy-annset', set);\n    },\n    async handleDeleteLabelClicked(label) {\n      this.$emit('deleted-label', label);\n    },\n    handleClickEvent() {\n      this.$emit('clicked');\n    },\n    createAnnotationSetClicked() {\n      this.$emit('create-annset');\n    },\n    createLabel() {\n      this.$emit('create-label', this.dataset);\n    },\n    handleRefreshClicked() {\n      this.$emit('refresh');\n    },\n    handleGalleryClicked() {\n      this.$emit('to-gallery');\n    },\n    handleManageAccess() {\n      this.$emit('open-dataset-access-management', this.dataset);\n    },\n    handleEditAnnset() {\n      this.$emit('edit-annset');\n    },\n    openImportDataset() {\n      this.$emit('open-import');\n    },\n    openUploadDataset() {\n      this.$emit('open-upload');\n    },\n    openExportDataset() {\n      this.$emit('open-export');\n    },\n    openAnalytics() {\n      this.$store.commit('datasets/setCurrentDataset', this.dataset);\n      this.$nextTick(() => {\n        this.$router.push({ path: '/datasets/stats' });\n      });\n    },\n    openMap() {\n      this.$store.commit('datasets/setCurrentDataset', this.dataset);\n      this.$nextTick(() => {\n        this.$router.push({ path: '/datasets/map' });\n      });\n    },\n    handleApplyEdit(name) {\n      this.$emit('edit-dataset', name);\n    },\n    handleEditClicked() {\n      this.$emit('edit-dataset');\n    },\n    handleFreezeDataset(isFrozen) {\n      this.$emit('freeze-dataset', isFrozen);\n    },\n    importAnnotationSet() {\n      this.$emit('import-annset');\n    },\n    createGroupClicked() {\n      this.$emit('create-groups');\n    },\n    generateAPIToken() {\n      this.$emit('generate-token');\n    },\n    parkDataset() {\n      this.$emit('park-dataset');\n    },\n    unparkDataset() {\n      this.$emit('unpark-dataset');\n    },\n    // dismissError() {\n    //   console.log('here');\n    //   this.$emit('dismiss-error');\n    // },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.dataset-status-icon {\n  margin-right: 10px;\n\n  &.available {\n    @include themify() {\n      color: themed('color-status-complete') !important;\n      cursor: default;\n    }\n  }\n\n  &.warning {\n    @include themify() {\n      color: themed('color-status-warning') !important;\n      cursor: pointer;\n    }\n  }\n\n  &.running {\n    @include themify() {\n      color: themed('color-status-running') !important;\n      cursor: default;\n    }\n  }\n}\n\n.dataset-card {\n  margin: 2px;\n}\n\n.card:not([disabled=\"true\"]):hover {\n  @include themify() {\n    outline: 2px solid themed('card-border-color-hover');\n  }\n}\n.card:not([disabled=\"true\"]).dataset-selected {\n  // margin: 3px;\n  @include themify() {\n    outline: 3px solid themed('card-list-color-selected-border')\n  }\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  margin-left: 12px;\n  margin-bottom: 6px;\n  button + button {\n    margin-left: 10px;\n  }\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.card .create-annset-icon {\n  margin-left: 4px;\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.card .create-label-icon {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.card:hover .copy-icon:hover,\n.card:hover .create-annset-icon:hover,\n.card:hover .refresh-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.annset-li-container {\n  overflow-y: auto;\n  font-size: 0.875rem;\n  flex: 1 1;\n}\n\n.group-li-container {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, 140px);\n  grid-auto-rows: 65px;\n  width: 100%;\n  gap: 5px;\n  padding: 5px;\n  overflow-y: auto;\n  flex: 1 1 auto;\n}\n\n.loading-container {\n  display: flex;\n  flex: 1 1;\n  align-items: center;\n  justify-content: center;\n}\n\n.secondary-title-container {\n  display: flex;\n  margin-top: 7px;\n  align-items: center;\n  line-height: 1;\n}\n\n.secondary-title {\n  font-weight: bold;\n  @include themify() {\n    font-size: 0.875rem;\n    color: themed('body-text-color-secondary');\n  }\n}\n\n$badge-height: 50px;\n$badge-padding: 8px;\n.card-detail-box-row {\n  display: flex;\n  flex-direction: row;\n  min-height: $badge-height;\n  max-height: $badge-height;\n  width: 100%;\n  gap: 0.5rem;\n}\n.card-detail-box {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  flex: 0 1 100%;\n  border: 1px solid rgba(0,0,0,0.075);\n  border-radius: 4px;\n  overflow: hidden;\n  @include themify() {\n    background: themed('color-white-600');\n  }\n\n  &__badge {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    height: $badge-height - 2px;\n    width: 100%;\n    padding: $badge-padding;\n\n    &._bottom-border {\n      border-bottom: 1px solid rgba(0, 0, 0, 0.075);\n    }\n  }\n\n  &__icon {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    border-radius: 4px;\n    min-width: $badge-height - ($badge-padding * 2) - 2px;\n    height: 100%;\n    @include themify() {\n      background: themed('color-primary');\n    }\n\n    svg {\n      color: white;\n    }\n  }\n\n  &__details {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    height: 100%;\n    border-radius: 4px;\n    margin-left: 12px;\n    overflow: hidden;\n  }\n\n  &__details-title {\n    line-height: 1;\n    font-weight: 500;\n    @include themify() {\n      font-size: 0.75rem;\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  &__details-value {\n    margin-top: auto;\n    line-height: 1;\n    font-weight: 600;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    @include themify() {\n      font-size: 1.125rem;\n      color: themed('body-text-color');\n    }\n  }\n\n  &__icon-container {\n    position: absolute;\n    top: 4px;\n    right: 4px;\n    display: flex;\n    align-items: center;\n    gap: 4px;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  &._groups {\n    max-height: 130px;\n    flex: 1 0 min-content;\n  }\n}\n\n.parked-dataset-status {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n\n  .parking-icon {\n    color: themed('icon-color-primary');\n    opacity: 0.3\n  }\n\n  p {\n    @include themify() {\n      font-size: 0.9rem;\n      color: themed('body-text-color');\n    }\n  }\n}\n\n.status-bars {\n  padding: 15px;\n}\n\n</style>\n","<template>\n  <div class=\"annset-li\">\n    <div class=\"annset-name-desc\">\n      <div class=\"annset-name\">\n        <span class=\"set-name\">{{ isDebugMode ? `(${annotationSet.id}) ${annotationSet.name}` : `${annotationSet.name}` }}\n        </span>\n        <EncodedIdField\n          :id=\"annotationSet.id\"\n          class=\"ml-3 mr-3\"\n          :type=\"'annotation set'\"\n          :hideLabel=\"true\"\n        />\n      </div>\n      <div class=\"annset-desc\">\n        <SVGIcon\n          :iconName=\"'image'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <span>{{ imgCount }}</span>\n        <SVGIcon\n          :iconName=\"'tag'\"\n          :width=\"'18px'\"\n          :height=\"'18px'\"\n        />\n        <span>{{ annotationCount }}</span>\n        <template v-if=\"loadingHash || hashId\">\n          <SVGIcon\n            :iconName=\"'hash_tag'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          <InlineLoader\n            v-if=\"loadingHash && !hashId\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n            :border=\"'2px'\"\n            class=\"ml-2\"\n          />\n          <template v-if=\"hashId\">\n            <Tooltip :placement=\"'top-start'\" :trigger=\"'click'\">\n              <template #body>\n                <pre>Full dataset hash copied</pre>\n              </template>\n              <SVGIcon\n                class=\"icon-copy\"\n                :iconName=\"'copy'\"\n                :width=\"'16px'\"\n                :height=\"'16px'\"\n                @click.stop=\"copyToClipboard(hashId)\"\n              />\n            </Tooltip>\n            <span>{{ shorten(hashId) }}</span>\n          </template>\n        </template>\n      </div>\n    </div>\n    <div class=\"icon-container\">\n      <BaseMenu\n        :placement=\"'bottom-start'\"\n        :appendToBody=\"true\"\n        @closed=\"show_menu = false\"\n      >\n        <IconButton\n          v-model=\"show_menu\"\n          class=\"edit-set-icon\"\n          :icon=\"'more_vert'\"\n          :width=\"22\"\n          :height=\"22\"\n        />\n        <template #menu=\"{closeMenu}\">\n          <ul>\n            <li>\n              <BaseMenuButton v-tooltip=\"'Edit annotation set name and description'\" @click.stop=\"$emit('open-description'), closeMenu()\">\n                <SVGIcon\n                  :iconName=\"'edit'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Edit</span>\n              </BaseMenuButton>\n            </li>\n            <!-- <li>\n              <BaseMenuButton\n              v-tooltip=\"'Validate'\"\n                :disabled=\"isFrozen\"\n                @click.stop=\"navigateToValidator(), closeMenu()\"\n              >\n                <SVGIcon\n                  :iconName=\"'compare'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Validate</span>\n              </BaseMenuButton>\n            </li> -->\n            <li>\n              <BaseMenuButton\n                v-tooltip=\"'Generate hash value from dataset and selected annotation set'\"\n                :disabled=\"isFrozen\"\n                @click.stop=\"generateHash(), closeMenu()\"\n              >\n                <SVGIcon\n                  :iconName=\"'hash_tag'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Generate Hash</span>\n              </BaseMenuButton>\n            </li>\n            <li v-if=\"!isFrozen\">\n              <BaseMenuButton\n                v-tooltip=\"'Move annotation set to recycle bin. Annotation set will be billed at normal rate until it is purged'\"\n                class=\"_danger\"\n                :disabled=\"isFrozen\"\n                @click.stop=\"$emit('delete-annset'), closeMenu()\"\n              >\n                <SVGIcon\n                  :iconName=\"'trash'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Move to Recycle Bin</span>\n              </BaseMenuButton>\n            </li>\n          </ul>\n        </template>\n      </BaseMenu>\n      <!-- <IconButton\n        class=\"edit-set-icon\"\n        :icon=\"'conf_matrix'\"\n        :width=\"22\"\n        :height=\"22\"\n        :title=\"`View Confusion Matrix`\"\n        :type=\"''\"\n        @click.stop=\"$emit('open-conf-matrix')\"\n      /> -->\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface.js';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport EncodedIdField from '@/components/EncodedIdField.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\nimport Tooltip from \"@/components/Tooltip.vue\";\n\nexport default {\n  name: \"AnnotationSetListItem\",\n  components: {\n    SVGIcon,\n    IconButton,\n    BaseMenu,\n    BaseMenuButton,\n    EncodedIdField,\n    InlineLoader,\n    Tooltip,\n  },\n  props: {\n    annotationSet: {\n      type: Object,\n      default: () => {},\n    },\n    numImg: {\n      type: Number,\n      default: 0,\n    },\n    numAnnotations: {\n      type: Number,\n      default: 0,\n    },\n    refresh: {\n      type: Boolean,\n      default: false,\n    },\n    isFrozen: {\n      type: Boolean,\n      default: false,\n    },\n    hashId: {\n      type: String,\n      default: null,\n    },\n  },\n  emits: {\n    'delete-annset': null, 'copy-annset': null, 'update:numImg': null, 'update:numAnnotations': null, 'open-conf-matrix': null, 'open-description': null, 'generate-hash': null,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      imgTotal: 0,\n      loadingHash: false,\n      show_menu: false,\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    imgCount: {\n      get() { return this.numImg; },\n      set(v) { this.$emit('update:numImg', v); },\n    },\n    annotationCount: {\n      get() { return this.numAnnotations; },\n      set(v) { this.$emit('update:numAnnotations', v); },\n    },\n  },\n  watch: {\n    hashId() {\n      this.loadingHash = false;\n    },\n  },\n  methods: {\n    shorten(hashId) {\n      return hashId.slice(0, 8);\n    },\n    navigateToValidator() {\n      this.$router.push({ path: '/validator', query: { dataset_id: this.annotationSet.dataset_id, target: this.annotationSet.id } });\n    },\n    generateHash() {\n      this.loadingHash = true;\n      this.$emit('generate-hash');\n    },\n    copyToClipboard(text) {\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        navigator.clipboard.writeText(text);\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.annset-li-container {\n  overflow-y: auto;\n  font-size: 0.875rem;\n  flex: 1 1;\n}\n\n.annset-li {\n  display: flex;\n  padding-left: 10px;\n  padding-right: 10px;\n  padding-top: 5px;\n  padding-bottom: 5px;\n  border-radius: 4px;\n\n  .annset-name-desc {\n    flex: 1 1 auto;\n  }\n\n  .set-name {\n    font-weight: 600;\n  }\n\n  .annset-name {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    @include themify() {\n      color: themed('body-text-color');\n    }\n  }\n\n  .annset-desc {\n    display: flex;\n    align-items: center;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n\n    span {\n      margin-left: 2px;\n      font-size: 0.9rem;\n    }\n\n    svg:not(:first-of-type) {\n      margin-left: 15px;\n    }\n  }\n}\n\n.annset-li:hover {\n  background-color: rgb(237, 232, 232);\n}\n\n.annset-li .copy-annset-icon,\n.annset-li .delete-annset-icon,\n.annset-li .edit-set-icon,\n.annset-li:hover .copy-annset-icon,\n.annset-li:hover .delete-annset-icon,\n.annset-li:hover .edit-set-icon{\n  z-index: 3;\n  visibility: visible;\n  @include themify() {\n    color: themed('icon-color-inactive');\n  }\n}\n\n.annset-li:hover .copy-annset-icon:hover,\n.annset-li:hover .edit-set-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.annset-li:hover .delete-annset-icon:hover {\n  @include themify() {\n    color: themed('color-red');\n  }\n}\n\n.annset-li + .annset-li {\n  margin-top: 2px;\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  margin-left: 12px;\n  button + button {\n    margin-left: 10px;\n  }\n  @include themify() {\n    color: themed('icon-color-inactive');\n  }\n}\n\n.icon-copy {\n  margin: 0 5px !important;\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n  cursor: pointer;\n}\n\n</style>\n","import { render } from \"./AnnotationSetListItem.vue?vue&type=template&id=f01d2930&scoped=true\"\nimport script from \"./AnnotationSetListItem.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationSetListItem.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationSetListItem.vue?vue&type=style&index=0&id=f01d2930&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f01d2930\"]])\n\nexport default __exports__","<template>\n  <div class=\"group-li-card\">\n    <IconButton\n      class=\"delete-group-icon\"\n      :icon=\"'close'\"\n      :width=\"15\"\n      :height=\"15\"\n      @click.stop=\"$emit('delete-group')\"\n    />\n    <label class=\"font-weight-bold\">{{ name }}</label>\n    <p>{{ `${count} imgs` }}</p>\n  </div>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\n\nexport default {\n  name: \"AnnotationSetListItem\",\n  components: {\n    IconButton,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    count: {\n      type: Number,\n      default: 0,\n    },\n\n  },\n  emits: ['delete-group'],\n};\n</script>\n\n<style lang=\"scss\">\n.group-li-card {\n  position: relative;\n  width: 135px;\n  border-radius: 6px;\n  padding: 10px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  text-align: center;\n  border: 2px solid rgb(69, 69, 69);\n\n  label {\n    font-size: 0.9rem;\n  }\n\n  p {\n    font-size: 0.9rem;\n    font-weight: 600;\n  }\n  label, p {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  .delete-group-icon {\n    position: absolute;\n    right: 2px;\n    top: 2px;\n    visibility: hidden;\n  }\n\n  &:hover .delete-group-icon {\n    z-index: 3;\n    visibility: visible;\n    @include themify() {\n      background: transparent;\n      border-radius: 100%;\n      color: themed('color-primary')\n    }\n  }\n\n}\n\n</style>\n","import { render } from \"./GroupListItem.vue?vue&type=template&id=14f256b2\"\nimport script from \"./GroupListItem.vue?vue&type=script&lang=js\"\nexport * from \"./GroupListItem.vue?vue&type=script&lang=js\"\n\nimport \"./GroupListItem.vue?vue&type=style&index=0&id=14f256b2&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <FilterPopper :appendToBody=\"true\">\n    <IconButton\n      v-tooltip=\"'Add new labels and update existing ones'\"\n      class=\"annset-info-icon\"\n      :icon=\"'edit'\"\n      :width=\"20\"\n      :height=\"20\"\n      :type=\"''\"\n      @click.stop=\"\"\n    />\n    <template #popper>\n      <div v-if=\"labels && labels.length > 0\" class=\"label-li-container\">\n        <div class=\"space-between\">\n          <span class=\"container-header\">\n            All labels\n            <IconButton\n              id=\"copy-labels-button\"\n              :icon=\"'copy_white'\"\n              :width=\"18\"\n              :height=\"18\"\n              :title=\"`Copy Labels to Clipboard`\"\n              @click.stop=\"copyLabels\"\n            />\n          </span>\n          <IconButton\n            :icon=\"'add'\"\n            :width=\"18\"\n            :height=\"18\"\n            :title=\"`Add New Label`\"\n            @click.stop=\"newLabel\"\n          />\n        </div>\n        <div class=\"table-scroll scrollbar\">\n          <table class=\"table\">\n            <colgroup>\n              <col span=\"1\" style=\"width: 30%;\">\n              <col span=\"1\" style=\"width: 70%;\">\n            </colgroup>\n            <tbody>\n              <tr>\n                <th><h4>Color</h4></th>\n                <th><h4>Index</h4></th>\n                <th><h4>Name</h4></th>\n              </tr>\n              <tr v-for=\"(l,i) in internalLabels\" :key=\"i\">\n                <td>\n                  <!-- Do not append to body here, as it will propagate the click event to the parent popper -->\n                  <ColorPicker\n                    :color=\"l.color\"\n                    :appendToBody=\"false\"\n                    :width=\"50\"\n                    :height=\"20\"\n                    :radius=\"8\"\n                    :offset=\"[-10, 20]\"\n                    @new-color=\"(color) => stopEditingColor(i, l, color)\"\n                  />\n                </td>\n                <td>\n                  <div class=\"label-index\">\n                    <span v-show=\"!internalLabels[i].editingIndex\" @click=\"startEditingIndex($event, i)\">{{ l.index }}</span>\n                    <input\n                      v-show=\"internalLabels[i].editingIndex\"\n                      v-model=\"l.newIndex\"\n                      type=\"number\"\n                      min=\"0\"\n                      step=\"1\"\n                      class=\"text-input\"\n                      @blur.stop=\"stopEditingIndex(i, l)\"\n                      @keyup.enter.stop=\"unfocus($event)\"\n                    >\n                  </div>\n                </td>\n                <td>\n                  <div class=\"label-name\">\n                    <span v-show=\"!internalLabels[i].editingName\" @click=\"startEditingName($event, i)\">{{ l.name }}</span>\n                    <input\n                      v-show=\"internalLabels[i].editingName\"\n                      v-model=\"l.newName\"\n                      type=\"text\"\n                      class=\"text-input\"\n                      @blur.stop=\"stopEditingName(i, l)\"\n                      @keyup.enter.stop=\"unfocus($event)\"\n                    >\n                    <IconButton\n                      v-if=\"canWrite\"\n                      class=\"delete-label-icon\"\n                      :icon=\"'close'\"\n                      :width=\"18\"\n                      :height=\"18\"\n                      :title=\"`Delete Label ${l.name}`\"\n                      :type=\"''\"\n                      @click.stop=\"deleteLabel(l)\"\n                    />\n                  </div>\n                </td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n      <div v-else class=\"label-li-container scrollbar\">\n        <span class=\"container-header\">This dataset does not have any label.</span>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ColorPicker from '@/components/ColorPicker.vue';\n\nexport default {\n  name: \"DatasetCardLabelsPopper\",\n  components: {\n    FilterPopper,\n    IconButton,\n    ColorPicker,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    disableDelete: {\n      type: Boolean,\n      default: false,\n    },\n    permissions: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: [\n    'delete-label', 'update-label', 'label-created',\n  ],\n  data() {\n    return {\n      internalLabels: [],\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    canWrite() {\n      return this.permissions && this.permissions.dataset_write;\n    },\n    existingIndices() {\n      return this.labels.map((e) => e.index);\n    },\n    existingNames() {\n      return this.labels.map((e) => e.name);\n    },\n  },\n  watch: {\n    labels: {\n      deep: true,\n      immediate: true,\n      handler() {\n        if (this.labels) {\n          this.internalLabels = JSON.parse(JSON.stringify(this.labels));\n          this.internalLabels.forEach((label, i) => {\n            this.internalLabels[i].editingIndex = false;\n            this.internalLabels[i].newIndex = label.index;\n            this.internalLabels[i].editingName = false;\n            this.internalLabels[i].newName = label.name;\n            this.internalLabels[i].editingName = false;\n            this.internalLabels[i].newColor = label.color;\n          });\n        } else {\n          this.internalLabels = [];\n        }\n      },\n    },\n  },\n  methods: {\n    deleteLabel(l) {\n      this.$emit('delete-label', l);\n    },\n    async newLabel() {\n      await this.dsConn.addLabel({\n        dataset_id: this.dataset.id,\n        label_names: ['NewLabel'],\n      })\n        .then((data) => {\n          if (!data.error) {\n            this.$emit('label-created');\n          } else {\n            console.log(data.error);\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    copyLabels() {\n      // Clipboard is not available on unsecure connections. Copy from alert instead.\n      const labelString = JSON.stringify(this.labels.map((l) => ({\n        name: l.name,\n        color: l.color,\n      })));\n      if (navigator.clipboard) {\n        navigator.clipboard.writeText(labelString);\n      } else {\n        alert(labelString);\n      }\n    },\n    startEditingIndex(event, i) {\n      if (!this.canWrite) {\n        return;\n      }\n      this.internalLabels[i].editingIndex = true;\n      this.$nextTick(() => {\n        const inputField = event.target.nextElementSibling;\n        if (inputField) {\n          inputField.focus();\n        }\n      });\n    },\n    async stopEditingIndex(i, label) {\n      if (!this.canWrite) {\n        return;\n      }\n      if (this.existingIndices.includes(label.newIndex)) {\n        label.newIndex = label.index;\n        this.internalLabels[i].editingIndex = false;\n      } else {\n        const params = {\n          dataset_id: this.dataset.id,\n          label_id: label.id,\n          label_index: label.newIndex,\n          label_name: label.name,\n          label_color: label.color,\n        };\n        await this.dsConn.updateLabel(params)\n          .then((data) => {\n            if (!data.error) {\n              this.internalLabels[i].editingIndex = false;\n              this.$emit('update-label');\n            } else {\n              label.newIndex = label.index;\n            }\n          })\n          .catch((e) => console.log(e));\n      }\n    },\n    startEditingName(event, i) {\n      if (!this.canWrite) {\n        return;\n      }\n      this.internalLabels[i].editingName = true;\n      this.$nextTick(() => {\n        const inputField = event.target.nextElementSibling;\n        if (inputField) {\n          inputField.focus();\n        }\n      });\n    },\n    async stopEditingName(i, label) {\n      if (!this.canWrite) {\n        return;\n      }\n      if (!label.newName || label.newName === '') {\n        label.newName = label.name;\n        this.internalLabels[i].editingName = false;\n        return;\n      }\n      if (this.existingNames.includes(label.newName)) {\n        label.newName = label.name;\n        this.internalLabels[i].editingName = false;\n      } else {\n        const params = {\n          dataset_id: this.dataset.id,\n          label_id: label.id,\n          label_index: label.index,\n          label_name: label.newName,\n          label_color: label.color,\n        };\n        await this.dsConn.updateLabel(params)\n          .then((data) => {\n            if (!data.error) {\n              this.internalLabels[i].editingName = false;\n              this.$emit('update-label');\n            } else {\n              label.newName = label.name;\n            }\n          })\n          .catch((e) => console.log(e));\n      }\n    },\n    startEditingColor(event, i) {\n      if (!this.canWrite) {\n        return;\n      }\n      this.internalLabels[i].editingColor = true;\n      this.$nextTick(() => {\n        const inputField = event.target.nextElementSibling;\n        if (inputField) {\n          inputField.focus();\n        }\n      });\n    },\n    async stopEditingColor(i, label, color) {\n      if (!this.canWrite) {\n        return;\n      }\n\n      if (!color || color === '') {\n        this.internalLabels[i].editingColor = false;\n        return;\n      }\n\n      const params = {\n        dataset_id: this.dataset.id,\n        label_id: label.id,\n        label_index: label.index,\n        label_name: label.name,\n        label_color: color,\n      };\n      await this.dsConn.updateLabel(params)\n        .then((data) => {\n          if (!data.error) {\n            this.internalLabels[i].editingColor = false;\n            this.$emit('update-label');\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    unfocus(event) {\n      this.$nextTick(() => {\n        const inputField = event.target;\n        if (inputField) {\n          inputField.blur();\n        }\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.label-li-container {\n  min-width: 360px;\n  max-width: 360px;\n  width: 360px;\n  padding: 0 10px;\n  margin: 10px 0;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  gap: 6px;\n}\n.space-between{\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.container-header {\n  display: flex;\n  align-items: center;\n  width: 100%;\n  font-weight: bold;\n  padding: 2px;\n}\n\n#copy-labels-button {\n  margin-left: 8px;\n  cursor: copy;\n}\n\n.table-scroll {\n  width: 100%;\n  max-height: 300px;\n  overflow-y: auto;\n}\n\n.table {\n  text-align: left;\n  padding:  0 10px;\n  border: 0px;\n  width: 100%;\n  border-collapse: collapse;\n  th {\n    padding: 0 5px;\n  }\n\n  td {\n    padding: 0 5px;\n\n    span {\n      display:inline-block;\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n\n    .text-input {\n      border: 1px solid #596073;\n      font-size: 16px;\n      padding: 0 !important;\n      padding-left: 5px !important;\n      margin: 0;\n      border-radius: 6px;\n      background: field;\n      font-style: italic;\n\n      &:focus {\n        border: 1px solid #250E81;\n        box-shadow: 0 0 0 1px #250E81, 0 0 3px #7c6eb3;\n      }\n    }\n\n    .label-index {\n      display: flex;\n      flex-direction: row;\n      justify-content: space-between;\n      align-items: center;\n      max-width: 80px;\n      width: 80px;\n      span, input {\n        width: 100%;\n        cursor:text\n      }\n    }\n\n    .label-name {\n      display: flex;\n      flex-direction: row;\n      justify-content: space-between;\n      align-items: center;\n      padding-right: 10px;\n      max-width: 140px;\n      width: 140px;\n      span, input {\n        width: 105px;\n        cursor:text\n      }\n    }\n\n    .delete-label-icon{\n      visibility: hidden;\n    }\n  }\n\n  td:hover {\n    .delete-label-icon{\n      visibility: visible;\n    }\n  }\n\n  tr {\n   height: 30px;\n   padding: 5px;\n  }\n\n  tr:hover {\n    border-radius: 8px;\n    background: var(--color-white-700);\n  }\n}\n</style>\n","import { render } from \"./DatasetCardLabelsPopper.vue?vue&type=template&id=1d7466e0&scoped=true\"\nimport script from \"./DatasetCardLabelsPopper.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetCardLabelsPopper.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetCardLabelsPopper.vue?vue&type=style&index=0&id=1d7466e0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1d7466e0\"]])\n\nexport default __exports__","import { render } from \"./DatasetCard.vue?vue&type=template&id=daaed484&scoped=true\"\nimport script from \"./DatasetCard.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetCard.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetCard.vue?vue&type=style&index=0&id=daaed484&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-daaed484\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"mergeDatasetModal\"\n    :title=\"'Copy Datasets'\"\n  >\n    <template #modal-main>\n      <form\n        id=\"copy-form\"\n        class=\"form container scrollbar\"\n        novalidate\n        @change=\"handleFormChange\"\n        @submit.prevent=\"\"\n      >\n        <div class=\"copy-card\">\n          <h3>Source</h3>\n          <div class=\"row\">\n            <div class=\"col-3 settings__control-group\">\n              <label class=\"required\">Project</label>\n              <select\n                id=\"project-select\"\n                v-model=\"project\"\n                class=\"select\"\n                :disabled=\"lockSource\"\n                required\n                @change=\"selectedProjectChange(project)\"\n              >\n                <option :key=\"'project-select-null'\" disabled :value=\"''\">\n                  Select a Project\n                </option>\n                <option v-for=\"option in projectList\" :key=\"`project-select-${option.id}`\" :value=\"option\">\n                  {{ option.name }}\n                </option>\n              </select>\n            </div>\n          </div>\n          <div class=\"row mt-3\">\n            <div class=\"col-3 settings__control-group\">\n              <label class=\"required\">Dataset</label>\n              <select\n                id=\"source-DS-select\"\n                v-model=\"sourceDS\"\n                class=\"select\"\n                :class=\"{error: hasError && !sourceParams.dataset_id}\"\n                :disabled=\"lockSource\"\n                required\n              >\n                <option :key=\"'source-select-null'\" disabled :value=\"''\">Select a Dataset</option>\n                <option v-for=\"option in sourceDatasets\" :key=\"`source-select-${option.id}`\" :value=\"option\">\n                  {{ option.name }}\n                </option>\n              </select>\n            </div>\n            <div v-if=\"sourceDS?.groups && sourceDS.groups.length > 0 && !copySequences\" class=\"col-3 settings__control-group\">\n              <label>Group</label>\n              <select\n                id=\"source-group-select\"\n                v-model=\"sourceGroup\"\n                class=\"select\"\n                required\n              >\n                <option :key=\"'source-group-null'\" :value=\"''\">All Groups</option>\n                <option v-for=\"option in sourceDS.groups\" :key=\"`source-group-${option.id}`\" :value=\"option\">\n                  {{ option.name }}\n                </option>\n              </select>\n            </div>\n            <div class=\"col-6 settings__control-group\">\n              <label>Annotation Set</label>\n              <AnnotationSetsRadioSelect\n                :id=\"'copyDS-source'\"\n                v-model=\"sourceAnnset\"\n                :annotationSets=\"sourceDS ? sourceDS.annotation_sets : null\"\n                class=\"annotation-set-select\"\n              />\n            </div>\n          </div>\n          <div class=\"row mt-3\">\n            <v-checkbox\n              v-model=\"copyAnnSetForDuplicate\"\n              color=\"#250e81\"\n              :hide-details=\"true\"\n              :density=\"'compact'\"\n            >\n              <template #label>\n                <span class=\"checkbox-text-label\">Copy Annotations For Duplicate Images</span>\n                <SVGIcon\n                  v-tooltip=\"`Normally, duplicate images and their annotations are not copied.\n                  This option allows copying annotation for images that already exist in the destination.`\"\n                  :width=\"'20px'\"\n                  :height=\"'20px'\"\n                  :iconName=\"'info'\"\n                  class=\"help-icon\"\n                />\n              </template>\n            </v-checkbox>\n          </div>\n          <div class=\"row mt-1\">\n            <v-checkbox\n              v-model=\"onlyAnnotations\"\n              color=\"#250e81\"\n              :hide-details=\"true\"\n              :density=\"'compact'\"\n            >\n              <template #label>\n                <span class=\"checkbox-text-label\">Copy Selected Annotation Types Only</span>\n                <SVGIcon\n                  v-tooltip=\"`Only selected annotation types will be copied.\n                  'Copy Annotations For Duplicate Images' should be selected if destination is in the same dataset as source`\"\n                  :width=\"'20px'\"\n                  :height=\"'20px'\"\n                  :iconName=\"'info'\"\n                  class=\"help-icon\"\n                />\n              </template>\n            </v-checkbox>\n          </div>\n          <div v-if=\"onlyAnnotations\" class=\"row ml-3 mt-1\">\n            <div class=\"col-12 annotation-grid\">\n              <v-checkbox\n                v-for=\"(type,i) in annotationTypes\"\n                :key=\"i\"\n                v-model=\"filterTypes\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n                :value=\"type\"\n              >\n                <template #label>\n                  <span class=\"checkbox-text-label\">{{ getTypeDisplayString(type) }}</span>\n                </template>\n              </v-checkbox>\n            </div>\n          </div>\n          <div class=\"row mt-1\">\n            <v-checkbox\n              v-model=\"copySequences\"\n              color=\"#250e81\"\n              :hide-details=\"true\"\n              :density=\"'compact'\"\n            >\n              <template #label>\n                <span class=\"checkbox-text-label\">Copy Sequences Only</span>\n                <SVGIcon\n                  v-tooltip=\"`Copy all sequences in selected datasets. Copy Annotations For Duplicate Images and Copy Selected Annotation Types will be ignored if this option is selected.`\"\n                  :width=\"'20px'\"\n                  :height=\"'20px'\"\n                  :iconName=\"'info'\"\n                  class=\"help-icon\"\n                />\n              </template>\n            </v-checkbox>\n          </div>\n          <div v-if=\"showFilters && !copySequences\" class=\"row mt-1\">\n            <div class=\"col-12\">\n              <v-expansion-panels\n                v-model=\"panels\"\n                multiple\n                class=\"mt-2\"\n              >\n                <v-expansion-panel\n                  value=\"description\"\n                >\n                  <v-expansion-panel-title>\n                    <h3>Source Dataset Filters</h3>\n                  </v-expansion-panel-title>\n                  <v-expansion-panel-text>\n                    <DatasetFilter\n                      v-model=\"datasetFilters\"\n                      :dataset=\"sourceDS\"\n                      :annotationSets=\"sourceDS.annotation_sets\"\n                      :labels=\"sourceDS.labels\"\n                      :types=\"sourceDS.annotation_types\"\n                    />\n                  </v-expansion-panel-text>\n                </v-expansion-panel>\n              </v-expansion-panels>\n            </div>\n          </div>\n          <hr class=\"mt-3\">\n          <h3 class=\"destination-header\">\n            Destination Dataset(s)\n            <IconButton\n              v-tooltip=\"`Add a Destination Dataset. Copy will split the source images between destination datasets according to the percentage input field`\"\n              class=\"add-dataset-icon\"\n              :icon=\"'add'\"\n              :width=\"24\"\n              :height=\"24\"\n              :type=\"''\"\n              :disabled=\"copySequences\"\n              @click.stop=\"addNewDestDS\"\n            />\n          </h3>\n          <div class=\"row dest-set-selector-container scrollbar\">\n            <template\n              v-for=\"(dataset, i) in chosenDestDatasetAnnset\"\n              :key=\"dataset.d ? `dest-${dataset.d.id}` : `dest-null`\"\n            >\n              <div class=\"col-12\">\n                <div class=\"row dest-set-selector\">\n                  <div class=\"col-3 settings__control-group\">\n                    <select\n                      id=\"dest-DS-select\"\n                      v-model=\"dataset.d\"\n                      class=\"select\"\n                      :class=\"{error: hasError && invalidDestinationsIndexes.includes(i)}\"\n                      required\n                    >\n                      <option :key=\"'dest-select-null'\" disabled :value=\"''\">Select a Dataset</option>\n                      <option v-for=\"option in datasets\" :key=\"`dest-select-${option.id}`\" :value=\"option\">\n                        {{ option.name }}\n                      </option>\n                    </select>\n                  </div>\n                  <div v-show=\"dataset.d.groups && dataset.d.groups.length > 0 && !copySequences\" class=\"col-3 settings__control-group\">\n                    <select\n                      :id=\"`dest-group-select-${i}`\"\n                      v-model=\"dataset.group_id\"\n                      class=\"select\"\n                      required\n                    >\n                      <option :key=\"'destination-group-null'\" :value=\"''\">Ungrouped</option>\n                      <option v-for=\"option in dataset.d.groups\" :key=\"`destination-group-${option.id}`\" :value=\"option.id\">\n                        {{ option.name }}\n                      </option>\n                    </select>\n                  </div>\n                  <div class=\"col-3 settings__control-group\">\n                    <AnnotationSetsRadioSelect\n                      :id=\"'copyDS-dest'\"\n                      v-model=\"dataset.set\"\n                      :annotationSets=\"dataset.d ? dataset.d.annotation_sets : null\"\n                      class=\"annotation-set-select\"\n                    />\n                  </div>\n                  <div class=\"col settings__control-group me-1\">\n                    <div class=\"percent-input\">\n                      <input\n                        v-model=\"dataset.percent\"\n                        :min=\"0\"\n                        :max=\"100\"\n                        type=\"number\"\n                        class=\"random-input\"\n                        :class=\"{error: hasError && !isDestinationSplitValid}\"\n                        @change=\"changeSanitizer\"\n                        @input=\"inputSanitizer\"\n                      >\n                      %\n                      <IconButton\n                        class=\"remove-dest-ds-button ms-3\"\n                        :icon=\"'close'\"\n                        :width=\"20\"\n                        :height=\"20\"\n                        @click=\"removeDestDS(dataset)\"\n                      />\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </template>\n          </div>\n        </div>\n      </form>\n      <div v-if=\"awaitMergerResult || message\" class=\"row mb-3 result-container\">\n        <div v-if=\"awaitMergerResult\" class=\"info\">\n          <div class=\"loader merger-loader\" />\n          <span><pre>This operation may take a few minutes.</pre></span>\n        </div>\n        <div v-if=\"message && !awaitMergerResult\" class=\"result\" :class=\"[success ? 'info' : 'error']\">\n          <span><pre>{{ message }}</pre></span>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <div>\n          <button\n            class=\"button modal-action-button\"\n            :disabled=\"awaitMergerResult ? true : false || (destinationParams && destinationParams[0] === null)\"\n            @click=\"copySequences ? applyCopySequences() : applyCopy()\"\n          >\n            Apply\n          </button>\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport { inputSanitizer, changeSanitizer } from '@/assets/js/utils';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport DatasetFilter from '@/components/DatasetComponent/DatasetFilters/DatasetFilter.vue';\nimport useAnnotationType from '@/composables/useAnnotationType.js';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport { useToast } from 'vue-toast-notification';\nimport AnnotationSetsRadioSelect from '../AnnotationSetsRadioSelect.vue';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nexport default {\n  name: 'DatasetCopyModal',\n  components: {\n    Modal,\n    AnnotationSetsRadioSelect,\n    IconButton,\n    DatasetFilter,\n    SVGIcon,\n  },\n  props: {\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n    source: {\n      type: Object,\n      default: () => {},\n    },\n    filters: {\n      type: Object,\n      default: null,\n    },\n    showFilters: {\n      type: Boolean,\n      default: true,\n    },\n    lockSource: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'clear-copy', 'copy-complete', 'copy-in-progress',\n  ],\n  setup() {\n    const {\n      getTypeDisplayString,\n    } = useAnnotationType();\n    return {\n      getTypeDisplayString,\n    };\n  },\n  data() {\n    return {\n      dataConnect: null,\n      project: '',\n      sourceDatasets: [],\n      sourceDS: '',\n      sourceGroup: '',\n      sourceAnnset: {},\n      awaitMergerResult: false,\n      success: false,\n      message: \"\",\n      random: 100,\n      chosenDestDatasetAnnset: [{\n        d: '',\n        group_id: '',\n        set: {},\n        percent: 100,\n      }],\n      panels: [],\n      datasetFilters: {},\n      copyAnnSetForDuplicate: false,\n      onlyAnnotations: false,\n      filterTypes: [],\n      annotationTypes: null,\n      copySequences: false,\n    };\n  },\n  computed: {\n    username() {\n      return this.$store.state.user.user.username;\n    },\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    hasError() {\n      return this.message && !this.success;\n    },\n    sourceDatasetLabels() {\n      const sourceDatasetLabels = this.sourceDS?.labels;\n      if (sourceDatasetLabels) {\n        return sourceDatasetLabels;\n      }\n      return [];\n    },\n    destinationParams() {\n      const params = this.chosenDestDatasetAnnset.map((dest) => {\n        const destParams = {\n          dataset_id: dest.d.id,\n          percent: dest.percent,\n        };\n        if (dest.set) {\n          destParams.annotation_set_id = dest.set.id;\n        }\n        if (dest.group_id) {\n          destParams.group_id = dest.group_id;\n        }\n\n        if (dest.d.id) {\n          return destParams;\n        } else {\n          return null;\n        }\n      });\n      return params;\n    },\n    sourceParams() {\n      const params = {};\n\n      if (this.sourceDS) {\n        params.dataset_id = this.sourceDS.id;\n      }\n      if (this.sourceGroup) {\n        params.dataset_group_id_src = this.sourceGroup.id;\n      }\n      if (this.sourceAnnset) {\n        params.annotation_set_id_src = this.sourceAnnset.id;\n      }\n\n      return params;\n    },\n    filterParams() {\n      if (this.filters) {\n        return this.filters;\n      }\n\n      const params = {\n        images_filter: {},\n        image_files_filter: {},\n        annotations_filter: {},\n        image_review_status_filter: {},\n        image_tags_filter: {},\n      };\n\n      // Images filter\n      if (this.datasetFilters.groupsFilter && this.datasetFilters.groupsFilter.length > 0) {\n        params.images_filter.group_ids = this.datasetFilters.groupsFilter;\n      }\n\n      // Image files filter\n      if (this.datasetFilters.imageNameFilter && this.datasetFilters.imageNameFilter.length > 0) {\n        params.image_files_filter.image_name = this.datasetFilters.imageNameFilter;\n      }\n      if (this.datasetFilters.timeRangeFilter) {\n        params.image_files_filter.lower_time = this.datasetFilters.timeRangeFilter[0];\n        params.image_files_filter.upper_time = this.datasetFilters.timeRangeFilter[1];\n      }\n      if (this.datasetFilters.dateRangeFilter) {\n        if (this.datasetFilters.dateRangeFilter[0]) {\n          params.image_files_filter.lower_date = new Date(this.datasetFilters.dateRangeFilter[0]).toISOString();\n        }\n        if (this.datasetFilters.dateRangeFilter[1]) {\n          params.image_files_filter.upper_date = new Date(this.datasetFilters.dateRangeFilter[1]).toISOString();\n        }\n      }\n      if (this.datasetFilters.cameraSourceFilter && this.datasetFilters.cameraSourceFilter.length > 0) {\n        params.image_files_filter.image_sources = this.datasetFilters.cameraSourceFilter;\n      }\n\n      // Annotations filter\n      if (this.datasetFilters.confidenceRangeFilter) {\n        params.annotations_filter.lower_score = this.datasetFilters.confidenceRangeFilter[0];\n        params.annotations_filter.upper_score = this.datasetFilters.confidenceRangeFilter[1];\n      }\n      if (this.datasetFilters.annotationTypeFilter && this.datasetFilters.annotationTypeFilter.length > 0) {\n        params.annotations_filter.types = this.datasetFilters.annotationTypeFilter;\n      }\n      if (this.datasetFilters.annotationSetFilter && this.datasetFilters.annotationSetFilter.length > 0) {\n        params.annotations_filter.annotation_set_ids = this.datasetFilters.annotationSetFilter.map((set) => set.id);\n      }\n      if (this.datasetFilters.imagesWithAnnotationSetFilter && this.datasetFilters.imagesWithAnnotationSetFilter.length > 0) {\n        params.annotations_filter.images_with_annotation_set_ids = this.datasetFilters.imagesWithAnnotationSetFilter.map((set) => set.id);\n      }\n      if (this.datasetFilters.annotationLabelFilter && this.datasetFilters.annotationLabelFilter.length > 0) {\n        params.annotations_filter.images_with_annotation_label_indexes = this.datasetFilters.annotationLabelFilter;\n      }\n      if (this.datasetFilters.boundingBoxSizeFilter) {\n        Object.entries(this.datasetFilters.boundingBoxSizeFilter).forEach(([key, value]) => {\n          if (key !== 'type' && value) {\n            params.annotations_filter[`${key}_${this.datasetFilters.boundingBoxSizeFilter.type}`] = value;\n          }\n        });\n      }\n\n      // Tags\n      if (this.datasetFilters.imageTagFilter && this.datasetFilters.imageTagFilter.length > 0) {\n        params.image_tags_filter.tag_names = this.datasetFilters.imageTagFilter.map((tag) => tag.name);\n      }\n\n      if (Object.keys(params.image_tags_filter).length === 0) {\n        delete params.image_tags_filter;\n      }\n\n      return params;\n    },\n    isDestinationSplitValid() {\n      const destinationSum = this.chosenDestDatasetAnnset.map((dest) => dest.percent).reduce((a, b) => a + b, 0);\n      if (destinationSum > 100) {\n        return false;\n      }\n      return true;\n    },\n    invalidDestinations() {\n      return this.destinationParams.filter((dest) => !dest.dataset_id);\n    },\n    invalidDestinationsIndexes() {\n      return this.invalidDestinations.map((dest) => this.destinationParams.indexOf(dest));\n    },\n  },\n  watch: {\n    sourceDS: {\n      deep: true,\n      async handler() {\n        if (this.sourceDS) {\n          this.getAnnotationTypes(this.sourceDS.id);\n        }\n      },\n    },\n    copySequences() {\n      if (this.copySequences) {\n        if (this.chosenDestDatasetAnnset.length > 0) {\n          const temp = [...this.chosenDestDatasetAnnset];\n          this.chosenDestDatasetAnnset = [temp[0]];\n        }\n      }\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  async mounted() {\n    if (this.source) {\n      this.project = this.projectList.find((p) => p.id === this.source.project_id);\n      this.sourceDatasets = this.datasets;\n      this.sourceDS = this.sourceDatasets.find((ds) => this.source.id === ds.id);\n      this.sourceGroup = '';\n      this.sourceAnnset = {};\n      if (this.sourceDS && this.sourceDS.id) {\n        this.getAnnotationTypes(this.sourceDS.id);\n      }\n    }\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    async getAnnotationTypes(ds_id) {\n      await this.dataConnect.getDatasetAnnotationTypes({ dataset_id: ds_id })\n        .then((resp) => {\n          if (resp.error) {\n            throw resp.error;\n          }\n          this.annotationTypes = resp.result;\n          this.filterTypes = resp.result;\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n    },\n    async getDatasets(project) {\n      const params = {\n        project_id: project.id,\n        get_annotation_sets: true,\n        get_labels: true,\n        get_groups: true,\n      };\n      const resp = await this.dataConnect.getDatasetList(params)\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        // TODO: handle error\n        if (resp.error) console.error(resp.error);\n        return [];\n      }\n      return resp.result;\n    },\n    async selectedProjectChange(p) {\n      if (p) {\n        this.sourceDS = '';\n        this.sourceGroup = '';\n        this.sourceAnnset = {};\n        this.sourceDatasets = await this.getDatasets(p);\n      }\n    },\n    showModal() {\n      this.$refs.mergeDatasetModal.showModal();\n    },\n    closeModal() {\n      this.$refs.mergeDatasetModal.closeModal();\n    },\n    addNewDestDS() {\n      this.chosenDestDatasetAnnset.push({\n        d: '',\n        group_id: '',\n        set: {},\n        percent: 100,\n      });\n    },\n    removeDestDS(ds) {\n      const index = this.chosenDestDatasetAnnset.indexOf(ds);\n      if (index > -1) {\n        this.chosenDestDatasetAnnset.splice(index, 1);\n      }\n    },\n\n    async applyCopySequences() {\n      if (!this.sourceParams.dataset_id) {\n        this.message = `Error: Please select Source dataset`;\n        this.success = false;\n        return;\n      }\n\n      if (!this.destinationParams[0].dataset_id) {\n        this.message = `Error: Please select Destination dataset`;\n        this.success = false;\n        return;\n      }\n\n      if (this.sourceParams.annotation_set_id_src && !this.destinationParams[0].annotation_set_id) {\n        this.message = `Error: Destination annotation set is required if Source annotation set is selected`;\n        this.success = false;\n        return;\n      }\n\n      await this.dataConnect.copySequences({\n        sequences: [],\n        dataset_id: this.sourceParams.dataset_id,\n        source_annotation_set_id: this.sourceParams.annotation_set_id_src,\n        dest_dataset_id: this.destinationParams[0].dataset_id,\n        dest_annotation_set_id: this.destinationParams[0].annotation_set_id,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error.message);\n          } else if (resp.result) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Copying in progress`,\n              type: \"success\",\n              position: \"top\",\n            });\n            this.$emit('copy-in-progress', this.chosenDestDatasetAnnset[0].d);\n            this.closeModal();\n          }\n        })\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to Copy\\n${error.message}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n    },\n    async applyCopy() {\n      const params = {\n        dest: this.destinationParams,\n        ...this.sourceParams,\n        ...this.filterParams,\n        should_copy_annset_for_duplicate: this.copyAnnSetForDuplicate,\n      };\n\n      if (!params.dataset_id) {\n        this.message = `Error: Please select Source dataset`;\n        this.success = false;\n        return;\n      }\n\n      if (params.dest.length === 0 || this.invalidDestinations.length > 0) {\n        this.message = `Error: Please select Destination dataset`;\n        this.success = false;\n        return;\n      }\n\n      if (!this.isDestinationSplitValid) {\n        this.message = `Error: Total destination percentage can not exceed 100`;\n        this.success = false;\n        return;\n      }\n\n      if (this.filterTypes && this.filterTypes.length > 0) {\n        params.filter_types = this.filterTypes;\n      }\n\n      this.awaitMergerResult = true;\n      await this.dataConnect.copyDataset(params)\n        .then((response) => {\n          if (response.result) {\n            const result = response.result;\n            if (result && result.id) {\n              $toast.open({\n                queue: true,\n                duration: 5000,\n                message: `Copying in progress`,\n                type: \"success\",\n                position: \"top\",\n              });\n              this.$store.commit('tasks/addNewUploadTask', result);\n              this.closeModal();\n            }\n            this.chosenDestDatasetAnnset = [{\n              d: '',\n              group_id: '',\n              set: {},\n              percent: 100,\n            }];\n            this.success = true;\n          } else if (response.error) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Error: ${response.error.message}`,\n              type: \"error\",\n              position: \"top\",\n            });\n          } else {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Error Copying data`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n          this.awaitMergerResult = false;\n          this.$store.commit('notifications/updateNotifications', true);\n        })\n        .catch((e) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Error: ${e}`,\n            type: \"error\",\n            position: \"top\",\n          });\n          this.awaitMergerResult = false;\n        });\n    },\n    clearMessage() {\n      this.success = false;\n      this.message = \"\";\n    },\n    handleFormChange() {\n      this.clearMessage();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n#copy-form {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  padding: 0 3rem;\n  margin: 0.75rem 0;\n  overflow: auto;\n  position: relative;\n}\n\n.copy-card {\n  display: flex;\n  flex-direction: column;\n  background: var(--color-white-100);\n  padding: 12px;\n  border-radius: 8px;\n  border: 1px solid var(--color-primary-100);\n  min-width: 850px;\n}\n\n.help-tooltip {\n  position: absolute;\n  top: 1rem;\n  right: 3.25rem;\n}\n\n.tooltip-text{\n  span {\n    width: 100%;\n    word-wrap: break-word;\n  }\n}\n\n.dest-set-selector-container {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  padding-top: 4px;\n}\n\n.dest-set-selector {\n  .annotation-set-select {\n    margin-top: auto;\n    margin-bottom: auto;\n  }\n\n  .percent-input {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    margin-left: auto;\n    width: 120px;\n    min-width: 120px;\n    height: 100%;\n  }\n\n  .remove-dest-ds-button {\n    margin-right: 10px;\n    visibility: hidden;\n  }\n\n  &:hover {\n    background-color: rgb(237, 232, 232);\n  }\n\n  &:hover .remove-dest-ds-button {\n      z-index: 3;\n    visibility: visible;\n    @include themify() {\n      color: themed('icon-color-inactive');\n    }\n  }\n\n  &:hover .remove-dest-ds-button:hover {\n      z-index: 3;\n    visibility: visible;\n    @include themify() {\n      color: themed('icon-color-primary');\n    }\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 3px 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.result-container {\n  justify-content: center;\n}\n\n.success {\n  text-align: left;\n  @include themify() {\n    background: rgba(115, 206, 115, 0.5) ;\n    color: themed('color-success');\n    border: 1px solid themed('color-success');\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error');\n    border: 1px solid themed('color-error');\n  }\n}\n\n.info {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  text-align: center;\n  padding: 5px 0;\n  @include themify() {\n    background: rgba(230, 221, 239, 0.5) ;\n    color: var(--color-primary-500);\n    border: 1px solid var(--color-primary-500);\n  }\n}\n\n.merger-loader {\n  width: 60px !important;\n  height: 60px !important;\n}\n\n.random-input {\n  width: 70px;\n  height: 30px;\n  background: #ffffff;\n  border-radius: 5px;\n  font-size: 1rem;\n  padding: 3px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  align-self: center;\n  -webkit-appearance: auto;\n  @include themify() {\n    border: 1px solid themed('text-input-border-color');\n  }\n}\n\n.destination-header {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n\n  .add-dataset-icon {\n    visibility: visible;\n    margin-left: 6px;\n    @include themify() {\n      color: themed('icon-color-inactive');\n    }\n  }\n\n  .add-dataset-icon:hover {\n    @include themify() {\n      color: themed('icon-color-primary');\n    }\n  }\n\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0rem 3rem 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.settings__control-group {\n  align-items: flex-start;\n  :deep(.filter-button) {\n    width: 100%;\n    height: 100%;\n  }\n}\n\n.checkbox-text-label {\n  margin-left: 10px;\n  font-size: 14px;\n  font-weight: 600;\n  color: #000000;\n}\n\n.annotation-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, 180px);\n  width: 100%;\n  gap: 5px;\n  padding: 5px;\n  max-height: 500px;\n  overflow-y: auto;\n}\n\n.help-icon {\n  margin: 0 5px;\n  color: var(--color-primary);\n}\n\n.help-icon:focus {\n  outline: none;\n}\n\n</style>\n","<template>\n  <FilterPopper :appendToBody=\"true\">\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"name\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div\n        v-if=\"annotationSets && annotationSets.length > 0\"\n        ref=\"checkboxContainer\"\n        class=\"filter-settings scrollbar\"\n      >\n        <div v-for=\"(task, i) in annotationSets\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`annset-${id}-${i}`\"\n            v-model=\"selectedSet\"\n            type=\"radio\"\n            :name=\"`${task.name}-${i}`\"\n            :value=\"task\"\n          >\n          <label :for=\"`annset-${id}-${i}`\">{{ task.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        <span>Please define an annotation set.</span>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"AnnotationSetsRadioSelect\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    name: {\n      type: String,\n      default: () => 'Annotation Set',\n    },\n    error: {\n      type: Boolean,\n      default: false,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Object,\n      default: () => {},\n    },\n    id: {\n      type: String,\n      default: '',\n    },\n    restore: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedSet: {},\n    };\n  },\n  computed: {\n    isActive() {\n      if (this.selectedSet) {\n        return Object.keys(this.selectedSet).length > 0;\n      }\n      return false;\n    },\n    tagValue() {\n      if (this.selectedSet) {\n        return this.selectedSet?.name;\n      }\n      return '';\n    },\n  },\n  watch: {\n    selectedSet() {\n      this.updateFilters();\n    },\n    annotationSets() {\n      if ((this.annotationSets && this.annotationSets.length === 0) || (this.annotationSets && this.selectedSet && !this.annotationSets.find((e) => e.id === this.selectedSet.id))) {\n        this.selectedSet = {};\n      }\n    },\n    restore: {\n      handler(r) {\n        if (this.restore) {\n          this.selectedSet = this.restore;\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.selectedSet !== this.modelValue) {\n      this.selectedSet = this.modelValue;\n    }\n    if ((this.annotationSets && this.annotationSets.length === 0) || (this.annotationSets && this.selectedSet && !this.annotationSets.find((e) => e.id === this.selectedSet.id))) {\n      this.selectedSet = {};\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedSet);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n:deep(.filter-tag) {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0 6px;\n  height: 18px;\n  max-width: 300px !important;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  gap: 6px;\n  overflow: auto;\n  min-width: 140px;\n  text-wrap: nowrap;\n\n  &__row {\n    display: flex;\n    align-items: center;\n\n    label {\n      margin-left: 5px;\n    }\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n}\n</style>\n","import { render } from \"./AnnotationSetsRadioSelect.vue?vue&type=template&id=db7badea&scoped=true\"\nimport script from \"./AnnotationSetsRadioSelect.vue?vue&type=script&lang=js\"\nexport * from \"./AnnotationSetsRadioSelect.vue?vue&type=script&lang=js\"\n\nimport \"./AnnotationSetsRadioSelect.vue?vue&type=style&index=0&id=db7badea&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-db7badea\"]])\n\nexport default __exports__","import { render } from \"./DatasetCopyModal.vue?vue&type=template&id=5867f160&scoped=true\"\nimport script from \"./DatasetCopyModal.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetCopyModal.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetCopyModal.vue?vue&type=style&index=0&id=5867f160&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5867f160\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createDatasetModal\"\n    :title=\"'Create New Dataset'\"\n    :width=\"'600px'\"\n    @closed=\"clearData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mt-2\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"label required\">Name</label>\n            <input\n              v-model=\"createNewName\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"createNewDescription\"\n              rows=\"2\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button class=\"button\" @click=\"createDataset\">Create</button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'DatasetCreateModal',\n  components: {\n    Modal,\n  },\n  emits: {\n    'create-dataset': null,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      createNewName: '',\n      createNewDescription: '',\n      message: null,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n  },\n  methods: {\n    showModal() {\n      this.$refs.createDatasetModal.showModal();\n    },\n    clearData() {\n      this.createNewName = '';\n      this.createNewDescription = '';\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.createDatasetModal.closeModal();\n    },\n    createDataset() {\n      if (!this.createNewName || this.createNewName === \"\") {\n        this.message = 'Missing dataset name';\n        return;\n      }\n      const args = {\n        name: this.createNewName,\n        description: this.createNewDescription,\n      };\n      this.$emit('create-dataset', args);\n      this.closeModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.close-button {\n  @include themify() {\n    background: themed('button-secondary');\n    color: themed('button-secondary-text');\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n</style>\n","import { render } from \"./DatasetCreateModal.vue?vue&type=template&id=fb61bce4&scoped=true\"\nimport script from \"./DatasetCreateModal.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetCreateModal.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetCreateModal.vue?vue&type=style&index=0&id=fb61bce4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-fb61bce4\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"updateDatasetModal\"\n    :title=\"'Update Dataset'\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Name</label>\n            <input\n              v-model=\"name\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"description\"\n              rows=\"4\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button class=\"button button-sm\" @click=\"apply\">{{ 'Apply Changes' }}</button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '../../Modal.vue';\n\nexport default {\n  name: 'DatasetUpdateModal',\n  components: {\n    Modal,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: {\n    'edit-dataset': null,\n  },\n  data() {\n    return {\n      name: '',\n      description: '',\n    };\n  },\n  watch: {\n    dataset: {\n      deep: true,\n      handler(d) {\n        if (d) {\n          this.name = d.name;\n          this.description = d.description;\n        }\n      },\n    },\n  },\n  methods: {\n    showModal() {\n      this.$refs.updateDatasetModal.showModal();\n    },\n    closeModal() {\n      this.name = \"\";\n      this.description = \"\";\n      this.$refs.updateDatasetModal.closeModal();\n    },\n    apply() {\n      if (this.name) {\n        this.$emit('edit-dataset', {\n          name: this.name, description: this.description, dataset_id: this.dataset.id, docker_task_id: this.dataset.docker_task_id,\n        });\n      }\n      this.closeModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.close-button {\n  @include themify() {\n    background: themed('button-secondary');\n    color: themed('button-secondary-text');\n  }\n}\n</style>\n","import { render } from \"./DatasetUpdateModal.vue?vue&type=template&id=18ef476e&scoped=true\"\nimport script from \"./DatasetUpdateModal.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetUpdateModal.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetUpdateModal.vue?vue&type=style&index=0&id=18ef476e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-18ef476e\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"annSetCopyModal\"\n    :width=\"'650px'\"\n    :title=\"'Copy Annotations'\"\n    @closed=\"clearSourceDest\"\n  >\n    <template #modal-main>\n      <div class=\"form container\">\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Source Dataset</label>\n            <div class=\"dataset-selector\">\n              <select id=\"source-DS-select\" v-model=\"localSource\" class=\"select\">\n                <option :key=\"'source-select-null'\" disabled :value=\"null\">Select a Dataset</option>\n                <option v-for=\"option in datasets\" :key=\"`source-AS-select-${option.id}`\" :value=\"option\">\n                  {{ option.name }}\n                </option>\n              </select>\n              <AnnotationSetsRadioSelect\n                :id=\"'copyDS-source'\"\n                v-model=\"chosenSourceAnnotationSet\"\n                :annotationSets=\"localSource ? localSource.annotation_sets : null\"\n              />\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Destination Dataset</label>\n            <div class=\"dataset-selector\">\n              <select id=\"source-DS-select\" v-model=\"localSource\" class=\"select\">\n                <option :key=\"'source-select-null'\" disabled :value=\"null\">Select a Dataset</option>\n                <option v-for=\"option in datasets\" :key=\"`dest-AS-select-${option.id}`\" :value=\"option\">\n                  {{ option.name }}\n                </option>\n              </select>\n              <AnnotationSetsRadioSelect\n                :id=\"'copyDS-source'\"\n                v-model=\"chosenDestAnnotationSet\"\n                :annotationSets=\"localSource ? localSource.annotation_sets : null\"\n              />\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label><em>Only copy from annotation sets in the same dataset.</em></label>\n          </div>\n        </div>\n        <div class=\"row mt-3 result-container\">\n          <div v-if=\"awaitMergerResult\" class=\"loader merger-loader\" />\n          <div v-if=\"message && !awaitMergerResult\" class=\"result\" :class=\"[success ? 'success' : 'error']\">\n            <span>{{ message }}</span>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <div>\n          <button\n            class=\"button modal-action-button\"\n            :disabled=\"awaitMergerResult ? true : false\"\n            @click=\"applyCopy\"\n          >\n            Apply\n          </button>\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport '@vuepic/vue-datepicker/dist/main.css';\nimport Modal from '../../Modal.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\nimport AnnotationSetsRadioSelect from '../AnnotationSetsRadioSelect.vue';\n\nexport default {\n  name: 'AnnSetCopyModal',\n  components: {\n    Modal,\n    AnnotationSetsRadioSelect,\n  },\n  props: {\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n    sourceDataset: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: {\n    'clear-copy': null, 'copy-complete': null,\n  },\n  data() {\n    return {\n      localSource: null,\n      localDest: null,\n      awaitMergerResult: false,\n      success: false,\n      message: \"\",\n      dsConn: null,\n      chosenSourceAnnotationSet: {},\n      chosenDestAnnotationSet: {},\n    };\n  },\n  mounted() {\n    this.dsConn = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    // async getAnnotationSetsForSourceDataset() {\n    //   await this.dsConn.getAnnotationSets({ dataset_id: this.localSource.id })\n    //     .then((data) => {\n    //       this.localSourceAnnotationSets = data.result;\n    //     })\n    //     .catch((error) => {\n    //       console.log('Failed to retrieve sets:', error);\n    //     });\n    // },\n    // async getAnnotationSetsForDestDataset() {\n    //   await this.dsConn.getAnnotationSets({ dataset_id: this.localDest.id })\n    //     .then((data) => {\n    //       this.localDestAnnotationSets = data.result;\n    //     })\n    //     .catch((error) => {\n    //       console.log('Failed to retrieve sets:', error);\n    //     });\n    // },\n    showModal() {\n      this.$refs.annSetCopyModal.showModal();\n    },\n    clearSourceDest() {\n      this.message = \"\";\n      this.$emit('clear-copy');\n    },\n    async applyCopy() {\n      if (!this.localSource) {\n        this.message = `Error: Please select Source dataset`;\n        this.success = false;\n        return;\n      }\n      if (Object.keys(this.chosenSourceAnnotationSet) === 0) {\n        this.message = `Error: Please select Source annotation set`;\n        this.success = false;\n        return;\n      }\n      if (Object.keys(this.chosenDestAnnotationSet) === 0) {\n        this.message = `Error: Please select Destination annotation set`;\n        this.success = false;\n        return;\n      }\n      if (this.chosenSourceAnnotationSet.id === this.chosenDestAnnotationSet.id) {\n        this.message = `Error: Source and Destination sets must be different`;\n        this.success = false;\n        return;\n      }\n      this.awaitMergerResult = true;\n      const params = {\n        annotation_set_id_src: this.chosenSourceAnnotationSet.id,\n        annotation_set_id_dst: this.chosenDestAnnotationSet.id,\n      };\n      this.awaitMergerResult = true;\n      await this.dsConn.copyAnnotationSet(params)\n        .then((response) => {\n          if (response.result) {\n            this.message = response.result;\n            this.success = true;\n            this.$emit('copy-complete', params.annotation_set_id_dst);\n          } else if (response.error) {\n            this.message = `Error: ${response.error}`;\n            this.success = false;\n          } else {\n            this.message = `Error Copying data`;\n            this.success = false;\n          }\n          this.awaitMergerResult = false;\n        })\n        .catch((e) => {\n          this.message = `Error: ${e}`;\n          this.success = false;\n          this.awaitMergerResult = false;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.form {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.dataset-selector{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  width: 100%;\n\n  select {\n    width: 180px;\n    margin-right: 20px;\n  }\n\n  button {\n    width: 350px;\n  }\n}\n\n.merge-button {\n  height: 40px;\n  width: 80px;\n  border-radius: 6px;\n  padding: 2px 10px;\n  margin-top: 10px;\n  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 20%);\n  @include themify() {\n    background: themed('button-active');\n    color: themed('button-active-text');\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 3px 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.result-container {\n  justify-content: center;\n}\n\n.success {\n  @include themify() {\n    background: rgba(115, 206, 115, 0.5) ;\n    color: themed('color-succes');\n    outline: 1px solid themed('color-succes');\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error');\n    outline: 1px solid themed('color-error');\n  }\n}\n\n.merger-loader {\n  width: 60px !important;\n  height: 60px !important;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n</style>\n","import { render } from \"./AnnSetCopyModal.vue?vue&type=template&id=6b8ed6c2&scoped=true\"\nimport script from \"./AnnSetCopyModal.vue?vue&type=script&lang=js\"\nexport * from \"./AnnSetCopyModal.vue?vue&type=script&lang=js\"\n\nimport \"./AnnSetCopyModal.vue?vue&type=style&index=0&id=6b8ed6c2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6b8ed6c2\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createAnnotationSetModal\"\n    :title=\"'Create New Annotation Set'\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Name</label>\n            <input\n              ref=\"annSetName\"\n              v-model=\"name\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"description\"\n              rows=\"4\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"createAnnotationSet\"\n        >\n          Create New Set\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'CreateAnnotationSetModal',\n  components: {\n    Modal,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['annotation-set-created', 'annotation-set-created-error'],\n  data() {\n    return {\n      name: '',\n      description: '',\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    showModal() {\n      this.$refs.createAnnotationSetModal.showModal();\n      this.$nextTick(() => {\n        this.$refs.annSetName.focus();\n      });\n    },\n    async createAnnotationSet() {\n      if (!this.name) {\n        console.error('Missing name');\n        return;\n      }\n      const resp = await this.dataConnect.createAnnotationSet({\n        name: this.name,\n        description: this.description,\n        operator: this.user.username,\n        origin_x: 0,\n        origin_y: 0,\n        dataset_id: this.dataset.id,\n      })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        this.$emit('annotation-set-created-error', resp.error);\n      } else {\n        this.name = '';\n        this.description = '';\n        this.$refs.createAnnotationSetModal.closeModal();\n        this.$emit('annotation-set-created', resp.result);\n      }\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n</style>\n","import { render } from \"./CreateAnnotationSetModal.vue?vue&type=template&id=798861fc&scoped=true\"\nimport script from \"./CreateAnnotationSetModal.vue?vue&type=script&lang=js\"\nexport * from \"./CreateAnnotationSetModal.vue?vue&type=script&lang=js\"\n\nimport \"./CreateAnnotationSetModal.vue?vue&type=style&index=0&id=798861fc&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-798861fc\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"updateAnnotationSetModal\"\n    :title=\"'Annotation Set'\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Name</label>\n            <input\n              ref=\"annSetName\"\n              v-model=\"name\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"description\"\n              rows=\"4\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"updateAnnotationSet\"\n        >\n          Save\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'UpdateAnnotationSetModal',\n  components: {\n    Modal,\n  },\n  props: {\n    annotationSet: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['annotation-set-updated'],\n  data() {\n    return {\n      name: '',\n      description: '',\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    showModal() {\n      this.$refs.updateAnnotationSetModal.showModal();\n      if (this.annotationSet) {\n        this.name = this.annotationSet.name;\n        this.description = this.annotationSet.description;\n      }\n      this.$nextTick(() => {\n        this.$refs.annSetName.focus();\n      });\n    },\n    async updateAnnotationSet() {\n      if (!this.name) {\n        console.error('Missing name');\n        return;\n      }\n      const resp = await this.dataConnect.updateAnnotationSet({\n        annotation_set_id: this.annotationSet.id,\n        name: this.name,\n        description: this.description,\n      })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n\n      this.name = '';\n      this.description = '';\n      this.$refs.updateAnnotationSetModal.closeModal();\n      this.$emit('annotation-set-updated', resp.result);\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n</style>\n","import { render } from \"./UpdateAnnotationSetModal.vue?vue&type=template&id=985d4508&scoped=true\"\nimport script from \"./UpdateAnnotationSetModal.vue?vue&type=script&lang=js\"\nexport * from \"./UpdateAnnotationSetModal.vue?vue&type=script&lang=js\"\n\nimport \"./UpdateAnnotationSetModal.vue?vue&type=style&index=0&id=985d4508&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-985d4508\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"exportDatasetModal\"\n    :title=\"'Export Dataset'\"\n    @closed=\"clearInput\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mt-3 radio-group full-width-selector\">\n          <input\n            id=\"option-detection\"\n            v-model=\"exportMode\"\n            type=\"radio\"\n            name=\"mode-selector\"\n            :value=\"'detection'\"\n          ><label for=\"option-detection\">Detection</label>\n          <input\n            id=\"option-segmentation\"\n            v-model=\"exportMode\"\n            type=\"radio\"\n            name=\"mode-selector\"\n            :value=\"'segmentation'\"\n          ><label for=\"option-segmentation\">Segmentation</label>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Exporter Format</label>\n            <select\n              v-if=\"exportMode === 'detection'\"\n              id=\"type-select\"\n              v-model=\"type\"\n              class=\"select\"\n              required\n            >\n              <option :value=\"''\">Select Detection Export Format</option>\n              <option\n                v-for=\"(option, i) in detectionTypes\"\n                :key=\"`export-type-${i}`\"\n                :value=\"option.type\"\n                :disabled=\"option.type.includes('labelbox')\"\n              >\n                {{ option.name }}\n              </option>\n            </select>\n            <select\n              v-if=\"exportMode === 'segmentation'\"\n              id=\"type-select\"\n              v-model=\"type\"\n              class=\"select\"\n            >\n              <option disabled :value=\"null\">Select Segmentation Export Format</option>\n              <option\n                v-for=\"(option, i) in segmentationTypes\"\n                :key=\"`export-type-${i}`\"\n                :value=\"option.type\"\n                :disabled=\"option.type.includes('labelbox')\"\n              >\n                {{ option.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-6 settings__control-group align-items-start\">\n            <label>Annotation Sets</label>\n            <AnnotationSetsRadioSelect\n              v-model=\"annset\"\n              :annotationSets=\"exportDataset ? exportDataset.annotation_sets : null\"\n            />\n          </div>\n        </div>\n        <v-select\n          v-if=\"allSequences && allSequences.length > 0\"\n          v-model=\"selectedSequences\"\n          clearable\n          label=\"Sequences\"\n          :items=\"allSequences\"\n          item-title=\"name\"\n          item-value=\"id\"\n          multiple\n          variant=\"outlined\"\n          class=\"mt-3\"\n        />\n        <div class=\"row mt-3\">\n          <div class=\"col-6 settings__control-group\">\n            <label>Mode</label>\n            <select\n              v-model=\"exportSecondaryMode\"\n              class=\"select\"\n            >\n              <option :value=\"''\" disabled>Select a Mode</option>\n              <option v-if=\"selectedSequences.length === 0\" :value=\"'dataset'\" :disabled=\"exportDataset.numImages >= 10000\">Dataset</option>\n              <option v-if=\"allSequences && allSequences.length > 0\" :value=\"'sequences'\">Sequences Only</option>\n              <option v-if=\"selectedSequences.length === 0\" :value=\"'annotations'\">Annotations Only</option>\n              <option v-if=\"selectedSequences.length === 0\" :value=\"'images'\">Images URLs Only</option>\n            </select>\n          </div>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-3 align-items-flex-end\">\n          <div class=\"col-4\" />\n          <div class=\"col-8 action-buttons\">\n            <button\n              class=\"button button-sm button-secondary\"\n              @click=\"closeModal\"\n            >\n              Cancel\n            </button>\n            <a :href=\"`download_zip_s3?${downloadParams}`\" download>\n              <button\n                class=\"button button-sm\"\n                :disabled=\"!type || !exportSecondaryMode\"\n                @click=\"closeModal\"\n              >\n                Export\n              </button>\n            </a>\n          </div>\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\n\nimport Modal from '../../Modal.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\nimport { inputSanitizer, changeSanitizer } from '../../../assets/js/utils';\nimport AnnotationSetsRadioSelect from '../AnnotationSetsRadioSelect.vue';\n\nexport default {\n  name: 'DatasetExportModal',\n  components: {\n    Modal,\n    AnnotationSetsRadioSelect,\n  },\n  props: {\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n    exportDataset: {\n      type: Object,\n      default: () => {},\n    },\n    sequences: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: {\n    'export-started': null,\n  },\n  data() {\n    return {\n      message: \"\",\n      type: '',\n      imgFolder: \"\",\n      annset: {},\n      detectionTypes: [\n        {\n          name: 'Darknet',\n          type: 'darknet',\n        },\n        {\n          name: 'ModelPack',\n          type: 'modelpack',\n        },\n        // {\n        //   name: 'Labelbox (Under Development)',\n        //   type: 'labelbox',\n        // },\n      ],\n      segmentationTypes: [\n        {\n          name: 'Darknet Segment',\n          type: 'darknet-segment',\n        },\n        {\n          name: 'ModelPack Segment',\n          type: 'modelpack',\n        },\n        {\n          name: 'Segment Mask',\n          type: 'mask',\n        },\n        // {\n        //   name: 'CVAT (.json)',\n        //   type: 'cvat-json',\n        // },\n        // {\n        //   name: 'Labelbox Segment (Under Development)',\n        //   type: 'segment-labelbox',\n        // },\n      ],\n      exportMode: \"detection\",\n      exportSecondaryMode: \"dataset\",\n      selectedSequences: [],\n      allSequences: null,\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    downloadParams() {\n      let params = `dataset_id=${this.exportDataset.id}&export_type=${this.exportSecondaryMode}`;\n      if (Object.keys(this.annset).length > 0) {\n        params += `&annotation_set_id=${this.annset.id}`;\n      }\n      if (this.type) {\n        params += `&format=${this.type}`;\n      }\n      if (this.selectedSequences) {\n        const p = new URLSearchParams({ sequences: JSON.stringify(this.selectedSequences) });\n        params += `&${p.toString()}`;\n      }\n      return params;\n    },\n  },\n  watch: {\n    exportDataset: {\n      deep: true,\n      immediate: true,\n      handler(d) {\n        if (d) {\n          this.exportName = d?.name;\n        }\n      },\n    },\n    exportMode: {\n      handler() {\n        this.type = null;\n      },\n    },\n    selectedSequences: {\n      handler(s) {\n        if (s && s.length > 0) {\n          this.exportSecondaryMode = 'sequences';\n        } else {\n          this.exportSecondaryMode = '';\n        }\n      },\n    },\n    sequences() {\n      if (this.sequences && this.sequences.length > 0) {\n        this.selectedSequences = this.sequences.map((s) => s.id);\n        this.exportSecondaryMode = 'sequences';\n      }\n    },\n  },\n  mounted() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    async showModal() {\n      if (this.exportDataset.numImages >= 10000) {\n        this.exportSecondaryMode = 'annotations';\n      }\n      this.getSequencesForDataset();\n      this.$refs.exportDatasetModal.showModal();\n    },\n    closeModal() {\n      this.clearInput();\n      this.$refs.exportDatasetModal.closeModal();\n    },\n    clearInput() {\n      this.exportName = \"\";\n      this.type = null;\n      this.source = null;\n      this.annset = {};\n      this.message = \"\";\n      this.exportMode = \"detection\";\n      this.exportSecondaryMode = \"dataset\";\n      this.selectedSequences = [];\n    },\n    async getSequencesForDataset() {\n      const params = {\n        dataset_id: this.exportDataset.id,\n      };\n      await this.dataConnect.getSequences(params)\n        .then((data) => {\n          if (data.result) {\n            this.allSequences = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async apply() {\n      if (!this.type) {\n        this.message = \"Please select a type to convert to\";\n        return;\n      }\n\n      if (this.type.includes('labelbox')) {\n        this.message = \"Feature currently under development\";\n        return;\n      }\n\n      if (Object.keys(this.annset).length === 0) {\n        this.message = \"Please select an annotation set\";\n        return;\n      }\n\n      const params = {\n        type: this.type,\n        annotation_set_id: this.annset.id,\n        auto_remove: true,\n      };\n      if (this.isDebugMode) {\n        params['auto_remove'] = false;\n      }\n\n      await this.dataConnect.startExport(params)\n        .then((data) => {\n          if (data.result) {\n            this.$emit('export-started', data.result);\n            this.closeModal();\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 520px;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.save-img-check {\n  flex-direction: row !important;\n\n  label {\n    width: fit-content;\n    margin-right: 10px;\n  }\n\n  input {\n    height: 18px;\n    margin-top: 2px;\n    width: 18px;\n  }\n}\n\n.action-buttons {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 8px;\n}\n.radio-group {\n  display: inline-block;\n  margin: 20px;\n  border-radius: 5px;\n  overflow: hidden;\n  @include themify() {\n    border: solid 1px themed('color-primary');\n  }\n}\n\n.radio-group:focus-within, .radio-group:active {\n  @include themify() {\n    box-shadow:0 0 5px themed('color-primary');\n  }\n}\n\n.radio-group input[type=\"radio\"] {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n\n.radio-group input[type=\"radio\"] + label {\n  min-width: 6rem;\n  max-width: 50%;\n  text-align: center;\n  display: inline-block;\n  cursor: pointer;\n  font-weight: bold;\n  font-size: 1rem;\n  line-height: 1.25;\n  padding: 5px 20px;\n  transition: all 0.4s ease;\n  box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.25) inset;\n  @include themify() {\n    color: themed('color-primary');\n    background: themed('color-white-100');\n  }\n}\n\n.radio-group input[type=\"radio\"]:not(:disabled):hover + label {\n  @include themify() {\n    background: themed('color-primary-200');\n    color: themed('primary-text-color');\n  }\n}\n\n.radio-group input[type=\"radio\"]:checked + label,\n.radio-group input[type=\"radio\"]:checked:hover + label {\n  opacity: 1;\n  z-index: 1;\n  box-shadow: 0 0 6px -2px rgba(0, 0, 0, 0.25), 0 0 6px 2px rgba(0, 0, 0, 0.25);\n  @include themify() {\n    background: themed('color-primary');\n    color: themed('primary-text-color');\n  }\n}\n\n.radio-group.full-width-selector {\n  display: flex;\n  width: 100%;\n  margin: 0;\n}\n\n.radio-group.full-width-selector input[type=\"radio\"] + label {\n  min-width: 1px;\n  padding: 3px 10px;\n  flex: 1 1 auto;\n}\n</style>\n","import { render } from \"./DatasetExportModal.vue?vue&type=template&id=14d135d1&scoped=true\"\nimport script from \"./DatasetExportModal.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetExportModal.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetExportModal.vue?vue&type=style&index=0&id=14d135d1&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-14d135d1\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"uploadImagesModal\"\n    :title=\"'Import Dataset'\"\n    :persistent=\"importTypeSelected\"\n  >\n    <template #modal-main>\n      <div class=\"upload-images scrollbar\">\n        <div class=\"upload-images__drag-drop form\">\n          <input\n            id=\"file-input\"\n            ref=\"imageFiles\"\n            class=\"d-none\"\n            type=\"file\"\n            multiple\n            accept=\"image/*\"\n            @change=\"fileSelected\"\n          >\n          <button\n            v-if=\"uploadStatus !== 'uploading'\"\n            id=\"file-upload-btn\"\n            class=\"file-upload-btn\"\n            :class=\"{_highlight: dropHighlighted}\"\n            @click=\"chooseFiles\"\n            @dragenter.prevent=\"handleDragEnter\"\n            @dragover.prevent=\"\"\n            @dragleave=\"handleDragLeave\"\n            @drop=\"dropHighlighted = false\"\n            @drop.stop.prevent=\"handleDrop\"\n          >\n            <SVGIcon\n              id=\"upload-icon\"\n              class=\"file-upload-btn__upload-icon\"\n              :iconName=\"'cloud_upload'\"\n              :width=\"'100%'\"\n              :height=\"'200px'\"\n            />\n            <div id=\"file-upload-btn-text\" class=\"file-upload-btn__text\">\n              <span>Click to select images</span>\n              <span v-if=\"!isMobileDevice\">or drag and drop your images here</span>\n            </div>\n          </button>\n          <!-- <div v-if=\"uploadStatus === 'uploading'\" id=\"upload-progress\">\n            <span><strong>{{ uploadMessage }}...</strong></span>\n            <span>Block {{ blockNo + 1 }} of {{ blockCount }}</span>\n            <progress id=\"upload-progress-bar\" :value=\"blockNo + 1\" :max=\"blockCount\" />\n          </div>\n          <div v-if=\"uploadStatus === 'completed'\" id=\"upload-progress\" class=\"completed\">\n            <span><strong>{{ uploadMessage }}</strong></span>\n            <div id=\"upload-complete-icon\" v-html=\"success_check_icon\" />\n          </div>\n          <div v-if=\"uploadStatus === 'error'\" id=\"upload-progress\" class=\"error\">\n            <div>\n              <span><strong>{{ uploadMessage }}</strong></span>\n              <div id=\"upload-error-icon\" v-html=\"problem_icon\" />\n            </div>\n            <div v-if=\"uploadErrorMessage\" id=\"upload-error-msg\">\n              <span>{{ uploadErrorMessage }}</span>\n            </div>\n          </div> -->\n        </div>\n        <div class=\"separator my-3\">Or Custom Import</div>\n        <div class=\"form\">\n          <div class=\"row\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Import Type</label>\n              <select\n                id=\"type-select\"\n                v-model=\"selectedImportType\"\n                class=\"select\"\n                required\n              >\n                <option disabled :value=\"''\">Select an Import Type</option>\n                <option v-for=\"(option, i) in importTypes\" :key=\"`import-type-${i}`\" :value=\"option\">\n                  {{ option.label }}\n                </option>\n              </select>\n            </div>\n          </div>\n          <DefaultImportScriptForm\n            v-if=\"importTypeSelected\"\n            :datasetID=\"datasetID\"\n            :annotationSets=\"annotationSets\"\n            :importType=\"selectedImportType\"\n            @cancel=\"selectedImportType = ''\"\n            @upload-started=\"closeModal\"\n            @upload-complete=\"closeModal\"\n            @upload-error=\"(params) => $emit('upload-error', params)\"\n          />\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport DefaultImportScriptForm from '@/components/DatasetComponent/ImportForms/DefaultImportScriptForm.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'UploadImagesModal',\n  components: {\n    Modal,\n    SVGIcon,\n    DefaultImportScriptForm,\n  },\n  props: {\n    datasetID: {\n      type: Number,\n      default: null,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['upload-complete', 'refresh', 'upload-error'],\n  data() {\n    return {\n      isMobileDevice: window.matchMedia('(pointer: coarse)').matches || window.matchMedia('(pointer: none)').matches,\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      files: null,\n      blockSize: 0,\n      blockCount: 0,\n      blockNo: -1,\n      uploadStatus: 'idle',\n      uploadInProgress: false,\n      uploadMessage: '',\n      uploadErrorMessage: '',\n      dropHighlighted: false,\n      dragCounter: 0,\n      selectedImportType: \"\",\n      importTypes: [],\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    uploadFolderTasks() {\n      return this.$store.state.tasks.uploadTasks;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    importTypeSelected() {\n      if (this.selectedImportType) {\n        return Object.keys(this.selectedImportType).length > 0;\n      }\n      return false;\n    },\n    datasetName() {\n      const dataset = this.$store.state?.datasets?.datasetList.find((d) => d.id === this.datasetID);\n      return dataset.name;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    importParams() {\n      const importParams = {\n        import_type: 'images-folder',\n        dataset_id: this.datasetID,\n        dataset_name: this.datasetName,\n        project_id: this.currentProject.id,\n        // group_id: this.selectedGroup.id,\n        // ...this.formValue,\n      };\n      // if (this.shouldCreateImageGroups) {\n      //   importParams.create_image_groups = this.imageGroupsToCreate;\n      // }\n      // if (this.selectedGroup) {\n      //   importParams.group_id = this.selectedGroup.id;\n      // }\n      return importParams;\n    },\n  },\n  watch: {\n    dropHighlighted() {\n\n    },\n  },\n  async mounted() {\n    await this.getSupportedTypes();\n  },\n  methods: {\n    async getSupportedTypes() {\n      this.dataConnect.getSupportedImportTypes()\n        .then((data) => {\n          this.importTypes = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    showModal() {\n      this.$refs.uploadImagesModal.showModal();\n    },\n    closeModal() {\n      this.$refs.uploadImagesModal.closeModal();\n    },\n    chooseFiles() {\n      document.getElementById(\"file-input\").click();\n    },\n    handleDragEnter() {\n      this.dragCounter += 1;\n      this.dropHighlighted = true;\n    },\n    handleDragLeave() {\n      this.dragCounter -= 1;\n      if (this.dragCounter === 0) {\n        this.dropHighlighted = false;\n      }\n    },\n    handleDrop(e) {\n      this.files = e.dataTransfer.files;\n      this.uploadFiles(this.files);\n    },\n    fileSelected() {\n      this.files = structuredClone(this.$refs.imageFiles.files);\n      this.$refs.imageFiles.value = null;\n      this.uploadFiles(this.files);\n    },\n    async uploadFiles(files) {\n      if (files == null || files.length === 0) return;\n\n      const resp = await this.s3MultipleImageUpload({ fileList: files, params: this.importParams });\n      if (resp && !resp.error) {\n        this.closeModal();\n      }\n    },\n    async s3MultipleImageUpload({ fileList, params }) {\n      const keys = [];\n\n      // Validate file count and sizes, also trim paths\n      const maxFileSize = await this.getMaxImageSize();\n      let imgCount = 0;\n      let imgTooLargeErrCount = 0;\n      for (const file of fileList) {\n        const isImage = file.type.includes(\"image/\");\n        const isVideo = file.type.includes(\"video/\");\n        if ((isImage || isVideo) && (file.size <= maxFileSize || maxFileSize === -1)) {\n          keys.push(file.name);\n          imgCount += 1;\n        } else if (isImage || isVideo) {\n          imgTooLargeErrCount += 1;\n        }\n      }\n\n      // Check image upload limit\n      const imageLimit = await this.checkImageUploadLimit(imgCount)\n        .catch((error) => {\n          throw error;\n        });\n      if (imageLimit < 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `Not enough credits to perform this operation.`,\n          confirmMessageHeader: 'Insufficient Credits',\n        });\n        return null;\n      }\n\n      // How many files were too large to upload\n      if (imgTooLargeErrCount > 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `${imgTooLargeErrCount} image(s) were discard due to file size limit.`,\n          confirmMessageHeader: 'Large File Size',\n        });\n      }\n\n      // Get s3 presigned urls\n      const presignedResponse = await this.s3CreatePresignedUrl({\n        dataset_id: params.dataset_id,\n        keys,\n      })\n        .catch((error) => {\n          throw error;\n        });\n\n      const newFileList = [];\n      if (presignedResponse) {\n        const {\n          importerSource, indexes, presignedUrls, tnPresignedUrls,\n        } = presignedResponse;\n\n        if (importerSource) {\n          params.importer_source = importerSource;\n        }\n\n        presignedUrls.forEach((url, i) => {\n          newFileList.push({\n            url,\n            thumbnail_url: tnPresignedUrls[i],\n            file: fileList[indexes[i]],\n          });\n        });\n      }\n\n      // this.startingImport = false;\n\n      const importResponse = await this.$store.dispatch('importer/importByType', {\n        urls: newFileList,\n        importParams: params,\n      });\n\n      return importResponse;\n    },\n    async getMaxImageSize() {\n      return this.dataConnect.getAccountingMaxImageSize()\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    async checkImageUploadLimit(imgCount) {\n      return this.dataConnect.checkImageLimitForAccounting({\n        image_count: imgCount,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    async s3CreatePresignedUrl({ dataset_id, keys }) {\n      return this.dataConnect.s3CreatePresignedUrl({\n        dataset_id,\n        keys,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.upload-images {\n  display: flex;\n  flex-direction: column;\n  width: 500px;\n  padding: 1rem 1.5rem;\n  overflow: auto;\n\n  &__drag-drop {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n  }\n}\n\n.separator {\n  display: flex;\n  align-items: center;\n  text-align: center;\n  font-weight: 700;\n  font-size: 0.75rem;\n  @include themify() {\n    color: themed('form-separator-color');\n    border-color: themed('form-separator-color');\n  }\n  &::before, &::after {\n    content: '';\n    flex: 1;\n    border-bottom: 1px solid;\n  }\n  &:not(:empty)::before {\n    margin-right: 1.5em;\n    margin-left: .25em;\n  }\n  &:not(:empty)::after {\n    margin-right: .25em;\n    margin-left: 1.5em;\n  }\n}\n\n.file-upload-btn {\n  position: relative;\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  padding: 32px;\n  align-items: center;\n  justify-content: center;\n  min-height: 150px;\n  max-height: 200px;\n  border: 2px dashed grey;\n  border-radius: 8px;\n  cursor: pointer;\n\n  &__upload-icon {\n    position: absolute;\n    bottom: 50%;\n    width: 48px;\n    height: 48px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n\n  &__text {\n    position: absolute;\n    top: 50%;\n    display: flex;\n    flex-direction: column;\n\n    & span {\n      padding-top: 0.25rem;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      direction: rtl;\n      color: #250E81;\n      font-size: 16px;\n      font-weight: bold;\n    }\n\n    & span + span {\n      color: grey;\n      font-size: 12px;\n    }\n  }\n\n  &._highlight {\n    padding: 27px;\n    border: 3px dashed #250E81;\n    background: #250e8125;\n    animation-name: fill-upload-btn;\n    animation-duration: 0.5s;\n\n    & .file-upload-btn__upload-icon {\n      width: 56px;\n      height: 56px;\n      animation-name: grow-upload-icon;\n      animation-duration: 0.05s;\n    }\n    @keyframes grow-upload-icon {\n      from {  width: 48px; height: 48px;}\n      to {  width: 56px; height: 56px;}\n    }\n\n    @keyframes fill-upload-btn {\n      from {  background: transparent;}\n      to {  background: #250e8125;}\n    }\n  }\n}\n\n#upload-progress {\n  display: flex;\n  flex-direction: column;\n  border: 1px solid grey;\n  border-radius: 4px;\n  padding: 16px;\n  margin-top: 16px;\n  width: 100%;\n}\n\n#upload-progress span {\n  width: fit-content;\n  text-align: left;\n}\n\n#upload-progress span + span {\n  margin-top: 4px;\n}\n\n#upload-progress-bar {\n  width: 100%;\n  border-radius: 0;\n  height: 6px;\n  margin-top: 4px;\n}\n\n#upload-progress-bar::-webkit-progress-bar {\n  background-color: #eaedf3;\n}\n#upload-progress-bar::-webkit-progress-value {\n  background-color: #0075ff;\n}\n\n#upload-progress.completed {\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n}\n\n#upload-progress.completed #upload-complete-icon {\n  display: flex;\n  align-items: center;\n}\n\n#upload-progress.error {\n  flex-direction: column;\n}\n\n#upload-progress.error > div:first-child {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n}\n\n#upload-progress.error #upload-error-msg {\n  display: flex;\n  align-items: center;\n  text-align: left;\n  padding-top: 8px;\n}\n\n#upload-progress.error #upload-error-icon {\n  display: flex;\n  align-items: center;\n}\n\n.upload-title {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between\n}\n\n.note {\n  font-size: 0.8rem;\n  font-weight: 400;\n}\n\n</style>\n","<template>\n  <template v-for=\"(arg, i) in importType.args\" :key=\"`importType-arg-${i}`\">\n    <div v-if=\"arg.type === 'text'\" class=\"row\">\n      <div class=\"settings__control-group\">\n        <label :class=\"{'required' : !arg.optional}\">{{ arg.label }}</label>\n        <div class=\"source-row\">\n          <input\n            v-model=\"textInput[arg.label]\"\n            class=\"source-row__text-input input\"\n            type=\"text\"\n          >\n        </div>\n      </div>\n    </div>\n    <div v-if=\"arg.type === 'folder'\" class=\"row\">\n      <div class=\"settings__control-group\">\n        <label>{{ arg.label }} <span v-if=\"files_parsed > 0\" class=\"files-parsed-label\">{{ files_parsed }} Files Found</span></label>\n        <div class=\"source-row\">\n          <input\n            v-model=\"sourceDir\"\n            class=\"source-row__folder-input input\"\n            type=\"text\"\n          >\n          <button class=\"source-row__folder-btn button-secondary\" :class=\"{'button-spinner': parsingFiles}\" @click=\"chooseSourceFolder\">SELECT FOLDER</button>\n          <input\n            v-show=\"false\"\n            id=\"import-script-folder-input\"\n            ref=\"importFolder\"\n            type=\"file\"\n            webkitdirectory\n            mozdirectory\n            msdirectory\n            odirectory\n            directory\n            multiple\n            @change=\"sourceSelected\"\n          >\n        </div>\n        <div v-if=\"importType.type !== 'annotations'\" class=\"source-row__group-checkbox\">\n          <v-checkbox\n            v-model=\"shouldCreateImageGroups\"\n            density=\"compact\"\n            hide-details=\"true\"\n            label=\"Create image groups from folders\"\n          />\n        </div>\n      </div>\n    </div>\n    <div v-if=\"arg.type === 'file'\" class=\"row\">\n      <div class=\"settings__control-group\">\n        <label :class=\"{'required' : !arg.optional}\">{{ arg.label }}</label>\n        <div class=\"source-row\">\n          <input\n            v-model=\"sourceFile\"\n            class=\"source-row__folder-input input\"\n            type=\"text\"\n          >\n          <button class=\"source-row__folder-btn button-secondary\" @click=\"chooseSourceFile\">SELECT FILE</button>\n          <input\n            v-show=\"false\"\n            id=\"import-script-file-input\"\n            ref=\"importFile\"\n            type=\"file\"\n            @change=\"sourceFileSelected\"\n          >\n        </div>\n      </div>\n    </div>\n    <div v-if=\"arg.type === 'fps'\" class=\"row\">\n      <div class=\"settings__control-group\">\n        <label :class=\"{'required' : !arg.optional}\">FPS</label>\n        <div class=\"source-row\">\n          <input\n            v-model=\"videoFPS\"\n            class=\"input\"\n            type=\"number\"\n          >\n        </div>\n      </div>\n    </div>\n    <div v-if=\"arg.type === 'dest_annotation_set'\" class=\"row\">\n      <div class=\"col-6 settings__control-group align-items-start\">\n        <label :class=\"{'required' : !arg.optional}\">Destination Annotation Set</label>\n        <AnnotationSetsRadioSelect\n          v-model=\"selectedAnnotationSet\"\n          :annotationSets=\"annotationSets\"\n        />\n      </div>\n    </div>\n  </template>\n  <div v-if=\"message\" class=\"row\">\n    <div class=\"col-12 settings__control-group\">\n      <div class=\"result error\">\n        <span>{{ message }}</span>\n      </div>\n    </div>\n  </div>\n  <div v-if=\"groups && groups.length > 0 && importType.type !== 'annotations'\" class=\"row\">\n    <div class=\"col-12 settings__control-group\">\n      <label>Destination Group</label>\n      <select\n        id=\"type-select\"\n        v-model=\"selectedGroup\"\n        class=\"select\"\n        required\n      >\n        <option value=\"\">Select a Group</option>\n        <option v-for=\"(option, i) in groups\" :key=\"`import-group-${i}`\" :value=\"option\">\n          {{ option.name }}\n        </option>\n      </select>\n    </div>\n  </div>\n\n  <div class=\"row\">\n    <div class=\"col-4\" />\n    <div class=\"col-8 action-buttons\">\n      <button\n        class=\"button button-sm button-secondary\"\n        @click=\"handleCancel\"\n      >\n        Cancel\n      </button>\n      <button\n        class=\"button button-sm\"\n        :class=\"{'button-spinner': startingImport}\"\n        :disabled=\"startingImport || parsingFiles\"\n        @click=\"handleStartImport\"\n      >\n        Start Import\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { showDirectoryPicker, showOpenFilePicker } from 'file-system-access';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\nimport { inputSanitizer, changeSanitizer } from '../../../assets/js/utils';\nimport AnnotationSetsRadioSelect from '../AnnotationSetsRadioSelect.vue';\n\nexport default {\n  name: 'DefaultImportScriptForm',\n  components: {\n    AnnotationSetsRadioSelect,\n  },\n  props: {\n    modelValue: {\n      type: Object,\n      default: () => {},\n    },\n    datasetID: {\n      type: Number,\n      default: null,\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    importType: {\n      type: Object,\n      default: () => {},\n    },\n    isFilesParsed: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'cancel', 'upload-started', 'upload-complete', 'upload-error', 'update:modelValue', 'update:isFilesParsed',\n  ],\n  data() {\n    return {\n      message: \"\",\n      name: \"\",\n      sourceDir: \"\",\n      sourceFile: \"\",\n      textInput: {},\n      videoFPS: 10,\n      selectedAnnotationSet: null,\n      files: null,\n      startingImport: false,\n      files_parsed: 0,\n      parsingFiles: false,\n      shouldCancelFileParsing: false,\n      groups: null,\n      selectedGroup: '',\n      shouldCreateImageGroups: false,\n      imageGroupsToCreate: [],\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    uploadFolderTasks() {\n      return this.$store.state.tasks.uploadTasks;\n    },\n    user() {\n      return this.$store.state.user.user;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    datasetName() {\n      const dataset = this.$store.state?.datasets?.datasetList.find((d) => d.id === this.datasetID);\n      return dataset.name;\n    },\n    formValue() {\n      const params = {};\n      if (this.selectedAnnotationSet) {\n        params.annotation_set_id = this.selectedAnnotationSet.id;\n      }\n      if (this.videoFPS) {\n        params.fps = this.videoFPS;\n      }\n      return params;\n    },\n    importParams() {\n      const importParams = {\n        import_type: this.importType.type,\n        dataset_id: this.datasetID,\n        dataset_name: this.datasetName,\n        project_id: this.currentProject.id,\n        group_id: this.selectedGroup.id,\n        ...this.formValue,\n      };\n      if (this.shouldCreateImageGroups) {\n        importParams.create_image_groups = this.imageGroupsToCreate;\n      }\n      if (this.selectedGroup) {\n        importParams.group_id = this.selectedGroup.id;\n      }\n      return importParams;\n    },\n  },\n  watch: {\n    formValue() {\n      this.$emit('update:modelValue', this.formValue);\n    },\n    files_parsed() {\n      if (this.files_parsed > 0) {\n        this.$emit('update:isFilesParsed', true);\n      } else {\n        this.$emit('update:isFilesParsed', false);\n      }\n    },\n  },\n  async mounted() {\n    this.dataConnect = new DatastoreConnect();\n    this.groups = await this.getDatasetGroups();\n  },\n  unmounted() {\n    this.shouldCancelFileParsing = true;\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    clearInput() {\n      this.name = \"\";\n      this.source = null;\n      this.selectedAnnotationSet = null;\n      this.sourceDir = \"\";\n      this.sourceFile = \"\";\n      this.videoFPS = 1;\n      this.message = \"\";\n      this.textInput = {};\n    },\n    handleCancel() {\n      this.$emit('cancel');\n    },\n    async getDatasetGroups() {\n      return this.dataConnect.getGroupListForDataset({\n        dataset_id: this.datasetID,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    validateForm() {\n      if (this.importType.args.some((item) => item.type === \"folder\")) {\n        if (!this.sourceDir) {\n          return \"Please select a folder\";\n        }\n\n        if (this.files === null || !this.files.length) {\n          return \"No files found in folder\";\n        }\n      }\n\n      if (this.importType.args.some((item) => item.type === \"file\")) {\n        if (!this.sourceFile) {\n          return \"No files found\";\n        }\n\n        if (this.files === null || !this.files.length) {\n          return \"No files found\";\n        }\n      }\n\n      if (Object.values(this.importType.args).includes('fps')) {\n        if (this.videoFPS === 0) {\n          return \"Please enter a non-zero frame number\";\n        }\n      }\n\n      if (Object.values(this.importType.args).includes('text')) {\n        if (Object.values(this.textInput).includes('')) {\n          return \"Text Input can not be blank.\";\n        }\n      }\n\n      return null;\n    },\n    handleStartImport() {\n      if (this.importType.type === 'video_frames') {\n        this.handleVideoImport();\n        return;\n      }\n\n      this.handleStartImportScript();\n    },\n    async handleVideoImport() {\n      if (!this.files || this.files.length === 0) {\n        this.message = \"Please select a file\";\n        return;\n      }\n\n      this.startingImport = true;\n\n      const formData = new FormData();\n      for (let i = 0; i < this.files.length; i++) {\n        formData.append('video', this.files[i]);\n      }\n\n      const paramObj = {\n        fps: this.videoFPS,\n        dataset_id: this.datasetID,\n      };\n\n      if (this.selectedGroup) {\n        paramObj[\"group_id\"] = this.selectedGroup.id;\n      }\n      formData.append('params', new Blob([JSON.stringify(paramObj)], { type: 'application/json' }));\n\n      await this.dataConnect.uploadVideo(formData)\n        .catch((error) => {\n          console.error(error);\n          this.startingImport = false;\n        });\n      this.startingImport = false;\n      this.$emit('upload-complete');\n    },\n    async handleStartImportScript() {\n      const errorMessage = this.validateForm();\n      if (errorMessage) {\n        this.message = errorMessage;\n        return;\n      }\n\n      this.startingImport = true;\n\n      let resp = null;\n      if (this.importType.type === 'annotations') {\n        if (!this.selectedAnnotationSet) {\n          this.$emit(\"upload-error\", {\n            confirmMessage: `No annotation set selected.`,\n            confirmMessageHeader: 'Upload Error',\n          });\n          return;\n        }\n        resp = await this.s3MultipleAnnotationFileUpload({ fileList: this.files, params: this.importParams })\n          .catch((error) => {\n            console.error(error);\n            alert(error);\n          });\n      } else if (this.importType.type === 'dropbox') {\n        resp = await this.dataConnect.startImport({\n          dataset_id: this.datasetID,\n          dataset_name: this.datasetName,\n          import_type: this.importType.type,\n          annotation_set_id: this.selectedAnnotationSet?.id,\n          project_id: this.currentProject.id,\n          import_data: JSON.stringify({\n            dropbox_access_code: this.textInput[\"Authorization Code\"],\n            dropbox_root: this.textInput[\"Folder\"],\n          }),\n        });\n\n        if (resp.result) {\n          this.$store.commit('tasks/addImportTask', {\n            taskID: resp.result.id, docker_task_id: resp.result.id, type: resp.result.name, dataset_id: this.datasetID,\n          });\n        }\n      } else {\n        resp = await this.s3MultipleFileUpload({ fileList: this.files, params: this.importParams })\n          .catch((error) => {\n            console.error(error);\n            alert(error);\n          });\n      }\n\n      this.startingImport = false;\n\n      if (resp) {\n        this.$emit('upload-complete');\n      }\n    },\n    async chooseSourceFolder() {\n      try {\n        const directoryHandle = await showDirectoryPicker({ _preferPolyfill: false });\n        this.parsingFiles = true;\n        const tree = { [directoryHandle.name]: {} };\n        this.sourceDir = directoryHandle.name;\n        this.files_parsed = 0;\n        this.files = [];\n        await this.handleDirectory(directoryHandle, tree, directoryHandle.name);\n        Promise.all(this.files).then((files) => {\n          this.files = files;\n          this.parsingFiles = false;\n        });\n      } catch (error) {\n        console.error(error);\n      }\n    },\n    async handleDirectory(dirhandle, tree, relativePath) {\n      const subtree = {};\n      tree[dirhandle.name] = subtree;\n      for await (const [name, handle] of dirhandle) {\n        if (this.shouldCancelFileParsing) { break; }\n        if (handle.kind === \"directory\") {\n          // Get first directory level group names\n          if (dirhandle.name === this.sourceDir) {\n            this.imageGroupsToCreate.push(name);\n          }\n          const newRelativePath = relativePath ? `${relativePath}/${name}` : name;\n          await this.handleDirectory(handle, subtree, newRelativePath);\n        } else {\n          this.files_parsed++;\n          subtree[name] = \"[file]\";\n          this.files.push(new Promise((resolve, reject) => {\n            handle.getFile().then((file) => {\n              file.relativePath = `${relativePath}/${name}`;\n              resolve(file);\n            });\n          }));\n        }\n      }\n    },\n    chooseSourceFile() {\n      this.$refs['importFile'][0].click();\n    },\n    sourceSelected() {\n      this.files = this.$refs['importFolder'][0].files;\n      if (this.files.length > 0) {\n        const relativePath = this.files[0].webkitRelativePath;\n        const folder = relativePath.split(\"/\");\n        this.sourceDir = folder[0];\n      }\n    },\n    sourceFileSelected() {\n      this.files = this.$refs['importFile'][0].files;\n      if (this.files.length > 0) {\n        this.sourceFile = this.files[0].name;\n      }\n    },\n    async s3MultipleFileUpload({ fileList, params }) {\n      const keys = [];\n\n      // Validate file count and sizes, also trim paths\n      const maxFileSize = await this.getMaxImageSize();\n      let imgCount = 0;\n      let imgTooLargeErrCount = 0;\n      for (const file of fileList) {\n        let trimmedPath;\n        const relativePath = file.relativePath || file.webkitRelativePath;\n        if (relativePath) {\n          // From folder select\n          trimmedPath = relativePath.split('/').slice(1);\n        } else {\n          // From file select\n          trimmedPath = [file.name];\n        }\n        const isImage = file.type.includes(\"image/\");\n        const isVideo = file.type.includes(\"video/\");\n\n        if ((isImage || isVideo) && (file.size <= maxFileSize || maxFileSize === -1)) {\n          keys.push(trimmedPath.join('/'));\n          imgCount += 1;\n        } else if (isImage || isVideo) {\n          imgTooLargeErrCount += 1;\n        } else {\n          keys.push(trimmedPath.join('/'));\n        }\n      }\n\n      // Check image upload limit\n      const imageLimit = await this.checkImageUploadLimit(imgCount)\n        .catch((error) => {\n          throw error;\n        });\n      if (imageLimit < 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `Not enough credits to perform this operation.`,\n          confirmMessageHeader: 'Insufficient Credits',\n        });\n        return null;\n      }\n\n      // How many files were too large to upload\n      if (imgTooLargeErrCount > 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `${imgTooLargeErrCount} image(s) were discard due to file size limit.`,\n          confirmMessageHeader: 'Large File Size',\n        });\n      }\n\n      // Get s3 presigned urls\n      const presignedResponse = await this.s3CreatePresignedUrl({\n        dataset_id: params.dataset_id,\n        keys,\n      })\n        .catch((error) => {\n          throw error;\n        });\n\n      const newFileList = [];\n      if (presignedResponse) {\n        const {\n          importerSource, indexes, presignedUrls, tnPresignedUrls,\n        } = presignedResponse;\n\n        if (importerSource) {\n          params.importer_source = importerSource;\n        }\n\n        presignedUrls.forEach((url, i) => {\n          newFileList.push({\n            url,\n            thumbnail_url: tnPresignedUrls[i],\n            file: fileList[indexes[i]],\n          });\n        });\n      }\n\n      this.startingImport = false;\n      this.$emit('upload-started');\n\n      const importResponse = await this.$store.dispatch('importer/importByType', {\n        urls: newFileList,\n        importParams: params,\n      });\n\n      return importResponse;\n    },\n    async s3MultipleAnnotationFileUpload({ fileList, params }) {\n      // TODO: Check annotation upload limit\n\n      this.startingImport = false;\n      this.$emit('upload-started');\n      const importResponse = await this.$store.dispatch('annotations/importAnnotationsDarknet', {\n        files: fileList,\n        importParams: params,\n      });\n\n      return importResponse;\n    },\n    async getMaxImageSize() {\n      return this.dataConnect.getAccountingMaxImageSize()\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    async checkImageUploadLimit(imgCount) {\n      return this.dataConnect.checkImageLimitForAccounting({\n        image_count: imgCount,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    async s3CreatePresignedUrl({ dataset_id, keys }) {\n      return this.dataConnect.s3CreatePresignedUrl({\n        dataset_id,\n        keys,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.row + .row {\n  margin-top: 1rem;\n}\n\n.source-row {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n\n  &__folder-input {\n    width: unset;\n    flex: 1 1 auto;\n    border-radius: 6px 0 0 6px;\n    border-right: 1px solid transparent !important;\n\n    &:focus {\n      margin-right: 1px;\n    }\n  }\n\n  &__folder-btn {\n    flex: 0 1 auto;\n    padding: 2px 8px;\n    height: 100%;\n    border-radius: 0 6px 6px 0;\n    font-size: 0.875rem;\n    font-weight: 600;\n    color: var(--body-text-color-secondary);\n  }\n\n  &__group-checkbox {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.action-buttons {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 8px;\n}\n\n.files-parsed-label {\n  float: right;\n}\n</style>\n","import { render } from \"./DefaultImportScriptForm.vue?vue&type=template&id=62e8a290&scoped=true\"\nimport script from \"./DefaultImportScriptForm.vue?vue&type=script&lang=js\"\nexport * from \"./DefaultImportScriptForm.vue?vue&type=script&lang=js\"\n\nimport \"./DefaultImportScriptForm.vue?vue&type=style&index=0&id=62e8a290&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62e8a290\"]])\n\nexport default __exports__","import { render } from \"./UploadImagesModal.vue?vue&type=template&id=b871d25c&scoped=true\"\nimport script from \"./UploadImagesModal.vue?vue&type=script&lang=js\"\nexport * from \"./UploadImagesModal.vue?vue&type=script&lang=js\"\n\nimport \"./UploadImagesModal.vue?vue&type=style&index=0&id=b871d25c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-b871d25c\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"addGroupsModal\"\n    :title=\"'Add Groups'\"\n    width=\"500px\"\n    @closed=\"resetData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings container scrollbar\">\n        <div class=\"row mt-3\">\n          <div class=\"col settings__control-group icon-label\">\n            <label class=\"required\">Groups</label>\n            <IconButton\n              class=\"add-group-icon\"\n              :icon=\"'add'\"\n              :width=\"18\"\n              :height=\"18\"\n              :title=\"`Add a Group`\"\n              :type=\"''\"\n              @click=\"add\"\n            />\n          </div>\n        </div>\n        <div\n          v-for=\"(group, i) in groups\"\n          :key=\"i\"\n          class=\"row mt-2\"\n        >\n          <div class=\"col settings__control-group\">\n            <div class=\"group-row\">\n              <input\n                v-model=\"group.name\"\n                type=\"text\"\n                class=\"group-input\"\n              >\n              <div class=\"percent-input\">\n                <input\n                  v-model=\"group.percent\"\n                  :min=\"0\"\n                  :max=\"100\"\n                  type=\"number\"\n                  class=\"group-input\"\n                  @change=\"changeSanitizer\"\n                  @input=\"inputSanitizer\"\n                >\n                %\n              </div>\n              <IconButton\n                class=\"remove-button\"\n                :icon=\"'close'\"\n                :width=\"20\"\n                :height=\"20\"\n                @click=\"remove(i)\"\n              />\n            </div>\n          </div>\n        </div>\n        <div class=\"row mt-1\">\n          <span class=\"note\"><i>Total percentage must be less than or equal to 100%</i></span>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"createGroups\"\n        >\n          Add Groups\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport { inputSanitizer, changeSanitizer } from '@/assets/js/utils';\n\nexport default {\n  name: 'CreateGroupsModal',\n  components: {\n    Modal,\n    IconButton,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: ['annotation-set-created', 'annotation-set-created-error', 'created-groups'],\n  data() {\n    return {\n      message: '',\n      totalPercentage: 0,\n      groups: [\n        {\n          name: '',\n          percent: 0,\n        },\n      ],\n    };\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    showModal() {\n      if (this.dataset && this.dataset.groups && this.dataset.groups.length > 0) {\n        this.totalPercentage = 0;\n        for (let i = 0; i < this.dataset.groups.length; i += 1) {\n          this.totalPercentage += Math.round(Number((this.dataset.groups[i].count / this.dataset.numImages) * 100));\n        }\n      }\n      this.$nextTick(() => {\n        this.$refs.addGroupsModal.showModal();\n      });\n    },\n    resetData() {\n      this.message = \"\";\n      this.totalPercentage = 0;\n      this.groups = [\n        {\n          name: '',\n          percent: 0,\n        },\n      ];\n    },\n    closeModal() {\n      this.resetData();\n      this.$refs.addGroupsModal.closeModal();\n    },\n    async createGroups() {\n      this.message = \"\";\n      if (this.groups.length === 0) {\n        this.message = \"Must have at least 1 group\";\n      } else {\n        let totalPercent = this.totalPercentage;\n        for (let i = 0; i < this.groups.length; i++) {\n          if (this.groups[i].name === \"\") {\n            this.message = \"Group names must not be empty\";\n            break;\n          }\n          totalPercent += this.groups[i].percent;\n          if (totalPercent > 100) {\n            this.message = `Error: Total percentage can not exceed 100`;\n            break;\n          }\n        }\n      }\n      if (this.message !== \"\") {\n        return;\n      }\n      await this.dataConnect.createGroupsForDataset({\n        dataset_id: this.dataset.id,\n        group_names: this.groups.map((e) => e.name),\n        group_splits: this.groups.map((e) => e.percent),\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error.message);\n          }\n          this.$emit('created-groups');\n          this.closeModal();\n        }).catch((e) => {\n          this.message = e;\n        });\n    },\n    add() {\n      this.groups.push(\n        {\n          name: '',\n          percent: 0,\n        },\n      );\n    },\n    remove(index) {\n      this.groups.splice(index, 1);\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 500px;\n  overflow-y: auto;\n}\n.group-row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  padding: 5px;\n  border-radius: 4px;\n  width: 100%;\n\n  .percent-input {\n    margin-left: auto;\n    width: 120px;\n    min-width: 120px;\n  }\n\n  .remove-button {\n    margin-right: 10px;\n    visibility: hidden;\n  }\n\n  &:hover {\n    background-color: rgb(237, 232, 232);\n  }\n\n  &:hover .remove-button {\n      z-index: 3;\n    visibility: visible;\n    @include themify() {\n      color: themed('icon-color-inactive');\n    }\n  }\n\n  &:hover .remove-button:hover {\n      z-index: 3;\n    visibility: visible;\n    @include themify() {\n      color: themed('icon-color-primary');\n    }\n  }\n\n  .group-input {\n    width: 70px;\n    height: 30px;\n    background: #ffffff;\n    border-radius: 5px;\n    font-size: 1rem;\n    padding: 3px 10px;\n    margin-left: 5px;\n    margin-right: 5px;\n    align-self: center;\n    -webkit-appearance: auto;\n    @include themify() {\n      border: 1px solid themed('text-input-border-color');\n    }\n  }\n\n  input:first-child[type=\"text\"] {\n    width: 200px;\n  }\n}\n\n.icon-label {\n  flex-direction: row;\n\n  label {\n    width: fit-content;\n  }\n}\n\n.add-group-icon {\n  z-index: 3;\n  visibility: visible;\n  margin-left: 12px;\n  @include themify() {\n    color: themed('icon-color-inactive');\n  }\n}\n\n.add-group-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.note {\n  text-align: left;\n  font-size: 0.8rem;\n  font-weight: 500;\n}\n\n</style>\n","import { render } from \"./CreateGroupsModal.vue?vue&type=template&id=e9c455dc&scoped=true\"\nimport script from \"./CreateGroupsModal.vue?vue&type=script&lang=js\"\nexport * from \"./CreateGroupsModal.vue?vue&type=script&lang=js\"\n\nimport \"./CreateGroupsModal.vue?vue&type=style&index=0&id=e9c455dc&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e9c455dc\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"generateTokenModal\"\n    :title=\"'Generate API Token'\"\n    @closed=\"clearData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Dataset</label>\n            <select v-model=\"dataset\" class=\"select\" required>\n              <option :key=\"'train-select-null'\" disabled :value=\"null\">Select a Dataset</option>\n              <option v-for=\"d in datasets\" :key=\"`select-${d.id}`\" :value=\"d\">\n                {{ d.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group align-items-start\">\n            <label>Annotation Set</label>\n            <AnnotationSetsRadioSelect\n              v-model=\"annSet\"\n              :annotationSets=\"dataset?.annotation_sets\"\n            />\n          </div>\n        </div>\n        <div v-if=\"result\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result\" :class=\"[err ? 'error' : 'success']\">\n              <span>{{ result }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"createToken\"\n        >\n          Generate\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport Modal from '@/components/Modal.vue';\nimport AnnotationSetsRadioSelect from '@/components/DatasetComponent/AnnotationSetsRadioSelect.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'GenerateTokenModal',\n  components: {\n    Modal,\n    AnnotationSetsRadioSelect,\n  },\n  props: {\n    modalDataset: {\n      type: Object,\n      default: () => null,\n    },\n  },\n  emits: { 'token-created': null },\n  data() {\n    return {\n      dataset: null,\n      annSet: null,\n      result: '',\n      err: false,\n      dsConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n    };\n  },\n  computed: {\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n  },\n  watch: {\n    modalDataset() {\n      if (this.modalDataset) {\n        this.dataset = this.modalDataset;\n      }\n    },\n  },\n  methods: {\n    showModal() {\n      this.$nextTick(() => {\n        this.$refs.generateTokenModal.showModal();\n      });\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.generateTokenModal.closeModal();\n    },\n    clearData() {\n      this.dataset = null;\n      this.annSet = null;\n      this.result = '';\n    },\n    async createToken() {\n      this.err = false;\n      if (!this.dataset) {\n        this.result = \"Missing dataset\";\n        this.err = true;\n        return;\n      }\n      const params = {\n        \"dataset_id\": this.dataset.id,\n      };\n      if (this.annSet) {\n        params[\"annotation_set_id\"] = this.annSet.id;\n      }\n\n      await this.dsConnect.generateBridgeToken(params)\n        .then((data) => {\n          if (data.result) {\n            this.result = data.result;\n          } else {\n            this.err = data.error;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.success {\n  @include themify() {\n    background: rgba(154, 237, 154, 0.5) ;\n    color: black\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    overflow-wrap: break-word;\n  }\n}\n\n</style>\n","import { render } from \"./GenerateAPITokenModal.vue?vue&type=template&id=24d003d9&scoped=true\"\nimport script from \"./GenerateAPITokenModal.vue?vue&type=script&lang=js\"\nexport * from \"./GenerateAPITokenModal.vue?vue&type=script&lang=js\"\n\nimport \"./GenerateAPITokenModal.vue?vue&type=style&index=0&id=24d003d9&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-24d003d9\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"confusionMatrixModal\"\n    :title=\"'Confusion Matrix'\"\n    :width=\"'100%'\"\n    :height=\"'100%'\"\n    @closed=\"resetData\"\n  >\n    <template #modal-main>\n      <template v-if=\"currentDataset !== null\">\n        <div class=\"dataset-controls\">\n          <ComparisonFilter\n            v-model=\"filters\"\n            :labels=\"currentLabels\"\n            :annotationSets=\"annotationSets\"\n            :loadingValidations=\"loadingValidation\"\n            @apply=\"applyFilters\"\n          />\n        </div>\n        <div v-if=\"loadingValidation\" class=\"empty-state\">\n          <InlineLoader\n            :width=\"'60px'\"\n            :height=\"'60px'\"\n            :border=\"'12px'\"\n          />\n          <button class=\"button mt-3\" @click=\"abortAllSignals\">Cancel</button>\n        </div>\n        <div\n          v-if=\"!loadingValidation && (hasValidations)\"\n          class=\"stats-container scrollbar\"\n        >\n          <div class=\"charts\">\n            <div class=\"flex-col col-large\">\n              <ComparisonTableDynamic\n                :validations=\"validations\"\n                :annotationSets=\"annotationSets\"\n                @select=\"handleAnnotationSetSummarySelected\"\n              />\n              <ConfusionMatrixCardV2\n                :matrix=\"confusionMatrixData\"\n                class=\"conf-matrix\"\n              />\n            </div>\n          </div>\n        </div>\n      </template>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport ComparisonFilter from '@/components/ValidationPage/ComparisonFilter.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\nimport ComparisonTableDynamic from '@/components/ValidationPage/ComparisonTableDynamic.vue';\nimport ConfusionMatrixCardV2 from '@/components/ValidationPage/ConfusionMatrixCardV2.vue';\n\nexport default {\n  name: 'ConfusionMatrixModal',\n  components: {\n    Modal,\n    ComparisonFilter,\n    InlineLoader,\n    ComparisonTableDynamic,\n    ConfusionMatrixCardV2,\n  },\n  data() {\n    return {\n      filters: {\n        iou: 0.5,\n        confidence: 0.25,\n      },\n      annotationsForDisplay: [],\n      confMatrixChartProperties: null,\n      dataConnect: new DatastoreConnect(),\n      loadingValidation: false,\n      validations: [],\n      controllers: [],\n      confusionMatrixData: null,\n      shouldClearValidations: false,\n    };\n  },\n  computed: {\n    targetSet() {\n      return this.$store.state.datasets.confMatrixTargetSet;\n    },\n    hasValidations() {\n      return this.validations.length > 0;\n    },\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n    currentLabels() {\n      if (this.currentDataset) {\n        return this.currentDataset.labels;\n      }\n      return [];\n    },\n    annotationSets() {\n      if (this.currentDataset) {\n        return this.currentDataset.annotation_sets;\n      }\n      return [];\n    },\n  },\n  watch: {\n    currentDataset: {\n      deep: true,\n      immediate: true,\n      handler(d) {\n        this.resetList();\n      },\n    },\n  },\n\n  unmounted() {\n    this.abortAllSignals();\n  },\n  methods: {\n    resetData() {\n      this.filters = {\n        iou: 0.5,\n        confidence: 0.25,\n      };\n    },\n    applyFilters() {\n      if (this.filters.ground_truth_annotation_set_id && this.filters.predicted_annotation_set_id) {\n        this.compare();\n      }\n    },\n    abortAllSignals() {\n      this.controllers.forEach((controller) => {\n        controller.abort();\n      });\n    },\n    compare() {\n      this.compareSets();\n    },\n    async compareSets() {\n      this.loadingValidation = true;\n\n      const controller = new AbortController();\n      this.controllers.push(controller);\n      const result = await this.dataConnect.statsCompare(this.filters, controller.signal)\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n      this.validations.push({\n        ...result,\n        target_set_id: this.filters.predicted_annotation_set_id,\n      });\n      this.confusionMatrixData = {\n        confusion_matrix_data: result?.confusion_matrix_data,\n        index_name_map: result?.index_name_map,\n      };\n\n      this.loadingValidation = false;\n    },\n    handleAnnotationSetSummarySelected(validation) {\n      this.confusionMatrixData = {\n        confusion_matrix_data: validation.confusion_matrix_data,\n        index_name_map: validation.index_name_map,\n      };\n    },\n    showModal() {\n      if (this.targetSet) {\n        this.filters.predicted_annotation_set_id = this.targetSet.id;\n      }\n      this.$refs.confusionMatrixModal.showModal();\n    },\n    closeModal() {\n      this.$refs.confusionMatrixModal.closeModal();\n    },\n    resetList() {\n      this.validations = [];\n      this.confusionMatrixData = null;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.dataset-controls {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n}\n\n.stats-container {\n  margin: 10px;\n  width: calc(100% - 20px);\n  overflow-y: scroll;\n  overflow-x: scroll;\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n}\n\n.flex-col {\n  display: flex;\n  flex-direction: column;\n}\n\n.charts {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  height: 100%;\n}\n\n.col-large {\n  flex: 1 1 65%;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.conf-matrix {\n  margin: 10px;\n}\n</style>\n","<template>\n  <div class=\"filters\" :class=\"{'_collapse': collapse}\">\n    <div class=\"filters__active-and-default-filters scrollbar\">\n      <component\n        :is=\"filter.name\"\n        v-for=\"filter in filterList\"\n        :key=\"filter.key\"\n        v-model=\"filters[filter.key]\"\n        v-bind=\"filterProps[filter.key]\"\n      />\n      <button\n        v-if=\"!collapse\"\n        class=\"button button-sm apply-button\"\n        :disabled=\"!filterValue['ground_truth_annotation_set_id']\n          || !filterValue['predicted_annotation_set_id']\n          || loadingValidations\"\n        @click=\"$emit('apply')\"\n      >\n        Generate Report\n      </button>\n    </div>\n    <div v-if=\"collapse\" class=\"filters__more-filters\">\n      <button\n        class=\"button button-sm apply-button\"\n        :disabled=\"!filterValue['ground_truth_annotation_set_id']\n          || !filterValue['predicted_annotation_set_id']\n          || loadingValidations\"\n        @click=\"$emit('apply')\"\n      >\n        Generate Report\n      </button>\n    </div>\n    <IconButton\n      id=\"expand_less\"\n      :icon=\"'expand_less'\"\n      :width=\"'20px'\"\n      :height=\"'20px'\"\n      :type=\"''\"\n      :showHover=\"false\"\n      @click=\"collapse = !collapse\"\n    />\n  </div>\n</template>\n\n<script>\nimport ComparisonTaskGroundTruth from '@/components/ValidationPage/ComparisonTaskGroundTruth.vue';\nimport ChooseValidationTarget from '@/components/ValidationPage/ChooseValidationTarget';\nimport ConfidenceThresholdFilter from '@/components/ValidationPage/ConfidenceThresholdFilter.vue';\nimport IoUThresholdFilter from '@/components/ValidationPage/IoUThresholdFilter.vue';\nimport MetricFilter from '@/components/ValidationPage/MetricFilter.vue';\nimport IgnoreBoxesFilter from '@/components/ValidationPage/IgnoreBoxesFilter';\nimport IconButton from '@/components/IconButton.vue';\nimport { toRaw } from 'vue';\n\nexport default {\n  name: \"ComparisonFilter\",\n  components: {\n    ComparisonTaskGroundTruth,\n    ChooseValidationTarget,\n    ConfidenceThresholdFilter,\n    IoUThresholdFilter,\n    MetricFilter,\n    IgnoreBoxesFilter,\n    IconButton,\n  },\n  props: {\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Object,\n      default: null,\n    },\n    filterList: {\n      type: Array,\n      default: () => [\n        { name: 'ComparisonTaskGroundTruth', key: 'ground_truth_annotation_set_id' },\n        { name: 'ChooseValidationTarget', key: 'predicted_annotation_set_id' },\n        { name: 'IoUThresholdFilter', key: 'iou' },\n        { name: 'ConfidenceThresholdFilter', key: 'confidence' },\n        // { name: 'MetricFilter', key: 'metric' },\n        // { name: 'IgnoreBoxesFilter', key: 'ignoreBoxes' },\n      ],\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    loadingValidations: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  emits: [\n    'update:modelValue', 'apply',\n  ],\n  data() {\n    return {\n      filters: {\n        // iou: 0.5,\n        // confidence: 0.25,\n      },\n      collapse: false,\n    };\n  },\n  computed: {\n    filterProps() {\n      return {\n        ground_truth_annotation_set_id: {\n          annotationSets: this.annotationSets,\n\n        },\n        predicted_annotation_set_id: {\n          annotationSets: this.annotationSets,\n\n        },\n        confidence: {\n\n        },\n        iou: {\n\n        },\n        metric: {\n\n        },\n        ignoreBoxes: {\n\n        },\n      };\n    },\n    datasetID() {\n      return this.$store.state.datasets.currentDatasetID;\n    },\n    filterValue() {\n      return Object.keys(this.filters)\n        .filter((key) => this.filters[key] !== null)\n        .reduce((result, key) => {\n          result[key] = this.filters[key];\n          return result;\n        }, {});\n    },\n  },\n  watch: {\n    filterValue: {\n      deep: true,\n      handler() {\n        this.$emit('update:modelValue', this.filterValue);\n      },\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.filters = structuredClone(toRaw(this.modelValue));\n    }\n    this.$emit('update:modelValue', this.filterValue);\n  },\n  unmounted() {\n\n  },\n  methods: {\n\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filters {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  width: 100%;\n\n  &._collapse {\n    flex-wrap: nowrap;\n    gap: 12px;\n\n    .filters__active-and-default-filters {\n      margin-bottom: -8px;\n      position: relative;\n      display: flex;\n      flex-direction: row;\n      flex-wrap: nowrap;\n      flex: unset;\n      gap: 12px;\n      overflow-x: auto;\n      overflow-y: hidden;\n    }\n\n    .filters__more-filters {\n      position: relative;\n      display: flex;\n      flex-direction: row;\n      flex: unset;\n      gap: 12px;\n    }\n\n    #expand_less {\n      position: absolute;\n      bottom: -8px;\n      right: -16px;\n      transform: rotateX(180deg);\n      &:hover {\n        @include themify() {\n          background-color: themed('icon-hover-color');\n          border-radius: unset;\n        }\n      }\n    }\n  }\n\n  &__active-and-default-filters {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    flex: 1 1 auto;\n    gap: 12px;\n\n    button:last-child {\n      margin-left: auto;\n    }\n  }\n\n  &__more-filters {\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    flex: 1 1 auto;\n    gap: 12px;\n  }\n\n  #expand_less {\n    position: absolute;\n    bottom: -8px;\n    right: -16px;\n    &:hover {\n      @include themify() {\n        background-color: themed('icon-hover-color');\n        border-radius: unset;\n      }\n    }\n  }\n}\n\n.apply-button {\n  width: 140px;\n}\n</style>\n","<template>\n  <FilterPopper :appendToBody=\"true\">\n    <BaseFilterButton :name=\"'Ground Truth'\" :active=\"isActive\" :tagValue=\"tagValue\" />\n    <template #popper>\n      <div\n        v-if=\"annotationSets && annotationSets.length > 0\"\n        ref=\"checkboxContainer\"\n        class=\"filter-settings scrollbar\"\n      >\n        <div v-for=\"(task, i) in annotationSets\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`annotationSetsForGroundTruth-${i}`\"\n            v-model=\"selectedSet\"\n            type=\"radio\"\n            :name=\"`${task.name}-${i}`\"\n            :value=\"task\"\n          >\n          <label :for=\"`task-${i}`\">{{ task.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        <span>Please define an annotation set.</span>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"ComparisonTaskGroundTruth\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Number,\n      default: null,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedSet: {},\n    };\n  },\n  computed: {\n    isActive() {\n      if (this.modelValue) {\n        return true;\n      }\n      return false;\n    },\n    tagValue() {\n      if (this.modelValue) {\n        return this.selectedSet?.name;\n      }\n      return '';\n    },\n  },\n  watch: {\n    selectedSet() {\n      this.updateFilters();\n    },\n    annotationSets: {\n      handler(tasks) {\n        if (tasks.length === 0 || (this.selectedSet && !tasks.find((e) => e.id === this.selectedSet.id))) {\n          this.selectedSet = {};\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.selectedSet = this.annotationSets.find((e) => e.id === this.modelValue);\n      this.updateFilters();\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedSet?.id);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  overflow: auto;\n  min-width: 140px;\n  text-wrap: nowrap;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=radio] {\n    margin-right: 12px;\n  }\n}\n</style>\n","import { render } from \"./ComparisonTaskGroundTruth.vue?vue&type=template&id=9c62cec4&scoped=true\"\nimport script from \"./ComparisonTaskGroundTruth.vue?vue&type=script&lang=js\"\nexport * from \"./ComparisonTaskGroundTruth.vue?vue&type=script&lang=js\"\n\nimport \"./ComparisonTaskGroundTruth.vue?vue&type=style&index=0&id=9c62cec4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9c62cec4\"]])\n\nexport default __exports__","<template>\n  <FilterPopper :appendToBody=\"true\">\n    <BaseFilterButton :name=\"'Target Set'\" :active=\"isActive\" :tagValue=\"tagValue\" />\n    <template #popper>\n      <div\n        v-if=\"annotationSets && annotationSets.length > 0\"\n        ref=\"checkboxContainer\"\n        class=\"filter-settings scrollbar\"\n      >\n        <div v-for=\"(task, i) in annotationSets\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`annotationSetsForTarget-${i}`\"\n            v-model=\"selectedSet\"\n            type=\"radio\"\n            :name=\"`${task.name}-${i}`\"\n            :value=\"task\"\n          >\n          <label :for=\"`task-${i}`\">{{ task.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        <span>Please define an annotation set.</span>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"ChooseValidationTarget\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Number,\n      default: null,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedSet: {},\n    };\n  },\n  computed: {\n    isActive() {\n      if (this.modelValue) {\n        return true;\n      }\n      return false;\n    },\n    tagValue() {\n      if (this.modelValue) {\n        return this.selectedSet?.name;\n      }\n      return '';\n    },\n  },\n  watch: {\n    selectedSet() {\n      this.updateFilters();\n    },\n    annotationSets: {\n      handler(tasks) {\n        if (tasks.length === 0 || (this.selectedSet && !tasks.find((e) => e.id === this.selectedSet.id))) {\n          this.selectedSet = {};\n        }\n      },\n    },\n    modelValue(v) {\n      if (v) {\n        this.selectedSet = this.annotationSets.find((e) => e.id === this.modelValue);\n        this.updateFilters();\n      }\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.selectedSet = this.annotationSets.find((e) => e.id === this.modelValue);\n      this.updateFilters();\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedSet?.id);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  overflow: auto;\n  min-width: 140px;\n  text-wrap: nowrap;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=radio] {\n    margin-right: 12px;\n  }\n}\n</style>\n","import { render } from \"./ChooseValidationTarget.vue?vue&type=template&id=330c6fc0&scoped=true\"\nimport script from \"./ChooseValidationTarget.vue?vue&type=script&lang=js\"\nexport * from \"./ChooseValidationTarget.vue?vue&type=script&lang=js\"\n\nimport \"./ChooseValidationTarget.vue?vue&type=style&index=0&id=330c6fc0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-330c6fc0\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Confidence Threshold'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <SingleSlider\n          v-model:sliderValue=\"sliderVal\"\n          :step=\"step\"\n          :min=\"min\"\n          :max=\"max\"\n        />\n        <span>{{ sliderVal }}</span>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport SingleSlider from '@/components/SingleSlider.vue';\nimport * as utils from '@/assets/js/utils.js';\n\nexport default {\n  name: \"ConfidenceThresholdFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n    SingleSlider,\n  },\n  props: {\n    modelValue: {\n      type: Number,\n      default: null,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      min: 0,\n      max: 1,\n      sliderVal: 0.25,\n      step: 0.01,\n    };\n  },\n  computed: {\n    isActive() {\n      if (this.modelValue) {\n        return this.modelValue >= 0;\n      }\n      return false;\n    },\n    tagValue() {\n      if (this.modelValue) {\n        return `${this.modelValue.toFixed(2)}`;\n      }\n      return '';\n    },\n  },\n  watch: {\n    sliderVal() {\n      this.debouncedUpdateFilters();\n    },\n    modelValue() {\n      if (this.modelValue && this.modelValue > -1) {\n        this.sliderVal = this.modelValue;\n      }\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 600);\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.sliderVal = this.modelValue;\n      this.updateFilters();\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.sliderVal);\n    },\n    clearSelection() {\n      this.sliderVal = 0.25;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: row;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 350px;\n  min-height: 50px;\n  justify-content: center;\n  align-items: center;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n    text-align: center;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./ConfidenceThresholdFilter.vue?vue&type=template&id=5b719348&scoped=true\"\nimport script from \"./ConfidenceThresholdFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ConfidenceThresholdFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ConfidenceThresholdFilter.vue?vue&type=style&index=0&id=5b719348&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5b719348\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'IoU Threshold'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-settings scrollbar\">\n        <SingleSlider\n          v-model:sliderValue=\"sliderVal\"\n          :step=\"step\"\n          :min=\"min\"\n          :max=\"max\"\n        />\n        <span>{{ sliderVal }}</span>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear Selection</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport SingleSlider from '@/components/SingleSlider.vue';\nimport * as utils from '@/assets/js/utils.js';\n\nexport default {\n  name: \"IoUThresholdFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n    SingleSlider,\n  },\n  props: {\n    modelValue: {\n      type: Number,\n      default: null,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      min: 0,\n      max: 1,\n      sliderVal: 0.5,\n      step: 0.05,\n    };\n  },\n  computed: {\n    isActive() {\n      if (this.modelValue) {\n        return this.modelValue >= 0;\n      }\n      return false;\n    },\n    tagValue() {\n      if (this.modelValue) {\n        return `${this.modelValue.toFixed(2)}`;\n      }\n      return '';\n    },\n  },\n  watch: {\n    sliderVal() {\n      this.debouncedUpdateFilters();\n    },\n    modelValue() {\n      if (this.modelValue) {\n        this.sliderVal = this.modelValue;\n      }\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = utils.debounce(this.updateFilters, 600);\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.sliderVal = this.modelValue;\n      this.updateFilters();\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.sliderVal);\n    },\n    clearSelection() {\n      // this.sliderVal = 0.5;\n      this.$emit('update:modelValue', null);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: row;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 350px;\n  min-height: 50px;\n  justify-content: center;\n  align-items: center;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n    text-align: center;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n</style>\n","import { render } from \"./IoUThresholdFilter.vue?vue&type=template&id=5c6f6f2a&scoped=true\"\nimport script from \"./IoUThresholdFilter.vue?vue&type=script&lang=js\"\nexport * from \"./IoUThresholdFilter.vue?vue&type=script&lang=js\"\n\nimport \"./IoUThresholdFilter.vue?vue&type=style&index=0&id=5c6f6f2a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c6f6f2a\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <BaseFilterButton :name=\"'Metric'\" :active=\"Object.keys(selectedMetric).length > 0\" :tagValue=\"selectedMetric?.name\" />\n    <template #popper>\n      <div\n        ref=\"checkboxContainer\"\n        class=\"filter-settings scrollbar\"\n      >\n        <div v-for=\"(metric, i) in metrics\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`annotationSetsForGroundTruth-${i}`\"\n            v-model=\"selectedMetric\"\n            type=\"radio\"\n            :name=\"`${metric.type}-${i}`\"\n            :value=\"metric\"\n          >\n          <label :for=\"`metric-${i}`\">{{ metric.name }}</label><br>\n        </div>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"MetricFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    restore: {\n      type: Object,\n      default: () => {},\n    },\n    modelValue: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      metrics: [\n        {\n          name: 'IoU',\n          type: 'iou',\n        },\n        {\n          name: 'Center Point',\n          type: 'centerpoint',\n        },\n      ],\n      selectedMetric: {},\n    };\n  },\n  watch: {\n    selectedMetric() {\n      this.updateFilters();\n    },\n    restore: {\n      handler() {\n        if (this.restore) {\n          this.selectedMetric = this.restore;\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.restore) {\n      this.selectedMetric = this.restore;\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedMetric);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  overflow: auto;\n  min-width: 150px;\n  max-width: 200px;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=radio] {\n    margin-right: 12px;\n  }\n}\n</style>\n","import { render } from \"./MetricFilter.vue?vue&type=template&id=3e3233bc&scoped=true\"\nimport script from \"./MetricFilter.vue?vue&type=script&lang=js\"\nexport * from \"./MetricFilter.vue?vue&type=script&lang=js\"\n\nimport \"./MetricFilter.vue?vue&type=style&index=0&id=3e3233bc&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3e3233bc\"]])\n\nexport default __exports__","<template>\n  <FilterPopper>\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Ignore Boxes'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div class=\"filter-text\">Ignore Detections Smaller than</div>\n      <div class=\"filter-settings scrollbar\">\n        <input\n          v-model=\"value\"\n          class=\"select\"\n          type=\"number\"\n          step=\"0.01\"\n          @change=\"changeSanitizer\"\n          @input=\"inputSanitizer\"\n        >\n        <span>px</span>\n      </div>\n      <div class=\"filter-footer\">\n        <button :disabled=\"!isActive\" class=\"button-text clear-button\" @click=\"clearSelection\">Clear</button>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\nimport { inputSanitizer, changeSanitizer, debounce } from '@/assets/js/utils.js';\n\nexport default {\n  name: \"IgnoreBoxesFilter\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    modelValue: {\n      type: Number,\n      default: 0,\n    },\n    restore: {\n      type: Number,\n      default: 0,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      value: 0,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.value > 0;\n    },\n    tagValue() {\n      return this.value.toString();\n    },\n  },\n  watch: {\n    value() {\n      this.debouncedUpdateFilters();\n    },\n    modelValue() {\n      this.value = this.modelValue;\n    },\n    restore: {\n      handler() {\n        if (this.restore > 0) {\n          this.value = this.restore;\n        }\n      },\n    },\n  },\n  created() {\n    this.debouncedUpdateFilters = debounce(this.updateFilters, 600);\n  },\n  mounted() {\n    if (this.restore > 0) {\n      this.value = this.restore;\n    }\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    updateFilters() {\n      this.$emit('update:modelValue', this.value);\n    },\n    clearSelection() {\n      this.value = 0;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-text {\n  text-align: center;\n  font-weight: bold;\n  font-size: 1.0rem;\n}\n.filter-settings {\n  display: flex;\n  flex-direction: row;\n  padding: 12px;\n  border-radius: inherit;\n  gap: 6px;\n  min-height: 50px;\n  margin: 0 3px 0 3px;\n  justify-content: center;\n  align-items: center;\n  width: 200px;\n  overflow: auto;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & span {\n    width: 40px;\n    font-weight: bold;\n    font-size: 1.0rem;\n  }\n\n  input::-webkit-outer-spin-button,\n  input::-webkit-inner-spin-button {\n    -webkit-appearance: none;\n    margin: 0;\n  }\n\n  /* Firefox */\n  input[type=number] {\n    -moz-appearance: textfield;\n  }\n}\n\n.filter-footer {\n  min-height: 38px;\n  width: 100%;\n  border-top: 1px solid rgba(140,140,140,0.375);\n  padding: 8px;\n  text-align: center;\n\n  .clear-button {\n    @include themify() {\n      color: themed('color-danger');\n    }\n\n    &[disabled] {\n      @include themify() {\n        color: themed('color-disabled');\n      }\n    }\n  }\n}\n\n.select {\n  @include themify() {\n    border: 2px solid themed('body-text-color');\n  }\n}\n\n.select:hover {\n  @include themify() {\n    border: 2px solid $color-primary-300;\n  }\n}\n</style>\n","import { render } from \"./IgnoreBoxesFilter.vue?vue&type=template&id=41b0fe98&scoped=true\"\nimport script from \"./IgnoreBoxesFilter.vue?vue&type=script&lang=js\"\nexport * from \"./IgnoreBoxesFilter.vue?vue&type=script&lang=js\"\n\nimport \"./IgnoreBoxesFilter.vue?vue&type=style&index=0&id=41b0fe98&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-41b0fe98\"]])\n\nexport default __exports__","import { render } from \"./ComparisonFilter.vue?vue&type=template&id=a3c85aaa&scoped=true\"\nimport script from \"./ComparisonFilter.vue?vue&type=script&lang=js\"\nexport * from \"./ComparisonFilter.vue?vue&type=script&lang=js\"\n\nimport \"./ComparisonFilter.vue?vue&type=style&index=0&id=a3c85aaa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-a3c85aaa\"]])\n\nexport default __exports__","<template>\n  <div class=\"comparison-table\">\n    <div class=\"table-header\">\n      <span class=\"title\">Threshold Comparison</span>\n    </div>\n    <div v-if=\"tableEntries.length > 0\" class=\"table\">\n      <div class=\"t-row header-row\">\n        <div\n          v-for=\"(h, i) in headers\"\n          :key=\"`header-cell-${i}`\"\n          class=\"cell\"\n        >\n          {{ h }}\n        </div>\n      </div>\n      <div\n        v-for=\"(entry, i) in tableEntries\"\n        :key=\"`entry-row-${i}`\"\n        class=\"t-row\"\n        :class=\"{ 'selected' : currentEntry === i}\"\n        @click=\"handleSelectEntry(i)\"\n      >\n        <div\n          v-for=\"(val, j) in entry\"\n          :key=\"`entry-cell-${j}`\"\n          class=\"cell\"\n        >\n          {{ val }}\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\n\nexport default {\n  name: \"ComparisonTableDynamic\",\n  props: {\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    validations: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: { 'select': null },\n  data() {\n    return {\n      currentEntry: 0,\n    };\n  },\n  computed: {\n    tableEntries() {\n      const entries = [];\n      this.validations.forEach((v) => {\n        const obj = {\n          \"Target\": this.annotationSets.find((e) => e.id === v.target_set_id)[\"name\"],\n          \"IoU\": v.iou,\n          \"Confidence\": v.confidence,\n          \"TP\": v.total_tp,\n          \"FN\": v.total_fn,\n          \"FP\": v.total_class_fp + v.total_loc_fp,\n          \"Accuracy\": v.accuracy.toFixed(2),\n          \"Precision\": v.precision.toFixed(2),\n          \"Recall\": v.recall.toFixed(2),\n          // \"mACC\": v[\"iou\"][\"mACC\"] ? Number(v[\"iou\"][\"mACC\"]).toFixed(2) : 0,\n          // \"mAP\": v[\"iou\"][\"mAP\"] ? Number(v[\"iou\"][\"mAP\"]).toFixed(2) : 0,\n          // \"mAR\": v[\"iou\"][\"mAR\"] ? Number(v[\"iou\"][\"mAR\"]).toFixed(2) : 0,\n        };\n        entries.push(obj);\n      });\n      return entries;\n    },\n    headers() {\n      return Object.keys(this.tableEntries[0]);\n    },\n  },\n  mounted() {\n    if (this.validations.length > 0) {\n      this.handleSelectEntry(0);\n    }\n  },\n  methods: {\n    handleSelectEntry(i) {\n      this.currentEntry = i;\n      this.$emit('select', this.validations[i]);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.comparison-table {\n  height: fit-content;\n  width: calc(100% - 20px);\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  border-radius: 8px;\n  margin: 10px;\n  padding-top: 10px;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('comparison-table-text-color');\n  }\n}\n\n.table-header {\n  display: flex;\n  align-items: center;\n\n}\n.title {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n  font-size: 1.3rem;\n  font-weight:700;\n}\n\n.table {\n  display: flex;\n  flex-direction: column;\n  border-radius: 4px;\n  width: calc(100% - 20px);\n  margin: 8px;\n\n  .t-row {\n    display: flex;\n    flex-direction: row;\n    cursor: default;\n    .cell {\n      flex: 1 1 100px;\n    }\n  }\n\n  .t-row + .t-row {\n    margin-top: 5px;\n  }\n\n  .t-row:not(.header-row):hover, .selected {\n    cursor: pointer;\n    border-radius: 4px;\n    @include themify() {\n      background: themed('comparison-table-row-highlight');\n    }\n  }\n\n  .header-row {\n    font-weight: 700;\n    @include themify() {\n      color: themed('comparison-table-header-text-color');\n    }\n    border-bottom: 0.5px solid rgba(96, 95, 95, 0.5);\n  }\n\n  // .header-row .cell {\n  //   @include themify {\n  //     background-color: themed('annotation-table-column-header');\n  //     color: themed('annotation-table-header-color');\n  //   }\n  //   font-weight:700;\n  // }\n\n  .cell {\n    height: 40px;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    padding-left: 4px;\n    overflow: hidden;\n    white-space: wrap;\n  }\n}\n</style>\n","import { render } from \"./ComparisonTableDynamic.vue?vue&type=template&id=09a56160&scoped=true\"\nimport script from \"./ComparisonTableDynamic.vue?vue&type=script&lang=js\"\nexport * from \"./ComparisonTableDynamic.vue?vue&type=script&lang=js\"\n\nimport \"./ComparisonTableDynamic.vue?vue&type=style&index=0&id=09a56160&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-09a56160\"]])\n\nexport default __exports__","<template>\n  <div class=\"conf-matrix scrollbar\">\n    <div class=\"table-header\">\n      <span class=\"matrix-title\">Confusion Matrix</span>\n    </div>\n    <div class=\"matrix-container\">\n      <div class=\"matrix scrollbar\">\n        <ConfusionMatrixV2 :matrix=\"localMatrix\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport ConfusionMatrixV2 from \"@/components/ValidationPage/ConfusionMatrixV2.vue\";\n\nexport default {\n  name: \"ConfusionMatrixCardV2\",\n  components: {\n    ConfusionMatrixV2,\n  },\n  props: {\n    matrix: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: { },\n  data() {\n    return {\n      series: [],\n      localMatrix: null,\n    };\n  },\n  watch: {\n    matrix: {\n      immediate: true,\n      handler(d) {\n        if (d) {\n          this.updateChart();\n        }\n      },\n    },\n  },\n  methods: {\n    // update value of each column\n    updateChart() {\n      const labels = Object.values(this.matrix['index_name_map']);\n      labels.unshift('background');\n      const formattedData = [];\n      this.matrix['confusion_matrix_data'].forEach((row, i) => {\n        row.forEach((value, j) => {\n          const obj = {\n            Value: value,\n            Xlabel: labels[j],\n            Ylabel: labels[i],\n          };\n          formattedData.push(obj);\n        });\n      });\n      this.localMatrix = {\n        labels,\n        data: formattedData,\n      };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.conf-matrix {\n  display: flex;\n  flex-direction: column;\n  height: fit-content;\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  border-radius: 8px;\n  padding-top: 10px;\n  @include themify() {\n    background: themed('card-color');\n  }\n\n  .apexcharts-heatmap g {\n    @include themify() {\n    color: themed('matrix-text-color') !important;\n    }\n  }\n\n  .apexcharts-heatmap rect:hover {\n    filter: brightness(85%) !important;\n  }\n}\n\n.table-header {\n  display: flex;\n  align-items: center;\n\n}\n.matrix-title {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n  font-size: 1.3rem;\n  font-weight:700;\n}\n\n.matrix-subtitle {\n  font-size: 0.9rem;\n  font-weight: 600;\n  min-width: 200px;\n  align-items: center;\n  margin-left: 15px;\n}\n\n.matrix-container {\n  width: 100%;\n  // height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.matrix {\n  display: block;\n  height: 100%;\n  min-height: 600px;\n  aspect-ratio: 16/9;\n}\n\n.matrix:deep{\n  pointer-events: none;\n}\n\n.apex-charts-data-labels {\n  text-shadow: 0px 0px 17px rgba(0, 0, 0, 1);\n}\n</style>\n","<template>\n  <div class=\"matrix-container\">\n    <div\n      id=\"my_dataviz\"\n      ref=\"datavizRef\"\n      class=\"svg-container\"\n    />\n    <!-- <div v-if=\"height\" class=\"color-legend\" :style=\"{ height: height + 'px' }\" />\n    <div v-if=\"height\" class=\"color-number-legend\" :style=\"{ height: height + 'px' }\">\n      <span>{{ max }}</span>\n      <span>{{ Math.round((max - min) / 2) }}</span>\n      <span>{{ min }}</span>\n      <span>{{ Math.round((max - min) / 2) }}</span>\n      <span>{{ max }}</span>\n    </div> -->\n  </div>\n</template>\n\n<script>\nimport * as d3 from 'd3';\n\nconst tooltipBubbleHeight = 30;\n\nexport default {\n  name: 'ConfusionMatrixV2',\n  components: {},\n  props: {\n    matrix: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: { 'cell-data': null, 'data-range': null, 'loaded': null },\n  data() {\n    return {\n      dataRange: {},\n      axisLabels: [],\n      divWidth: 0,\n      divHeight: 0,\n      margin: {\n        top: 0,\n        right: 40,\n        bottom: 80,\n        left: 120,\n      },\n      svg: null,\n      chart: null,\n      rects: null,\n      tooltipBubble: null,\n      xScale: null,\n      yScale: null,\n      xAxisLabel: null,\n      yAxisLabel: null,\n      successColor: null,\n      failColor: null,\n      dataset: null,\n      containerElement: null,\n    };\n  },\n  computed: {\n    width() {\n      let w = this.divWidth - this.margin.left - this.margin.right;\n      if (w < 100) {\n        w = 100;\n      }\n      return w;\n    },\n    height() {\n      let h = this.divHeight - this.margin.top - this.margin.bottom;\n      if (h < 100) {\n        h = 100;\n      }\n      return h;\n    },\n    max() {\n      if (this.dataset) {\n        return d3.max(this.dataset, (d) => d.Value);\n      }\n      return 0;\n    },\n    min() {\n      if (this.dataset) {\n        return d3.min(this.dataset, (d) => d.Value);\n      }\n      return 0;\n    },\n  },\n  watch: {\n    matrix: {\n      handler() {\n        this.setAxisLabels(this.matrix.labels);\n        this.updateData(this.matrix.data);\n      },\n    },\n  },\n  beforeUnmount() {\n    window.removeEventListener('resize', this.debouncedHandleWindowResize);\n  },\n  mounted() {\n    this.initChart();\n    this.setAxisLabels(this.matrix.labels);\n    this.initAxis();\n    this.inputChartData(this.matrix.data);\n    window.addEventListener('resize', this.debouncedHandleWindowResize);\n    window.dispatchEvent(new Event('resize'));\n  },\n  methods: {\n    cellClicked(imageArr) {\n      this.$emit('cell-data', { detail: { data: imageArr } });\n    },\n    clearSelectedRects() {\n      d3.selectAll(\"rect\").classed(\"rect-selected\", false);\n    },\n    handleMouseOver(d, i, arr) { // Add interactivity\n      const tooltipBottomMargin = 5;\n      const tooltipTextMargin = 16;\n      // Use D3 to select element\n\n      const target = d.target;\n\n      target.classList.add('hovered');\n      // Check if cell is selected, if true move this cell before it\n      // If false move this cell to the end\n      // Node needs to be at end to be drawn above all other cell\n      const checkIfSelected = target.parentElement.querySelectorAll('.rect-selected');\n      if (checkIfSelected.length > 0) {\n        target.parentElement.insertBefore(target, checkIfSelected[0]);\n      } else {\n        target.parentElement.appendChild(target);\n      }\n\n      // Update the tooltip value\n      d3.select(`#tooltip-bubble-text`).text(i.Value);\n      // Adjust tooltip width\n      const textWidth = d3.select('#tooltip-bubble-text').node().getBoundingClientRect().width;\n      const textHeight = d3.select('#tooltip-bubble-text').node().getBoundingClientRect().height;\n      const newBubbleWidth = textWidth + tooltipTextMargin;\n      d3.select('#tooltip-bubble-rect').attr(\"width\", newBubbleWidth);\n\n      // Get this rects's x/y values, then augment for the tooltip\n      const xPosition = parseFloat(target.getAttribute('x')) + this.margin.left + parseFloat(target.getAttribute('width') / 2 - newBubbleWidth / 2);\n      const yPosition = parseFloat(target.getAttribute('y')) + parseFloat(target.getAttribute('height')) + this.margin.top - tooltipBottomMargin - tooltipBubbleHeight;\n      this.tooltipBubble.attr(\"transform\", () => `translate(${xPosition},${yPosition})`);\n      d3.select(`#tooltip-bubble-text`).attr(\"transform\", () => `translate(${tooltipTextMargin / 2}, ${(tooltipBubbleHeight - textHeight) / 1.5})`);\n\n      // Show the tooltip\n      this.tooltipBubble.style(\"visibility\", \"visible\");\n    },\n    handleMouseOut(d, i, arr) { // Add interactivity\n      // Use D3 to select element, change color and size\n      d.target.classList.remove('hovered');\n\n      // Hide the tooltip\n      this.tooltipBubble.style(\"visibility\", \"hidden\");\n    },\n    // handleCellClick(d, i, arr) {\n    //   this.clearSelectedRects();\n    //   const thisCell = d3.select(arr[i])\n    //     .classed(\"rect-selected\", true);\n\n    //   // Make sure selected cell is drawn on top of all others\n    //   thisCell.node().parentElement.appendChild(arr[i]);\n\n    //   this.cellClicked(thisCell.data()[0]);\n    // },\n    inputChartData(data) {\n      // Copy data into global dataset\n      this.dataset = data;\n\n      let accurateSamples = 0;\n      let inaccurateSamples = 0;\n      let totalSamples = 0;\n\n      // Update color scale domain based on max values of the dataset\n      this.successColor\n        .domain([0, this.max]);\n      this.failColor\n        .domain([0, this.max]);\n\n      const rects = this.chart.selectAll()\n        .data(this.dataset, (d) => {\n          if (d.Xlabel === d.Ylabel) {\n            accurateSamples += d.Value;\n          } else {\n            inaccurateSamples += d.Value;\n          }\n        })\n        .enter()\n        .append(\"rect\")\n        .attr(\"x\", (d) => this.xScale(d.Xlabel))\n        .attr(\"y\", (d) => this.yScale(d.Ylabel))\n        .attr(\"width\", this.xScale.bandwidth())\n        .attr(\"height\", this.yScale.bandwidth())\n        .style(\"stroke\", \"black\")\n        .style(\"stroke-width\", \"1px\")\n        .style(\"fill\", (d) => {\n          if (d.Xlabel === d.Ylabel) {\n            return this.successColor(d.Value);\n          }\n          return this.failColor(d.Value);\n        });\n\n      rects.on(\"mouseover\", this.handleMouseOver);\n      rects.on(\"mouseout\", this.handleMouseOut);\n      // rects.on(\"click\", this.handleCellClick);\n      // Update overview accuracy value\n      totalSamples = accurateSamples + inaccurateSamples;\n      const accuracy = (accurateSamples / totalSamples);\n\n      return { accuracy, numSamples: totalSamples };\n    },\n    setAxisLabels(labels) {\n      this.axisLabels = labels;\n    },\n    initAxis() {\n      // Build X scales and axis:\n      this.xScale = d3.scaleBand()\n        .domain(this.axisLabels)\n        .rangeRound([0, this.width])\n        .paddingInner(0);\n      this.chart.append(\"g\")\n        .attr(\"class\", \"x-axis\")\n        .attr(\"id\", `x-axis`)\n        .attr(\"transform\", `translate(0,${this.height})`)\n        .call(d3.axisBottom(this.xScale))\n        .selectAll(\"text\")\n        .style(\"text-anchor\", \"start\")\n        .attr(\"dx\", \"1em\")\n        .attr(\"dy\", \"0.8em\")\n        .attr(\"transform\", \"rotate(30)\");\n\n      // Build Y scales and axis:\n      this.yScale = d3.scaleBand()\n        .domain(this.axisLabels)\n        .rangeRound([0, this.height])\n        .paddingInner(0)\n        .align(1);\n\n      this.chart.append(\"g\")\n        .attr(\"class\", \"y-axis\")\n        .attr(\"id\", 'y-axis')\n        .call(d3.axisLeft(this.yScale));\n      // text label for the x axis\n      this.xAxisLabel = this.chart.append(\"text\")\n        .attr(\"id\", 'x-axis-label')\n        .attr(\"class\", \"axis-label\")\n        .style(\"text-anchor\", \"middle\")\n        .text(\"Ground Truth\")\n        .attr(\"transform\", `translate(${this.width / 2},\n              ${this.height + parseInt(d3.select('#x-axis').node().getBoundingClientRect().height, 10) + 20})`);\n\n      // text label for the y axis\n      this.yAxisLabel = this.chart.append(\"text\")\n        .attr(\"ref\", 'y-axis-label')\n        .attr(\"class\", \"axis-label\")\n        .attr(\"transform\", \"rotate(-90)\")\n        .style(\"text-anchor\", \"middle\")\n        .text(\"Predicted\")\n        .attr(\"y\", () => 0 - this.margin.left)\n        .attr(\"x\", 0 - (this.height / 2))\n        .attr(\"dy\", \"1em\");\n    },\n    initChart(element = \"my_dataviz\") {\n      this.containerElement = element;\n\n      this.getDivDimensions();\n\n      // append the svg object to the body of the page\n      this.svg = d3.select(`#${this.containerElement}`)\n        .append(\"svg\")\n        .attr(\"id\", 'chart-svg')\n        .attr('class', 'conf-matrix-chart')\n        .attr(\"width\", this.divWidth)\n        .attr(\"height\", this.divHeight)\n        .attr(\"style\", \"margin-bottom: 10px\");\n\n      this.chart = this.svg.append(\"g\")\n        .attr(\"id\", `chart`)\n        .attr(\"transform\", `translate(${this.margin.left},${this.margin.top})`);\n\n      this.tooltipBubble = this.svg.append(\"g\")\n        .attr(\"id\", `tooltip`)\n        .style(\"visibility\", \"hidden\");\n      this.tooltipBubble.append(\"rect\")\n        .attr(\"id\", `tooltip-bubble-rect`)\n        .attr(\"class\", \"svg-tooltip-bubble-rect\")\n        .attr(\"height\", tooltipBubbleHeight)\n        .attr(\"rx\", 10)\n        .attr(\"fill\", \"#d9d7d7\")\n        .style(\"stroke\", \"black\")\n        .style(\"stroke-width\", \"1px\");\n\n      this.tooltipBubble.append(\"text\")\n        .attr(\"id\", `tooltip-bubble-text`)\n        .attr(\"class\", \"svg-tooltip-bubble-text\")\n        .attr(\"y\", tooltipBubbleHeight / 2);\n      // Build color scale\n      this.successColor = d3.scaleLinear()\n        .range([\"transparent\", \"green\"]);\n\n      // Build color scale\n      this.failColor = d3.scaleLinear()\n        .range([\"transparent\", \"red\"]);\n    },\n    resizeAxis(transitionDuration) {\n      // Axis and line transitions\n      this.svg.selectAll(`#${this.containerElement} #x-axis`)\n        .transition(\"x-axis-transition\")\n        .duration(transitionDuration)\n        .call(d3.axisBottom(this.xScale));\n      this.svg.selectAll(`#${this.containerElement} #y-axis`)\n        .transition(\"y-axis-transition\")\n        .duration(transitionDuration)\n        .call(d3.axisLeft(this.yScale));\n\n      this.xAxisLabel\n        .attr(\"transform\", () => `translate(${this.width / 2} ,${this.height + this.margin.bottom})`);\n\n      this.yAxisLabel\n        .attr(\"x\", 0 - (this.height / 2));\n    },\n    resizeRects(transitionDuration) {\n      this.chart.selectAll(\"rect\")\n        .transition(\"rects-resize-transition\")\n        .duration(transitionDuration)\n        .attr(\"x\", (d) => this.xScale(d.Xlabel))\n        .attr(\"y\", (d) => this.yScale(d.Ylabel))\n        .attr(\"width\", this.xScale.bandwidth())\n        .attr(\"height\", this.yScale.bandwidth());\n    },\n    resizeChart(transitionDuration) {\n      this.resizeAxis(transitionDuration);\n      this.resizeRects(transitionDuration);\n    },\n    debouncedHandleWindowResize() {\n      this.handleWindowResize(0);\n      // debounce not working;\n    },\n    getDivDimensions() {\n      const padding = 20;\n      let h = parseFloat(this.$refs.datavizRef.clientHeight);\n      if (!h || h === 0) {\n        h = 100;\n      }\n      this.divHeight = h - (padding * 2);\n\n      let w = parseFloat(this.$refs.datavizRef.clientWidth);\n      if (!w || w === 0) {\n        w = 100;\n      }\n      this.divWidth = w - (padding * 2);\n    },\n    handleWindowResize(transitionDuration) {\n      if (this.containerElement) {\n        // Calculate new dimensions\n        this.getDivDimensions();\n        // Adjust SVG\n        this.svg.attr(\"width\", this.divWidth)\n          .attr(\"height\", this.divHeight);\n\n        // Adjust both axis\n        if (this.yScale && this.xScale) {\n          this.yScale.rangeRound([0, this.height]);\n          this.xScale.rangeRound([0, this.width]);\n          d3.select(`#${this.containerElement} #x-axis`)\n            .attr(\"transform\", `translate(0,${this.height})`);\n          this.resizeChart(transitionDuration);\n        }\n      }\n    },\n    updateData(data) {\n      // Copy data into global dataset\n      this.dataset = data;\n\n      // Update scale domains\n      this.xScale.domain(this.axisLabels);\n      this.yScale.domain(this.axisLabels);\n\n      // Update all rects\n      let accurateSamples = 0;\n      let inaccurateSamples = 0;\n      let totalSamples = 0;\n\n      // Determine if there was a previously selected rect\n      const selectedRects = d3.select(`#${this.containerElement} rect.rect-selected`);\n      let selectedRow = null;\n      let selectedCol = null;\n      if (selectedRects.size() > 0) {\n        selectedRow = selectedRects.data()[0].row;\n        selectedCol = selectedRects.data()[0].col;\n      }\n      this.clearSelectedRects();\n\n      this.successColor\n        .domain([0,\n          d3.max(this.dataset, (d) => d.Value),\n        ]);\n\n      this.failColor\n        .domain([0,\n          d3.max(this.dataset, (d) => d.Value),\n        ]);\n\n      // Select rects and update data and fill color\n      this.rects = this.chart.selectAll(\"rect\")\n        .data(this.dataset)\n        .each(function resetSelectedRect(d) {\n          if (d.row === selectedRow && d.col === selectedCol) {\n            // Add rect-selected class to previously selected rect and move elem to top\n            this.classList.add('rect-selected');\n            this.parentElement.appendChild(this);\n          }\n        })\n        .style(\"fill\", (d) => {\n          if (d.Xlabel === d.Ylabel) {\n            return this.successColor(d.Value);\n          }\n          return this.failColor(d.Value);\n        });\n\n      // Exit\n\n      // Enter\n      this.rects.enter()\n        .append(\"rect\")\n        .attr(\"x\", this.width)\n        .attr(\"y\", 0)\n        .attr(\"width\", this.xScale.bandwidth())\n        .attr(\"height\", this.yScale.bandwidth())\n        .attr(\"fill\", (d) => {\n          if (d.Xlabel === d.Ylabel) {\n            return this.successColor(d.Value);\n          }\n          return this.failColor(d.Value);\n        })\n        .merge(this.rects)\n        .attr(\"x\", (d) => this.xScale(d.Xlabel))\n        .attr(\"y\", (d) => this.yScale(d.Ylabel))\n        .attr(\"width\", this.xScale.bandwidth())\n        .attr(\"height\", this.yScale.bandwidth());\n\n      // Determine number of accurate and inaccurate samples\n      this.chart.selectAll(\"rect\")\n        .each((d) => {\n          if (d.Xlabel === d.Ylabel) {\n            accurateSamples += d.Value;\n          } else {\n            inaccurateSamples += d.Value;\n          }\n        });\n\n      // Update overview accuracy value\n      totalSamples = accurateSamples + inaccurateSamples;\n      const accuracy = (accurateSamples / totalSamples);\n\n      return { accuracy, numSamples: totalSamples };\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.svg-container {\n  display: flex;\n  overflow: hidden;\n  position: relative;\n  vertical-align: top;\n  width: 100%;\n  min-width: 350px;\n  height: 100%;\n  padding: 20px 20px 20px 20px;\n}\n\n.matrix-container {\n  height: 100%;\n}\n\n// .color-legend {\n//   width: 30px;\n//   background: linear-gradient( red, white, green);\n// }\n// .color-number-legend {\n//   display: flex;\n//   flex-direction: column;\n//   width: fit-content;\n//   margin-top: 40px;\n//   padding-left: 10px;\n//   padding-right: 5px;\n//   justify-content: space-between;\n//   font-size: 12px;\n// }\n\n.axis-label {\n  font-size: 14px;\n  font-weight: bold;\n}\n\n.y-axis {\n  font-size: 0.7rem;\n}\n\n.x-axis {\n  font-size: 0.7rem;\n}\n\n</style>\n","import { render } from \"./ConfusionMatrixV2.vue?vue&type=template&id=5af0671d\"\nimport script from \"./ConfusionMatrixV2.vue?vue&type=script&lang=js\"\nexport * from \"./ConfusionMatrixV2.vue?vue&type=script&lang=js\"\n\nimport \"./ConfusionMatrixV2.vue?vue&type=style&index=0&id=5af0671d&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./ConfusionMatrixCardV2.vue?vue&type=template&id=e6520fe6\"\nimport script from \"./ConfusionMatrixCardV2.vue?vue&type=script&lang=js\"\nexport * from \"./ConfusionMatrixCardV2.vue?vue&type=script&lang=js\"\n\nimport \"./ConfusionMatrixCardV2.vue?vue&type=style&index=0&id=e6520fe6&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./ConfusionMatrixModal.vue?vue&type=template&id=79fdcf4c&scoped=true\"\nimport script from \"./ConfusionMatrixModal.vue?vue&type=script&lang=js\"\nexport * from \"./ConfusionMatrixModal.vue?vue&type=script&lang=js\"\n\nimport \"./ConfusionMatrixModal.vue?vue&type=style&index=0&id=79fdcf4c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-79fdcf4c\"]])\n\nexport default __exports__","<template>\n  <Teleport :to=\"'body'\">\n    <Modal\n      ref=\"snapshotsModal\"\n      :title=\" mode === 'add' ? 'Add Snapshots' : 'Restore Snapshot'\"\n      :width=\"'800px'\"\n    >\n      <!-- <template #modal-header /> -->\n      <template #modal-main>\n        <div class=\"settings container scrollbar\">\n          <template v-if=\"mode==='add'\">\n            <div class=\"row mt-2\">\n              <div class=\"col-6 settings__control-group\">\n                <label class=\"required\">Project</label>\n                <select\n                  id=\"project-select\"\n                  v-model=\"project\"\n                  class=\"select\"\n                  required\n                  @change=\"selectedProjectChange(project)\"\n                >\n                  <option :key=\"'project-select-null'\" disabled :value=\"null\">\n                    Select a Project\n                  </option>\n                  <option v-for=\"option in projects\" :key=\"`project-select-${option.id}`\" :value=\"option\">\n                    {{ option.name }}\n                  </option>\n                </select>\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-6 settings__control-group\">\n                <label class=\"required\">Dataset</label>\n                <select\n                  id=\"source-DS-select\"\n                  v-model=\"dataset\"\n                  class=\"select\"\n                  required\n                >\n                  <option :key=\"'source-select-null'\" disabled :value=\"null\">Select a Dataset</option>\n                  <option v-for=\"option in datasets\" :key=\"`select-${option.id}`\" :value=\"option\">\n                    {{ option.name }}\n                  </option>\n                </select>\n              </div>\n              <div v-if=\"loadingDatasets\" class=\"col-1 settings__control-group\">\n                <InlineLoader\n                  v-tooltip=\"'Loading datasets. Please wait.'\"\n                  :width=\"'30px'\"\n                  :height=\"'30px'\"\n                  :border=\"'6px'\"\n                  class=\"mt-6\"\n                />\n              </div>\n              <div class=\"col settings__control-group align-items-start\">\n                <label>Annotation Set</label>\n                <AnnotationSetsRadioSelect\n                  v-model=\"annotationSet\"\n                  :annotationSets=\"dataset ? dataset.annotation_sets : null\"\n                />\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label class=\"required\">Description</label>\n                <textarea\n                  v-model=\"new_snapshot\"\n                  placeholder=\"Description for the snapshot\"\n                  class=\"select description-body\"\n                  rows=\"10\"\n                  cols=\"50\"\n                />\n              </div>\n            </div>\n          </template>\n          <template v-else>\n            <div class=\"row mt-2\">\n              <div class=\"col-12 settings__control-group\">\n                <label class=\"label\">Snapshot Description</label>\n                <label class=\"snapshot-desc\">{{ snapshot ? snapshot.description : '' }}</label>\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-6 settings__control-group\">\n                <label class=\"required\">Project</label>\n                <select\n                  id=\"project-select\"\n                  v-model=\"project\"\n                  class=\"select\"\n                  required\n                  @change=\"selectedProjectChange(project)\"\n                >\n                  <option :key=\"'project-select-null'\" disabled :value=\"null\">\n                    Select a Project\n                  </option>\n                  <option v-for=\"option in projects\" :key=\"`project-select-${option.id}`\" :value=\"option\">\n                    {{ option.name }}\n                  </option>\n                </select>\n              </div>\n            </div>\n            <div class=\"row mt-1\">\n              <v-checkbox\n                v-model=\"mcapTopics\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n              >\n                <template #label>\n                  <span class=\"checkbox-label\">Use MCAP Selected Topics</span>\n                  <SVGIcon\n                    v-tooltip=\"`Only selected topics will be used for mcap file publishing and will be shown on the result dataset.\n                     An mcap file is required in the snapshot for this functionality to take effect. Else, all topics are stored.\n                     Camera topics (JPEG and H264) are always enabled to ensure meaningful data.`\"\n                    :width=\"'20px'\"\n                    :height=\"'20px'\"\n                    :iconName=\"'info'\"\n                    class=\"help-icon\"\n                  />\n                </template>\n              </v-checkbox>\n            </div>\n            <div v-if=\"mcapTopics\" class=\"row ml-3 mt-1\">\n              <div class=\"col-12 topics-grid\">\n                <v-checkbox\n                  v-for=\"(topic,i) in topics\"\n                  :key=\"i\"\n                  v-model=\"selectedTopics\"\n                  color=\"#250e81\"\n                  :hide-details=\"true\"\n                  :density=\"'compact'\"\n                  :value=\"topic.value\"\n                  :disabled=\"topic.value === '/camera/jpeg' || topic.value === '/camera/h264'\"\n                >\n                  <template #label>\n                    <span class=\"checkbox-label\">{{ topic.display }}</span>\n                  </template>\n                </v-checkbox>\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <v-checkbox\n                v-model=\"useFPS\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n              >\n                <template #label>\n                  <span class=\"checkbox-label\">Use MCAP Frame Rate</span>\n                  <SVGIcon\n                    v-tooltip=\"`Adjust the frame rate (FPS) to process mcap files in the snapshot at. This will affect Depth Generation and AI Ground Truth Generation.`\"\n                    :width=\"'20px'\"\n                    :height=\"'20px'\"\n                    :iconName=\"'info'\"\n                    class=\"help-icon\"\n                  />\n                </template>\n              </v-checkbox>\n            </div>\n            <div v-if=\"useFPS\" class=\"row ml-3 mt-1\">\n              <div class=\"col-6 settings__control-group\">\n                <label>FPS</label>\n                <input\n                  v-model=\"fps\"\n                  class=\"input\"\n                  type=\"number\"\n                  min=\"1\"\n                >\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <v-checkbox\n                v-model=\"depthGen\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n              >\n                <template #label>\n                  <span class=\"checkbox-label\">Depth Generation</span>\n                  <SVGIcon\n                    v-tooltip=\"`Generate Depth Maps for frames in snapshot.`\"\n                    :width=\"'20px'\"\n                    :height=\"'20px'\"\n                    :iconName=\"'info'\"\n                    class=\"help-icon\"\n                  />\n                </template>\n              </v-checkbox>\n            </div>\n            <div class=\"row mt-3\">\n              <v-checkbox\n                v-model=\"agtgPipeline\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n              >\n                <template #label>\n                  <span class=\"checkbox-label\">AI Ground Truth Generation</span>\n                  <SVGIcon\n                    v-tooltip=\"`Generate 2D Bounding Boxes and Segmentation Masks for frames in snapshot. 3D Bounding Boxes are also generated if LiDAR or Radar files are available.`\"\n                    :width=\"'20px'\"\n                    :height=\"'20px'\"\n                    :iconName=\"'info'\"\n                    class=\"help-icon\"\n                  />\n                </template>\n              </v-checkbox>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label class=\"label\">Dataset name (Optional)</label>\n                <input\n                  v-model=\"createNewName\"\n                  class=\"select\"\n                  type=\"text\"\n                >\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label>Dataset description (Optional)</label>\n                <textarea\n                  v-model=\"createNewDescription\"\n                  rows=\"2\"\n                  cols=\"50\"\n                />\n              </div>\n            </div>\n            <div v-if=\"message\" class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <div class=\"result error\">\n                  <span>{{ message }}</span>\n                </div>\n              </div>\n            </div>\n          </template>\n        </div>\n      </template>\n      <template #modal-footer>\n        <div class=\"footer\">\n          <button\n            v-if=\"mode === 'add'\"\n            class=\"button button-sm\"\n            :disabled=\"!new_snapshot || (new_snapshot && new_snapshot === '') || !dataset\"\n            @click=\"addSnapshot\"\n          >\n            Add Snapshot\n          </button>\n          <button\n            v-else\n            class=\"button button-sm\"\n            :disabled=\"!project\"\n            @click=\"restoreSnapshot\"\n          >\n            Restore Snapshot\n          </button>\n        </div>\n      </template>\n    </Modal>\n  </Teleport>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport AnnotationSetsRadioSelect from '@/components/DatasetComponent/AnnotationSetsRadioSelect.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\nimport InlineLoader from '@/components/InlineLoader.vue';\n\nconst $toast = useToast();\n\nexport default {\n  name: 'SnapshotListModal',\n  components: {\n    Modal,\n    AnnotationSetsRadioSelect,\n    SVGIcon,\n    InlineLoader,\n  },\n  props: {\n    mode: {\n      type: String,\n      default: 'add',\n    },\n    snapshot: {\n      type: Object,\n      default: () => {},\n    },\n    projects: {\n      type: Array,\n      default: () => [],\n    },\n    inputProject: {\n      type: Object,\n      default: () => {},\n    },\n    inputDataset: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['restore-snapshot', 'add-snapshot'],\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      project: null,\n      dataset: null,\n      datasets: null,\n      annotationSet: null,\n      new_snapshot: '',\n      createNewName: '',\n      createNewDescription: '',\n      message: '',\n      depthGen: false,\n      agtgPipeline: false,\n      mcapTopics: false,\n      selectedTopics: ['/camera/jpeg', '/camera/h264', '/model/boxes2d', '/model/mask', '/radar/targets', '/radar/cube', '/imu', '/gps', '/lidar/points', '/lidar/depth', '/lidar/reflect'],\n      topics: [\n        { display: 'Camera JPEG', value: '/camera/jpeg' },\n        { display: 'Camera H264', value: '/camera/h264' },\n        { display: '2D Bounding Box', value: '/model/boxes2d' },\n        { display: 'Segmentation Mask', value: '/model/mask' },\n        { display: 'Radar PCD', value: '/radar/targets' },\n        { display: 'Radar Cube', value: '/radar/cube' },\n        { display: 'Pose', value: '/imu' },\n        { display: 'Location', value: '/gps' },\n        { display: 'LiDAR PCD', value: '/lidar/points' },\n        { display: 'LiDAR Depth Map', value: '/lidar/depth' },\n        { display: 'LiDAR Reflect Map', value: '/lidar/reflect' },\n      ],\n      useFPS: false,\n      fps: 1,\n      loadingDatasets: false,\n    };\n  },\n  methods: {\n    async selectedProjectChange(p) {\n      if (p) {\n        this.datasets = await this.getDatasets(p);\n      }\n    },\n    async getDatasets(project) {\n      const params = {\n        project_id: project.id,\n        get_annotation_sets: true,\n      };\n      this.loadingDatasets = true;\n      const resp = await this.dataConnect.getDatasetList(params)\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to retrieve datasets: ${error}`,\n            type: 'error',\n            position: 'top',\n          });\n        });\n      if (!resp || resp.error || !resp.result) {\n        // TODO: handle error\n        if (resp.error) console.error(resp.error);\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Failed to retrieve datasets: ${resp.error}`,\n          type: 'error',\n          position: 'top',\n        });\n        this.loadingDatasets = false;\n        return [];\n      }\n      this.loadingDatasets = false;\n      return resp.result;\n    },\n    async showModal() {\n      this.$refs.snapshotsModal.showModal();\n      if (!this.projects || (this.projects && this.projects.length === 0)) {\n        await this.getProjectList();\n      }\n      if (this.inputProject) {\n        this.project = this.projects.find((e) => e.id === this.inputProject.id);\n        await this.selectedProjectChange(this.project);\n      }\n      this.$nextTick(() => {\n        if (this.inputDataset) {\n          this.dataset = this.datasets.find((e) => e.id === this.inputDataset.id);\n        }\n      });\n    },\n    closeModal() {\n      this.project = null;\n      this.datasets = null;\n      this.dataset = null;\n      this.annotationSet = null;\n      this.new_snapshot = '';\n      this.createNewName = '';\n      this.createNewDescription = '';\n      this.depthGen = false;\n      this.agtgPipeline = false;\n      this.useFPS = false;\n      this.fps = 1;\n      this.mcapTopics = false;\n      this.selectedTopics = ['/model/boxes2d', '/model/mask', '/radar/targets', '/radar/cube', '/imu', '/gps', '/lidar/points', '/lidar/depth', '/lidar/reflect'];\n      this.$refs.snapshotsModal.closeModal();\n    },\n    async addSnapshot() {\n      this.message = '';\n      if (!this.project) {\n        this.message = \"Missing project\";\n        return;\n      }\n      if (!this.dataset) {\n        this.message = \"Missing dataset\";\n        return;\n      }\n      if (!this.new_snapshot || this.new_snapshot === '') {\n        this.message = \"Missing description\";\n        return;\n      }\n      const params = {\n        dataset_id: this.dataset.id,\n        description: this.new_snapshot,\n      };\n      if (this.annotationSet) {\n        params.annotation_set_id = this.annotationSet.id;\n      }\n      await this.dataConnect.createNewSnapshot(params).then((data) => {\n        if (data && data.result) {\n          this.closeModal();\n          this.$emit('add-snapshot');\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Creating snapshot '${data.result.description}' in progress`,\n            type: 'success',\n            position: 'top',\n            // all of other options may go here\n          });\n        } else {\n          this.message = data.error;\n        }\n      }).catch((e) => console.log(e));\n    },\n    async restoreSnapshot() {\n      this.message = '';\n      if (!this.project) {\n        this.message = \"Missing project\";\n        return;\n      }\n\n      await this.dataConnect.restoreSnapshot({\n        project_id: this.project.id,\n        snapshot_id: this.snapshot.id,\n        dataset_name: this.createNewName,\n        dataset_description: this.createNewDescription,\n        depth_gen: this.depthGen,\n        agtg_pipeline: this.agtgPipeline,\n        fps: this.fps,\n        enabled_topics: this.selectedTopics,\n        label_names: ['person'],\n      }).then((data) => {\n        if (data && data.result) {\n          this.closeModal();\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Restoring snapshot to dataset '${data.result.name}' in progress`,\n            type: 'success',\n            position: 'top',\n          });\n        } else {\n          this.message = data.error;\n        }\n      }).catch((e) => console.log(e));\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\na {\n  text-decoration: none;\n  @include themify() {\n      color: themed('body-text-color');\n    }\n}\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n  overflow-y:auto;\n}\n\n.description-body {\n  height: 100px;\n  min-height: 100px;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n.snapshot-desc {\n  color: black !important;\n  font-size: 1rem;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.checkbox-label {\n  margin-left: 10px;\n  font-size: 14px;\n  font-weight: 600;\n}\n\n.topics-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, 220px);\n  width: 100%;\n  gap: 5px;\n  padding: 5px;\n  max-height: 500px;\n  overflow-y: auto;\n}\n\n.help-icon {\n  margin: 0 5px;\n  color: var(--color-primary);\n}\n\n.help-icon:focus {\n  outline: none;\n}\n\n.dataset-select {\n  width: 100%;\n  display: flex;\n  flex-direction: row\n}\n\n</style>\n","import { render } from \"./SnapshotAddModal.vue?vue&type=template&id=10eac52a&scoped=true\"\nimport script from \"./SnapshotAddModal.vue?vue&type=script&lang=js\"\nexport * from \"./SnapshotAddModal.vue?vue&type=script&lang=js\"\n\nimport \"./SnapshotAddModal.vue?vue&type=style&index=0&id=10eac52a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-10eac52a\"]])\n\nexport default __exports__","import { render } from \"./DatasetManagement.vue?vue&type=template&id=5eaa4115&scoped=true\"\nimport script from \"./DatasetManagement.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetManagement.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetManagement.vue?vue&type=style&index=0&id=5eaa4115&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5eaa4115\"]])\n\nexport default __exports__","<template>\n  <div class=\"controls-bar\">\n    <DatasetFilter\n      v-model=\"datasetFilters\"\n      :dataset=\"currentDataset\"\n      :annotationSets=\"annotationSets\"\n      :labels=\"currentLabels\"\n      :types=\"currentTypes\"\n      :collapsible=\"true\"\n      :showCopyFilteredImagesBtn=\"permissions && permissions.dataset_write\"\n      :showDeleteFilteredImagesBtn=\"permissions && permissions.dataset_write\"\n      @open-copy-filters=\"openCopyFilteredImagesModal\"\n      @delete-filtered-images=\"openConfirmDeleteFilteredImagesModal\"\n    />\n  </div>\n  <GalleryGrid\n    ref=\"galleryGrid\"\n    v-model:selectedImages=\"selectedImages\"\n    :imageList=\"imageList\"\n    :totalImageCount=\"totalImageCount\"\n    :imagesPerPage=\"imagesPerPage\"\n    :annotationSets=\"annotationSets\"\n    :doneFetch=\"doneFetch\"\n  >\n    <template #header-first-row-start>\n      <div class=\"gallery-actions\">\n        <span>{{ selectedImages && selectedImages.length > 0 ? `Selected Images (${selectedImages.length} / ${totalImageCount})` :`Images (${totalImageCount})` }}</span>\n      </div>\n    </template>\n    <template #header-first-row-end>\n      <div class=\"gallery-actions\">\n        <button class=\"button\" @click.stop=\"selectAll\"> {{ selectedImages.length < imageList.length ? 'Select Page' : 'Deselect Page' }}</button>\n        <DisplayAnnotationsFilter\n          v-model=\"annotationDisplaySettings\"\n          :annotationSets=\"annotationSets\"\n          :labels=\"currentLabels\"\n        />\n        <DisplayImageDetails\n          v-model=\"imageDisplaySettings\"\n        />\n        <GalleryActionsDropdown\n          :dataset=\"currentDataset\"\n          :selectedImages=\"selectedImages\"\n          @remove-tag=\"handleRemoveTagsForSelectedImages\"\n          @add-tag=\"handleAddTagsForSelectedImages\"\n          @delete-images=\"openConfirmDeleteImageModal\"\n          @refresh-dataset=\"handleRefreshPage\"\n        />\n        <button class=\"button import\" @click.stop=\"openUploadModal\">\n          <SVGIcon\n            :iconName=\"'import'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />Import\n        </button>\n      </div>\n    </template>\n    <template #header-second-row-start>\n      <div class=\"gallery-actions\">\n        <!-- <button class=\"button\" :class=\"{ 'inactive': false }\">\n            Copy Images\n          </button> -->\n      </div>\n    </template>\n    <template #header-second-row-end>\n      <div class=\"gallery-actions\">\n        <v-pagination\n          id=\"gallery-page-selector\"\n          v-model=\"currentPage\"\n          class=\"pagination\"\n          :length=\"numPages\"\n          :total-visible=\"7\"\n          density=\"compact\"\n        />\n        <div class=\"sort-by\">\n          <GalleryImageSort v-model:sortBy=\"sortBy\" v-model:ascend=\"reverse\" />\n        </div>\n      </div>\n    </template>\n    <template #grid-item>\n      <!-- click.stop to prevent triggering select box on item click -->\n      <GalleryGridItem2\n        v-for=\"imageObj in imageList\"\n        :key=\"imageObj.id\"\n        v-model:selectedImages=\"selectedImages\"\n        :imageObj=\"imageObj\"\n        :annotations=\"imageObj.annotations\"\n        :annotationSets=\"annotationSets\"\n        :annotationDisplayType=\"colorAnnotationsBy\"\n        :filterAnnotationsBySets=\"displayAnnotationSets\"\n        :filterAnnotationsByLabelIndexes=\"displayLabels\"\n        :labels=\"currentLabels\"\n        :showName=\"showImageName\"\n        :showTags=\"showTags\"\n        :shouldShowSelector=\"true\"\n        v-bind=\"gridItemDisplayProp\"\n        @mousedown.stop=\"\"\n        @mouseup.stop=\"\"\n        @grid-item-clicked=\"displayImage($event)\"\n        @delete-image-from-dataset=\"openConfirmDeleteImageModal\"\n        @copy=\"handleCopy\"\n        @download=\"handleDownload\"\n      />\n    </template>\n    <template #empty-state>\n      <GalleryEmptyState\n        v-if=\"!isFetchingImages\"\n        ref=\"galleryEmptyState\"\n        :datasetID=\"currentDatasetID\"\n        @import-clicked=\"$refs.uploadImagesModal.showModal();\"\n      />\n    </template>\n    <template #overlay>\n      <div v-if=\"isFetchingImages\" id=\"loading-visualization\"><div class=\"lds-ring\"><div /><div /><div /><div /></div></div>\n      <GalleryDropZone\n        ref=\"galleryEmptyState\"\n        :datasetID=\"currentDatasetID\"\n        :showIcon=\"imageList && imageList.length > 0\"\n        @upload-complete=\"handleImageUploadComplete\"\n      />\n    </template>\n    <!-- <template #selectBox>\n      <GalleryGridSelectBox\n        :selectedImages=\"selectedImages\"\n        @multi-select=\"handleMultiSelect\"\n      />\n    </template> -->\n  </GalleryGrid>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n  <UploadImagesModal\n    ref=\"uploadImagesModal\"\n    :datasetID=\"currentDatasetID\"\n    :annotationSets=\"annotationSets\"\n    @upload-complete=\"handleImageUploadComplete\"\n    @upload-error=\"handleUploadError\"\n  />\n  <DatasetCopyModal\n    v-if=\"showCopyModal\"\n    ref=\"copyDatasetModal\"\n    v-model:show=\"showCopyModal\"\n    :datasets=\"datasets\"\n    :source=\"currentDataset\"\n    :filters=\"imageFilterParams\"\n    :showFilters=\"false\"\n    :lockSource=\"true\"\n    @closed=\"modalDataset = null\"\n  />\n  <ImageCopyModal\n    v-if=\"showCopyImageModal\"\n    ref=\"copyImageModal\"\n    v-model:show=\"showCopyImageModal\"\n    :datasets=\"datasets\"\n    :annotationSets=\"annotationSets\"\n    :selectedImages=\"selectedImages\"\n    :types=\"currentTypes\"\n  />\n  <DatasetExportModal\n    ref=\"datasetExportModal\"\n    :datasets=\"datasets\"\n    :sequences=\"sequences\"\n    :exportDataset=\"currentDataset\"\n  />\n</template>\n\n<script>\nimport DisplayAnnotationsFilter from '@/components/DatasetComponent/GalleryComponent/DisplayAnnotationsFilterV2.vue';\nimport GalleryImageSort from '@/components/DatasetComponent/GalleryComponent/GalleryImageSort.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport GalleryGrid from '@/components/DatasetComponent/GalleryComponent/GalleryGrid.vue';\nimport UploadImagesModal from '@/components/DatasetComponent/UploadImagesModal.vue';\nimport GalleryGridItem2 from '@/components/DatasetComponent/GalleryComponent/GalleryGridItem2.vue';\nimport GalleryEmptyState from '@/components/DatasetComponent/GalleryComponent/GalleryEmptyState.vue';\nimport GalleryDropZone from '@/components/DatasetComponent/GalleryComponent/GalleryDropZone.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport DatasetCopyModal from \"@/components/DatasetComponent/DatasetManagement/DatasetCopyModal.vue\";\nimport DatasetExportModal from \"@/components/DatasetComponent/DatasetManagement/DatasetExportModal.vue\";\nimport DisplayImageDetails from '@/components/DatasetComponent/GalleryComponent/DisplayImageDetails.vue';\nimport useGallery from '@/composables/annotationTool/useGallery.js';\nimport DatasetFilter from '@/components/DatasetComponent/DatasetFilters/DatasetFilter.vue';\nimport ImageCopyModal from \"@/components/DatasetComponent/GalleryComponent/ImageCopyModal.vue\";\nimport GalleryActionsDropdown from \"@/components/DatasetComponent/GalleryComponent/GalleryActionsDropdown.vue\";\nimport equal from 'deep-equal';\n\nexport default {\n  name: 'Gallery',\n  components: {\n    GalleryGrid,\n    DatasetFilter,\n    DisplayImageDetails,\n    DisplayAnnotationsFilter,\n    GalleryGridItem2,\n    GalleryEmptyState,\n    GalleryDropZone,\n    UploadImagesModal,\n    SVGIcon,\n    IconButton,\n    ConfirmModal,\n    DatasetCopyModal,\n    DatasetExportModal,\n    ImageCopyModal,\n    GalleryImageSort,\n    GalleryActionsDropdown,\n  },\n  setup() {\n    const {\n      datasetFilters,\n      annotationDisplaySettings,\n      imageDisplaySettings,\n      reverse,\n      combineSequenceFrames,\n      sortBy,\n      currentDatasetID,\n      internalCurrentDataset,\n      currentPage,\n      imagesPerPage,\n      imageList,\n      totalImageCount,\n      getImagesParams,\n      getImagesFilterParams,\n      getImages,\n      deleteFilteredImages,\n      isFetchingImages,\n    } = useGallery();\n    combineSequenceFrames.value = true;\n\n    return {\n      datasetFilters,\n      annotationDisplaySettings,\n      imageDisplaySettings,\n      reverse,\n      sortBy,\n      currentDatasetID,\n      internalCurrentDataset,\n      currentPage,\n      imagesPerPage,\n      imageList,\n      totalImageCount,\n      getImagesParams,\n      getImagesFilterParams,\n      getImages,\n      deleteFilteredImages,\n      isFetchingImages,\n      combineSequenceFrames,\n    };\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      // annotationSets: null,\n      imageListPromise: null,\n      mapImageList: [],\n      totalPagesCount: 0,\n      dropHighlighted: false,\n      gallerySelection: [],\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      buttonText: \"\",\n      confirmFunction: null,\n      showCopyModal: false,\n      showCopyImageModal: false,\n      permissions: null,\n      selectedImage: null,\n      sequences: [],\n      showExportModal: false,\n      doneFetch: true,\n      selectedImages: [],\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n    currentLabels() {\n      if (this.currentDataset) {\n        return this.currentDataset.labels;\n      }\n      return [];\n    },\n    currentTypes() {\n      if (this.currentDataset) {\n        return this.currentDataset.annotation_types;\n      }\n      return [];\n    },\n    annotationSets: {\n      get() {\n        if (this.currentDataset) {\n          return this.currentDataset.annotation_sets;\n        }\n        return [];\n      },\n      set(sets) {\n        const index = this.datasets.indexOf(this.currentDataset);\n        this.$store.commit('datasets/setDatasetAnnotationSets', { index, sets });\n      },\n    },\n    numPages() {\n      return Math.ceil(this.totalImageCount / this.imagesPerPage);\n    },\n    getAnnotationSetsParams() {\n      if (!this.currentDataset) {\n        return null;\n      }\n\n      const params = {\n        dataset_id: this.currentDataset.id,\n      };\n\n      if (this.currentTab === 'annotations') {\n        params.include_empty = true;\n      }\n\n      return params;\n    },\n    gridItemDisplayProp() {\n      if (!this.datasetFilters?.displayAnnotationsFilter) {\n        return {};\n      }\n      if (this.datasetFilters?.displayAnnotationsFilter?.displayType === 'byAnnotationSets') {\n        return { filterAnnotationsBySets: this.datasetFilters.displayAnnotationsFilter.value };\n      }\n      if (this.datasetFilters?.displayAnnotationsFilter?.displayType === 'byAnnotationLabels') {\n        return { filterAnnotationsByLabelIndexes: this.datasetFilters.displayAnnotationsFilter.value };\n      }\n      return {};\n    },\n    colorAnnotationsBy() {\n      if (this.annotationDisplaySettings?.colorAnnotationsBy?.type) {\n        return this.annotationDisplaySettings?.colorAnnotationsBy?.type;\n      }\n      return 'set';\n    },\n    displayAnnotationSets() {\n      if (this.annotationDisplaySettings?.displayAnnotationSets) {\n        return this.annotationDisplaySettings?.displayAnnotationSets.annotation_sets;\n      }\n\n      return [];\n    },\n    displayLabels() {\n      if (this.annotationDisplaySettings?.displayLabels) {\n        return this.annotationDisplaySettings?.displayLabels.labels;\n      }\n      return [];\n    },\n    showImageName() {\n      if (this.imageDisplaySettings?.includes('showName')) {\n        return true;\n      }\n      return false;\n    },\n    showSequences() {\n      if (this.imageDisplaySettings?.includes('showSequences')) {\n        return true;\n      }\n      return false;\n    },\n    showTags() {\n      if (this.imageDisplaySettings?.includes('showTags')) {\n        return true;\n      }\n      return false;\n    },\n    imageParams() {\n      return this.getImagesParams();\n    },\n    imageFilterParams() {\n      return this.getImagesFilterParams();\n    },\n    getImagesCombinedParams() {\n      return { ...this.getImagesParams(), ...this.getImagesFilterParams() };\n    },\n    combinedParams() {\n      return {\n        ...this.currentDataset,\n        ...this.annotationDisplaySettings,\n        ...this.imageDisplaySettings,\n      };\n    },\n    minImageNumber() {\n      return ((this.currentPage - 1) * this.imagesPerPage) + 1;\n    },\n    maxImageNumber() {\n      const imgListLength = this.imageList ? this.imageList.length : 0;\n      return ((this.currentPage - 1) * this.imagesPerPage) + imgListLength;\n    },\n  },\n  watch: {\n    currentDataset: {\n      handler() {\n        this.currentPage = 1;\n        this.currentDatasetID = this.currentDataset ? this.currentDataset.id : 0;\n        this.internalCurrentDataset = this.currentDataset;\n      },\n    },\n    getImagesCombinedParams: {\n      deep: true,\n      async handler(newVal, oldVal) {\n        if (!equal(newVal, oldVal) || !this.imageList) {\n          this.imageListPromise = await new Promise((resolve, reject) => {\n            this.doneFetch = false;\n            this.getImages().then((imageList) => {\n              this.imageList = imageList;\n              this.selectedImages = [];\n              resolve(imageList);\n              this.doneFetch = true;\n            }).catch((e) => {\n              this.selectedImages = [];\n              this.doneFetch = true;\n            });\n          });\n        }\n      },\n    },\n    combinedParams: {\n      deep: true,\n      async handler() {\n        this.$router.replace({\n          path: this.$route.path,\n          query: {\n            image_params: encodeURI(JSON.stringify({\n              imagesPerPage: this.imagesPerPage,\n              currentPage: this.currentPage > 0 ? this.currentPage : 1,\n              sortBy: this.sortBy,\n              reverse: this.reverse,\n            })),\n            filter_params: encodeURI(JSON.stringify(this.datasetFilters)),\n            annotation_display: encodeURI(JSON.stringify(this.annotationDisplaySettings)),\n            image_display: encodeURI(JSON.stringify(this.imageDisplaySettings)),\n          },\n        });\n      },\n    },\n    getAnnotationSetsParams: {\n      deep: true,\n      async handler(params) {\n        if (params && params !== undefined) {\n          this.annotationSets = await this.getAnnotationSetList(params);\n        } else {\n          this.annotationSets = [];\n        }\n      },\n    },\n    showSequences() {\n      this.combineSequenceFrames = this.showSequences;\n    },\n  },\n  mounted() {\n    this.currentDatasetID = this.currentDataset ? this.currentDataset.id : 0;\n    this.internalCurrentDataset = this.currentDataset;\n    if (this.$route.query.dataset) {\n      const d = this.datasets.find((e) => e.id === this.$route.query.dataset);\n      if (d) {\n        this.$store.commit('datasets/setCurrentDataset', d);\n      }\n    }\n    if (this.$route.query.image_params) {\n      const image_params = JSON.parse(decodeURI(this.$route.query.image_params));\n      this.imagesPerPage = image_params.imagesPerPage;\n      this.currentPage = image_params.currentPage;\n      this.sortBy = image_params.sortBy;\n      this.reverse = image_params.reverse;\n    }\n\n    if (this.$route.query.filter_params) {\n      this.displayFilters = JSON.parse(decodeURI(this.$route.query.filter_params));\n    }\n\n    if (this.$route.query.annotation_display) {\n      this.annotationDisplaySettings = JSON.parse(decodeURI(this.$route.query.annotation_display));\n    }\n\n    if (this.$route.query.image_display) {\n      this.imageDisplaySettings = JSON.parse(decodeURI(this.$route.query.image_display));\n    }\n\n    this.GetPermissionsForCurrentUser();\n  },\n  methods: {\n    async GetPermissionsForCurrentUser() {\n      const user = this.$store.state.user.user;\n      await this.dataConnect.getDatasetAccessForSingleUser({\n        dataset_id: this.currentDataset.id,\n        username: user.username,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getAnnotationSetList(params) {\n      const annotationSets = await this.dataConnect.getAnnotationSets(params)\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (annotationSets.error || !annotationSets.result) {\n        // TODO: handle error\n        return {};\n      }\n      return annotationSets.result;\n    },\n    // async getLabelList() {\n    //   const labels = await this.dataConnect.getLabelList({ dataset_id: this.currentDataset.id })\n    //     .catch((error) => {\n    //       // TODO: handle error\n    //       console.log(error);\n    //     });\n    //   return labels.result;\n    // },\n    handleGallerySelectionChanged(selection) {\n      this.gallerySelection = selection;\n    },\n    async handleCopyCompleted() {\n      this.datasets = await this.getDatasets();\n    },\n    async handleAnnotationSetCreated() {\n      this.annotationSets = await this.getAnnotationSetList();\n    },\n    openConfirmDeleteFilteredImagesModal() {\n      this.confirmMessage = `Are you sure you want to delete all filtered images`;\n      this.confirmMessageHeader = 'Delete Filtered Images';\n      // this.toDelete = imageObj;\n      this.buttonText = 'Delete';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => this.deleteFilteredImages();\n    },\n    openConfirmDeleteImageModal() {\n      const filtered = this.selectedImages.reduce((acc, item) => {\n        if (item.sequence_id && item.sequence_id > 0 && item.type === 'sequence') {\n          acc.sequence_ids.push(item.sequence_id);\n        } else if (item.id > 0 && item.type === 'image') {\n          acc.image_ids.push(item.id);\n        } else {\n          // also assume non_sequence or non_image to be images\n          acc.image_ids.push(item.id);\n        }\n        return acc;\n      }, { sequence_ids: [], image_ids: [] });\n      this.confirmMessage = `Are you sure you want to permanently delete ${this.selectedImages.length} item(s)?`;\n      this.confirmMessageHeader = `Deleting Items`;\n      // this.toDelete = imageObj;\n      this.buttonText = 'Delete';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => this.deleteImageFromDataset(filtered.sequence_ids, filtered.image_ids);\n    },\n    async deleteImageFromDataset(sequence_ids, image_ids) {\n      const params = {\n        dataset_id: this.currentDataset.id,\n        sequence_ids,\n        image_ids,\n      };\n      this.dataConnect.deleteImageFromDataset(params)\n        .then((data) => {\n          if (!data || data.error || !data.result) {\n            alert(\"Image failed to delete\");\n          } else {\n            this.getImages().then((imageList) => {\n              this.imageList = imageList;\n            });\n          }\n        });\n      this.selectedImages = [];\n    },\n    displayImage(imageObj) {\n      this.$router.push({\n        name: 'datasets.gallery.viewer',\n        query: {\n          image_id: encodeURI(JSON.stringify(imageObj.id)),\n          annotationDisplaySettings: encodeURI(JSON.stringify(this.annotationDisplaySettings)),\n          showSequences: encodeURI(this.imageDisplaySettings.includes('showSequences')),\n        },\n      });\n    },\n    openUploadModal() {\n      this.$refs.uploadImagesModal.showModal();\n    },\n    handleImageUploadComplete() {\n      this.imageListPromise = new Promise((resolve, reject) => {\n        this.getImages().then((imageList) => {\n          this.imageList = imageList;\n          resolve(imageList);\n        });\n      });\n      this.$refs.uploadImagesModal.closeModal();\n    },\n    async handleUploadError(data) {\n      this.confirmMessage = data.confirmMessage;\n      this.confirmMessageHeader = data.confirmMessageHeader;\n      this.buttonText = \"\";\n      this.$refs.confirmModal.showModal();\n    },\n    openCopyFilteredImagesModal() {\n      this.showCopyModal = true;\n    },\n    handleCopy(imageObj) {\n      if (!this.selectedImages.includes(imageObj)) {\n        this.selectedImages.push(imageObj);\n      }\n      this.showCopyImageModal = true;\n    },\n    handleDownload(imageObj) {\n      if (imageObj.type === 'sequence') {\n        this.sequences = [\n          {\n            \"id\": imageObj.sequence_id,\n            \"uuid\": imageObj.uuid,\n            \"name\": imageObj.name,\n          },\n        ];\n      }\n      this.$refs.datasetExportModal.showModal();\n    },\n    selectAll() {\n      if (this.selectedImages.length < this.imageList.length) {\n        this.selectedImages = this.imageList;\n      } else {\n        this.selectedImages = [];\n      }\n    },\n    handleMultiSelect(IDs) {\n      this.selectedImages = this.imageList.filter((e) => IDs.includes(e.id));\n    },\n    handleRemoveTagsForSelectedImages(tag_name) {\n      const selectedImageIds = this.selectedImages.map((e) => e.id);\n      this.imageList.forEach((image, index) => {\n        if (selectedImageIds.includes(image.id)) {\n          this.imageList[index].tags = this.imageList[index].tags.filter((e) => e.name !== tag_name);\n        }\n      });\n    },\n    handleAddTagsForSelectedImages(tag_name) {\n      const selectedImageIds = this.selectedImages.map((e) => e.id);\n      this.imageList.forEach((image, index) => {\n        if (selectedImageIds.includes(image.id)) {\n          this.imageList[index].tags.push({ name: tag_name });\n        }\n      });\n    },\n    handleRefreshPage() {\n      this.imageListPromise = new Promise((resolve, reject) => {\n        this.getImages().then((imageList) => {\n          this.imageList = imageList;\n          resolve(imageList);\n        });\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n\n#dataset-select {\n  width: 300px;\n}\n\n.gallery-actions {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 12px;\n  height: 100%;\n\n  span{\n    font-weight: bold;\n    font-size: 1.15rem;\n  }\n\n  button {\n    background: white;\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    height: 26px;\n    box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n    flex: 1 1 auto;\n    padding: 4px 8px;\n    gap: 2px;\n    border-right: solid 1px rgba(0,0,0,0.5);\n    max-width: fit-content;\n\n    @include themify() {\n      color: themed('body-text-color')\n    }\n\n    &.import {\n      background: var(--button-color);\n      color: var(--button-text-color);\n\n      svg {\n        margin-right: 5px;\n      }\n    }\n\n    &:hover {\n      background: rgba(var(--color-primary-100-rgb), 0.5);\n    }\n\n    &.delete:not([disabled]) {\n      @include themify() {\n        background: themed('button-delete');\n        color: themed('button-delete-text');\n      }\n    }\n\n    &.delete[disabled] {\n      border: none;\n    }\n\n    &.delete:hover:not([disabled]) {\n      @include themify() {\n        background: $color-red-300;\n        color: themed('button-delete-text');\n      }\n    }\n\n    &.inactive {\n      background: rgba(var(--color-disabled), 0.5) !important;\n    }\n  }\n}\n\n.sort-by {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n\n  &__select {\n    width: 130px;\n  }\n\n  &__reverse._invert {\n    transform: rotate(180deg);\n  }\n}\n\n#loading-visualization {\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: 100%;\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 100;\n  background: transparent;\n}\n\n.lds-ring {\n  /* change color here */\n  color: var(--color-primary);\n}\n.lds-ring,\n.lds-ring div {\n  box-sizing: border-box;\n}\n.lds-ring {\n  display: inline-block;\n  position: relative;\n  width: 80px;\n  height: 80px;\n}\n.lds-ring div {\n  box-sizing: border-box;\n  display: block;\n  position: absolute;\n  width: 64px;\n  height: 64px;\n  margin: 8px;\n  border: 8px solid currentColor;\n  border-radius: 50%;\n  animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n  border-color: currentColor transparent transparent transparent;\n}\n.lds-ring div:nth-child(1) {\n  animation-delay: -0.45s;\n}\n.lds-ring div:nth-child(2) {\n  animation-delay: -0.3s;\n}\n.lds-ring div:nth-child(3) {\n  animation-delay: -0.15s;\n}\n@keyframes lds-ring {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <BaseGalleryGridItem\n    :imageObj=\"imageObj\"\n    :annotations=\"filteredAnnotations\"\n    :annotationSets=\"annotationSets\"\n    :annotationDisplayType=\"annotationDisplayType\"\n    :filterAnnotationsBySets=\"filterAnnotationsBySets\"\n    :filterAnnotationsByLabelIndexes=\"filterAnnotationsByLabelIndexes\"\n    @click=\"handleImageClicked\"\n    @mouseover=\"mouseHover=true\"\n    @mouseleave=\"mouseHover=false\"\n  >\n    <template #header>\n      <div class=\"gallery-card-header\">\n        <div v-if=\"shouldShowSelector\" class=\"item-selector\">\n          <v-checkbox\n            v-model=\"internalSelectedImages\"\n            :value=\"imageObj\"\n            :hide-details=\"true\"\n            density=\"compact\"\n            @click.stop=\"\"\n          />\n        </div>\n        <BaseMenu\n          v-if=\"isSequence\"\n          :placement=\"'bottom-end'\"\n          @closed=\"show_menu = false\"\n        >\n          <IconButton\n            v-model=\"show_menu\"\n            :icon=\"'more_vert'\"\n            :width=\"24\"\n            :height=\"24\"\n            class=\"menu-icon\"\n          />\n          <template #menu=\"{closeMenu}\">\n            <ul class=\"reviewTask-menu\">\n              <li>\n                <BaseMenuButton @click.stop=\"download(), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'import'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                    :title=\"`Export`\"\n                  />\n                  <span>Export</span>\n                </BaseMenuButton>\n              </li>\n              <li>\n                <BaseMenuButton @click.stop=\"copy(), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'copy_white'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                    :title=\"`Copy`\"\n                  />\n                  <span>Copy</span>\n                </BaseMenuButton>\n              </li>\n              <!-- <li>\n                <BaseMenuButton @click.stop=\"handleDeleteClicked(), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'delete'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                    :title=\"`Delete`\"\n                  />\n                  <span>Delete</span>\n                </BaseMenuButton>\n              </li> -->\n            </ul>\n          </template>\n        </BaseMenu>\n        <BaseMenu\n          v-else\n          :placement=\"'bottom-end'\"\n          @closed=\"show_menu = false\"\n        >\n          <IconButton\n            v-model=\"show_menu\"\n            :icon=\"'more_vert'\"\n            :width=\"24\"\n            :height=\"24\"\n            class=\"menu-icon\"\n          />\n          <template #menu=\"{closeMenu}\">\n            <ul class=\"reviewTask-menu\">\n              <li>\n                <BaseMenuButton @click.stop=\"downloadImage(), closeMenu()\">\n                  <SVGIcon\n                    :iconName=\"'download'\"\n                    :width=\"'22px'\"\n                    :height=\"'22px'\"\n                    :title=\"`Download Image`\"\n                  />\n                  <span>Download Image</span>\n                </BaseMenuButton>\n              </li>\n            </ul>\n          </template>\n        </BaseMenu>\n      </div>\n    </template>\n    <template #image>\n      <SVGIcon\n        v-if=\"isSequence\"\n        class=\"video-icon\"\n        :iconName=\"'play_circle_filled'\"\n        :width=\"24\"\n        :height=\"24\"\n      />\n    </template>\n    <template #content>\n      <GalleryGridItemLabelTags\n        :labels=\"labels\"\n        :imageId=\"imageObj.id\"\n        :tags=\"imageObj.tags\"\n        :annotationList=\"filteredAnnotations\"\n        :showName=\"showName\"\n        :showTags=\"showTags\"\n        :imgName=\"imageObj.name\"\n        :uuid=\"imageObj.uuid\"\n      />\n    </template>\n  </BaseGalleryGridItem>\n</template>\n\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseGalleryGridItem from '@/components/DatasetComponent/BaseGalleryGridItem.vue';\nimport GalleryGridItemLabelTags from '@/components/DatasetComponent/GalleryComponent/GalleryGridItemLabelTags.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport DatastoreConnect from '../../../assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'GalleryGridItem2',\n  components: {\n    BaseGalleryGridItem,\n    GalleryGridItemLabelTags,\n    IconButton,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n  },\n  props: {\n    title: {\n      type: String,\n      default: '',\n    },\n    imageObj: {\n      type: Object,\n      default: () => {},\n    },\n    annotations: {\n      type: Array,\n      default: () => [],\n    },\n    annotationSets: {\n      type: Array,\n      default: () => [],\n    },\n    annotationDisplayType: {\n      type: String,\n      default: 'set',\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    tags: {\n      type: Array,\n      default: () => [],\n    },\n    filterAnnotationsBySets: {\n      type: Array,\n      default: null,\n    },\n    filterAnnotationsByLabelIndexes: {\n      type: Array,\n      default: null,\n    },\n    showName: {\n      type: Boolean,\n      default: false,\n    },\n    showTags: {\n      type: Boolean,\n      default: false,\n    },\n    shouldShowSelector: {\n      type: Boolean,\n      default: false,\n    },\n    selectedImages: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: [\n    'grid-item-clicked', 'copy', 'download', 'update:selectedImages',\n  ],\n  data() {\n    return {\n      dsConn: null,\n      datastoreURL: null,\n      mouseHover: false,\n      renderedImageDimensions: {\n        width: 0,\n        height: 0,\n        top: 0,\n        left: 0,\n        bottom: 0,\n        right: 0,\n      },\n      show_menu: false,\n      internalSelectedImages: null,\n    };\n  },\n  computed: {\n    filteredAnnotations() {\n      if (this.annotations?.length > 0) {\n        // Create boxes for the annotations to be displayed\n        let filteredAnnotationList = this.annotations;\n        if (this.filterAnnotationsBySets?.length >= 0) {\n          filteredAnnotationList = filteredAnnotationList.filter((anno) => this.filterAnnotationsBySets.includes(anno.annotation_set_id));\n        }\n        if (this.filterAnnotationsByLabelIndexes?.length >= 0) {\n          filteredAnnotationList = filteredAnnotationList.filter((anno) => this.filterAnnotationsByLabelIndexes.includes(anno.label_index));\n        }\n        return filteredAnnotationList;\n      }\n      return [];\n    },\n    isSequence() {\n      return this.imageObj.type === 'sequence';\n    },\n  },\n  watch: {\n    selectedImages: {\n      immediate: true,\n      handler() {\n        this.internalSelectedImages = this.selectedImages;\n      },\n    },\n    internalSelectedImages() {\n      this.$emit(\"update:selectedImages\", this.internalSelectedImages);\n    },\n  },\n  created() {\n    this.enterpriseServerUrl = this.$store.state.enterpriseServerUrl;\n    this.dsConn = new DatastoreConnect(this.enterpriseServerUrl);\n  },\n  methods: {\n    handleImageClicked() {\n      this.$emit('grid-item-clicked', this.imageObj);\n    },\n    copy() {\n      this.$emit('copy', this.imageObj);\n    },\n    download() {\n      this.$emit('download', this.imageObj);\n    },\n    async downloadImage() {\n      const url = `v3/enterprise/image/${this.imageObj.id}`;\n      const headers = new Headers({\n        // 'Authorization': `Bearer ${this.$store.state.user.token}`,\n      });\n\n      try {\n        const response = await fetch(url, { headers });\n        if (!response.ok) {\n          throw new Error('Network response was not ok');\n        }\n        const blob = await response.blob();\n        const blobUrl = window.URL.createObjectURL(blob);\n\n        const link = document.createElement('a');\n        link.href = blobUrl;\n        link.download = this.imageObj.name || this.imageObj.id || 'download';\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n        window.URL.revokeObjectURL(blobUrl);\n      } catch (error) {\n        console.error('Error downloading the image:', error);\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.gallery-card-header {\n  display: flex;\n  justify-content: space-between;\n  width: fit-content;\n\n  .item-selector {\n    position: absolute;\n    left: 10px;\n    z-index: 10;\n  }\n}\n\n.video-icon {\n  position: absolute;\n  bottom: 10px;\n  right: 10px;\n  z-index: 10;\n  background: rgb(255 255 255 / 65%);\n  border-radius: 100%;\n  box-shadow: 0 0px 2px 0 rgb(0 0 0 / 50%);\n  color: var(--icon-color-primary);\n}\n\n.menu-icon {\n  position: absolute;\n  top: 10px;\n  right: 10px;\n  z-index: 10;\n}\n\n.menu-icon {\n  background: rgba(255,255,255,0.5);\n  border-radius: 100%;\n}\n\na {\n  color: inherit;\n  text-decoration: inherit;\n}\n</style>\n","import { render } from \"./GalleryGridItem2.vue?vue&type=template&id=09131c81&scoped=true\"\nimport script from \"./GalleryGridItem2.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryGridItem2.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryGridItem2.vue?vue&type=style&index=0&id=09131c81&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-09131c81\"]])\n\nexport default __exports__","<template>\n  <div ref=\"dropZone\" class=\"upload-images\">\n    <div\n      v-show=\"dropHighlighted\"\n      id=\"file-upload-backdrop\"\n      class=\"file-upload-backdrop\"\n      :class=\"{_highlight: dropHighlighted}\"\n      @drop=\"dropHighlighted = false\"\n      @drop.stop.prevent=\"handleDrop\"\n    >\n      <template v-if=\"showIcon\">\n        <SVGIcon\n          id=\"upload-icon\"\n          class=\"file-upload-backdrop__upload-icon\"\n          :iconName=\"'cloud_upload'\"\n          :width=\"'100%'\"\n          :height=\"'200px'\"\n        />\n        <div id=\"file-upload-backdrop-text\" class=\"file-upload-backdrop__text\">\n          <span>Drag and drop images here</span>\n        </div>\n      </template>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'GalleryDropZone',\n  components: {\n    SVGIcon,\n  },\n  props: {\n    datasetID: {\n      type: Number,\n      default: null,\n    },\n    showIcon: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  emits: ['upload-complete', 'upload-error'],\n  data() {\n    return {\n      files: null,\n      dropHighlighted: false,\n      dragCounter: 0,\n      selectedImportScript: \"\",\n      dataConnect: null,\n      importScriptType: \"images-folder\",\n      importScriptAnnsetID: 0,\n      importerSource: \"\",\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    datasetName() {\n      const dataset = this.$store.state?.datasets?.datasetList.find((d) => d.id === this.datasetID);\n      return dataset.name;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    importParams() {\n      const importParams = {\n        import_type: 'images-folder',\n        dataset_id: this.datasetID,\n        dataset_name: this.datasetName,\n        project_id: this.currentProject.id,\n      };\n      return importParams;\n    },\n  },\n  watch: {\n    dropHighlighted() {\n\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n\n    this.unsubscribe = this.$store.subscribe((mutation, state) => {\n      if (mutation.type === 'tasks/updateImportTaskStatus') {\n        if (mutation.payload.data.status === 'complete') {\n          this.$emit('upload-complete');\n        }\n      }\n    });\n  },\n  mounted() {\n    this.$refs.dropZone.parentElement.addEventListener('dragenter', this.handleDragEnter);\n    this.$refs.dropZone.parentElement.addEventListener('dragover', this.handleDragOver);\n    this.$refs.dropZone.parentElement.addEventListener('dragleave', this.handleDragLeave);\n  },\n  unmounted() {\n    this.$refs.dropZone?.parentElement.removeEventListener('dragenter', this.handleDragEnter);\n    this.$refs.dropZone?.parentElement.removeEventListener('dragover', this.handleDragOver);\n    this.$refs.dropZone?.parentElement.removeEventListener('dragleave', this.handleDragLeave);\n  },\n  methods: {\n    handleDragEnter(e) {\n      e.preventDefault();\n      this.dragCounter += 1;\n      this.dropHighlighted = true;\n    },\n    handleDragOver(e) {\n      e.preventDefault();\n    },\n    handleDragLeave() {\n      this.dragCounter -= 1;\n      if (this.dragCounter === 0) {\n        this.dropHighlighted = false;\n      }\n    },\n    handleDrop(e) {\n      this.files = e.dataTransfer.files;\n      this.upload(this.files);\n    },\n    async upload(files) {\n      if (files == null || (files && files.length === 0)) return;\n\n      await this.s3MultipleImageUpload({ fileList: files, params: this.importParams });\n    },\n\n    async s3MultipleImageUpload({ fileList, params }) {\n      const keys = [];\n\n      // Validate file count and sizes, also trim paths\n      const maxFileSize = await this.getMaxImageSize();\n      let imgCount = 0;\n      let imgTooLargeErrCount = 0;\n      for (const file of fileList) {\n        const isImage = file.type.includes(\"image/\");\n        const isVideo = file.type.includes(\"video/\");\n        if ((isImage || isVideo) && (file.size <= maxFileSize || maxFileSize === -1)) {\n          keys.push(file.name);\n          imgCount += 1;\n        } else if (isImage || isVideo) {\n          imgTooLargeErrCount += 1;\n        }\n      }\n\n      // Check image upload limit\n      const imageLimit = await this.checkImageUploadLimit(imgCount)\n        .catch((error) => {\n          throw error;\n        });\n      if (imageLimit < 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `Not enough credits to perform this operation.`,\n          confirmMessageHeader: 'Insufficient Credits',\n        });\n        return null;\n      }\n\n      // How many files were too large to upload\n      if (imgTooLargeErrCount > 0) {\n        this.$emit(\"upload-error\", {\n          confirmMessage: `${imgTooLargeErrCount} image(s) were discard due to file size limit.`,\n          confirmMessageHeader: 'Large File Size',\n        });\n      }\n\n      // Get s3 presigned urls\n      const presignedResponse = await this.s3CreatePresignedUrl({\n        dataset_id: params.dataset_id,\n        keys,\n      })\n        .catch((error) => {\n          throw error;\n        });\n\n      const newFileList = [];\n      if (presignedResponse) {\n        const {\n          importerSource, indexes, presignedUrls, tnPresignedUrls,\n        } = presignedResponse;\n\n        if (importerSource) {\n          params.importer_source = importerSource;\n        }\n\n        presignedUrls.forEach((url, i) => {\n          newFileList.push({\n            url,\n            thumbnail_url: tnPresignedUrls[i],\n            file: fileList[indexes[i]],\n          });\n        });\n      }\n      this.processingFiles = false;\n      const importResponse = await this.$store.dispatch('importer/importByType', { urls: newFileList, importParams: params });\n\n      return importResponse;\n    },\n    async getMaxImageSize() {\n      return this.dataConnect.getAccountingMaxImageSize()\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    async checkImageUploadLimit(imgCount) {\n      return this.dataConnect.checkImageLimitForAccounting({\n        image_count: imgCount,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n    async s3CreatePresignedUrl({ dataset_id, keys }) {\n      return this.dataConnect.s3CreatePresignedUrl({\n        dataset_id,\n        keys,\n      })\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.upload-images {\n  // display: flex;\n  // flex-direction: column;\n  // padding: 1rem;\n  // overflow: auto;\n\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  pointer-events: none;\n  z-index: 1;\n}\n\n.file-upload-backdrop {\n  position: relative;\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  padding: 32px;\n  align-items: center;\n  justify-content: center;\n  border: 2px dashed grey;\n  border-radius: 8px;\n  width: 100%;\n  height: 100%;\n  pointer-events: auto;\n\n  &__upload-icon {\n    position: absolute;\n    bottom: 50%;\n    width: 48px;\n    height: 48px;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n\n  &__text {\n    position: absolute;\n    top: 50%;\n    display: flex;\n    flex-direction: column;\n\n    & span {\n      padding-top: 0.25rem;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      direction: rtl;\n      color: #250E81;\n      font-size: 16px;\n      font-weight: bold;\n    }\n\n    & span + span {\n      color: grey;\n      font-size: 12px;\n    }\n  }\n\n  &._highlight {\n    padding: 27px;\n    border: 3px dashed #250E81;\n    background: #250e8125;\n    animation-name: fill-upload-btn;\n    animation-duration: 0.5s;\n\n    & .file-upload-backdrop__upload-icon {\n      width: 56px;\n      height: 56px;\n      animation-name: grow-upload-icon;\n      animation-duration: 0.05s;\n    }\n    @keyframes grow-upload-icon {\n      from {  width: 48px; height: 48px;}\n      to {  width: 56px; height: 56px;}\n    }\n\n    @keyframes fill-upload-btn {\n      from {  background: transparent;}\n      to {  background: #250e8125;}\n    }\n  }\n}\n\n</style>\n","import { render } from \"./GalleryDropZone.vue?vue&type=template&id=121bd197&scoped=true\"\nimport script from \"./GalleryDropZone.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryDropZone.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryDropZone.vue?vue&type=style&index=0&id=121bd197&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-121bd197\"]])\n\nexport default __exports__","<template>\n  <div class=\"annotation-display-filter-button\">\n    <FilterPopper>\n      <template #default=\"{ menuOpen }\">\n        <button class=\"button sets-toggle-button\" :class=\"{'active': menuOpen }\">\n          Display Image Options\n          <SVGIcon\n            :mirrored=\"menuOpen\"\n            :iconName=\"'expand_more'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n          />\n        </button>\n      </template>\n      <template #popper>\n        <div class=\"filter-settings scrollbar\">\n          <template v-for=\"(option, index) in options\" :key=\"index\">\n            <label\n              :for=\"`menuItem-${uid}-${option.value}-${index}`\"\n              class=\"filter-settings__row filter-settings__row-button\"\n            >\n              <div class=\"filter-settings__row-button-check me-2\">\n                <SVGIcon\n                  v-if=\"displayDetails.includes(option.value)\"\n                  :iconName=\"'check'\"\n                  :height=\"'20px'\"\n                  :width=\"'20px'\"\n                />\n              </div>\n              <input\n                :id=\"`menuItem-${uid}-${option.value}-${index}`\"\n                v-model=\"displayDetails\"\n                type=\"checkbox\"\n                :value=\"option.value\"\n              >\n              <span>{{ option.name }}</span>\n            </label>\n          </template>\n        </div>\n      </template>\n    </FilterPopper>\n  </div>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nlet uid = 0;\n\nexport default {\n  name: \"DisplayImageDetails\",\n  components: {\n    FilterPopper,\n    SVGIcon,\n  },\n  props: {\n    modelValue: {\n      type: Object,\n      default: null,\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    uid += 1;\n    return {\n      options: [\n        {\n          value: 'showName',\n          name: 'Show Image Name',\n        },\n        {\n          value: 'showSequences',\n          name: 'Show Sequences',\n        },\n        {\n          value: 'showTags',\n          name: 'Show Image Tags',\n        },\n      ],\n      displayDetails: ['showName', 'showSequences'],\n      hoveredDisplayType: null,\n      uid: `DisplayItemDetails-${uid}`,\n    };\n  },\n  computed: {\n    dataReady() {\n      if (this.annotationSets && this.labels) {\n        return true;\n      }\n      return false;\n    },\n  },\n  watch: {\n    displayDetails: {\n      deep: true,\n      handler(displayDetails) {\n        this.$emit('update:modelValue', displayDetails);\n      },\n    },\n  },\n  mounted() {\n    if (this.modelValue) {\n      this.displayDetails = this.modelValue;\n    }\n    this.$emit('update:modelValue', this.displayDetails);\n  },\n  methods: {\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  border-radius: inherit;\n  text-transform: none;\n  min-width: 100px;\n\n  &.scrollbar {\n    overflow: auto;\n  }\n\n  &__row {\n    display: flex;\n    align-items: center;\n    position: relative;\n    max-width: 500px;\n  }\n\n  &__row-button {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n    background: transparent;\n    border: none;\n    padding: 6px 8px;\n    cursor: pointer;\n\n    &:first-of-type {\n      border-top-left-radius: inherit;\n      border-top-right-radius: inherit;\n    }\n    &:last-of-type {\n      border-bottom-left-radius: inherit;\n      border-bottom-right-radius: inherit;\n    }\n\n    &:hover {\n      background: rgba(0,0,0,0.125);\n    }\n    &:focus-within {\n      background: rgba(0,0,0,0.125);\n    }\n\n    &> * {\n      pointer-events: none;\n    }\n\n    input {\n      -webkit-appearance: none;\n      -moz-appearance: none;\n      appearance: none;\n      opacity: 0;\n      margin: 0;\n    }\n\n    span, label {\n      font-size: 0.9rem;\n      font-weight: 500;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n  }\n\n  &__row-button-check {\n    width: 20px;\n    min-width: 20px;\n    height: 20px;\n    min-height: 20px;\n    @include themify() {\n      color: themed('filter-button-list-row-button-selected')\n    }\n  }\n\n  &__row-button-legend {\n    min-width: 10px;\n    min-height: 10px;\n    margin-right: 12px;\n    border-radius: 100%;\n  }\n\n  &__row-button-chevron-right {\n    margin-left: auto;\n    padding-left: 4px;\n  }\n}\n\n.sets-toggle-button, .settings-toggle-button {\n  background: white;\n\n}\n\n.annotation-display-filter-button {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 26px;\n  padding: 0;\n  box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n  @include themify() {\n    color: themed('body-text-color')\n  }\n}\n\n.sets-toggle-button {\n  display: flex;\n  align-items: center;\n  height: 100%;\n  flex: 1 1 auto;\n  padding: 4px 8px;\n  gap: 2px;\n  border-right: solid 1px rgba(0,0,0,0.5);\n  color: inherit;\n\n  &:hover {\n    box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.2) inset;\n    background: rgba(var(--color-primary-100-rgb), 0.5);\n  }\n\n  &:active {\n    opacity: 1;\n  }\n\n  &.active {\n    @include themify() {\n      box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.5) inset;\n      background: rgba(var(--color-primary-100-rgb), 0.8);\n    }\n  }\n}\n\n.settings-toggle-button {\n  display: flex;\n  align-items: center;\n  padding: 0 4px;\n  color: inherit;\n\n  &:active {\n    opacity: 1;\n  }\n}\n</style>\n","import { render } from \"./DisplayImageDetails.vue?vue&type=template&id=6d26e8be&scoped=true\"\nimport script from \"./DisplayImageDetails.vue?vue&type=script&lang=js\"\nexport * from \"./DisplayImageDetails.vue?vue&type=script&lang=js\"\n\nimport \"./DisplayImageDetails.vue?vue&type=style&index=0&id=6d26e8be&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6d26e8be\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"copyImageModal\"\n    :title=\"'Copy'\"\n  >\n    <template #modal-main>\n      <form\n        id=\"copy-form\"\n        class=\"form container scrollbar\"\n        novalidate\n        @change=\"handleFormChange\"\n        @submit.prevent=\"\"\n      >\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Source Annotation Set</label>\n            <select v-model=\"selectedSrcAnnotationSet\" class=\"select\" required>\n              <option :key=\"'dest_ann_set-null'\" disabled :value=\"''\">Select an Annotation Set</option>\n              <option v-for=\"set in annotationSets\" :key=\"set.id\" :value=\"set\">\n                {{ set.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <!-- <v-select\n          v-model=\"selectedTypes\"\n          clearable\n          chips\n          label=\"Annotation Types\"\n          :items=\"types\"\n          item-title=\"name\"\n          item-value=\"id\"\n          multiple\n          variant=\"outlined\"\n        /> -->\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Destination Dataset</label>\n            <select v-model=\"destDataset\" class=\"select\" required>\n              <option :key=\"'review-select-null'\" disabled :value=\"''\">Select a Dataset</option>\n              <option v-for=\"d in datasets.filter(d => d.id !== currentDataset.id)\" :key=\"`review-select-${d.id}`\" :value=\"d\">\n                {{ d.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <div v-if=\"destDataset\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Destination Annotation Set</label>\n            <select v-model=\"destAnnotationSet\" class=\"select\" required>\n              <option :key=\"'dest_ann_set-null'\" disabled :value=\"''\">Select an Annotation Set</option>\n              <option v-for=\"dest_ann_set in destAnnotationSets\" :key=\"dest_ann_set.id\" :value=\"dest_ann_set\">\n                {{ dest_ann_set.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n      </form>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"handleCopyClicked\"\n        >\n          Apply\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script setup>\nimport {\n  ref, computed, onMounted, toRefs,\n} from 'vue';\nimport Modal from '@/components/Modal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\nimport { useStore } from 'vuex';\n\nconst $toast = useToast();\nconst store = useStore();\n\nconst props = defineProps({\n  datasets: {\n    type: Array,\n    default: () => [],\n  },\n  types: {\n    type: Array,\n    default: () => [],\n  },\n  annotationSets: {\n    type: Array,\n    default: () => [],\n  },\n  selectedImage: {\n    type: Object,\n    default: null,\n  },\n  selectedImages: {\n    type: Array,\n    default: null,\n  },\n});\nconst {\n  datasets,\n  selectedImage,\n  selectedImages,\n} = toRefs(props);\n\nconst copyImageModal = ref(null);\nconst destDataset = ref('');\nconst destAnnotationSet = ref('');\nconst selectedSrcAnnotationSet = ref('');\n\nconst currentDataset = computed(() => store.state.datasets.currentDataset);\n\nconst destAnnotationSets = computed(() => {\n  if (destDataset.value) {\n    return destDataset.value.annotation_sets;\n  }\n  return [];\n});\n\nconst sequences = computed(() => {\n  if (selectedImages.value) {\n    return selectedImages.value.map((obj) => obj.sequence_id);\n  }\n  return [];\n});\n\nconst images = computed(() => {\n  if (selectedImage.value && selectedImage.value.type === 'image') {\n    return [selectedImage.value.id];\n  }\n  if (selectedImages.value) {\n    // TODO\n  }\n  return [];\n});\n\nfunction showModal() {\n  copyImageModal.value.showModal();\n}\n\nfunction closeModal() {\n  copyImageModal.value.closeModal();\n}\n\nasync function handleCopyClicked() {\n  const dataConnect = new DatastoreConnect();\n  await dataConnect.copySequences({\n    sequences: sequences.value,\n    source_annotation_set_id: selectedSrcAnnotationSet.value.id,\n    dataset_id: selectedSrcAnnotationSet.value.dataset_id,\n    dest_dataset_id: destDataset.value.id,\n    dest_annotation_set_id: destAnnotationSet.value.id,\n  })\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error.message);\n      } else if (resp.result) {\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Copying in progress.`,\n          type: \"success\",\n          position: \"top\",\n        });\n        closeModal();\n      }\n    })\n    .catch((error) => {\n      $toast.open({\n        queue: true,\n        duration: 5000,\n        message: `Failed to Copy\\n${error.message}`,\n        type: \"error\",\n        position: \"top\",\n      });\n    });\n}\n\ndefineExpose({\n  showModal,\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.form {\n  padding: 0.75rem 3rem;\n  min-width: 480px;\n  overflow-y: scroll;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n#copy-form {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  padding: 0.75rem 3rem;\n  overflow: auto;\n  position: relative;\n}\n\n</style>\n","import script from \"./ImageCopyModal.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ImageCopyModal.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./ImageCopyModal.vue?vue&type=style&index=0&id=9fe3d314&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-9fe3d314\"]])\n\nexport default __exports__","<template>\n  <div class=\"actions-dropdown-button\">\n    <FilterPopper\n      v-model:show=\"tagOpen\"\n      :placement=\"'bottom-start'\"\n      :offset=\"[-4, 5]\"\n    >\n      <template #default=\"{ menuOpen }\">\n        <button class=\"button actions-toggle-button\" :class=\"{'active': menuOpen}\">\n          Actions\n          <SVGIcon\n            :iconName=\"'expand_more'\"\n            :width=\"'20px'\"\n            :height=\"'20px'\"\n            :mirrored=\"menuOpen\"\n          />\n        </button>\n      </template>\n      <template #popper>\n        <div class=\"filter-settings\">\n          <FilterPopper\n            v-model:show=\"updateTagOpen\"\n            :placement=\"'right-start'\"\n            :offset=\"[-4,0]\"\n          >\n            <button\n              class=\"filter-settings__row filter-settings__row-button\"\n            >\n              <label :for=\"`action-tags`\">Add & Update Tags</label>\n              <SVGIcon\n                class=\"filter-settings__row-button-chevron-right\"\n                :iconName=\"'chevron_right'\"\n                :height=\"'20px'\"\n                :width=\"'20px'\"\n              />\n            </button>\n            <template #popper>\n              <div class=\"tags-selector scrollbar\">\n                <Transition name=\"fade\" mode=\"out-in\">\n                  <div v-if=\"allTags\">\n                    <div class=\"chkbx-row mt-2\">\n                      <div\n                        v-if=\"!newTag && newTag !== ''\"\n                        class=\"header-tag-text\"\n                        @click.stop.prevent=\"newTagClicked\"\n                      >\n                        Click here to add a new tag\n                      </div>\n                      <input\n                        v-if=\"newTag || newTag === ''\"\n                        :ref=\"`textEditorNewTag`\"\n                        v-model=\"newTag\"\n                        type=\"text\"\n                        class=\"header-tag-text\"\n                        @blur=\"createNewTag()\"\n                        @keyup.enter=\"createNewTag()\"\n                      >\n                      <v-btn\n                        v-if=\"newTag || newTag === ''\"\n                        id=\"send-btn\"\n                        :icon=\"'mdi-check'\"\n                        size=\"x-small\"\n                        variant=\"plain\"\n                        class=\"edit-btn\"\n                        active-color=\"#250E81\"\n                        @click.stop.prevent=\"createNewTag()\"\n                      />\n                    </div>\n                    <div class=\"chkbx-ul scrollbar\">\n                      <div\n                        v-for=\"(tag, index) in allTags\"\n                        :key=\"`tag-checkbox-${index}`\"\n                        class=\"chkbx-row\"\n                      >\n                        <div class=\"check-icon me-1\">\n                          <SVGIcon\n                            v-if=\"selectedTags && selectedTags.includes(tag.name)\"\n                            :iconName=\"'check'\"\n                            :height=\"'16px'\"\n                            :width=\"'16px'\"\n                          />\n                        </div>\n                        <template\n                          v-if=\"!tag.editing\"\n                        >\n                          <label :for=\"`tag-checkbox-${index}`\" class=\"text\">{{ tag.name }}</label>\n                          <input\n                            :id=\"`tag-checkbox-${index}`\"\n                            type=\"checkbox\"\n                            class=\"chkbx-input\"\n                            :disabled=\"selectedImages && selectedImages.length < 1\"\n                            @change.stop=\"($event) => handleTagsToggle($event, tag.name)\"\n                          >\n                        </template>\n                        <input\n                          v-else\n                          :ref=\"`textEditor${index}`\"\n                          v-model=\"tag.editing\"\n                          type=\"text\"\n                          @blur=\"editDone(index)\"\n                          @keyup.enter=\"editDone(index)\"\n                        >\n                        <v-btn\n                          v-if=\"!tag.editing\"\n                          :icon=\"'mdi-pencil'\"\n                          size=\"x-small\"\n                          variant=\"plain\"\n                          class=\"edit-btn\"\n                          active-color=\"#250E81\"\n                          @click.stop.prevent=\"edit(index)\"\n                        />\n                        <v-btn\n                          v-else\n                          id=\"send-btn\"\n                          :icon=\"'mdi-check'\"\n                          size=\"x-small\"\n                          variant=\"plain\"\n                          class=\"edit-btn\"\n                          active-color=\"#250E81\"\n                          @click.stop.prevent=\"editDone(index)\"\n                        />\n                        <v-btn\n                          :icon=\"'mdi-close-circle'\"\n                          size=\"x-small\"\n                          variant=\"plain\"\n                          class=\"edit-btn\"\n                          @click.stop.prevent=\"openConfirmRemoveTagsForDatasetModal(index, tag)\"\n                        />\n                      </div>\n                    </div>\n                    <div\n                      v-if=\"selectedImages && selectedImages.length < 1 && allTags && allTags.length > 0\"\n                      class=\"empty-warning\"\n                    >\n                      Select at least 1 image to apply tags.\n                    </div>\n                  </div>\n                  <div v-else>\n                    <v-skeleton-loader\n                      type=\"list-item\"\n                      theme=\"primary\"\n                      color=\"transparent\"\n                    />\n                    <v-skeleton-loader\n                      type=\"list-item\"\n                      theme=\"primary\"\n                      color=\"transparent\"\n                    />\n                  </div>\n                </Transition>\n              </div>\n            </template>\n          </FilterPopper>\n          <button\n            id=\"delete-button\"\n            class=\"filter-settings__row filter-settings__row-button\"\n            :disabled=\"selectedImages && selectedImages.length === 0\"\n            @click=\"deleteImages\"\n          >\n            <label>Delete Images</label>\n          </button>\n        </div>\n      </template>\n    </FilterPopper>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\n\nexport default {\n  // TODO: Refactor this action dropdown to separate tags, delete, and future actions\n  name: \"GalleryActionsDropdown\",\n  components: {\n    FilterPopper,\n    SVGIcon,\n    ConfirmModal,\n  },\n  props: {\n    selectedImages: {\n      type: Array,\n      default: () => [],\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: [\n    'delete-images', 'refresh-dataset', 'add-tag', 'remove-tag',\n  ],\n  data() {\n    return {\n      tagOpen: false,\n      updateTagOpen: false,\n      allTags: null,\n      selectedTags: null,\n      newTag: null,\n      dataConnect: new DatastoreConnect(),\n      buttonText: '',\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      confirmFunction: null,\n      toDelete: null,\n    };\n  },\n  computed: {\n  },\n  watch: {\n    tagOpen(isOpen) {\n      if (isOpen) {\n        this.refreshDatasetTags().then(() => this.refreshImagesTags());\n      } else {\n        this.selectedTags = null;\n      }\n    },\n  },\n  methods: {\n    async refreshDatasetTags() {\n      const dataConnect = new DatastoreConnect();\n      await dataConnect.listTagsForDataset({\n        dataset_id: this.dataset.id,\n      })\n        .then((resp) => {\n          if (resp.error) {\n            throw resp.error;\n          }\n          this.allTags = resp.result;\n          this.allTags = this.allTags.map((tag) => ({\n            ...tag,\n            editing: null,\n          }));\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n    },\n    async refreshImagesTags() {\n      const dataConnect = new DatastoreConnect();\n      if (this.selectedImages && this.selectedImages.length > 0) {\n        const image_ids = this.selectedImages.map((e) => e.id);\n\n        await dataConnect.listTagsForImages({\n          dataset_id: this.dataset.id,\n          image_ids,\n        })\n          .then((resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            this.selectedTags = resp.result.map((e) => e.name);\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n    edit(index) {\n      this.allTags[index].editing = this.allTags[index].name;\n      this.$nextTick(() => {\n        this.$refs[`textEditor${index}`][0].focus();\n      });\n    },\n    openConfirmRemoveTagsForDatasetModal(index, tag) {\n      this.confirmMessage = `Are you sure you want to remove tag \"${tag.name}\" from this dataset? This will remove it from all images where it is applied.`;\n      this.confirmMessageHeader = 'Remove Tag';\n      this.toDelete = tag;\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.removeTagForDataset(index);\n      };\n    },\n    removeTagForDataset(index) {\n      this.dataConnect.removeTagForDataset({\n        dataset_id: this.dataset.id,\n        tag_name: this.allTags[index].name,\n      })\n        .then((resp) => {\n          if (resp.error) {\n            throw resp.error;\n          }\n          // this.allTags = this.allTags.filter((e) => e.name !== this.allTags[index].name);\n          this.refreshDatasetTags().then(() => {\n            this.$emit('refresh-dataset');\n          });\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n    },\n    editDone(index) {\n      if (this.allTags[index].editing && this.allTags[index].editing !== '') {\n        this.dataConnect.updateTagName({\n          dataset_id: this.dataset.id,\n          old_name: this.allTags[index].name,\n          tag_name: this.allTags[index].editing,\n        })\n          .then((resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            this.allTags[index].name = this.allTags[index].editing;\n            this.refreshDatasetTags().then(() => this.refreshImagesTags().then(() => {\n              this.$emit('refresh-dataset');\n            }));\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n      this.allTags[index].editing = null;\n    },\n    async removeTagsForImages(tag_name) {\n      if (this.selectedImages && this.selectedImages.length > 0) {\n        // remove for selected images\n        const image_ids = this.selectedImages.map((e) => e.id);\n        await this.dataConnect.removeTagForImages({\n          dataset_id: this.dataset.id,\n          image_ids,\n          tag_names: [tag_name],\n        })\n          .then((resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            // this.allTags = this.allTags.filter((e) => e.name !== this.allTags[index].name);\n            this.refreshImagesTags().then(() => {\n              this.$emit('remove-tag', tag_name);\n            });\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n    async addTagsForImages(tag_name) {\n      if (this.selectedImages && this.selectedImages.length > 0) {\n        // add tags for selected images\n        const image_ids = this.selectedImages.map((e) => e.id);\n        await this.dataConnect.addNewTagForImages({\n          dataset_id: this.dataset.id,\n          tag_names: [tag_name],\n          image_ids,\n        })\n          .then(async (resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            await this.refreshImagesTags().then(() => {\n              this.$emit('add-tag', tag_name);\n            });\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    },\n    newTagClicked() {\n      this.newTag = '';\n      this.$nextTick(() => { this.$refs.textEditorNewTag.focus(); });\n    },\n    handleTagsToggle(event, tag_name) {\n      if (!this.selectedTags.includes(tag_name)) {\n        this.addTagsForImages(tag_name);\n      } else {\n        this.removeTagsForImages(tag_name);\n      }\n    },\n    createNewTag() {\n      if (this.newTag && this.newTag !== '') {\n        // add tags for dataset\n        this.dataConnect.addNewTagForDataset({ dataset_id: this.dataset.id, tag_name: this.newTag })\n          .then(async (resp) => {\n            if (resp.error) {\n              throw resp.error;\n            }\n            this.allTags.push({ name: this.newTag });\n            if (this.selectedImages && this.selectedImages.length > 0) {\n              await this.addTagsForImages(this.newTag);\n            } else {\n              this.refreshDatasetTags();\n            }\n            this.newTag = null;\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      } else {\n        this.newTag = null;\n      }\n    },\n    deleteImages() {\n      this.$emit('delete-images');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 0 6px;\n  height: 18px;\n  @include themify() {\n    background: themed('color-accent');\n  }\n}\n\n.filter-settings {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  border-radius: inherit;\n  text-transform: none;\n  min-width: 100px;\n\n  &.scrollbar {\n    overflow: auto;\n  }\n\n  &__row {\n    display: flex;\n    align-items: center;\n    position: relative;\n    max-width: 600px;\n  }\n\n  &__row-button {\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    appearance: none;\n    background: transparent;\n    border: none;\n    padding: 6px 8px;\n    cursor: pointer;\n\n    &:first-of-type {\n      border-top-left-radius: inherit;\n      border-top-right-radius: inherit;\n    }\n    &:last-of-type {\n      border-bottom-left-radius: inherit;\n      border-bottom-right-radius: inherit;\n    }\n\n    &:hover {\n      background: rgba(0,0,0,0.125);\n    }\n    &:focus-within {\n      background: rgba(0,0,0,0.125);\n    }\n\n    &> * {\n      pointer-events: none;\n    }\n\n    input {\n      -webkit-appearance: none;\n      -moz-appearance: none;\n      appearance: none;\n      opacity: 0;\n      margin: 0;\n    }\n\n    span, label {\n      font-size: 0.9rem;\n      font-weight: 500;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n  }\n\n  &__row-button-check {\n    width: 20px;\n    min-width: 20px;\n    height: 20px;\n    min-height: 20px;\n    @include themify() {\n      color: themed('filter-button-list-row-button-selected')\n    }\n  }\n\n  &__row-button-legend {\n    min-width: 10px;\n    min-height: 10px;\n    margin-right: 12px;\n    border-radius: 100%;\n  }\n\n  &__row-button-chevron-right {\n    margin-left: auto;\n    padding-left: 4px;\n  }\n}\n\n.actions-toggle-button, .settings-toggle-button {\n  background: white;\n\n}\n\n.actions-dropdown-button {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 26px;\n  padding: 0;\n  box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n  @include themify() {\n    color: themed('body-text-color')\n  }\n}\n\n.actions-toggle-button {\n  display: flex;\n  align-items: center;\n  height: 100%;\n  flex: 1 1 auto;\n  padding: 4px 8px;\n  gap: 2px;\n  border-right: solid 1px rgba(0,0,0,0.5);\n  color: inherit;\n\n  &:hover {\n    box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.2) inset;\n    background: rgba(var(--color-primary-100-rgb), 0.5);\n  }\n\n  &:active {\n    opacity: 1;\n  }\n\n  &.active {\n    @include themify() {\n      box-shadow: 0 0 2px 1px rgba(var(--color-primary-rgb), 0.5) inset;\n      background: rgba(var(--color-primary-100-rgb), 0.8);\n    }\n  }\n}\n\n.tags-selector {\n  display: flex;\n  flex-direction: column;\n  padding: 8px 0;\n  border-radius: inherit;\n  gap: 6px;\n  min-width: 250px;\n  max-height: 500px;\n\n  &__row {\n    display: flex;\n    align-items: center;\n\n    input[type=checkbox] {\n      margin-right: 12px;\n    }\n\n    label {\n      font-size: 0.9rem;\n      font-weight: 500;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n  }\n\n  .sub-menu-header {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    font-size: 0.9rem;\n    color: var(--gray-900);\n\n    .title {\n      font-weight: 600;\n      padding: 0 5px 0 3px;\n      margin-left: 7px;\n    }\n\n    .tags-grid {\n      display: grid;\n      max-height: 170px;\n      overflow-y: auto;\n      gap: 6px;\n      margin: 0 5px 0 7px;\n    }\n  }\n\n  .chkbx-ul {\n    flex: 1 1 auto;\n    max-height: 250px;\n    overflow-y: auto;\n  }\n\n  .chkbx-row {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    height: fit-content;\n    min-height: 25px;\n    padding: 0 5px 0 3px;\n\n    &:hover, &._active {\n      background: rgba(0,0,0,0.1);\n    }\n\n    &:hover .edit-btn {\n        visibility: visible !important;\n      }\n\n    .checkbox {\n      width: 28px;\n      max-width: 28px;\n    }\n\n    .check-icon {\n      color: #250E81;\n      width: 16px;\n      min-width: 16px;\n      height: 16px;\n      min-height: 16px;\n      }\n\n    .text {\n      margin-left: 5px;\n      font-size: 0.9rem;\n      width: 170px;\n      border-bottom: 1px solid transparent;\n      cursor: default;\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n\n    .chkbx-input {\n        display: none;\n    }\n\n    .header-tag-text {\n      margin-left: 5px;\n      font-size: 0.9rem;\n      width: 170px;\n      border-bottom: 1px solid transparent;\n      cursor: default;\n      flex: 1 1 auto;\n      font-weight: 600;\n      color: var(--gray-900);\n    }\n\n    input[type=\"text\"] {\n      margin-left: 5px;\n      width: 170px;\n      font-size: 0.9rem;\n      border-bottom: 1px solid transparent;\n      outline: none;\n\n      &:focus {\n        border-bottom: 1px solid #250E81;\n      }\n    }\n\n    .edit-btn:not(#send-btn) {\n      visibility: hidden;\n    }\n  }\n\n  .empty-warning {\n    flex: 1 1 auto;\n    height: fit-content;\n    padding: 0 5px 0 3px;\n    margin-left: 5px;\n    font-size: 0.9rem;\n    color: var(--gray-600);\n  }\n\n  .add-tags-btn {\n    flex: 1 1 auto;\n    height: fit-content;\n    padding: 0 5px 0 3px;\n    margin-left: 5px;\n    display: flex;\n    justify-content: flex-end;\n  }\n}\n\n#delete-button {\n  label {\n    color: var(--color-red-500);\n    font-weight: 600;\n  }\n\n  &:disabled {\n    label {\n      color: var(--color-disabled-200) !important;\n    }\n    cursor: not-allowed;\n  }\n}\n</style>\n","import { render } from \"./GalleryActionsDropdown.vue?vue&type=template&id=23ad7afa&scoped=true\"\nimport script from \"./GalleryActionsDropdown.vue?vue&type=script&lang=js\"\nexport * from \"./GalleryActionsDropdown.vue?vue&type=script&lang=js\"\n\nimport \"./GalleryActionsDropdown.vue?vue&type=style&index=0&id=23ad7afa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-23ad7afa\"]])\n\nexport default __exports__","import { render } from \"./Gallery.vue?vue&type=template&id=1d8abd18&scoped=true\"\nimport script from \"./Gallery.vue?vue&type=script&lang=js\"\nexport * from \"./Gallery.vue?vue&type=script&lang=js\"\n\nimport \"./Gallery.vue?vue&type=style&index=0&id=1d8abd18&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1d8abd18\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"dataset !== null\" class=\"dataset-stats__page\">\n    <StatsOverview\n      :dataset=\"dataset\"\n      :boxSize=\"boxSize\"\n      @new-set=\"handleNewSetSelected\"\n    />\n\n    <div class=\"dataset-stats__main scrollbar\">\n      <template v-if=\"isNotEmpty && !fetching\">\n        <div class=\"row-40\">\n          <div class=\"chart col-40\">\n            <LabelsPieChart\n              :name=\"'Label Count'\"\n              :dataArray=\"labelCountData\"\n            />\n          </div>\n          <div class=\"chart col-60\">\n            <ConfidenceHistogram\n              :name=\"'Confidence Histogram'\"\n              :dataArray=\"histogramData\"\n            />\n          </div>\n        </div>\n        <div class=\"row-40\">\n          <div class=\"chart col-100\">\n            <BoundingBoxSizeHistogram\n              :name=\"'Annotation Size Histogram'\"\n              :dataArray=\"bboxSizeHistogram\"\n              @custom-range=\"(range) => getBBoxSizeHistogram(range)\"\n            />\n          </div>\n        </div>\n        <div class=\"row-60\">\n          <div class=\"chart col-50\">\n            <LabelLocationMap\n              :name=\"'Annotation Location Density'\"\n              :dataset=\"dataset\"\n              :labelList=\"labelList\"\n              :dataArray=\"locationMap\"\n              @new-location-label=\"handleNewLabelSelected\"\n            />\n          </div>\n          <div class=\"chart col-50\">\n            <BoundingBoxDisplay\n              :name=\"'Bounding Box Visualization'\"\n              :dataset=\"dataset\"\n              :labelList=\"labelList\"\n              :annotationList=\"filteredAnnotationList\"\n              @new-visualizer-label=\"handleNewLabelVisualizerSelected\"\n            />\n          </div>\n        </div>\n      </template>\n      <template v-else-if=\"isNotEmpty && fetching\">\n        <div\n          class=\"empty-state\"\n        >\n          <svg width=\"60%\" height=\"60%\">\n            <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n          </svg>\n          <div class=\"empty-state__message\">\n            <h3>Fetching analytics.</h3>\n          </div>\n        </div>\n      </template>\n      <template v-else>\n        <div\n          class=\"empty-state\"\n        >\n          <svg width=\"60%\" height=\"60%\">\n            <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n          </svg>\n          <div class=\"empty-state__message\">\n            <h3>Please select an annotation set.</h3>\n          </div>\n        </div>\n      </template>\n    </div>\n  </div>\n  <div\n    v-else\n    class=\"empty-state\"\n  >\n    <svg width=\"60%\" height=\"60%\">\n      <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n    </svg>\n    <div class=\"empty-state__message\">\n      <h3>Please select a dataset.</h3>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport StatsOverview from '@/components/DatasetComponent/DatasetStats/StatsOverview.vue';\nimport ConfidenceHistogram from '@/components/DatasetComponent/DatasetStats/ConfidenceHistogram.vue';\nimport LabelsPieChart from '@/components/DatasetComponent/DatasetStats/LabelsPieChart.vue';\nimport LabelLocationMap from '@/components/DatasetComponent/DatasetStats/LabelLocationMap.vue';\nimport BoundingBoxDisplay from '@/components/DatasetComponent/DatasetStats/BoundingBoxDisplay.vue';\nimport BoundingBoxSizeHistogram from '@/components/DatasetComponent/DatasetStats/BoundingBoxSizeHistogram.vue';\n\nexport default {\n  name: \"DatasetStats\",\n  components: {\n    StatsOverview,\n    LabelsPieChart,\n    ConfidenceHistogram,\n    LabelLocationMap,\n    BoundingBoxDisplay,\n    BoundingBoxSizeHistogram,\n  },\n  props: {\n  },\n  emits: [],\n  data() {\n    return {\n      dataConnect: null,\n      set: null,\n      boxSize: null,\n      labelCountData: null,\n      histogramData: null,\n      locationMap: null,\n      fullAnnotationList: [],\n      active: false,\n      labelList: [],\n      labelLocation: null,\n      labelVisualizer: null,\n      bboxSizeHistogram: null,\n      fetching: false,\n    };\n  },\n  computed: {\n    dataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    isNotEmpty() {\n      return this.labelCountData !== null && this.histogramData !== null;\n    },\n    filteredAnnotationList() {\n      if (this.labelVisualizer && this.labelVisualizer.index !== -1) {\n        return this.fullAnnotationList.filter((e) => e.label_id === this.labelVisualizer.id);\n      } else {\n        return this.fullAnnotationList;\n      }\n    },\n  },\n  watch: {\n    labelLocation: {\n      handler(l) {\n        if (l) {\n          this.getLocationMap(l);\n        }\n      },\n    },\n    dataset: {\n      handler() {\n        this.resetState();\n      },\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  mounted() {\n    if (this.dataset) {\n      this.getLabelList();\n    }\n  },\n  unmounted() {\n    this.$store.commit('statistics/setDatasetID', this.dataset?.id);\n    this.$store.commit('statistics/setAnnotationSet', this.set);\n    this.$store.commit('statistics/setLabelLocation', this.labelLocation);\n    this.$store.commit('statistics/setLabelVisualizer', this.labelVisualizer);\n  },\n  methods: {\n    resetState() {\n      this.set = null;\n      this.labelCountData = null;\n      this.histogramData = null;\n      this.locationMap = null;\n      this.boxSize = null;\n      this.labelLocation = null;\n      this.labelVisualizer = null;\n      this.getLabelList();\n    },\n    async getAllStats() {\n      const promises = [];\n      this.fetching = true;\n      promises.push(this.getConfHist());\n      promises.push(this.getLabelCount());\n      promises.push(this.getMinMaxBox());\n      promises.push(this.getAllAnnotations());\n      promises.push(this.getBBoxSizeHistogram([0.0, 1.0]));\n\n      await Promise.all(promises)\n        .then((resp) => {\n          this.fetching = false;\n        })\n        .catch((e) => {\n          console.log(e);\n          this.fetching = false;\n        });\n    },\n    async getLabelList() {\n      if (this.dataset) {\n        await this.dataConnect.getLabelList({ dataset_id: this.dataset.id })\n          .then((data) => {\n            this.labelList = data.result;\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      }\n    },\n    async getConfHist() {\n      await this.dataConnect.getDatasetStats(\n        {\n          type: \"dataset_histogram\",\n          dataset_id: this.dataset.id,\n          annotation_sets: this.set.id,\n        },\n      )\n        .then((data) => {\n          this.histogramData = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getBBoxSizeHistogram(range) {\n      await this.dataConnect.getDatasetStats(\n        {\n          dataset_id: this.dataset.id,\n          type: \"bbox_size_histogram\",\n          annotation_sets: this.set.id,\n          lower: range[0],\n          upper: range[1],\n        },\n      )\n        .then((data) => {\n          this.bboxSizeHistogram = data.result;\n          this.bboxSizeHistogram.annotation_set_name = this.set.name;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getLabelCount() {\n      await this.dataConnect.getDatasetStats(\n        {\n          type: \"label_count\",\n          dataset_id: this.dataset.id,\n          annotation_sets: this.set.id,\n        },\n      )\n        .then((data) => {\n          this.labelCountData = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getLocationMap(label) {\n      if (label) {\n        await this.dataConnect.getDatasetStats(\n          {\n            type: \"location_map\",\n            dataset_id: this.dataset.id,\n            annotation_sets: this.set.id,\n            label_id: label.id,\n          },\n        )\n          .then((data) => {\n            this.locationMap = data.result;\n          })\n          .catch((e) => console.log(e));\n      }\n    },\n    async getMinMaxBox() {\n      await this.dataConnect.getDatasetStats(\n        {\n          type: \"box_sizes\",\n          dataset_id: this.dataset.id,\n          annotation_sets: this.set.id,\n        },\n      )\n        .then((data) => {\n          this.boxSize = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    async getAllAnnotations() {\n      await this.dataConnect.getAnnotationsForAnnotationSets(\n        {\n          annotation_set_id: this.set.id,\n        },\n      )\n        .then((data) => {\n          this.fullAnnotationList = data.result;\n        })\n        .catch((e) => console.log(e));\n    },\n    handleNewSetSelected(s) {\n      if (s && Object.keys(s).length > 0) {\n        this.set = s;\n        this.getAllStats();\n        this.getLocationMap(this.labelLocation);\n      }\n    },\n    handleNewLabelSelected(l) {\n      this.labelLocation = l;\n    },\n    handleNewLabelVisualizerSelected(l) {\n      this.labelVisualizer = l;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.dataset-stats {\n\n  &__page {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    height: 100%;\n  }\n\n  &__main {\n    height: calc(100% - 20px);\n    width: 100%;\n    margin: 10px;\n    padding-top: 3px;\n    padding-bottom: 2px;\n    padding-left: 3px;\n    padding-right: 10px;\n    overflow-y: scroll;\n\n    .row-40 {\n      display: flex;\n      flex-direction: row;\n      height: 400px;\n    }\n    .row-60 {\n      display: flex;\n      flex-direction: row;\n      height: 600px;\n    }\n\n    .col-40 {\n      display: flex;\n      flex-direction: column;\n      width: 40%;\n    }\n\n    .col-50 {\n      display: flex;\n      flex-direction: column;\n      width: 50%;\n    }\n\n    .col-60 {\n      display: flex;\n      flex-direction: column;\n      width: 60%;\n    }\n\n    .col-100 {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n    }\n\n    .chart + .chart {\n      margin-left: 20px;\n    }\n\n  }\n\n  &__header {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n\n    span {\n      font-weight: 700;\n      font-size: 1.1rem;\n      margin-right: 20px;\n    }\n  }\n}\n\n.add-task-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n</style>\n","<template>\n  <div class=\"overview-table\">\n    <div class=\"table-header\">\n      <span class=\"title\">Dataset Summary</span>\n    </div>\n    <div class=\"dataset-details\">\n      <ul class=\"dataset-details__list scrollbar\">\n        <li class=\"dataset-details__list-item\">\n          <div class=\"dataset-details__list-item-icon\">\n            <SVGIcon\n              :iconName=\"'database2'\"\n              :width=\"30\"\n              :height=\"30\"\n            />\n          </div>\n          <div class=\"dataset-details__list-item-details\">\n            <span :title=\"`${ dataset.name }`\">{{ dataset.name }}</span>\n          </div>\n        </li>\n        <li class=\"dataset-details__list-item\">\n          <div class=\"dataset-details__list-item-icon\">\n            <SVGIcon\n              :iconName=\"'image'\"\n              :width=\"30\"\n              :height=\"30\"\n            />\n          </div>\n          <div class=\"dataset-details__list-item-details\">\n            <span>Images</span>\n            <div class=\"dataset-details__list-item-sub-details _overflow-wrap\">\n              <span>{{ dataset.numImages }}</span>\n            </div>\n          </div>\n        </li>\n        <li class=\"dataset-details__list-item\">\n          <div class=\"dataset-details__list-item-icon\">\n            <SVGIcon\n              :iconName=\"'tag'\"\n              :width=\"30\"\n              :height=\"30\"\n            />\n          </div>\n          <div class=\"dataset-details__list-item-details\">\n            <span>Labels</span>\n            <div class=\"dataset-details__list-item-sub-details _overflow-wrap\">\n              <span :title=\"`${dataset.numLabels}`\">{{ dataset.numLabels }}</span>\n            </div>\n          </div>\n        </li>\n        <li class=\"dataset-details__list-item\">\n          <div class=\"dataset-details__list-item-icon\">\n            <SVGIcon\n              :iconName=\"'set'\"\n              :width=\"28\"\n              :height=\"28\"\n            />\n          </div>\n          <div class=\"dataset-details__list-item-details\">\n            <span>Annotation Sets</span>\n            <AnnotationSetsRadioSelect\n              :id=\"'analytics'\"\n              v-model=\"set\"\n              :name=\"'Set'\"\n              :restore=\"restore\"\n              :annotationSets=\"dataset.annotation_sets\"\n            />\n          </div>\n        </li>\n        <template v-if=\"boxSize && Object.keys(boxSize).length > 0\">\n          <li class=\"dataset-details__list-item\">\n            <div class=\"dataset-details__list-item-icon\">\n              <SVGIcon\n                :iconName=\"'minimize'\"\n                :width=\"30\"\n                :height=\"30\"\n              />\n            </div>\n            <div class=\"dataset-details__list-item-details\">\n              <span>Min Box Size</span>\n              <div class=\"dataset-details__list-item-sub-details _overflow-wrap\">\n                <span>{{ `${boxSize.min_width.toFixed(4)} x ${boxSize.min_height.toFixed(4)}` }}</span>\n              </div>\n            </div>\n          </li>\n          <li class=\"dataset-details__list-item\">\n            <div class=\"dataset-details__list-item-icon\">\n              <SVGIcon\n                :iconName=\"'maximize'\"\n                :width=\"30\"\n                :height=\"30\"\n              />\n            </div>\n            <div class=\"dataset-details__list-item-details\">\n              <span>Max Box Size</span>\n              <div class=\"dataset-details__list-item-sub-details _overflow-wrap\">\n                <span>{{ `${boxSize.max_width.toFixed(4)} x ${boxSize.max_height.toFixed(4)}` }}</span>\n              </div>\n            </div>\n          </li>\n        </template>\n      </ul>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport AnnotationSetsRadioSelect from '@/components/DatasetComponent/AnnotationSetsRadioSelect.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"StatsOverview\",\n  components: {\n    SVGIcon,\n    AnnotationSetsRadioSelect,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    boxSize: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['new-set'],\n  data() {\n    return {\n      set: null,\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      restore: null,\n    };\n  },\n  watch: {\n    dataset(d) {\n      if (d && d['annotation_sets'] && d['annotation_sets'].length > 0) {\n        this.restore = d.annotation_sets[0];\n      }\n    },\n    set(s) {\n      if (s) {\n        this.$emit('new-set', s);\n      }\n    },\n  },\n  mounted() {\n    if (!this.set && this.dataset['annotation_sets'] && this.dataset['annotation_sets'].length > 0) {\n      this.restore = this.dataset.annotation_sets[0];\n    }\n  },\n  methods: {\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.overview-table {\n  height: calc(100% - 20px);\n  width: 275px;\n  border-radius: 8px;\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  margin: 10px;\n  padding-top: 10px;\n  padding-bottom: 10px;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('datasets-stats-text-color');\n  }\n}\n\n.table-header {\n  display: flex;\n  align-items: center;\n\n}\n.title {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n  font-size: 1.3rem;\n  font-weight:700;\n}\n\n.dataset-details {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 250px;\n  max-width: 300px;\n  margin-top: 10px;\n  padding: 0;\n  z-index: 2;\n\n  &__list {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    padding: 0;\n    margin: 0;\n    gap: 8px;\n    overflow-y: auto;\n    list-style-type: none;\n  }\n\n  &__list-item {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    width: 100%;\n    padding: 10px 16px 10px 16px;\n  }\n\n  &__list-item-icon {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    width: 40px;\n    min-width: 40px;\n  }\n\n  &__list-item-details {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    text-align: left;\n    overflow: hidden;\n\n    :deep(button) {\n      width: unset !important;\n    }\n\n    span {\n      font-weight: 600;\n      font-size: 1.05rem;\n      line-height: 1.3rem;\n      overflow: hidden;\n      margin-bottom: 2px;\n      overflow-wrap: anywhere;\n    }\n\n    .radio-dropdown {\n      width: fit-content;\n    }\n  }\n\n  &__list-item-sub-details {\n    display: flex;\n    flex-direction: row;\n    flex: 1 1 auto;\n    text-align: left;\n\n    span {\n      font-weight: 500;\n      font-size: 1rem;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n    }\n\n    &._overflow-wrap span {\n      white-space: unset;\n      overflow-wrap: anywhere;\n    }\n  }\n}\n</style>\n","import { render } from \"./StatsOverview.vue?vue&type=template&id=ae785aaa&scoped=true\"\nimport script from \"./StatsOverview.vue?vue&type=script&lang=js\"\nexport * from \"./StatsOverview.vue?vue&type=script&lang=js\"\n\nimport \"./StatsOverview.vue?vue&type=style&index=0&id=ae785aaa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ae785aaa\"]])\n\nexport default __exports__","<template>\n  <div class=\"stats-graph\">\n    <div class=\"header\">\n      <span class=\"title\">{{ name }}</span>\n    </div>\n    <div class=\"body\">\n      <apexchart\n        ref=\"confHistogram\"\n        height=\"100%\"\n        type=\"bar\"\n        :options=\"chartOptions\"\n        :series=\"series\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\n\nimport VueApexCharts from \"vue3-apexcharts\";\n\nexport default {\n  name: 'HistogramData',\n  components: {\n    'apexchart': VueApexCharts,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    dataArray: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  data() {\n    return {\n      chartOptions: {\n        chart: {\n          toolbar: {\n            show: false,\n          },\n        },\n        xaxis: {\n          tickAmount: 10,\n          labels: {\n            show: true,\n            rotate: 0,\n            rotateAlways: true,\n            offsetX: 10,\n            offsetY: 10,\n          },\n          tickPlacement: 'between',\n        },\n        dataLabels: {\n          enabled: false,\n        },\n        tooltip: {\n          fillSeriesColor: false,\n        },\n        legend: {\n          show: true,\n          showForSingleSeries: true,\n          position: 'right',\n        },\n      },\n      series: [],\n      labels: ['0.0 - 0.1', '0.1 - 0.2', '0.2 - 0.3', '0.3 - 0.4', '0.4 - 0.5', '0.5 - 0.6', '0.6 - 0.7', '0.7 - 0.8', '0.8 - 0.9', '0.9 - 1.0'],\n      componentIsActive: false,\n    };\n  },\n  watch: {\n    dataArray: {\n      handler() {\n        if (this.dataArray && this.dataArray.length > 0) {\n          this.updateHistogram();\n        }\n      },\n    },\n  },\n  created() {\n    if (this.dataArray && this.dataArray.length > 0) {\n      this.updateHistogram();\n    }\n  },\n  methods: {\n    updateHistogram() {\n      const series = [];\n      // This requires the first key-value pair of entry to be the label, the second to be the value at that label\n      this.dataArray.forEach((datum, index) => {\n        const singleSeries = {\n          name: datum.label_name,\n          data: datum.entries.map((e) => e.count),\n        };\n        series.push(singleSeries);\n      });\n      this.updateChart(series);\n    },\n    // update value of each column\n    updateChart(series) {\n      this.series = series;\n      this.chartOptions = {\n        ...this.chartOptions,\n        ...{\n          labels: this.labels,\n          colors: this.getColors(),\n        },\n      };\n    },\n\n    getColors() {\n      const colors = {};\n      this.dataArray.forEach((label) => {\n        if (label.label_index < 12) {\n          colors[label.label_name] = this.getColorByIndex(label.label_index);\n        } else {\n          colors[label.label_name] = this.getColorByIndexFromScale(label.label_index);\n        }\n      });\n      return Object.values(colors);\n    },\n    getColorByIndexFromScale(index) {\n      const hue = index * 137.508 + 60; // use golden angle approximation\n      return `hsl(${hue},100%,50%)`;\n    },\n    getColorByIndex(index) {\n      const colors = ['#ffff00', '#00ff00', '#ffa500', '#ff0000', '#48d1cc', '#a0522d', '#ffc0cb', '#ff1493', '#f0e68c', '#1e90ff', '#0000ff', '#00fa9a'];\n      return colors[index % 12];\n    },\n  },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.stats-graph {\n  display: flex;\n  flex-direction: column;\n  border-radius: 8px;\n  width: 100%;\n  height: calc(100% - 20px);\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  padding-top: 10px;\n  padding-bottom: 10px;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('datasets-stats-text-color');\n  }\n}\n\n.body {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  width: 100%;\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n\n  .title {\n    font-size: 1.3rem;\n    font-weight: 700;\n    min-width: 200px;\n  }\n\n  .toggle-btn {\n    width: fit-content;\n    margin-left: auto;\n    height: fit-content;\n\n    button {\n      width: 50px !important;\n    }\n  }\n}\n</style>\n","import { render } from \"./ConfidenceHistogram.vue?vue&type=template&id=d708b886&scoped=true\"\nimport script from \"./ConfidenceHistogram.vue?vue&type=script&lang=js\"\nexport * from \"./ConfidenceHistogram.vue?vue&type=script&lang=js\"\n\nimport \"./ConfidenceHistogram.vue?vue&type=style&index=0&id=d708b886&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d708b886\"]])\n\nexport default __exports__","<template>\n  <div class=\"stats-graph\">\n    <div class=\"header\">\n      <span class=\"title\">{{ name }}</span>\n      <v-btn-toggle\n        v-model=\"mode\"\n        color=\"black\"\n        mandatory\n        variant=\"outlined\"\n        class=\"toggle-btn\"\n      >\n        <v-btn icon=\"mdi-chart-pie\" value=\"pie\" />\n        <v-btn icon=\"mdi-chart-bar\" value=\"bar\" />\n      </v-btn-toggle>\n    </div>\n    <div class=\"chart\">\n      <apexchart\n        v-if=\"mode === 'pie'\"\n        ref=\"pieChartCount\"\n        height=\"100%\"\n        type=\"pie\"\n        :options=\"chartPieOptions\"\n        :series=\"series\"\n      />\n      <apexchart\n        v-if=\"mode === 'bar'\"\n        ref=\"barChartCount\"\n        height=\"100%\"\n        type=\"bar\"\n        :options=\"chartBarOptions\"\n        :series=\"series\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\n\nimport VueApexCharts from \"vue3-apexcharts\";\n\nexport default {\n  name: 'LabelsPieChart',\n  components: {\n    'apexchart': VueApexCharts,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    dataArray: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  data() {\n    return {\n      chartPieOptions: {\n        chart: {\n          toolbar: {\n            show: false,\n          },\n        },\n        dataLabels: {\n          enabled: true,\n          formatter: (val, { seriesIndex, w }) => w.config.series[seriesIndex],\n          style: {\n            colors: ['black'],\n          },\n        },\n        legend: {\n          show: true,\n          showForSingleSeries: true,\n          position: 'right',\n        },\n        tooltip: {\n          fillSeriesColor: false,\n        },\n      },\n      chartBarOptions: {\n        plotOptions: {\n          bar: {\n            columnWidth: '45%',\n            distributed: true,\n          },\n        },\n        chart: {\n          toolbar: {\n            show: false,\n          },\n        },\n        xaxis: {\n          tickPlacement: 'between',\n        },\n        dataLabels: {\n          enabled: false,\n        },\n        tooltip: {\n          fillSeriesColor: false,\n        },\n        legend: {\n          show: false,\n        },\n      },\n      series: [],\n      componentIsActive: false,\n      mode: 'pie',\n    };\n  },\n  watch: {\n    dataArray: {\n      deep: true,\n      handler() {\n        if (this.dataArray) {\n          this.update();\n        }\n      },\n    },\n    mode: {\n      handler() {\n        if (this.dataArray) {\n          this.update();\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.dataArray) {\n      this.update();\n    }\n    this.$nextTick(() => {\n      window.dispatchEvent(new Event('resize'));\n    });\n  },\n  methods: {\n    update() {\n      if (this.mode === 'pie') {\n        this.updatePie();\n      } else {\n        this.updateBar();\n      }\n    },\n    updatePie() {\n      const series = [];\n      // This requires the first key-value pair of entry to be the label, the second to be the value at that label\n      this.dataArray.counts.forEach((entry, index) => {\n        const singleSeries = {\n          name: '',\n          data: [],\n        };\n        const element = series.find((e) => e?.name === entry.name);\n        if (element) {\n          series[series.indexOf(element)].data.push(entry.count);\n        } else {\n          singleSeries.name = entry.name;\n          singleSeries.data.push(entry.count);\n          series.push(singleSeries);\n        }\n      });\n\n      const pieSeries = {\n        series: [],\n        labels: [],\n      };\n      series.forEach((s) => {\n        const sum = s.data.reduce((partialSum, a) => partialSum + a, 0);\n        pieSeries.series.push(sum);\n        pieSeries.labels.push(s.name);\n      });\n      this.updateChart(pieSeries);\n    },\n    updateBar() {\n      const data = {\n        series: [{\n          data: [],\n        }],\n        labels: [],\n      };\n      // This requires the first key-value pair of entry to be the label, the second to be the value at that label\n      this.dataArray.counts.forEach((datum, index) => {\n        data.series[0].data.push(datum.count);\n        data.labels.push(datum.name);\n      });\n      this.updateChart(data);\n    },\n    // update value of each column\n    updateChart(data) {\n      this.series = data.series;\n      if (this.mode === 'pie') {\n        this.chartPieOptions = {\n          ...this.chartPieOptions,\n          ...{\n            labels: data.labels,\n            colors: this.getColors(),\n          },\n        };\n      } else if (this.mode === 'bar') {\n        this.chartBarOptions = {\n          ...this.chartBarOptions,\n          ...{\n            xaxis: {\n              categories: data.labels,\n            },\n            colors: this.getColors(),\n          },\n        };\n      }\n    },\n    getColors() {\n      const colors = {};\n      this.dataArray.counts.forEach((label) => {\n        if (label.label_index < 12) {\n          colors[label.name] = this.getColorByIndex(label.label_index);\n        } else {\n          colors[label.name] = this.getColorByIndexFromScale(label.label_index);\n        }\n      });\n      return Object.values(colors);\n    },\n    getColorByIndexFromScale(index) {\n      const hue = index * 137.508 + 60; // use golden angle approximation\n      return `hsl(${hue},100%,50%)`;\n    },\n    getColorByIndex(index) {\n      const colors = ['#ffff00', '#00ff00', '#ffa500', '#ff0000', '#48d1cc', '#a0522d', '#ffc0cb', '#ff1493', '#f0e68c', '#1e90ff', '#0000ff', '#00fa9a'];\n      return colors[index % 12];\n    },\n  },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.stats-graph {\n  display: flex;\n  flex-direction: column;\n  border-radius: 8px;\n  width: 100%;\n  height: calc(100% - 20px);\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  padding-top: 10px;\n  padding-bottom: 10px;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('datasets-stats-text-color');\n  }\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n\n  .title {\n    font-size: 1.3rem;\n    font-weight: 700;\n    min-width: 200px;\n  }\n\n  .toggle-btn {\n    width: fit-content;\n    margin-left: auto;\n    height: fit-content;\n\n    button {\n      width: 50px !important;\n    }\n  }\n}\n\n.chart {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  width: 100%;\n}\n</style>\n","import { render } from \"./LabelsPieChart.vue?vue&type=template&id=45487d00&scoped=true\"\nimport script from \"./LabelsPieChart.vue?vue&type=script&lang=js\"\nexport * from \"./LabelsPieChart.vue?vue&type=script&lang=js\"\n\nimport \"./LabelsPieChart.vue?vue&type=style&index=0&id=45487d00&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-45487d00\"]])\n\nexport default __exports__","<template>\n  <div class=\"stats-graph\">\n    <div class=\"header\">\n      <span class=\"title\">{{ name }}</span>\n      <div class=\"selector\">\n        <LabelSelector\n          :key=\"'location'\"\n          v-model=\"labelLocation\"\n          :name=\"'location'\"\n          :labels=\"labelList\"\n          :restore=\"restore\"\n        />\n      </div>\n    </div>\n    <apexchart\n      ref=\"locMap\"\n      height=\"100%\"\n      type=\"heatmap\"\n      :options=\"chartOptions\"\n      :series=\"series\"\n    />\n  </div>\n</template>\n\n<script>\nimport VueApexCharts from \"vue3-apexcharts\";\nimport LabelSelector from '@/components/DatasetComponent/DatasetStats/LabelSelector.vue';\n\nexport default {\n  name: 'LabelLocationMap',\n  components: {\n    'apexchart': VueApexCharts,\n    LabelSelector,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    dataArray: {\n      type: Array,\n      default: () => [],\n    },\n    labelList: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['new-location-label'],\n  data() {\n    return {\n      chartOptions: {\n        plotOptions: {\n          heatmap: {\n            distributed: false,\n            enableShades: true,\n            useFillColorAsStroke: true,\n            radius: 0,\n          },\n        },\n        colors: [\"#01246c\"],\n        chart: {\n          toolbar: {\n            show: false,\n          },\n        },\n        dataLabels: {\n          enabled: false,\n        },\n        xaxis: {\n          tickAmount: 10,\n          labels: {\n            show: true,\n            rotate: -45,\n          },\n          axisTicks: {\n            show: true,\n            borderType: 'solid',\n          },\n          categories: [\n            '0 - 0.05',\n            '0.05 - 0.10',\n            '0.10 - 0.15',\n            '0.15 - 0.20',\n            '0.20 - 0.25',\n            '0.25 - 0.30',\n            '0.30 - 0.35',\n            '0.35 - 0.40',\n            '0.40 - 0.45',\n            '0.45 - 0.50',\n            '0.50 - 0.55',\n            '0.55 - 0.60',\n            '0.60 - 0.65',\n            '0.65 - 0.70',\n            '0.70 - 0.75',\n            '0.75 - 0.80',\n            '0.80 - 0.85',\n            '0.85 - 0.90',\n            '0.90 - 0.95',\n            '0.95 - 1.0'],\n        },\n        yaxis: {\n          tickAmount: 10,\n          axisTicks: {\n            show: false,\n          },\n          labels: {\n            show: true,\n            formatter(val, i) {\n              if (i % 2 === 0) {\n                return val;\n              } else {\n                return '';\n              }\n            },\n            offsetX: -5,\n          },\n        },\n        tooltip: {\n          enabled: true,\n          y: {\n            formatter(value) {\n              return value;\n            },\n          },\n        },\n      },\n      series: [],\n      labels: [\n        '0 - 0.05',\n        '0.05 - 0.10',\n        '0.10 - 0.15',\n        '0.15 - 0.20',\n        '0.20 - 0.25',\n        '0.25 - 0.30',\n        '0.30 - 0.35',\n        '0.35 - 0.40',\n        '0.40 - 0.45',\n        '0.45 - 0.50',\n        '0.50 - 0.55',\n        '0.55 - 0.60',\n        '0.60 - 0.65',\n        '0.65 - 0.70',\n        '0.70 - 0.75',\n        '0.75 - 0.80',\n        '0.80 - 0.85',\n        '0.85 - 0.90',\n        '0.90 - 0.95',\n        '0.95 - 1.0'],\n      componentIsActive: false,\n      labelLocation: null,\n      restore: null,\n    };\n  },\n  watch: {\n    dataArray: {\n      handler() {\n        if (this.dataArray && this.dataArray.length > 0) {\n          this.updateMap();\n        }\n      },\n    },\n    labelLocation: {\n      handler(l) {\n        this.$emit('new-location-label', l);\n      },\n    },\n  },\n  mounted() {\n    if (this.dataArray && this.dataArray.length > 0) {\n      this.updateMap();\n    }\n    const restoreDS = this.$store.state.statistics.datasetID;\n    if (restoreDS && restoreDS === this.dataset.id) {\n      const restoreLabel = this.$store.state.statistics.labelLocation;\n      if (restoreLabel) {\n        this.restore = restoreLabel;\n      } else {\n        if (this.labelList.length > 0) {\n          this.restore = this.labelList[0];\n        }\n      }\n    } else {\n      if (this.labelList.length > 0) {\n        this.restore = this.labelList[0];\n      }\n    }\n  },\n  methods: {\n    updateMap() {\n      const localSeries = [];\n      const localData = [...this.dataArray].reverse();\n      localData.forEach((datum, i) => {\n        const obj = {\n          name: this.labels[i],\n          data: datum,\n        };\n        localSeries.push(obj);\n      });\n      this.series = localSeries;\n    },\n  },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.stats-graph {\n  border-radius: 8px;\n  width: 100%;\n  height: 100%;\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  padding-top: 10px;\n  padding-bottom: 10px;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('datasets-stats-text-color');\n  }\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n\n  .title {\n    font-size: 1.3rem;\n    font-weight: 700;\n    min-width: 200px;\n  }\n\n  .selector {\n    margin-left: auto;\n    display: flex;\n    align-items: center;\n  }\n}\n</style>\n","<template>\n  <FilterPopper\n    :placement=\"'bottom-end'\"\n    :appendToBody=\"true\"\n    :offset=\"[0, 4]\"\n  >\n    <template #default=\"{ menuOpen }\">\n      <BaseFilterButton\n        :name=\"'Label'\"\n        :active=\"isActive\"\n        :tagValue=\"tagValue\"\n        :menuOpen=\"menuOpen\"\n      />\n    </template>\n    <template #popper>\n      <div v-if=\"labels && Object.values(labels).length > 0\" class=\"filter-settings scrollbar\">\n        <div v-for=\"(label, i) in labels\" :key=\"i\" class=\"filter-settings__row\">\n          <input\n            :id=\"`locationLabel-${name}-${label.name}-${i}`\"\n            v-model=\"selectedLabel\"\n            type=\"radio\"\n            :name=\"`${label.name}-${i}`\"\n            :value=\"label\"\n          >\n          <label :for=\"`${label.name}-${i}`\">{{ label.name }}</label><br>\n        </div>\n      </div>\n      <div v-else class=\"filter-settings\">\n        <span>Please define a label.</span>\n      </div>\n    </template>\n  </FilterPopper>\n</template>\n\n<script>\nimport FilterPopper from '@/components/FilterPopper.vue';\nimport BaseFilterButton from '@/components/BaseFilterButton.vue';\n\nexport default {\n  name: \"LabelSelector\",\n  components: {\n    FilterPopper,\n    BaseFilterButton,\n  },\n  props: {\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n    modelValue: {\n      type: Object,\n      default: () => {},\n    },\n    restore: {\n      type: Object,\n      default: () => {},\n    },\n    name: {\n      type: String,\n      default: '',\n    },\n  },\n  emits: [\n    'update:modelValue',\n  ],\n  data() {\n    return {\n      selectedLabel: null,\n    };\n  },\n  computed: {\n    isActive() {\n      return this.selectedLabel && Object.keys(this.selectedLabel).length > 0;\n    },\n    tagValue() {\n      return this.selectedLabel && this.selectedLabel.name;\n    },\n  },\n  watch: {\n    labels() {\n      if (this.labels.length === 0 || (this.selectedLabel && !this.labels.find((e) => e.id === this.selectedLabel.id))) {\n        this.selectedLabel = null;\n      }\n    },\n    selectedLabel() {\n      this.updateFilters();\n    },\n    restore: {\n      handler(r) {\n        if (this.restore) {\n          this.selectedLabel = this.restore;\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.restore) {\n      this.selectedLabel = this.restore;\n    }\n  },\n  methods: {\n    updateFilters() {\n      this.$emit('update:modelValue', this.selectedLabel);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.filter-settings {\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  border-radius: inherit;\n  gap: 6px;\n  width: fit-content;\n  overflow: auto;\n  min-width: 140px;\n  text-wrap: nowrap;\n\n  &__row {\n    display: flex;\n    align-items: center;\n  }\n\n  & input[type=checkbox] {\n    margin-right: 12px;\n  }\n\n  & input[type=radio] {\n    margin-right: 12px;\n  }\n\n}\n</style>\n","import { render } from \"./LabelSelector.vue?vue&type=template&id=3789520e&scoped=true\"\nimport script from \"./LabelSelector.vue?vue&type=script&lang=js\"\nexport * from \"./LabelSelector.vue?vue&type=script&lang=js\"\n\nimport \"./LabelSelector.vue?vue&type=style&index=0&id=3789520e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3789520e\"]])\n\nexport default __exports__","import { render } from \"./LabelLocationMap.vue?vue&type=template&id=0b415ffe&scoped=true\"\nimport script from \"./LabelLocationMap.vue?vue&type=script&lang=js\"\nexport * from \"./LabelLocationMap.vue?vue&type=script&lang=js\"\n\nimport \"./LabelLocationMap.vue?vue&type=style&index=0&id=0b415ffe&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0b415ffe\"]])\n\nexport default __exports__","<template>\n  <div ref=\"bboxGraph\" class=\"bbox-graph\">\n    <div class=\"header\">\n      <span class=\"title\">{{ name }}</span>\n      <div class=\"selector\">\n        <LabelSelector\n          :key=\"'visualizer'\"\n          v-model=\"labelVisualizer\"\n          :name=\"'visualizer'\"\n          :labels=\"labels\"\n          :restore=\"restore\"\n        />\n      </div>\n    </div>\n    <div\n      ref=\"canvasContainer\"\n      class=\"image-canvas\"\n    >\n      <canvas\n        ref=\"canvas\"\n        class=\"image-canvas__canvas\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\nimport { useResizeObserver } from '@vueuse/core';\nimport LabelSelector from '@/components/DatasetComponent/DatasetStats/LabelSelector.vue';\n\nexport default {\n  name: 'BoundingBoxDisplay',\n  components: {\n    LabelSelector,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    annotationList: {\n      type: Array,\n      default: () => [],\n    },\n    labelList: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['new-visualizer-label'],\n  data() {\n    return {\n      // may update store\n      colorMap: {},\n      labelVisualizer: null,\n      restore: null,\n    };\n  },\n  computed: {\n    labels() {\n      const l = [...this.labelList];\n      l.unshift({\n        index: -1,\n        name: \"All Labels\",\n      });\n      return l;\n    },\n  },\n  watch: {\n    annotationList: {\n      handler(l) {\n        this.updateCanvas();\n      },\n    },\n    labelVisualizer: {\n      handler(l) {\n        this.$emit('new-visualizer-label', l);\n      },\n    },\n  },\n  mounted() {\n    useResizeObserver(this.$refs.bboxGraph, this.debounceResize);\n    this.updateCanvas();\n    const restoreDS = this.$store.state.statistics.datasetID;\n    if (restoreDS && restoreDS === this.dataset.id) {\n      const restoreLabel = this.$store.state.statistics.labelVisualizer;\n      if (restoreLabel) {\n        this.restore = restoreLabel;\n      } else {\n        if (this.labelList.length > 0) {\n          this.restore = this.labels[0];\n        }\n      }\n    } else {\n      if (this.labelList.length > 0) {\n        this.restore = this.labels[0];\n      }\n    }\n  },\n  methods: {\n    debounceResize() {\n      return setTimeout(this.updateCanvas, 15);\n    },\n    updateCanvas() {\n      const container = this.$refs.canvasContainer;\n      const canvas = this.$refs.canvas;\n\n      canvas.width = container.clientWidth - 40;\n      canvas.height = container.clientHeight;\n\n      const ctx = canvas.getContext(\"2d\", { alpha: false });\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n      ctx.fillStyle = \"white\";\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\n      if (this.annotationList && this.annotationList.length > 0) {\n        const boxLineWidth = 1;\n        ctx.lineWidth = boxLineWidth;\n\n        ctx.globalAlpha = 1;\n        const canvasRect = canvas.getBoundingClientRect();\n\n        let x;\n        let y;\n        let width;\n        let height;\n        this.annotationList.forEach((anno) => {\n          x = (anno.x * canvasRect.width);\n          y = (anno.y * canvasRect.height);\n          width = anno.w * canvasRect.width;\n          height = anno.h * canvasRect.height;\n          ctx.beginPath();\n          ctx.strokeStyle = this.getColor(anno.label_index);\n          ctx.rect(x, y, width, height);\n          ctx.stroke();\n        });\n      }\n    },\n    getColor(index) {\n      if (!(index in this.colorMap)) {\n        if (index < 12) {\n          this.colorMap[index] = this.getColorByIndex(index);\n        } else {\n          this.colorMap[index] = this.getColorByIndexFromScale(index);\n        }\n      }\n      return this.colorMap[index];\n    },\n    getColorByIndexFromScale(index) {\n      const hue = index * 137.508 + 60; // use golden angle approximation\n      return `hsl(${hue},100%,50%)`;\n    },\n    getColorByIndex(index) {\n      const colors = ['#ffff00', '#00ff00', '#ffa500', '#ff0000', '#48d1cc', '#a0522d', '#ffc0cb', '#ff1493', '#f0e68c', '#1e90ff', '#0000ff', '#00fa9a'];\n      return colors[index % 12];\n    },\n  },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.bbox-graph {\n  border-radius: 8px;\n  width: 100%;\n  height: 100%;\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  padding-top: 10px;\n  padding-bottom: 10px;\n  display: flex;\n  flex-direction: column;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('datasets-stats-text-color');\n  }\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n\n  .title {\n    font-size: 1.3rem;\n    font-weight: 700;\n    min-width: 200px;\n  }\n\n  .selector {\n    margin-left: auto;\n    display: flex;\n    align-items: center;\n  }\n}\n\n.image-canvas {\n  user-select: none;\n  -moz-user-select: none;\n  -khtml-user-select: none;\n  -webkit-user-select: none;\n  -o-user-select: none;\n\n  position: relative;\n  width: 100%;\n  flex-grow: 1;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  &__canvas {\n    position: absolute;\n    left: 20px;\n    top: 0;\n    // height: 100%;\n    // width: calc(100% - 40px);\n  }\n}\n</style>\n","import { render } from \"./BoundingBoxDisplay.vue?vue&type=template&id=1cd6ec60&scoped=true\"\nimport script from \"./BoundingBoxDisplay.vue?vue&type=script&lang=js\"\nexport * from \"./BoundingBoxDisplay.vue?vue&type=script&lang=js\"\n\nimport \"./BoundingBoxDisplay.vue?vue&type=style&index=0&id=1cd6ec60&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1cd6ec60\"]])\n\nexport default __exports__","<template>\n  <div class=\"stats-graph\">\n    <div class=\"header\">\n      <div class=\"text-flex\">\n        <span class=\"title\">{{ name }}</span>\n        <span class=\"subtitle\">Select a column to zoom in</span>\n      </div>\n      <div class=\"icon-container\">\n        <IconButton\n          class=\"refresh-icon\"\n          :icon=\"'refresh'\"\n          :width=\"20\"\n          :height=\"20\"\n          :type=\"''\"\n          @click.stop=\"chooseRange(-1)\"\n        />\n      </div>\n    </div>\n    <div class=\"body\">\n      <apexchart\n        ref=\"bboxHistogram\"\n        height=\"100%\"\n        type=\"bar\"\n        :options=\"chartOptions\"\n        :series=\"series\"\n        @dataPointSelection=\"dataPointSelection\"\n      />\n    </div>\n  </div>\n</template>\n\n<script>\n\nimport VueApexCharts from \"vue3-apexcharts\";\nimport IconButton from '@/components/IconButton.vue';\n\nexport default {\n  name: 'BoundingBoxSizeHistogram',\n  components: {\n    'apexchart': VueApexCharts,\n    IconButton,\n  },\n  props: {\n    name: {\n      type: String,\n      default: '',\n    },\n    dataArray: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['custom-range'],\n  data() {\n    return {\n      chartOptions: {\n        chart: {\n          toolbar: {\n            show: false,\n          },\n          zoom: {\n            enabled: false,\n          },\n        },\n        legend: {\n          show: false,\n        },\n        colors: ['#48378a'],\n        xaxis: {\n          type: \"categories\",\n          tickAmount: 'dataPoints',\n          labels: {\n            formatter(value) {\n              if (typeof value === 'string') {\n                const temp = value.split(\" - \");\n                const exp0 = parseFloat(temp[0], 3);\n                const exp1 = parseFloat(temp[1], 3);\n                return `${exp0} - ${exp1}`;\n              }\n              return value;\n            },\n          },\n          title: {\n            text: 'Size (%)',\n            offsetX: 0,\n            offsetY: 110,\n            style: {\n              color: undefined,\n              fontSize: '14px',\n              fontWeight: 700,\n            },\n          },\n          tickPlacement: 'between',\n        },\n        dataLabels: {\n          enabled: false,\n        },\n        states: {\n          active: {\n            allowMultipleDataPointsSelection: false,\n          },\n        },\n      },\n      series: [],\n      zoomLimit: 1,\n    };\n  },\n  watch: {\n    dataArray: {\n      handler() {\n        if (this.dataArray && this.dataArray.length > 0) {\n          this.updateHistogram();\n        }\n      },\n    },\n  },\n  created() {\n    if (this.dataArray && this.dataArray.length > 0) {\n      this.updateHistogram();\n    }\n  },\n  methods: {\n    dataPointSelection(event, chartContext, config) {\n      if (config.selectedDataPoints[0].length > 0 && this.labels.length > 0 && this.zoomLimit <= 3) {\n        this.zoomLimit += 1;\n        this.chooseRange(config.selectedDataPoints[0][0]);\n      }\n    },\n    chooseRange(index) {\n      if (index >= 0) {\n        this.$emit('custom-range', this.parseRangeString(this.labels[index]));\n      } else {\n        this.zoomLimit = 1;\n        this.$emit('custom-range', this.parseRangeString('0.0 - 1.0'));\n      }\n    },\n    parseRangeString(str) {\n      const temp = str.split(\" - \");\n      return [parseFloat(temp[0]), parseFloat(temp[1])];\n    },\n    updateHistogram() {\n      const series = [];\n      // This requires the first key-value pair of entry to be the label, the second to be the value at that label\n      this.dataArray.forEach((datum) => {\n        const singleSeries = {\n          name: this.dataArray.annotation_set_name,\n          data: datum.entries.map((e) => e.count),\n        };\n        series.push(singleSeries);\n      });\n      this.labels = this.dataArray[0].entries.map((e) => e.range);\n      this.updateChart(series);\n    },\n    // update value of each column\n    updateChart(series) {\n      this.series = series;\n      this.chartOptions.xaxis.categories = this.labels;\n      this.chartOptions = {\n        ...this.chartOptions,\n      };\n    },\n  },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.stats-graph {\n  display: flex;\n  flex-direction: column;\n  border-radius: 8px;\n  width: 100%;\n  height: calc(100% - 20px);\n  box-shadow: 0 0 10px rgba(0,0,0,0.1), 0 0 5px rgba(0,0,0,0.25);\n  padding-top: 10px;\n  padding-bottom: 10px;\n  @include themify() {\n    background: themed('card-color');\n    color: themed('datasets-stats-text-color');\n  }\n}\n\n.body {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  width: 100%;\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  margin-left: 15px;\n  margin-right: 15px;\n\n  .title {\n    font-size: 1.3rem;\n    font-weight: 700;\n    min-width: 200px;\n  }\n\n  .subtitle {\n    font-size: 0.9rem;\n    font-weight: 600;\n    min-width: 200px;\n    align-items: center;\n    margin-left: 15px;\n  }\n\n  .icon-container {\n    display: flex;\n    flex-direction: column;\n    margin: 0 5px 0 5px;\n  }\n}\n\n.text-flex {\n  display: flex;\n  flex-direction: column;\n}\n\n.refresh-icon:hover {\n  @include themify() {\n    color: themed('icon-color-primary');\n  }\n}\n</style>\n","import { render } from \"./BoundingBoxSizeHistogram.vue?vue&type=template&id=323f9b34&scoped=true\"\nimport script from \"./BoundingBoxSizeHistogram.vue?vue&type=script&lang=js\"\nexport * from \"./BoundingBoxSizeHistogram.vue?vue&type=script&lang=js\"\n\nimport \"./BoundingBoxSizeHistogram.vue?vue&type=style&index=0&id=323f9b34&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-323f9b34\"]])\n\nexport default __exports__","import { render } from \"./DatasetStats.vue?vue&type=template&id=1e857904&scoped=true\"\nimport script from \"./DatasetStats.vue?vue&type=script&lang=js\"\nexport * from \"./DatasetStats.vue?vue&type=script&lang=js\"\n\nimport \"./DatasetStats.vue?vue&type=style&index=0&id=1e857904&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1e857904\"]])\n\nexport default __exports__","<template>\n  <div class=\"controls-bar\">\n    <DatasetFilter\n      v-model=\"datasetFilters\"\n      :dataset=\"currentDataset\"\n      :annotationSets=\"annotationSets\"\n      :labels=\"currentLabels\"\n      :showCopyFilteredImagesBtn=\"false\"\n      :types=\"currentTypes\"\n    />\n  </div>\n  <div id=\"map\" />\n</template>\n\n<script>\nimport DatasetFilter from '@/components/DatasetComponent/DatasetFilters/DatasetFilter.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { Map, View, Feature } from 'ol';\nimport { Tile as TileLayer, Vector as VectorLayer } from 'ol/layer';\nimport { Cluster, OSM, Vector as VectorSource } from 'ol/source';\nimport { Point } from 'ol/geom';\nimport { fromLonLat } from 'ol/proj';\nimport { boundingExtent } from 'ol/extent';\nimport { Select } from 'ol/interaction';\nimport {\n  Circle as CircleStyle,\n  Fill,\n  Stroke,\n  Style,\n  Text,\n} from 'ol/style';\nimport 'ol/ol.css';\n\nexport default {\n  name: 'Map',\n  components: {\n    DatasetFilter,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: true,\n    },\n  },\n\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      map: null,\n      markersLayer: null,\n      markersSource: null,\n      clusterSource: null,\n      imageList: [],\n      imagesLimit: 10000,\n      datasetFilters: {},\n      controller: new AbortController(),\n    };\n  },\n  computed: {\n    currentDataset() {\n      return this.$store.state.datasets.currentDataset;\n    },\n    getImagesParams() {\n      if (!this.currentDataset) {\n        return null;\n      }\n\n      const params = {\n        images_filter: { dataset_id: this.currentDataset.id },\n        image_files_filter: {},\n        annotations_filter: {},\n      };\n\n      if (this.imagesLimit) {\n        params.limit = this.imagesLimit;\n      }\n\n      // Images filter\n      if (this.datasetFilters.groupsFilter && this.datasetFilters.groupsFilter.length > 0) {\n        params.images_filter.group_ids = this.datasetFilters.groupsFilter;\n      }\n\n      // Annotations filter\n      if (this.datasetFilters.confidenceRangeFilter) {\n        params.annotations_filter.lower_score = this.datasetFilters.confidenceRangeFilter[0];\n        params.annotations_filter.upper_score = this.datasetFilters.confidenceRangeFilter[1];\n      }\n      if (this.datasetFilters.annotationTypeFilter && this.datasetFilters.annotationTypeFilter.length > 0) {\n        params.annotations_filter.types = this.datasetFilters.annotationTypeFilter;\n      }\n      if (this.datasetFilters.annotationSetFilter && this.datasetFilters.annotationSetFilter.length > 0) {\n        params.annotations_filter.annotation_set_ids = this.datasetFilters.annotationSetFilter.map((set) => set.id);\n      }\n      if (this.datasetFilters.imagesWithAnnotationSetFilter && this.datasetFilters.imagesWithAnnotationSetFilter.length > 0) {\n        params.annotations_filter.images_with_annotation_set_ids = this.datasetFilters.imagesWithAnnotationSetFilter.map((set) => set.id);\n      }\n      if (this.datasetFilters.annotationLabelFilter && this.datasetFilters.annotationLabelFilter.length > 0) {\n        params.annotations_filter.images_with_annotation_label_indexes = this.datasetFilters.annotationLabelFilter;\n      }\n      if (this.datasetFilters.boundingBoxSizeFilter) {\n        Object.entries(this.datasetFilters.boundingBoxSizeFilter).forEach(([key, value]) => {\n          if (key !== 'type' && value) {\n            params.annotations_filter[`${key}_${this.datasetFilters.boundingBoxSizeFilter.type}`] = value;\n          }\n        });\n      }\n\n      // Image files filter\n      if (this.datasetFilters.imageNameFilter && this.datasetFilters.imageNameFilter.length > 0) {\n        params.image_files_filter.image_name = this.datasetFilters.imageNameFilter;\n      }\n      if (this.datasetFilters.timeRangeFilter) {\n        params.image_files_filter.lower_time = this.datasetFilters.timeRangeFilter[0];\n        params.image_files_filter.upper_time = this.datasetFilters.timeRangeFilter[1];\n      }\n      if (this.datasetFilters.dateRangeFilter) {\n        if (this.datasetFilters.dateRangeFilter[0]) {\n          params.image_files_filter.lower_date = new Date(this.datasetFilters.dateRangeFilter[0]).toISOString();\n        }\n        if (this.datasetFilters.dateRangeFilter[1]) {\n          params.image_files_filter.upper_date = new Date(this.datasetFilters.dateRangeFilter[1]).toISOString();\n        }\n      }\n      if (this.datasetFilters.cameraSourceFilter && this.datasetFilters.cameraSourceFilter.length > 0) {\n        params.image_files_filter.image_sources = this.datasetFilters.cameraSourceFilter;\n      }\n\n      if (Object.keys(params.annotations_filter).length === 0) {\n        delete params.annotations_filter;\n      }\n\n      return params;\n    },\n    currentLabels() {\n      if (this.currentDataset) {\n        return this.currentDataset.labels;\n      }\n      return [];\n    },\n    currentTypes() {\n      if (this.currentDataset) {\n        return this.currentDataset.annotation_types;\n      }\n      return [];\n    },\n    annotationSets() {\n      if (this.currentDataset) {\n        return this.currentDataset.annotation_sets;\n      }\n      return [];\n    },\n  },\n  watch: {\n    show() {\n      this.$nextTick(() => {\n        this.map.updateSize();\n      });\n    },\n    imageList: {\n      handler(imageList) {\n        this.addMarker(imageList);\n      },\n    },\n    getImagesParams: {\n      deep: true,\n      async handler(params) {\n        this.imageListPromise = new Promise((resolve, reject) => {\n          this.getImages(params).then((imageList) => {\n            this.imageList = imageList;\n            resolve(imageList);\n          });\n        });\n      },\n    },\n  },\n  async created() {\n    if (this.getImagesParams) {\n      this.imageList = await this.getImages(this.getImagesParams);\n    }\n  },\n  mounted() {\n    this.map = new Map({\n      target: 'map',\n      layers: [\n        new TileLayer({\n          source: new OSM(),\n        }),\n      ],\n      view: new View({\n        center: [0, 0],\n        zoom: 2,\n      }),\n    });\n\n    if (this.markersSource) {\n      this.markersSource.clear();\n    }\n  },\n  methods: {\n    async getImages(params) {\n      this.controller.abort();\n      this.controller = new AbortController();\n      const currentController = this.controller;\n\n      const resp = await this.dataConnect.getFilteredImages(params, currentController.signal)\n        .catch((error) => {\n          if (currentController.signal.aborted) {\n            return this.imageList;\n          }\n          console.log(error);\n          alert(error);\n          return this.imageList;\n        });\n      if (!resp || resp.error || !resp.result) {\n        if (resp && resp.error) {\n          console.error(resp.error);\n          alert(resp.error.message);\n        }\n        return this.imageList;\n      }\n\n      return resp.result;\n    },\n    addMarker(images) {\n      if (this.markersSource) {\n        this.markersSource.clear();\n      }\n      const features = [];\n      images.forEach((img) => {\n        features.push(\n          new Feature({\n            geometry: new Point(fromLonLat([img.longitude, img.latitude])),\n          }),\n        );\n      });\n      this.markersSource = new VectorSource({ features });\n\n      const clusterDistance = 5;\n      const minDistanceBetweenClusters = 50;\n      this.clusterSource = new Cluster({\n        distance: clusterDistance,\n        minDistance: minDistanceBetweenClusters,\n        source: this.markersSource,\n      });\n\n      const styleCache = {};\n      this.markersLayer = new VectorLayer({\n        source: this.clusterSource,\n        style(feature) {\n          const size = feature.get('features').length;\n          let style = styleCache[size];\n          if (!style) {\n            style = new Style({\n              image: new CircleStyle({\n                radius: 7,\n                fill: new Fill({\n                  color: '#ff4343',\n                }),\n              }),\n              // text: new Text({\n              //   text: size.toString(),\n              //   fill: new Fill({\n              //     color: '#000',\n              //   }),\n              // }),\n            });\n            styleCache[size] = style;\n          }\n          return style;\n        },\n      });\n\n      this.map.addLayer(this.markersLayer);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n  #map {\n    height: 100%;\n    padding: 20px;\n  }\n</style>\n","import { render } from \"./Map.vue?vue&type=template&id=3b8fb394&scoped=true\"\nimport script from \"./Map.vue?vue&type=script&lang=js\"\nexport * from \"./Map.vue?vue&type=script&lang=js\"\n\nimport \"./Map.vue?vue&type=style&index=0&id=3b8fb394&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3b8fb394\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template #page-slot>\n        <BreadcrumbSelect\n          id=\"project-select\"\n          v-model=\"currentProject\"\n          :options=\"projectList\"\n          :placeholder=\"'Project'\"\n          :displayTag=\"'name'\"\n        />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <main class=\"main-display-area\">\n        <router-view />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Header from '@/components/Header.vue';\nimport BreadcrumbSelect from '@/components/BreadcrumbSelect.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  name: 'Validator',\n  components: {\n    Header,\n    BreadcrumbSelect,\n    BreadcrumbNavigation,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n    };\n  },\n  computed: {\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject: {\n      get() {\n        return this.$store.state.projects.currentProject;\n      },\n      set(value) {\n        this.$store.commit('projects/setCurrentProject', value);\n      },\n    },\n    currentDataset: {\n      get() {\n        return this.$store.state.datasets.currentDataset;\n      },\n      set(d) {\n        this.$store.commit('datasets/setCurrentDataset', d);\n      },\n    },\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n  },\n  watch: {\n    currentProject() {\n      this.refreshDatasetList();\n    },\n  },\n  mounted() {\n    this.refreshDatasetList();\n  },\n  methods: {\n    async refreshDatasetList() {\n      const datasets = await this.getDatasets();\n      this.$store.commit('datasets/setDatasetList', datasets);\n      await this.getDatasetDetails();\n    },\n    async getDatasetDetails() {\n      const currentProject = this.$store.state.projects.currentProject;\n      if (currentProject) {\n        const params = {\n          project_id: currentProject.id,\n          get_num_images: true,\n          get_labels: true,\n          get_num_labels: true,\n          get_annotation_sets: true,\n          get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        if (!resp.error) {\n          const temp = resp.result;\n\n          const shallowDatasets = JSON.parse(JSON.stringify(this.datasets));\n\n          shallowDatasets.forEach((e, i) => {\n            temp[i].annotation_sets?.forEach((set, j) => {\n              temp[i].annotation_sets[j].num_images = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_images : 0;\n              temp[i].annotation_sets[j].num_annotations = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_annotations : 0;\n            });\n            shallowDatasets[i].annotation_sets = temp[i].annotation_sets;\n            shallowDatasets[i].numImages = temp[i].numImages ? temp[i].numImages : 0;\n            shallowDatasets[i].labels = temp[i].labels ? temp[i].labels : [];\n            shallowDatasets[i].numLabels = temp[i].numLabels ? temp[i].numLabels : 0;\n            shallowDatasets[i].groups = temp[i].groups ? temp[i].groups : [];\n          });\n          this.$store.commit('datasets/setDatasetList', shallowDatasets);\n        }\n      }\n    },\n    async getDatasets() {\n      const currentProject = this.$store.state.projects.currentProject;\n      if (currentProject) {\n        const params = {\n          project_id: currentProject.id,\n          // get_num_images: true,\n          // get_labels: true,\n          // get_num_labels: true,\n          // get_annotation_sets: true,\n          // get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        let list = [];\n        if (resp.error) {\n          return list;\n        } else {\n          let temp = resp.result;\n\n          temp = temp.map((e) => {\n            e.annotation_sets = [];\n            e.numImages = null;\n            e.labels = null;\n            e.numLabels = null;\n            e.groups = null;\n            return e;\n          });\n\n          list = temp;\n        }\n        return list;\n      }\n      return [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.main {\n  height: 100vh;\n}\n</style>\n","import { render } from \"./Validator.vue?vue&type=template&id=08244d51&scoped=true\"\nimport script from \"./Validator.vue?vue&type=script&lang=js\"\nexport * from \"./Validator.vue?vue&type=script&lang=js\"\n\nimport \"./Validator.vue?vue&type=style&index=0&id=08244d51&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-08244d51\"]])\n\nexport default __exports__","<template>\n  <div class=\"controls-bar\">\n    <div class=\"validator-header\">\n      <button v-if=\"permissions && (permissions.trainer_read || permissions.trainer_write)\" class=\"button button-secondary button-sm\" @click=\"handleCompareSessionsClicked\">\n        Compare Validate Sessions\n      </button>\n    </div>\n    <button v-if=\"permissions && permissions.trainer_write\" class=\"button button-sm\" @click=\"openStartValidatorModal\">Create</button>\n  </div>\n  <div v-if=\"permissions && (permissions.trainer_read || permissions.trainer_read) && notEmpty\" class=\"validator-card-container scrollbar\">\n    <ValidatorCard\n      v-for=\"(s, i) in validateSessions\"\n      :key=\"i\"\n      :session=\"s\"\n      :permissions=\"permissions\"\n      @select-session=\"toggleSession(s)\"\n      @create-validate-session=\"openStartValidatorModal(d)\"\n      @show-charts=\"handleSessionChartsClick(s)\"\n      @delete-session=\"openConfirmDeleteValidation(s)\"\n      @refresh-session=\"handleRefreshSession(s)\"\n      @info-clicked=\"handleSessionInfoClicked(s)\"\n    />\n  </div>\n  <div v-else-if=\"loading\" class=\"empty-state\">\n    <InlineLoader\n      :width=\"'60px'\"\n      :height=\"'60px'\"\n      :border=\"'12px'\"\n    />\n  </div>\n  <div\n    v-else\n    class=\"empty-state\"\n  >\n    <svg width=\"60%\" height=\"60%\">\n      <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n    </svg>\n    <div class=\"empty-state__message\">\n      <h3>No validation sessions found</h3>\n    </div>\n  </div>\n  <StartValidatorModal\n    ref=\"startValidatorModal\"\n    :datasets=\"datasets\"\n    :experiments=\"trainers\"\n    :snapshots=\"snapshots\"\n    @validate-session-started=\"handleValidateSessionCreated\"\n  />\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n  <ValidateSessionDetailsModal\n    ref=\"validateSessionDetailsModal\"\n    :session=\"selectedValidateSession\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport StartValidatorModal from '@/components/ValidationPage/StartValidatorModal.vue';\nimport ValidatorCard from '@/components/ValidationPage/ValidatorCardV2.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\nimport ValidateSessionDetailsModal from '@/components/ValidationPage/ValidateSessionDetailsModal.vue';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nexport default {\n  name: \"ValidatorManagement\",\n  components: {\n    ConfirmModal,\n    StartValidatorModal,\n    ValidatorCard,\n    InlineLoader,\n    ValidateSessionDetailsModal,\n  },\n  props: {\n  },\n  emits: [\n    'update-list',\n  ],\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      selectedValidateSession: null,\n      validateSessions: null,\n      interval: null,\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      toDelete: null,\n      confirmFunction: null,\n      buttonText: 'Delete',\n      permissions: null,\n      loading: false,\n      trainers: [],\n      snapshots: [],\n      selectedSessions: [],\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n    notEmpty() {\n      return this.validateSessions && this.validateSessions.length > 0;\n    },\n  },\n  watch: {\n    trainers: {\n      deep: false,\n      async handler(trainers) {\n        await Promise.all(trainers.map(async (trainer) => {\n          trainer.training_sessions = await this.getTrainingSessionList(trainer.id);\n        }));\n      },\n    },\n    async currentProject(p) {\n      if (p) {\n        this.validateSessions = await this.getValidateSessionList();\n        this.trainers = await this.getTrainerList();\n      }\n    },\n  },\n  beforeUnmount() {\n    this.stopInterval();\n  },\n  async mounted() {\n    this.validateSessions = await this.getValidateSessionList();\n    this.trainers = await this.getTrainerList();\n    this.snapshots = await this.getSnapshots();\n    this.startInterval();\n    this.getProjectAccessForSingleUser();\n  },\n  methods: {\n    toggleSession(session) {\n      const index = this.selectedSessions.findIndex((id) => id === session.id);\n      if (index > -1) {\n        this.selectedSessions.splice(index, 1);\n      } else {\n        this.selectedSessions.push(session.id);\n      }\n    },\n    handleSessionChartsClick(s) {\n      this.$router.push({ path: '/validator/metrics', query: { session_id: encodeURI(JSON.stringify([s.id])) } });\n    },\n    async getTrainerList() {\n      const resp = await this.dataConnect.getTrainerList2({ project_id: this.currentProject.id })\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to retrieve trainers: ${error}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n      if (!resp || resp.error || !resp.result) {\n        this.loadingFinished = true;\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Failed to retrieve trainers: ${resp.error}`,\n          type: \"error\",\n          position: \"top\",\n        });\n        return [];\n      }\n      return resp.result;\n    },\n    async getTrainingSessionList(trainer_id) {\n      const resp = await this.dataConnect.getTrainingSessionList({ trainer_id, reverse: true })\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to retrieve training sessions: ${error}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n      if (!resp || resp.error || !resp.result) {\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Failed to retrieve training sessions: ${resp.error}`,\n          type: \"error\",\n          position: \"top\",\n        });\n        return [];\n      }\n\n      return resp.result;\n    },\n    async handleRefreshSession(session) {\n      const index = this.validateSessions.findIndex((e) => e.id === session.id);\n      if (index > -1) {\n        this.validateSessions[index] = await this.getSession(session.id);\n      }\n    },\n    async getProjectAccessForSingleUser() {\n      await this.dataConnect.getProjectAccessForSingleUser({\n        project_id: this.currentProject.id,\n        username: this.$store.state.user.user.username,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          } else if (!data || data.error) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Failed to retrieve project access: ${data.error.message}`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n        })\n        .catch((e) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to retrieve project access: ${e}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n    },\n    async handleValidateSessionCreated() {\n      this.validateSessions = await this.getValidateSessionList();\n    },\n    stopInterval() {\n      clearInterval(this.interval);\n      this.interval = null;\n    },\n    startInterval() {\n      this.interval = setInterval(async () => {\n        this.validateSessions = await this.getValidateSessionList();\n      }, 30000);\n    },\n    toDataset() {\n      this.$router.push({ path: '/datasets' });\n    },\n    async getValidateSessionList() {\n      this.loading = true;\n      const resp = await this.dataConnect.getValidateSessionList({ project_id: this.currentProject.id, reverse: true })\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to retrieve validate sessions: ${error}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n      if (!resp || resp.error || !resp.result) {\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Failed to retrieve validate sessions: ${resp.error}`,\n          type: \"error\",\n          position: \"top\",\n        });\n        return [];\n      }\n      this.loading = false;\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async getSession(id) {\n      const resp = await this.dataConnect.getValidateSession({\n        validate_session_id: id,\n      })\n        .catch((e) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to retrieve validate session: ${e}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n      if (!resp || resp.error || !resp.result) {\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Failed to retrieve validate session: ${resp.error}`,\n          type: \"error\",\n          position: \"top\",\n        });\n        return null;\n      }\n      return resp.result;\n    },\n    openStartValidatorModal(d) {\n      this.$refs.startValidatorModal.showModal();\n    },\n\n    openConfirmDeleteValidation(session) {\n      this.confirmMessage = `Are you sure you want to move this validate session to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Session';\n      this.toDelete = session;\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.handleDeleteValidateSessions([session.id]);\n      };\n    },\n    async handleDeleteValidateSessions(ids) {\n      await this.dataConnect.deleteValidateSessions({\n        session_ids: ids,\n      })\n        .then(async (data) => {\n          if (!data || data.error) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Failed to delete validate session: ${data.error.message}`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n          this.validateSessions = await this.getValidateSessionList();\n        })\n\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to delete validate session: ${error}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n\n      this.toDelete = null;\n    },\n    handleCompareSessionsClicked() {\n      this.$router.push({ path: '/validator/metrics', query: { session_id: encodeURI(JSON.stringify(this.selectedSessions)) } });\n    },\n    async getSnapshots() {\n      await this.dataConnect.listSnapshots()\n        .then((data) => {\n          if (data.result && !data.error) {\n            this.snapshots = data.result.sort((a, b) => b.id - a.id);\n          } else if (!data || data.error) {\n            $toast.open({\n              queue: true,\n              duration: 5000,\n              message: `Failed to get snapshots: ${data.error.message}`,\n              type: \"error\",\n              position: \"top\",\n            });\n          }\n        })\n        .catch((error) => {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Failed to get snapshots: ${error}`,\n            type: \"error\",\n            position: \"top\",\n          });\n        });\n    },\n    handleSessionInfoClicked(session) {\n      this.selectedValidateSession = session;\n      this.$refs.validateSessionDetailsModal.showModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n\n.validator-header {\n  display: flex;\n  flex-direction: row;\n  gap: 16px;\n}\n\n.validator-card-container {\n  display: flex;\n  flex-wrap: wrap;\n  width: 100%;\n  gap: 16px;\n  padding: 16px;\n  overflow: auto;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.hyperlink {\n  color: var(--color-primary);\n  text-decoration: underline;\n  cursor: pointer;\n}\n</style>\n","<template>\n  <Modal\n    ref=\"createValidatorModal\"\n    :title=\"'Validation Sessions'\"\n    :width=\"'100%'\"\n    :height=\"'100%'\"\n    @closed=\"resetData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings scrollbar\">\n        <div class=\"container\">\n          <div class=\"static-card\">\n            <h2 class=\"mt-2\">Validator Data</h2>\n            <div class=\"row mt-3\">\n              <v-checkbox\n                v-model=\"is_local\"\n                color=\"#250e81\"\n                :hide-details=\"true\"\n                :density=\"'compact'\"\n                class=\"checkbox\"\n              >\n                <template #label>\n                  <span class=\"checkbox-label\">User Managed Validator</span>\n                </template>\n              </v-checkbox>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-12 settings__control-group\">\n                <label class=\"required\">Name</label>\n                <input\n                  v-model=\"name\"\n                  class=\"select\"\n                  type=\"text\"\n                >\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-md-auto\">\n                <input\n                  id=\"model-mode-radio\"\n                  v-model=\"mode\"\n                  type=\"radio\"\n                  name=\"model-mode\"\n                  value=\"model\"\n                  class=\"split-radio\"\n                >\n              </div>\n              <div class=\"col settings__control-group pr-2\">\n                <label class=\"clickable\" @click=\"() => mode='model'\">From Model</label>\n                <template v-if=\"mode ==='model'\">\n                  <div class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Experiment</label>\n                      <select v-model=\"model_experiment\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Experiment</option>\n                        <option v-for=\"(e, i) in experiments\" :key=\"i\" :value=\"e\">\n                          {{ e.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"model_experiment\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Training Session</label>\n                      <select v-model=\"model_training_session\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Training Session</option>\n                        <option v-for=\"(s, i) in model_experiment.training_sessions\" :key=\"i\" :value=\"s\">\n                          {{ `(${parseId(s.id, \"trainer\")}) ${s.name}` }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"model_training_session && fileList\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Model File</label>\n                      <select v-model=\"model_file\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Model File</option>\n                        <option v-for=\"(a, i) in fileList\" :key=\"i\" :value=\"a.name\">\n                          {{ a.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div class=\"row mt-3 full-width\">\n                    <div class=\"col-md-auto\">\n                      <input\n                        id=\"model-dataset-radio\"\n                        v-model=\"model_data\"\n                        type=\"radio\"\n                        name=\"dataset\"\n                        value=\"dataset\"\n                        class=\"split-radio\"\n                      >\n                    </div>\n                    <div class=\"col settings__control-group\">\n                      <label class=\"clickable\" @click=\"() => model_data='dataset'\">Data from Dataset</label>\n                      <template v-if=\"model_data ==='dataset'\">\n                        <div class=\"row mt-3 full-width\">\n                          <div class=\"settings__control-group dataset-selector\">\n                            <label class=\"required\">Dataset</label>\n                            <select v-model=\"model_dataset\" class=\"select\" required>\n                              <option disabled :value=\"null\">Select Dataset</option>\n                              <option v-for=\"(d, i) in datasets\" :key=\"i\" :value=\"d\">\n                                {{ d.name }}\n                              </option>\n                            </select>\n                          </div>\n                        </div>\n                        <div v-if=\"model_dataset && model_dataset.annotation_sets && model_dataset.annotation_sets.length > 0\" class=\"row mt-3 full-width\">\n                          <div class=\"settings__control-group dataset-selector\">\n                            <label class=\"required\">Annotation Set</label>\n                            <select v-model=\"model_annotation_set\" class=\"select\" required>\n                              <option disabled :value=\"null\">Select Annotation Set</option>\n                              <option v-for=\"(a, i) in model_dataset.annotation_sets\" :key=\"i\" :value=\"a\">\n                                {{ a.name }}\n                              </option>\n                            </select>\n                          </div>\n                        </div>\n                      </template>\n                    </div>\n                  </div>\n                  <!-- <div class=\"row mt-3 full-width\">\n                    <div class=\"col-md-auto\">\n                      <input\n                        id=\"model-snapshot-radio\"\n                        v-model=\"model_data\"\n                        type=\"radio\"\n                        name=\"snapshot\"\n                        value=\"snapshot\"\n                        class=\"split-radio\"\n                      >\n                    </div>\n                    <div class=\"col settings__control-group\">\n                      <label class=\"clickable\" @click=\"() => model_data='snapshot'\">Data from Snapshot</label>\n                      <template v-if=\"model_data ==='snapshot'\">\n                        <div class=\"row mt-3 full-width\">\n                          <div class=\"settings__control-group dataset-selector\">\n                            <label class=\"required\">Snapshot</label>\n                            <select v-model=\"model_snapshot\" class=\"select\" required>\n                              <option disabled :value=\"null\">Select Snapshot</option>\n                              <option v-for=\"(s, i) in snapshots\" :key=\"i\" :value=\"s\">\n                                {{ s.description }}\n                              </option>\n                            </select>\n                          </div>\n                        </div>\n                      </template>\n                    </div>\n                  </div> -->\n                </template>\n              </div>\n            </div>\n            <div class=\"row mt-3\">\n              <div class=\"col-md-auto\">\n                <input\n                  id=\"legacy-mode-radio\"\n                  v-model=\"mode\"\n                  type=\"radio\"\n                  name=\"legacy-mode\"\n                  value=\"legacy\"\n                  class=\"split-radio\"\n                >\n              </div>\n              <div class=\"col settings__control-group pr-2\">\n                <label class=\"clickable\" @click=\"() => mode='legacy'\">Legacy</label>\n                <template v-if=\"mode ==='legacy'\">\n                  <div class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Ground Truth Dataset</label>\n                      <select v-model=\"legacy_gt_dataset\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Dataset</option>\n                        <option v-for=\"(d, i) in datasets\" :key=\"i\" :value=\"d\">\n                          {{ d.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"legacy_gt_dataset && legacy_gt_dataset.annotation_sets && legacy_gt_dataset.annotation_sets.length > 0\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Ground Truth Annotation Set</label>\n                      <select v-model=\"legacy_gt_annotation_set\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Annotation Set</option>\n                        <option v-for=\"(s, i) in legacy_gt_dataset.annotation_sets\" :key=\"i\" :value=\"s\">\n                          {{ s.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Target Dataset</label>\n                      <select v-model=\"legacy_target_dataset\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Dataset</option>\n                        <option v-for=\"(d, i) in datasets\" :key=\"i\" :value=\"d\">\n                          {{ d.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                  <div v-if=\"legacy_target_dataset && legacy_target_dataset.annotation_sets && legacy_target_dataset.annotation_sets.length > 0\" class=\"row mt-3 full-width\">\n                    <div class=\"settings__control-group dataset-selector\">\n                      <label class=\"required\">Target Annotation Set</label>\n                      <select v-model=\"legacy_target_annotation_set\" class=\"select\" required>\n                        <option disabled :value=\"null\">Select Annotation Set</option>\n                        <option v-for=\"(s, i) in legacy_target_dataset.annotation_sets\" :key=\"i\" :value=\"s\">\n                          {{ s.name }}\n                        </option>\n                      </select>\n                    </div>\n                  </div>\n                </template>\n              </div>\n            </div>\n          </div>\n          <div v-if=\"schema\" class=\"dynamic-card\">\n            <h2>Model Settings</h2>\n            <ConfigureFieldsGroup\n              :key=\"componentKey\"\n              v-model:params=\"configGroupValues\"\n              :fields=\"schema\"\n            />\n          </div>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3 ml-3 mr-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          :class=\"{'button-spinner': startingValidator}\"\n          :disabled=\"startingValidator\"\n          @click=\"startSession\"\n        >\n          Start Session\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport { inputSanitizer, changeSanitizer } from '@/assets/js/utils';\nimport {\n  computed,\n} from 'vue';\nimport { useStore } from 'vuex';\nimport ConfigureFieldsGroup from '@/components/TrainerComponent/TrainerExperimentAndSessions/ConfigureFieldsGroup.vue';\n\nexport default {\n  name: 'StartValidatorModal',\n  components: {\n    Modal,\n    ConfigureFieldsGroup,\n  },\n  props: {\n    experiments: {\n      type: Array,\n      default: () => [],\n    },\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n    snapshots: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['validate-session-started'],\n  setup() {\n    const store = useStore();\n    const currentProject = computed(() => store.state.projects.currentProject);\n\n    return {\n      currentProject,\n    };\n  },\n  data() {\n    return {\n      name: \"\",\n      mode: \"model\",\n      message: '',\n      selectedModel: null,\n      startingValidator: false,\n      schema: null,\n      componentKey: 0,\n      is_local: false,\n      model_experiment: null,\n      model_training_session: null,\n      model_file: null,\n      model_data: 'dataset',\n      model_dataset: null,\n      model_annotation_set: null,\n      model_snapshot: null,\n      legacy_gt_dataset: null,\n      legacy_gt_annotation_set: null,\n      legacy_target_dataset: null,\n      legacy_target_annotation_set: null,\n      legacy_confidence: 0.25,\n      legacy_iou: 0.5,\n      legacy_metric: 'iou',\n      legacy_ignore_boxes: 0,\n      params: {},\n      fileList: null,\n      configGroupValues: {},\n      schemaType: null,\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    datasetList() {\n      return this.$store.state.datasets.datasetList;\n    },\n  },\n  watch: {\n    configGroupValues: {\n      deep: true,\n      handler(value) {\n        // console.log(value);\n      },\n    },\n    model_experiment() {\n      this.model_training_session = null;\n    },\n    async model_training_session() {\n      this.model_file = null;\n      this.fileList = [];\n      this.schema = null;\n      this.configGroupValues = {};\n      if (this.model_training_session) {\n        this.schemaType = this.model_training_session.model;\n        this.getValidatorSchema(this.schemaType);\n        this.fileList = await this.listTrainingSessionArtifacts(this.model_training_session.id);\n      }\n    },\n    model_dataset() {\n      this.model_annotation_set = null;\n    },\n    legacy_gt_dataset() {\n      this.legacy_gt_annotation_set = null;\n    },\n    legacy_target_dataset() {\n      this.legacy_target_annotation_set = null;\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n    if (this.datasetList && this.datasetList.length > 0) {\n      this.dataset = this.datasetList[0];\n    }\n  },\n  methods: {\n    inputSanitizer,\n    changeSanitizer,\n    parseId(id, type) {\n      if (id && type) {\n        let prefix = '';\n        switch (type) {\n        case 'dataset':\n          prefix = 'ds';\n          break;\n        case 'annotation set':\n          prefix = 'as';\n          break;\n        case 'annotation':\n          prefix = 'a';\n          break;\n        case 'image':\n          prefix = 'i';\n          break;\n        case 'trainer':\n          prefix = 't';\n          break;\n        case 'validator':\n          prefix = 'v';\n          break;\n        case 'project':\n          prefix = 'p';\n          break;\n        default:\n          prefix = '';\n        }\n        let result = '';\n        if (prefix !== '') {\n          result = `${prefix}-${Number(id).toString(16)}`;\n        } else {\n          result = Number(id).toString(16);\n        }\n\n        return result;\n      }\n      return '';\n    },\n    async listTrainingSessionArtifacts(id) {\n      const resp = await this.dataConnect.getTrainingSessionArtifacts({ training_session_id: id })\n        .catch((error) => {\n          console.log('Failed to retrieve training sessions artifacts:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    showModal() {\n      this.$refs.createValidatorModal.showModal();\n      this.resetData();\n    },\n    resetData() {\n      this.name = \"\";\n      this.is_local = false;\n      this.name = \"\";\n      this.description = \"\";\n      this.message = \"\";\n      this.is_local = false;\n      this.model_experiment = null;\n      this.model_training_session = null;\n      this.model_file = null;\n      this.model_data = 'dataset';\n      this.model_dataset = null;\n      this.model_annotation_set = null;\n      this.model_snapshot = null;\n      this.legacy_gt_dataset = null;\n      this.legacy_gt_annotation_set = null;\n      this.legacy_target_dataset = null;\n      this.legacy_target_annotation_set = null;\n      this.legacy_confidence = 0.25;\n      this.legacy_iou = 0.5;\n      this.legacy_metric = 'iou';\n      this.legacy_ignore_boxes = 0;\n      this.params = {};\n      this.fileList = null;\n      this.schemaType = null;\n    },\n    async getValidatorSchema(schemaType) {\n      if (!schemaType || schemaType === \"\") {\n        return;\n      }\n      const params = {\n        type: schemaType,\n      };\n      await this.dataConnect.getValidatorSchema(params)\n        .then((data) => {\n          if (data.result) {\n            this.schema = data.result;\n          } else if (data.error) {\n            this.message = data.error.message;\n          }\n          this.componentKey += 1;\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n    async startSession() {\n      let val_params = {};\n      if (!this.name) {\n        this.message = `Missing Name`;\n        return;\n      }\n      if (this.mode === 'model') {\n        if (!this.model_experiment) {\n          this.message = `Missing Experiment`;\n          return;\n        }\n        if (!this.model_training_session) {\n          this.message = `Missing Training Session`;\n          return;\n        }\n        if (!this.model_file) {\n          this.message = `Missing Model File`;\n          return;\n        }\n        val_params = {\n          name: this.name,\n          params: {\n            params: this.configGroupValues,\n          },\n          val_type: this.schemaType,\n          project_id: this.currentProject.id,\n          training_session_id: this.model_training_session.id,\n          model_file: this.model_file,\n          is_local: this.is_local,\n        };\n        if (this.model_data === 'dataset') {\n          if (!this.model_dataset) {\n            this.message = `Missing Dataset`;\n            return;\n          }\n          if (!this.model_annotation_set) {\n            this.message = `Missing Annotation Set`;\n            return;\n          }\n          val_params.dataset_id = this.model_dataset.id;\n          val_params.annotation_set_id = this.model_annotation_set.id;\n        } else if (this.model_data === 'snapshot') {\n          if (!this.model_snapshot) {\n            this.message = `Missing Snapshot`;\n            return;\n          }\n          val_params.snapshot_id = this.model_snapshot;\n        }\n      } else if (this.mode === 'legacy') {\n        if (!this.legacy_gt_dataset) {\n          this.message = `Missing Ground Truth Dataset`;\n          return;\n        }\n        if (!this.legacy_gt_annotation_set) {\n          this.message = `Missing Ground Truth Annotation Set`;\n          return;\n        }\n        if (!this.legacy_target_dataset) {\n          this.message = `Missing Target Dataset`;\n          return;\n        }\n        if (!this.legacy_target_annotation_set) {\n          this.message = `Missing Target Annotation Set`;\n          return;\n        }\n        val_params = {\n          name: this.name,\n          params: {\n            iou: this.legacy_iou,\n            confidence: this.legacy_confidence,\n            metric: this.legacy_metric,\n            ignoreBoxes: this.legacy_ignore_boxes,\n          },\n          val_type: this.schemaType,\n          project_id: this.currentProject.id,\n          gt_id: this.legacy_gt_annotation_set.id,\n          target_id: this.legacy_target_annotation_set.id,\n          is_local: this.is_local,\n        };\n      }\n      this.startingValidator = true;\n      val_params.type = \"validation\";\n      await this.dataConnect.startCloudInstance(val_params)\n        .then((data) => {\n          if (data.result) {\n            this.resetData();\n            this.$refs.createValidatorModal.closeModal();\n            this.$emit('validate-session-started');\n          } else if (data.error) {\n            this.message = data.error.message;\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n      this.startingValidator = false;\n    },\n    getSessionName(session) {\n      if (session.name) {\n        return session.name;\n      } else if (session.docker_task) {\n        return session.docker_task.date;\n      }\n      return 'Unknown Session';\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n$cardMargin: 20px;\n$cardPadding: 16px;\n\n.col {\n  padding: 0\n}\n\n.settings {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  overflow-y: scroll;\n  display: flex;\n  flex-direction: column;\n  margin-left: auto;\n  margin-right: auto;\n  span {\n    width: 100%;\n    font-size: 1rem;\n    font-weight: 700;\n    text-align: left;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.container {\n  display: flex;\n  flex-direction: row;\n}\n\nh2 {\n    color: #250E81;\n  }\n\n.static-card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  padding: $cardPadding;\n  text-align: left;\n  border-radius: 6px;\n  height: fit-content;\n  flex: 1 1 auto;\n  border: 1px solid #250E81;\n  margin: $cardMargin;\n  width: 600px;\n}\n\n.dynamic-card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  padding: $cardPadding;\n  text-align: left;\n  border-radius: 6px;\n  height: fit-content;\n  flex: 1 1 auto;\n  border: 1px solid #250E81;\n  margin: $cardMargin;\n  width: 600px;\n}\n\n@media (max-width: $breakpoint-lg) {\n  .settings {\n    width: 100%;\n  }\n\n  .container {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n  }\n\n  .static-card {\n    width: calc(100% - (2 * #{$cardMargin}));\n  }\n\n  .dynamic-card {\n    width: calc(100% - (2 * #{$cardMargin}));\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n  margin-left: 20px;\n  margin-right: 20px;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error') !important;\n  }\n}\n\n.dataset-selector{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  margin: auto;\n  padding-right: 0 !important;\n\n  :first-child {\n    flex: 1 1 40%;\n  }\n\n  :not(:first-child) {\n    flex: 1 1 60%;\n  }\n}\n\n.full-width {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n}\n\n.custom-split-card {\n  border-radius: 6px;\n  padding: 10px;\n\n  p {\n    font-size: 0.9rem;\n    font-weight: 700;\n  }\n}\n\n.custom-split-card + .custom-split-card {\n  margin-left: 15px;\n}\n\n.split-radio[type=\"radio\"] {\n  height: 18px;\n  width: 18px;\n  @include themify() {\n    accent-color: themed('color-primary');\n  }\n}\n\n:deep() {\n  .v-label{\n    opacity: 1 !important;\n  }\n}\n\n.checkbox {\n  padding-left: 7px !important\n}\n\n.checkbox-label {\n  margin-left: 5px;\n  font-size: 14px !important;\n  font-weight: 600!important;\n  letter-spacing: 0 !important;\n  @include themify() {\n    color: themed('form-label-color') !important;\n  }\n}\n\n</style>\n","import { render } from \"./StartValidatorModal.vue?vue&type=template&id=378e75a7&scoped=true\"\nimport script from \"./StartValidatorModal.vue?vue&type=script&lang=js\"\nexport * from \"./StartValidatorModal.vue?vue&type=script&lang=js\"\n\nimport \"./StartValidatorModal.vue?vue&type=style&index=0&id=378e75a7&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-378e75a7\"]])\n\nexport default __exports__","<template>\n  <div\n    class=\"validate-session card\"\n  >\n    <div v-show=\"!hideProgress\" class=\"progress\">\n      <div class=\"validate-session__header\">\n        <div class=\"left\">\n          <v-checkbox\n            v-tooltip=\"'Select session for comparison'\"\n            class=\"select-checkbox\"\n            :hide-details=\"true\"\n            density=\"compact\"\n            @click.stop=\"toggleSelectSession\"\n          />\n\n          <span class=\"section-title\">Progress</span>\n        </div>\n      </div>\n      <div class=\"body _separator\">\n        <TaskStatusBars :task=\"session.docker_task\" @hide-bars=\"($event) => toggleHide($event)\" />\n      </div>\n    </div>\n    <div class=\"statistics\">\n      <div class=\"validate-session__header\">\n        <div class=\"left\">\n          <v-checkbox\n            v-if=\"hideProgress\"\n            v-tooltip=\"'Select session for comparison'\"\n            class=\"select-checkbox\"\n            :hide-details=\"true\"\n            density=\"compact\"\n            @click.stop=\"toggleSelectSession\"\n          />\n          <span class=\"section-title\">Information</span>\n        </div>\n        <div class=\"right\">\n          <div class=\"icon-container\">\n            <IconButton\n              v-tooltip=\"`Refresh validate session`\"\n              class=\"icon\"\n              :icon=\"'refresh'\"\n              :width=\"20\"\n              :height=\"20\"\n              :type=\"'click'\"\n              @click.stop=\"handleRefresh()\"\n            />\n            <IconButton\n              v-tooltip=\"`View detailed information for validate session`\"\n              class=\"icon\"\n              :icon=\"'maximize'\"\n              :width=\"20\"\n              :height=\"20\"\n              :type=\"'click'\"\n              @click.stop=\"handleSessionInfoClick(session)\"\n            />\n            <IconButton\n              v-tooltip=\"`View charts for validate session`\"\n              class=\"icon\"\n              :icon=\"'analytics'\"\n              :width=\"22\"\n              :height=\"22\"\n              :type=\"'click'\"\n              @click.stop=\"handleShowChartsClick()\"\n            />\n            <IconButton\n              v-if=\"permissions && permissions.trainer_write\"\n              v-tooltip=\"`Terminate validate session. This will stop the session, but you can still view validation artifacts`\"\n              class=\"icon\"\n              :icon=\"'stop_circle'\"\n              :width=\"22\"\n              :height=\"22\"\n              :type=\"'click'\"\n              @click.stop=\"terminateTask(session)\"\n            />\n            <IconButton\n              v-if=\"permissions && permissions.trainer_write\"\n              v-tooltip=\"`Move validate session to recycle bin`\"\n              class=\"icon delete\"\n              :icon=\"'trash'\"\n              :width=\"22\"\n              :height=\"22\"\n              :type=\"'click'\"\n              @click.stop=\"deleteTask()\"\n            />\n          </div>\n        </div>\n      </div>\n      <div class=\"body scrollbar\">\n        <div class=\"body__header\">\n          <div class=\"owner-id-display\">\n            <UserIcon\n              :user=\"userList.find((e) => e.username === session.docker_task.username)\"\n              :size=\"'32px'\"\n            />\n            <EncodedIdField\n              :id=\"session.id\"\n              :type=\"'validator'\"\n              :hideLabel=\"false\"\n            />\n            <div val-status class=\"status-col\">\n              <span v-if=\"sessionStatus?.toLowerCase().includes('complete')\" class=\"status-tag _complete\"><div class=\"status-icon\">&#x2713;</div>Complete</span>\n              <span v-else-if=\"sessionStatus?.toLowerCase().includes('error')\" class=\"status-tag _error\"><div class=\"status-icon\">&#x2716;</div>Error</span>\n              <span v-else-if=\"sessionStatus?.toLowerCase().includes('terminate')\" class=\"status-tag _warning\"><div class=\"status-icon\">&#x21;</div>Terminated</span>\n              <span v-else-if=\"sessionStatus\" class=\"status-tag _running\"><div class=\"running-icon\" />\n                {{ String(sessionStatus).charAt(0).toUpperCase() + String(sessionStatus).slice(1) }}\n              </span>\n            </div>\n          </div>\n          <div class=\"name-display\">\n            <div\n              v-tooltip=\"session.docker_task && session.docker_task.name ? session.docker_task.name : 'Unknown'\"\n              class=\"description\"\n            >\n              {{ session.docker_task && session.docker_task.name ? session.docker_task.name : \"Unknown\" }}\n            </div>\n          </div>\n        </div>\n        <div class=\"body__grid scrollbar\">\n          <div class=\"statistics-field\">\n            <div class=\"description\">Start Date</div>\n            <div class=\"value\"><span v-if=\"session.docker_task\">{{ formatTime(session.docker_task.date) }}</span></div>\n          </div>\n          <div class=\"statistics-field\">\n            <div class=\"description\">Duration</div>\n            <div class=\"value\"><span v-if=\"session.docker_task && getEndTime(session.docker_task)\" class=\"duration\">{{ getEndTime(session.docker_task) }}</span></div>\n          </div>\n          <div v-if=\"session.params.validate_params\" class=\"statistics-field\">\n            <div class=\"description\">model</div>\n            <div class=\"value\">{{ session.params.validate_params.model }}</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport EncodedIdField from '@/components/EncodedIdField.vue';\nimport TaskStatusBars from '@/components/TaskStatusBars.vue';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: \"ValidatorCard\",\n  components: {\n    IconButton,\n    EncodedIdField,\n    TaskStatusBars,\n    UserIcon,\n  },\n  props: {\n    session: {\n      type: Object,\n      default: () => {},\n    },\n    permissions: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['info-clicked', 'delete-session', 'refresh-session', 'show-charts', 'select-session', 'terminate-session'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      show_menu: false,\n      hideProgress: false,\n      sessionStatus: \"\",\n    };\n  },\n  computed: {\n    userList() {\n      return this.$store.state.user.userList;\n    },\n  },\n  watch: {\n    session: {\n      deep: true,\n      handler() {\n        if (this.session) {\n          this.getStatus(this.session);\n        }\n      },\n    },\n  },\n  mounted() {\n    if (this.session) {\n      this.getStatus(this.session);\n    }\n  },\n  methods: {\n    toggleSelectSession() {\n      this.$emit('select-session');\n    },\n    toggleHide(v) {\n      this.hideProgress = v;\n    },\n    handleSessionInfoClick() {\n      this.$emit('info-clicked');\n    },\n    getStatus(session) {\n      this.sessionStatus = session.docker_task.status;\n    },\n    getEndTime(docker_task) {\n      if (docker_task.end_date !== \"0001-01-01T00:00:00Z\" && docker_task.date !== \"0001-01-01T00:00:00Z\") {\n        const msDiff = new Date(docker_task.end_date) - new Date(docker_task.date);\n        const minutes = Math.floor(msDiff / (1000 * 60)) % 60;\n        const hours = Math.floor(msDiff / (1000 * 60 * 60)) % 24;\n        const days = Math.floor(msDiff / (1000 * 60 * 60 * 24));\n        const result = [];\n        if (days > 0) result.push(`${days} day${days > 1 ? 's' : ''}`);\n        if (hours > 0) result.push(`${hours} hr${hours > 1 ? 's' : ''}`);\n        if (minutes > 0) result.push(`${minutes} min${minutes > 1 ? 's' : ''}`);\n        return result.join(\" \") || \"0 mins\";\n      } else if (docker_task.end_date === \"0001-01-01T00:00:00Z\" && docker_task.date !== \"0001-01-01T00:00:00Z\") {\n        const msDiff = Date.now() - new Date(docker_task.date);\n        const minutes = Math.floor(msDiff / (1000 * 60)) % 60;\n        const hours = Math.floor(msDiff / (1000 * 60 * 60)) % 24;\n        const days = Math.floor(msDiff / (1000 * 60 * 60 * 24));\n        const result = [];\n        if (days > 0) result.push(`${days} day${days > 1 ? 's' : ''}`);\n        if (hours > 0) result.push(`${hours} hr${hours > 1 ? 's' : ''}`);\n        if (minutes > 0) result.push(`${minutes} min${minutes > 1 ? 's' : ''}`);\n        return result.join(\" \") || \"0 mins\";\n      } else {\n        return null;\n      }\n    },\n    formatTime(str) {\n      return `${new Date(str).toLocaleTimeString('default', {\n        year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n      })}`;\n    },\n    deleteTask() {\n      this.$emit('delete-session', this.session);\n    },\n    handleRefresh() {\n      this.$emit('refresh-session', this.session);\n    },\n    handleShowChartsClick() {\n      this.$emit('show-charts', this.session);\n    },\n    terminateTask(session) {\n      this.$emit('terminate-session', session);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.card {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  height: fit-content;\n  padding: 16px;\n  margin: 0;\n  text-align: left;\n  border-radius: 8px;\n  box-shadow: 1px 1px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.card:not([disabled=\"true\"]):hover {\n  @include themify() {\n    outline: 2px solid themed('card-border-color-hover');\n  }\n}\n\n.validate-session {\n  display: flex;\n  flex-direction: row;\n  border-radius: 8px;\n  height: 250px;\n  padding: 0;\n\n  &__header {\n    display: flex;\n    flex-direction: row;\n    padding: 4px 16px;\n    background: var(--gray-200);\n    height: 32px;\n  }\n\n  .progress {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    //width: 40%;\n    width: 350px;\n  }\n  .statistics {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    width: 350px;\n  }\n\n  .left {\n      width: 50%;\n      min-width: 50%;\n      display: flex;\n      flex-direction: row;\n      justify-content: flex-start\n    }\n\n  .right {\n    width: 50%;\n    min-width: 50%;\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-end\n  }\n}\n\n.item-selector{\n  width: fit-content;\n  height: fit-content;\n}\n\n.header {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  max-width: 100%;\n}\n\n.body {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  flex: 1 1 auto;\n  min-height: 0;\n  padding: 16px;\n  overflow: auto;\n\n  &__header{\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    gap: 10px;\n\n    .owner-id-display {\n      display: flex;\n      flex-direction: row;\n      gap: 10px;\n      align-items: center;\n    }\n\n    .name-display {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start\n    }\n\n    .description {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--body-text-color);\n      display: -webkit-box;\n      -webkit-line-clamp: 1;\n      line-clamp: 1;\n      -webkit-box-orient: vertical;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n  }\n\n  &__grid-field {\n    display: block;\n    max-width: 300px;\n  }\n\n  &__grid-field + &__grid-field {\n    margin-top: 10px;\n  }\n\n  &__grid {\n    display: block;\n\n    .statistics-field {\n      display: flex;\n      flex-direction: row;\n      gap: 10px;\n      margin-top: 5px;\n    }\n\n    .description {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--body-text-color);\n      width: 100px;\n    }\n    .value {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--body-text-color-secondary);\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n  }\n\n  &._separator::after {\n    content: \"\";\n    position: absolute;\n    right: 0;\n    top: 5%;\n    bottom: 5%;\n    width: 1px;\n    background-color: #9a9ca2;\n  }\n}\n\n.icon-container {\n  display: flex;\n  align-items: center;\n  margin-left: 10px;\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n  .icon + .icon {\n    margin-left: 14px;\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  height: -moz-fit-content;\n  height: fit-content;\n}\n\n.icon {\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.icon:hover {\n  @include themify() {\n    color: themed('color-primary');\n    background: themed('icon-hover-color');\n    border-radius: 100%;\n    box-shadow: 0 0 0 4px themed('icon-hover-color');\n  }\n}\n\n.icon.delete:hover {\n  color: var(--color-error)\n}\n\n.status-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100px;\n  min-width: 100px;\n  border-radius: 18px;\n  padding: 4px 6px;\n  line-height: 1;\n  font-size: 0.625rem;\n  font-weight: 700;\n  white-space: nowrap;\n  border: 2px solid;\n  box-shadow: 0px 0px 1px rgb(0 0 0 / 25%), 0px 1px 4px rgb(0 0 0 / 25%);\n  @include themify() {\n    color: themed('color-black');\n  }\n\n  &._complete {\n    @include themify() {\n      color: themed('color-status-complete');\n      background: themed('color-status-complete-background');\n    }\n  }\n  &._running {\n    @include themify() {\n      color: themed('color-status-running');\n      background: themed('color-status-running-background');\n    }\n  }\n  &._error {\n    @include themify() {\n      color: themed('color-status-error');\n      background: themed('color-status-error-background');\n    }\n  }\n\n  &._warning {\n    @include themify() {\n      color: themed('color-status-warning');\n      background: themed('color-status-warning-background');\n    }\n  }\n\n  .running-icon {\n    color: inherit;\n    width: 4px;\n    height: 4px;\n    border: solid 4px;\n    border-radius: 4px;\n    margin-right: 4px;\n  }\n\n  .status-icon {\n    color: inherit;\n    margin-right: 4px;\n  }\n}\n\n.session-id-field {\n  margin-right: 20px;\n}\n\n:deep() {\n  .v-expansion-panel__shadow {\n    box-shadow: none !important;\n  }\n}\n\n.section-title {\n  display: flex;\n  align-items: center;\n  text-align: left;\n  font-size: 1rem;\n  font-weight: 600;\n  color: var(--body-text-color);\n  letter-spacing: 0.025em;\n  gap: 6px;\n}\n\n.validate-sessions-empty {\n  display: flex;\n  flex-direction: column;\n  height: 150px;\n  align-items: center;\n  justify-content: center;\n  font-size: 1.1rem;\n  font-weight: bold;\n  border: solid 1px black;\n  border-radius: 8px;\n  @include themify() {\n    background: radial-gradient(circle, rgba($color-primary-300, 0.075) 50%, rgba(var(--color-primary-rgb), 0.125) 100%);\n  }\n\n  span {\n    padding: 16px;\n    text-align: center;\n  }\n}\n\n.select-checkbox{\n  position: relative !important;\n  top: -7px;\n  left: -5px;\n}\n\n</style>\n","import { render } from \"./ValidatorCardV2.vue?vue&type=template&id=5cb4216a&scoped=true\"\nimport script from \"./ValidatorCardV2.vue?vue&type=script&lang=js\"\nexport * from \"./ValidatorCardV2.vue?vue&type=script&lang=js\"\n\nimport \"./ValidatorCardV2.vue?vue&type=style&index=0&id=5cb4216a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5cb4216a\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"validateSessionDetailsModal\"\n    :title=\"'Session Details'\"\n    :width=\"'100%'\"\n    :height=\"'100%'\"\n    @closed=\"clearData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"sessions\">\n        <div class=\"tab-selector\">\n          <input\n            id=\"option-model-params\"\n            v-model=\"tab\"\n            type=\"radio\"\n            name=\"tab-selector\"\n            :value=\"'model-params'\"\n          >\n          <label for=\"option-model-params\">Model Parameters</label>\n          <!-- <input\n              id=\"option-params\"\n              v-model=\"tab\"\n              type=\"radio\"\n              name=\"tab-selector\"\n              :value=\"'params'\"\n            >\n            <label for=\"option-params\">Parameters</label> -->\n          <input\n            id=\"option-metrics\"\n            v-model=\"tab\"\n            type=\"radio\"\n            name=\"tab-selector\"\n            :value=\"'metrics'\"\n          >\n          <label for=\"option-metrics\">Metrics</label>\n          <input\n            id=\"option-logs\"\n            v-model=\"tab\"\n            type=\"radio\"\n            name=\"tab-selector\"\n            :value=\"'logs'\"\n          >\n          <label for=\"option-logs\">System Logs</label>\n        </div>\n        <div v-if=\"tab==='model-params'\" class=\"params mt-2\">\n          <Tooltip :placement=\"'top-start'\" :trigger=\"'click'\">\n            <template #body>\n              <pre>Model Parameters copied</pre>\n            </template>\n            <IconButton\n              class=\"copy-params-icon\"\n              :icon=\"'copy'\"\n              :width=\"24\"\n              :height=\"24\"\n              :title=\"`Copy Parameters`\"\n              :type=\"'click'\"\n              @click.stop=\"copyToClipboard(model_parameters)\"\n            />\n          </Tooltip>\n          <ShikiHighlight\n            class=\"model-params scrollbar shiki-model-params\"\n            :code=\"model_parameters\"\n            lang=\"yaml\"\n            theme=\"vitesse-dark\"\n          />\n        </div>\n        <div v-else-if=\"tab==='metrics'\" class=\"metrics mt-2\">\n          <Tooltip :placement=\"'top-start'\" :trigger=\"'click'\">\n            <template #body>\n              <pre>Model Parameters copied</pre>\n            </template>\n            <IconButton\n              class=\"copy-params-icon\"\n              :icon=\"'copy'\"\n              :width=\"24\"\n              :height=\"24\"\n              :title=\"`Copy Parameters`\"\n              :type=\"'click'\"\n              @click.stop=\"copyToClipboard(metrics)\"\n            />\n          </Tooltip>\n          <ShikiHighlight\n            class=\"model-params scrollbar shiki-model-params\"\n            :code=\"metrics\"\n            lang=\"yaml\"\n            theme=\"vitesse-dark\"\n          />\n        </div>\n        <div v-else-if=\"tab==='logs'\" class=\"system-logs mt-2\">\n          <div id=\"validate-session-system-logs\" class=\"text-area-box scrollbar\">\n            <span><pre>{{ logs }}</pre></span>\n          </div>\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport * as YAML from 'yaml';\nimport IconButton from '@/components/IconButton.vue';\nimport Tooltip from \"@/components/Tooltip.vue\";\nimport ShikiHighlight from \"@/components/ShikiHighlight.vue\";\nimport { codeToHtml } from 'shiki';\n\nexport default {\n  name: 'ValidateSessionDetailsModal',\n  components: {\n    Modal,\n    IconButton,\n    Tooltip,\n    ShikiHighlight,\n  },\n  props: {\n    session: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['stop-validate', 'delete-session'],\n  data() {\n    return {\n      tab: 'model-params',\n      internalSession: null,\n      logs: null,\n      show_menu: false,\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    model_parameters() {\n      const YAMLfile = YAML.stringify(this.internalSession?.params.model_params, { indent: 8 });\n      return YAMLfile;\n    },\n    metrics() {\n      const YAMLfile = YAML.stringify(this.internalSession?.results, { indent: 8 });\n      return YAMLfile;\n    },\n  },\n  watch: {\n    session: {\n      deep: true,\n      immediate: true,\n      handler(newval, old) {\n        if (newval) {\n          this.internalSession = newval;\n          this.getLogs();\n        }\n      },\n    },\n  },\n  beforeUnmount() {\n    this.clearData();\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    copyToClipboard(text) {\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        navigator.clipboard.writeText(text);\n      }\n    },\n    async showModal() {\n      this.$refs.validateSessionDetailsModal.showModal();\n    },\n    closeModal() {\n      this.clearData();\n      this.$refs.validateSessionDetailsModal.closeModal();\n    },\n    clearData() {\n      // this.selectedSessionAvailableFiles = null;\n      // this.internalSession = null;\n      this.tab = 'model-params';\n    },\n    async getLogs() {\n      if (this.internalSession && this.internalSession.id) {\n        const resp = await this.dataConnect.getValidateSessionLogs({\n          validate_session_id: this.internalSession.id,\n        });\n        let temp = \"\";\n        if (!resp || resp.error || !resp.result) {\n          temp += `Validator may take some time to create logs file.`;\n        } else {\n          temp += resp.result;\n        }\n\n        this.logs = temp;\n      } else {\n        this.logs = null;\n      }\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.sessions {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  height: 100%;\n  width: 100%;\n  padding: 16px;\n\n  ul {\n    list-style-type: none;\n  }\n  .session-header {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n\n    .icon-container {\n    display: flex;\n    align-items: center;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n      .icon + .icon {\n        margin-left: 10px;\n      }\n    }\n  }\n\n  h3 {\n    margin: 0;\n    margin-bottom: 10px;\n    font-size: 1rem;\n    text-align: left;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  &__body-row {\n    display: flex;\n    flex: 1 1 auto;\n    margin-top: 5px;\n    align-items: center;\n  }\n\n  .text-area-box {\n    display: flex;\n    flex-direction: row;\n    border-radius: 4px;\n    background: #121212;\n    border: 1px solid grey;\n    height: 100%;\n    padding: 15px;\n    overflow-y: auto;\n\n    span {\n      color: white;\n      font-weight: 700;\n      font-size: 0.9rem;\n\n      pre {\n        font-family: 'Courier New', monospace !important;\n        text-align: left;\n      }\n    }\n  }\n\n  .text-area-details-white {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, 450px);\n    grid-auto-rows: 50px;\n    grid-gap: 20px 5px;\n    height: 100%;\n    border-radius: 4px;\n    background: var(--color-white-100);\n    border: 1px solid var(--color-primary-100);\n    padding: 15px;\n    overflow-y: auto;\n\n    .list-item {\n      height: fit-content;\n      display: flex;\n      flex-direction: column;\n      text-align: left;\n      padding: 5px;\n\n      label {\n        @include themify() {\n          color: tint-color(themed('body-text-color-secondary'), 20%);\n        }\n        font-weight: 700;\n        font-size: 0.9rem;\n        overflow: hidden;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n      }\n\n      span {\n        @include themify() {\n          color: themed('body-text-color');\n        }\n        font-weight: 600;\n        font-size: 0.9rem;\n        overflow: hidden;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n      }\n    }\n  }\n\n  .system-logs, .metrics, .params {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    overflow-y: auto;\n  }\n\n  .copy-params-icon {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    z-index: 1000;\n    color: var(--color-white-800)\n  }\n}\n\n.model-params {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  border-radius: 4px;\n  background: var(--color-white-100);\n  border: 1px solid var(--color-primary-100);\n  overflow-y: auto;\n}\n\n.top {\n  min-height: fit-content;\n}\n\n.bottom {\n  overflow-y: auto;\n}\n\n._disabled {\n  @include themify() {\n    background: themed('color-disabled-100') !important;\n    color: white;\n    cursor: not-allowed !important;\n    pointer-events: none;\n    border: 1px solid transparent !important;\n  }\n}\n\n.has-file {\n  background: tint-color($color-success, 80%) !important;\n}\n\n.separator {\n  display: flex;\n  align-items: center;\n  text-align: center;\n  font-weight: 700;\n  font-size: 0.75rem;\n  @include themify() {\n    color: themed('form-separator-color');\n    border-color: themed('form-separator-color');\n  }\n  &::before, &::after {\n    content: '';\n    flex: 1;\n    border-bottom: 1px solid;\n  }\n  &:not(:empty)::before {\n    margin-right: 1.5em;\n    margin-left: .25em;\n  }\n  &:not(:empty)::after {\n    margin-right: .25em;\n    margin-left: 1.5em;\n  }\n}\n\n._selected {\n  @include themify() {\n    border: solid 1px themed('color-primary');\n    background: rgba(themed('color-primary'), 0.2);\n  }\n}\n\nhr.vr {\n  display: flex;\n  width: 1px;\n  height: 60%;\n  margin: 0;\n}\n\na {\n  text-decoration:none;\n}\na + button {\n  margin-left: 10px;\n}\n\n.tab-selector {\n  display: flex;\n  flex-direction: row;\n}\n\n.tab-selector input[type=\"radio\"] {\n  display: none;\n}\n\n.tab-selector label {\n  padding: 2px 5px;\n  margin-right: 10px;\n  width: fit-content;\n  font-size: 0.9rem;\n  font-weight: bold;\n  cursor: pointer;\n}\n\n.tab-selector input[type=\"radio\"]:checked+label {\n  @include themify() {\n    color: themed('color-primary-500');\n    border-bottom: 2px solid themed('color-primary-500');\n  }\n}\n\n.shiki-model-params {\n  text-align: left;\n  white-space: pre-wrap;\n}\n\n:deep(.shiki-model-params pre) {\n  padding: 16px;\n  flex: 1 1 auto;\n}\n\n</style>\n","import { render } from \"./ValidateSessionDetailsModal.vue?vue&type=template&id=34c6e816&scoped=true\"\nimport script from \"./ValidateSessionDetailsModal.vue?vue&type=script&lang=js\"\nexport * from \"./ValidateSessionDetailsModal.vue?vue&type=script&lang=js\"\n\nimport \"./ValidateSessionDetailsModal.vue?vue&type=style&index=0&id=34c6e816&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-34c6e816\"]])\n\nexport default __exports__","import { render } from \"./ValidatorManagement.vue?vue&type=template&id=be2cc7a4&scoped=true\"\nimport script from \"./ValidatorManagement.vue?vue&type=script&lang=js\"\nexport * from \"./ValidatorManagement.vue?vue&type=script&lang=js\"\n\nimport \"./ValidatorManagement.vue?vue&type=style&index=0&id=be2cc7a4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-be2cc7a4\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template #page-slot>\n        <BreadcrumbSelect\n          id=\"project-select\"\n          v-model=\"currentProject\"\n          :options=\"projectList\"\n          :placeholder=\"'Project'\"\n          :displayTag=\"'name'\"\n        />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <main class=\"main-display-area\">\n        <AutomatedTasks />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Header from '@/components/Header.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport BreadcrumbSelect from '@/components/BreadcrumbSelect.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\nimport AutomatedTasks from '@/components/AutoAnnotations/AutomatedTasks.vue';\n\nexport default {\n  name: 'Tasks',\n  components: {\n    Header,\n    AutomatedTasks,\n    BreadcrumbSelect,\n    BreadcrumbNavigation,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      datasets: null,\n    };\n  },\n  computed: {\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject: {\n      get() {\n        return this.$store.state.projects.currentProject;\n      },\n      set(value) {\n        this.$store.commit('projects/setCurrentProject', value);\n      },\n    },\n  },\n  watch: {\n    async currentProject() {\n      this.refreshDatasetList();\n    },\n  },\n  beforeMount() {\n    this.refreshDatasetList();\n  },\n  created() {\n    if (this.$route) {\n      this.redirect = this.$route.name;\n    }\n  },\n  methods: {\n    async refreshDatasetList() {\n      this.datasets = await this.getDatasets();\n      this.getDatasetDetails();\n    },\n    async getDatasetDetails() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          get_num_images: true,\n          get_labels: true,\n          get_num_labels: true,\n          get_annotation_sets: true,\n          get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        if (!resp.error) {\n          const temp = resp.result;\n\n          const shallowDatasets = JSON.parse(JSON.stringify(this.datasets));\n\n          shallowDatasets.forEach((e, i) => {\n            temp[i].annotation_sets?.forEach((set, j) => {\n              temp[i].annotation_sets[j].num_images = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_images : 0;\n              temp[i].annotation_sets[j].num_annotations = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_annotations : 0;\n            });\n            shallowDatasets[i].annotation_sets = temp[i].annotation_sets;\n            shallowDatasets[i].numImages = temp[i].numImages ? temp[i].numImages : 0;\n            shallowDatasets[i].labels = temp[i].labels ? temp[i].labels : [];\n            shallowDatasets[i].numLabels = temp[i].numLabels ? temp[i].numLabels : 0;\n            shallowDatasets[i].groups = temp[i].groups ? temp[i].groups : [];\n          });\n          this.$store.commit('datasets/setDatasetList', shallowDatasets);\n        }\n      }\n    },\n    async getDatasets() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          // get_num_images: true,\n          // get_labels: true,\n          // get_num_labels: true,\n          // get_annotation_sets: true,\n          // get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        let list = [];\n        if (resp.error) {\n          return list;\n        } else {\n          let temp = resp.result;\n\n          temp = temp.map((e) => {\n            e.annotation_sets = [];\n            e.numImages = null;\n            e.labels = null;\n            e.numLabels = null;\n            e.groups = null;\n            return e;\n          });\n\n          list = temp;\n        }\n        return list;\n      }\n      return [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.tasks-filter-controls {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-white');\n  }\n}\n</style>\n","<template>\n  <div class=\"controls-bar\">\n    <div />\n    <button v-if=\"permissions && permissions.trainer_write\" class=\"button button-sm\" @click=\"openCreateModal\">Create</button>\n  </div>\n  <div v-if=\"isNotEmpty && permissions && (permissions.trainer_read || permissions.trainer_read)\" class=\"automation-card-container scrollbar\">\n    <AutoAnnotationCard\n      v-for=\"(d, i) in filteredInternalDatasets\"\n      :key=\"i\"\n      :dataset=\"d\"\n      :permissions=\"permissions\"\n      @create-automated-task=\"openCreateModal(d)\"\n      @terminate-task=\"openConfirmTerminateTaskModal\"\n      @delete-task=\"openConfirmDeleteTaskModal\"\n    />\n  </div>\n  <div v-else-if=\"loading\" class=\"empty-state\">\n    <InlineLoader\n      :width=\"'60px'\"\n      :height=\"'60px'\"\n      :border=\"'12px'\"\n    />\n  </div>\n  <div\n    v-else\n    class=\"empty-state\"\n  >\n    <svg width=\"60%\" height=\"60%\">\n      <use href=\"@/assets/img/empty.svg#emptyStateSVG\" />\n    </svg>\n    <div class=\"empty-state__message\">\n      <h3>No automated tasks to display.</h3>\n    </div>\n  </div>\n  <CreateAutoAnnotationTaskModal\n    ref=\"createTaskModal\"\n    :datasets=\"internalDatasets\"\n    :trainerList=\"trainerList\"\n    @task-created=\"getAutoAnnotationList\"\n  />\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport CreateAutoAnnotationTaskModal from '@/components/AutoAnnotations/CreateAutoAnnotationTaskModal.vue';\nimport AutoAnnotationCard from '@/components/AutoAnnotations/AutoAnnotationCard.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\n\nexport default {\n  name: \"AutomatedTasks\",\n  components: {\n    ConfirmModal,\n    CreateAutoAnnotationTaskModal,\n    AutoAnnotationCard,\n    InlineLoader,\n  },\n  props: {\n  },\n  emits: [\n    'update-list',\n  ],\n  data() {\n    return {\n      hideNoExists: false,\n      interval: null,\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      loading: false,\n      internalDatasets: [],\n      taskList: [],\n      trainerList: [],\n      buttonText: '',\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      confirmFunction: null,\n      toDelete: null,\n      permissions: null,\n    };\n  },\n  computed: {\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    isNotEmpty() {\n      return this.filteredInternalDatasets.length > 0 && this.taskList.length > 0;\n    },\n    // convert dataset list to object {\n    //   \"dataset_id\": {\n    //     tasks: []\n    //   }\n    // }\n    filteredInternalDatasets() {\n      const datasetMap = {};\n      this.internalDatasets.forEach((e) => {\n        datasetMap[e.id] = e;\n        datasetMap[e.id]['tasks'] = [];\n      });\n      if (Object.keys(datasetMap).length > 0) {\n        this.taskList.forEach((task) => {\n          const data = JSON.parse(task.docker_task.data);\n          task['parsed_data'] = data;\n          if (data && data !== \"\") {\n            datasetMap[task['dataset_id']]?.tasks.push(task);\n          }\n        });\n      }\n      return Object.values(datasetMap).filter((e) => e['tasks'].length > 0).sort((a, b) => {\n        if (a.id - b.id < 0) {\n          return -1;\n        } else {\n          return 1;\n        }\n      });\n    },\n  },\n  watch: {\n    trainerList: {\n      deep: false,\n      async handler(trainers) {\n        await Promise.all(trainers.map(async (trainer) => {\n          trainer.training_sessions = await this.getTrainingSessionList(trainer.id);\n        }));\n      },\n    },\n    currentProject() {\n      this.getDatasets();\n      this.getTrainerList();\n      this.getAutoAnnotationList();\n      this.startStatusInterval();\n    },\n  },\n  beforeUnmount() {\n    this.stopStatusInterval();\n  },\n  mounted() {\n    if (this.currentProject) {\n      this.getDatasets();\n      this.getTrainerList();\n      this.getAutoAnnotationList();\n      this.startStatusInterval();\n      this.getProjectAccessForSingleUser();\n    }\n  },\n  methods: {\n    async getProjectAccessForSingleUser() {\n      await this.dataConnect.getProjectAccessForSingleUser({\n        project_id: this.currentProject.id,\n        username: this.$store.state.user.user.username,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.permissions = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getDatasets() {\n      this.loading = true;\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          get_annotation_sets: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n            // TODO: handle error\n            console.log(error);\n          });\n        if (resp.error) {\n          this.internalDatasets = [];\n          this.loading = false;\n        } else {\n          this.internalDatasets = resp.result;\n          this.loading = false;\n        }\n      } else {\n        this.internalDatasets = [];\n        this.loading = false;\n      }\n    },\n    openConfirmTerminateTaskModal(t) {\n      this.confirmMessage = `Are you sure you want to terminate task \"${t.name}\"?`;\n      this.confirmMessageHeader = 'Terminate Task';\n      this.toDelete = t;\n      this.buttonText = 'Terminate';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.handleTerminateClicked();\n      };\n    },\n    openConfirmDeleteTaskModal(t) {\n      this.confirmMessage = `Are you sure you want to move task \"${t.name}\" to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Task';\n      this.toDelete = t;\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.handleDeleteClicked();\n      };\n    },\n    async getTrainerList() {\n      this.dataConnect.getTrainerList2({ project_id: this.currentProject.id })\n        .then((data) => {\n          if (data.result) {\n            this.trainerList = data.result;\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getTrainingSessionList(trainer_id) {\n      const resp = await this.dataConnect.getTrainingSessionList({ trainer_id, reverse: true })\n        .catch((error) => {\n          console.log('Failed to retrieve training sessions:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    startStatusInterval() {\n      this.interval = setInterval(\n        () => {\n          this.getAutoAnnotationList();\n        },\n        20000,\n      );\n    },\n    stopStatusInterval() {\n      clearInterval(this.interval);\n    },\n    async getAutoAnnotationList() {\n      this.dataConnect.getAutoAnnList({ project_id: this.currentProject.id })\n        .then((data) => {\n          if (data && data.result) {\n            this.toDelete = null;\n            this.taskList = data.result;\n          } else {\n            this.taskList = [];\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async handleTerminateClicked() {\n      await this.dataConnect.terminateAutoAnn({ task_ids: [this.toDelete.id] })\n        .then(() => {\n          this.getAutoAnnotationList();\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async handleDeleteClicked() {\n      await this.dataConnect.deleteAutoAnn({ task_id: this.toDelete.id })\n        .then(() => {\n          this.getAutoAnnotationList();\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    openCreateModal() {\n      this.$refs.createTaskModal.showModal();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n\n.automation-header {\n  display: flex;\n  flex-direction: row;\n  gap: 16px;\n}\n\n.automation-card-container {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(750px, 1fr));\n  grid-auto-rows: auto;\n  width: 100%;\n  gap: 16px;\n  padding: 16px;\n  overflow: auto;\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n\n.hyperlink {\n  color: var(--color-primary);\n  text-decoration: underline;\n  cursor: pointer;\n}\n</style>\n","<template>\n  <Modal\n    ref=\"createTaskModal\"\n    :title=\"'AI Assisted Tasks'\"\n    :width=\"'600px'\"\n    @closed=\"resetData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"form container\">\n        <div class=\"row\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Task Type</label>\n            <select\n              id=\"type-select\"\n              v-model=\"mode\"\n              class=\"select\"\n              required\n            >\n              <option disabled :value=\"''\">Select a Task Type</option>\n              <option :value=\"'auto-ann'\">Auto Annotation</option>\n              <option :value=\"'auto-seg'\">Auto Segmentation</option>\n              <option :value=\"'sam'\">Annotation to Segment</option>\n            </select>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Task Name</label>\n            <input\n              v-model=\"task\"\n              class=\"select\"\n              type=\"text\"\n            >\n          </div>\n        </div>\n        <template v-if=\"mode === 'auto-ann'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-6 settings__control-group\">\n              <label class=\"required\">Experiment</label>\n              <select v-model=\"selectedExperiment\" class=\"select\" required>\n                <option disabled :value=\"''\">Select an Experiment</option>\n                <option v-for=\"(trainer, i) in trainerList\" :key=\"i\" :value=\"trainer\">\n                  {{ trainer.name }}\n                </option>\n              </select>\n            </div>\n            <div class=\"col-6 settings__control-group\">\n              <label class=\"required\">Training Session</label>\n              <select v-model=\"selectedTrainingSession\" class=\"select\" required>\n                <option disabled :value=\"''\">Training Session</option>\n                <option v-for=\"(session, i) in autoAnnTrainingSessions\" :key=\"i\" :value=\"session\">\n                  {{ session.name }}\n                </option>\n              </select>\n            </div>\n          </div>\n          <div class=\"row mt-3\">\n            <div class=\"col-6 settings__control-group\">\n              <label class=\"required\">Available Model</label>\n              <select v-model=\"selectedModelFiles\" class=\"select\" required>\n                <option disabled :value=\"''\">Select a Model</option>\n                <option v-for=\"(file, i) in selectedSessionAvailableFiles\" :key=\"i\" :value=\"file\">\n                  {{ file.model }}\n                </option>\n              </select>\n            </div>\n          </div>\n        </template>\n        <template v-if=\"mode === 'auto-seg'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-6 settings__control-group\">\n              <label class=\"required\">Experiment</label>\n              <select v-model=\"selectedExperiment\" class=\"select\" required>\n                <option disabled :value=\"''\">Select an Experiment</option>\n                <option v-for=\"(trainer, i) in trainerList\" :key=\"i\" :value=\"trainer\">\n                  {{ trainer.name }}\n                </option>\n              </select>\n            </div>\n            <div class=\"col-6 settings__control-group\">\n              <label class=\"required\">Training Session</label>\n              <select v-model=\"selectedTrainingSession\" class=\"select\" required>\n                <option disabled :value=\"''\">Training Session</option>\n                <option v-for=\"(session, i) in autoSegTrainingSessions\" :key=\"i\" :value=\"session\">\n                  {{ session.name }}\n                </option>\n              </select>\n            </div>\n          </div>\n          <div class=\"row mt-3\">\n            <div class=\"col-6 settings__control-group\">\n              <label class=\"required\">Available Model</label>\n              <select v-model=\"selectedModelFiles\" class=\"select\" required>\n                <option disabled :value=\"''\">Select a Model</option>\n                <option v-for=\"(file, i) in selectedSessionAvailableFiles\" :key=\"i\" :value=\"file\">\n                  {{ file.model }}\n                </option>\n              </select>\n            </div>\n            <div class=\"col-6 settings__control-group\">\n              <label>Save as</label>\n              <div class=\"save-as-grid\">\n                <v-radio-group\n                  v-model=\"save_as\"\n                  :density=\"'compact'\"\n                  :hide-details=\"true\"\n                  :inline=\"true\"\n                >\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"polygons\" color=\"#250E81\" compact>\n                      <template #label>\n                        <div class=\"label-text\">Polygons</div>\n                      </template>\n                    </v-radio>\n                  </div>\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"mask\" color=\"#250E81\" compact>\n                      <template #label>\n                        <div class=\"label-text\">Binary Mask</div>\n                      </template>\n                    </v-radio>\n                  </div>\n                </v-radio-group>\n              </div>\n            </div>\n          </div>\n        </template>\n        <template v-if=\"mode === 'sam'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label class=\"required\">Source Dataset</label>\n              <div class=\"dataset-selector\">\n                <select v-model=\"segmentationSourceDataset\" class=\"select\" required>\n                  <option :key=\"'train-select-null'\" disabled :value=\"''\">Select a Dataset</option>\n                  <option v-for=\"d in datasets\" :key=\"`test-select-${d.id}`\" :value=\"d\">\n                    {{ d.name }}\n                  </option>\n                </select>\n                <AnnotationSetsRadioSelect\n                  v-model=\"segmentationSourceAnnset\"\n                  :annotationSets=\"segmentationSourceDataset.annotation_sets\"\n                />\n              </div>\n            </div>\n          </div>\n        </template>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Destination Dataset</label>\n            <div class=\"dataset-selector\">\n              <select\n                v-model=\"selectedDestinationDataset\"\n                class=\"select\"\n                required\n                :disabled=\"mode === 'segmentation'\"\n              >\n                <option :key=\"'train-select-null'\" disabled :value=\"''\">Select a Dataset</option>\n                <option v-for=\"d in datasets\" :key=\"`test-select-${d.id}`\" :value=\"d\">\n                  {{ d.name }}\n                </option>\n              </select>\n              <AnnotationSetsRadioSelect\n                v-model=\"destinationAnnset\"\n                :annotationSets=\"selectedDestinationDataset.annotation_sets\"\n              />\n            </div>\n          </div>\n        </div>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          :class=\"{'button-spinner': starting}\"\n          :disabled=\"starting\"\n          @click=\"start\"\n        >\n          Create Task\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport AnnotationSetsRadioSelect from '@/components/DatasetComponent/AnnotationSetsRadioSelect.vue';\n\nexport default {\n  name: 'CreateAutoAnnotationTaskModal',\n  components: {\n    Modal,\n    AnnotationSetsRadioSelect,\n  },\n  props: {\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n    trainerList: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: { 'task-created': null },\n  data() {\n    return {\n      message: '',\n      task: '',\n      modelList: [\n        { name: 'ModelPack', value: 'mpk' },\n        { name: 'Yolo v8', value: 'yolo' },\n      ],\n      selectedModel: null,\n      destinationAnnset: {},\n      path: '',\n      selectedDestinationDataset: '',\n      selectedExperiment: '',\n      selectedTrainingSession: '',\n      mode: 'auto-ann',\n      segmentationSourceDataset: '',\n      segmentationSourceAnnset: {},\n      starting: false,\n      modelFileTypes: [\n        {\n          model: 'YOLO',\n          files: ['best.pt'],\n        },\n        {\n          model: 'Keras',\n          files: ['best.h5'],\n        },\n        {\n          model: 'Keras - two Stage',\n          files: ['best_decoder.h5', 'best_backbone.h5'],\n        },\n        {\n          model: 'Maivin RTM',\n          files: ['best.rtm'],\n        },\n        {\n          model: 'Maivin RTM - Two Stage',\n          files: ['best_decoder.rtm', 'best_backbone.rtm'],\n        },\n      ],\n      selectedSessionAvailableFiles: [],\n      selectedModelFiles: '',\n      save_as: 'polygons',\n    };\n  },\n  computed: {\n    isDebugMode() {\n      return this.$store.state.debugMode;\n    },\n    trainingSessions() {\n      if (this.selectedExperiment) {\n        return this.selectedExperiment.training_sessions;\n      }\n      return [];\n    },\n    autoAnnTrainingSessions() {\n      return this.trainingSessions.filter((e) => e.params?.trainer_params?.task.includes('detect'));\n    },\n    autoSegTrainingSessions() {\n      return this.trainingSessions.filter((e) => e.params?.trainer_params?.task.includes('segment'));\n    },\n  },\n  watch: {\n    selectedExperiment() {\n      this.selectedTrainingSession = '';\n      this.selectedModelFiles = '';\n    },\n    segmentationSourceDataset(d) {\n      if (this.mode === 'segmentation' && d) {\n        this.selectedDestinationDataset = d;\n      }\n    },\n    selectedTrainingSession(s) {\n      this.selectedModelFiles = '';\n      if (s) {\n        this.getAllFiles();\n      }\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  methods: {\n    showModal() {\n      this.$refs.createTaskModal.showModal();\n      this.resetData();\n    },\n    resetData() {\n      this.task = '';\n      this.selectedDestinationDataset = '';\n      this.selectedExperiment = '';\n      this.selectedTrainingSession = '';\n      this.destinationAnnset = {};\n      this.segmentationSourceDataset = '';\n      this.segmentationSourceAnnset = {};\n      this.mode = 'auto-ann';\n      this.path = '';\n      this.message = \"\";\n      this.selectedSessionAvailableFiles = [];\n      this.selectedModelFiles = '';\n      this.save_as = 'polygons';\n    },\n    closeModal() {\n      this.$refs.createTaskModal.closeModal();\n      this.resetData();\n    },\n    async getAllFiles() {\n      await this.dataConnect.convertorFindAllFiles({\n        training_session_id: this.selectedTrainingSession.id,\n      }).then((data) => {\n        this.selectedSessionAvailableFiles = [];\n        const allFiles = data.result ? Object.keys(data.result) : [];\n        this.modelFileTypes.forEach((type) => {\n          if (type.files.every((file) => allFiles.includes(file))) {\n            this.selectedSessionAvailableFiles.push(type);\n          }\n        });\n      }).catch((e) => console.log(e));\n    },\n    async start() {\n      if (!this.task) {\n        this.message = 'Missing task name';\n        return;\n      }\n      if (this.mode === 'auto-ann') {\n        if (!this.selectedExperiment) {\n          this.message = 'Missing Experiment';\n          return;\n        }\n\n        if (!this.selectedTrainingSession) {\n          this.message = 'Missing Training Session';\n          return;\n        }\n\n        if (Object.keys(this.selectedDestinationDataset).length === 0) {\n          this.message = `Missing Dataset`;\n          return;\n        }\n\n        if (Object.keys(this.destinationAnnset).length === 0) {\n          this.message = `Missing Annotation Set`;\n          return;\n        }\n\n        if (!this.selectedModelFiles) {\n          this.message = `Missing Model File`;\n          return;\n        }\n\n        const params = {\n          annotation_set_id: this.destinationAnnset.id,\n          task_name: this.task,\n          auto_remove: true,\n          is_segment: false,\n        };\n\n        params.experiment_id = this.selectedExperiment.id;\n        params.training_session_id = this.selectedTrainingSession.id;\n        params.model_file = this.selectedModelFiles.files[0];\n\n        if (this.selectedModelFiles.files.length > 1) {\n          params.backbone = this.selectedModelFiles.files.find((e) => e.includes(\"backbone\"));\n          params.decoder = this.selectedModelFiles.files.find((e) => e.includes(\"decoder\"));\n        }\n\n        if (this.isDebugMode) {\n          params['auto_remove'] = false;\n        }\n        this.starting = true;\n        await this.dataConnect.startAutoAnn(params)\n          .then((data) => {\n            if (data.result) {\n              this.closeModal();\n              this.$emit('task-created');\n              this.starting = false;\n            } else {\n              this.starting = false;\n              this.message = data.error.message;\n            }\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      } else if (this.mode === 'sam') {\n        if (Object.keys(this.segmentationSourceDataset).length === 0) {\n          this.message = `Missing Source Dataset`;\n          return;\n        }\n\n        if (Object.keys(this.segmentationSourceAnnset).length === 0) {\n          this.message = `Missing Source Annotation Set`;\n          return;\n        }\n\n        if (Object.keys(this.selectedDestinationDataset).length === 0) {\n          this.message = `Missing Destination Dataset`;\n          return;\n        }\n\n        if (Object.keys(this.destinationAnnset).length === 0) {\n          this.message = `Missing Destination Annotation Set`;\n          return;\n        }\n\n        const params = {\n          src_annotation_set_id: this.segmentationSourceAnnset.id,\n          dst_annotation_set_id: this.destinationAnnset.id,\n          task_name: this.task,\n          auto_remove: true,\n        };\n\n        if (this.isDebugMode) {\n          params['auto_remove'] = false;\n        }\n        this.starting = true;\n        await this.dataConnect.startAutoSegmentation(params)\n          .then((data) => {\n            if (data.result) {\n              this.closeModal();\n              this.starting = false;\n              this.$emit('task-created');\n            } else {\n              this.starting = false;\n              this.message = data.error.message;\n            }\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      } else if (this.mode === 'auto-seg') {\n        if (!this.selectedExperiment) {\n          this.message = 'Missing Experiment';\n          return;\n        }\n\n        if (!this.selectedTrainingSession) {\n          this.message = 'Missing Training Session';\n          return;\n        }\n\n        if (Object.keys(this.selectedDestinationDataset).length === 0) {\n          this.message = `Missing Destination Dataset`;\n          return;\n        }\n\n        if (Object.keys(this.destinationAnnset).length === 0) {\n          this.message = `Missing Destination Annotation Set`;\n          return;\n        }\n\n        if (!this.selectedModelFiles) {\n          this.message = `Missing Model File`;\n          return;\n        }\n\n        const params = {\n          annotation_set_id: this.destinationAnnset.id,\n          task_name: this.task,\n          auto_remove: true,\n          is_segment: true,\n          use_mask: this.save_as === 'mask',\n        };\n\n        params.experiment_id = this.selectedExperiment.id;\n        params.training_session_id = this.selectedTrainingSession.id;\n        params.model_file = this.selectedModelFiles.files[0];\n\n        if (this.selectedModelFiles.files.length > 1) {\n          params.backbone = this.selectedModelFiles.files.find((e) => e.includes(\"backbone\"));\n          params.decoder = this.selectedModelFiles.files.find((e) => e.includes(\"decoder\"));\n        }\n\n        if (this.isDebugMode) {\n          params['auto_remove'] = false;\n        }\n        this.starting = true;\n        await this.dataConnect.startAutoAnn(params)\n          .then((data) => {\n            if (data.result) {\n              this.closeModal();\n              this.starting = false;\n              this.$emit('task-created');\n            } else {\n              this.starting = false;\n              this.message = data.error.message;\n            }\n          })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      }\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.form {\n  padding: 0.75rem 3rem;\n  min-width: 420px;\n}\n\n.dataset-selector{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  width: 100%;\n\n  select {\n    width: 180px;\n    margin-right: 20px;\n  }\n\n  button {\n    width: 350px;\n  }\n}\n\n.flex-start {\n  align-items: flex-start;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n.row-switch {\n  flex-direction: row !important;\n  overflow: visible;\n  align-items: center;\n\n  label:first-child {\n    flex: 1 1 40%;\n    max-width: 40%;\n  }\n}\n\n.save-as-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr;\n  grid-auto-rows: auto;\n  width: 100%;\n\n  .label-text {\n    font-size: 0.9rem;\n    font-weight: 600;\n  }\n\n  .chkbx-li {\n  display: flex;\n  flex-direction: column;\n  align-items: start;\n  width: fit-content;\n  }\n\n  .chkbx-li + .chkbx-li {\n    margin-left: 10px;\n  }\n}\n\n</style>\n","import { render } from \"./CreateAutoAnnotationTaskModal.vue?vue&type=template&id=2f8f56ca&scoped=true\"\nimport script from \"./CreateAutoAnnotationTaskModal.vue?vue&type=script&lang=js\"\nexport * from \"./CreateAutoAnnotationTaskModal.vue?vue&type=script&lang=js\"\n\nimport \"./CreateAutoAnnotationTaskModal.vue?vue&type=style&index=0&id=2f8f56ca&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2f8f56ca\"]])\n\nexport default __exports__","<template>\n  <!-- eslint-disable max-len -->\n  <BaseCard\n    :id=\"`dataset-${dataset.id}`\"\n    ref=\"card\"\n    :title=\"dataset.name\"\n    class=\"dataset-card\"\n  >\n    <template #header>\n      <BaseMenu\n        v-if=\"permissions && permissions.project_write\"\n        :placement=\"'bottom-end'\"\n        @closed=\"show_menu = false\"\n      >\n        <IconButton\n          v-model=\"show_menu\"\n          class=\"header-icon\"\n          :icon=\"'more_vert'\"\n          :width=\"24\"\n          :height=\"24\"\n        />\n        <template #menu=\"{closeMenu}\">\n          <ul class=\"dataset-menu\">\n            <li>\n              <BaseMenuButton @click.stop=\"handleAutomatedTaskStart(), closeMenu()\">\n                <SVGIcon\n                  :iconName=\"'play'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>New Automated Task</span>\n              </BaseMenuButton>\n            </li>\n          </ul>\n        </template>\n      </BaseMenu>\n    </template>\n    <template #body>\n      <div class=\"dataset-card__body mt-2\">\n        <BaseTextExpander v-if=\"dataset.description\" class=\"mb-2\" :text=\"dataset.description\" />\n        <template v-if=\"dataset && dataset.tasks && dataset.tasks.length > 0\">\n          <ul class=\"automated-tasks scrollbar\">\n            <li\n              v-for=\"(task, i) in dataset.tasks\"\n              :key=\"i\"\n              class=\"automated-tasks__list-item2\"\n            >\n              <div class=\"header\">\n                <div class=\"left\">\n                  <SVGIcon\n                    v-if=\"task.docker_task.type === 'auto-ann'\"\n                    :iconName=\"'detection2'\"\n                    class=\"task-type-icon\"\n                    :width=\"'20px'\"\n                    :height=\"'20px'\"\n                  />\n                  <SVGIcon\n                    v-else-if=\"task.docker_task.type === 'auto-seg'\"\n                    :iconName=\"'segments'\"\n                    class=\"task-type-icon\"\n                    :width=\"'20px'\"\n                    :height=\"'20px'\"\n                  />\n                  <span>{{ getString(task.docker_task.type) }}</span>\n                </div>\n                <div class=\"center\">\n                  <span>{{ task.docker_task.name }}</span>\n                </div>\n                <div class=\"right timer\">\n                  <span>{{ formatTime(task.docker_task.date) }}</span>\n\n                  <div\n                    v-if=\"getStatus(task) === 'pending' || getStatus(task) === 'running'\"\n                    class=\"icon-container\"\n                  >\n                    <div class=\"icon\" title=\"Terminate Task\">\n                      <SVGIcon\n                        v-if=\"permissions && permissions.project_write\"\n                        :iconName=\"'pause'\"\n                        :width=\"18\"\n                        :height=\"18\"\n                        @click=\"terminateTask(task)\"\n                      />\n                    </div>\n                  </div>\n                  <div v-else class=\"icon-container\">\n                    <div class=\"icon\" title=\"Delete Task\">\n                      <SVGIcon\n                        v-if=\"permissions && permissions.project_write\"\n                        :iconName=\"'trash'\"\n                        :width=\"18\"\n                        :height=\"18\"\n                        @click.stop=\"deleteTask(task)\"\n                      />\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class=\"body\">\n                <div val-status class=\"status-col\">\n                  <span v-if=\"getStatus(task.docker_task) === 'complete'\" class=\"status-tag _complete\"><div class=\"status-icon\">&#x2713;</div>Complete</span>\n                  <span v-else-if=\"getStatus(task.docker_task) === 'pending'\" class=\"status-tag _running\"><div class=\"running-icon\" />Initializing</span>\n                  <span v-else-if=\"getStatus(task.docker_task) === 'running'\" class=\"status-tag _running\"><div class=\"running-icon\" />Inference</span>\n                  <span v-else-if=\"getStatus(task.docker_task) === 'terminated'\" class=\"status-tag _warning\"><div class=\"status-icon\">&#x21;</div>Terminated</span>\n                  <span v-else :title=\"getStatus(task.docker_task)\" class=\"status-tag _error\"><div class=\"status-icon\">&#x2716;</div>Error</span>\n                  <span v-if=\"getEndTime(task.docker_task)\" class=\"duration\">Duration: {{ getEndTime(task.docker_task) }} hr</span>\n                </div>\n\n                <hr class=\"vr\">\n                <div val-name class=\"name-col\">\n                  <div class=\"name-col__main\">\n                    <div class=\"item\">\n                      <label>Annotation Set</label>\n                      <span>{{ getAnnotationSetNameFromId(task['parsed_data']['dest']) }}</span>\n                    </div>\n                    <div class=\"item\">\n                      <label>Experiment</label>\n                      <span>{{ task['parsed_data']['trainer'] ? task['parsed_data']['trainer']['name'] : 'Unknown' }}</span>\n                    </div>\n                    <div class=\"item\">\n                      <label>Session</label>\n                      <span>{{ task['parsed_data']['training_session'] ? task['parsed_data']['training_session']['name'] : 'Unknown' }}</span>\n                    </div>\n                    <div class=\"item model\">\n                      <label>Model</label>\n                      <span>{{ task['parsed_data']['model_file'] ? task['parsed_data']['model_file'] : 'Unknown' }}</span>\n                    </div>\n                  </div>\n                </div>\n                <hr class=\"vr\">\n                <div val-epoch class=\"task-col\">\n                  <label>PROGRESS</label>\n                  <span v-if=\"getTotal(task.docker_task) && getStatus(task.docker_task) !== 'error'\">{{ `${Math.floor((getCount(task.docker_task) / getTotal(task.docker_task)) * 100).toFixed(1)} %` }}</span>\n                  <span v-else>n/a</span>\n                </div>\n              </div>\n            </li>\n          </ul>\n        </template>\n        <div v-else class=\"automated-tasks-empty\">\n          <span>No Automated Tasks Created</span>\n        </div>\n      </div>\n    </template>\n  </BaseCard>\n</template>\n<script>\nimport BaseCard from '@/components/BaseCard.vue';\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport BaseTextExpander from '@/components/BaseTextExpander.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: \"AutoAnnotationCardV2\",\n  components: {\n    BaseCard,\n    IconButton,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    BaseTextExpander,\n  },\n  props: {\n    dataset: {\n      type: Object,\n      default: () => {},\n    },\n    permissions: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['create-automated-task', 'terminate-task', 'delete-task'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      show_menu: false,\n    };\n  },\n  methods: {\n    handleAutomatedTaskStart() {\n      this.$emit('create-automated-task');\n    },\n    getStatus(task) {\n      if (task && task.status) {\n        return task.status;\n      }\n      return null;\n    },\n    getMessage(task) {\n      if (task && task.message) {\n        return task.message;\n      }\n      return null;\n    },\n    getCount(task) {\n      if (task && task.count) {\n        return task.count;\n      }\n      return null;\n    },\n    getTotal(task) {\n      if (task && task.total) {\n        return task.total;\n      }\n      return null;\n    },\n    formatTime(str) {\n      return `${new Date(str).toLocaleTimeString('default', {\n        year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n      })}`;\n    },\n    getEndTime(docker_task) {\n      if (docker_task.end_date !== \"0001-01-01T00:00:00Z\" && docker_task.date !== \"0001-01-01T00:00:00Z\") {\n        return Number(Math.abs(new Date(docker_task.end_date) - new Date(docker_task.date)) / 3.6e6).toFixed(2);\n      } else if (docker_task.end_date === \"0001-01-01T00:00:00Z\" && docker_task.date !== \"0001-01-01T00:00:00Z\") {\n        return Number(Math.abs(Date.now() - new Date(docker_task.date)) / 3.6e6).toFixed(2);\n      } else {\n        return null;\n      }\n    },\n    getAnnotationSetNameFromId(id) {\n      if (id) {\n        const set = this.dataset.annotation_sets.find((e) => e.id === id);\n        if (set) {\n          return set.name;\n        } else {\n          return 'Unknown';\n        }\n      } else {\n        return 'Unknown';\n      }\n    },\n    getStyle(type) {\n      switch (type) {\n      case 'auto-ann':\n        return 'auto-ann';\n      case 'auto-seg':\n        return 'auto-seg';\n      default:\n        return '';\n      }\n    },\n    getString(type) {\n      switch (type) {\n      case 'auto-ann':\n        return 'Auto Annotation';\n      case 'auto-seg':\n        return 'Auto Segmentation';\n      default:\n        return '';\n      }\n    },\n    terminateTask(task) {\n      this.$emit('terminate-task', task);\n    },\n    deleteTask(task) {\n      this.$emit('delete-task', task);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.dataset-card {\n  display: flex;\n  height: 360px;\n  flex-direction: column;\n  position: relative;\n  padding: 16px;\n  text-align: left;\n  border-radius: 8px;\n\n  @include themify() {\n    background: themed('card-color');\n    color: themed('body-text-color');\n  }\n\n  &__header {\n    width: 100%;\n    display: flex;\n  }\n\n  &__titles {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    line-height: 1;\n  }\n\n  &__title {\n    font-size: 1.25rem;\n    font-weight: 700;\n    @include themify() {\n      color: themed('body-text-color');\n    }\n  }\n\n  &__subtitle {\n    font-size: 0.75rem;\n    font-weight: 700;\n    margin-top: 2px;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  &__body {\n    display: flex;\n    flex-direction: column;\n    width: 100%;\n    min-height: 0px;\n    flex: 1 1 auto;\n\n    h3 {\n      margin: 0;\n      font-size: 1rem;\n      @include themify() {\n        color: themed('body-text-color-secondary');\n      }\n    }\n  }\n\n  &__body-row {\n    display: flex;\n    flex: 1 1 auto;\n    margin-top: 5px;\n    align-items: center;\n  }\n\n}\n\n.dataset-menu {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n  min-width: 100px;\n}\n\n.automated-tasks {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  list-style: none;\n  padding: 2px 4px;\n  margin: -2px -4px;\n  overflow-y: auto;\n\n  &__list-item2 {\n    display: flex;\n    flex-direction: column;\n    @include themify() {\n        background: themed('color-white-700');\n      }\n    border-radius: 4px;\n    &:hover {\n      box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.375), 0 0 1px 1px rgba(0, 0, 0, 0.125);\n    }\n\n    .header {\n      padding: 8px 0 8px 8px;\n      display: grid;\n      grid-template-columns:0.9fr minmax(0px, 1.2fr) 0.9fr;\n      gap: 15px;\n      font-weight: 700;\n      font-size: 0.85rem;\n      @include themify() {\n        color: themed('color-primary');\n      }\n\n      .left {\n        display: flex;\n        justify-content: flex-start;\n        align-items: center;\n        .task-type-icon {\n          margin: 0 8px 0 0;\n          @include themify() {\n            color: themed('color-primary');\n          }\n        }\n      }\n\n      .center {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n\n      .right {\n        display: flex;\n        justify-content: flex-end;\n        align-items: center;\n        overflow-x: hidden;\n        overflow-y: hidden;\n      }\n\n      .icon-container {\n        display: flex;\n        align-items: center;\n        margin-left: 10px;\n          @include themify() {\n            color: themed('body-text-color-secondary');\n          }\n          .icon + .icon {\n            margin-left: 8px;\n          }\n        }\n\n      .timer {\n        margin-right: 8px;\n        font-weight: 600;\n        font-size: 0.695rem;\n        white-space: nowrap;\n        @include themify() {\n          color: themed('body-text-color-secondary');\n        }\n      }\n    }\n    .body {\n      display: flex;\n      flex-direction: row;\n      position: relative;\n      padding: 0 8px 8px 8px;\n      gap: 16px;\n      align-items: center;\n\n      > div {\n        flex: 1 1 100%;\n      }\n\n      .task-col {\n        display: flex;\n        flex-direction: column;\n        width: fit-content;\n\n        label, span {\n          text-align: center;\n          overflow-wrap: anywhere;\n          pointer-events: none;\n        }\n        label {\n          font-weight: 600;\n          font-size: 0.625rem;\n          letter-spacing: 0.05em;\n          white-space: nowrap;\n          @include themify() {\n            color: themed('body-text-color-secondary');\n          }\n        }\n        span {\n          font-weight: 700;\n          font-size: 0.75rem;\n          @include themify() {\n            color: themed('color-primary');\n          }\n        }\n      }\n\n      .status-col {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n\n        .duration {\n          font-weight: 600;\n          font-size: 0.625rem;\n          letter-spacing: 0.05em;\n          white-space: nowrap;\n          @include themify() {\n            color: themed('body-text-color-secondary');\n          }\n        }\n      }\n\n      .name-col {\n        display: flex;\n        flex-direction: column;\n\n        &__main {\n          display: flex;\n          flex-direction: row;\n\n          .item {\n            display: flex;\n            flex-direction: column;\n            max-width: calc(80% / 3);\n            width: calc(80% / 3);\n          }\n\n          .model {\n            max-width: 20%;\n            width: 20%;\n          }\n        }\n\n        label, span {\n          text-align: center;\n          overflow-wrap: anywhere;\n          pointer-events: none;\n        }\n        label {\n          font-weight: 600;\n          font-size: 0.625rem;\n          letter-spacing: 0.05em;\n          white-space: nowrap;\n          @include themify() {\n            color: themed('body-text-color-secondary');\n          }\n        }\n        span {\n          font-weight: 700;\n          font-size: 0.75rem;\n          padding-left: 10px;\n          padding-right: 10px;\n          overflow: hidden;\n          white-space: nowrap;\n          text-overflow: ellipsis;\n          @include themify() {\n            color: themed('color-primary');\n          }\n        }\n      }\n    }\n  }\n}\n\n.automated-tasks__list-item2 div[val-epoch] {\n  max-width: 60px !important;\n  min-width: 60px !important;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.automated-tasks__list-item2 div[val-status] {\n  min-width: 120px !important;\n  flex: 0 1 auto;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.automated-tasks__list-item2 div[val-name] {\n  min-width: 180px !important;\n  flex: 1 1 auto;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.automated-tasks-empty {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  align-items: center;\n  justify-content: center;\n  font-size: 1.25rem;\n  font-weight: bold;\n  border: solid 1px black;\n  border-radius: 8px;\n  @include themify() {\n    background: radial-gradient(circle, rgba($color-primary-300, 0.075) 50%, rgba(var(--color-primary-rgb), 0.125) 100%);\n  }\n\n  span {\n    padding: 16px;\n    text-align: center;\n  }\n}\n\n.icon, .header-icon {\n  cursor: pointer;\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n}\n\n.icon:hover, .header-icon:hover {\n  cursor: pointer;\n  @include themify() {\n    color: themed('color-primary');\n  }\n}\n\n.status-tag {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100px;\n  min-width: 100px;\n  border-radius: 18px;\n  padding: 4px 6px;\n  line-height: 1;\n  font-size: 0.625rem;\n  font-weight: 700;\n  white-space: nowrap;\n  border: 2px solid;\n  box-shadow: 0px 0px 1px rgb(0 0 0 / 25%), 0px 1px 4px rgb(0 0 0 / 25%);\n  @include themify() {\n    color: themed('color-black');\n  }\n\n  &._complete {\n    @include themify() {\n      color: themed('color-status-complete');\n      background: themed('color-status-complete-background');\n    }\n  }\n  &._running {\n    @include themify() {\n      color: themed('color-status-running');\n      background: themed('color-status-running-background');\n    }\n  }\n  &._error {\n    @include themify() {\n      color: themed('color-status-error');\n      background: themed('color-status-error-background');\n    }\n  }\n\n  &._warning {\n    @include themify() {\n      color: themed('color-status-warning');\n      background: themed('color-status-warning-background');\n    }\n  }\n\n  .running-icon {\n    color: inherit;\n    width: 4px;\n    height: 4px;\n    border: solid 4px;\n    border-radius: 4px;\n    margin-right: 4px;\n  }\n\n  .status-icon {\n    color: inherit;\n    margin-right: 4px;\n  }\n}\n\nhr.vr {\n  display: flex;\n  width: 1px;\n  height: 60%;\n  margin: 0;\n}\n\n</style>\n","import { render } from \"./AutoAnnotationCard.vue?vue&type=template&id=5d575253&scoped=true\"\nimport script from \"./AutoAnnotationCard.vue?vue&type=script&lang=js\"\nexport * from \"./AutoAnnotationCard.vue?vue&type=script&lang=js\"\n\nimport \"./AutoAnnotationCard.vue?vue&type=style&index=0&id=5d575253&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5d575253\"]])\n\nexport default __exports__","import { render } from \"./AutomatedTasks.vue?vue&type=template&id=6beecf95&scoped=true\"\nimport script from \"./AutomatedTasks.vue?vue&type=script&lang=js\"\nexport * from \"./AutomatedTasks.vue?vue&type=script&lang=js\"\n\nimport \"./AutomatedTasks.vue?vue&type=style&index=0&id=6beecf95&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6beecf95\"]])\n\nexport default __exports__","import { render } from \"./Automation.vue?vue&type=template&id=37da003f&scoped=true\"\nimport script from \"./Automation.vue?vue&type=script&lang=js\"\nexport * from \"./Automation.vue?vue&type=script&lang=js\"\n\nimport \"./Automation.vue?vue&type=style&index=0&id=37da003f&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-37da003f\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n      <template #page-slot>\n        <BreadcrumbSelect\n          id=\"project-select\"\n          v-model=\"currentProject\"\n          :options=\"projectList\"\n          :placeholder=\"'Project'\"\n          :displayTag=\"'name'\"\n        />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <main class=\"main-display-area\">\n        <ReviewsTab />\n      </main>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Header from '@/components/Header.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport BreadcrumbSelect from '@/components/BreadcrumbSelect.vue';\nimport ReviewsTab from '@/components/ReviewsPage/ReviewsTab.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\n\nexport default {\n  name: 'Tasks',\n  components: {\n    Header,\n    ReviewsTab,\n    BreadcrumbSelect,\n    BreadcrumbNavigation,\n  },\n  data() {\n    return {\n      dataConnect: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      datasets: null,\n    };\n  },\n  computed: {\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n    currentProject: {\n      get() {\n        return this.$store.state.projects.currentProject;\n      },\n      set(value) {\n        this.$store.commit('projects/setCurrentProject', value);\n      },\n    },\n  },\n  watch: {\n    async currentProject() {\n      this.refreshDatasetList();\n    },\n  },\n  beforeMount() {\n    this.refreshDatasetList();\n  },\n  created() {\n    if (this.$route) {\n      this.redirect = this.$route.name;\n    }\n  },\n  methods: {\n    async refreshDatasetList() {\n      this.datasets = await this.getDatasets();\n      this.getDatasetDetails();\n    },\n    async getDatasetDetails() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          get_num_images: true,\n          get_labels: true,\n          get_num_labels: true,\n          get_annotation_sets: true,\n          get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        if (!resp.error) {\n          const temp = resp.result;\n\n          const shallowDatasets = JSON.parse(JSON.stringify(this.datasets));\n\n          shallowDatasets.forEach((e, i) => {\n            temp[i].annotation_sets?.forEach((set, j) => {\n              temp[i].annotation_sets[j].num_images = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_images : 0;\n              temp[i].annotation_sets[j].num_annotations = shallowDatasets[i].annotation_sets[j] ? shallowDatasets[i].annotation_sets[j].num_annotations : 0;\n            });\n            shallowDatasets[i].annotation_sets = temp[i].annotation_sets;\n            shallowDatasets[i].numImages = temp[i].numImages ? temp[i].numImages : 0;\n            shallowDatasets[i].labels = temp[i].labels ? temp[i].labels : [];\n            shallowDatasets[i].numLabels = temp[i].numLabels ? temp[i].numLabels : 0;\n            shallowDatasets[i].groups = temp[i].groups ? temp[i].groups : [];\n          });\n          this.$store.commit('datasets/setDatasetList', shallowDatasets);\n        }\n      }\n    },\n    async getDatasets() {\n      if (this.currentProject) {\n        const params = {\n          project_id: this.currentProject.id,\n          // get_num_images: true,\n          // get_labels: true,\n          // get_num_labels: true,\n          // get_annotation_sets: true,\n          // get_groups: true,\n          get_parked: true,\n        };\n        const resp = await this.dataConnect.getDatasetList(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        let list = [];\n        if (resp.error) {\n          return list;\n        } else {\n          let temp = resp.result;\n\n          temp = temp.map((e) => {\n            e.annotation_sets = [];\n            e.numImages = null;\n            e.labels = null;\n            e.numLabels = null;\n            e.groups = null;\n            return e;\n          });\n\n          list = temp;\n        }\n        return list;\n      }\n      return [];\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.tasks-filter-controls {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-white');\n  }\n}\n</style>\n","<template>\n  <div class=\"controls-bar\">\n    <span />\n    <button class=\"button button-sm\" @click=\"openCreateTaskModal\">Create</button>\n  </div>\n  <div v-if=\"!loading\" class=\"reviewTask__container\">\n    <div class=\"reviewTask__row\">\n      <div class=\"col-sm task-column\">\n        <div class=\"task-column__header\">\n          <span>Open</span>\n        </div>\n        <div class=\"task-column__body scrollbar\">\n          <ReviewTaskCard\n            v-for=\"(task,i) in reviewTasks.filter(e => e.remainingCount && 0 < e.remainingCount['remaining_images'] && e.remainingCount['remaining_images'] === e.remainingCount['total_images'])\"\n            :key=\"i\"\n            :task=\"task\"\n            :hasPermission=\"shouldAccessTask(task)\"\n            :datasets=\"datasets\"\n            @click=\"createReviewSession(task)\"\n            @start-annotation-review-task=\"createAnnotationReviewSession(task)\"\n            @open-manage-access=\"handleOpenManageAccess(task)\"\n            @delete-review-task=\"openConfirmDeleteTaskModal(task)\"\n          />\n        </div>\n      </div>\n      <div class=\"col-sm task-column\">\n        <div class=\"task-column__header\">\n          <span>In Progress</span>\n        </div>\n        <div class=\"task-column__body scrollbar\">\n          <ReviewTaskCard\n            v-for=\"(task,i) in reviewTasks.filter(e => e.remainingCount && 0 < e.remainingCount['remaining_images'] && e.remainingCount['remaining_images'] < e.remainingCount['total_images'])\"\n            :key=\"i\"\n            :task=\"task\"\n            :hasPermission=\"shouldAccessTask(task)\"\n            :datasets=\"datasets\"\n            @click=\"createReviewSession(task)\"\n            @start-annotation-review-task=\"createAnnotationReviewSession(task)\"\n            @open-manage-access=\"handleOpenManageAccess(task)\"\n            @delete-review-task=\"openConfirmDeleteTaskModal(task)\"\n          />\n        </div>\n      </div>\n      <div class=\"col-sm task-column\">\n        <div class=\"task-column__header\">\n          <span>Completed</span>\n        </div>\n        <div class=\"task-column__body scrollbar\">\n          <ReviewTaskCard\n            v-for=\"(task,i) in reviewTasks.filter(e => e.remainingCount && (e.remainingCount['remaining_images'] === 0 || e.remainingCount['total_images'] === 0))\"\n            :key=\"i\"\n            :task=\"task\"\n            :hasPermission=\"shouldAccessTask(task)\"\n            :datasets=\"datasets\"\n            @click=\"createReviewSession(task)\"\n            @start-annotation-review-task=\"createAnnotationReviewSession(task)\"\n            @open-manage-access=\"handleOpenManageAccess(task)\"\n            @delete-review-task=\"openConfirmDeleteTaskModal(task)\"\n          />\n        </div>\n      </div>\n    </div>\n  </div>\n  <div v-else class=\"empty-state\">\n    <InlineLoader\n      :width=\"'60px'\"\n      :height=\"'60px'\"\n      :border=\"'12px'\"\n    />\n  </div>\n  <CreateAnnotationReviewTaskModal\n    v-if=\"showCreateModal\"\n    ref=\"createAnnotationReviewTaskModal\"\n    v-model:reviewSettings=\"reviewSettings\"\n    :datasets=\"datasets\"\n    @review-task-created=\"handleReviewTaskCreated\"\n    @review-task-created-error=\"handleReviewTaskCreatedError\"\n    @closed=\"() => {showCreateModal = false;}\"\n  />\n  <!-- <CreateAnnotationReviewSessionModal\n      ref=\"createAnnotationReviewSessionModal\"\n      v-model:selectedReviewTask=\"selectedReviewTask\"\n      @review-session-created=\"handleReviewSessionCreated\"\n    /> -->\n  <AnnotationEditorModal\n    v-if=\"showEditorModal\"\n    ref=\"annotationEditorModal\"\n    :initialLabels=\"editorLabels\"\n    :reviewSettings=\"reviewSettings\"\n    :initialAuditorType=\"reviewSettings?.initialAuditorType\"\n    @closed=\"handleExitReview(reviewSettings.reviewTask)\"\n    @new-color=\"(params) => updateLabelColor(params, reviewSettings.reviewTask)\"\n  />\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"handleDeleteReviewTask\"\n  />\n  <ManageReviewsAccess\n    ref=\"manageReviewsAccessModal\"\n    :modalTask=\"modalTask\"\n    @refresh-tasks=\"updateAllReviewCards\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport ReviewTaskCard from '@/components/ReviewsPage/ReviewTaskCard.vue';\nimport CreateAnnotationReviewTaskModal from '@/components/ReviewsPage/CreateAnnotationReviewTaskModal.vue';\nimport AnnotationEditorModal from '@/components/DatasetComponent/AnnotationTool/AnnotationEditorModal.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport ManageReviewsAccess from '@/components/ReviewsPage/ManageReviewsAccess.vue';\nimport InlineLoader from '@/components/InlineLoader.vue';\n\nexport default {\n  name: \"ReviewsTab\",\n  components: {\n    // ReviewsPageFilters,\n    CreateAnnotationReviewTaskModal,\n    // CreateAnnotationReviewSessionModal,\n    AnnotationEditorModal,\n    ReviewTaskCard,\n    ConfirmModal,\n    ManageReviewsAccess,\n    InlineLoader,\n  },\n  props: {\n  },\n  emits: [],\n  data() {\n    return {\n      filters: {},\n      dataConnect: null,\n      reviewTasks: [],\n      reviewSettings: null,\n      editorLabels: [],\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      buttonText: \"\",\n      toDelete: null,\n      modalTask: null,\n      showEditorModal: false,\n      showCreateModal: false,\n      loading: false,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    currentProject() {\n      return this.$store.state.projects.currentProject;\n    },\n    datasets() {\n      return this.$store.state.datasets.datasetList;\n    },\n  },\n  watch: {\n    currentProject() {\n      this.updateAllReviewCards();\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n  },\n  async mounted() {\n    this.updateAllReviewCards();\n  },\n  methods: {\n    shouldAccessTask(task) {\n      return true;\n    },\n    handleOpenManageAccess(task) {\n      this.modalTask = task;\n      this.$nextTick(() => {\n        this.$refs.manageReviewsAccessModal.showModal();\n      });\n    },\n    openConfirmDeleteTaskModal(t) {\n      this.confirmMessage = `Are you sure you want to move task \"${t.name}\" to recycle bin?`;\n      this.confirmMessageHeader = 'Remove Task';\n      this.buttonText = \"Remove\";\n      this.toDelete = t;\n      this.$refs.confirmModal.showModal();\n    },\n    async updateAllReviewCards() {\n      this.reviewTasks = await this.getReviewTasks();\n\n      const updatedTasksPromises = this.reviewTasks.map(async (task) => {\n        task.remainingCount = await this.getReviewTaskRemainingCount(task);\n        return task;\n      });\n      this.reviewTasks = await Promise.all(updatedTasksPromises);\n\n      if (this.modalTask) {\n        const t = this.reviewTasks.find((e) => e.id === this.modalTask.id);\n        if (t) {\n          this.modalTask = t;\n        }\n      }\n    },\n    async updateReviewCardCount(reviewTask) {\n      reviewTask.remainingCount = await this.getReviewTaskRemainingCount(reviewTask);\n    },\n    async getReviewTasks() {\n      this.loading = true;\n      const resp = await this.dataConnect.getReviewTasks({ project_id: this.currentProject?.id })\n        .catch((error) => {\n          // TODO: handle error\n          this.loading = false;\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        // TODO: handle error\n        this.loading = false;\n        return {};\n      }\n      this.loading = false;\n      return resp.result;\n    },\n    async getReviewTaskRemainingCount(reviewTask) {\n      const params = {\n        review_task_id: reviewTask.id,\n        dataset_id: reviewTask.dataset_id,\n      };\n      let remainingCount;\n      if (reviewTask?.type === 'audit') {\n        remainingCount = await this.dataConnect.getReviewTaskRemainingCount(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      } else if (reviewTask?.type === 'label') {\n        remainingCount = await this.dataConnect.getLabelingTaskRemainingCount(params)\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n      }\n\n      if (remainingCount.error || !remainingCount.result) {\n        // TODO: handle error\n        return {};\n      }\n      return remainingCount.result;\n    },\n    async handleExitReview(reviewTask) {\n      this.showEditorModal = false;\n      this.reviewSettings = null;\n      this.showBulkReview = false;\n      this.updateReviewCardCount(reviewTask);\n    },\n    async handleReviewTaskCreated() {\n      this.updateAllReviewCards();\n    },\n    async handleReviewTaskCreatedError(error) {\n      if (error.message.includes(\"limit reached\")) {\n        this.confirmMessage = `You haved reached the limit for number of tasks. Delete unused tasks or upgrade your package.`;\n        this.confirmMessageHeader = 'Limit Reached';\n        this.buttonText = \"\";\n        this.$refs.confirmModal.showModal();\n      }\n    },\n    async createReviewSession(reviewTask) {\n      const access = await this.shouldAccessTask(reviewTask);\n      if (!access) {\n        return;\n      }\n      const resp = await this.dataConnect.addReviewSession({\n        reviewer: this.$store.state.user.user.username,\n        duration: 0,\n        review_task_id: reviewTask.id,\n      })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        // TODO: handle error\n      } else {\n        const reviewSessionSettings = {\n          reviewSessionMethod: 'review_annotation_editor',\n          batchSize: 10,\n          samplingMethod: 'random',\n          reviewSession: resp.result,\n          reviewTask,\n          initialAuditorType: 'image',\n        };\n        this.handleReviewSessionCreated(reviewTask, reviewSessionSettings);\n      }\n    },\n    async createAnnotationReviewSession(reviewTask) {\n      const resp = await this.dataConnect.addReviewSession({\n        reviewer: this.$store.state.user.user.username,\n        duration: 0,\n        review_task_id: reviewTask.id,\n      })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        // TODO: handle error\n      } else {\n        const reviewSessionSettings = {\n          reviewSessionMethod: 'review_annotation_editor',\n          batchSize: 10,\n          samplingMethod: 'random',\n          reviewSession: resp.result,\n          reviewTask,\n          initialAuditorType: 'annotation',\n        };\n        this.handleReviewSessionCreated(reviewTask, reviewSessionSettings);\n      }\n    },\n    async handleReviewSessionCreated(reviewTask, reviewSessionSettings) {\n      let sourceAnnotationSet = {};\n      if (reviewTask.source_annotation_set_id) {\n        sourceAnnotationSet = await this.getAnnotationSet({ annotation_set_id: reviewTask.source_annotation_set_id });\n      }\n      this.reviewSettings = { ...reviewSessionSettings, sourceAnnotationSet };\n      this.editorLabels = await this.getLabelListForDataset(reviewTask.dataset_id);\n      if (this.reviewSettings.reviewSessionMethod === 'bulk_annotation_review') {\n        this.showBulkReview = true;\n      } else if (this.reviewSettings.reviewSessionMethod === 'review_annotation_editor') {\n        this.$nextTick(() => {\n          this.showEditorModal = true;\n        });\n      }\n    },\n    async updateLabelColor(params, reviewTask) {\n      params.dataset_id = reviewTask.dataset_id;\n      await this.dataConnect.updateLabel(params)\n        .then(async (data) => {\n          if (!data.error) {\n            this.editorLabels = await this.getLabelListForDataset(reviewTask.dataset_id);\n          }\n        })\n        .catch((e) => console.log(e));\n    },\n    async getAnnotationSet(params) {\n      const annotationSet = await this.dataConnect.getAnnotationSet(params)\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (annotationSet.error || !annotationSet.result) {\n        // TODO: handle error\n        return {};\n      }\n      return annotationSet.result;\n    },\n    async getLabelListForDataset(dataset_id) {\n      const resp = await this.dataConnect.getLabelList({ dataset_id })\n        .catch((error) => {\n          console.log('Failed to retrieve labels:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async handleDeleteReviewTask() {\n      const resp = await this.dataConnect.deleteReviewTask({ review_task_id: this.toDelete.id })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        if (resp.error) {\n          window.alert(resp.error);\n        }\n      }\n      this.updateAllReviewCards();\n    },\n    openCreateTaskModal() {\n      this.showCreateModal = true;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.controls-bar {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 20px 10px 20px;\n  align-items: center;\n  border-bottom: 1px solid #c9c9c9;\n  @include themify() {\n    background: themed('color-ribbon');\n  }\n  justify-content: space-between;\n}\n\n.reviewTask {\n\n  &__container {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    width: 100%;\n    min-width: 500px;\n    position: relative;\n    min-height: 0;\n\n    .task-column {\n      display: flex;\n      flex-direction: column;\n      @include themify() {\n        background: radial-gradient(circle, rgba($color-primary-400, 0.075) 50%, rgba(var(--color-primary-rgb), 0.125) 100%);\n      }\n      max-width: 33%;\n      border-radius: 10px;\n\n      &__header {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        margin: 16px 16px 6px 16px;\n        font-size: 1.4rem;\n        font-weight: 700;\n      }\n\n      &__body {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        padding: 4px 16px;\n        margin-bottom: 20px;\n        overflow-y: auto;\n        gap: 16px\n      }\n    }\n  }\n\n  &__row {\n    display: flex;\n    flex-direction: row;\n    height: 100%;\n    padding: 16px;\n    gap: 16px;\n  }\n}\n\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: 100%;\n  height: 100%;\n}\n</style>\n","<template>\n  <!-- eslint-disable max-len -->\n  <BaseCard\n    :id=\"`reviewTask-${task.id}`\"\n    ref=\"card\"\n    :title=\"`${task.name}`\"\n    class=\"reviewTask-card\"\n  >\n    <template #header>\n      <BaseMenu\n        v-if=\"hasPermission\"\n        :placement=\"'bottom-end'\"\n        @closed=\"show_menu = false\"\n      >\n        <IconButton\n          v-model=\"show_menu\"\n          :icon=\"'more_vert'\"\n          :width=\"24\"\n          :height=\"24\"\n        />\n        <template #menu=\"{closeMenu}\">\n          <ul class=\"reviewTask-menu\">\n            <li v-if=\"task.source_annotation_set_id\">\n              <BaseMenuButton @click.stop=\"handleStartAnnotationAudit(), closeMenu()\">\n                <SVGIcon\n                  :iconName=\"'tag'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                  :title=\"`Start Annotation Audit`\"\n                />\n                <span>Start Annotation Audit</span>\n              </BaseMenuButton>\n            </li>\n            <li v-if=\"isAdmin\">\n              <BaseMenuButton @click.stop=\"handleManageAccess(), closeMenu()\">\n                <SVGIcon\n                  :iconName=\"'people'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Manage Access</span>\n              </BaseMenuButton>\n            </li>\n            <li>\n              <BaseMenuButton class=\"_danger\" @click.stop=\"handleDeleteReviewTaskClicked(), closeMenu()\">\n                <SVGIcon\n                  :iconName=\"'trash'\"\n                  :width=\"'22px'\"\n                  :height=\"'22px'\"\n                />\n                <span>Remove</span>\n              </BaseMenuButton>\n            </li>\n          </ul>\n        </template>\n      </BaseMenu>\n    </template>\n    <template #body>\n      <!-- <span class=\"description\">{{ task.description }}</span> -->\n      <BaseTextExpander v-if=\"task.description\" :text=\"task.description\" />\n      <div class=\"dataset-source-destination mt-2\">\n        <div class=\"dataset-source-destination__container\">\n          <SVGIcon\n            class=\"dataset-source-destination__icon\"\n            :iconName=\"'database'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          <div class=\"dataset-source-destination__value\">\n            <span :title=\"sourceDataset?.name\">{{ sourceDataset?.name }}</span>\n          </div>\n        </div>\n        <div class=\"dataset-source-destination__container\">\n          Dest\n          <SVGIcon\n            class=\"dataset-source-destination__icon\"\n            :iconName=\"'set'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          <div class=\"dataset-source-destination__value\">\n            <span :title=\"destAnnSet?.name\">{{ destAnnSet?.name }}</span>\n          </div>\n        </div>\n        <div class=\"dataset-source-destination__container\">\n          <template v-if=\"task.source_annotation_set_id\">\n            Src\n            <SVGIcon\n              class=\"dataset-source-destination__icon\"\n              :iconName=\"'set'\"\n              :width=\"'18px'\"\n              :height=\"'18px'\"\n            />\n            <div class=\"dataset-source-destination__value\">\n              <span :title=\"sourceAnnSet?.name\">{{ sourceAnnSet?.name }}</span>\n            </div>\n          </template>\n        </div>\n      </div>\n      <div class=\"reviewTask-card__body-row mt-1\">\n        <div class=\"progress\">\n          <div class=\"progress__text\">\n            <span>Progress</span>\n            <span>{{ progress !== null ? progress : '-' }}%</span>\n          </div>\n          <div class=\"progress__bar\">\n            <progress id=\"reviewTask-progress-bar\" :value=\"progress\" :max=\"100\" />\n          </div>\n        </div>\n      </div>\n      <div class=\"reviewTask-card__body-row mt-1\">\n        <div class=\"reviewTask-counts\">\n          <span>Remaining</span>\n          <SVGIcon\n            :iconName=\"'image'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          <span>{{ numImagesRemaining !== null ? numImagesRemaining : '-' }}</span>\n        </div>\n      </div>\n      <div class=\"reviewTask-card__body-row mt-2\">\n        <div class=\"reviewers\">\n          <Tooltip\n            v-for=\"(reviewer, i) in reviewers\"\n            :key=\"i\"\n            :background=\"'gray'\"\n          >\n            <template #body>\n              <p>{{ reviewer.first_name && reviewer.last_name ? `${reviewer.first_name} ${reviewer.last_name}` : reviewer.username }}</p>\n            </template>\n            <UserIcon\n              :user=\"reviewer\"\n              :size=\"'32px'\"\n            />\n          </Tooltip>\n        </div>\n      </div>\n    </template>\n  </BaseCard>\n</template>\n<script>\nimport IconButton from '@/components/IconButton.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport Tooltip from '@/components/Tooltip.vue';\nimport BaseCard from '@/components/BaseCard.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport BaseTextExpander from '@/components/BaseTextExpander.vue';\nimport { decimalAdjust } from \"@/assets/js/utils\";\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: \"ReviewTaskCard\",\n  components: {\n    IconButton,\n    SVGIcon,\n    Tooltip,\n    BaseCard,\n    BaseMenu,\n    BaseMenuButton,\n    BaseTextExpander,\n    UserIcon,\n  },\n  props: {\n    task: {\n      type: Object,\n      default: () => {},\n    },\n    hasPermission: {\n      type: Boolean,\n      default: false,\n    },\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['delete-review-task', 'open-manage-access', 'start-annotation-review-task'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      numAnnotationsRemaining: '?',\n      show_menu: false,\n      reviewers: [],\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    isAdmin() {\n      return this.user && (this.user.role === 'super' || this.user.role === 'admin');\n    },\n    remainingCount() {\n      if (this.task && this.task.remainingCount) {\n        return this.task.remainingCount;\n      } else {\n        return null;\n      }\n    },\n    cardActionText() {\n      if (this.progress === 0) {\n        return 'Start reviewing';\n      }\n      return 'Continue review';\n    },\n    progress() {\n      if (this.remainingCount && this.remainingCount.remaining_images > 0) {\n        return decimalAdjust(\"floor\", (1 - (this.remainingCount.remaining_images / this.remainingCount.total_images)) * 100, -1);\n      } else {\n        return 100;\n      }\n    },\n    numImagesRemaining() {\n      if (this.remainingCount) {\n        return this.remainingCount.remaining_images;\n      }\n      return null;\n    },\n    sourceDataset() {\n      const datasets = this.$store.state.datasets.datasetList;\n      const dataset_id = this.task.dataset_id;\n      const dataset = datasets.find((d) => d.id === dataset_id);\n      return dataset;\n    },\n    destAnnSet() {\n      if (this.sourceDataset) {\n        const dest_annotation_set_id = this.task?.dest_annotation_set_id;\n        return this.sourceDataset.annotation_sets.find((as) => as.id === dest_annotation_set_id);\n      }\n      return null;\n    },\n    sourceAnnSet() {\n      if (this.sourceDataset) {\n        const source_annotation_set_id = this.task?.source_annotation_set_id;\n        const sourceAnnotationSet = this.sourceDataset.annotation_sets.find((as) => as.id === source_annotation_set_id);\n        if (sourceAnnotationSet) {\n          return sourceAnnotationSet;\n        }\n      }\n      return null;\n    },\n  },\n  mounted() {\n    this.getReviewTaskAccessList();\n  },\n  methods: {\n    async getReviewTaskAccessList() {\n      if (this.task) {\n        await this.dsConn.getReviewTaskAccessList({\n          review_task_id: this.task.id,\n        })\n          .then((data) => {\n            if (data.result) {\n              this.reviewers = data.result;\n            }\n          })\n          .catch((e) => console.log(e));\n      }\n    },\n    getStyle(type) {\n      switch (type) {\n      case 'label':\n        return 'label';\n      case 'audit':\n        return 'audit';\n      case 'curate':\n        return 'curate';\n      default:\n        return '';\n      }\n    },\n    getString(type) {\n      switch (type) {\n      case 'label':\n        return 'LABEL';\n      case 'audit':\n        return 'AUDIT';\n      case 'curate':\n        return 'CURATE';\n      default:\n        return '';\n      }\n    },\n    handleDeleteReviewTaskClicked() {\n      this.$emit('delete-review-task');\n    },\n    handleManageAccess() {\n      this.$emit('open-manage-access');\n    },\n    handleStartAnnotationAudit() {\n      this.$emit('start-annotation-review-task');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.task-type {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 18px;\n  padding: 4px 6px;\n  line-height: 1;\n  font-size: 0.7rem;\n  font-weight: 800;\n  letter-spacing: 0.05rem;\n  width: fit-content;\n  border: 2px solid;\n  margin: 5px 0 5px 0;\n  box-shadow: 0px 0px 1px rgb(0 0 0 / 25%), 0px 1px 4px rgb(0 0 0 / 25%);\n  @include themify() {\n    color: themed('color-black');\n  }\n}\n.audit {\n  color: rgb(0, 162, 255) !important;\n  border: 2px solid rgb(0, 162, 255) !important;\n}\n\n.curate {\n  color: rgb(245, 200, 2) !important;\n  border: 2px solid rgb(245, 200, 2) !important;\n}\n\n.label {\n  color: rgb(99, 22, 163) !important;\n  border: 2px solid rgb(99, 22, 163) !important;\n}\n\n.description {\n  margin: 5px 0 5px 0;\n  font-size: 1.1rem;\n  font-weight: 600;\n}\n\n.reviewTask-card {\n  cursor: pointer;\n  &__body-row {\n    display: flex;\n    flex: 1 1 auto;\n    overflow-x: auto;\n    overflow-y: clip;\n  }\n}\n\n.reviewers {\n  display: flex;\n  flex-direction: row;\n  height: fit-content;\n  gap: 5px;\n\n  &__icon {\n    width: 28px;\n    height: 28px;\n    border-radius: 100%;\n    @include themify() {\n      border: solid 2px themed('color-primary-500');\n    }\n\n    @include themify() {\n      background: themed('color-primary-100');\n      color: themed('color-primary-500');\n    }\n\n    &:not(:first-of-type) {\n      margin-left: -8px;\n    }\n    &:nth-last-of-type(odd) {\n      @include themify() {\n        background: themed('color-primary-200');\n        color: themed('color-primary-500');\n      }\n    }\n  }\n}\n\n.progress {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n\n  &__text {\n    display: flex;\n    width: 100%;\n    font-size: 0.875rem;\n    font-weight: 600;\n    justify-content: space-between;\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  &__bar {\n    display: flex;\n    width: 100%;\n    margin-top: 1px;\n\n    progress {\n      width: 100%;\n      border-radius: 0;\n      height: 6px;\n\n      &::-webkit-progress-bar {\n        @include themify() {\n          background-color: themed('progress-bar');\n        }\n      }\n      &::-webkit-progress-value {\n        @include themify() {\n          background-color: themed('progress-value');\n        }\n      }\n    }\n  }\n}\n\n.reviewTask-counts {\n  display: flex;\n  align-items: center;\n  line-height: 1;\n  font-size: 0.875rem;\n  font-weight: 600;\n  @include themify() {\n    color: themed('body-text-color-secondary');\n  }\n\n  span:first-of-type {\n    margin-right: 8px;\n  }\n\n  span:not(:first-of-type) {\n    margin-left: 2px;\n  }\n\n  svg:not(:first-of-type) {\n    margin-left: 8px;\n  }\n}\n\n.reviewTask-menu {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n  min-width: 100px;\n}\n\n.reviewTask-action-button {\n  width: 100%;\n  font-size: 0.875rem;\n  font-weight: 500 ;\n  outline: none;\n  border: none;\n  padding: 4px;\n  cursor: pointer;\n\n  @include themify() {\n    background: themed('color-primary');\n    color: themed('primary-text-color');\n  }\n}\n\n.dataset-source-destination {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  border-radius: 8px;\n\n  &__container {\n    display: flex;\n    flex-direction: row;\n    width: 100%;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--color-primary);\n    align-items: flex-start;\n    white-space: nowrap;\n    max-width: 33%;\n  }\n\n  &__icon {\n    min-width: 18px;\n  }\n\n  &__value {\n    display: flex;\n    flex-direction: row;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--body-text-color-secondary);\n    white-space: nowrap;\n    gap: 4px;\n    margin: 0 8px 0 4px;\n    overflow: hidden;\n\n    span {\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n  }\n}\n</style>\n","import { render } from \"./ReviewTaskCard.vue?vue&type=template&id=b7e08b04&scoped=true\"\nimport script from \"./ReviewTaskCard.vue?vue&type=script&lang=js\"\nexport * from \"./ReviewTaskCard.vue?vue&type=script&lang=js\"\n\nimport \"./ReviewTaskCard.vue?vue&type=style&index=0&id=b7e08b04&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-b7e08b04\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createAnnotationReviewModal\"\n    :title=\"'Add New Task'\"\n    :width=\"'600px'\"\n  >\n    <template #modal-main>\n      <div class=\"settings container scrollbar\">\n        <!-- <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Type</label>\n            <select\n              id=\"type-select\"\n              v-model=\"type\"\n              class=\"select\"\n            >\n              <option disabled :value=\"''\">Select a Type</option>\n              <option v-for=\"(option, i) in types\" :key=\"`taskboard-type-${i}`\" :value=\"option.type\">\n                {{ option.name }}\n              </option>\n            </select>\n          </div>\n        </div> -->\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Name</label>\n            <input v-model=\"reviewTaskInputName\" class=\"input\" type=\"text\">\n          </div>\n        </div>\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Description</label>\n            <textarea\n              v-model=\"reviewTaskInputDescription\"\n              rows=\"2\"\n              cols=\"50\"\n            />\n          </div>\n        </div>\n        <div class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Dataset</label>\n            <select v-model=\"srcDataset\" class=\"select\" required>\n              <option :key=\"'review-select-null'\" disabled :value=\"''\">Select a Dataset</option>\n              <option v-for=\"d in datasets\" :key=\"`review-select-${d.id}`\" :value=\"d\">\n                {{ d.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <div v-if=\"srcDataset\" class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"required\">Destination Annotation Set</label>\n            <v-combobox\n              v-model=\"destAnnotationSetName\"\n              class=\"combobox\"\n              clearable\n              :color=\"'#250e81'\"\n              :density=\"'compact'\"\n              :hide-details=\"true\"\n              :label=\"'Select or Enter New Set Name'\"\n              :items=\"destAnnotationSets\"\n              variant=\"outlined\"\n              @click:clear=\"() => destAnnotationSetName = ''\"\n            />\n          </div>\n        </div>\n        <div v-if=\"srcDataset\" class=\"row mb-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label>Source Annotation Set</label>\n            <select v-model=\"srcAnnotationSet\" class=\"select\" required>\n              <option :key=\"'review-select-null'\" disabled :value=\"''\">Select a Source Annotation Set</option>\n              <option v-for=\"a in annotationSets\" :key=\"`review-select-${a.id}`\" :value=\"a\">\n                {{ a.name }}\n              </option>\n            </select>\n          </div>\n        </div>\n        <div class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"label required\">Access Sharing</label>\n            <div class=\"value permission-list\">\n              <div class=\"role-grid-single-row\">\n                <div class=\"chkbx-li\">\n                  <v-checkbox\n                    v-model=\"presetRole\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                    value=\"default\"\n                    :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                    :true-icon=\"'mdi-circle-slice-8'\"\n                  >\n                    <template #label>\n                      <div class=\"label-text\">Share with organization</div>\n                    </template>\n                  </v-checkbox>\n                  <span class=\"chkbx-li__subtitle\">Everyone in your organization has access to this task.</span>\n                </div>\n                <!-- <div class=\"chkbx-li\">\n                  <v-checkbox\n                    v-model=\"presetRole\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                    value=\"user\"\n                    :false-icon=\"'mdi-checkbox-blank-circle-outline'\"\n                    :true-icon=\"'mdi-circle-slice-8'\"\n                  >\n                    <template #label>\n                      <div class=\"label-text\">Share with users</div>\n                    </template>\n                  </v-checkbox>\n                  <span class=\"chkbx-li__subtitle\">Only owner and selected users have access to this task.</span>\n                </div> -->\n              </div>\n            </div>\n          </div>\n        </div>\n        <template v-if=\"presetRole === 'user'\">\n          <div class=\"row\">\n            <v-combobox\n              v-model=\"userInputValue\"\n              class=\"combobox\"\n              chips\n              clearable\n              multiple\n              :color=\"'#250e81'\"\n              :density=\"'comfortable'\"\n              :hide-details=\"true\"\n              :label=\"'Add People'\"\n              :items=\"userList.filter(obj => obj['username'] !== user.username)\"\n              :item-title=\"(obj) => obj['first_name'] && obj['last_name'] ? `${obj['first_name']} ${obj['last_name']}` : obj['username']\"\n              :item-value=\"(obj) => obj['username']\"\n              :return-object=\"false\"\n              variant=\"outlined\"\n            />\n          </div>\n        </template>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          @click=\"createReviewTask\"\n        >\n          Create Task\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\n\nexport default {\n  name: 'CreateAnnotationReviewTaskModal',\n  components: {\n    Modal,\n  },\n  props: {\n    datasets: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  emits: ['review-task-created', 'review-task-created-error'],\n  data() {\n    return {\n      message: '',\n      reviewTaskInputName: '',\n      reviewTaskInputDescription: '',\n      types: [\n        {\n          name: 'Label',\n          type: 'label',\n        },\n        {\n          name: 'Audit',\n          type: 'audit',\n        },\n      ],\n      presetRole: 'default',\n      userList: [],\n      userInputValue: [],\n      srcDataset: '',\n      srcAnnotationSet: '',\n      destAnnotationSetName: null,\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    annotationSets() {\n      if (this.srcDataset && this.srcDataset.annotation_sets) {\n        return this.srcDataset.annotation_sets;\n      } else {\n        return [];\n      }\n    },\n    destAnnotationSets() {\n      if (this.annotationSets.length > 0 && Object.keys(this.srcAnnotationSet).length > 0) { // destination different from source annset\n        return this.annotationSets.filter((set) => set.id !== this.srcAnnotationSet.id).map((set) => set.name);\n      } else if (this.annotationSets.length > 0 && Object.keys(this.srcAnnotationSet).length === 0) { // label does not need source ann set\n        return this.annotationSets.map((set) => set.name);\n      } else {\n        return [];\n      }\n    },\n  },\n  async mounted() {\n    this.$refs.createAnnotationReviewModal.showModal();\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n    this.getUsersListByOrganization(this.user.organization_id);\n  },\n  methods: {\n    showModal() {\n      this.$refs.createAnnotationReviewModal.showModal();\n    },\n    async getUsersListByOrganization(id) {\n      await this.dataConnect.getUserListByOrganization({\n        organization_id: id,\n      })\n        .then((data) => {\n          if (data.result) {\n            this.userList = data.result;\n            this.userInputValue = [];\n          }\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    },\n    async createReviewTask() {\n      if (!this.srcDataset) {\n        this.message = 'Missing Source Dataset';\n        return;\n      }\n      if (!this.destAnnotationSetName) {\n        this.message = 'Missing Destination Annotation Set';\n        return;\n      }\n\n      let reviewTaskDestinationAnnotationSet = null;\n      const existingSet = this.annotationSets.find((e) => e.name === this.destAnnotationSetName);\n      if (this.destAnnotationSetName && !existingSet) {\n        reviewTaskDestinationAnnotationSet = await this.createAnnotationSet(this.destAnnotationSetName);\n      } else {\n        reviewTaskDestinationAnnotationSet = existingSet;\n      }\n\n      let inputName = '';\n      if (this.reviewTaskInputName === '') {\n        inputName = `${reviewTaskDestinationAnnotationSet.name.replace(/ /g, \"-\")}`;\n      } else {\n        inputName = this.reviewTaskInputName;\n      }\n\n      const params = {\n        type: 'audit',\n        source_annotation_set_id: null,\n        dest_annotation_set_id: reviewTaskDestinationAnnotationSet.id,\n        dataset_id: this.srcDataset.id,\n        name: inputName,\n        users: this.users,\n        description: this.reviewTaskInputDescription,\n      };\n\n      if (this.presetRole === 'user') {\n        params.usernames = [...this.userInputValue];\n        params.usernames.push(this.user.username);\n      }\n\n      if (Object.keys(this.srcAnnotationSet).length > 0) {\n        params['source_annotation_set_id'] = this.srcAnnotationSet.id;\n      }\n\n      const resp = await this.dataConnect.addReviewTask(params)\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        this.$emit('review-task-created-error', resp.error);\n      } else {\n        this.$emit('review-task-created');\n        this.$refs.createAnnotationReviewModal.closeModal();\n      }\n    },\n    async createAnnotationSet(annotationSetName) {\n      const annotationSetExists = this.annotationSets.map((set) => set.name).includes(annotationSetName);\n      if (!annotationSetExists) {\n        const resp = await this.dataConnect.createAnnotationSet({\n          name: annotationSetName,\n          description: `Review Task for the annotation set \"${annotationSetName}\"`,\n          operator: this.$store.state.user.user.username,\n          origin_x: 0,\n          origin_y: 0,\n          dataset_id: this.srcDataset.id,\n        })\n          .catch((error) => {\n          // TODO: handle error\n            console.log(error);\n          });\n        if (!resp || resp.error || !resp.result) {\n        // TODO: handle error\n          return null;\n        }\n        await this.refreshAnnotationSets();\n        return resp.result;\n      }\n      return this.annotationSets.find((set) => set.name === annotationSetName);\n    },\n\n    async refreshAnnotationSets() {\n      let sets = null;\n      const resp = await this.dataConnect.getAnnotationSets({\n        dataset_id: this.srcDataset.id,\n        get_num_annotations: true,\n        get_num_images: true,\n        get_labels: true,\n      })\n        .catch((error) => {\n          console.log('Failed to retrieve sets:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        sets = [];\n      }\n      sets = resp.result;\n      const index = this.getDatasetIndex(this.srcDataset);\n      this.$store.commit('datasets/setDatasetAnnotationSets', { index, sets });\n    },\n\n    getDatasetIndex(dataset) {\n      return this.datasets.indexOf(this.datasets.find((d) => d.id === dataset.id));\n    },\n    getReviewTaskAnnotationSetName(annotationSets, srcName) {\n      const annotationSetNames = annotationSets.map((set) => set.name);\n      let tempSrcName;\n      if (this.type === 'label') {\n        tempSrcName = `${srcName}-LABELING`;\n      } else if (this.type === 'audit') {\n        tempSrcName = `${srcName}-AUDIT`;\n      }\n      if (!annotationSetNames.includes(tempSrcName)) {\n        return tempSrcName;\n      }\n\n      let num = 1;\n      while (annotationSetNames.includes(`${tempSrcName} (${num})`)) {\n        num += 1;\n      }\n      return `${tempSrcName} (${num})`;\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 480px;\n  overflow-y: scroll;\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.dataset-selector{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  width: 100%;\n\n  select {\n    width: 200px;\n    margin-right: 20px;\n  }\n\n  button {\n    width: 350px;\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n.permission-list {\n  display: flex;\n  flex-direction: column !important;\n  width: 100%;\n\n  &__title {\n    margin: 5px 0 5px 0;\n    font-size: 1rem;\n    font-weight: 600;\n    color: rgba(rgb(0, 0, 0), 0.7);\n  }\n}\n\n.role-grid-single-row {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr;\n  grid-auto-rows: auto;\n}\n\n.chkbx-li {\n  display: flex;\n  flex-direction: column;\n  align-items: start;\n\n  &__subtitle {\n    text-align: left;\n    margin-left: 28px;\n    font-size: 0.85rem;\n    color: rgba(grey, 0.95);\n  }\n}\n\n.label-text {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin-left: 2px;\n  width: 200px;\n}\n\n:deep(.v-label) {\n  opacity: 1 !important;\n}\n\n.combobox {\n  width: 100%;\n  border-radius: 8px;\n}\n</style>\n","import { render } from \"./CreateAnnotationReviewTaskModal.vue?vue&type=template&id=4d029d45&scoped=true\"\nimport script from \"./CreateAnnotationReviewTaskModal.vue?vue&type=script&lang=js\"\nexport * from \"./CreateAnnotationReviewTaskModal.vue?vue&type=script&lang=js\"\n\nimport \"./CreateAnnotationReviewTaskModal.vue?vue&type=style&index=0&id=4d029d45&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d029d45\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"taskAccessModal\"\n    :title=\"modalTask ? modalTask.name : 'Manage Task Access'\"\n    :width=\"'700px'\"\n    @closed=\"resetData\"\n  >\n    <template #modal-main>\n      <div class=\"settings container\">\n        <div class=\"row mt-2\">\n          <div class=\"header-buttons\">\n            <button\n              class=\"button button-back\"\n              aria-label=\"Back\"\n              :title=\"'Back'\"\n              :class=\"{ 'invisible' : mode === 'users' }\"\n              @click=\"() => mode = 'users'\"\n            >\n              <SVGIcon\n                class=\"me-1\"\n                :iconName=\"'chevron_left'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Back</span>\n            </button>\n            <button\n              class=\"button button-mode\"\n              aria-label=\"Add Users\"\n              :title=\"'Add New Users'\"\n              :class=\"{ 'invisible' : mode === 'new' }\"\n              @click=\"() => mode = 'new'\"\n            >\n              <SVGIcon\n                class=\"me-1\"\n                :iconName=\"'person_add'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              <span>Add Users</span>\n            </button>\n          </div>\n        </div>\n        <div v-if=\"mode === 'users'\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <label class=\"label required\">Access Sharing</label>\n            <div class=\"value permission-list\">\n              <div class=\"role-grid-single-row\">\n                <v-radio-group\n                  v-model=\"shareMode\"\n                  :density=\"'compact'\"\n                  :hide-details=\"true\"\n                >\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"default\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Share with organization</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Everyone in your organization has access to this task.</span>\n                  </div>\n                  <div class=\"chkbx-li\">\n                    <v-radio value=\"custom\" color=\"#250E81\">\n                      <template #label>\n                        <div class=\"label-text\">Share with users</div>\n                      </template>\n                    </v-radio>\n                    <span class=\"chkbx-li__subtitle\">Only owner and selected users have access to this task.</span>\n                  </div>\n                </v-radio-group>\n              </div>\n            </div>\n          </div>\n        </div>\n        <template v-if=\"mode === 'users'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Users with access to this task</label>\n              <ul class=\"mt-1 users scrollbar\">\n                <li\n                  v-for=\"(user, index) in taskAccessList\"\n                  :key=\"index\"\n                  class=\"users__list-item\"\n                >\n                  <div class=\"users__container\" :class=\"{ 'slashed': remove.indexOf(user.username) > -1 }\">\n                    <div class=\"users__icon\">\n                      <UserIcon\n                        v-if=\"user.username\"\n                        :user=\"user\"\n                        :size=\"'32px'\"\n                      />\n                    </div>\n                    <div class=\"users__content\">\n                      <span class=\"users__username\">{{ user.first_name && user.last_name ? `${user.first_name} ${user.last_name}` : user.username }}</span>\n                      <span class=\"users__email\">{{ user.email }}</span>\n                    </div>\n                    <template v-if=\"(user.username === currentUser.username )\">\n                      <div class=\"users__role\">\n                        <template v-if=\"user.annotator_read && !user.annotator_write\">\n                          <SVGIcon\n                            :iconName=\"'visibility'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Viewer</span>\n                        </template>\n                        <template v-else-if=\"user.annotator_write\">\n                          <SVGIcon\n                            :iconName=\"'edit'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"role-icon\"\n                          />\n                          <span>Editor</span>\n                        </template>\n                      </div>\n                    </template>\n                    <template v-else>\n                      <BaseMenu\n                        :placement=\"'bottom-end'\"\n                        :appendToBody=\"true\"\n                      >\n                        <div class=\"users__role editable\">\n                          <template v-if=\"user.annotator_read && !user.annotator_write\">\n                            <SVGIcon\n                              :iconName=\"'visibility'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Viewer</span>\n                          </template>\n                          <template v-else-if=\"user.annotator_write\">\n                            <SVGIcon\n                              :iconName=\"'edit'\"\n                              :width=\"'18px'\"\n                              :height=\"'18px'\"\n                              class=\"role-icon\"\n                            />\n                            <span>Editor</span>\n                          </template>\n                          <SVGIcon\n                            :iconName=\"'chevron_left'\"\n                            :width=\"'18px'\"\n                            :height=\"'18px'\"\n                            class=\"dropdown-role\"\n                          />\n                        </div>\n                        <template #menu=\"{closeMenu}\">\n                          <ul>\n                            <li>\n                              <BaseMenuButton class=\"_danger\" @click.stop=\"toggleRemoveAccess(user.username), closeMenu()\">\n                                <template v-if=\"remove.indexOf(user.username) > -1\">\n                                  <SVGIcon\n                                    :iconName=\"'close'\"\n                                    :width=\"'22px'\"\n                                    :height=\"'22px'\"\n                                  />\n                                  <span>Cancel</span>\n                                </template>\n                                <template v-else>\n                                  <SVGIcon\n                                    :iconName=\"'trash'\"\n                                    :width=\"'22px'\"\n                                    :height=\"'22px'\"\n                                  />\n                                  <span>Remove Access</span>\n                                </template>\n                              </BaseMenuButton>\n                            </li>\n                          </ul>\n                        </template>\n                      </BaseMenu>\n                    </template>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </template>\n        <template v-else-if=\"mode === 'new'\">\n          <div class=\"row mt-3\">\n            <div class=\"col-12 settings__control-group\">\n              <label>Add users by name or e-mail.</label>\n            </div>\n          </div>\n          <div class=\"row\">\n            <v-combobox\n              v-model=\"userInputValue\"\n              class=\"combobox\"\n              chips\n              clearable\n              multiple\n              :density=\"'comfortable'\"\n              :hide-details=\"true\"\n              :label=\"'Add People'\"\n              :items=\"formatOrgUserListObject\"\n              :item-title=\"(obj) => obj['username']\"\n              :item-value=\"(obj) => obj['username']\"\n              :return-object=\"false\"\n              variant=\"outlined\"\n            />\n          </div>\n        </template>\n        <div v-if=\"message\" class=\"row mt-2\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          v-if=\"mode === 'users'\"\n          class=\"button modal-action-button\"\n          :disabled=\"!hasRemoved && !hasAccessModeChange\"\n          @click=\"confirmChanges\"\n        >\n          Confirm\n        </button>\n        <button\n          v-else-if=\"mode === 'new'\"\n          class=\"button modal-action-button\"\n          @click=\"addAccess\"\n        >\n          Add Users\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport { deepCompare } from '@/assets/js/utils.js';\nimport UserIcon from '@/components/UserIcon.vue';\n\nexport default {\n  name: 'TaskAccessModal',\n  components: {\n    Modal,\n    SVGIcon,\n    BaseMenu,\n    BaseMenuButton,\n    UserIcon,\n  },\n  props: {\n    modalTask: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  emits: ['refresh-tasks'],\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      mode: 'users',\n      openedDropdowns: [],\n      taskAccessList: [],\n      orgUserList: [],\n      userInputValue: [],\n      remove: [],\n      message: '',\n      shareMode: 'default',\n    };\n  },\n  computed: {\n    currentUser() {\n      return this.$store.state.user.user;\n    },\n    formatOrgUserListObject() {\n      if (this.orgUserList.length > 0) {\n        const temp = this.orgUserList.map((e) => ({ username: e.username, email: e.email }));\n        return temp.filter((e) => this.taskAccessList.find((el) => el.username === e.username) === undefined);\n      } else {\n        return [];\n      }\n    },\n    hasRemoved() {\n      if (this.remove.length > 0) {\n        return true;\n      }\n      return false;\n    },\n    hasAccessModeChange() {\n      if (this.originalShareMode !== this.shareMode) {\n        return true;\n      }\n      return false;\n    },\n  },\n  watch: {\n    shareMode(r) {\n      if (r === 'default') {\n        this.mode = 'users';\n      }\n    },\n    role_writer(value) {\n      if (value) {\n        this.role_viewer = true;\n      }\n    },\n    modalTask: {\n      immediate: true,\n      handler() {\n        this.shareMode = this.modalTask ? this.modalTask.permission_type : 'default';\n        this.originalShareMode = this.modalTask ? this.modalTask.permission_type : 'default';\n      },\n    },\n  },\n  async mounted() {\n    if (this.currentUser) {\n      this.orgUserList = await this.getUsersListByOrganization(this.currentUser.organization_id);\n    }\n  },\n  methods: {\n    deepCompare,\n    toggleRemoveAccess(username) {\n      const index = this.remove.indexOf(username);\n      if (index < 0) {\n        this.remove.push(username);\n      } else {\n        this.remove.splice(index, 1);\n      }\n    },\n    showModal() {\n      this.$refs.taskAccessModal.showModal();\n      this.getReviewTaskAccessList();\n    },\n    closeModal() {\n      this.resetData();\n    },\n    resetData() {\n      this.taskAccessList = [];\n      this.userInputValue = [];\n      this.openedDropdowns = [];\n      this.message = \"\";\n      this.remove = [];\n      this.mode = 'users';\n    },\n    async getUsersListByOrganization(id) {\n      const resp = await this.dsConn.getUserListByOrganization({\n        organization_id: id,\n      })\n        .catch((error) => {\n          console.log(error);\n        });\n      if (resp.error || !resp.result) {\n        return [];\n      }\n      return resp.result;\n    },\n    async getReviewTaskAccessList() {\n      if (this.modalTask) {\n        await this.dsConn.getReviewTaskAccessList({ review_task_id: this.modalTask.id })\n          .then((data) => {\n            if (data.result) {\n              this.taskAccessList = data.result;\n            } else {\n              this.resetData();\n            }\n          })\n          .catch((e) => {\n            console.log(e);\n          });\n      }\n    },\n    async confirmChanges() {\n      this.message = \"\";\n      const promises = [];\n      const deleted_ids = [];\n      this.taskAccessList.filter((e) => this.remove.indexOf(e.username) > -1).forEach((task_access, index) => {\n        deleted_ids.push(task_access.username);\n      });\n\n      if (deleted_ids.length > 0) {\n        promises.push(this.deleteReviewTaskAccess(deleted_ids));\n      }\n\n      if (this.hasAccessModeChange && this.shareMode === 'default') {\n        promises.push(this.revertReviewTaskAccessToDefault());\n      }\n\n      await Promise.all(promises)\n        .then(async () => {\n          this.getReviewTaskAccessList();\n          this.remove = [];\n          this.$emit('refresh-tasks');\n        });\n    },\n    async revertReviewTaskAccessToDefault() {\n      await this.dsConn.revertReviewTaskAccessToDefault({\n        review_task_id: this.modalTask.id,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async deleteReviewTaskAccess(review_task_access_usernames) {\n      await this.dsConn.deleteReviewTaskAccess({\n        review_task_id: this.modalTask.id,\n        review_task_access_usernames,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.mode = 'users';\n          }\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n    async addAccess() {\n      this.message = \"\";\n      const nameMap = this.taskAccessList.map((e) => e.username);\n      const overlap = this.userInputValue.some((r) => nameMap.includes(r));\n      if (this.userInputValue.length === 0) {\n        this.message = \"Please select one or more users.\";\n        return;\n      }\n      if (overlap) {\n        this.message = \"One or more users already has access to this project.\";\n        return;\n      }\n\n      await this.dsConn.addReviewTaskAccess({\n        review_task_id: this.modalTask.id,\n        usernames: this.userInputValue,\n      })\n        .then((data) => {\n          if (!data.result || data.error) {\n            this.message = data.error.message;\n          } else {\n            this.userInputValue = [];\n            this.getReviewTaskAccessList();\n            this.mode = 'users';\n          }\n          this.remove = [];\n          this.$emit('refresh-tasks');\n        })\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n    },\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 480px;\n  overflow: visible;\n}\n\n.header-buttons{\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n\n  .invisible {\n    visibility: hidden;\n  }\n}\n\n.combobox {\n  margin: 1px 0;\n  width: 100%;\n  padding-top: 8px;\n  border-radius: 8px;\n}\n\n.users {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  list-style: none;\n  width: 100%;\n  max-height: 450px;\n  padding: 0 15px 0 15px;\n  margin: 0;\n  overflow-y: scroll;\n\n  &__list-item {\n    margin: 0px -8px;\n    padding: 4px 8px;\n\n    &:hover {\n      background: var(--hover-background);\n    }\n  }\n\n  &__container {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n  }\n\n  &__icon {\n    padding-right: 16px;\n  }\n\n  &__initials {\n    display: flex;\n    flex: 0 0 auto;\n    width: 32px;\n    height: 32px;\n    // cursor: pointer;\n    border: none;\n    border-radius: 50%;\n    background: #053c8f;\n    color: white;\n    justify-content: center;\n    align-items: center;\n  }\n\n  &__content {\n    display: flex;\n    flex-direction: column;\n    text-align: left;\n    flex: 1 1 auto;\n  }\n\n  &__username {\n    font-weight: 600;\n    font-size: 16px;\n  }\n\n  &__email {\n    font-weight: 400;\n    font-size: 12px;\n  }\n\n  &__role {\n    border-radius: 32px;\n    height: 34px;\n    width: 100px;\n    padding: 2px 0 2px 2px;\n    font-size: 0.9rem;\n    font-weight: 600;\n    display: flex;\n    align-items: center;\n    justify-content: flex-end;\n  }\n\n  .slashed {\n    position: relative;\n  }\n\n  .slashed::after {\n    content: \"\";\n    position: absolute;\n    width: 100%;\n    height: 1px;\n    top: 50%;\n    left: -10px;\n    background: var(--color-red-600);\n  }\n\n  .dropdown-role{\n    margin-left: 5px;\n  }\n\n  .editable {\n    .dropdown-role {\n        transform: rotate(-90deg);\n      }\n  }\n\n  .editable:hover {\n    padding: 2px 0 2px 2px;\n    background: rgba(185, 184, 184, 0.5);\n    cursor: pointer;\n  }\n\n  .role-icon {\n    margin-right: 5px;\n  }\n}\n\n.italic {\n  font-style: italic;\n}\n\n.removing {\n  font-weight: 600;\n  @include themify() {\n    color: themed('color-red-600');\n  }\n}\n\n.button-mode {\n  background: none;\n  height: 35px;\n  color: var(--body-text-color);\n  padding: 10px 10px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  text-transform: capitalize;\n  font-size: 0.9rem;\n  font-weight: 550;\n  border: 1px solid rgb(76, 76, 76);\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n\n  &.active {\n    border: 1px solid transparent;\n    background: var(--color-primary);\n    color: var(--button-text-color);\n  }\n}\n\n.button-back {\n  background: none;\n  color: var(--body-text-color);\n  padding: 10px 6px;\n  justify-content: center;\n  display: flex;\n  align-items: center;\n  box-shadow: none;\n  margin: 4px;\n  border-radius: 4px;\n  text-transform: capitalize;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n\n  &:hover {\n    background: var(--color-primary-200);\n  }\n}\n\n.remove-row {\n  justify-content: flex-end;\n  &__button {\n    font-weight: 600;\n    font-size: 14px;\n    width: fit-content;\n    margin-right: 5px;\n    border-radius: 20px;\n    padding: 2px 5px 2px 5px;\n    color: var(--color-red-600);\n    border: 1px solid var(--color-red-600);\n\n    &:hover{\n      cursor: pointer;\n      background: rgba(red, 0.1);\n    }\n  }\n}\n\n.row {\n  flex-wrap: nowrap !important;\n}\n\n.row > .label {\n  display: flex;\n  justify-content: end;\n  align-items: start;\n  width: 130px;\n  margin-top: 10px;\n  text-align: right;\n  font-size: 0.9rem;\n  font-weight: 600;\n\n}\n\n.row > .value {\n  display: flex;\n  flex-direction: row;\n  flex: 1 1 auto;\n  font-size: 0.9rem;\n  margin-left: 20px;\n}\n\n.role-grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr 1fr;\n  grid-auto-rows: auto;\n  width: 100%;\n}\n\n.role-grid-single-row {\n  display: grid;\n  grid-gap: 10px;\n  grid-template-columns: 1fr;\n  grid-auto-rows: auto;\n\n  .label-text {\n    width: 200px;\n  }\n}\n\n.permission-list {\n  display: flex;\n  flex-direction: column !important;\n  width: 100%;\n\n  &__title {\n    margin: 5px 0 5px 0;\n    font-size: 1rem;\n    font-weight: 600;\n    color: rgba(rgb(0, 0, 0), 0.7);\n  }\n}\n\n.chkbx-li {\n  display: flex;\n  flex-direction: column;\n  align-items: start;\n\n  &__subtitle {\n    text-align: left;\n    margin-left: 30px;\n    font-size: 0.85rem;\n    color: rgba(grey, 0.95);\n  }\n}\n\n.chkbx-li +.chkbx-li {\n  margin-top: 10px;\n}\n\n.label-text {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin-left: 2px;\n  width: 100px;\n}\n\n:deep() {\n  .v-label {\n    opacity: 1 !important;\n  }\n  .v-expansion-panel:not(:first-child)::after {\n    border-style: none;\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 10px;\n  }\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n</style>\n","import { render } from \"./ManageReviewsAccess.vue?vue&type=template&id=544a6f72&scoped=true\"\nimport script from \"./ManageReviewsAccess.vue?vue&type=script&lang=js\"\nexport * from \"./ManageReviewsAccess.vue?vue&type=script&lang=js\"\n\nimport \"./ManageReviewsAccess.vue?vue&type=style&index=0&id=544a6f72&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-544a6f72\"]])\n\nexport default __exports__","import { render } from \"./ReviewsTab.vue?vue&type=template&id=7260d1da&scoped=true\"\nimport script from \"./ReviewsTab.vue?vue&type=script&lang=js\"\nexport * from \"./ReviewsTab.vue?vue&type=script&lang=js\"\n\nimport \"./ReviewsTab.vue?vue&type=style&index=0&id=7260d1da&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7260d1da\"]])\n\nexport default __exports__","import { render } from \"./TaskBoard.vue?vue&type=template&id=618e7d98&scoped=true\"\nimport script from \"./TaskBoard.vue?vue&type=script&lang=js\"\nexport * from \"./TaskBoard.vue?vue&type=script&lang=js\"\n\nimport \"./TaskBoard.vue?vue&type=style&index=0&id=618e7d98&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-618e7d98\"]])\n\nexport default __exports__","<template>\n  <router-view />\n</template>\n\n<script setup>\nimport {\n  onBeforeMount, onUnmounted,\n} from 'vue';\nimport useGallery from '@/composables/annotationTool/useGallery.js';\n\nconst {\n  $reset,\n} = useGallery();\n\nonBeforeMount(() => {\n  $reset();\n});\n\nonUnmounted(() => {\n  $reset();\n});\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n","import script from \"./GalleryLandingPage.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./GalleryLandingPage.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <HeaderDve ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n    </HeaderDve>\n    <div class=\"main-page-div\">\n      <div class=\"filter-sidebar\">\n        <div class=\"filter-sidebar__container\">\n          <ul>\n            <li class=\"filter-sidebar__item chkbox-list scrollbar\">\n              <span class=\"title\">Item Type</span>\n              <div class=\"type-clear-all\" @click=\"toggleTypes\"><span>{{ selectedTypes.length > 0 ? 'Clear All' : 'Select All' }}</span></div>\n              <div\n                v-for=\"(s, i) in types\"\n                :key=\"`type-checkbox-${i}`\"\n              >\n                <div class=\"chkbx-li\">\n                  <div class=\"label-icon\" @click.stop.prevent=\"selectType(s.value)\">\n                    <SVGIcon\n                      :iconName=\"s.icon\"\n                      :width=\"'20px'\"\n                      :height=\"'20px'\"\n                    />\n                    <div class=\"text\">\n                      {{ s.name }}\n                    </div>\n                  </div>\n                  <div class=\"checkbox\">\n                    <v-checkbox\n                      v-model=\"selectedTypes\"\n                      :value=\"s.value\"\n                      :hide-details=\"true\"\n                      density=\"compact\"\n                    />\n                  </div>\n                </div>\n              </div>\n            </li>\n          </ul>\n          <ul>\n            <li class=\"filter-sidebar__item chkbox-list scrollbar\">\n              <span class=\"title\">Date Removed</span>\n              <div\n                v-for=\"(s, i) in dates\"\n                :key=\"`type-checkbox-${i}`\"\n              >\n                <div class=\"chkbx-li\">\n                  <div class=\"label-icon\" @click.stop.prevent=\"selectDate(s.value)\">\n                    <div class=\"text\">\n                      {{ s.name }}\n                    </div>\n                  </div>\n                  <div class=\"checkbox\">\n                    <v-checkbox\n                      v-model=\"selectedDate\"\n                      :value=\"s.value\"\n                      :hide-details=\"true\"\n                      density=\"compact\"\n                    />\n                  </div>\n                </div>\n              </div>\n            </li>\n          </ul>\n        </div>\n      </div>\n      <main class=\"main-display-area\">\n        <div class=\"recycle-header\">\n          <h3>Recycled Items ({{ items.length }})</h3>\n          <div class=\"actions\">\n            <button\n              class=\"button\"\n              :disabled=\"selectedItems.length === 0\"\n              @click=\"handleRestoreAll\"\n            >\n              <SVGIcon\n                :iconName=\"'restore'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              Restore\n            </button>\n            <button\n              class=\"button delete\"\n              :disabled=\"selectedItems.length === 0\"\n              @click=\"handleDeleteAll\"\n            >\n              <SVGIcon\n                :iconName=\"'trash'\"\n                :width=\"'18px'\"\n                :height=\"'18px'\"\n              />\n              Delete\n            </button>\n          </div>\n        </div>\n        <div class=\"data-table scrollbar\">\n          <v-data-table\n            :headers=\"headers\"\n            :items=\"items\"\n            :items-per-page=\"-1\"\n            fixed-header\n            density=\"comfortable\"\n          >\n            <template #headers=\"{ columns }\">\n              <tr>\n                <template v-for=\"column in columns\" :key=\"column.key\">\n                  <th class=\"th2\">\n                    <template v-if=\"column.key === 'date_removed'\">\n                      <span class=\"mr-2 cursor-pointer\" @click=\"() => sortDateAsc = !sortDateAsc\">\n                        {{ column.title }}\n                        <v-icon size=\"16px\" :icon=\"getSortIcon()\" />\n                      </span>\n                    </template>\n                    <template v-else-if=\"column.key === 'select'\">\n                      <div class=\"select-all checkbox\">\n                        <v-checkbox\n                          v-model=\"selectAll\"\n                          :hide-details=\"true\"\n                          density=\"compact\"\n                          :disabled=\"items && items.length === 0\"\n                          @input=\"handleSelectAllClicked\"\n                        />\n                      </div>\n                    </template>\n                    <template v-else>\n                      <span class=\"mr-2 \">{{ column.title }}</span>\n                    </template>\n                  </th>\n                </template>\n              </tr>\n            </template>\n            <template #[`header.select`]>\n              <div class=\"select-all checkbox\">\n                <v-checkbox\n                  v-model=\"selectAll\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  :disabled=\"items && items.length === 0\"\n                  @input=\"handleSelectAllClicked\"\n                />\n              </div>\n            </template>\n            <template v-for=\"(header, i) in headers\" :key=\"i\" #[`item.${header.key}`]=\"{ item }\">\n              <template v-if=\"header.key ==='description'\">\n                <div class=\"label-icon\" :title=\"item[header.key]\">\n                  <SVGIcon\n                    :iconName=\"item.icon\"\n                    :width=\"'24px'\"\n                    :height=\"'24px'\"\n                    class=\"data-table-icon\"\n                  />\n                  <div class=\"text\">\n                    {{ item[header.key] }}\n                  </div>\n                </div>\n              </template>\n              <template v-else-if=\"header.key ==='select'\">\n                <div class=\"select-all checkbox\">\n                  <v-checkbox\n                    v-model=\"selectedItems\"\n                    :hide-details=\"true\"\n                    density=\"compact\"\n                    :value=\"item\"\n                  />\n                </div>\n              </template>\n              <template v-else-if=\"header.key ==='actions'\">\n                <div class=\"action-icons-container\">\n                  <div :title=\"`Restore ${item['description']}`\">\n                    <SVGIcon\n                      class=\"action-icon\"\n                      :iconName=\"'restore'\"\n                      :width=\"'24px'\"\n                      :height=\"'24px'\"\n                      @click.stop=\"undelete(item)\"\n                    />\n                  </div>\n                  <div :title=\"`Permanently remove ${item['description']}`\">\n                    <SVGIcon\n                      class=\"action-icon\"\n                      :iconName=\"'trash'\"\n                      :width=\"'24px'\"\n                      :height=\"'24px'\"\n                      @click.stop=\"confirmPurge(item)\"\n                    />\n                  </div>\n                </div>\n              </template>\n              <template v-else>\n                {{ item[header.key] }}\n              </template>\n            </template>\n            <template #bottom />\n          </v-data-table>\n        </div>\n      </main>\n    </div>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport HeaderDve from '@/components/Header.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\n\nexport default {\n  name: 'RecycleBin',\n  components: {\n    HeaderDve,\n    BreadcrumbNavigation,\n    SVGIcon,\n    ConfirmModal,\n  },\n  data() {\n    return {\n      dsConn: new DatastoreConnect(this.$store.state.enterpriseServerUrl),\n      types: [\n        {\n          name: \"Project\",\n          value: \"project\",\n          icon: \"folder\",\n        },\n        {\n          name: \"Dataset\",\n          value: \"dataset\",\n          icon: \"database2\",\n        },\n        {\n          name: \"Annotation Set\",\n          value: \"annset\",\n          icon: \"set\",\n\n        },\n        {\n          name: \"Train Experiment\",\n          value: \"experiment\",\n          icon: \"science\",\n        },\n        {\n          name: \"Train Session\",\n          value: \"train-session\",\n          icon: \"train\",\n        },\n        {\n          name: \"Automated Task\",\n          value: \"auto-task\",\n          icon: \"auto_annotate\",\n        },\n        {\n          name: \"Validate Session\",\n          value: \"validate\",\n          icon: \"compare\",\n        },\n      ],\n      selectedTypes: [],\n      dates: [\n        {\n          name: \"Today\",\n          value: \"today\",\n        },\n        {\n          name: \"7 Days\",\n          value: \"7d\",\n        },\n        {\n          name: \"30 Days\",\n          value: \"30d\",\n        },\n        {\n          name: \"Current Month\",\n          value: \"current-month\",\n        },\n        {\n          name: \"Current Year\",\n          value: \"current-year\",\n        },\n        {\n          name: \"All Time\",\n          value: \"all-time\",\n        },\n      ],\n      selectedDate: \"all-time\",\n      sortDateAsc: false,\n      headers: [\n        {\n          title: 'selection', key: 'select', width: '1%', align: 'start',\n        },\n        {\n          title: 'Description', key: 'description', width: '35%', align: 'start',\n        },\n        {\n          title: 'Project', key: 'project', width: '30%', align: 'start',\n        },\n        {\n          title: 'Date Removed', key: 'date_removed', sortable: true, width: '25%', align: 'start',\n        },\n        {\n          title: '', key: 'actions', width: '10%', align: 'end',\n        },\n      ],\n      items: [],\n      userList: [],\n      controller: new AbortController(),\n      confirmMessage: null,\n      confirmMessageHeader: null,\n      confirmFunction: null,\n      buttonText: 'Purge',\n      selectAll: false,\n      selectedItems: [],\n    };\n  },\n  computed: {\n    user() {\n      return this.$store.state.user.user;\n    },\n    projectList() {\n      return this.$store.state.projects.projectList;\n    },\n  },\n  watch: {\n    selectedDate() {\n      this.listDeletedItems();\n    },\n    selectedTypes() {\n      this.listDeletedItems();\n    },\n    sortDateAsc(val) {\n      this.sortByDate(val);\n    },\n    selectedItems() {\n      if (this.selectedItems.length > 0 && this.selectedItems.length === this.items.length) {\n        this.selectAll = true;\n      } else {\n        this.selectAll = false;\n      }\n    },\n    items(i) {\n      if (i && i.length === 0) {\n        this.selectAll = false;\n      }\n    },\n  },\n  created() {\n    this.types.forEach((t) => {\n      this.selectedTypes.push(t.value);\n    });\n    this.getUserList();\n    this.listDeletedItems();\n  },\n  methods: {\n    getSortIcon() {\n      return this.sortDateAsc ? 'mdi-arrow-up' : 'mdi-arrow-down';\n    },\n    handleSelectAllClicked() {\n      if (this.selectAll) {\n        this.selectedItems = this.items;\n      } else {\n        this.selectedItems = [];\n      }\n    },\n    sortByDate(val) {\n      const temp = [...this.items];\n      if (val) {\n        temp.sort((a, b) => new Date(a.date_removed) - new Date(b.date_removed));\n      } else {\n        temp.sort((a, b) => new Date(b.date_removed) - new Date(a.date_removed));\n      }\n      this.items = [...temp];\n    },\n    async listDeletedItems() {\n      let deleted_start = \"\";\n      let deleted_end = \"\";\n      let current = new Date();\n\n      switch (this.selectedDate) {\n      case 'today':\n        deleted_end = current.toISOString();\n        current.setHours(0, 0, 0, 0);\n        deleted_start = current.toISOString();\n        break;\n      case '7d':\n        deleted_end = current.toISOString();\n        current.setDate(current.getDate() - 7);\n        deleted_start = current.toISOString();\n        break;\n      case '30d':\n        deleted_end = current.toISOString();\n        current.setDate(current.getDate() - 30);\n        deleted_start = current.toISOString();\n        break;\n      case 'current-month':\n        deleted_end = current.toISOString();\n        current.setDate(1);\n        current.setHours(0, 0, 0, 0);\n        deleted_start = current.toISOString();\n        break;\n      case 'current-year':\n        deleted_end = current.toISOString();\n        current = new Date(Date.UTC(current.getFullYear(), 0, 1));\n        current.setHours(0, 0, 0, 0);\n        deleted_start = current.toISOString();\n        break;\n      case 'all-time':\n        deleted_end = current.toISOString();\n        deleted_start = (new Date(Date.UTC(0))).toISOString();\n        break;\n      default:\n      }\n      this.controller.abort();\n      this.controller = new AbortController();\n      const currentController = this.controller;\n\n      await this.dsConn.getListOfRecycledItems({\n        types: this.selectedTypes,\n        deleted_start,\n        deleted_end,\n      }, currentController.signal).then((data) => {\n        if (data.result) {\n          this.parseData(data.result);\n        }\n      }).catch((e) => console.log(e));\n    },\n    parseData(data) {\n      this.items = [];\n      data['projects'].forEach((project) => {\n        this.items.push({\n          icon: 'folder',\n          type: 'project',\n          id: this.encode(project.id, 'project'),\n          description: project.name,\n          project: project.name,\n          date_removed: this.formatTime(project.deleted),\n        });\n      });\n      data['datasets'].forEach((dataset) => {\n        this.items.push({\n          icon: 'database2',\n          type: 'dataset',\n          id: this.encode(dataset.id, 'dataset'),\n          description: dataset.name,\n          project: this.findProjectNameById(dataset.project_id),\n          date_removed: this.formatTime(dataset.deleted),\n        });\n      });\n      data['annotation_sets'].forEach((annset) => {\n        this.items.push({\n          icon: 'set',\n          type: 'annset',\n          id: this.encode(annset.id, 'annotation set'),\n          description: annset.name,\n          project: this.findProjectNameById(annset.project_id),\n          date_removed: this.formatTime(annset.deleted),\n        });\n      });\n      data['experiments'].forEach((exp) => {\n        this.items.push({\n          icon: 'science',\n          type: 'experiment',\n          id: this.encode(exp.id, 'experiment'),\n          description: exp.name,\n          project: this.findProjectNameById(exp.project_id),\n          date_removed: this.formatTime(exp.deleted),\n        });\n      });\n      data['training_sessions'].forEach((session) => {\n        this.items.push({\n          icon: 'train',\n          type: 'train-session',\n          id: this.encode(session.id, 'trainer'),\n          description: session.name,\n          project: this.findProjectNameById(session.project_id),\n          date_removed: this.formatTime(session.deleted),\n        });\n      });\n      data['automated_tasks'].forEach((task) => {\n        this.items.push({\n          icon: 'auto_annotate',\n          type: 'auto-task',\n          id: this.encode(task.id, 'auto annotation'),\n          description: task.name,\n          project: this.findProjectNameById(task.project_id),\n          date_removed: this.formatTime(task.deleted),\n        });\n      });\n      data['validate_sessions'].forEach((session) => {\n        this.items.push({\n          icon: 'compare',\n          type: 'validate',\n          id: this.encode(session.id, 'validator'),\n          description: session.docker_task ? session.docker_task.name : `Validation ${this.encode(session.id, 'validator')}`,\n          project: this.findProjectNameById(session.project_id),\n          date_removed: this.formatTime(session.deleted),\n        });\n      });\n      this.sortByDate(this.sortDateAsc);\n    },\n    encode(id, type) {\n      if (id && type) {\n        let prefix = '';\n        switch (type) {\n        case 'dataset':\n          prefix = 'ds';\n          break;\n        case 'annotation set':\n          prefix = 'as';\n          break;\n        case 'annotation':\n          prefix = 'a';\n          break;\n        case 'image':\n          prefix = 'i';\n          break;\n        case 'experiment':\n          prefix = 'e';\n          break;\n        case 'trainer':\n          prefix = 't';\n          break;\n        case 'validator':\n          prefix = 'v';\n          break;\n        case 'project':\n          prefix = 'p';\n          break;\n        case 'auto annotation':\n          prefix = 'inf';\n          break;\n        default:\n          prefix = '';\n        }\n        let result = '';\n        if (prefix !== '') {\n          result = `${prefix}-${Number(id).toString(16)}`;\n        } else {\n          result = Number(id).toString(16);\n        }\n\n        return result;\n      }\n      return '';\n    },\n    decode(id) {\n      if (typeof id === 'number') {\n        return id;\n      } else {\n        const valueHex = id.split(\"-\")[1];\n        const value = parseInt(valueHex, 16);\n        return value;\n      }\n    },\n    async getUserList() {\n      await this.dsConn.getUserListByOrganization({ organization_id: this.user.organization_id })\n        .then((data) => {\n          if (data.result) {\n            this.userList = data.result.reverse();\n          }\n        }).catch((e) => console.log(e));\n    },\n    findProjectNameById(id) {\n      if (this.projectList && this.projectList.length > 0) {\n        const project = this.projectList.find((e) => e.id === id);\n        if (project) {\n          return project.name;\n        } else {\n          return \"\";\n        }\n      } else { return \"\"; }\n    },\n    toggleTypes() {\n      if (this.selectedTypes.length > 0) {\n        this.selectedTypes = [];\n      } else {\n        const notIn = this.types.filter((e) => !this.selectedTypes.includes(e.value)).map((e) => e.value);\n        this.selectedTypes = this.selectedTypes.concat(notIn);\n      }\n    },\n    formatTime(str) {\n      return `${new Date(str).toLocaleTimeString('default', {\n        year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n      })}`;\n    },\n    async undelete(item) {\n      await this.dsConn.undeleteRecycledItem({\n        type: item.type,\n        item_id: item.id,\n      })\n        .then(() => {\n          this.listDeletedItems();\n        });\n    },\n    async purge(item) {\n      const id = this.decode(item.id);\n      await this.dsConn.purgeRecycledItem({\n        type: item.type,\n        item_id: id,\n      })\n        .then(() => {\n          this.listDeletedItems();\n        });\n    },\n    selectType(str) {\n      const index = this.selectedTypes.indexOf(str);\n      if (index !== -1) {\n        this.selectedTypes = this.selectedTypes.filter((type) => type !== str);\n      } else {\n        this.selectedTypes.push(str);\n      }\n    },\n    selectDate(str) {\n      this.selectedDate = str;\n    },\n    confirmPurge(item) {\n      this.confirmMessage = `Are you sure you want to permanently remove '${item.description}'?`;\n      this.confirmMessageHeader = 'Remove Item';\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.purge(item);\n      };\n    },\n    handleDeleteAll() {\n      this.confirmMessage = `Are you sure you want to permanently remove all ${this.selectedItems.length} item(s)?`;\n      this.confirmMessageHeader = 'Remove All';\n      this.buttonText = 'Remove';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.deleteAll();\n      };\n    },\n    deleteAll() {\n      this.selectedItems.forEach((item) => {\n        this.purge(item);\n      });\n      this.selectAll = false;\n    },\n    handleRestoreAll() {\n      this.confirmMessage = `Are you sure you want to restore all ${this.selectedItems.length} item(s)?`;\n      this.confirmMessageHeader = 'Restore All';\n      this.buttonText = 'Restore';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.restoreAll();\n      };\n    },\n    restoreAll() {\n      this.selectedItems.forEach((item) => {\n        this.undelete(item);\n      });\n      this.selectAll = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.filter-sidebar {\n  min-width: 250px;\n  width: 250px;\n  @include themify() {\n    background-color: themed('background-light-gray');\n  };\n  padding: 10px 10px 30px 10px;\n\n  &__container {\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 auto;\n    height: 100%;\n    padding: 0 10px 0 10px;\n\n    ul {\n      list-style-type: none;\n    }\n\n    ul + ul {\n      margin-top: 10px;\n    }\n\n    li {\n      display: flex;\n      flex-direction: row;\n      margin-top: 2px;\n      margin-bottom: 2px;\n      font-size: 0.9rem;\n      padding: 4px;\n      border-radius: 4px;\n    }\n  }\n\n  &__item{\n    display: flex;\n    flex-direction: column;\n    color: var(--color-black) !important;\n  }\n\n  .chkbox-list {\n      display: flex;\n      flex-direction: column;\n      flex: 1 1 50%;\n      margin: 0;\n\n      .title {\n        font-size: 1.1rem;\n      }\n\n      .type-clear-all {\n        display: flex;\n        flex-direction: row-reverse;\n        margin-top: 5px;\n        span {\n          font-size: 0.85rem;\n          color: var(--color-primary);\n          cursor: pointer;\n        }\n      }\n\n      .chkbx-li {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: space-between;\n        height: 35px;\n      }\n\n      .checkbox {\n        width: 28px;\n        max-width: 28px;\n      }\n\n    }\n}\n\n.label-icon {\n  display: flex;\n  flex-direction: row;\n  cursor: pointer;\n  align-items: center;\n  color: var(--color-black) !important;\n\n  :nth-child(2) {\n    margin-left: 5px;\n  }\n\n  .text {\n    font-size: 0.9rem;\n  }\n\n  .data-table-icon {\n    width: 24px;\n    min-width: 24px;\n  }\n}\n\n.action-icons-container {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  visibility: hidden;\n  cursor: pointer;\n\n  :nth-child(1) + :nth-child(2) {\n    margin-left: 10px;\n  }\n\n  .action-icon {\n    @include themify() {\n      color: themed('body-text-color-secondary');\n    }\n  }\n\n  .action-icon:hover {\n    @include themify() {\n      color: themed('color-primary');\n      background: themed('icon-hover-color');\n      border-radius: 100%;\n      box-shadow: 0 0 0 4px themed('icon-hover-color');\n    }\n  }\n}\n\n.select-all {\n  display: flex;\n  flex-direction: row;\n  width: 15px;\n}\n\n.date_removed {\n  display: flex;\n  flex-direction: row;\n\n  .sort-icon {\n    margin-left: 5px;\n    cursor: pointer;\n\n    &.desc{\n      transform: rotate(180deg);\n    }\n  }\n}\n\n.recycle-header {\n  width: calc(100% - 40px);\n  padding: 15px;\n  margin: 20px;\n  display: flex;\n  height: 36px;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n\n  .actions {\n    display: flex;\n    flex-direction: row;\n    gap: 12px;\n    align-items: center;\n    justify-content: flex-end;\n  }\n}\n\n.button {\n  background: white;\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 26px;\n  padding: 0;\n  box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n  padding: 4px 8px;\n  gap: 2px;\n  width: fit-content;\n\n  @include themify() {\n    color: themed('body-text-color')\n  }\n\n  &:hover {\n    background: rgba(var(--color-primary-100-rgb), 0.5);\n  }\n\n  &.delete:not([disabled]) {\n    @include themify() {\n      background: themed('button-delete');\n      color: themed('button-delete-text');\n    }\n  }\n\n  &[disabled] {\n    border: none;\n  }\n\n  &.delete:hover:not([disabled]) {\n    @include themify() {\n      background: $color-red-300;\n      color: themed('button-delete-text');\n    }\n  }\n}\n\n.data-table {\n  width: calc(100% - 40px);\n  height: 100%;\n  padding: 0 15px 15px 15px;\n  border-radius: 8px;\n  margin: 0 20px 20px 20px;\n  @include themify() {\n    color: themed('body-text-color');\n  }\n  overflow-y: auto;\n}\n\n:deep(.v-table) {\n  background: transparent;\n  font-size: 0.95rem !important;\n  border-radius: 0;\n}\n\n:deep(tbody > tr:hover) {\n  background: var(--color-white-900);\n\n  .action-icons-container {\n    visibility: visible;\n  }\n}\n\n:deep(th) {\n  background: transparent !important;\n  span {\n    font-weight: 600;\n    font-size: 1rem;\n  }\n}\n\n:deep(th + th:not(:nth-last-of-type(-n+1))) {\n  border-left-width: 2px;\n  border-left-style: solid;\n  border-image: linear-gradient(to bottom, rgba(108,219,141,0) 25%,rgba(74, 76, 75,1) 25%,rgba(74, 76, 75,1) 75%,rgba(108,219,141,0) 75%);\n  border-image-slice: 1;\n}\n\n.cursor-pointer {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 5px;\n}\n\n</style>\n","import { render } from \"./RecycleBin.vue?vue&type=template&id=f74a6498&scoped=true\"\nimport script from \"./RecycleBin.vue?vue&type=script&lang=js\"\nexport * from \"./RecycleBin.vue?vue&type=script&lang=js\"\n\nimport \"./RecycleBin.vue?vue&type=style&index=0&id=f74a6498&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f74a6498\"]])\n\nexport default __exports__","<template>\n  <div class=\"data-table scrollbar\">\n    <v-data-table\n      :headers=\"headers\"\n      :items=\"allInstances\"\n      :items-per-page=\"-1\"\n      fixed-header\n      density=\"comfortable\"\n    >\n      <template #headers=\"{ columns, }\">\n        <tr>\n          <template v-for=\"column in columns\" :key=\"column.key\">\n            <th v-if=\"column.key !== 'select'\" class=\"th2\">\n              <template v-if=\"column.key === 'state'\">\n                <span class=\"mr-2 cursor-pointer\" @click=\"() => sortStateAsc = !sortStateAsc\">\n                  {{ column.title }}\n                  <v-icon size=\"16px\" :icon=\"getSortIcon(sortStateAsc)\" />\n                </span>\n              </template>\n              <template v-else-if=\"column.key === 'launch'\">\n                <span class=\"mr-2 cursor-pointer\" @click=\"() => sortDateAsc = !sortDateAsc\">\n                  {{ column.title }}\n                  <v-icon size=\"16px\" :icon=\"getSortIcon(sortDateAsc)\" />\n                </span>\n              </template>\n              <template v-else>\n                <span class=\"mr-2\">{{ column.title }}</span>\n              </template>\n            </th>\n            <th v-else class=\"th2\">\n              <div class=\"select-all checkbox\">\n                <v-checkbox\n                  v-model=\"selectAllInstances\"\n                  :hide-details=\"true\"\n                  density=\"compact\"\n                  @input=\"handleSelectAllClicked\"\n                />\n              </div>\n            </th>\n          </template>\n        </tr>\n      </template>\n\n      <template v-for=\"(header, i) in headers\" :key=\"i\" #[`item.${header.key}`]=\"{ item }\">\n        <template v-if=\"header.key ==='launch'\">\n          {{ formatTime(item[header.key]) }}\n        </template>\n        <template v-else-if=\"header.key ==='task_type'\">\n          <div class=\"label-icon\">\n            <SVGIcon\n              :iconName=\"taskTypeMap[item[header.key]].icon\"\n              :width=\"'24px'\"\n              :height=\"'24px'\"\n              class=\"data-table-icon\"\n            />\n            <div>\n              {{ taskTypeMap[item[header.key]].name }}\n            </div>\n          </div>\n        </template>\n        <template v-else-if=\"header.key ==='docker_task'\">\n          <UserIcon\n            v-if=\"item[header.key].username\"\n            :user=\"userList.find((e) => e.username === item[header.key].username)\"\n            :size=\"'32px'\"\n          />\n        </template>\n        <template v-else-if=\"header.key ==='select'\">\n          <div class=\"select-all checkbox\">\n            <v-checkbox\n              v-model=\"selectedInstances\"\n              :hide-details=\"true\"\n              density=\"compact\"\n              :value=\"item\"\n            />\n          </div>\n        </template>\n        <template v-else-if=\"header.key ==='state'\">\n          <span v-if=\"item[header.key] === 'pending'\" class=\"status-tag _pending\">Pending</span>\n          <span v-else-if=\"item[header.key] === 'running'\" class=\"status-tag _running\">Running</span>\n          <span v-else-if=\"item[header.key] === 'stopping'\" class=\"status-tag _warning\">Stopping</span>\n          <span v-else-if=\"item[header.key] === 'terminated'\" class=\"status-tag\">Terminated</span>\n        </template>\n        <template v-else>\n          {{ item[header.key] }}\n        </template>\n      </template>\n      <template #bottom />\n    </v-data-table>\n  </div>\n</template>\n\n<script setup>\nimport {\n  ref, onBeforeMount, watch, computed,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport { useStore } from 'vuex';\nimport UserIcon from '@/components/UserIcon.vue';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nconst store = useStore();\n\nconst emit = defineEmits([\n  'update:total-instance-count',\n  'update:selected-instances',\n]);\n\nconst dataConnect = new DatastoreConnect();\nconst headers = ref([\n  {\n    title: 'selection', key: 'select', width: '1%', align: 'start',\n  },\n  {\n    title: 'Name', key: 'provided_name', width: '34%', align: 'start',\n  },\n  {\n    title: 'User', key: 'docker_task', width: '5%', align: 'center',\n  },\n  {\n    title: 'Task', key: 'task_type', width: '20%', align: 'start',\n  },\n  {\n    title: 'IP Address', key: 'ip', width: '15%', align: 'start',\n  },\n  {\n    title: 'Start Date', key: 'launch', width: '15%', align: 'start',\n  },\n  {\n    title: 'Status', key: 'state', width: '10%', align: 'start',\n  },\n]);\nconst allInstances = ref([]);\nconst loading = ref(false);\nconst selectedInstances = ref([]);\nconst selectAllInstances = ref(false);\nconst sortDateAsc = ref(false);\nconst sortStateAsc = ref(false);\n\nconst userList = computed(() => store.state.user.userList);\n\nconst taskTypeMap = ref({\n  \"aigt\": {\n    name: \"AI Assited Ground Truth\",\n    icon: \"sam\",\n  },\n  \"auto-ann\": {\n    name: \"Model Inference\",\n    icon: \"auto_annotate\",\n  },\n  \"trainer\": {\n    name: \"Model Training\",\n    icon: \"science\",\n  },\n  \"validation\": {\n    name: \"Validation\",\n    icon: \"compare\",\n  },\n  \"snapshot-server\": {\n    name: \"Snapshot\",\n    icon: \"database_sync\",\n  },\n});\n\nasync function getInstances() {\n  loading.value = true;\n  selectedInstances.value = [];\n  await dataConnect.listCloudInstances({ filter: \"\" })\n    .then((data) => {\n      if (data.result && !data.error) {\n        emit('update:total-instance-count', data.result.length);\n        allInstances.value = data.result;\n      } else if (data.error) {\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Error listing instances: ${data.error.message}`,\n          type: \"error\",\n          position: \"top\",\n        });\n      }\n    })\n    .catch((error) => {\n      console.log(error);\n      return '';\n    });\n  loading.value = false;\n}\n\nfunction formatTime(str) {\n  return `${new Date(str).toLocaleTimeString('default', {\n    year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n  })}`;\n}\n\nfunction getSortIcon(sortedAsc) {\n  return sortedAsc ? 'mdi-arrow-up' : 'mdi-arrow-down';\n}\n\nwatch(sortDateAsc, () => {\n  sortByDate(sortDateAsc.value);\n}, { deep: true });\n\nwatch(sortStateAsc, () => {\n  sortByState(sortStateAsc.value);\n}, { deep: true });\n\nwatch(selectedInstances, (newInstances) => {\n  if (selectedInstances.value.length > 0 && selectedInstances.value.length === allInstances.value.length) {\n    selectAllInstances.value = true;\n  } else {\n    selectAllInstances.value = false;\n  }\n  emit('update:selected-instances', newInstances);\n}, { deep: true });\n\nwatch(selectedInstances, (newInstances) => {\n  if (selectedInstances.value.length > 0 && selectedInstances.value.length === allInstances.value.length) {\n    selectAllInstances.value = true;\n  } else {\n    selectAllInstances.value = false;\n  }\n  emit('update:selected-instances', newInstances);\n}, { deep: true });\n\nfunction sortByDate(val) {\n  if (val) {\n    allInstances.value.sort((a, b) => new Date(a.launch) - new Date(b.launch));\n  } else {\n    allInstances.value.sort((a, b) => new Date(b.launch) - new Date(a.launch));\n  }\n}\n\nfunction sortByState(val) {\n  if (val) {\n    allInstances.value.sort((a, b) => a.state.localeCompare(b.state));\n  } else {\n    allInstances.value.sort((a, b) => b.state.localeCompare(a.state));\n  }\n}\n\nfunction handleSelectAllClicked() {\n  if (selectAllInstances.value) {\n    selectedInstances.value = allInstances.value;\n  } else {\n    selectedInstances.value = [];\n  }\n}\n\nonBeforeMount(() => {\n  getInstances();\n});\n\ndefineExpose({\n  getInstances,\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.data-table {\n    width: calc(100% - 40px);\n    height: 100%;\n    padding: 0 15px 15px 15px;\n    border-radius: 8px;\n    margin: 0 20px 20px 20px;\n    overflow-y: auto;\n\n  th + th:not(:nth-last-of-type(-n)) {\n    border-left: 2px solid rgb(74, 76, 75);\n    border-image: linear-gradient(to bottom, rgba(108,219,141,0) 25%,rgba(74, 76, 75,1) 25%,rgba(74, 76, 75,1) 75%,rgba(108,219,141,0) 75%);\n    border-image-slice: 1;\n  }\n}\n\n:deep(.v-table) {\n  background: transparent;\n  border-radius: 0;\n}\n\n.th2 {\n  background: transparent !important;\n  span {\n    font-size: 1.0rem;\n    font-weight: 600;\n  }\n}\n\n.select-all {\n  display: flex;\n  flex-direction: row;\n  width: 15px;\n}\n\n.label-icon {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  color: var(--color-black) !important;\n\n  :nth-child(2) {\n    margin-left: 5px;\n  }\n}\n\n.status-tag {\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  font-weight: 600;\n  white-space: nowrap;\n  color: var(--gray-600);\n\n  &._running {\n    @include themify() {\n      color: themed('color-status-complete');\n    }\n  }\n  &._pending {\n    @include themify() {\n      color: themed('color-status-running');\n    }\n  }\n  &._warning {\n    @include themify() {\n      color: themed('color-status-warning');\n    }\n  }\n\n  div {\n    color: inherit;\n    width: 4px;\n    height: 4px;\n    border: solid 4px;\n    border-radius: 4px;\n    margin-right: 4px;\n  }\n}\n\n.cursor-pointer {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 5px;\n}\n</style>\n","import script from \"./CloudInstancesList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./CloudInstancesList.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./CloudInstancesList.vue?vue&type=style&index=0&id=c8fba328&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-c8fba328\"]])\n\nexport default __exports__","<template>\n  <div class=\"filters\">\n    <div class=\"filters__header\">\n      <div class=\"left\">\n        <span>{{ instanceCount && selectedInstances && selectedInstances.length > 0 ? `Instances (${selectedInstances.length} / ${instanceCount})` :`Instances (${instanceCount})` }}</span>\n      </div>\n      <div class=\"right\">\n        <button class=\"button\" @click=\"handleRefreshClicked\">\n          <SVGIcon\n            :iconName=\"'refresh'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />Refresh\n        </button>\n        <button class=\"button delete\" :disabled=\"selectedInstances && selectedInstances.length === 0\" @click=\"handleStopClicked\">\n          <SVGIcon\n            :iconName=\"'stop'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          Stop\n        </button>\n        <button class=\"button highlight\" @click=\"handleStartClicked\">\n          <SVGIcon\n            :iconName=\"'play'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />Start\n        </button>\n      </div>\n    </div>\n    <div class=\"filters__footer\">\n      <div class=\"left\" />\n      <div class=\"right\" />\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport { toRefs, watch } from 'vue';\nimport SVGIcon from '@/components/SVGIcon.vue';\n\nconst props = defineProps({\n  name: { type: String, default: 'null' },\n  state: { type: String, default: 'null' },\n  status: { type: String, default: 'null' },\n  ip: { type: String, default: 'null' },\n  type: { type: String, default: 'null' },\n  date: { type: String, default: 'null' },\n  instanceCount: { type: Number, default: 0 },\n  selectedInstances: { type: Array, default: () => [] },\n});\n\nconst emit = defineEmits([\n  'stop-clicked',\n  'refresh-clicked',\n  'start-clicked',\n]);\n\nconst {\n  name, state, status, ip, type,\n  date, instanceCount, selectedInstances,\n} = toRefs(props);\n\nfunction handleStopClicked() {\n  emit('stop-clicked');\n}\n\nfunction handleRefreshClicked() {\n  emit('refresh-clicked');\n}\n\nfunction handleStartClicked() {\n  emit('start-clicked');\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.filters{\n  display: flex;\n  flex-direction: column;\n\n  &__header{\n    display: flex;\n    flex-direction: row;\n    .left{\n      width: 40%;\n      max-width: 40%;\n\n      span{\n        font-weight: bold;\n        font-size: 1.15rem;\n      }\n    }\n    .right{\n      display: flex;\n      flex-direction: row;\n      width: 60%;\n      max-width: 60%;\n      gap: 12px;\n      align-items: center;\n      justify-content: flex-end;\n    }\n  }\n\n  &__footer{\n    display: flex;\n    flex-direction: row;\n\n    .left{\n      width: 50%;\n      max-width: 50%;\n    }\n    .right{\n      width: 50%;\n      max-width: 50%;\n      justify-content: flex-end;\n    }\n  }\n}\n\n.button {\n    background: white;\n    position: relative;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    height: 26px;\n    padding: 0;\n    box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n    padding: 4px 8px;\n    gap: 2px;\n    width: fit-content;\n\n    @include themify() {\n      color: themed('body-text-color')\n    }\n\n    &.highlight {\n      background: var(--button-color);\n      color: var(--button-text-color);\n\n      svg {\n        margin-right: 5px;\n      }\n    }\n\n    &:hover {\n      background: rgba(var(--color-primary-100-rgb), 0.5);\n    }\n\n    &.delete:not([disabled]) {\n      @include themify() {\n        background: themed('button-delete');\n        color: themed('button-delete-text');\n      }\n    }\n\n    &.delete[disabled] {\n      border: none;\n    }\n\n    &.delete:hover:not([disabled]) {\n      @include themify() {\n        background: $color-red-300;\n        color: themed('button-delete-text');\n      }\n    }\n  }\n</style>\n","import script from \"./CloudInstanceFilters.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./CloudInstanceFilters.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./CloudInstanceFilters.vue?vue&type=style&index=0&id=e44ba0b0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-e44ba0b0\"]])\n\nexport default __exports__","<template>\n  <Modal\n    ref=\"createServerModal\"\n    :title=\"'Launch a Server'\"\n    width=\"650px\"\n    @closed=\"resetData\"\n  >\n    <!-- <template #modal-header /> -->\n    <template #modal-main>\n      <div class=\"settings container scrollbar\">\n        <v-expansion-panels\n          v-model=\"panels\"\n          multiple\n          class=\"mt-2\"\n        >\n          <v-expansion-panel\n            value=\"information\"\n          >\n            <v-expansion-panel-title>\n              <h3>Information</h3>\n            </v-expansion-panel-title>\n            <v-expansion-panel-text>\n              <div class=\"row mt-3\">\n                <div class=\"col-12 settings__control-group\">\n                  <label class=\"required\">Name</label>\n                  <input\n                    v-model=\"name\"\n                    class=\"select\"\n                    type=\"text\"\n                  >\n                </div>\n              </div>\n              <div class=\"row mt-3\">\n                <div class=\"col-12 settings__control-group\">\n                  <label class=\"required\">Type</label>\n                  <select v-model=\"type\" class=\"select\" required>\n                    <option :value=\"''\" disabled>Select a Server Type</option>\n                    <option value=\"aigt\">AI Assited Ground Truth</option>\n                  </select>\n                </div>\n              </div>\n            </v-expansion-panel-text>\n          </v-expansion-panel>\n        </v-expansion-panels>\n        <div v-if=\"message\" class=\"row mt-3\">\n          <div class=\"col-12 settings__control-group\">\n            <div class=\"result error\">\n              <span>{{ message }}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n    <template #modal-footer>\n      <div class=\"footer\">\n        <button\n          class=\"button modal-action-button\"\n          :class=\"{'button-spinner': startingInstance}\"\n          :disabled=\"startingInstance\"\n          @click=\"startInstance\"\n        >\n          Start Server\n        </button>\n      </div>\n    </template>\n  </Modal>\n</template>\n\n<script setup>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport Modal from '@/components/Modal.vue';\nimport { ref, computed } from 'vue';\nimport { useStore } from 'vuex';\n\nconst emit = defineEmits([\n  'instance-created',\n]);\n\nconst store = useStore();\n\nconst dataConnect = new DatastoreConnect();\nconst message = ref('');\nconst name = ref('');\nconst type = ref('');\nconst startingInstance = ref(false);\nconst createServerModal = ref(null);\nconst panels = ref(['information']);\n\nconst currentProject = computed(() => store.state.projects.currentProject);\n\nfunction resetData() {\n  name.value = '';\n  type.value = '';\n  message.value = '';\n}\n\nasync function startInstance() {\n  message.value = '';\n\n  if (!name.value) {\n    message.value = `Missing Name`;\n    return;\n  }\n\n  startingInstance.value = true;\n  const params = {\n    project_id: currentProject.value.id,\n    name: name.value,\n    type: type.value,\n  };\n  await dataConnect.startCloudInstance(params)\n    .then((data) => {\n      if (data.result && !data.error) {\n        emit('instance-created');\n      }\n      startingInstance.value = false;\n      closeModal();\n    })\n    .catch((e) => {\n      message.value = e.message;\n      console.log(e);\n      startingInstance.value = false;\n    });\n}\n\nfunction showModal() {\n  createServerModal.value.showModal();\n}\n\nfunction closeModal() {\n  createServerModal.value.closeModal();\n}\n\ndefineExpose({\n  showModal,\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n.settings {\n  padding: 0.75rem 3rem;\n  min-width: 540px;\n  overflow-y: scroll;\n\n  span {\n    width: 100%;\n    font-size: 1rem;\n    font-weight: 700;\n    text-align: left;\n    @include themify() {\n      color: themed('color-primary');\n    }\n  }\n}\n\n.footer {\n  display: flex;\n  flex-direction: row;\n  padding: 0.75rem 3rem;\n  justify-content: flex-end;\n}\n\n.result {\n  display: flex;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  font-size: 1rem;\n  font-weight:600;\n  padding: 10px;\n  align-items: center;\n  justify-content: center;\n\n  span {\n    width: 100%;\n    line-break: anywhere;\n  }\n}\n\n.error {\n  @include themify() {\n    background: rgba(182, 94, 94, 0.5) ;\n    color: themed('color-error')\n  }\n}\n\n</style>\n","import script from \"./NewCloudInstanceModal.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./NewCloudInstanceModal.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./NewCloudInstanceModal.vue?vue&type=style&index=0&id=347015ed&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-347015ed\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <Header ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n    </Header>\n    <div class=\"main-page-div\">\n      <main class=\"main-display-area\">\n        <CloudInstanceFilters\n          class=\"filters\"\n          :instanceCount=\"instanceCount\"\n          :selectedInstances=\"selectedInstances\"\n          @start-clicked=\"handleStartClicked\"\n          @stop-clicked=\"openConfirmDeleteModal\"\n          @refresh-clicked=\"handleRefresh\"\n        />\n        <CloudInstancesList\n          ref=\"cloudInstanceList\"\n          class=\"table\"\n          @update:total-instance-count=\"handleUpdateInstanceCount\"\n          @update:selected-instances=\"handleSelectedInstances\"\n        />\n      </main>\n    </div>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  />\n  <NewCloudInstanceModal\n    ref=\"createInstanceModal\"\n    @instance-created=\"handleRefresh\"\n  />\n</template>\n\n<script setup>\nimport Header from '@/components/Header.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\nimport CloudInstancesList from '@/components/CloudInstances/CloudInstancesList.vue';\nimport CloudInstanceFilters from '@/components/CloudInstances/CloudInstanceFilters.vue';\nimport NewCloudInstanceModal from '@/components/CloudInstances/NewCloudInstanceModal.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport { ref } from 'vue';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\n\nconst $toast = useToast();\n\nconst dataConnect = new DatastoreConnect();\nconst instanceCount = ref(0);\nconst selectedInstances = ref([]);\nconst confirmMessage = ref('');\nconst confirmMessageHeader = ref('');\nconst buttonText = ref('');\nconst confirmFunction = ref(null);\nconst confirmModal = ref(null);\nconst cloudInstanceList = ref(null);\nconst createInstanceModal = ref(null);\n\nfunction handleUpdateInstanceCount(count) {\n  instanceCount.value = count;\n}\n\nfunction handleSelectedInstances(instances) {\n  selectedInstances.value = instances;\n}\n\nfunction openConfirmDeleteModal() {\n  confirmMessage.value = `This action will permanently stop the selected servers. Are you sure you want to terminate ${selectedInstances.value.length} server(s)?`;\n  confirmMessageHeader.value = `Terminate Servers`;\n  buttonText.value = 'Delete';\n  confirmModal.value.showModal();\n  confirmFunction.value = () => deleteInstance();\n}\nasync function deleteInstance() {\n  const selected_ids = selectedInstances.value.map((e) => e.id);\n  const params = {\n    cloud_instance_ids: selected_ids,\n  };\n  dataConnect.stopMultipleCloudInstance(params)\n    .then((data) => {\n      if (!data || data.error) {\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Instance failed to terminate`,\n          type: \"error\",\n          position: \"top\",\n        });\n      } else {\n        cloudInstanceList.value.getInstances();\n      }\n    });\n}\n\nfunction handleRefresh() {\n  cloudInstanceList.value.getInstances();\n}\n\nfunction handleStartClicked() {\n  createInstanceModal.value.showModal();\n}\n\n</script>\n\n<style lang=\"scss\" scoped>\n.filters {\n  margin: 10px 20px;\n\n}\n</style>\n","import script from \"./CloudInstancesPage.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./CloudInstancesPage.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./CloudInstancesPage.vue?vue&type=style&index=0&id=d08c022c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-d08c022c\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <HeaderDve ref=\"header\">\n      <template #header-slot>\n        <BreadcrumbNavigation />\n      </template>\n    </HeaderDve>\n    <div class=\"main-page-div\">\n      <main class=\"main-display-area\">\n        <SnapshotList />\n      </main>\n    </div>\n    <TasksModal />\n  </div>\n</template>\n\n<script>\nimport HeaderDve from '@/components/Header.vue';\nimport BreadcrumbNavigation from '@/components/BreadcrumbNavigation.vue';\nimport SnapshotList from '@/components/Snapshots/SnapshotList.vue';\nimport TasksModal from '@/components/TasksStatusComponent/TasksModal.vue';\n\nexport default {\n  name: 'SnapshotListModal',\n  components: {\n    TasksModal,\n    HeaderDve,\n    BreadcrumbNavigation,\n    SnapshotList,\n  },\n\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n</style>\n","<template>\n  <div class=\"filters\">\n    <div class=\"filters__header\">\n      <div class=\"left\">\n        <span>{{ `Snapshots (${allSnapshots.length})` }}</span>\n      </div>\n      <div class=\"right\">\n        <button class=\"button\" @click=\"getSnapshots\">\n          <SVGIcon\n            :iconName=\"'refresh'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />Refresh\n        </button>\n        <button class=\"button\" @click=\"addSnapshot\">\n          <SVGIcon\n            :iconName=\"'add'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          From Dataset\n        </button>\n        <button\n          class=\"button\"\n          aria-label=\"From File\"\n          :title=\"'Add From File'\"\n          :disabled=\"parsingFiles\"\n          :class=\"{'button-spinner': parsingFiles}\"\n          @click=\"chooseSourceFolder\"\n        >\n          <SVGIcon\n            :iconName=\"'import'\"\n            :width=\"'18px'\"\n            :height=\"'18px'\"\n          />\n          <input\n            v-show=\"false\"\n            id=\"import-script-folder-input\"\n            ref=\"importFolderInput\"\n            type=\"file\"\n            multiple\n            @change=\"handleFileInput\"\n          >\n          <span>From File</span>\n        </button>\n      </div>\n    </div>\n    <div class=\"filters__footer mt-2\">\n      <div class=\"left\" />\n      <div class=\"right\" />\n    </div>\n  </div>\n  <div\n    class=\"data-table scrollbar\"\n    :class=\"{_highlight: dropHighlighted}\"\n    @dragenter.prevent=\"handleDragEnter\"\n    @dragover.prevent=\"\"\n    @dragleave=\"handleDragLeave\"\n    @drop.prevent=\"handleDrop\"\n  >\n    <v-data-table\n      :headers=\"headers\"\n      :items=\"allSnapshots\"\n      :items-per-page=\"-1\"\n      fixed-header\n      density=\"comfortable\"\n    >\n      <template #headers=\"{ columns }\">\n        <tr>\n          <template v-for=\"column in columns\" :key=\"column.key\">\n            <th class=\"th2\">\n              <template v-if=\"column.key === 'status'\">\n                <span class=\"mr-2 cursor-pointer\" @click=\"() => sortStateAsc = !sortStateAsc\">\n                  {{ column.title }}\n                  <v-icon size=\"16px\" :icon=\"getSortIcon(sortStateAsc)\" />\n                </span>\n              </template>\n              <template v-else-if=\"column.key === 'date'\">\n                <span class=\"mr-2 cursor-pointer\" @click=\"() => sortDateAsc = !sortDateAsc\">\n                  {{ column.title }}\n                  <v-icon size=\"16px\" :icon=\"getSortIcon(sortDateAsc)\" />\n                </span>\n              </template>\n              <template v-else>\n                <span class=\"mr-2 \">{{ column.title }}</span>\n              </template>\n            </th>\n          </template>\n        </tr>\n      </template>\n      <template v-for=\"(header, i) in headers\" :key=\"i\" #[`item.${header.key}`]=\"{ item, index }\">\n        <template v-if=\"header.key ==='date'\">\n          {{ formatTime(item[header.key]) }}\n        </template>\n        <template v-else-if=\"header.key ==='description'\">\n          <div class=\"td-name-cell\" :active=\"item.newName || item.newName === ''\">\n            <template v-if=\"!item.newName && item.newName !== ''\">\n              <div\n                class=\"text\"\n                @click.stop.prevent=\"edit(index)\"\n              >\n                {{ item[header.key] }}\n              </div>\n              <v-btn\n                :icon=\"'mdi-pencil'\"\n                size=\"x-small\"\n                variant=\"plain\"\n                class=\"edit-btn\"\n                active-color=\"#250E81\"\n                @click.stop.prevent=\"edit(index)\"\n              />\n            </template>\n            <template v-else>\n              <input\n                ref=\"snapshotNameEditors\"\n                v-model=\"item.newName\"\n                type=\"text\"\n                class=\"text\"\n                @blur=\"updateName(item)\"\n                @keyup.enter=\"updateName(item)\"\n              >\n              <v-btn\n                id=\"send-btn\"\n                :icon=\"'mdi-check'\"\n                size=\"x-small\"\n                variant=\"plain\"\n                class=\"edit-btn\"\n                active-color=\"#250E81\"\n                @click.stop.prevent=\"updateName(item)\"\n              />\n            </template>\n          </div>\n        </template>\n        <template v-else-if=\"header.key ==='status'\">\n          <span v-if=\"item[header.key] === 'available' || item[header.key] === ''\" class=\"status-tag _success\">Available</span>\n          <span v-else-if=\"item[header.key] === 'unavailable'\" class=\"status-tag _unavailable\">Not Available</span>\n        </template>\n        <template v-else-if=\"header.key ==='project_id'\">\n          {{ item[header.key] ? findProjectName(item) : '-' }}\n        </template>\n        <template v-else-if=\"header.key ==='num_images' || header.key ==='num_annotations'\">\n          {{ item[header.key] > 0 ? item[header.key] : '-' }}\n        </template>\n        <template v-else-if=\"header.key ==='username'\">\n          <UserIcon\n            v-if=\"item[header.key]\"\n            :user=\"userList.find((e) => e.username === item[header.key])\"\n            :size=\"'32px'\"\n          />\n        </template>\n        <template v-else-if=\"header.key ==='actions'\">\n          <BaseMenu\n            :placement=\"'bottom-start'\"\n            :appendToBody=\"true\"\n            @closed=\"show_menu = false\"\n          >\n            <SVGIcon\n              class=\"actions\"\n              :iconName=\"'more_vert'\"\n              :width=\"'22px'\"\n              :height=\"'22px'\"\n            />\n            <template #menu=\"{closeMenu}\">\n              <ul>\n                <li>\n                  <BaseMenuButton :disabled=\"disableSnapshot(item)\" @click.stop=\"downloadSnapshot(item),closeMenu()\">\n                    <SVGIcon\n                      title=\"Download\"\n                      :iconName=\"'download'\"\n                      :width=\"'22px'\"\n                      :height=\"'22px'\"\n                    />\n                    <span>Download</span>\n                  </BaseMenuButton>\n                </li>\n                <li>\n                  <BaseMenuButton :disabled=\"disableSnapshot(item)\" @click.stop=\"restoreSnapshot(item), closeMenu()\">\n                    <SVGIcon\n                      title=\"Restore snapshot\"\n                      :iconName=\"'file_restore'\"\n                      :width=\"'22px'\"\n                      :height=\"'22px'\"\n                    />\n                    <span>Restore</span>\n                  </BaseMenuButton>\n                </li>\n                <li>\n                  <BaseMenuButton class=\"remove-icon\" @click.stop=\"handleRemoveSnapshot(item), closeMenu()\">\n                    <SVGIcon\n                      title=\"Remove snapshot\"\n                      :iconName=\"'close'\"\n                      :width=\"'22px'\"\n                      :height=\"'22px'\"\n                    />\n                    <span>Remove</span>\n                  </BaseMenuButton>\n                </li>\n              </ul>\n            </template>\n          </BaseMenu>\n        </template>\n        <template v-else>\n          {{ item[header.key] }}\n        </template>\n      </template>\n      <template #bottom />\n    </v-data-table>\n  </div>\n  <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonText=\"buttonText\"\n    :buttonClass=\"buttonClass\"\n    @confirmed=\"confirmFunction\"\n  />\n  <SnapshotAddModal\n    ref=\"addSnapshotModal\"\n    :mode=\"mode\"\n    :snapshot=\"modalSnapshot\"\n    :projects=\"projects\"\n    @restore-snapshot=\"getSnapshots\"\n  />\n</template>\n\n<script setup>\nimport {\n  ref, onBeforeMount, computed, nextTick, watch,\n} from 'vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport SVGIcon from '@/components/SVGIcon.vue';\nimport { getTimeDifference } from '@/assets/js/utils';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport BaseMenu from '@/components/BaseMenu.vue';\nimport BaseMenuButton from '@/components/BaseMenuButton.vue';\nimport SnapshotAddModal from '@/components/Snapshots/SnapshotAddModal.vue';\nimport { useStore } from 'vuex';\nimport { useToast } from 'vue-toast-notification';\nimport 'vue-toast-notification/dist/theme-sugar.css';\nimport { v4 as uuidv4 } from 'uuid';\nimport UserIcon from '@/components/UserIcon.vue';\n\nconst $toast = useToast();\n\nconst store = useStore();\n\nconst dataConnect = new DatastoreConnect();\nconst headers = ref([\n  {\n    title: 'Name', key: 'description', width: '35%', align: 'start',\n  },\n  {\n    title: 'User', key: 'username', width: '5%', align: 'center',\n  },\n  {\n    title: 'Project', key: 'project_id', width: '14%', align: 'start',\n  },\n  {\n    title: 'Images', key: 'num_images', width: '10%', align: 'start',\n  },\n  {\n    title: 'Annotations', key: 'num_annotations', width: '10%', align: 'start',\n  },\n  {\n    title: 'Created', key: 'date', width: '15%', align: 'start',\n  },\n  {\n    title: 'Status', key: 'status', width: '10%', align: 'start',\n  },\n  {\n    title: '', key: 'actions', width: '1%', align: 'start',\n  },\n]);\nconst allSnapshots = ref([]);\nconst parsingFiles = ref(false);\nconst files = ref([]);\nconst show_menu = ref(false);\nconst confirmModal = ref(null);\nconst addSnapshotModal = ref(null);\nconst confirmMessage = ref('');\nconst confirmMessageHeader = ref('');\nconst buttonText = ref('');\nconst buttonClass = ref('button-delete');\nconst confirmFunction = ref(null);\nconst mode = ref('add');\nconst modalSnapshot = ref(null);\nconst snapshotNameEditors = ref([]);\nconst dropHighlighted = ref(false);\nconst importFolderInput = ref(null);\nconst sortDateAsc = ref(false);\nconst sortStateAsc = ref(false);\n\nconst projects = computed(() => store.state.projects.projectList);\nconst userList = computed(() => store.state.user.userList);\n\nwatch(sortDateAsc, () => {\n  sortByDate(sortDateAsc.value);\n}, { deep: true });\n\nwatch(sortStateAsc, () => {\n  sortByState(sortStateAsc.value);\n}, { deep: true });\n\nfunction sortByDate(val) {\n  if (val) {\n    allSnapshots.value.sort((a, b) => new Date(a.date) - new Date(b.date));\n  } else {\n    allSnapshots.value.sort((a, b) => new Date(b.date) - new Date(a.date));\n  }\n}\n\nfunction sortByState(val) {\n  if (val) {\n    allSnapshots.value.sort((a, b) => a.status.localeCompare(b.status));\n  } else {\n    allSnapshots.value.sort((a, b) => b.status.localeCompare(a.status));\n  }\n}\n\nasync function getSnapshots() {\n  await dataConnect.listSnapshots()\n    .then((data) => {\n      if (data.result && !data.error) {\n        allSnapshots.value = data.result.sort((a, b) => b.id - a.id);\n        allSnapshots.value = allSnapshots.value.map((snapshot) => ({\n          ...snapshot,\n          newName: null,\n        }));\n      }\n    })\n    .catch((error) => {\n      console.log(error);\n      return '';\n    });\n}\n\nfunction disableSnapshot(snapshot) {\n  if (snapshot && (snapshot[\"status\"] === 'available' || snapshot[\"status\"] === '')) {\n    return false;\n  } else if (snapshot && snapshot[\"status\"] === 'unavailable') {\n    return true;\n  } else {\n    return true;\n  }\n}\n\nfunction formatTime(str) {\n  return `${new Date(str).toLocaleTimeString('default', {\n    year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n  })}`;\n}\n\nfunction chooseSourceFolder() {\n  importFolderInput.value.click();\n}\n\nfunction getSortIcon(sortAsc) {\n  return sortAsc ? 'mdi-arrow-up' : 'mdi-arrow-down';\n}\n\nasync function handleFileInput(event) {\n  const selectedFiles = Array.from(event.target.files);\n  try {\n    await compileFiles(selectedFiles);\n  } catch (e) {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      message: `Error uploading files: ${e}`,\n      type: \"error\",\n      position: \"top\",\n    });\n  }\n}\n\nasync function processFolder(directoryHandle) {\n  const tree = { [directoryHandle.name]: {} };\n  files.value = [];\n  await handleDirectory(directoryHandle, tree, directoryHandle.name);\n  try {\n    const fileObjs = await Promise.all(files.value);\n    await compileFiles(fileObjs);\n  } catch (e) {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      message: `Error uploading files: ${e}`,\n      type: \"error\",\n      dismissible: true,\n      position: \"top\",\n    });\n  }\n}\n\nasync function compileFiles(fileList) {\n  parsingFiles.value = true;\n  files.value = fileList;\n\n  let relativePath = \"\";\n  if (files.value && files.value.length > 0) {\n    relativePath = files.value[0].relativePath || files.value[0].webkitRelativePath;\n  }\n\n  let dirName = \"\";\n  if (relativePath && relativePath !== \"\") {\n    // From folder select\n    dirName = relativePath.split(\"/\")[0];\n  } else {\n    dirName = files.value[0].name;\n    dirName = dirName.slice(0, dirName.lastIndexOf('.')) || dirName;\n  }\n  await uploadFiles(files.value, dirName).then(() => {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      message: `Files uploaded successfully`,\n      type: 'success',\n      position: 'top',\n    });\n    getSnapshots();\n    parsingFiles.value = false;\n  }).catch((e) => {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      message: `Error uploading files: ${e}`,\n      type: 'error',\n      dismissible: true,\n      position: 'top',\n    });\n    parsingFiles.value = false;\n  });\n}\n\nasync function handleDirectory(dirhandle, tree, relativePath) {\n  const subtree = {};\n  tree[dirhandle.name] = subtree;\n  for await (const [name, handle] of dirhandle) {\n    if (handle.kind === \"directory\") {\n      const newRelativePath = relativePath ? `${relativePath}/${name}` : name;\n      await handleDirectory(handle, subtree, newRelativePath);\n    } else {\n      subtree[name] = \"[file]\";\n      files.value.push(new Promise((resolve, reject) => {\n        handle.getFile().then((file) => {\n          file.relativePath = `${relativePath}/${name}`;\n          resolve(file);\n        });\n      }));\n    }\n  }\n}\n\nasync function uploadFiles(fileList, name) {\n  let snapshot_id = 0;\n  const fileNames = fileList.map((file) => file.name);\n  const fileSizes = fileList.map((file) => file.size);\n  const newFileList = [];\n  try {\n    const response = await dataConnect.createSnapshotUploadMultipartUrl({\n      keys: fileNames,\n      snapshot_name: name,\n      file_sizes: fileSizes,\n    });\n    if (response && response.result) {\n      const firstKey = Object.keys(response.result)[0];\n      const directoryPath = firstKey.substring(0, firstKey.lastIndexOf(\"/\"));\n      snapshot_id = response.result[\"snapshot_id\"];\n      fileList.forEach((file, i) => {\n        newFileList.push({\n          file,\n          size: fileSizes[i],\n          urls: response.result[`${directoryPath}/${file.name}`][\"urls\"],\n          uploadId: response.result[`${directoryPath}/${file.name}`][\"upload_id\"],\n          key: `${directoryPath}/${file.name}`,\n        });\n      });\n    }\n  } catch (err) {\n    throw new Error(`Error creating uploading urls: ${err}`);\n  }\n\n  const totalSize = fileSizes.reduce((acc, size) => acc + size, 0); // Calculate total size of all files\n\n  const task = {\n    name: `Upload ${name} to Cloud Storage`,\n    docker_id: '',\n    type: 'upload',\n    status: 'running',\n    count: 0,\n    total: totalSize,\n    id: uuidv4(),\n    isLocal: true,\n    date: new Date(),\n    unit: 'bytes',\n  };\n\n  store.commit('tasks/addSnapshotUploadTask', task);\n\n  const sizeMap = {};\n  const fileMap = {};\n  const totalParts = newFileList.reduce((total, file) => total + file[\"urls\"].length, 0);\n  let completedPart = 0;\n  const uploadPromises = newFileList.map((fileObj) => uploadFileMultipart(\n    fileObj.file,\n    fileObj.urls,\n    fileObj.uploadId,\n    (fileName, fileEvent, totalFileParts, partIndex) => {\n      if (!(fileName in sizeMap)) {\n        sizeMap[fileName] = Array(totalFileParts).fill(0);\n      }\n      sizeMap[fileName][partIndex] += (fileEvent.loaded - sizeMap[fileName][partIndex]);\n      const countSum = Object.values(sizeMap)\n        .flat() // Flatten the arrays into a single array\n        .filter((num) => !Number.isNaN(num)) // Filter out NaN values\n        .reduce((sum, num) => sum + num, 0); // Sum up all the numbers\n      task.count = countSum;\n      store.commit('tasks/updateSnapshotUploadTaskStatus', task);\n    },\n    async (PartNumber, ETag, fileName, uploadId, totalFileParts) => {\n      completedPart += 1;\n      if (!(fileName in fileMap)) {\n        fileMap[fileName] = {\n          uploadedData: [],\n          totalFileParts,\n          uploadId,\n        };\n      }\n      fileMap[fileName][\"uploadedData\"].push({ PartNumber, ETag });\n      if (fileMap[fileName][\"uploadedData\"].length === fileMap[fileName][\"totalFileParts\"]) {\n        const completeResponse = await dataConnect.completeSnapshotUploadMultipartUrl({\n          key: fileObj.key,\n          upload_id: fileObj.uploadId,\n          etag_list: fileMap[fileName][\"uploadedData\"].sort((a, b) => a.PartNumber - b.PartNumber),\n        });\n        if (completeResponse && completeResponse.error) {\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: `Error uploading files: ${completeResponse.error.message}`,\n            type: 'error',\n            dismissible: true,\n            position: 'top',\n          });\n        }\n      }\n      if (completedPart === totalParts) {\n        task.percentage = 100;\n        task.status = 'complete';\n        store.commit('tasks/updateSnapshotUploadTaskStatus', task);\n        $toast.open({\n          queue: true,\n          duration: 5000,\n          message: `Snapshot files uploaded successfully`,\n          type: 'success',\n          position: 'top',\n        });\n        parsingFiles.value = false;\n        updateStatus(snapshot_id, \"available\");\n      }\n    },\n    (error) => {\n      task.status = 'error';\n      task.message = error;\n      store.commit('tasks/updateSnapshotUploadTaskStatus', task);\n      $toast.open({\n        queue: true,\n        duration: 5000,\n        message: `Error uploading files: ${error}`,\n        type: 'error',\n        position: 'top',\n        dismissible: true,\n      });\n      parsingFiles.value = false;\n    },\n  ));\n\n  getSnapshots();\n  await Promise.all(uploadPromises);\n}\n\nfunction uploadFileMultipart(file, presignedUrls, uploadId, progressCallback, partCompleteCallback, errorCallback) {\n  return new Promise((resolve, reject) => {\n    const CHUNK_SIZE = 100 * 1024 * 1024; // 100MB per part\n    const totalParts = presignedUrls.length;\n\n    for (let i = 0; i < totalParts; i++) {\n      const start = i * CHUNK_SIZE;\n      const end = Math.min(start + CHUNK_SIZE, file.size);\n      const chunk = file.slice(start, end);\n      const presignedUrl = presignedUrls[i];\n\n      const xhr = new XMLHttpRequest();\n      xhr.open(\"PUT\", presignedUrl, true);\n\n      xhr.upload.addEventListener(\"progress\", (event) => {\n        if (event.lengthComputable) {\n          const fileEvent = event;\n          progressCallback(file.name, fileEvent, totalParts, i);\n        }\n      });\n\n      xhr.onload = () => {\n        if (xhr.status === 200) {\n          const etag = xhr.getResponseHeader(\"ETag\");\n          partCompleteCallback(i + 1, etag.replace(/^\"|\"$/g, ''), file.name, uploadId, totalParts);\n        }\n      };\n\n      xhr.onerror = (e) => {\n        errorCallback(e);\n      };\n\n      xhr.send(chunk);\n    }\n  });\n}\nfunction addSnapshot() {\n  mode.value = 'add';\n  addSnapshotModal.value.showModal();\n}\n\nfunction restoreSnapshot(snapshot) {\n  mode.value = 'retore';\n  modalSnapshot.value = snapshot;\n  addSnapshotModal.value.showModal();\n}\n\nfunction handleRemoveSnapshot(snapshot) {\n  confirmMessage.value = `Are you sure you want to permanently remove snapshot \"${snapshot.description}\"?`;\n  confirmMessageHeader.value = 'Remove Snapshot';\n  buttonText.value = 'Remove';\n  buttonClass.value = 'button-delete';\n  confirmFunction.value = () => {\n    removeSnapshot(snapshot);\n  };\n  confirmModal.value.showModal();\n}\n\nasync function removeSnapshot(snapshot) {\n  await dataConnect.removeSnapshot({\n    snapshot_id: parseInt(snapshot.id),\n  }).then(() => {\n    getSnapshots();\n  }).catch((e) => {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      dismissible: true,\n      message: e,\n      type: 'error',\n      position: 'top',\n    });\n  });\n}\n\nasync function getProjectList() {\n  await dataConnect.getProjectList({ get_num_datasets: true })\n    .then((data) => {\n      const projectList = data.result;\n      let noLT = 0;\n      let noDS = 0;\n      let noTR = 0;\n      let noVA = 0;\n      let noAU = 0;\n\n      projectList.forEach((proj) => {\n        noAU += proj.no_of_automations;\n        noLT += proj.no_of_label_tasks;\n        noDS += proj.no_of_datasets;\n        noTR += proj.no_of_trainers;\n        noVA += proj.no_of_validations;\n      });\n\n      for (let k = 0; k < projectList.length; k++) {\n        projectList[k].total_automations = noAU;\n        projectList[k].total_datasets = noDS;\n        projectList[k].total_trainers = noTR;\n        projectList[k].total_validations = noVA;\n        projectList[k].total_label_tasks = noLT;\n      }\n      store.commit('projects/setProjectList', projectList);\n    })\n    .catch((e) => { console.log(e); });\n}\n\nfunction findProjectName(v) {\n  let result = '-';\n  if (projects.value && projects.value.length > 0) {\n    for (let i = 0; i < projects.value.length; i += 1) {\n      if (projects.value[i].id === v.project_id) {\n        result = projects.value[i].name;\n      }\n    }\n  }\n  return result;\n}\n\nfunction edit(index) {\n  allSnapshots.value[index].newName = allSnapshots.value[index].description;\n  nextTick(() => {\n    snapshotNameEditors.value.focus();\n  });\n}\n\nasync function updateName(snapshot) {\n  if (snapshot.newName && snapshot.newName !== snapshot.description) {\n    await dataConnect.updateSnapshot({\n      snapshot_id: parseInt(snapshot.id),\n      description: snapshot.newName,\n    }).then(() => {\n      snapshot.description = snapshot.newName;\n      getSnapshots();\n      snapshot.newName = null;\n    }).catch((e) => {\n      $toast.open({\n        queue: true,\n        duration: 5000,\n        message: e,\n        type: 'error',\n        dismissible: true,\n        position: 'top',\n      });\n    });\n  } else {\n    snapshot.newName = null;\n  }\n}\n\nasync function updateStatus(snapshot_id, status) {\n  await dataConnect.updateSnapshot({\n    snapshot_id,\n    status,\n  }).then(() => {\n    getSnapshots();\n  }).catch((e) => {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      message: e,\n      type: 'error',\n      dismissible: true,\n      position: 'top',\n    });\n  });\n}\n\nfunction handleDragEnter() {\n  dropHighlighted.value = true;\n}\nfunction handleDragLeave() {\n  dropHighlighted.value = false;\n}\n\nasync function handleDrop(e) {\n  if (parsingFiles.value) {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      message: `Error uploading files: Previous file upload in progress`,\n      type: 'error',\n      dismissible: true,\n      position: 'top',\n    });\n    dropHighlighted.value = false;\n  } else {\n    dropHighlighted.value = false;\n    const filePromises = [];\n    let folderPromise = null;\n\n    const items = [...e.dataTransfer.items];\n\n    const entries = await Promise.all(\n      items.map(async (item) => (item.kind === \"file\" ? item.getAsFileSystemHandle() : null)),\n    );\n\n    for (const entry of entries) {\n      if (entry) {\n        if (entry.kind === \"file\") {\n          filePromises.push(entry.getFile());\n        } else if (entry.kind === \"directory\") {\n          folderPromise = processFolder(entry);\n          break;\n        }\n      }\n    }\n\n    if (folderPromise) {\n      await Promise.all([folderPromise]);\n    }\n\n    if (filePromises.length > 0) {\n      const fileObjs = await Promise.all(filePromises);\n      await compileFiles(fileObjs);\n    }\n  }\n}\n\nasync function downloadSnapshot(snapshot) {\n  await dataConnect.createSnapshotDownloadUrl({\n    snapshot_id: parseInt(snapshot.id),\n  }).then(async (data) => {\n    if (data && data.result) {\n      for (const [key, url] of Object.entries(data.result)) {\n        await downloadFile(url, key);\n      }\n    } else if (data && data.error) {\n      $toast.open({\n        queue: true,\n        duration: 5000,\n        dismissible: true,\n        message: data.error.message,\n        type: 'error',\n        position: 'top',\n      });\n    }\n  }).catch((e) => {\n    $toast.open({\n      queue: true,\n      duration: 5000,\n      dismissible: true,\n      message: e,\n      type: 'error',\n      position: 'top',\n    });\n  });\n}\n\nasync function downloadFile(url, key) {\n  return new Promise((resolve) => {\n    const a = document.createElement(\"a\");\n    a.href = url;\n    a.download = key;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    setTimeout(resolve, 1000); // Wait before next download\n  });\n}\n\nonBeforeMount(() => {\n  getSnapshots();\n  if (!projects.value || (projects.value && projects.value.length === 0)) {\n    getProjectList();\n  }\n});\n\ndefineExpose({\n  getSnapshots,\n});\n\n</script>\n\n<style lang=\"scss\" scoped>\n\na {\n  text-decoration: none;\n  @include themify() {\n      color: themed('body-text-color');\n    }\n}\n.data-table {\n  width: calc(100% - 40px);\n  height: 100%;\n  padding: 0 15px 15px 15px;\n  border-radius: 8px;\n  border: 3px solid transparent;\n  margin: 0 20px 20px 20px;\n  overflow-y: auto;\n\n  th + th:not(:nth-last-of-type(-n+1)) {\n    border-left: 2px solid rgb(74, 76, 75);\n    border-image: linear-gradient(to bottom, rgba(108,219,141,0) 25%,rgba(74, 76, 75,1) 25%,rgba(74, 76, 75,1) 75%,rgba(108,219,141,0) 75%);\n    border-image-slice: 1;\n  }\n\n  &._highlight {\n    border: 3px dashed #250E81;\n    background: #250e8125;\n  }\n\n}\n\n:deep(.v-table) {\n  background: transparent;\n  border-radius: 0;\n}\n\n.th2 {\n  background: transparent !important;\n  span {\n    font-size: 1.0rem;\n    font-weight: 600;\n  }\n}\n\n.select-all {\n  display: flex;\n  flex-direction: row;\n  width: 15px;\n}\n\n.label-icon {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  color: var(--color-black) !important;\n\n  :nth-child(2) {\n    margin-left: 5px;\n  }\n}\n\n.status-tag {\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  font-weight: 600;\n  white-space: nowrap;\n  @include themify() {\n    color: themed('color-black');\n  }\n\n  &._running {\n    @include themify() {\n      color: themed('color-status-complete');\n    }\n  }\n  &._pending {\n    @include themify() {\n      color: themed('color-status-running');\n    }\n  }\n  &._success {\n    @include themify() {\n      color: themed('color-status-complete');\n    }\n  }\n  &._error {\n    @include themify() {\n      color: themed('color-status-error');\n    }\n  }\n  &._unavailable {\n      color: var(--gray-600)\n  }\n\n  div {\n    color: inherit;\n    width: 4px;\n    height: 4px;\n    border: solid 4px;\n    border-radius: 4px;\n    margin-right: 4px;\n  }\n}\n\n.filters{\n  margin: 10px 20px;\n  display: flex;\n  flex-direction: column;\n\n  &__header{\n    display: flex;\n    flex-direction: row;\n    .left{\n      width: 40%;\n      max-width: 40%;\n\n      span{\n        font-weight: bold;\n        font-size: 1.15rem;\n      }\n    }\n    .right{\n      display: flex;\n      flex-direction: row;\n      width: 60%;\n      max-width: 60%;\n      gap: 12px;\n      align-items: center;\n      justify-content: flex-end;\n    }\n  }\n\n  &__footer{\n    display: flex;\n    flex-direction: row;\n\n    .left{\n      width: 50%;\n      max-width: 50%;\n    }\n    .right{\n      width: 50%;\n      max-width: 50%;\n      justify-content: flex-end;\n    }\n  }\n}\n\n.button {\n  background: white;\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 26px;\n  padding: 0;\n  box-shadow: 1px 2px 4px 1px rgba(0, 0, 0, 0.2), 0 0 1px 1px rgba(0, 0, 0, 1);\n  padding: 4px 8px;\n  gap: 2px;\n  width: fit-content;\n\n  @include themify() {\n    color: themed('body-text-color')\n  }\n\n  &:hover {\n    background: rgba(var(--color-primary-100-rgb), 0.5);\n  }\n}\n\n.file-read {\n  color: var(--color-success);\n  font-size: 0.9rem;\n  font-weight: 600;\n\n  &.parse-fail {\n    color: var(--color-error);\n  }\n}\n\n:deep(.v-data-table__tr) {\n  td:first-child:hover {\n    background: var(--color-white-800);\n  }\n\n  &:hover{\n    .actions {\n      visibility: visible;\n    }\n  }\n}\n\n.actions {\n  cursor: pointer;\n  visibility: hidden;\n  color: grey;\n  &:hover {\n    @include themify() {\n      color: themed('icon-color-primary');\n      background-color: themed('icon-hover-color');\n      border-radius: 100%;\n      box-shadow: 0 0 0 4px themed('icon-hover-color');\n    }\n  }\n}\n\n.remove-icon {\n  color: var(--color-error);\n}\n\n.td-name-cell {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  height: fit-content;\n  min-height: 25px;\n  padding: 0 0 0 0;\n\n  &[active=\"true\"] .edit-btn, &:hover .edit-btn {\n    visibility: visible !important;\n  }\n\n  .chkbx-input {\n    display: none;\n  }\n\n  .text {\n    margin-left: 5px;\n    font-size: 0.9rem;\n    width: 170px;\n    border-bottom: 1px solid transparent;\n    cursor: text;\n    flex: 1 1 auto;\n    font-weight: 500;\n  }\n\n  input[type=\"text\"] {\n    margin-left: 5px;\n    width: 170px;\n    font-size: 0.9rem;\n    border-bottom: 1px solid transparent;\n    outline: none;\n\n    &:focus {\n      border-bottom: 1px solid #250E81;\n    }\n  }\n\n  .edit-btn {\n    visibility: hidden;\n  }\n}\n\n.cursor-pointer {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 5px;\n}\n</style>\n","import script from \"./SnapshotList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./SnapshotList.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./SnapshotList.vue?vue&type=style&index=0&id=1bb850aa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-1bb850aa\"]])\n\nexport default __exports__","import { render } from \"./Snapshots.vue?vue&type=template&id=cf824766\"\nimport script from \"./Snapshots.vue?vue&type=script&lang=js\"\nexport * from \"./Snapshots.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Welcome.vue?vue&type=template&id=14f92926&scoped=true\"\nimport script from \"./Welcome.vue?vue&type=script&lang=js\"\nexport * from \"./Welcome.vue?vue&type=script&lang=js\"\n\nimport \"./Welcome.vue?vue&type=style&index=0&id=14f92926&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-14f92926\"]])\n\nexport default __exports__","<template>\n  <!-- PAGE LOADER -->\n  <div id=\"page-loader\">\n    <!-- CONTAINER MID -->\n    <div class=\"container-mid\">\n      <img src=\"@/assets/static-page/assets/images/logo_full_light.svg\" class=\"img-responsive\" alt=\"image\">\n\n      <!-- SPINNER CONTAINER -->\n      <div class=\"spinner-container\">\n        <div class=\"css-spinner\" />\n      </div>\n      <!-- /SPINNER CONTAINER -->\n    </div>\n    <!-- /CONTAINER MID -->\n  </div>\n  <!-- /PAGE LOADER -->\n\n  <!-- NAVIGATION -->\n  <nav class=\"navigation-main sticky-navigation is-sticky\">\n    <!-- CONTAINER -->\n    <div class=\"container\">\n      <!-- NAVIGATION HEADER -->\n      <div class=\"navbar-header\">\n        <button\n          type=\"button\"\n          class=\"navbar-toggle\"\n          data-toggle=\"collapse\"\n          data-target=\"#navbar\"\n          @click=\"handleMenuClick\"\n        >\n          <span class=\"ti-menu\" />\n        </button>\n\n        <a class=\"navbar-brand\" href=\"#\"><img class=\"img-responsive\" src=\"@/assets/img/edgefirst_hexagon.svg\" width=\"300px\"></a>\n      </div>\n      <!-- /NAVIGATION HEADER -->\n\n      <!-- NAVBAR -->\n      <div id=\"navbar\" class=\"navbar-collapse collapse\">\n        <!-- MENU ITEMS LIST -->\n        <ul class=\"navigation-items nav navbar-nav navbar-right\">\n          <li> <a class=\"phantom\" href=\"#hero\">Home</a> </li>\n          <li> <a @click=\"handleScrollToSection('features')\">Features</a> </li>\n          <li> <a @click=\"handleScrollToSection('mlops')\">MLOPS</a> </li>\n          <li> <a @click=\"handleScrollToSection('agtg')\">AGTG</a> </li>\n          <li> <a @click=\"handleScrollToSection('edge')\">Edge Ready</a> </li>\n          <li> <a @click=\"handleScrollToSection('price')\">Pricing</a> </li>\n          <li> <a @click=\"handleScrollToSection('trial')\">Free Trial</a> </li>\n          <li> <a @click=\"handleScrollToSection('contact')\">Contact Us</a> </li>\n          <li> <router-link id=\"login-btn\" class=\"button button-secondary login-btn\" to=\"/login\">Login</router-link> </li>\n          <li>\n            <a\n              id=\"get-started-btn\"\n              class=\"button login-btn\"\n              href=\"https://doc.edgefirst.ai\"\n            >Get Started</a>\n          </li>\n\n          <!-- DROPDOWN MENU -->\n          <!-- <li class=\"dropdown\"> -->\n          <!-- <span class=\"dropdown-toggle\" data-toggle=\"dropdown\">Features <b class=\"caret\"></b></span>\n                           -->\n\n          <!-- DROPDOWN MENU INNER -->\n          <!-- <ul class=\"dropdown-menu\">\n                <li><a href=\"shortcodes.html\" target=\"_blank\" class=\"external\">Shortcodes</a></li>\n                <li><a href=\"typography.html\" target=\"_blank\" class=\"external\">Typography</a></li>\n                <li><a href=\"404.html\" target=\"_blank\" class=\"external\">404 Page</a></li>\n              </ul> -->\n          <!-- /DROPDOWN MENU INNER -->\n          <!-- </li> -->\n          <!-- /DROPDOWN MENU -->\n        </ul>\n        <!-- <router-link class=\"button login-btn\" to=\"/login\">Login</router-link> -->\n        <!-- /MENU ITEMS LIST -->\n      </div>\n      <!-- /NAVBAR -->\n    </div>\n    <!-- /CONTAINER -->\n  </nav>\n  <!-- /NAVIGATION -->\n\n  <div id=\"main\" class=\"dve-landing\">\n    <!-- HERO -->\n    <section id=\"hero\" class=\"hero hero-1\">\n      <!-- FRONT CONTENT -->\n      <div class=\"front-content page-enter-animated\">\n        <!-- CONTAINER MID -->\n        <div class=\"container-mid\">\n          <!-- INNER FRONT CONTENT -->\n          <div class=\"inner 3d-hover\">\n            <h2>Full 3D AI Perception Toolset - Ready at your click </h2>\n            <h1>EdgeFirst Studio</h1>\n\n            <p>Faster Route to Edge Deployment</p>\n            <p>Automated Ground Truth Generation</p>\n            <p>2D / 3D / 4D Dataset Processing</p>\n            <br>\n            <p>Scroll to learn more</p>\n          </div>\n          <!-- /INNER FRONT CONTENT -->\n        </div>\n        <!-- /CONTAINER MID -->\n\n        <div class=\"scroll-down\" />\n\n        <!-- CONTROLS -->\n        <div class=\"controls\">\n          <i class=\"volume-button fa fa-volume-up\" />\n          <i class=\"pause-button ti-control-pause\" />\n        </div>\n        <!--/ CONTROLS -->\n      </div>\n      <!-- /FRONT CONTENT -->\n\n      <!-- BACKGROUND CONTENT -->\n      <div class=\"background-content page-enter-animated\">\n        <div class=\"image-backdrop\" />\n        <!-- LEVEL 1 -->\n        <div class=\"level-1\">\n          <template v-for=\"(image, index) in heroImages\">\n            <transition name=\"slide-fade\">\n              <img\n                v-if=\"heroImage === index\"\n                :key=\"index\"\n                :src=\"image\"\n                class=\"level-1-img\"\n              >\n            </transition>\n          </template>\n        </div>\n        <!-- /LEVEL 1 -->\n\n        <!-- /LEVEL 2 -->\n      </div>\n      <!-- /BACKGROUND CONTENT -->\n    </section>\n    <!-- /HERO -->\n    <!-- <header class=\"header\">\n      <div class=\"nav-group\">\n        <img class=\"header__logo\" :src=\"require('@/assets/img/auzoneLogo.svg')\" alt=\"\">\n        <span @click=\"navigateToMain\">Deep View Enterprise</span>\n        <span @click=\"navigateToPricing\">Pricing</span>\n        <span @click=\"navigateToHelp\">Help</span>\n      </div>\n    </header> -->\n\n    <!-- FREATURES -->\n    <section id=\"features\" ref=\"features\">\n      <!-- CONTENT -->\n      <div class=\"content bg-white block-work-1 padding-top-140 padding-bot-140\">\n        <!-- CONTAINER -->\n        <div class=\"container text-center\">\n          <!-- HEADER -->\n          <div class=\"header text-center scroll-animated-from-bottom\">\n            <h1>Features</h1>\n          </div>\n          <!-- /HEADER -->\n\n          <!-- GRID -->\n          <div class=\"dve-work-grid\">\n            <!-- LIDAR -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/lidar.jpg\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">LiDAR data processing and visualization</h5>\n                  <p class=\"hover-animated\">Lidar Data is used for creating 3D ground truth</p>\n                </div>\n              <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n\n              <h3>LIDAR</h3>\n              <!-- /CAPTION -->\n            </div>\n            <!-- /ITEM -->\n\n            <!-- 3d / 4D -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/3d.png\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">2D, 3D, 4D Data</h5>\n                  <p class=\"hover-animated\">Animations and sequences in 3D with point clouds</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>2D, 3D, 4D Support</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Projects-->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/project.png\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">Partition your work into logical projects</h5>\n                  <p class=\"hover-animated\">Overview project progress</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>PROJECTS</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Datasets  -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/agtg.png\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">AI Assisted Ground Truth Generation</h5>\n                  <p class=\"hover-animated\">Generate 3D Ground Truth while importing a dataset</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>DATASETS</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Training-->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/train.png\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">Train using high performance Server</h5>\n                  <p class=\"hover-animated\">Training is just a click away with sharable results and statistics</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>TRAINING</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Validation -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/val.png\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">Validate Models and Annotations Sets</h5>\n                  <p class=\"hover-animated\">Background process with extensive validation stats</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>VALIDATION</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Security -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/security.png\" alt=\"security\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">Access Control and Authorization</h5>\n                  <p class=\"hover-animated\">Component level access control</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>SECURITY</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Edge  -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/edge.png\" alt=\"work\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">Edge Deployment</h5>\n                  <p class=\"hover-animated\">Deploy to your target device with custom edge conversion pipelines</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>EDGE DEPLOYMENT</h3>\n            </div>\n            <!-- /ITEM -->\n\n            <!-- Security -->\n            <!-- ITEM -->\n            <div class=\"dve-grid-item\">\n              <!-- CAPTION -->\n              <div class=\"dve-grid-item__body\">\n                <!-- CAPTION WRAPPER DEFAULT -->\n                <div class=\"dve-grid-item__image\">\n                  <img src=\"@/assets/static-page/assets/images/features/audit.png\" alt=\"security\">\n                </div>\n                <!-- /CAPTION WRAPPER DEFAULT -->\n\n                <!-- CAPTION WRAPPER ACTIVE -->\n                <div class=\"dve-grid-item__caption\">\n                  <h5 class=\"hover-animated\">Dataset Audit Workflows</h5>\n                  <p class=\"hover-animated\">Multi users parallel audit and correction</p>\n                </div>\n                <!-- /CAPTION WRAPPER ACTIVE -->\n              </div>\n              <!-- /CAPTION -->\n              <h3>AUDIT</h3>\n            </div>\n            <!-- /ITEM -->\n          </div>\n          <!-- /GRID -->\n        </div>\n        <!-- /CONTAINER -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /FEATURES -->\n\n    <!-- MLOPS -->\n    <section id=\"mlops\" ref=\"mlops\">\n      <!-- CONTENT -->\n      <div class=\"content bg-black bg-parallax block-service-1 padding-top-130 padding-bot-200\">\n        <!-- CONTAINER -->\n        <div class=\"container\">\n          <!-- HEADER -->\n          <div class=\"header text-center\">\n            <h1>MLOps</h1>\n          </div>\n          <!-- /HEADER -->\n\n          <!-- TAB NAVIGATION -->\n          <ul class=\"tab-navigation clearfix\">\n            <!-- ITEM -->\n            <li class=\"scroll-animated-from-bottom\" :class=\"{active: mlopsTab === 'dataset-curation'}\">\n              <!-- TAB LINK -->\n              <a data-toggle=\"tab\" @click=\"handleMlopsTab('dataset-curation')\">\n\n                <span class=\"ti-server\" />Dataset Curation\n\n              </a>\n              <!-- /TAB LINK -->\n            </li>\n            <!-- /ITEM -->\n\n            <!-- ITEM -->\n            <li class=\"scroll-animated-from-bottom\" :class=\"{active: mlopsTab === 'annotation'}\">\n              <!-- TAB LINK -->\n              <a data-toggle=\"tab\" @click=\"handleMlopsTab('annotation')\">\n\n                <span class=\"ti-layout-list-thumb\" />Annotation\n\n              </a>\n              <!-- /TAB LINK -->\n            </li>\n            <!-- /ITEM -->\n\n            <!-- ITEM -->\n            <li class=\"scroll-animated-from-bottom\" :class=\"{active: mlopsTab === 'training'}\">\n              <!-- TAB LINK -->\n              <a data-toggle=\"tab\" @click=\"handleMlopsTab('training')\">\n\n                <span class=\"ti-control-record\" />Training\n\n              </a>\n              <!-- /TAB LINK -->\n            </li>\n            <!-- /ITEM -->\n\n            <!-- ITEM -->\n            <li class=\"scroll-animated-from-bottom\" :class=\"{active: mlopsTab === 'validation'}\">\n              <!-- TAB LINK -->\n              <a data-toggle=\"tab\" @click=\"handleMlopsTab('validation')\">\n\n                <span class=\"ti-bar-chart\" />Validation\n\n              </a>\n              <!-- /TAB LINK -->\n            </li>\n            <!-- /ITEM -->\n\n            <!-- ITEM -->\n            <li class=\"scroll-animated-from-bottom\" :class=\"{active: mlopsTab === 'edge-deployment'}\">\n              <!-- TAB LINK -->\n              <a data-toggle=\"tab\" @click=\"handleMlopsTab('edge-deployment')\">\n\n                <span class=\"ti-cloud-down\" />Edge Deployment\n\n              </a>\n              <!-- /TAB LINK -->\n            </li>\n            <!-- /ITEM -->\n          </ul>\n          <!-- /TAB NAVIGATION -->\n\n          <!-- TAB CONTENT CONTAINER -->\n          <div class=\"tab-content scroll-animated-from-bottom\">\n            <!-- TAB CONTENT 1 -->\n            <div v-if=\"mlopsTab === 'dataset-curation'\" id=\"dataset-curation\" class=\"tab-pane fade in active\">\n              <!-- ROW -->\n              <div class=\"row\">\n                <!-- COLUMN -->\n                <div class=\"col-md-4\">\n                  <h4>Import, Curate and Manage Datasets.<br>Advance Filters and Statistics.<br>Multi Dimensional Visualization.</h4>\n                </div>\n                <!-- /COLUMN -->\n\n                <!-- COLUMN -->\n                <div class=\"col-md-8\">\n                  <p>\n                    EdgeFirst Studio provides various stacks of pipelines for processing and manipulating data including MCAP, Zip Archives, Arrow files, Darknet, Yolo and Video formats.\n                  </p>\n                </div>\n                <!-- /COLUMN -->\n              </div>\n              <!-- /ROW -->\n            </div>\n            <!-- /TAB CONTENT 1 -->\n\n            <!-- TAB CONTENT 2 -->\n            <div v-if=\"mlopsTab === 'annotation'\" id=\"annotation\" class=\"tab-pane fade\">\n              <!-- ROW -->\n              <div class=\"row\">\n                <!-- COLUMN -->\n                <div class=\"col-md-4\">\n                  <h4>Wide varieties of annotations.<br>2D, 3D, Lidar, Point Cloud<br>Segmentation, GPS, IMU.<br>Automatic Ground Truth Generation</h4>\n                </div>\n                <!-- /COLUMN -->\n\n                <!-- COLUMN -->\n                <div class=\"col-md-8\">\n                  <p>\n                    EdgeFirst Studio allows multiple annotation sets per dataset. Annotation can be imported, manually added, AI assisted population or complete AI based pipelines. Background process ad Automated ground truth with zero human interaction.\n                  </p>\n                </div>\n                <!-- /COLUMN -->\n              </div>\n              <!-- /ROW -->\n            </div>\n            <!-- /TAB CONTENT 2 -->\n\n            <!-- TAB CONTENT 3 -->\n            <div v-if=\"mlopsTab === 'training'\" id=\"training\" class=\"tab-pane fade\">\n              <!-- ROW -->\n              <div class=\"row\">\n                <!-- COLUMN -->\n                <div class=\"col-md-4\">\n                  <h4>GPU based automated training.<br>No-Code, Click and Go.<br>Extensive metrics and artifacts.<br>Self direct background process.<br>Custom Models</h4>\n                </div>\n                <!-- /COLUMN -->\n\n                <!-- COLUMN -->\n                <div class=\"col-md-8\">\n                  <p>\n                    Various training pipelines are available right out of the box. These include Detection, Classification, Segmentation and Fusion models. Training progress is visible across the teams and results and artifacts an be mutually shared.\n                  </p>\n                </div>\n                <!-- /COLUMN -->\n              </div>\n              <!-- /ROW -->\n            </div>\n            <!-- /TAB CONTENT 3 -->\n\n            <!-- TAB CONTENT 4 -->\n            <div v-if=\"mlopsTab === 'validation'\" id=\"validation\" class=\"tab-pane fade\">\n              <!-- ROW -->\n              <div class=\"row\">\n                <!--\n                               COLUMN -->\n                <div class=\"col-md-4\">\n                  <h4>Validate Models.<br>Compare annotation sets.<br>Detection, Classification, Segmentation and Fusion validation</h4>\n                </div>\n                <!-- /COLUMN -->\n\n                <!-- COLUMN -->\n                <div class=\"col-md-8\">\n                  <p>\n                    Automated validation sessions with metrics and analytics.\n                  </p>\n                </div>\n                <!-- /COLUMN -->\n              </div>\n              <!-- /ROW -->\n            </div>\n            <!-- /TAB CONTENT 4 -->\n\n            <!-- TAB CONTENT 5 -->\n            <div v-if=\"mlopsTab === 'edge-deployment'\" id=\"edge-deployment\" class=\"tab-pane fade\">\n              <!-- ROW -->\n              <div class=\"row\">\n                <!-- COLUMN -->\n                <div class=\"col-md-4\">\n                  <h4>Multiple Deployment Targets<br>Edge Compatible Optimization.<br>Deploy directly to the targets</h4>\n                </div>\n                <!-- /COLUMN -->\n\n                <!-- COLUMN -->\n                <div class=\"col-md-8\">\n                  <p>\n                    Support for Broadcom Raspberry Pi 4, 5, Hailo-8,\n\n                    Intel NUC,\n\n                    Linux ARM Ethos-U55,\n                    Linux ARM Ethos-U65,\n                    Linux ARM Ethos-U85,\n\n                    Kinara Ara-1,\n                    Kinara Ara-2,\n                    RockChip RK3588,\n                    NXP iMX 8.\n                  </p>\n                </div>\n                <!-- /COLUMN -->\n              </div>\n              <!-- /ROW -->\n            </div>\n            <!-- /TAB CONTENT 5 -->\n          </div>\n          <!-- /TAB CONTENT CONTAINER -->\n        </div>\n        <!-- /CONTAINER -->\n\n        <!-- BACKGROUND -->\n\n        <!-- /BACKGROUND -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /MLOPS -->\n\n    <!-- AGTG -->\n    <section id=\"agtg\" ref=\"agtg\">\n      <!-- CONTENT -->\n      <div class=\"content bg-white block-about-1 padding-top-140 padding-bot-130\">\n        <!-- CONTAINER -->\n        <div class=\"container text-left\">\n          <!-- HEADER -->\n          <div class=\"header text-center scroll-animated-from-bottom\">\n            <h1>Automated Ground Truth Generation</h1>\n          </div>\n          <!-- /HEADER -->\n          <img class=\"img-responsive scroll-animated-from-bottom\" src=\"@/assets/static-page/assets/images/3d/stack.png\" alt=\"Edit me\">\n\n          <!-- ROW -->\n          <div class=\"row padding-top-50\">\n            <!-- COLUMN -->\n            <div class=\"col-sm-6\">\n              <img class=\"img-responsive scroll-animated-from-bottom\" src=\"@/assets/static-page/assets/images/3d/1.jpg\" alt=\"image\">\n\n              <p class=\"scroll-animated-from-bottom\">\n                Automated Ground Truth Generation uses AI tools and machine learning algorithms to\n                produce ground truth data for training machine learning models. This process uses machine\u0002based heuristics and algorithmic computations to significantly reduce the need for human\n                expertise and manual effort. The aim of this project is to create 3D annotations, such as\n                bounding boxes, occupancy grids, and projected segmentation from a video or image\n                sequences. EdgeFirst Studio allows\n                for generating ground truth data for more complex areas like 3D as it requires advanced\n                technical skills and the fusion of data from multiple sources. This feature can generate 3D ground truth annotation from a sequence of images /\n                video with minimal with interaction and effort\n              </p>\n\n              <!-- CONTAINER VIDEO -->\n              <div class=\"container-video scroll-animated-from-bottom\">\n                <!-- LIGHTBOX LINK -->\n                <a class=\"cbp-lightbox\" href=\"https://www.youtube.com/watch?v=2_jCt9_EYdY\">\n\n                  <span class=\"ti-control-play\" />\n\n                </a>\n                <!-- /LIGHTBOX LINK -->\n\n                <img class=\"img-responsive\" src=\"@/assets/static-page/assets/images/3d/2.jpg\" alt=\"video\">\n              </div>\n              <!-- /CONTAINER VIDEO -->\n            </div>\n            <!-- /COLUMN -->\n\n            <!-- COLUMN -->\n            <div class=\"col-sm-6\">\n              <h3 class=\"scroll-animated-from-bottom\">\n                Multi-functional Precessing Pipeline Stack<br>\n                Generate 3D Datasets from Raw Videos<br>\n                <br>\n              </h3>\n\n              <br>\n              <p>\n                <span class=\"ti-control-record\" /> Automatically generate segmentation mask in an image<br>\n                <span class=\"ti-control-record\" /> Automatically generate segmentation mask in an image<br>\n                <span class=\"ti-control-record\" /> The segmentation mask error should be less than 15%<br>\n                <span class=\"ti-control-record\" /> Segmentation time per image should be less than 1 second<br>\n                <span class=\"ti-control-record\" /> Be able to track an object over several frames with a tracking error of less that 10% <br>\n                <span class=\"ti-control-record\" /> Estimate Tracked object distance with a error or of less than 20%<br>\n                <span class=\"ti-control-record\" /> Be able to process at least 1000 images for tracking <br>\n                <span class=\"ti-control-record\" /> Generate Occupancy Grid with a top-down accuracy per object less than 20%<br>\n                <span class=\"ti-control-record\" /> Occupancy Grid horizontal accuracy of less than 15%<br>\n                <span class=\"ti-control-record\" /> Visualizer to view the generated 3D Ground Truth Annotations with interactions:<br>\n                <span class=\"ti-control-record\" /> Rotate in 3D<br>\n                <span class=\"ti-control-record\" /> Zoom<br>\n                <span class=\"ti-control-record\" /> Pan in 3D<br>\n                <span class=\"ti-control-record\" /> Edit any annotation<br>\n                <span class=\"ti-control-record\" /> Scale in 3D<br>\n                <span class=\"ti-control-record\" /> Move in 3D<br>\n                <span class=\"ti-control-record\" /> View on pre-defined planes<br>\n                <span class=\"ti-control-record\" /> Top-down<br>\n                <span class=\"ti-control-record\" /> Camera normal<br>\n                <span class=\"ti-control-record\" /> Web Based application<br>\n              </p>\n              <br>\n            </div>\n            <!-- /COLUMN -->\n          </div>\n          <!-- ROW -->\n        </div>\n        <!-- /CONTAINER -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /AGTG -->\n\n    <!-- Edge -->\n    <section id=\"edge\" ref=\"edge\">\n      <!-- CONTENT -->\n      <div class=\"content bg-black bg-parallax block-process-1 padding-top-130 padding-bot-180\">\n        <!-- CONTAINER -->\n        <div class=\"container\">\n          <!-- HEADER -->\n          <div class=\"header text-center scroll-animated-from-bottom\">\n            <h1>Edge Deployment</h1>\n          </div>\n          <!-- /HEADER -->\n\n          <!-- SLIDER CONTAINER -->\n          <div class=\"row\">\n            <div class=\"col-sm-3\">\n              <img src=\"@/assets/static-page/assets/images/features/edge2.png\" width=\"200\">\n            </div>\n            <div class=\"col-sm-3\">\n              <img src=\"@/assets/static-page/assets/images/features/edge.png\" width=\"140\">\n            </div>\n            <div class=\"col-sm-6\">\n              <p>\n                Get Deployment Ready models optimized for various targets including:<br>\n                <span class=\"ti-control-record\" /> i.MX8 MP<br>\n                <span class=\"ti-control-record\" /> i.MX95<br>\n                <span class=\"ti-control-record\" /> RK3588<br>\n                <span class=\"ti-control-record\" /> NVidia Jetsen<br>\n                <span class=\"ti-control-record\" /> Nvidia Orin<br>\n                <span class=\"ti-control-record\" /> Kinara ARA-2<br>\n                <span class=\"ti-control-record\" /> TI AM68/69A<br>\n              </p>\n            </div>\n          </div>\n          <!-- /SLIDER CONTAINER -->\n        </div>\n        <!-- /CONTAINER -->\n\n        <!-- BACKGROUND -->\n\n        <!-- /BACKGROUND -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /Edge -->\n\n    <!-- Pricing -->\n    <section id=\"price\" ref=\"price\">\n      <!-- CONTENT -->\n      <div class=\"content bg-white block-team-1 padding-top-140 padding-bot-160\">\n        <!-- CONTAINER -->\n        <div class=\"container\">\n          <!-- HEADER -->\n          <div class=\"header text-center scroll-animated-from-bottom\">\n            <h1>Pricing</h1>\n          </div>\n          <!-- /HEADER -->\n        </div>\n        <!-- /CONTAINER -->\n\n        <!-- CONTAINER   PRICING  -->\n\n        <div class=\"container our-skills padding-top-100\">\n          <div class=\"pricing-table\" :style=\"{ maxWidth: maxWidth}\">\n            <h3 :style=\"{color: textColor}\">Pricing Plans</h3>\n            <div class=\"pricing-table__subtitle\">\n              <p :style=\"{color: textColor}\">\n                Sign up for free to claim $10 in credits.\n                For customized plans and payments, contact our sales team\n              </p>\n            </div>\n            <table class=\"table\">\n              <colgroup>\n                <col span=\"1\" style=\"width: 16%;\">\n                <col span=\"1\" style=\"width: 10%;\" class=\"free\">\n                <col span=\"1\" style=\"width: 10%;\" class=\"low\">\n                <col span=\"1\" style=\"width: 10%;\" class=\"medium\">\n                <col span=\"1\" style=\"width: 10%;\" class=\"high\">\n              </colgroup>\n              <tbody>\n                <tr class=\"header-row\">\n                  <th />\n                  <th><div class=\"cell text-center highlight\"><h5>Free (Trial)</h5></div></th>\n                  <th><div class=\"cell text-center highlight\"><h5>Basic</h5></div></th>\n                  <th><div class=\"cell text-center highlight\"><h5>Pro</h5></div></th>\n                  <th><div class=\"cell text-center highlight\"><h5>Business</h5></div></th>\n                </tr>\n                <tr class=\"header-row-secondary\">\n                  <th />\n                  <th><div class=\"cell text-center cost-tag\">One-time $ 10 credit</div></th>\n                  <th><div class=\"cell text-center cost-tag\">$500</div></th>\n                  <th><div class=\"cell text-center cost-tag\">$1000</div></th>\n                  <th><div class=\"cell text-center cost-tag\">$2000</div></th>\n                </tr>\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>Seats (Per User / Month)</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Adding New User</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>-</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $50\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $50\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $50\n                    </div>\n                  </td>\n                </tr>\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>Machine Learning Operations (Per Hour)</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Auto Annotation</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $7\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $7\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $4\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $2\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>AI Assisted Segmentation</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $20\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $16\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $12\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $10\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Image Based Training</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $7\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $7\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $4\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $2\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Sensor Fusion Model Training</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $20\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $16\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $12\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $10\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Model Quantization & Conversion</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Model & Inference Validation</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $7\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $7\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $4\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      $2\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Edge Model Optimization & Export</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Data Audit & Labelling</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                </tr>\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>Data Storage (Per Month)</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Image (per Image)</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢5\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢5\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢0.5\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢0.2\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Parked Image (per Image)</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      50%\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      50%\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      50%\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      50%\n                    </div>\n                  </td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Snapshots / Binary Data (per MB)</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢20\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢20\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢15\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢10\n                    </div>\n                  </td>\n                </tr>\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>Annotations (Per Month)</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>2D/3D/Segmentation etc</span></div></td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢1.0\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢1.0\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢0.2\n                    </div>\n                  </td>\n                  <td>\n                    <div class=\"cell text-center highlight\">\n                      ¢0.05\n                    </div>\n                  </td>\n                </tr>\n\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>Live Data & Dataset Enrichment (Per Call)</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Bridge API</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Free</span></div></td>\n                </tr>\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>License</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>ModelPack Enterprise</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                </tr>\n                <tr class=\"header-row-secondary description\">\n                  <td><div class=\"cell text-left text-italic\" :style=\"{color: textColor}\"><h6>Support Package</h6></div></td>\n                  <td />\n                  <td />\n                  <td />\n                  <td />\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Technical Support</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Not Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                </tr>\n                <tr>\n                  <td><div class=\"cell text-left tab\" :style=\"{color: textColor}\"><span>Feature Request</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Not Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                  <td><div class=\"cell text-center highlight\"><span>Included</span></div></td>\n                </tr>\n\n                <tr>\n                  <td colspan=\"5\">\n                    <div class=\"cell text-left\" :style=\"{color: textColor}\">\n                      <span class=\"unit\">\n                        (*): Minimum monthly charge on an annual basis. A credit amount equal to the minimum monthly charge will be deducted.\n                      </span>\n                    </div>\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n        <!-- /CONTAINER PRINCING -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /Pricing -->\n\n    <!-- TRIAL -->\n    <section id=\"trial\" ref=\"trial\">\n      <!-- CONTENT -->\n      <div class=\"content bg-black bg-parallax block-news-1 padding-top-140 padding-bot-200\">\n        <!-- CONTAINER -->\n        <div class=\"container\">\n          <!-- HEADER -->\n          <div class=\"header text-center scroll-animated-from-bottom\">\n            <h1>Free Trial</h1>\n            <br>\n            <img src=\"@/assets/img/edgefirst_hexagon_light.svg\" height=\"300px\">\n            <br>\n\n            <a class=\"mt-4 button login-btn\" href=\"https://doc.edgefirst.ai\">Click Here to Get A Free Trial</a>\n          </div>\n          <!-- /HEADER -->\n        </div>\n        <!-- /CONTAINER -->\n\n        <!-- BACKGROUND -->\n\n        <!-- /BACKGROUND -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /TRIAL -->\n\n    <!-- CONTACT -->\n    <section id=\"contact\" ref=\"contact\">\n      <!-- CONTENT -->\n      <div class=\"content bg-white block-contact-1 padding-top-130 padding-bot-120\">\n        <!-- CONTAINER -->\n        <div class=\"container\">\n          <!-- HEADER -->\n          <div class=\"header text-center scroll-animated-from-bottom\">\n            <h1>Contact</h1>\n          </div>\n          <!-- /HEADER -->\n\n          <!-- ROW-->\n          <!-- <div class=\"row\"> -->\n          <!-- TAB NAVIGATION -->\n          <!-- <ul class=\"tab-navigation clearfix scroll-animated-from-bottom\"> -->\n          <!-- TAB NAVIGATION ITEM-1 -->\n          <!-- <li class=\"active\"> -->\n          <!-- TAB LINK -->\n          <!-- <a href=\"#contact-data-1\" data-toggle=\"tab\">\n\n                  <span class=\"ti-comment-alt\" />Contact Us\n\n                </a> -->\n          <!-- /TAB LINK -->\n          <!-- </li> -->\n          <!-- /TAB NAVIGATION ITEM-1 -->\n\n          <!-- TAB NAVIGATION ITEM-2 -->\n          <!-- <li> -->\n          <!-- TAB LINK -->\n          <!-- <a href=\"#contact-data-2\" data-toggle=\"tab\">\n\n                  <span class=\"ti-map\" />Visit Us\n\n                </a> -->\n          <!-- /TAB LINK -->\n          <!-- </li> -->\n          <!-- /TAB NAVIGATION ITEM-2 -->\n\n          <!-- TAB NAVIGATION ITEM-3 -->\n          <!-- <li> -->\n          <!-- TAB LINK -->\n          <!-- <a href=\"#contact-data-3\" data-toggle=\"tab\">\n\n                  <span class=\"ti-vector\" />Follow Us\n\n                </a> -->\n          <!-- /TAB LINK -->\n          <!-- </li> -->\n          <!-- /TAB NAVIGATION ITEM-3 -->\n          <!-- </ul> -->\n          <!-- /TAB NAVIGATION -->\n          <!-- </div> -->\n          <!-- ROW-->\n\n          <!-- TAB CONTENT CONTAINER -->\n          <div class=\"tab-content\">\n            <!-- TAB CONTENT ITEM-1 -->\n            <div id=\"contact-data-1\" class=\"tab-pane fade in active\">\n              <!-- FORM-->\n              <form\n                id=\"contact-form\"\n                autocomplete=\"off\"\n                @submit.prevent=\"handleContactSubmit\"\n              >\n                <!-- FORM GROUP -->\n                <div class=\"form-group scroll-animated-from-bottom\">\n                  <input\n                    id=\"contact-form-name\"\n                    v-model=\"formData.name\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    name=\"name\"\n                    placeholder=\"* NAME\"\n                  >\n                </div>\n                <!-- /FORM GROUP -->\n\n                <!-- FORM GROUP -->\n                <div class=\"form-group scroll-animated-from-bottom\">\n                  <input\n                    id=\"contact-form-email\"\n                    v-model=\"formData.email\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    name=\"email\"\n                    placeholder=\"* EMAIL\"\n                  >\n                </div>\n                <!-- /FORM GROUP -->\n\n                <!-- FORM GROUP -->\n                <!-- <div class=\"form-group scroll-animated-from-bottom\">\n\n                                      <input data-require-filling=\"false\" type=\"text\" id=\"contact-form-company\" class=\"form-control\" name=\"company\" placeholder=\"COMPANY\">\n\n                                  </div> -->\n                <!-- /FORM GROUP -->\n\n                <!-- FORM GROUP -->\n                <!-- <div class=\"form-group scroll-animated-from-bottom\">\n\n                                      <input data-require-filling=\"false\" type=\"text\" id=\"contact-form-address\" class=\"form-control\" name=\"address\" placeholder=\"ADDRESS\">\n\n                                  </div> -->\n                <!-- /FORM GROUP -->\n\n                <!-- FORM GROUP -->\n                <!-- <div class=\"form-group scroll-animated-from-bottom\">\n\n                                      <input data-require-filling=\"false\" type=\"text\" id=\"contact-form-phone\" class=\"form-control\" name=\"phone\" placeholder=\"PHONE\">\n\n                                  </div> -->\n                <!-- /FORM GROUP -->\n\n                <!-- FORM GROUP ( HONEYPOT CAPTCHA - FOR SPAM PROTECTION - DO NOT REMOVE THIS FIELD ) -->\n                <div class=\"form-group scroll-animated-from-bottom hpc\">\n                  <input\n                    id=\"contact-form-country\"\n                    v-model=\"formData.country\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    name=\"country\"\n                    placeholder=\"* COUNTRY\"\n                  >\n                </div>\n                <!-- /FORM GROUP ( HONEYPOT CAPTCHA - FOR SPAM PROTECTION - DO NOT REMOVE THIS FIELD ) -->\n\n                <!-- FORM GROUP -->\n                <div class=\"form-group scroll-animated-from-bottom\">\n                  <input\n                    id=\"contact-form-subject\"\n                    v-model=\"formData.subject\"\n                    data-require-filling=\"true\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    name=\"subject\"\n                    placeholder=\"* SUBJECT\"\n                  >\n                </div>\n                <!-- /FORM GROUP -->\n\n                <!-- FORM GROUP -->\n                <div class=\"form-group button-container scroll-animated-from-bottom\">\n                  <input\n                    id=\"contact-form-message\"\n                    v-model=\"formData.message\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    name=\"message\"\n                    placeholder=\"* MESSAGE\"\n                  >\n\n                  <!-- BUTTON WRAPPER -->\n                  <div class=\"button-wrapper\">\n                    <button type=\"submit\"><span class=\"ti-arrow-right\" /></button>\n                  </div>\n                  <!-- /BUTTON WRAPPER -->\n                </div>\n                <!-- /FORM GROUP -->\n              </form>\n              <span v-if=\"contactFormMessage.message\" id=\"contact-form-result-message\" :class=\"{_error: contactFormMessage.isError}\">{{ contactFormMessage.message }}</span>\n              <!-- /FORM-->\n            </div>\n            <!-- /TAB CONTENT ITEM-1 -->\n          </div>\n          <!-- /TAB CONTENT CONTAINER -->\n        </div>\n        <!-- /CONTAINER -->\n      </div>\n      <!-- /CONTENT -->\n    </section>\n    <!-- /CONTACT -->\n\n    <!-- FOOTER -->\n    <footer>\n      <!-- CONTENT -->\n      <div class=\"content bg-black bg-parallax block-footer-1 padding-top-110 padding-bot-150\">\n        <!-- CONTAINER -->\n        <div class=\"container\">\n          <!-- ROW -->\n          <div class=\"row\">\n            <!-- COLUMN -->\n            <div class=\"col-lg-12 text-center\">\n              <img class=\"img-responsive scroll-animated-from-bottom\" src=\"@/assets/img/edgefirst_hexagon_light.svg\" alt=\"logo\">\n              <h5 class=\"scroll-animated-from-bottom\">© 2017. All Rights Reserved.</h5>\n            </div>\n            <!-- /COLUMN -->\n          </div>\n          <!-- /ROW -->\n        </div>\n        <!-- /CONTAINER -->\n\n        <!-- BUTTON SCROLL TOP CONTAINER -->\n        <div class=\"scroll-top\" @click=\"scrollToTop\">\n          <!-- BUTTON SCROLL TOP INNER -->\n          <div class=\"scroll-top-inner scroll-animated-from-bottom\">\n            <span style=\"fontFamily: 'themify'\" class=\"ti-arrow-up\" />\n          </div>\n          <!-- /BUTTON SCROLL TOP INNER -->\n        </div>\n        <!-- /BUTTON SCROLL TOP CONTAINER -->\n\n        <!-- BACKGROUND -->\n\n        <!-- /BACKGROUND -->\n      </div>\n      <!-- /CONTENT -->\n    </footer>\n    <!-- /FOOTER -->\n\n    <!-- PHANTOM WRAPPER FOR POPUPS ( REQUIRED FOR POPUPS )-->\n    <div class=\"phantom-wrapper-popups\" />\n  </div>\n</template>\n\n<script setup>\nimport {\n  onMounted, onUnmounted, ref, nextTick,\n} from 'vue';\nimport { useStore } from 'vuex';\nimport { useTimeoutPoll } from '@vueuse/core';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport \"@/assets/static-page/assets/css/vegas.css\";\n\nconst store = useStore();\nconst navigationFixed = ref(false);\nconst features = ref(null);\nconst mlops = ref(null);\nconst agtg = ref(null);\nconst edge = ref(null);\nconst price = ref(null);\nconst trial = ref(null);\nconst contact = ref(null);\nconst sections = {\n  features,\n  mlops,\n  agtg,\n  edge,\n  price,\n  trial,\n  contact,\n};\nconst mlopsTab = ref('dataset-curation');\nconst formData = ref({\n  name: '',\n  email: '',\n  subject: '',\n  message: '',\n  country: '', // Honeypot anti-spam field\n});\nconst contactFormMessage = ref({\n  message: '',\n  isError: false,\n});\n\nconst { isActive: isFetchServerHealthActive, pause: pauseChangeImage, resume: resumeChangeImage } = useTimeoutPoll(changeImage, 6000);\n\n// Define all config variables globally\nwindow.option_hero_animate_content_on_scroll = \"on\";\nwindow.option_hero_3d_hover_effect = \"on\";\nwindow.option_hero_parallax_hover_effect = \"on\";\nwindow.option_hero_gravity_effect = \"on\";\nwindow.option_hero_background_mode = \"kenburns\";\n\n// Image background config\nwindow.option_hero_background_image_path = [{ src: '/landing-page/assets/images/1.jpg' }];\n\n// Slider background config\nwindow.option_hero_background_slider_path = [{ src: \"/static-page/assets/images/1.jpg\" }, { src: \"/landing-page/assets/images/2.jpg\" }, { src: \"/landing-page/assets/images/3.jpg\" }];\nwindow.option_hero_background_slider_delay = 6000;\nwindow.option_hero_background_slider_transition = \"slideDown\";\nwindow.option_hero_background_slider_transitionDuration = 800;\n\n// Kenburns background config\nwindow.option_hero_background_kenburns_path = [{ src: \"/landing-page/assets/images/1.jpg\" }, { src: \"/landing-page/assets/images/2.jpg\" }, { src: \"/landing-page/assets/images/3.jpg\" }];\nwindow.option_hero_background_kenburns_delay = 6000;\nwindow.option_hero_background_kenburns_transition = \"slideDown\";\nwindow.option_hero_background_kenburns_transitionDuration = 800;\n\n// Add any other config variables needed by your scripts\nwindow.option_analytics_tracking = \"off\";\nwindow.option_analytics_tracking_id = \"UA-XXXXXXXX-X\";\n\nconst heroImage = ref(0);\nconst heroImages = ref(['/landing-page/assets/images/1.jpg', '/landing-page/assets/images/2.jpg', '/landing-page/assets/images/3.jpg']);\n\nfunction changeImage() {\n  heroImage.value = (heroImage.value + 1) % heroImages.value.length;\n}\n\nonMounted(() => {\n  const navbarToggle = document.querySelector(\".navbar-toggle\");\n  const navbarCollapse = document.querySelector(\".navbar-collapse\");\n\n  if (navbarToggle && navbarCollapse) {\n    // Close the navbar when clicking outside\n    document.addEventListener(\"click\", handleMenuClickOutside);\n  }\n\n  store.commit('setTheme', \"theme-auzone-light\");\n\n  navigationFixed.value = false;\n\n  resumeChangeImage();\n\n  loadScripts();\n});\n\nonUnmounted(() => {\n  document.removeEventListener(\"click\", handleMenuClickOutside);\n});\n\nasync function handleMenuClick() {\n  const navbarToggle = document.querySelector(\".navbar-toggle\");\n  const navbarCollapse = document.querySelector(\".navbar-collapse\");\n  const isExpanded = navbarCollapse.classList.toggle(\"in\"); // Toggle class\n  navbarToggle.setAttribute(\"aria-expanded\", isExpanded);\n}\n\nasync function handleMenuClickOutside(event) {\n  const navbarToggle = document.querySelector(\".navbar-toggle\");\n  const navbarCollapse = document.querySelector(\".navbar-collapse\");\n  if (!navbarCollapse.contains(event.target) && !navbarToggle.contains(event.target)) {\n    navbarCollapse.classList.remove(\"in\");\n    navbarToggle.setAttribute(\"aria-expanded\", \"false\");\n  }\n}\n\nasync function handleScrollToSection(section) {\n  await nextTick(); // Ensure elements are ready\n\n  if (sections[section]) {\n    sections[section].value.scrollIntoView({ behavior: 'smooth' });\n  }\n}\n\nfunction scrollToTop() {\n  const scrollableElement = document.querySelector(\"#main\");\n  scrollableElement.scrollTo({ top: 0, behavior: \"smooth\" });\n}\n\nfunction loadScripts() {\n  document.getElementById('page-loader').classList.add('hide-this');\n\n  setTimeout(() => {\n    document.querySelector('.hero .background-content.page-enter-animated').classList.add('show');\n\n    setTimeout(() => {\n    }, 200);\n\n    setTimeout(() => {\n      document.querySelector('.hero .front-content.page-enter-animated').classList.add('show');\n    }, 540);\n  }, 1000);\n}\n\nfunction handleMlopsTab(tab) {\n  mlopsTab.value = tab;\n}\n\nasync function handleContactSubmit() {\n  contactFormMessage.value.message = '';\n  contactFormMessage.value.isError = false;\n\n  // Check if required fields are filled\n  const {\n    name, email, subject, message,\n  } = formData.value;\n\n  // List of required fields to check\n  const requiredFields = {\n    name, email, subject, message,\n  };\n  const missingFields = Object.keys(requiredFields).filter((field) => !requiredFields[field]);\n\n  if (missingFields.length > 0) {\n    contactFormMessage.value.message = `Please fill in the following fields: ${missingFields.join(', ')}`;\n    contactFormMessage.value.isError = true;\n    return;\n  }\n\n  if (formData.value.country) {\n    return;\n  }\n\n  const dataConnect = new DatastoreConnect();\n\n  await dataConnect.userContact({ ...formData.value })\n    .then((resp) => {\n      if (resp.error !== undefined) {\n        throw Error(resp.error.message);\n      }\n\n      contactFormMessage.value.message = resp.result;\n      contactFormMessage.value.isError = false;\n    })\n    .catch((error) => {\n      contactFormMessage.value.message = error;\n      contactFormMessage.value.isError = true;\n    });\n}\n\n</script>\n\n<style lang=\"css\" scoped src=\"@/assets/static-page/assets/css/plugins.css\"></style>\n<style lang=\"css\" scoped src=\"@/assets/static-page/assets/css/icons.css\"></style>\n<style lang=\"css\" scoped src=\"@/assets/static-page/assets/css/layout.css\"></style>\n<style lang=\"css\" scoped src=\"@/assets/static-page/assets/css/hero.css\"></style>\n<style lang=\"css\" scoped src=\"@/assets/static-page/assets/css/blocks.css\"></style>\n<style lang=\"css\" scoped src=\"@/assets/static-page/assets/css/color/default.css\"></style>\n<style lang=\"scss\" scoped>\n\n:deep(:root) {\n  --base_color: #1d1631;\n  --text_color: rgb(229, 225, 224);\n  --highlight_color: #acd570;\n}\n\nli a span {\n  font-family: 'themify', sans-serif !important;\n}\n\n#main {\n  width: 100%;\n  height: 100vh;\n  font-weight: 300;\n  font-style: normal;\n  color: #fff;\n  background: #111;\n  // font-family: 'themify', sans-serif !important;\n  overflow: auto;\n  font-family: 'Open Sans', sans-serif !important;\n  margin-top: 80px;\n\n  --base_color: #1d1631;\n  --text_color: rgb(229, 225, 224);\n  --highlight_color: var(--color-accent);\n}\n\n.is-sticky {\n  position: fixed !important;\n  top: 0 !important;\n  width: 100% !important;\n  z-index: 1000 !important;\n  box-shadow: 0 2px 10px rgba(0,0,0,0.1) !important;\n}\n\n#page-loader .spinner-container .css-spinner {\n  border-top-color: var(--color-accent) !important;\n  border-left-color: var(--color-accent) !important;\n}\n\n// .app-page {\n//   display: flex;\n//   flex-direction: column;\n//   text-align: center;\n//   overflow: hidden;\n//   background-color: var(--color-primary);\n// }\n\n// $header-height: 50px;\n// .header {\n//   display: flex;\n//   align-items: center;\n//   font-size: 1rem;\n//   justify-content: space-between;\n//   gap: 15px;\n//   color: var(--primary-text-color);\n//   background-color: var(--color-primary);\n//   padding: 16px 16% 16px 16%;\n//   height: $header-height;\n//   z-index: 10;\n\n//   &__logo {\n//     width: 100px;\n//     height: 50px;\n//     padding: 6px 6px 6px 6px;\n//   }\n// }\n\n// .nav-group {\n//   display: flex;\n//   flex-direction:  row;\n//   align-items: center;\n\n//   span {\n//     padding: 0 20px;\n//     font-size: 1.0rem;\n//     font-weight: 600;\n//     cursor: pointer;\n//   }\n//   span:hover {\n//     color: rgb(201, 200, 200);\n//   }\n// }\n\n.navigation-main ul li .login-btn {\n  background-color: var(--color-primary-400) !important;\n  color: white;\n  padding: 0 20px;\n  border: none;\n  border-radius: 5px;\n  cursor: pointer;\n  font-size: 16px;\n  text-decoration: none;\n  line-height: 1 !important;\n  height: 40px;\n  align-content: center;\n  margin-top: 20px;\n  margin-bottom: 20px;\n\n  &:hover {\n    background-color: var(--color-primary-300);\n  }\n}\n\n.navigation-main ul li .login-btn.button-secondary {\n  background: var(--button-secondary) !important;\n  color: var(--button-secondary-text) !important;\n  border: solid 2px var(--button-secondary-outlined-border) !important;\n\n  &:hover {\n    background: var(--button-secondary-hover-color) !important;\n  }\n}\n\n#get-started-btn {\n  margin-left: 12px;\n}\n\n@media (max-width: 1200px) {\n  #get-started-btn {\n    margin-left: 0px;\n  }\n}\n\n.cbp img {\n  height: 400px;\n}\n\n// @media (max-width: $breakpoint-md) {\n//   .header {\n//     padding: 0;\n//     line-height: 1;\n//     width: 100%;\n//     padding: 0 16px;\n//     justify-content: center;\n//     align-items: center;\n//   }\n\n//   .nav-group {\n//     span {\n//       padding: 0 10px;\n//       font-size: 1.0rem;\n//       font-weight: 600;\n//       cursor: pointer;\n//     }\n//   }\n// }\n\n$navbar-mobile-breakpoint: 1200px;\n\n.nav {\n    padding-left: 0;\n    margin-bottom: 0;\n    list-style: none;\n}\n.nav > li {\n    position: relative;\n    display: block;\n}\n.nav > li > a {\n    position: relative;\n    display: block;\n    padding: 10px 15px;\n}\n.nav > li > a:focus,\n.nav > li > a:hover {\n    text-decoration: none;\n    background-color: #eee;\n}\n.nav > li.disabled > a {\n    color: #777;\n}\n.nav > li.disabled > a:focus,\n.nav > li.disabled > a:hover {\n    color: #777;\n    text-decoration: none;\n    cursor: not-allowed;\n    background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:focus,\n.nav .open > a:hover {\n    background-color: #eee;\n    border-color: #337ab7;\n}\n.nav .nav-divider {\n    height: 1px;\n    margin: 9px 0;\n    overflow: hidden;\n    background-color: #e5e5e5;\n}\n.nav > li > a > img {\n    max-width: none;\n}\n.nav-tabs {\n    border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n    float: left;\n    margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n    margin-right: 2px;\n    line-height: 1.42857143;\n    border: 1px solid transparent;\n    border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n    border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:focus,\n.nav-tabs > li.active > a:hover {\n    color: #555;\n    cursor: default;\n    background-color: #fff;\n    border: 1px solid #ddd;\n    border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n    width: 100%;\n    border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n    float: none;\n}\n.nav-tabs.nav-justified > li > a {\n    margin-bottom: 5px;\n    text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n}\n@media (min-width: 1200px) {\n    .nav-tabs.nav-justified > li {\n        display: table-cell;\n        width: 1%;\n    }\n    .nav-tabs.nav-justified > li > a {\n        margin-bottom: 0;\n    }\n}\n.nav-tabs.nav-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:focus,\n.nav-tabs.nav-justified > .active > a:hover {\n    border: 1px solid #ddd;\n}\n@media (min-width: 1200px) {\n    .nav-tabs.nav-justified > li > a {\n        border-bottom: 1px solid #ddd;\n        border-radius: 4px 4px 0 0;\n    }\n    .nav-tabs.nav-justified > .active > a,\n    .nav-tabs.nav-justified > .active > a:focus,\n    .nav-tabs.nav-justified > .active > a:hover {\n        border-bottom-color: #fff;\n    }\n}\n.nav-pills > li {\n    float: left;\n}\n.nav-pills > li > a {\n    border-radius: 4px;\n}\n.nav-pills > li + li {\n    margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:focus,\n.nav-pills > li.active > a:hover {\n    color: #fff;\n    background-color: #337ab7;\n}\n.nav-stacked > li {\n    float: none;\n}\n.nav-stacked > li + li {\n    margin-top: 2px;\n    margin-left: 0;\n}\n.nav-justified {\n    width: 100%;\n}\n.nav-justified > li {\n    float: none;\n}\n.nav-justified > li > a {\n    margin-bottom: 5px;\n    text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n}\n@media (min-width: 1200px) {\n    .nav-justified > li {\n        display: table-cell;\n        width: 1%;\n    }\n    .nav-justified > li > a {\n        margin-bottom: 0;\n    }\n}\n.nav-tabs-justified {\n    border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n    margin-right: 0;\n    border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:focus,\n.nav-tabs-justified > .active > a:hover {\n    border: 1px solid #ddd;\n}\n@media (min-width: 1200px) {\n    .nav-tabs-justified > li > a {\n        border-bottom: 1px solid #ddd;\n        border-radius: 4px 4px 0 0;\n    }\n    .nav-tabs-justified > .active > a,\n    .nav-tabs-justified > .active > a:focus,\n    .nav-tabs-justified > .active > a:hover {\n        border-bottom-color: #fff;\n    }\n}\n.tab-content > .tab-pane {\n    // display: none;\n}\n.tab-content > .active {\n    display: block;\n}\n.nav-tabs .dropdown-menu {\n    margin-top: -1px;\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n}\n.navbar {\n    position: relative;\n    min-height: 50px;\n    margin-bottom: 20px;\n    border: 1px solid transparent;\n}\n@media (min-width: 1200px) {\n    .navbar {\n        border-radius: 4px;\n    }\n}\n@media (min-width: 1200px) {\n    .navbar-header {\n        float: left;\n    }\n}\n.navbar-collapse {\n    padding-right: 15px;\n    padding-left: 15px;\n    overflow-x: visible;\n    -webkit-overflow-scrolling: touch;\n    border-top: 1px solid transparent;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n.navbar-collapse.in {\n    overflow-y: auto;\n}\n@media (min-width: 1200px) {\n    .navbar-collapse {\n        width: auto;\n        border-top: 0;\n        -webkit-box-shadow: none;\n        box-shadow: none;\n    }\n    .navbar-collapse.collapse {\n        display: block !important;\n        height: auto !important;\n        padding-bottom: 0;\n        overflow: visible !important;\n    }\n    .navbar-collapse.in {\n        overflow-y: visible;\n    }\n    .navbar-fixed-bottom .navbar-collapse,\n    .navbar-fixed-top .navbar-collapse,\n    .navbar-static-top .navbar-collapse {\n        padding-right: 0;\n        padding-left: 0;\n    }\n}\n.navbar-fixed-bottom .navbar-collapse,\n.navbar-fixed-top .navbar-collapse {\n    max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n    .navbar-fixed-bottom .navbar-collapse,\n    .navbar-fixed-top .navbar-collapse {\n        max-height: 200px;\n    }\n}\n.container-fluid > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container > .navbar-header {\n    margin-right: -15px;\n    margin-left: -15px;\n}\n@media (min-width: 1200px) {\n    .container-fluid > .navbar-collapse,\n    .container-fluid > .navbar-header,\n    .container > .navbar-collapse,\n    .container > .navbar-header {\n        margin-right: 0;\n        margin-left: 0;\n    }\n}\n.navbar-static-top {\n    z-index: 1000;\n    border-width: 0 0 1px;\n}\n@media (min-width: 1200px) {\n    .navbar-static-top {\n        border-radius: 0;\n    }\n}\n.navbar-fixed-bottom,\n.navbar-fixed-top {\n    position: fixed;\n    right: 0;\n    left: 0;\n    z-index: 1030;\n}\n@media (min-width: 1200px) {\n    .navbar-fixed-bottom,\n    .navbar-fixed-top {\n        border-radius: 0;\n    }\n}\n.navbar-fixed-top {\n    top: 0;\n    border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n    bottom: 0;\n    margin-bottom: 0;\n    border-width: 1px 0 0;\n}\n.navbar-brand {\n    float: left;\n    height: 50px;\n    padding: 15px 15px;\n    font-size: 18px;\n    line-height: 20px;\n}\n.navbar-brand:focus,\n.navbar-brand:hover {\n    text-decoration: none;\n}\n.navbar-brand > img {\n    display: block;\n}\n@media (min-width: 1200px) {\n    .navbar > .container .navbar-brand,\n    .navbar > .container-fluid .navbar-brand {\n        margin-left: -15px;\n    }\n}\n@media (max-width: 1400px) {\n  .navbar-brand > img {\n    width: 150px;\n  }\n}\n.navbar-toggle {\n    position: relative;\n    float: right;\n    padding: 9px 10px;\n    margin-top: 8px;\n    margin-right: 15px;\n    margin-bottom: 8px;\n    background-color: transparent;\n    background-image: none;\n    border: 1px solid transparent;\n    border-radius: 4px;\n}\n.navbar-toggle:focus {\n    outline: 0;\n}\n.navbar-toggle .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n    margin-top: 4px;\n}\n@media (min-width: 1200px) {\n    .navbar-toggle {\n        display: none;\n    }\n}\n.navbar-nav {\n    margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n    line-height: 20px;\n}\n@media (max-width: 767px) {\n    .navbar-nav .open .dropdown-menu {\n        position: static;\n        float: none;\n        width: auto;\n        margin-top: 0;\n        background-color: transparent;\n        border: 0;\n        -webkit-box-shadow: none;\n        box-shadow: none;\n    }\n    .navbar-nav .open .dropdown-menu .dropdown-header,\n    .navbar-nav .open .dropdown-menu > li > a {\n        padding: 5px 15px 5px 25px;\n    }\n    .navbar-nav .open .dropdown-menu > li > a {\n        line-height: 20px;\n    }\n    .navbar-nav .open .dropdown-menu > li > a:focus,\n    .navbar-nav .open .dropdown-menu > li > a:hover {\n        background-image: none;\n    }\n}\n@media (min-width: 1200px) {\n    .navbar-nav {\n        float: left;\n        margin: 0;\n    }\n    .navbar-nav > li {\n        float: left;\n    }\n    .navbar-nav > li > a {\n        padding-top: 15px;\n        padding-bottom: 15px;\n    }\n}\n.navbar-form {\n    padding: 10px 15px;\n    margin-top: 8px;\n    margin-right: -15px;\n    margin-bottom: 8px;\n    margin-left: -15px;\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n@media (min-width: 1200px) {\n    .navbar-form .form-group {\n        display: inline-block;\n        margin-bottom: 0;\n        vertical-align: middle;\n    }\n    .navbar-form .form-control {\n        display: inline-block;\n        width: auto;\n        vertical-align: middle;\n    }\n    .navbar-form .form-control-static {\n        display: inline-block;\n    }\n    .navbar-form .input-group {\n        display: inline-table;\n        vertical-align: middle;\n    }\n    .navbar-form .input-group .form-control,\n    .navbar-form .input-group .input-group-addon,\n    .navbar-form .input-group .input-group-btn {\n        width: auto;\n    }\n    .navbar-form .input-group > .form-control {\n        width: 100%;\n    }\n    .navbar-form .control-label {\n        margin-bottom: 0;\n        vertical-align: middle;\n    }\n    .navbar-form .checkbox,\n    .navbar-form .radio {\n        display: inline-block;\n        margin-top: 0;\n        margin-bottom: 0;\n        vertical-align: middle;\n    }\n    .navbar-form .checkbox label,\n    .navbar-form .radio label {\n        padding-left: 0;\n    }\n    .navbar-form .checkbox input[type=\"checkbox\"],\n    .navbar-form .radio input[type=\"radio\"] {\n        position: relative;\n        margin-left: 0;\n    }\n    .navbar-form .has-feedback .form-control-feedback {\n        top: 0;\n    }\n}\n@media (max-width: 767px) {\n    .navbar-form .form-group {\n        margin-bottom: 5px;\n    }\n    .navbar-form .form-group:last-child {\n        margin-bottom: 0;\n    }\n}\n@media (min-width: 1200px) {\n    .navbar-form {\n        width: auto;\n        padding-top: 0;\n        padding-bottom: 0;\n        margin-right: 0;\n        margin-left: 0;\n        border: 0;\n        -webkit-box-shadow: none;\n        box-shadow: none;\n    }\n}\n.navbar-nav > li > .dropdown-menu {\n    margin-top: 0;\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n    margin-bottom: 0;\n    border-top-left-radius: 4px;\n    border-top-right-radius: 4px;\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0;\n}\n.navbar-btn {\n    margin-top: 8px;\n    margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n    margin-top: 10px;\n    margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n    margin-top: 14px;\n    margin-bottom: 14px;\n}\n.navbar-text {\n    margin-top: 15px;\n    margin-bottom: 15px;\n}\n@media (min-width: 1200px) {\n    .navbar-text {\n        float: left;\n        margin-right: 15px;\n        margin-left: 15px;\n    }\n}\n@media (min-width: 1200px) {\n    .navbar-left {\n        float: left !important;\n    }\n    .navbar-right {\n        float: right !important;\n        margin-right: -15px;\n    }\n    .navbar-right ~ .navbar-right {\n        margin-right: 0;\n    }\n}\n.navbar-default {\n    background-color: #f8f8f8;\n    border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n    color: #777;\n}\n.navbar-default .navbar-brand:focus,\n.navbar-default .navbar-brand:hover {\n    color: #5e5e5e;\n    background-color: transparent;\n}\n.navbar-default .navbar-text {\n    color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n    color: #777;\n}\n.navbar-default .navbar-nav > li > a:focus,\n.navbar-default .navbar-nav > li > a:hover {\n    color: #333;\n    background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:focus,\n.navbar-default .navbar-nav > .active > a:hover {\n    color: #555;\n    background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:focus,\n.navbar-default .navbar-nav > .disabled > a:hover {\n    color: #ccc;\n    background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n    border-color: #ddd;\n}\n.navbar-default .navbar-toggle:focus,\n.navbar-default .navbar-toggle:hover {\n    background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n    background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n    border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:focus,\n.navbar-default .navbar-nav > .open > a:hover {\n    color: #555;\n    background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n        color: #777;\n    }\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus,\n    .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover {\n        color: #333;\n        background-color: transparent;\n    }\n    .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n    .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus,\n    .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover {\n        color: #555;\n        background-color: #e7e7e7;\n    }\n    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus,\n    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover {\n        color: #ccc;\n        background-color: transparent;\n    }\n}\n.navbar-default .navbar-link {\n    color: #777;\n}\n.navbar-default .navbar-link:hover {\n    color: #333;\n}\n.navbar-default .btn-link {\n    color: #777;\n}\n.navbar-default .btn-link:focus,\n.navbar-default .btn-link:hover {\n    color: #333;\n}\n.navbar-default .btn-link[disabled]:focus,\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:focus,\nfieldset[disabled] .navbar-default .btn-link:hover {\n    color: #ccc;\n}\n.navbar-inverse {\n    background-color: #222;\n    border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n    color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:focus,\n.navbar-inverse .navbar-brand:hover {\n    color: #fff;\n    background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n    color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n    color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:focus,\n.navbar-inverse .navbar-nav > li > a:hover {\n    color: #fff;\n    background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:focus,\n.navbar-inverse .navbar-nav > .active > a:hover {\n    color: #fff;\n    background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:focus,\n.navbar-inverse .navbar-nav > .disabled > a:hover {\n    color: #444;\n    background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n    border-color: #333;\n}\n.navbar-inverse .navbar-toggle:focus,\n.navbar-inverse .navbar-toggle:hover {\n    background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n    background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n    border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:focus,\n.navbar-inverse .navbar-nav > .open > a:hover {\n    color: #fff;\n    background-color: #080808;\n}\n@media (max-width: 767px) {\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n        border-color: #080808;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n        background-color: #080808;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n        color: #9d9d9d;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover {\n        color: #fff;\n        background-color: transparent;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover {\n        color: #fff;\n        background-color: #080808;\n    }\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus,\n    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover {\n        color: #444;\n        background-color: transparent;\n    }\n}\n.navbar-inverse .navbar-link {\n    color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n    color: #fff;\n}\n.navbar-inverse .btn-link {\n    color: #9d9d9d;\n}\n.navbar-inverse .btn-link:focus,\n.navbar-inverse .btn-link:hover {\n    color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:focus,\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:focus,\nfieldset[disabled] .navbar-inverse .btn-link:hover {\n    color: #444;\n}\n\ntable {\n    background-color: transparent;\n}\ncaption {\n    padding-top: 8px;\n    padding-bottom: 8px;\n    color: #777;\n    text-align: left;\n}\nth {\n    text-align: left;\n}\n.table {\n    width: 100%;\n    max-width: 100%;\n    margin-bottom: 20px;\n}\n.table > tbody > tr > td,\n.table > tbody > tr > th,\n.table > tfoot > tr > td,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > thead > tr > th {\n    padding: 8px;\n    line-height: 1.42857143;\n    vertical-align: top;\n    border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > td,\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > td,\n.table > thead:first-child > tr:first-child > th {\n    border-top: 0;\n}\n.table > tbody + tbody {\n    border-top: 2px solid #ddd;\n}\n.table .table {\n    background-color: #fff;\n}\n.table-condensed > tbody > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > thead > tr > th {\n    padding: 5px;\n}\n.table-bordered {\n    border: 1px solid #ddd;\n}\n.table-bordered > tbody > tr > td,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > td,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > thead > tr > th {\n    border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > td,\n.table-bordered > thead > tr > th {\n    border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n    background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n    background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n    position: static;\n    display: table-column;\n    float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n    position: static;\n    display: table-cell;\n    float: none;\n}\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > thead > tr > td.active,\n.table > thead > tr > th.active {\n    background-color: #f5f5f5;\n}\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr.active:hover > th,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover {\n    background-color: #e8e8e8;\n}\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > thead > tr > td.success,\n.table > thead > tr > th.success {\n    background-color: #dff0d8;\n}\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr.success:hover > th,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover {\n    background-color: #d0e9c6;\n}\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > thead > tr > td.info,\n.table > thead > tr > th.info {\n    background-color: #d9edf7;\n}\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr.info:hover > th,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover {\n    background-color: #c4e3f3;\n}\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning {\n    background-color: #fcf8e3;\n}\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr.warning:hover > th,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover {\n    background-color: #faf2cc;\n}\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger {\n    background-color: #f2dede;\n}\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr.danger:hover > th,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover {\n    background-color: #ebcccc;\n}\n.table-responsive {\n    min-height: 0.01%;\n    overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n    .table-responsive {\n        width: 100%;\n        margin-bottom: 15px;\n        overflow-y: hidden;\n        -ms-overflow-style: -ms-autohiding-scrollbar;\n        border: 1px solid #ddd;\n    }\n    .table-responsive > .table {\n        margin-bottom: 0;\n    }\n    .table-responsive > .table > tbody > tr > td,\n    .table-responsive > .table > tbody > tr > th,\n    .table-responsive > .table > tfoot > tr > td,\n    .table-responsive > .table > tfoot > tr > th,\n    .table-responsive > .table > thead > tr > td,\n    .table-responsive > .table > thead > tr > th {\n        white-space: nowrap;\n    }\n    .table-responsive > .table-bordered {\n        border: 0;\n    }\n    .table-responsive > .table-bordered > tbody > tr > td:first-child,\n    .table-responsive > .table-bordered > tbody > tr > th:first-child,\n    .table-responsive > .table-bordered > tfoot > tr > td:first-child,\n    .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n    .table-responsive > .table-bordered > thead > tr > td:first-child,\n    .table-responsive > .table-bordered > thead > tr > th:first-child {\n        border-left: 0;\n    }\n    .table-responsive > .table-bordered > tbody > tr > td:last-child,\n    .table-responsive > .table-bordered > tbody > tr > th:last-child,\n    .table-responsive > .table-bordered > tfoot > tr > td:last-child,\n    .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n    .table-responsive > .table-bordered > thead > tr > td:last-child,\n    .table-responsive > .table-bordered > thead > tr > th:last-child {\n        border-right: 0;\n    }\n    .table-responsive > .table-bordered > tbody > tr:last-child > td,\n    .table-responsive > .table-bordered > tbody > tr:last-child > th,\n    .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n    .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n        border-bottom: 0;\n    }\n}\n\n.dve-work-grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, auto);\n  gap: 32px;\n}\n\n@media (max-width: 992px) {\n  .dve-work-grid {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    grid-template-rows: repeat(2, auto);\n    gap: 32px;\n  }\n}\n\n@media (max-width: 768px) {\n  .dve-work-grid {\n    display: grid;\n    grid-template-columns: repeat(1, 1fr);\n    grid-template-rows: repeat(1, auto);\n    gap: 32px;\n  }\n}\n\n.dve-grid-item {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-direction: column;\n\n  &__body {\n    width: 300px;\n    height: 300px;\n    position: relative;\n    overflow: hidden;\n  }\n\n  &__image {\n    position: relative;\n    width: 100%;\n    height: 100%;\n    display: block;\n    transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n\n    img {\n      height: 100%;\n    }\n  }\n\n  &__caption {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: rgba(0, 0, 0, 0.7);\n    color: white;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    transition: opacity 0.3s ease-in-out;\n    background: var(--color-primary-400) !important;\n    padding: 16px;\n    user-select: none;\n    transform: translateY(-300px);\n    opacity: 0;\n    transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n\n    h5 {\n      color: var(--primary-text-color) !important;\n      font-weight: 600;\n    }\n\n    p {\n      color: var(--primary-text-color-secondary) !important;\n      font-weight: 500;\n      font-size: 1rem;\n      line-height: 1;\n      padding-top: 8px;\n    }\n  }\n\n  &__body:hover .dve-grid-item__image {\n    opacity: 0;\n    transform: translateY(300px);\n  }\n\n  &__body:hover .dve-grid-item__caption {\n    transform: translateY(0);\n    opacity: 1;\n  }\n\n}\n\n.pricing-table {\n  overflow-x: auto\n}\n\n.image-backdrop {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: rgba(0, 0, 0, 0.5);\n  backdrop-filter: blur(1px);\n  z-index: 3;\n}\n\n.level-1-img {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  opacity: 1;\n  z-index: 1;\n  transform: translateY(0);\n}\n\n.slide-fade-enter-active {\n  transition: transform 2s cubic-bezier(0.25, 0.8, 0.25, 1);\n}\n\n.slide-fade-leave-active {\n  z-index: 2;\n  transition: transform 2s cubic-bezier(0.25, 0.8, 0.25, 1);\n}\n\n.slide-fade-enter {\n  transform: translateY(0);\n}\n\n.slide-fade-leave-to {\n  transform: translateY(-100%);\n}\n\n.block-footer-1 img {\n  width: 200px;\n}\n\n#contact-form-result-message {\n  color: var(--color-success);\n\n  &._error {\n    color: var(--color-error);\n  }\n}\n</style>\n","import script from \"./WelcomeLanding2.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./WelcomeLanding2.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"@/assets/static-page/assets/css/plugins.css?vue&type=style&index=0&id=589e4d8a&lang=css&scoped=true&external\"\nimport \"@/assets/static-page/assets/css/icons.css?vue&type=style&index=1&id=589e4d8a&lang=css&scoped=true&external\"\nimport \"@/assets/static-page/assets/css/layout.css?vue&type=style&index=2&id=589e4d8a&lang=css&scoped=true&external\"\nimport \"@/assets/static-page/assets/css/hero.css?vue&type=style&index=3&id=589e4d8a&lang=css&scoped=true&external\"\nimport \"@/assets/static-page/assets/css/blocks.css?vue&type=style&index=4&id=589e4d8a&lang=css&scoped=true&external\"\nimport \"@/assets/static-page/assets/css/color/default.css?vue&type=style&index=5&id=589e4d8a&lang=css&scoped=true&external\"\nimport \"./WelcomeLanding2.vue?vue&type=style&index=6&id=589e4d8a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-589e4d8a\"]])\n\nexport default __exports__","import { render } from \"./Pricing.vue?vue&type=template&id=633e661a&scoped=true\"\nimport script from \"./Pricing.vue?vue&type=script&lang=js\"\nexport * from \"./Pricing.vue?vue&type=script&lang=js\"\n\nimport \"./Pricing.vue?vue&type=style&index=0&id=633e661a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-633e661a\"]])\n\nexport default __exports__","<template>\n  <div class=\"app-page\">\n    <div class=\"login\">\n      <div v-if=\"mode === 'login'\" class=\"login-form scrollbar\">\n        <div class=\"login-form__header\">\n          <img class=\"login-form__logo\" src=\"../assets/img/edgefirst_hexagon.svg\">\n          <h1>Welcome Back.</h1>\n        </div>\n        <div v-if=\"require2fa\" class=\"login-form__body\">\n          <form class=\"login-form__form\" @submit.prevent=\"handleSignIn(userEmail, userPassword, authCode)\">\n            <label for=\"login_form-email\">Two-Factor Authentication Code</label>\n            <input\n              id=\"login_form-email\"\n              v-model=\"authCode\"\n              type=\"text\"\n              placeholder=\"eg. 123456\"\n              class=\"box-input\"\n            >\n            <!-- <button id=\"forgot-password\" class=\"button-link\">Forgot password?</button> -->\n            <div class=\"submit-container\">\n              <span v-if=\"error\" class=\"_error\">{{ error }}</span>\n              <button type=\"submit\" class=\"button\">Confirm Code</button>\n            </div>\n          </form>\n        </div>\n        <div v-else class=\"login-form__body\">\n          <form class=\"login-form__form\" @submit.prevent=\"handleSignIn(userEmail, userPassword, '')\">\n            <label for=\"login_form-email\">Username</label>\n            <input\n              id=\"login_form-email\"\n              v-model=\"userEmail\"\n              type=\"text\"\n              placeholder=\"Enter your username\"\n              class=\"box-input\"\n            >\n            <label for=\"form-login_password\">Password</label>\n            <input\n              id=\"form-login_password\"\n              v-model=\"userPassword\"\n              type=\"password\"\n              class=\"box-input\"\n              maxlength=\"72\"\n            >\n            <!-- <button id=\"forgot-password\" class=\"button-link\">Forgot password?</button> -->\n            <div class=\"submit-container\">\n              <span v-if=\"error\" class=\"_error\">{{ error }}</span>\n              <button type=\"submit\" class=\"button\">Sign in</button>\n            </div>\n          </form>\n        </div>\n        <h3 v-if=\"isSaas === 'yes'\" class=\"new-user\">New user? <button class=\"button-link\" @click=\"handleNewUserToggle\">Create an account</button></h3>\n        <p class=\"version-text\">EdgeFirst Studio (c) Au-Zone Technologies</p>\n        <p class=\"version-text\">Version: {{ version }} - {{ frontendVersion }}</p>\n      </div>\n      <div v-if=\"mode === 'new-user'\" class=\"login-form scrollbar\">\n        <div class=\"login-form__header\">\n          <img class=\"login-form__logo\" src=\"../assets/img/edgefirst_logo_and_name.svg\">\n          <h1>Create new account.</h1>\n        </div>\n        <div class=\"login-form__body\">\n          <form class=\"login-form__form\" @submit.prevent=\"handleCreateAccount\">\n            <label class=\"required\" for=\"form_create-firstname\">First Name</label>\n            <input\n              id=\"form_create-firstname\"\n              v-model=\"userCreateFirstname\"\n              type=\"text\"\n              placeholder=\"Enter your name\"\n            >\n            <label class=\"required\" for=\"form_create-lastname\">Last Name</label>\n            <input\n              id=\"form_create-lastname\"\n              v-model=\"userCreateLastname\"\n              type=\"text\"\n              placeholder=\"Enter your name\"\n            >\n            <label class=\"required\" for=\"form_create-username\">Username</label>\n            <input\n              id=\"form_create-username\"\n              v-model=\"userCreateUsername\"\n              type=\"text\"\n              placeholder=\"Enter your preferred username\"\n            >\n            <label class=\"required\" for=\"form_create-email\">Email</label>\n            <input\n              id=\"form_create-email\"\n              v-model=\"userCreateEmail\"\n              type=\"text\"\n              placeholder=\"Enter your email\"\n            >\n            <label for=\"form_create-org\">Organization</label>\n            <input\n              id=\"form_create-org\"\n              v-model=\"userCreateOrganization\"\n              type=\"text\"\n              placeholder=\"Enter your organization name\"\n            >\n            <label class=\"required\" for=\"form_create-password\">Password</label>\n            <input\n              id=\"form_create-password\"\n              v-model=\"userCreatePassword\"\n              type=\"password\"\n              maxlength=\"72\"\n            >\n            <label class=\"required\" for=\"form_create-confirm_password\">Confirm Password</label>\n            <input\n              id=\"form_create-confirm_password\"\n              v-model=\"userConfirmPassword\"\n              type=\"password\"\n              maxlength=\"72\"\n            >\n            <div class=\"submit-container\">\n              <span v-if=\"error\" class=\"_error\">{{ error }}</span>\n              <span v-if=\"successMessage\" class=\"_success\">{{ successMessage }}</span>\n              <button type=\"submit\" class=\"button\">Create account</button>\n            </div>\n          </form>\n        </div>\n        <h3 class=\"new-user\">Already have an account? <button class=\"button-link\" @click=\"handleNewUserToggle\">Sign in.</button></h3>\n      </div>\n      <div v-if=\"mode === 'change-pw'\" class=\"login-form scrollbar\">\n        <div class=\"login-form__header\">\n          <img class=\"login-form__logo\" src=\"../assets/img/edgefirst_logo_and_name.svg\">\n          <h1>Password change required.</h1>\n        </div>\n        <div class=\"login-form__body\">\n          <form class=\"login-form__form\" @submit.prevent=\"updatePassword(userChangePassword, userChangePasswordConfirm)\">\n            <label for=\"form_create-password\">Password</label>\n            <input\n              id=\"form_create-password\"\n              v-model=\"userChangePassword\"\n              type=\"password\"\n              maxlength=\"72\"\n            >\n            <label for=\"form_create-confirm_password\">Confirm Password</label>\n            <input\n              id=\"form_create-confirm_password\"\n              v-model=\"userChangePasswordConfirm\"\n              type=\"password\"\n              maxlength=\"72\"\n            >\n            <div class=\"submit-container\">\n              <span v-if=\"error\" class=\"_error\">{{ error }}</span>\n              <button type=\"submit\" class=\"button\">Confirm changes</button>\n            </div>\n          </form>\n        </div>\n      </div>\n    </div>\n    <div\n      v-if=\"showSlideshow\"\n      ref=\"slideshow\"\n      class=\"slideshow\"\n    >\n      <div class=\"slideshow__slideshow\">\n        <img ref=\"slideshowImg\">\n      </div>\n      <div class=\"slideshow__description\">\n        <h1 ref=\"descriptionTitle\" />\n        <h3 ref=\"descriptionDetails\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { parseJwt } from '@/assets/js/utils.js';\n\nexport default {\n  name: 'Login',\n  data() {\n    return {\n      dataConnect: null,\n      authUsername: '',\n      userEmail: '',\n      userPassword: '',\n      userCreateFirstname: '',\n      userCreateLastname: '',\n      userCreateUsername: '',\n      userCreateEmail: '',\n      userCreateOrganization: '',\n      userCreatePassword: '',\n      userConfirmPassword: '',\n      userChangePassword: '',\n      userChangePasswordConfirm: '',\n      require2fa: false,\n      authCode: '',\n      slides: [\n        {\n          title: 'Visualization',\n          details: 'Combine results from multiple object detection sources to display real-time update.',\n          path: '/login-slide1.png',\n        },\n        {\n          title: 'Statistics',\n          details: 'View data over different periods of time.',\n          path: '/login-slide2.png',\n        }],\n      slideshowInterval: null,\n      mode: 'login',\n      error: '',\n      successMessage: '',\n      showSlideshow: false,\n    };\n  },\n  computed: {\n    isSaas() {\n      return this.$store.state.appVersion.isSaas;\n    },\n    version() {\n      return this.$store.state.appVersion.version;\n    },\n    frontendVersion() {\n      return this.$store.state.appVersion.frontendVersion;\n    },\n  },\n  created() {\n    this.dataConnect = new DatastoreConnect();\n\n    if (this.$route.query.initialMode) {\n      this.mode = this.$route.query.initialMode;\n    }\n  },\n  mounted() {\n    this.$store.commit('setTheme', \"theme-auzone-light\");\n\n    if (this.showSlideshow) {\n      this.changeSlideshow();\n      this.slideshowInterval = setInterval(this.changeSlideshow, 6000);\n    }\n  },\n  beforeUnmount() {\n    clearInterval(this.slideshowInterval);\n  },\n  methods: {\n    parseJwt,\n    changeSlideshow() {\n      const slide = this.slides.shift();\n      this.slides.push(slide);\n      this.$refs.slideshow.classList.remove(\"fade-in\");\n      this.$refs.slideshow.classList.add(\"fade-out\");\n      setTimeout(() => {\n        this.$refs.slideshowImg.src = slide.path;\n        this.$refs.descriptionTitle.innerHTML = slide.title;\n        this.$refs.descriptionDetails.innerHTML = slide.details;\n        this.$refs.slideshow.classList.remove(\"fade-out\");\n        this.$refs.slideshow.classList.add(\"fade-in\");\n      }, 500);\n    },\n    handleNewUserToggle() {\n      if (this.mode === 'login') {\n        this.mode = 'new-user';\n      } else if (this.mode === 'new-user') {\n        this.mode = 'login';\n      }\n      this.successMessage = '';\n      this.error = '';\n    },\n    async updatePassword(pw, conf) {\n      if (!pw) {\n        this.error = 'Missing password';\n        return;\n      }\n\n      if (!conf) {\n        this.error = 'Missing password confirmation';\n        return;\n      }\n\n      if (pw !== conf) {\n        this.error = 'Confirm password does not match password.';\n        return;\n      }\n      await this.dataConnect.updateUserPassword({ username: this.authUsername, password: this.userChangePassword })\n        .then((resp) => {\n          if (resp.result) {\n            this.performUserCheckAndLogin(resp.result.username);\n          }\n        })\n        .catch((e) => {\n          this.handleSignInError(e);\n        });\n    },\n    async handleSignIn(inputUsername, inputPassword, authCode) {\n      this.successMessage = '';\n      this.error = '';\n      const params = {\n        username: inputUsername,\n        password: inputPassword,\n      };\n\n      if (authCode) {\n        params.code = authCode;\n      }\n      const resp = await this.dataConnect.signIn(params)\n        .catch((error) => {\n          console.log(error);\n          alert(error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        if (resp && resp.error) {\n          console.error(resp.error);\n          this.handleSignInError(resp.error);\n          return;\n        }\n      }\n\n      const authResult = resp.result;\n      if (authResult.require2fa) {\n        this.require2fa = true;\n        return;\n      }\n      const token = authResult.token;\n\n      const tokenJson = this.parseJwt(token);\n\n      this.$store.commit('user/setPermissions', tokenJson.permissions);\n\n      this.$store.commit('user/setToken', token);\n      if ('changepassword' in authResult && authResult.changepassword) {\n        this.mode = 'change-pw';\n        this.authUsername = authResult.username;\n      } else {\n        this.performUserCheckAndLogin(authResult.username);\n      }\n    },\n    async performUserCheckAndLogin(u) {\n      const userResp = await this.dataConnect.checkForUser({\n        username: u,\n      });\n\n      const userObj = { ...userResp.result };\n      userObj.role = userResp.result.role;\n      this.$store.commit('user/setUser', userObj);\n      if (userObj.role === 'super') {\n        this.$store.commit('appVersion/setAllowDebug', 'yes');\n        this.$router.push({ path: '/user' });\n      } else {\n        this.$router.push({ path: '/projects' });\n      }\n    },\n    handleSignInError(error) {\n      if (error.code === 101) {\n        this.error = error.message;\n      }\n    },\n    async handleCreateAccount() {\n      this.successMessage = '';\n      this.error = '';\n      // Validate password\n      if (!this.userCreateFirstname) {\n        this.error = \"Missing first name.\";\n        return;\n      }\n\n      if (!this.userCreateLastname) {\n        this.error = \"Missing last name.\";\n        return;\n      }\n\n      if (!this.userCreateUsername) {\n        this.error = \"Missing username.\";\n        return;\n      }\n\n      if (!this.userCreateEmail) {\n        this.error = \"Missing email.\";\n        return;\n      }\n\n      if (!this.userCreatePassword) {\n        this.error = \"Missing password.\";\n        return;\n      }\n\n      if (!this.userConfirmPassword) {\n        this.error = \"Missing confirm password.\";\n        return;\n      }\n\n      if (this.userCreatePassword !== this.userConfirmPassword) {\n        this.error = \"Confirm password does not match.\";\n        return;\n      }\n      const resp = await this.dataConnect.registerNewUser({\n        username: this.userCreateUsername,\n        email: this.userCreateEmail,\n        password: this.userCreatePassword,\n        firstname: this.userCreateFirstname,\n        lastname: this.userCreateLastname,\n        company: this.userCreateOrganization,\n      })\n        .catch((error) => {\n          console.log(error);\n          alert(error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        if (resp && resp.error) {\n          console.error(resp.error);\n          this.handleSignInError(resp.error);\n          return;\n        }\n      }\n\n      this.successMessage = resp.result;\n    },\n    handleCreateAccountError(error) {\n      if (error.code === 101) {\n        // TODO\n      }\n    },\n  },\n\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.app-page {\n  display: flex;\n  flex-direction: row;\n  text-align: center;\n  overflow: visible;\n  height: 100dvh;\n  background-color: #250e81 !important;\n  background-image: url(\"@/assets/img/blu-stripes.png\") !important;\n}\n\n.login {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 100%;\n  height: 100%;\n  padding: 16px 100px;\n  align-items: center;\n  // justify-content: center;\n  overflow: auto;\n}\n\n@media (max-width: $breakpoint-sm) {\n  .login {\n    padding: 8px;\n  }\n}\n@media (max-width: $breakpoint-md) {\n  .login {\n    padding: 16px;\n  }\n}\n\n.login-form {\n  width: 610px;\n  padding: 60px 80px 60px 80px;\n  border-radius: 16px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  max-height: fit-content;\n  box-shadow: 0 0 35px rgb(0 0 0 / 50%), 0 0 10px rgb(0 0 0 / 50%);\n  min-height: fit-content;\n  margin: auto;\n  @include themify() {\n    background: themed('login-form');\n    color: themed('body-text-color');\n  }\n\n  &__header {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    z-index: 10;\n    margin-bottom: 10px;\n\n    h1 {\n      margin-top: 10px;\n      text-align: center;\n      font-size: 24px;\n    }\n  }\n\n  &__logo {\n    max-width: 100%;\n    height: 160px;\n    object-fit: contain;\n  }\n\n  &__body {\n    display: flex;\n    flex-direction: column;\n    text-align: left;\n    margin-bottom: 16px;\n    flex: 1 1 auto;\n    @include themify() {\n      color: themed('body-text-color');\n    }\n  }\n\n  .new-user {\n    text-align: center;\n    font-weight: normal;\n    font-size: 16px;\n    padding-top: 20px;\n    margin-top: auto;\n    margin-bottom: 0.5rem;\n  }\n}\n\n@media (max-width: $breakpoint-sm) {\n  .login-form {\n    padding: 32px;\n  }\n}\n@media (max-width: $breakpoint-md) {\n  .login-form {\n    width: 100%;\n  }\n}\n\n.slideshow {\n  flex: 1 1 100%;\n  height: 100%;\n  padding: 90px 0 90px 0;\n  @include themify() {\n    background: themed('slideshow-bg');\n  }\n  img {\n    width: 100%;\n    height: 100%;\n    border-radius: 8px;\n  }\n\n  &__description {\n    margin-top: 40px;\n    margin-left: 40px;\n    margin-right: 40px;\n    word-break: keep-all;\n    text-align: left;\n    letter-spacing: 0.01em;\n    @include themify() {\n      color: themed('slideshow-text-color');\n    }\n  }\n}\n\nform {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n\n  label {\n    font-size: 16px;\n    font-weight: bold;\n    margin-bottom: 2px;\n\n      &.required::after {\n      content: '*';\n      font-size: 14px;\n      font-weight: 700;\n      padding-left: 1px;\n      @include themify() {\n        color: themed('color-primary');\n      }\n    }\n  }\n\n  input {\n    width: 100%;\n    height: 42px;\n    background: transparent;\n    padding: 10px;\n    border: 2px solid rgb(189, 186, 186);\n    border-radius: 8px;\n    color: black;\n    font-size: 16px;\n    outline: none;\n\n    &:focus, &:focus-visible {\n      @include themify() {\n        border: 2px solid themed('color-primary');\n        box-shadow:  0 0px 2px themed('color-primary-300');\n      }\n      outline: 2px solid transparent;\n      outline-offset: 2px;\n    }\n  }\n  input:not(:last-of-type) {\n    margin-bottom: 16px;\n  }\n\n  button[type=submit] {\n    letter-spacing: 0.1em;\n    width: 100%;\n    height: 50px;\n    border-radius: 6px;\n  }\n\n  .submit-container {\n    margin-top: 16px;\n    span._error {\n      margin: 0 0 4px 0;\n      font-weight: 400;\n      font-size: 16px;\n      text-align: left;\n      margin-bottom: 0.5rem;\n      @include themify() {\n        color: themed('login-error');\n      }\n    }\n\n    span._success {\n      margin: 0 0 4px 0;\n      font-weight: 400;\n      font-size: 16px;\n      text-align: left;\n      margin-bottom: 0.5rem;\n      @include themify() {\n        color: themed('login-success');\n      }\n    }\n  }\n}\n\n#forgot-password {\n  margin-top: 2px;\n  align-self: flex-end;\n}\n\n.fade-in {\n  transition: opacity 0.5s ease-in-out;\n  opacity: 0.9;\n}\n\n.fade-out {\n  transition: opacity 0.5s ease-in-out;\n  opacity: 0;\n}\n\n.version-text {\n  font-size: 0.85rem;\n}\n</style>\n","import { render } from \"./Login.vue?vue&type=template&id=fb9fd1b4&scoped=true\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\n\nimport \"./Login.vue?vue&type=style&index=0&id=fb9fd1b4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-fb9fd1b4\"]])\n\nexport default __exports__","<template>\n  <div v-if=\"!chartsReady \" class=\"wait-wrapper\">\n    <div class=\"loader-dual-ring\" />\n  </div>\n  <div v-else id=\"wrapper\" class=\"chart-wrapper\">\n    <div\n      v-for=\"(row, name) in chartsData\"\n      :key=\"row.name\"\n      class=\"chart-row\"\n      :class=\"[multi-session, (isMultiSession) ? multi-session : '']\"\n    >\n      <div v-for=\"chart in row\" :key=\"chart.name\" class=\"chart-small\">\n        <ChartCard\n          :id=\"chart.id\"\n          :name=\"name\"\n          :data=\"chart.apex\"\n          :labels=\"chart.labels\"\n          :series=\"chart.series\"\n          @chart-clicked=\"chartZoomHandler(chart.name)\"\n        />\n      </div>\n    </div>\n  </div>\n\n  <!-- <ConfirmModal\n    ref=\"confirmModal\"\n    :messageHeader=\"confirmMessageHeader\"\n    :message=\"confirmMessage\"\n    :buttonClass=\"'button-delete'\"\n    :buttonText=\"buttonText\"\n    @confirmed=\"confirmFunction\"\n  /> -->\n</template>\n\n<script>\nimport ChartCard from '@/components/ValidationPage/ChartCard.vue';\nimport ConfirmModal from '@/components/ConfirmModal.vue';\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\n\nexport default {\n  name: 'ValidateSessionCharts',\n  components: {\n    ChartCard,\n    ConfirmModal,\n  },\n  emits: ['stop-validate', 'refresh'],\n  data() {\n    return {\n      chartsReady: false,\n      chartsData: {},\n      isMultiSession: false,\n    };\n  },\n  computed: {\n    hasResults() {\n      return this.internalSession && this.internalSession.results && Object.keys(this.internalSession.results).length > 0;\n    },\n    type() {\n      return this.internalSession && this.internalSession.params ? this.internalSession.params.type : null;\n    },\n  },\n  beforeUnmount() {\n    this.clearData();\n    this.stopInterval();\n    this.stopEC2StatusInterval();\n  },\n  async created() {\n    this.dataConnect = new DatastoreConnect(this.$store.state.enterpriseServerUrl);\n    if (this.$route.query.session_id) {\n      // parse int or Array\n      const session_ids = JSON.parse(decodeURI(this.$route.query.session_id));\n      await this.GetChartsData(session_ids);\n    } else {\n      this.$router.push({ path: '/validator' });\n    }\n  },\n  methods: {\n    async GetChartsData(ids) {\n      const data = await this.getValidateGraphs(ids);\n\n      let N = 0;\n      for (const k in data) {\n        N = Math.max(data[k].length, N);\n      }\n\n      if (N > 1) {\n        this.isMultiSession = true;\n      } else {\n        this.isMultiSession = false;\n      }\n\n      this.chartsData = data;\n      this.chartsReady = true;\n    },\n    async refresh() {\n      await this.GetChartsData();\n    },\n    chartModalClosed() {\n      clearInterval(this.interval);\n    },\n    chartZoomHandler(name) {\n      alert(name);\n    },\n    async showModal() {\n      this.interval = setInterval(() => {\n        this.refresh();\n      }, 5000);\n\n      await this.GetChartsData();\n\n      this.$refs.trainingChartsModal.showModal();\n    },\n    async fetchCharts() {\n      // Get Training Charts from BE\n      const params = {\n        project_id: this.projectID,\n      };\n      if (this.trainerExperiment == null) {\n        params.session_id = this.trainerSession.id;\n        params.trainer_id = this.trainerSession.trainer_id;\n      } else {\n        params.trainer_id = this.trainerExperiment.id;\n      }\n\n      const resp = await this.dataConnect.getCharts(params)\n        .catch((error) => {\n          console.log('Failed to launch analytics:', error);\n        });\n      if (!resp || resp.error || !resp.result) {\n        return {};\n      }\n      return resp.result;\n    },\n    handleModalClosed() {\n      this.chartsReady = false;\n    },\n\n    //= ===============================================================================================\n\n    async getDataset(id) {\n      const params = {\n        dataset_id: id,\n        get_annotation_sets: true,\n      };\n      const resp = await this.dataConnect.getDatasetById(params)\n        .catch((error) => {\n          // TODO: handle error\n          console.log(error);\n        });\n      if (resp.error) {\n        return null;\n      } else {\n        return resp.result;\n      }\n    },\n    clearData() {\n      this.selectedSessionAvailableFiles = [];\n      this.dataset = null;\n      clearInterval(this.interval);\n      this.interval = null;\n      clearInterval(this.logsInterval);\n      this.logsInterval = null;\n      this.refreshTimeout = false;\n    },\n    getName(id) {\n      const result = this.dataset?.annotation_sets.find((e) => e.id === id);\n      return result?.name || 'Unknown';\n    },\n    getEpoch(session) {\n      if (session.docker_task) {\n        return session.docker_task.count;\n      }\n      return 0;\n    },\n    getTotalEpochs(session) {\n      let params = {};\n      if (session && session.params) {\n        params = session.params;\n      }\n      if (params.epochs) {\n        return params.epochs;\n      }\n      return null;\n    },\n    getStatus(session) {\n      if (session?.docker_task) {\n        return session.docker_task.status;\n      }\n      return \"Failed to start docker task\";\n    },\n\n    getCount(session) {\n      if (session?.docker_task) {\n        return session.docker_task.count;\n      }\n      return \"Failed to get docker task\";\n    },\n    getTotal(session) {\n      if (session?.docker_task) {\n        return session.docker_task.total;\n      }\n      return null;\n    },\n    formatTime(str) {\n      return `${new Date(str).toLocaleTimeString('default', {\n        year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true,\n      })}`;\n    },\n    openConfirmStopValidateSessionModal() {\n      this.confirmMessage = `Are you sure you want to stop this validate session? You will lose all current progress.`;\n      this.confirmMessageHeader = 'Stop Validate Session';\n      this.toDelete = this.internalSession;\n      this.buttonText = 'Stop';\n      this.$refs.confirmModal.showModal();\n      this.confirmFunction = () => {\n        this.handleStopValidateSessions([this.internalSession.id]);\n      };\n    },\n    async handleStopValidateSessions(ids) {\n      await this.dataConnect.terminateValidateSessions({\n        session_ids: ids,\n      })\n        .then(() => {\n          this.updateValidatorEC2InstanceStatus();\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n\n      this.toDelete = null;\n    },\n    async updateValidatorEC2InstanceStatus() {\n      await this.dataConnect.validateUpdateEC2({\n        dataset_ids: [this.internalSession.dataset_id],\n      })\n        .catch((e) => console.log(e));\n    },\n    stopInterval() {\n      clearInterval(this.interval);\n      this.interval = null;\n    },\n    startInterval(session_id) {\n      this.interval = setInterval(async () => {\n        this.internalSession = await this.getValidateSession(parseInt(session_id));\n      }, 30000);\n    },\n    startEC2StatusInterval() {\n      this.ec2Interval = setInterval(this.updateValidatorEC2InstanceStatus, 60000);\n    },\n    stopEC2StatusInterval() {\n      clearInterval(this.ec2Interval);\n      this.ec2Interval = null;\n    },\n    async getValidateGraphs(ids) {\n      const resp = await this.dataConnect.getValidateGraphs({\n        session_ids: ids,\n      });\n      if (resp.error) {\n        return null;\n      } else {\n        return resp.result;\n      }\n    },\n    async getValidateSession(id) {\n      const resp = await this.dataConnect.getValidateSession({\n        validate_session_id: id,\n      });\n      if (resp.error) {\n        return null;\n      } else {\n        return resp.result;\n      }\n    },\n    handleRefreshClicked() {\n      this.refreshTimeout = true;\n      setTimeout(() => {\n        this.refreshTimeout = false;\n      }, 5000);\n      this.internalSession = this.getValidateSession(this.internalSession.id);\n    },\n\n  },\n};\n\n</script>\n\n<style lang=\"scss\" scoped>\n\n.chart-wrapper {\n  position: relative;\n  display: flex;\n  width: 100%;\n  height:95vh;\n  flex-direction: row;\n  flex-wrap: wrap;\n\n  padding: 4px;\n  background-color: rgb(101, 107, 109);\n\n  overflow-y: auto ;\n\n}\n\n.chart-row {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: nowrap;\n  margin:4px;\n  align-content: start;\n}\n.multi-session {\n  width: 99%;\n}\n\n.chart-small{\n  border-radius: 8px;\n  //width: 700px;\n  // height: 300px;\n  background-color: rgb(247, 246, 246);\n  flex-grow: 0;\n\n  margin: 4px;\n}\n\n.wait-wrapper {\n  position: relative;\n  display: flex;\n  width: 100%;\n  align-items: center;\n  justify-content: center;\n  background-color: rgb(101, 107, 109);\n\n}\n\n.loader-dual-ring {\n  position: absolute;\n  display: inline-block;\n  width: 80px;\n  height: 80px;\n}\n\n.loader-dual-ring:after {\n  content: \" \";\n  display: block;\n  width: 64px;\n  height: 64px;\n  margin: 8px;\n  border-radius: 50%;\n  @include themify() {\n    border: 6px solid themed('color-primary');\n    border-color: themed('color-primary') transparent themed('color-primary') transparent;\n  }\n  animation: loader-dual-ring 1.2s linear infinite;\n}\n@keyframes loader-dual-ring {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n// .sessions {\n//   display: flex;\n//   flex-direction: column;\n//   width: 50%;\n//   padding: 16px;\n//   @media (max-width: $breakpoint-sm) {\n//     width: 100%;\n//   }\n//   @media (max-width: $breakpoint-md) {\n//     width: 100%;\n//   }\n\n//   ul {\n//     list-style-type: none;\n//   }\n//   .session-header {\n//     display: flex;\n//     flex-direction: row;\n//     justify-content: space-between;\n\n//    .icon-container {\n//     display: flex;\n//     align-items: center;\n//       @include themify() {\n//         color: themed('body-text-color-secondary');\n//       }\n//       .icon + .icon {\n//         margin-left: 10px;\n//       }\n//       .icon:hover {\n//         @include themify() {\n//           color: themed('icon-color-primary');\n//         }\n//       }\n//     }\n//   }\n\n//   h3 {\n//     margin: 0;\n//     margin-bottom: 10px;\n//     font-size: 1rem;\n//     text-align: left;\n//     @include themify() {\n//       color: themed('body-text-color-secondary');\n//     }\n//   }\n\n//   &__body-row {\n//     display: flex;\n//     flex: 1 1 auto;\n//     margin-top: 5px;\n//     align-items: center;\n//   }\n// }\n\n// ._disabled {\n//   @include themify() {\n//     background: themed('color-disabled-200') !important;\n//     color: white;\n//     cursor: not-allowed !important;\n//     pointer-events: none;\n//     border: 1px solid transparent !important;\n//   }\n// }\n\n// .validate-sessions {\n//   display: flex;\n//   flex-direction: column;\n//   gap: 6px;\n//   list-style: none;\n//   padding: 2px 4px;\n//   margin: 2px -4px;\n\n//   &__list-item2 {\n//     display: flex;\n//     flex-direction: row;\n//     position: relative;\n//     background: rgb(231, 224, 224);\n//     padding: 8px;\n//     border-radius: 4px;\n//     gap: 16px;\n//     align-items: center;\n//     @include themify() {\n//       background: themed('color-white-700');\n//     }\n//     height: 100%;\n//     border: 1px solid grey;\n\n//     .session-col {\n//       display: flex;\n//       flex-direction: column;\n//       width: fit-content;\n\n//       label, span {\n//         text-align: center;\n//         overflow-wrap: anywhere;\n//         pointer-events: none;\n//       }\n//       label {\n//         font-weight: 600;\n//         font-size: 0.625rem;\n//         letter-spacing: 0.05em;\n//         white-space: nowrap;\n//         @include themify() {\n//           color: themed('body-text-color-secondary');\n//         }\n//       }\n//       span {\n//         font-weight: 700;\n//         font-size: 0.75rem;\n//         @include themify() {\n//           color: themed('color-primary');\n//         }\n//       }\n//     }\n\n//     .status-col {\n//       display: flex;\n//       flex-direction: column;\n//       align-items: center;\n//       text-align: center;\n\n//       .date {\n//         margin-top: 5px;\n//         font-weight: 600;\n//         font-size: 0.625rem;\n//         letter-spacing: 0.05em;\n//         white-space: nowrap;\n//         @include themify() {\n//           color: themed('body-text-color-secondary');\n//         }\n//       }\n//     }\n\n//     .name-col {\n//       display: flex;\n//       flex-direction: column;\n\n//       &__main {\n//         display: flex;\n//         flex-direction: row;\n//           justify-content: space-around;\n//         .item {\n//           display: flex;\n//           flex-direction: column;\n//           width: 50%;\n//         }\n\n//       }\n\n//       label, span {\n//         text-align: center;\n//         overflow-wrap: anywhere;\n//         pointer-events: none;\n//       }\n//       label {\n//         font-weight: 600;\n//         font-size: 0.625rem;\n//         letter-spacing: 0.05em;\n//         white-space: nowrap;\n//         @include themify() {\n//           color: themed('body-text-color-secondary');\n//         }\n//       }\n//       span {\n//         font-weight: 700;\n//         font-size: 0.75rem;\n//         padding-left: 10px;\n//         padding-right: 10px;\n//         overflow: hidden;\n//         white-space: nowrap;\n//         text-overflow: ellipsis;\n//         @include themify() {\n//           color: themed('color-primary');\n//         }\n//       }\n//     }\n//   }\n// }\n// ._selected {\n//   @include themify() {\n//     border: solid 1px themed('color-primary');\n//     background: rgba(themed('color-primary'), 0.2);\n//   }\n// }\n\n// .validate-sessions__list-item2 div[val-epoch] {\n//   flex: 0 1 100px;\n//   overflow: hidden;\n//   white-space: nowrap;\n//   text-overflow: ellipsis;\n// }\n\n// .validate-sessions__list-item2 div[val-status] {\n//   min-width: 130px !important;\n//   flex: 0 1 auto;\n//   overflow: hidden;\n//   white-space: nowrap;\n//   text-overflow: ellipsis;\n// }\n// .validate-sessions__list-item2 div[val-name] {\n//   flex: 1 1 120px;\n//   width: 120px;\n//   overflow: hidden;\n//   white-space: nowrap;\n//   text-overflow: ellipsis;\n// }\n\n// .status-tag {\n//   display: flex;\n//   align-items: center;\n//   justify-content: center;\n//   width: 100px;\n//   min-width: 100px;\n//   border-radius: 18px;\n//   padding: 4px 6px;\n//   line-height: 1;\n//   font-size: 0.625rem;\n//   font-weight: 700;\n//   white-space: nowrap;\n//   border: 2px solid;\n//   box-shadow: 0px 0px 1px rgb(0 0 0 / 25%), 0px 1px 4px rgb(0 0 0 / 25%);\n//   @include themify() {\n//     color: themed('color-black');\n//   }\n\n//   &._complete {\n//     @include themify() {\n//       color: themed('color-status-complete');\n//       background: themed('color-status-complete-background');\n//     }\n//   }\n//   &._running {\n//     @include themify() {\n//       color: themed('color-status-running');\n//       background: themed('color-status-running-background');\n//     }\n//   }\n//   &._error {\n//     @include themify() {\n//       color: themed('color-status-error');\n//       background: themed('color-status-error-background');\n//     }\n//   }\n//   &._warning {\n//     @include themify() {\n//       color: themed('color-status-warning');\n//       background: themed('color-status-warning-background');\n//     }\n//   }\n\n//   .running-icon {\n//     color: inherit;\n//     width: 4px;\n//     height: 4px;\n//     border: solid 4px;\n//     border-radius: 4px;\n//     margin-right: 4px;\n//   }\n\n//   .status-icon {\n//     color: inherit;\n//     margin-right: 4px;\n//   }\n// }\n\n// hr.vr {\n//   display: flex;\n//   width: 1px;\n//   height: 24px;\n//   margin: 0;\n// }\n\n// a {\n//   text-decoration:none;\n// }\n// a + button {\n//   margin-left: 10px;\n// }\n\n// .stats-container {\n//   margin: 10px;\n//   width: 100%;\n// }\n\n// .flex-col {\n//   display: flex;\n//   flex-direction: row;\n//   padding: 0 20px 0 10px;\n\n//   div + div {\n//     margin-left: 20px;\n//   }\n\n//   @media (max-width: $breakpoint-sm) {\n//     flex-direction: column;\n//     div + div {\n//       margin-left: 0;\n//       margin-top: 20px;\n//     }\n//   }\n//   @media (max-width: $breakpoint-md) {\n//     flex-direction: column;\n//     div + div {\n//       margin-left: 0;\n//       margin-top: 20px;\n//     }\n//   }\n// }\n\n// .col-40 {\n//   width: 40%;\n// }\n\n// .col-50 {\n//   width: 50%;\n// }\n\n// .col-60 {\n//   width: 60%;\n// }\n\n// @media (max-width: $breakpoint-sm) {\n//   .col-40 {\n//   width: 100%;\n//   }\n//   .col-50 {\n//   width: 100%;\n//   }\n//   .col-60 {\n//   width: 100%;\n//   }\n// }\n\n// @media (max-width: $breakpoint-md) {\n//   .col-40 {\n//   width: 100%;\n//   }\n//   .col-50 {\n//   width: 100%;\n//   }\n//   .col-60 {\n//   width: 100%;\n//   }\n// }\n// .empty-state {\n//   display: flex;\n//   flex-direction: column;\n//   justify-content: center;\n//   align-items: center;\n//   position: relative;\n//   width: 100%;\n//   height: 100%;\n// }\n</style>\n","<template>\n  <div class=\"chart-area\">\n  {{ id }}\n  <ApexCharts\n    height=\"400px\"\n    width=\"700px\"\n    :options=\"chartOptions\"\n    :series=\"data.series\"\n  />\n</div>\n</template>\n\n<script>\n\nimport VueApexCharts from \"vue3-apexcharts\";\n\nexport default {\n  name: 'TrainingChartSingle',\n  components: {\n    ApexCharts: VueApexCharts,\n  },\n  props: {\n    isFullScreen: {\n      type: Boolean,\n      default: false,\n    },\n    id: {\n      type: String,\n      default: '',\n    },\n    data: {\n      type: Object,\n      default: {},\n    },\n    name: {\n      type: String,\n      default: '',\n    },\n    series: {\n      type: Object,\n      default: () => {},\n    },\n    labels: {\n      type: Array,\n      default: () => [],\n    },\n  },\n  data() {\n    return {\n      isZoomed: false,\n      \n      // chartOptions: {\n      //   chart: {\n      //     height: 350,\n      //     type: 'this.data.chart.type',\n      //     zoom: {\n      //       enabled: false,\n      //     },\n      //     animations: {\n      //       enabled: false,\n      //     },\n      //   },\n      //   stroke: {\n      //     width: 2,\n      //   },\n      //   markers: {\n      //     size: [4],\n      //   },\n      //   labels: 'this.data.xaxis',\n      //   title: {\n      //     text: this.name,\n      //     align: 'center',\n      //   },\n      //   xaxis: {\n      //     tickAmount: this.labels.length / 10,\n      //   },\n      //   yaxis: {\n      //     decimalsInFloat: 4,\n      //   },\n\n      // },\n    };\n  },\n  computed: {\n    chartOptions() {\n\n      var v=this.data;\n\n      // if (v.chart.type!='line') {\n      //   return {};\n      // }\n\n      //v['chart']['height']=350;\n     \n      console.log(v);\n\n      if (!('chart' in v)) return {};\n      \n      v.chart.height=550;\n      // v.yaxis.decimalsInFloat=4;\n\n\n\n      return v; \n    }\n  },\n  created() {\n\n  },\n  mounted() {\n    setTimeout(() => {\n      window.dispatchEvent(new Event('resize'));\n    }, 500);\n  },\n  methods: {\n    clicked() {\n      this.$emit('chart-clicked');\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.chart-area {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n\n}\n\n\n</style>\n","import { render } from \"./ChartCard.vue?vue&type=template&id=6765003a&scoped=true\"\nimport script from \"./ChartCard.vue?vue&type=script&lang=js\"\nexport * from \"./ChartCard.vue?vue&type=script&lang=js\"\n\nimport \"./ChartCard.vue?vue&type=style&index=0&id=6765003a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6765003a\"]])\n\nexport default __exports__","import { render } from \"./ValidateSessionCharts.vue?vue&type=template&id=0c033043&scoped=true\"\nimport script from \"./ValidateSessionCharts.vue?vue&type=script&lang=js\"\nexport * from \"./ValidateSessionCharts.vue?vue&type=script&lang=js\"\n\nimport \"./ValidateSessionCharts.vue?vue&type=style&index=0&id=0c033043&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0c033043\"]])\n\nexport default __exports__","import { createRouter, createWebHashHistory } from 'vue-router';\nimport store from \"@/store\";\nimport DatastoreConnect from '@/assets/js/DatastoreFunctions/datastore-interface';\nimport { parseJwt } from '@/assets/js/utils.js';\n\n// ----------------------------------------   User Profile   ----------------------------------------------\nimport UserPage from '@/views/UserPage.vue';\nimport UserUsageLogs from '@/components/UserProfileComponent/UserUsageLogs.vue';\nimport Transactions from '@/components/UserProfileComponent/Transactions.vue';\nimport AdminPage from '@/views/AdminPage.vue';\nimport SuperAdminPage from '@/views/SuperAdminPage.vue';\n\n// ------------------------------   User Profile  / User  -------------------------------------\nimport AccountSettings from '@/components/UserProfileComponent/AccountSettings/AccountSettings.vue';\nimport EditUser from '@/components/UserProfileComponent/AccountSettings/EditUser.vue';\n\n// ------------------------------   User Profile  / Admin  -------------------------------------\nimport OrganizationSettingsLanding from '@/components/UserProfileComponent/OrganizationSettings/Landing.vue';\nimport EditOrganization from '@/components/UserProfileComponent/OrganizationSettings/EditOrganization.vue';\nimport OrganizationSecuritySettings from '@/components/UserProfileComponent/OrganizationSettings/OrganizationSecuritySettings.vue';\nimport UserManagement from '@/components/UserProfileComponent/OrganizationSettings/UserManagement.vue';\nimport OrganizationSettings from '@/components/UserProfileComponent/OrganizationSettings/OrganizationSettings.vue';\nimport CreateSecondaryUser from '@/components/UserProfileComponent/CreateSecondaryUser.vue';\n\n// ------------------------------   User Profile  / Super Admin  -------------------------------------\nimport OrganizationManagement from '@/components/UserProfileComponent/OrganizationSettings/OrganizationManagement.vue';\nimport AddNewOrganization from '@/components/UserProfileComponent/OrganizationSettings/AddNewOrganization.vue';\nimport UserAddCredits from '@/components/UserProfileComponent/UserAddCredits.vue';\nimport EmulateUser from '@/components/UserProfileComponent/EmulateUser.vue';\nimport ShowDetailedOrganization from '@/components/UserProfileComponent/OrganizationSettings/ShowDetailedOrganization.vue';\n\n// ----------------------------------------   Projects   ----------------------------------------------\nimport Projects from '@/views/Projects.vue';\nimport ProjectManagement from '@/components/ProjectsComponent/ProjectManagement.vue';\n\n// ----------------------------------------   Trainer   ----------------------------------------------\nimport Trainer from '@/views/Trainer.vue';\nimport TrainerManagement from '@/components/TrainerComponent/TrainerExperimentAndSessions/TrainerManagement.vue';\n\n// ----------------------------------------   Dataset   ----------------------------------------------\nimport Datasets from '@/views/Datasets.vue';\nimport AnnotationViewer from '@/components/DatasetComponent/AnnotationTool/AnnotationViewer.vue';\nimport DatasetManagement from '@/components/DatasetComponent/DatasetManagement/DatasetManagement.vue';\nimport Gallery from '@/components/DatasetComponent/GalleryComponent/Gallery.vue';\nimport DatasetStats from '@/components/DatasetComponent/DatasetStats/DatasetStats.vue';\nimport Map from '@/components/DatasetComponent/Map.vue';\n\n// ----------------------------------------   Validation   ----------------------------------------------\nimport Validator from '@/views/Validator.vue';\nimport ValidatorManagement from '@/components/ValidationPage/ValidatorManagement.vue';\n\n// ----------------------------------------   Automation   ----------------------------------------------\nimport Automation from '@/views/Automation.vue';\n\n// ----------------------------------------   Task Board   ----------------------------------------------\nimport TaskBoard from '@/views/TaskBoard.vue';\nimport GalleryLandingPage from '@/components/DatasetComponent/GalleryComponent/GalleryLandingPage.vue';\n\n// ----------------------------------------   Recycle Bin   ----------------------------------------------\nimport RecycleBin from '@/views/RecycleBin.vue';\n\n// ----------------------------------------   Cloud Instances   ----------------------------------------------\nimport CloudInstancesPage from '@/views/CloudInstancesPage.vue';\n\n// ----------------------------------------   Snapshots   ----------------------------------------------\nimport Snapshots from '@/views/Snapshots.vue';\n\n// ----------------------------------------   Home   ----------------------------------------------\nimport Welcome from '@/views/Welcome.vue';\nimport WelcomeLanding from '@/views/WelcomeLanding2.vue';\nimport Pricing from '@/views/Pricing.vue';\nimport Login from '@/views/Login.vue';\nimport ValidatorSessionCharts from '@/components/ValidationPage/ValidateSessionCharts.vue';\n\nconst routes = [\n  // {\n  //   path: '/',\n  //   component: WelcomeLanding,\n  //   redirect: '/home',\n  //   children: [\n  //     {\n  //       path: 'home',\n  //       name: 'home',\n  //       component: Welcome,\n  //     },\n  //     {\n  //       path: 'pricing',\n  //       name: 'pricing',\n  //       component: Pricing,\n  //     },\n  //   ],\n  // },\n  {\n    path: '/',\n    component: WelcomeLanding,\n    // redirect: '/home',\n    // children: [\n    //   {\n    //     path: 'home',\n    //     name: 'home',\n    //     component: Welcome,\n    //   },\n    //   {\n    //     path: 'pricing',\n    //     name: 'pricing',\n    //     component: Pricing,\n    //   },\n    // ],\n  },\n  {\n    path: '/login',\n    component: Login,\n  },\n  {\n    path: '/user',\n    component: UserPage,\n    redirect: {\n      name: 'user.profile',\n    },\n    meta: {\n      breadCrumb: 'User',\n    },\n    children: [\n      {\n        path: 'profile',\n        name: 'user.profile',\n        component: AccountSettings,\n        meta: {\n          breadCrumb: 'Profile',\n          icon: 'account_circle',\n        },\n      },\n      {\n        path: 'edit',\n        name: 'user.edit',\n        props: true,\n        component: EditUser,\n        meta: {\n          breadCrumb: 'Edit Info',\n          icon: 'edit',\n        },\n      },\n    ],\n  },\n  {\n    path: '/admin',\n    component: AdminPage,\n    meta: {\n      breadCrumb: 'Admin',\n    },\n    redirect: {\n      name: 'admin.organization.details',\n    },\n    // if the breadcrumb needs to navigate between siblings, add name && icon to each child\n    children: [\n      {\n        path: 'organization',\n        name: 'admin.organization',\n        component: OrganizationSettingsLanding,\n        meta: {\n          breadCrumb: 'Organization',\n          icon: 'info',\n        },\n        redirect: {\n          name: 'admin.organization.details',\n        },\n        children: [\n          {\n            path: 'details',\n            name: 'admin.organization.details',\n            component: OrganizationSettings,\n            meta: {\n              breadCrumb: 'Information',\n              icon: 'info',\n            },\n          },\n          {\n            path: 'editorg',\n            name: 'admin.organization.editorg',\n            permissions: ['admin', 'super'],\n            component: EditOrganization,\n            meta: {\n              breadCrumb: 'Edit Info',\n              icon: 'edit',\n            },\n          },\n          {\n            path: 'security',\n            name: 'admin.organization.security',\n            permissions: ['admin', 'super'],\n            component: OrganizationSecuritySettings,\n            meta: {\n              breadCrumb: 'Security',\n              icon: 'security',\n            },\n          },\n        ],\n      },\n      {\n        path: 'people',\n        name: 'admin.people',\n        component: OrganizationSettingsLanding,\n        meta: {\n          breadCrumb: 'Users',\n          icon: 'people',\n        },\n        redirect: {\n          name: 'admin.people.list',\n        },\n        children: [\n          {\n            path: 'list',\n            name: 'admin.people.list',\n            component: UserManagement,\n            meta: {\n              breadCrumb: 'Manager',\n              icon: 'people',\n            },\n          },\n          {\n            path: 'newuser',\n            name: 'admin.people.newuser',\n            component: CreateSecondaryUser,\n            meta: {\n              breadCrumb: 'New User',\n              icon: 'person_add',\n            },\n          },\n          {\n            path: 'edituser',\n            name: 'admin.people.edituser',\n            component: EditUser,\n            meta: {\n              breadCrumb: 'Edit User',\n              icon: 'edit',\n            },\n          },\n        ],\n      },\n      {\n        path: 'usagelogs',\n        name: 'admin.usagelogs',\n        component: UserUsageLogs,\n        meta: {\n          breadCrumb: 'Usage & Billing',\n          icon: 'usage',\n        },\n      },\n      {\n        path: 'transactions',\n        name: 'admin.transactions',\n        component: Transactions,\n        meta: {\n          breadCrumb: 'Transactions',\n          icon: 'usage',\n        },\n      },\n    ],\n  },\n  {\n    path: '/super',\n    component: SuperAdminPage,\n    meta: {\n      breadCrumb: 'Super Admin Console',\n    },\n    redirect: {\n      name: 'super.list',\n    },\n    // if the breadcrumb needs to navigate between siblings, add name && icon to each child\n    children: [\n\n      {\n        path: 'list',\n        name: 'super.list',\n        permissions: ['super'],\n        component: OrganizationManagement,\n        meta: {\n          breadCrumb: 'List',\n          icon: 'organizations',\n        },\n      },\n      {\n        path: 'neworg',\n        name: 'super.neworg',\n        permissions: ['super'],\n        component: AddNewOrganization,\n        meta: {\n          breadCrumb: 'New Organization',\n          icon: 'people_add',\n        },\n      },\n      {\n        path: 'editorg',\n        name: 'super.editorg',\n        permissions: ['admin', 'super'],\n        component: EditOrganization,\n      },\n      {\n        path: 'addcredits',\n        name: 'super.addcredits',\n        permissions: ['super'],\n        component: UserAddCredits,\n      },\n      {\n        path: 'emulate',\n        name: 'super.emulate',\n        permissions: ['super'],\n        component: EmulateUser,\n      },\n      {\n        path: 'usagelogs',\n        name: 'super.usagelogs',\n        permissions: ['super'],\n        component: UserUsageLogs,\n      },\n      {\n        path: 'transactions',\n        name: 'super.transactions',\n        component: Transactions,\n        permissions: ['super'],\n      },\n      {\n        path: 'orgdetail',\n        name: 'super.orgdetail',\n        permissions: ['super'],\n        component: ShowDetailedOrganization,\n      },\n      {\n        path: 'createuser',\n        name: 'super.createuser',\n        permissions: ['super'],\n        component: CreateSecondaryUser,\n      },\n      {\n        path: 'edituser',\n        name: 'super.edituser',\n        component: EditUser,\n      },\n\n    ],\n  },\n  {\n    path: '/trainer',\n    meta: {\n      breadCrumb: 'Trainer',\n    },\n    component: Trainer,\n    redirect: {\n      name: 'trainer.sessions',\n    },\n    children: [\n      {\n        path: 'sessions',\n        name: 'trainer.sessions',\n        component: TrainerManagement,\n      },\n    ],\n  },\n  {\n    path: '/validator',\n    props: true,\n    meta: {\n      breadCrumb: 'Validator',\n    },\n    component: Validator,\n    redirect: {\n      name: 'validator.manager',\n    },\n    children: [\n      {\n        path: 'manager',\n        name: 'validator.manager',\n        component: ValidatorManagement,\n      },\n      {\n        path: 'metrics',\n        name: 'validator.metrics',\n        component: ValidatorSessionCharts,\n        props: true,\n        meta: {\n          breadCrumb: 'Metrics',\n          icon: 'analytics',\n        },\n      },\n    ],\n  },\n  {\n    path: '/projects',\n    name: 'Projects',\n    component: Projects,\n    meta: {\n      breadCrumb: 'Projects',\n    },\n    redirect: {\n      name: 'projects.manager',\n    },\n    children: [\n      {\n        path: 'manager',\n        name: 'projects.manager',\n        component: ProjectManagement,\n      },\n    ],\n  },\n  {\n    path: '/datasets',\n    name: 'Datasets',\n    component: Datasets,\n    meta: {\n      breadCrumb: 'Datasets',\n    },\n    props: true,\n    redirect: {\n      name: 'datasets.manager',\n    },\n    children: [\n      {\n        path: 'manager',\n        name: 'datasets.manager',\n        component: DatasetManagement,\n      },\n      {\n        path: 'gallery',\n        name: 'datasets.gallery.landing',\n        component: GalleryLandingPage,\n        meta: {\n          breadCrumb: 'Gallery',\n          icon: 'gallery_thumbnail',\n        },\n        redirect: {\n          name: 'datasets.gallery.main',\n        },\n        children: [\n          {\n            path: 'main',\n            name: 'datasets.gallery.main',\n            component: Gallery,\n            props: true,\n          },\n          {\n            path: 'viewer',\n            name: 'datasets.gallery.viewer',\n            props: true,\n            component: AnnotationViewer,\n            meta: {\n              breadCrumb: 'Image',\n              icon: 'image',\n            },\n          },\n        ],\n      },\n      {\n        path: 'stats',\n        name: 'datasets.statistics',\n        component: DatasetStats,\n        meta: {\n          breadCrumb: 'Analytics',\n          icon: 'insights',\n        },\n      },\n      {\n        path: 'map',\n        name: 'datasets.map',\n        component: Map,\n        meta: {\n          breadCrumb: 'Map',\n          icon: 'map',\n        },\n      },\n    ],\n  },\n  {\n    path: '/about',\n    name: 'About',\n    component: () => import('@/views/About.vue'),\n  },\n  {\n    path: '/taskboard',\n    component: TaskBoard,\n    meta: {\n      breadCrumb: 'Task Board',\n    },\n  },\n  {\n    path: '/servers',\n    component: CloudInstancesPage,\n    meta: {\n      breadCrumb: 'Cloud Instances',\n    },\n  },\n  {\n    path: '/snapshots',\n    component: Snapshots,\n    meta: {\n      breadCrumb: 'Dataset Snapshots',\n    },\n  },\n  {\n    path: '/automation',\n    component: Automation,\n    meta: {\n      breadCrumb: 'Automation',\n    },\n  },\n  {\n    path: '/recycle',\n    component: RecycleBin,\n    meta: {\n      breadCrumb: 'Recycle Bin',\n    },\n  },\n  {\n    path: '/logout',\n    component: {\n      async beforeRouteEnter(to, from, next) {\n        // Invalidate the token\n        const dataConnect = new DatastoreConnect();\n        await dataConnect.logout()\n          .then((resp) => {\n            if (resp.error !== undefined) {\n              throw Error(resp.error);\n            }\n            next({ path: \"/\" });\n            store.commit('projects/resetState');\n            store.commit('datasets/resetState');\n            store.commit('statistics/resetState');\n            store.commit('annotationTool/resetState');\n            store.commit('reviews/resetState');\n            store.commit('user/logout');\n          })\n          .catch((error) => {\n            throw error;\n          });\n      },\n    },\n  },\n];\n\nconst router = createRouter({\n  history: createWebHashHistory(),\n  // history: createWebHistory(process.env.BASE_URL),\n  routes,\n});\n\nfunction clearTaskIntervals() {\n  store.commit('tasks/resetAllTasks');\n}\n\n// navigation guard after log out\nrouter.beforeEach(async (to, from) => {\n  try {\n    const currentToken = store.state.user.token;\n\n    if ((\n      !currentToken\n    || to.path === '/'\n    || to.path === '/login'\n    || to.path === '/logout'\n    || to.path === '/home'\n    || to.path === '/pricing'\n    )) {\n      clearTaskIntervals();\n    }\n\n    if ((\n      !currentToken\n    && to.path !== '/'\n    && to.path !== '/login'\n    && to.path !== '/logout'\n    && to.path !== '/home'\n    && to.path !== '/pricing'\n    )) {\n      clearTaskIntervals();\n\n      // Validate user with token cookie\n      const dataConnect = new DatastoreConnect();\n      const authResult = await dataConnect.verifyToken()\n        .then((resp) => {\n          if (resp.error !== undefined) {\n            throw Error(resp.error);\n          }\n          return resp.result;\n        })\n        .catch((error) => {\n          throw error;\n        });\n      if ('changepassword' in authResult && authResult.changepassword) {\n        return false;\n      }\n      await handleAuthentication(authResult);\n    }\n\n    store.commit('notifications/updateNotifications');\n    const user = store.state.user.user;\n    if (user && user.organization_id) {\n      store.dispatch('user/refreshUserList', user.organization_id);\n    }\n  } catch (err) {\n    console.log(err);\n    return false;\n  }\n\n  return true;\n});\n\nasync function handleAuthentication(authResult) {\n  const token = authResult.token;\n  const tokenJson = parseJwt(token);\n  store.commit('user/setPermissions', tokenJson.permissions);\n  store.commit('user/setToken', token);\n\n  const dataConnect = new DatastoreConnect();\n  const userResp = await dataConnect.checkForUser({\n    username: authResult.username,\n  });\n\n  const userObj = { ...userResp.result };\n  userObj.role = userResp.result.role;\n  store.commit('user/setUser', userObj);\n  if (userObj.role === 'super') {\n    store.commit('appVersion/setAllowDebug', 'yes');\n  }\n}\n\nexport default router;\n","import store from '@/store';\nimport router from '@/router';\nimport { fetchRetry } from '@/assets/js/utils';\nimport { useToast } from 'vue-toast-notification';\n\nclass DatastoreConnect {\n  constructor(url = '', options = null) {\n    this.url = '';\n    this.options = options;\n  }\n\n  static errorMessage(error) {\n    if (error === 'INVALID_URL') return (\"Datastore URL Not Correct\");\n    if (error === 'URL_UNAVIALABLE') return (\"Datastore Unavailable\");\n    if (error === 'INVALID_JSON') return (\"Datastore Communication Error\");\n    if (error === \"\") return 'Datastore Error';\n    return error;\n  }\n\n  createRPCQuery(url, {\n    jsonrpc = \"2.0\", id = 1, params = {}, method = \"\", formData = null,\n  }, signal = null) {\n    return new Promise((resolve, reject) => {\n      const headers = new Headers();\n      // headers.append('Authorization', `Bearer ${store.state.user.token}`);\n\n      let body;\n      if (formData) {\n        body = formData;\n      } else {\n        body = JSON.stringify({\n          jsonrpc, id, params, method,\n        });\n        headers.append('Content-Type', \"application/json\");\n      }\n\n      const options = {\n        method: 'POST',\n        headers,\n        body,\n        redirect: 'follow',\n        credentials: \"include\",\n      };\n\n      if (signal) {\n        options.signal = signal;\n      }\n\n      let formattedUrl;\n      if (process.env.NODE_ENV === 'development') {\n        formattedUrl = `${url ? `${url}/` : ''}api?method=${method}`;\n      } else {\n        formattedUrl = `api?method=${method}`;\n      }\n\n      const handleResponse = async (resp) => {\n        const json = await resp.json();\n        if (json.error?.code === 401) {\n          router.push('/logout'); // Redirect to home\n          return reject(DatastoreConnect.errorMessage({ error: \"Unauthorized (401)\" }));\n        }\n        if (json.error?.code === 403) {\n          const $toast = useToast();\n          $toast.open({\n            queue: true,\n            duration: 5000,\n            message: json.error.message,\n            type: 'error',\n            position: 'top',\n          });\n          reject(json);\n        }\n        resolve(json);\n      };\n\n      if (this.options?.tries) {\n        const retryOptions = { delay: this.options.delay, tries: this.options.tries, backoff: this.options.backoff };\n        fetchRetry(formattedUrl, retryOptions, options)\n          .then(handleResponse)\n          .catch((error) => reject(DatastoreConnect.errorMessage(error)));\n      } else {\n        fetch(formattedUrl, options)\n          .then(handleResponse)\n          .catch((error) => reject(DatastoreConnect.errorMessage(error)));\n      }\n    });\n  }\n\n  fetchWithAuth(url, { method = 'POST', params = {}, formData = null } = {}, signal = null) {\n    return new Promise((resolve, reject) => {\n      const headers = new Headers();\n      // headers.append('Authorization', `Bearer ${store.state.user.token}`);\n\n      let body;\n      if (formData) {\n        body = formData;\n      } else {\n        body = JSON.stringify({\n          params,\n        });\n        headers.append('Content-Type', \"application/json\");\n      }\n\n      const options = {\n        method,\n        headers,\n        body,\n        redirect: 'follow',\n        credentials: \"include\",\n      };\n\n      if (signal) {\n        options.signal = signal;\n      }\n\n      // let formattedUrl;\n      // if (process.env.NODE_ENV === 'development') {\n      //   formattedUrl = `${url ? `${url}/` : ''}api?method=${method}`;\n      // } else {\n      //   formattedUrl = `api?method=${method}`;\n      // }\n\n      const handleResponse = async (response) => {\n        if (!response.ok) {\n          if (response.status === 401) {\n            router.push('/'); // Redirect to login\n            throw new Error(\"Unauthorized (401)\");\n          }\n          throw new Error(`HTTP error! Status: ${response.status}`);\n        }\n        return response;\n      };\n\n      if (this.options?.tries) {\n        const retryOptions = { delay: this.options.delay, tries: this.options.tries, backoff: this.options.backoff };\n        fetchRetry(url, retryOptions, options)\n          .then(handleResponse)\n          .catch((error) => reject(DatastoreConnect.errorMessage(error)));\n      } else {\n        fetch(url, options)\n          .then(handleResponse)\n          .catch((error) => reject(DatastoreConnect.errorMessage(error)));\n      }\n    });\n  }\n\n  // ----------------------------------------   Package   ----------------------------------------------\n\n  async getPackageList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"package.list\", params });\n  }\n\n  async addPackage(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"package.add\", params });\n  }\n\n  async updatePackageQuota(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"package.update_quota\", params });\n  }\n\n  async getPackage(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"package.get\", params });\n  }\n\n  async deletePackage(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"package.delete\", params });\n  }\n\n  // ----------------------------------------   Accounting   ----------------------------------------------\n  async checkImageLimitForAccounting(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"accounting.check_image_limit\", params });\n  }\n\n  async getAccountingMaxImageSize(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"accounting.get_single_image_size\", params });\n  }\n\n  async getCostPackage(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.get_cost_package\", params });\n  }\n\n  async getCostPackageByName(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.get_cost_package_name\", params });\n  }\n\n  async getUsageSummaryForOrganization(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"accounting.get_usage_summary\", params });\n  }\n\n  async getDateRangeReport(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"accounting.date_range_report\", params });\n  }\n\n  async getDetailedDatasets(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"accounting.get_dataset_summary\", params });\n  }\n\n  async getDetailedImages(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"accounting.get_image_summary\", params });\n  }\n\n  async purchaseCredits(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.purchase_credits\", params });\n  }\n\n  async getDollarCreditRatio(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.get_dollar_to_credits\", params });\n  }\n\n  async generateMonthlyBill(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.generate_monthly_bill\", params });\n  }\n\n  async retrieveMonthlyBill(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.get_monthly_bill\", params });\n  }\n\n  async retrieveAnnualBill(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.annual_bills\", params });\n  }\n\n  async getAllInstances(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"billing.get_all_instances\", params });\n  }\n\n  // ----------------------------------------   Projects   ----------------------------------------------\n\n  async getProject(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"project.get\", params });\n  }\n\n  async getProjectList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"project.list\", params });\n  }\n\n  async addProject(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"project.add\", params });\n  }\n\n  async deleteProject(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"project.del\", params });\n  }\n\n  async updateProject(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"project.update\", params });\n  }\n\n  async getProjectAccessList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.list\", params });\n  }\n\n  async getProjectAccessForSingleUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.get_for_user\", params });\n  }\n\n  async addProjectAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.add\", params });\n  }\n\n  async updateProjectAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.update\", params });\n  }\n\n  async deleteProjectAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.del\", params });\n  }\n\n  async revertProjectAccessToDefault(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.revert_to_default\", params });\n  }\n\n  async setProjectAccessToPrivate(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.set_to_private\", params });\n  }\n\n  async getOrganizationDefaultPermissions(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"projectaccess.get_org_default\", params });\n  }\n\n  // ----------------------------------------   Datasets   ----------------------------------------------\n\n  async getDatasetList(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.list\", params });\n  }\n\n  async getDatasetById(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.get\", params });\n  }\n\n  async copyDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.copy\", params });\n  }\n\n  async copyDatasetWithFilters(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.copyfilters\", params });\n  }\n\n  async createDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.create\", params });\n  }\n\n  async deleteDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.delete\", params });\n  }\n\n  async getDatasetStats(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.stats\", params });\n  }\n\n  async updateDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.update\", params });\n  }\n\n  async freezeDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.freeze\", params });\n  }\n\n  async getDatasetDownloads(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.downloads\", params });\n  }\n\n  async parkDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.park\", params });\n  }\n\n  async unparkDataset(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.unpark\", params });\n  }\n\n  async getDatasetImageSources(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.get_sources\", params });\n  }\n\n  async getDatasetAnnotationTypes(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.get_annotation_types\", params });\n  }\n\n  async getDatasetDateRange(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.date_range\", params });\n  }\n\n  async getDatasetTopics(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.get_topics\", params });\n  }\n\n  async copySequences(params) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.copy_sequences\", params });\n  }\n\n  // ----------------------------------------   Dataset Access   --------------------------------------\n\n  async getDatasetAccessList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.list\", params });\n  }\n\n  async addDatasetAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.add\", params });\n  }\n\n  async updateDatasetAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.update\", params });\n  }\n\n  async deleteDatasetAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.del\", params });\n  }\n\n  async getDatasetAccessUserList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.user_list\", params });\n  }\n\n  async getProjectDatasetAccessUserList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.project_user_list\", params });\n  }\n\n  async getDatasetAccessForSingleUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.get_for_user\", params });\n  }\n\n  async revertDatasetAccessToDefault(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.revert_to_default\", params });\n  }\n\n  async setDatasetAccessToPrivate(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"datasetaccess.set_to_private\", params });\n  }\n\n  // ----------------------------------------   Images   ----------------------------------------------\n\n  async getImage(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.get\", params }, signal);\n  }\n\n  async getImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.list\", params }, signal);\n  }\n\n  async getImagesCount(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.list\", params }, signal);\n  }\n\n  async deleteImageFromDataset(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.delete_from_dataset\", params });\n  }\n\n  async getImageMetadata(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.get_metadata\", params });\n  }\n\n  async getFilteredImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.list.filter\", params }, signal);\n  }\n\n  async deleteFilteredImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.delete.filter\", params }, signal);\n  }\n\n  async copyImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"image.copy_images\", params }, signal);\n  }\n\n  // ----------------------------------------   Annotations   ----------------------------------------------\n\n  async addAnnotations(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.add\", params });\n  }\n\n  async addAnnotationsBulk(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.add_bulk\", params });\n  }\n\n  async getAnnotations(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.list2\", params });\n  }\n\n  async updateAnnotations(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.update\", params });\n  }\n\n  async deleteAnnotations(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.del\", params });\n  }\n\n  async getAnnotationJson(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.data_json\", params });\n  }\n\n  async deleteAnnotationBulk(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.bulk.del\", params });\n  }\n\n  async deleteAnnotationsByTrackingId(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annotation.delete_tracking_id\", params });\n  }\n\n  async getAnnotationFile(annotation_id, dataType = 'text', signal = null) {\n    const headers = new Headers();\n    headers.append('Authorization', `Bearer ${store.state.user.token}`);\n    const requestOptions = {\n      method: 'GET',\n      redirect: 'follow',\n      headers,\n      credentials: \"include\",\n    };\n    return fetch(`/annotation/${annotation_id}`, requestOptions, signal)\n      .then(async (resp) => {\n        if (!resp.ok) {\n          throw Error(await resp.text());\n        }\n        if (dataType === 'blob') {\n          return resp.blob();\n        }\n        if (dataType === 'arrayBuffer') {\n          return resp.arrayBuffer();\n        }\n        return resp.text();\n      });\n  }\n\n  async updateAnnotationFile(annotation_id, file, signal = null) {\n    const headers = new Headers();\n    headers.append('Authorization', `Bearer ${store.state.user.token}`);\n    const requestOptions = {\n      method: 'PUT',\n      redirect: 'follow',\n      headers,\n      body: file,\n      credentials: \"include\",\n    };\n    return fetch(`/annotation/${annotation_id}`, requestOptions, signal)\n      .then(async (resp) => {\n        if (!resp.ok) {\n          throw Error(await resp.text());\n        }\n        return resp.text();\n      });\n  }\n\n  // ----------------------------------------   Annotation Sets   ----------------------------------------------\n\n  async createAnnotationSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.add\", params });\n  }\n\n  async updateAnnotationSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.update\", params });\n  }\n\n  async getAnnotationSets(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.list\", params }, signal);\n  }\n\n  async getAnnotationSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.get\", params });\n  }\n\n  async copyAnnotationSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.copy\", params });\n  }\n\n  async deleteAnnotationSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.del\", params });\n  }\n\n  async getAnnotationSetConfusionMatrix(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.confusion_matrix\", params });\n  }\n\n  async getAnnotationsForAnnotationSets(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"annset.get_all_annotations\", params });\n  }\n\n  // ----------------------------------------   Labels   ----------------------------------------------\n\n  async getLabelList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"label.list\", params });\n  }\n\n  async addLabel(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"label.add\", params });\n  }\n\n  async addLabel2(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"label.add2\", params });\n  }\n\n  async deleteLabel(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"label.del\", params });\n  }\n\n  async updateLabel(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"label.update\", params });\n  }\n\n  // ----------------------------------------   Auto Annotations   ----------------------------------------------\n\n  async getAutoAnnList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoann.list\", params });\n  }\n\n  async getAutoAnnSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoann.get\", params });\n  }\n\n  async startAutoAnn(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoann.start\", params });\n  }\n\n  async deleteAutoAnn(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoann.del\", params });\n  }\n\n  async terminateAutoAnn(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoann.terminate\", params });\n  }\n\n  // ----------------------------------------   Auto Segmentations   ----------------------------------------------\n\n  async startAutoSegmentation(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoseg.start\", params });\n  }\n\n  async getAutoSegList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoseg.list\", params });\n  }\n\n  async getAutoSeg(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoseg.get\", params });\n  }\n\n  async removeAutoSeg(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"autoseg.del\", params });\n  }\n\n  // ----------------------------------------   Reviews   ----------------------------------------------\n\n  async addReviews(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"review.add\", params });\n  }\n\n  async getReviewImages(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"review.get_images\", params });\n  }\n\n  async getLabellingImages(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"review.get_labelling_images\", params });\n  }\n\n  async getLabellingSequenceFrames(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"review.get_labelling_sequence_frames\", params }, signal);\n  }\n\n  async setImageReviewStatusDone(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"imagereviewstatus.update_done\", params });\n  }\n\n  async deleteImageReviewStatus(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"imagereviewstatus.del\", params });\n  }\n\n  // ----------------------------------------   Review Tasks   ----------------------------------------------\n\n  async addReviewTask(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.add\", params });\n  }\n\n  async deleteReviewTask(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.del\", params });\n  }\n\n  async getReviewTasks(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.list\", params });\n  }\n\n  async getReviewTaskById(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.get\", params });\n  }\n\n  async getReviewerList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.reviewer_list\", params });\n  }\n\n  async getReviewTaskRemainingCount(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.remaining_count\", params });\n  }\n\n  async getLabelingTaskRemainingCount(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.labeling_remaining_count\", params });\n  }\n\n  async getTaskDoneImagesByUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.done_images_by_user\", params });\n  }\n\n  async deleteReviewTaskUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtaskuser.del\", params });\n  }\n\n  async addReviewTaskUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtaskuser.add\", params });\n  }\n\n  async submitAuditManualAnnotationTask(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"manualannotationtask.audit.submit\", params });\n  }\n\n  async submitKeyframes(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"manualannotationtask.keyframe.submit\", params });\n  }\n\n  async getReviewTaskImageList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewtask.image_list\", params });\n  }\n\n  // ----------------------------------------   Review Task Access   --------------------------------------\n\n  async getReviewTaskAccessList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewaccess.list\", params });\n  }\n\n  async addReviewTaskAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewaccess.add\", params });\n  }\n\n  async updateReviewTaskAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewaccess.update\", params });\n  }\n\n  async deleteReviewTaskAccess(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewaccess.del\", params });\n  }\n\n  async getReviewTaskAccessForSingleUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewaccess.get_for_user\", params });\n  }\n\n  async revertReviewTaskAccessToDefault(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewaccess.revert_to_default\", params });\n  }\n\n  // ----------------------------------------   Review Sessions   ----------------------------------------------\n\n  async addReviewSession(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"reviewsession.add\", params });\n  }\n\n  // ----------------------------------------   S3   ----------------------------------------------\n\n  async s3CreatePresignedUrl(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"s3.create_presigned_url\", params });\n  }\n\n  async s3SingleImageImport(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"s3.single_image_import\", params });\n  }\n\n  // ----------------------------------------   Trainer   ----------------------------------------------\n\n  async addTrainer(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.add\", params });\n  }\n\n  async updateTrainer(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.update\", params });\n  }\n\n  async deleteTrainer(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.del\", params });\n  }\n\n  async getTrainerList2(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.list2\", params });\n  }\n\n  async getTrainerList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.list\", params });\n  }\n\n  async getTrainerData(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.getdata\", params });\n  }\n\n  async startTrainer(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.server.start\", params });\n  }\n\n  async stopTrainer(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.server.stop\", params });\n  }\n\n  async updateEC2Status(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.server.update_ec2\", params });\n  }\n\n  async getTrainerStatus(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.status\", params });\n  }\n\n  async terminateTrainingSessions(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.session.terminate\", params });\n  }\n\n  async deleteTrainingSession(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.session.delete\", params });\n  }\n\n  async getTrainingSession(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.session.get\", params });\n  }\n\n  async getTrainingSessionList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.session.list\", params });\n  }\n\n  async getTrainingSessionLogs(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.session.logs\", params });\n  }\n\n  async generateTwoStageModel(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.server.generate_two_stage\", params });\n  }\n\n  async getTrainerParametersSchema(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.server.schema\", params });\n  }\n\n  async getTrainingSessionArtifacts(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainer.get_artifacts\", params });\n  }\n\n  // ----------------------------------------   Authentication   ----------------------------------------------\n\n  async signIn(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"auth.login\", params });\n  }\n\n  async logout(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"auth.logout\", params });\n  }\n\n  async refreshToken(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"auth.refresh\", params });\n  }\n\n  async verifyToken(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"auth.verify_token\", params });\n  }\n\n  async send2FA(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"auth.send2fa\", params });\n  }\n\n  async generateBridgeToken(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"auth.generate_bridge_token\", params });\n  }\n\n  // ----------------------------------------   User   ----------------------------------------------\n\n  async createUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.add\", params });\n  }\n\n  async updateUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.update\", params });\n  }\n\n  async updateUserPassword(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.update_password\", params });\n  }\n\n  async updateUserPasswordAuth(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.update_password_with_auth\", params });\n  }\n\n  async getAllRoles(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.get_all_roles\", params });\n  }\n\n  async getUserList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.list\", params });\n  }\n\n  async getUserListByParent(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.list_by_parent\", params });\n  }\n\n  async getUserListByOrganization(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.list_by_org\", params });\n  }\n\n  async deleteUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.del\", params });\n  }\n\n  async checkForUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.check_for_user\", params });\n  }\n\n  async getUserBucket(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.get_bucket\", params });\n  }\n\n  async registerNewUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.register\", params });\n  }\n\n  async sendFeedback(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.feedback\", params });\n  }\n\n  async generateUserAvatar(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.avatar\", params });\n  }\n\n  async userContact(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"user.contact\", params });\n  }\n\n  // ----------------------------------------   Organization   ----------------------------------------------\n\n  async createOrg(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.add\", params });\n  }\n\n  async getOrgList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.list\", params });\n  }\n\n  async getOrg(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.get\", params });\n  }\n\n  async updateOrg(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.update\", params });\n  }\n\n  async getOrgForUser(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.get_for_user\", params });\n  }\n\n  async updateBucket(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.update_bucket\", params });\n  }\n\n  async getOrgDataField(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.get_data_field\", params });\n  }\n\n  async setOrgDataField(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.set_data_field\", params });\n  }\n\n  async listWarnings(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"org.list_warnings\", params });\n  }\n\n  // ----------------------------------------   Import   ----------------------------------------------\n\n  async getSupportedImportTypes(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"import.types\", params });\n  }\n\n  // ----------------------------------------   Export   ----------------------------------------------\n\n  async startExport(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"export.start\", params });\n  }\n\n  async getExportList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"export.list\", params });\n  }\n\n  async getExportStatus(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"export.status\", params });\n  }\n\n  async deleteExport(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"export.delete\", params });\n  }\n\n  // ----------------------------------------   Groups   ----------------------------------------------\n\n  async getGroupListForDataset(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"groups.list\", params });\n  }\n\n  async createGroupsForDataset(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"groups.create\", params });\n  }\n\n  async updateGroup(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"groups.update\", params });\n  }\n\n  async deleteGroup(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"groups.delete\", params });\n  }\n\n  // -----------------------------------   Training Sets (Removed in 2.4)   ----------------------------------------------\n\n  async getTrainingSetList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.list\", params });\n  }\n\n  async getTrainingSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.get\", params });\n  }\n\n  async addTrainingSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.add\", params });\n  }\n\n  async deleteTrainingSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.delete\", params });\n  }\n\n  async updateTrainingSet(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.update\", params });\n  }\n\n  async getTrainingSetConversionList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.conv.list\", params });\n  }\n\n  async addTrainingSetConversion(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.conv.add\", params });\n  }\n\n  async deleteTrainingSetConversion(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.conv.del\", params });\n  }\n\n  async updateTrainingSetConversion(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.conv.update\", params });\n  }\n\n  async getTrainingSetCacheList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.cache.list\", params });\n  }\n\n  async addTrainingSetCache(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.cache.add\", params });\n  }\n\n  async deleteTrainingSetCache(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.cache.del\", params });\n  }\n\n  async updateTrainingSetCache(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"trainset.cache.update\", params });\n  }\n\n  async getDockerTasksDashboard(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"docker.list.dashboard\", params });\n  }\n\n  async getDockerTaskById(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"docker.get\", params });\n  }\n\n  async addDockerTask(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"docker.add\", params });\n  }\n\n  async deleteDockerTask(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"docker.delete\", params });\n  }\n\n  async updateDockerTask(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"docker.update\", params });\n  }\n\n  async updateDockerTaskStatus(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"docker.update.status\", params });\n  }\n\n  // ----------------------------------------   Graph   ----------------------------------------------\n\n  async startGraph(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"graph.start\", params });\n  }\n\n  async getCharts(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"graph.get\", params });\n  }\n\n  async stopGraph(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"graph.stop\", params });\n  }\n\n  // ----------------------------------------   Validator   ----------------------------------------------\n\n  async validate(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.start\", params });\n  }\n\n  async getValidateSessionList(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.session.list\", params });\n  }\n\n  async getValidateGraphs(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.graph.get\", params });\n  }\n\n  async getValidateSession(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.session.get\", params });\n  }\n\n  async terminateValidateSessions(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.session.terminate\", params });\n  }\n\n  async deleteValidateSessions(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.session.delete\", params });\n  }\n\n  async validateUpdateEC2(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.session.update_ec2\", params });\n  }\n\n  async getValidatorSchema(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.schema\", params });\n  }\n\n  async getValidateSessionLogs(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"validate.session.logs\", params });\n  }\n\n  // ----------------------------------------   Video Import   -----------------------------------------\n\n  async videoImport(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"video.import\", params });\n  }\n\n  // ----------------------------------------   Upload   -----------------------------------------\n\n  async addUploadData(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"upload.image.add\", params });\n  }\n\n  async uploadAnnotations(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"upload.annotation\", params });\n  }\n\n  async completeUpload(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"upload.complete\", params });\n  }\n\n  async uploadVideo(formData = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"upload.video\", formData });\n  }\n\n  // ----------------------------------------   Stats   -----------------------------------------\n\n  async statsCompare(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"stats.compare\", params }, signal);\n  }\n\n  // ----------------------------------------   Version   ----------------------------------------------\n\n  async getAppVersion() {\n    return this.createRPCQuery(`${this.url}`, { method: \"version\" });\n  }\n\n  // ----------------------------------------   Organization   ----------------------------------------------\n\n  async getConverterOptions(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"convert.list\", params });\n  }\n\n  async convertModel(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"convert.start\", params });\n  }\n\n  async convertorStatus(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"convert.status\", params });\n  }\n\n  async convertorFindAllFiles(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"convert.allfiles\", params });\n  }\n\n  async convertorGetDockerTasks(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"convert.dockerlist\", params });\n  }\n\n  // ----------------------------------------   Recycle   ----------------------------------------------\n\n  async getListOfRecycledItems(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"recycle.list\", params }, signal);\n  }\n\n  async undeleteRecycledItem(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"recycle.undel\", params });\n  }\n\n  async purgeRecycledItem(params = {}) {\n    return this.createRPCQuery(`${this.url}`, { method: \"recycle.purge\", params });\n  }\n\n  // ----------------------------------------   Permission   ----------------------------------------------\n\n  async getUserPermissions(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"permission.get_for_user\", params }, signal);\n  }\n\n  // ----------------------------------------   Sequences   ----------------------------------------------\n\n  async getSequences(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"sequences.list\", params }, signal);\n  }\n\n  async purgeSequence(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"sequences.purge\", params }, signal);\n  }\n\n  // --------------------------------------  Cloud Instances   ------------------------------------------\n\n  async startCloudInstance(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"cloud.server.start\", params }, signal);\n  }\n\n  async listCloudInstances(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"cloud.server.list\", params }, signal);\n  }\n\n  async stopCloudInstance(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"cloud.server.del\", params }, signal);\n  }\n\n  async stopMultipleCloudInstance(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"cloud.server.del_multiple\", params }, signal);\n  }\n\n  async getCloudInstanceStatus(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"cloud.server.get\", params }, signal);\n  }\n\n  // ----------------------------------------   Tags   ----------------------------------------------\n\n  async listTagsForDataset(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.list_dataset\", params }, signal);\n  }\n\n  async listTagsForImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.list_images\", params }, signal);\n  }\n\n  async updateTagName(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.update\", params }, signal);\n  }\n\n  async addNewTagForImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.add_images\", params }, signal);\n  }\n\n  async addNewTagForDataset(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.add_dataset\", params }, signal);\n  }\n\n  async removeTagForImages(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.del_image\", params }, signal);\n  }\n\n  async removeTagForDataset(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"tags.del_dataset\", params }, signal);\n  }\n\n  // ----------------------------------------   Snapshots   ----------------------------------------------\n\n  async listSnapshots(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.list\", params }, signal);\n  }\n\n  async createNewSnapshot(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.create\", params }, signal);\n  }\n\n  async restoreSnapshot(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.restore\", params }, signal);\n  }\n\n  async removeSnapshot(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.delete\", params }, signal);\n  }\n\n  async updateSnapshot(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.update\", params }, signal);\n  }\n\n  async createSnapshotUploadUrl(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.create_upload_url\", params }, signal);\n  }\n\n  async createSnapshotDownloadUrl(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.create_download_url\", params }, signal);\n  }\n\n  async createSnapshotUploadMultipartUrl(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.create_upload_url_multipart\", params }, signal);\n  }\n\n  async completeSnapshotUploadMultipartUrl(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"snapshots.complete_multipart_upload\", params }, signal);\n  }\n\n  // ----------------------------------------   Hash   ----------------------------------------------\n\n  async GetDatasetAnnotationsHash(params = {}, signal = null) {\n    return this.createRPCQuery(`${this.url}`, { method: \"dataset.hash\", params }, signal);\n  }\n}\n\nexport default DatastoreConnect;\n","import { render } from \"./App.vue?vue&type=template&id=37da00d8\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=37da00d8&lang=scss\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue';\nimport { createPinia } from 'pinia';\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate';\nimport VueKonva from 'vue-konva';\nimport Tres from '@tresjs/core';\n\n// Vuetify\nimport 'vuetify/styles';\nimport { createVuetify } from 'vuetify';\nimport * as components from 'vuetify/components';\nimport * as directives from 'vuetify/directives';\nimport '@mdi/font/css/materialdesignicons.css';\nimport { VNumberInput } from 'vuetify/labs/VNumberInput';\nimport VueApexCharts from 'vue3-apexcharts';\n\nimport App from './App.vue';\nimport router from './router';\nimport store from './store';\n\nconst clickOutside = {\n  beforeMount: (el, binding) => {\n    el.clickOutsideEvent = (event) => {\n      // here I check that click was outside the el and his children\n      if (!(el === event.target || el.contains(event.target))) {\n        // and if it did, call method provided in attribute value\n        binding.value(event);\n      }\n    };\n    document?.addEventListener(\"click\", el.clickOutsideEvent);\n    document.querySelector('.modal')?.addEventListener(\"click\", el.clickOutsideEvent);\n  },\n  unmounted: (el) => {\n    document?.removeEventListener(\"click\", el.clickOutsideEvent);\n    document.querySelector('.modal')?.removeEventListener(\"click\", el.clickOutsideEvent);\n  },\n};\n\nconst visibleToggle = (el, binding) => {\n  el.style.visibility = binding.value ? 'visible' : 'hidden';\n};\n\nconst vuetify = createVuetify({\n  icons: {\n    defaultSet: 'mdi',\n  },\n  components: {\n    ...components,\n    VNumberInput,\n  },\n  directives,\n});\n\nconst pinia = createPinia();\npinia.use(piniaPluginPersistedstate);\n\ncreateApp(App)\n  .use(store)\n  .use(router)\n  .use(VueKonva)\n  .use(vuetify)\n  .use(Tres)\n  .use(pinia)\n  .use(VueApexCharts)\n  .directive('click-outside', clickOutside)\n  .directive('visible', visibleToggle)\n  .mount('#app');\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"35\":\"f12b6931\",\"57\":\"432f39ba\",\"74\":\"1bab179d\",\"92\":\"ffca858c\",\"110\":\"0e0740f4\",\"125\":\"b0d44e26\",\"194\":\"3585a8e5\",\"218\":\"f60b90d8\",\"237\":\"6ff79964\",\"252\":\"22e9d589\",\"427\":\"d6785ade\",\"491\":\"a0345ed9\",\"537\":\"17433bd0\",\"570\":\"e08be463\",\"613\":\"0b5a2fd0\",\"633\":\"9b95fffa\",\"663\":\"0afa7529\",\"684\":\"0c4662e2\",\"703\":\"82d58687\",\"844\":\"0f2de8cb\",\"887\":\"7ee9e199\",\"897\":\"581788c0\",\"948\":\"ab15be76\",\"950\":\"801a87eb\",\"993\":\"1970b30e\",\"1135\":\"8c6982e2\",\"1190\":\"9cbcec7a\",\"1215\":\"9c9f0385\",\"1244\":\"032fd0d8\",\"1249\":\"2f0c2adf\",\"1258\":\"712461cf\",\"1276\":\"07bc1f3d\",\"1292\":\"8cb7a498\",\"1342\":\"4396f4dd\",\"1503\":\"e1c234d1\",\"1520\":\"be19a08e\",\"1536\":\"e4024f10\",\"1592\":\"d6430e6a\",\"1600\":\"0a7200f6\",\"1604\":\"71be9085\",\"1671\":\"d5b0e8e9\",\"1675\":\"6759c0bc\",\"1677\":\"97c30e03\",\"1707\":\"f6a68145\",\"1743\":\"d1de61e2\",\"1827\":\"da97683c\",\"1836\":\"6cece60b\",\"1858\":\"a74490e9\",\"1862\":\"9108e8e8\",\"1933\":\"e94631c3\",\"1955\":\"aa4022d4\",\"1967\":\"bbab7f66\",\"1970\":\"798ba563\",\"1976\":\"0000fc42\",\"2027\":\"0527bf0e\",\"2063\":\"9b76345c\",\"2087\":\"87b81785\",\"2099\":\"b16d8371\",\"2134\":\"be9c04e8\",\"2143\":\"f1cb17d6\",\"2173\":\"a6068621\",\"2200\":\"f4a8d473\",\"2208\":\"b1900fd7\",\"2255\":\"8ee5dd65\",\"2321\":\"5da7c037\",\"2330\":\"0e7ef532\",\"2340\":\"5959a56d\",\"2356\":\"7356dabd\",\"2411\":\"03e804ed\",\"2533\":\"d8a70358\",\"2645\":\"6eead24c\",\"2669\":\"d966cf56\",\"2678\":\"86e50760\",\"2682\":\"6072e25f\",\"2734\":\"82161268\",\"2764\":\"8b47dd99\",\"2795\":\"9a0de251\",\"2836\":\"a423c0f0\",\"2879\":\"7b482a56\",\"2898\":\"724d9cce\",\"2916\":\"cd7c7fbc\",\"2964\":\"6c2954e9\",\"3000\":\"008b3e39\",\"3009\":\"a674321b\",\"3114\":\"94bcfe53\",\"3175\":\"408cf023\",\"3197\":\"0db67f52\",\"3226\":\"c4d13730\",\"3239\":\"4fc0a53f\",\"3275\":\"0c0ec652\",\"3409\":\"8a239284\",\"3421\":\"5f8682f2\",\"3450\":\"3ed7b6eb\",\"3453\":\"da5737d1\",\"3482\":\"545cf541\",\"3596\":\"5bab5d24\",\"3666\":\"35825f91\",\"3675\":\"cc477070\",\"3702\":\"35563627\",\"3745\":\"63b389cb\",\"3757\":\"e050c384\",\"3772\":\"9d7ff678\",\"3837\":\"f527a596\",\"3882\":\"0937d9b4\",\"3923\":\"1f31cd86\",\"3951\":\"f45aa94b\",\"4007\":\"7a93383e\",\"4025\":\"d49f22ef\",\"4052\":\"8ace994a\",\"4067\":\"c9e8e168\",\"4134\":\"d93fdec4\",\"4210\":\"8d9cd7a7\",\"4250\":\"1a39def1\",\"4290\":\"3a3724e4\",\"4303\":\"1faaf9fa\",\"4387\":\"037d3d72\",\"4402\":\"bb2b9d7a\",\"4408\":\"4f85b338\",\"4439\":\"021e7ecf\",\"4443\":\"5725f9f6\",\"4444\":\"0c50e6c2\",\"4481\":\"9c3e1f5a\",\"4583\":\"46de3044\",\"4596\":\"7df8bba5\",\"4604\":\"3fc4af3a\",\"4605\":\"6cfbfa44\",\"4606\":\"26db2718\",\"4618\":\"32c910de\",\"4640\":\"bf084104\",\"4663\":\"c05aeed7\",\"4679\":\"6767cbc9\",\"4689\":\"57eb5cda\",\"4702\":\"28320db6\",\"4731\":\"d274f1b1\",\"4741\":\"ff25bd72\",\"4742\":\"998d45d9\",\"4759\":\"e19688ca\",\"4769\":\"69615d79\",\"4813\":\"fac535f7\",\"4830\":\"906ea19e\",\"4901\":\"47eeead6\",\"4920\":\"b03af555\",\"4938\":\"602614e7\",\"4954\":\"d1a96172\",\"4999\":\"761e3099\",\"5042\":\"328994e9\",\"5102\":\"1a4cc896\",\"5118\":\"5ae97972\",\"5125\":\"706b63b1\",\"5151\":\"08ed7cb5\",\"5226\":\"a5a7859e\",\"5345\":\"7d7cbfc8\",\"5430\":\"d9d71961\",\"5469\":\"13eb551c\",\"5561\":\"6685357c\",\"5580\":\"3b67125a\",\"5596\":\"805c6dab\",\"5685\":\"c0ce9824\",\"5702\":\"d3e37395\",\"5722\":\"fcb0d6b4\",\"5725\":\"e7f78985\",\"5738\":\"3395067f\",\"5782\":\"c5c963fe\",\"5787\":\"73d14445\",\"5811\":\"a9637e34\",\"5812\":\"55e405bd\",\"5818\":\"1757b37a\",\"5855\":\"3f6f3e97\",\"5922\":\"d3d9426e\",\"5933\":\"87d6f9c9\",\"5986\":\"bd491ffd\",\"6022\":\"9cc9f765\",\"6079\":\"1d716107\",\"6112\":\"103f611b\",\"6136\":\"e867b7a6\",\"6172\":\"3e2bba4d\",\"6223\":\"f7ab446d\",\"6246\":\"dc4339e0\",\"6258\":\"39bf4fa7\",\"6273\":\"733ed6da\",\"6342\":\"e22ebc46\",\"6402\":\"182e2a65\",\"6416\":\"b294609c\",\"6443\":\"ace7ad9a\",\"6479\":\"e8e8089c\",\"6507\":\"1daabeab\",\"6538\":\"4a018fa5\",\"6547\":\"b10ef6b3\",\"6555\":\"0fa29ae7\",\"6563\":\"270dc2c9\",\"6577\":\"345f4aae\",\"6588\":\"bc2a99cf\",\"6599\":\"21fab6d7\",\"6609\":\"2ecd78ce\",\"6622\":\"b412b9c2\",\"6629\":\"1c38f3b8\",\"6652\":\"50a7ea40\",\"6663\":\"982f3b30\",\"6666\":\"104bd931\",\"6707\":\"f96821d4\",\"6727\":\"1066018e\",\"6765\":\"1a27dd67\",\"6850\":\"89c97c33\",\"6906\":\"37230f96\",\"6946\":\"0065f9a7\",\"6975\":\"903e05d1\",\"6981\":\"da90eaec\",\"6984\":\"c7d3676b\",\"7070\":\"bfc346bd\",\"7082\":\"13abb693\",\"7126\":\"5cc81e49\",\"7184\":\"6d98be99\",\"7233\":\"bbf5eee3\",\"7275\":\"d3535359\",\"7284\":\"42025831\",\"7301\":\"54bce225\",\"7327\":\"8bd7de5f\",\"7384\":\"2e2c67b4\",\"7427\":\"f76c0be3\",\"7473\":\"480f4e63\",\"7500\":\"e90674a2\",\"7569\":\"d31f19c3\",\"7571\":\"9fb94012\",\"7593\":\"e6446201\",\"7594\":\"408639ea\",\"7596\":\"e0e42c54\",\"7607\":\"c9eaa088\",\"7640\":\"d5cc4ea6\",\"7666\":\"41f5a39b\",\"7701\":\"cc9f0f03\",\"7718\":\"d681b03a\",\"7743\":\"026eff29\",\"7761\":\"7e9fca68\",\"7781\":\"b0c754d4\",\"7914\":\"841da93d\",\"7940\":\"d9e7d930\",\"7947\":\"0adc0510\",\"8086\":\"17bac3a4\",\"8206\":\"ae39120f\",\"8268\":\"e24cf92b\",\"8303\":\"68a27bd5\",\"8342\":\"f870b064\",\"8390\":\"95d19df1\",\"8407\":\"a88c3220\",\"8419\":\"ceee82a4\",\"8440\":\"8e80edda\",\"8441\":\"a70b233a\",\"8472\":\"0f68281c\",\"8526\":\"2f817a55\",\"8570\":\"446095fe\",\"8578\":\"63615de5\",\"8584\":\"c744bc44\",\"8604\":\"926a67d6\",\"8605\":\"d1587876\",\"8609\":\"46659aa8\",\"8610\":\"c5c6f1be\",\"8658\":\"97d8f7c4\",\"8684\":\"bf94a6d6\",\"8741\":\"6ee3dc9d\",\"8759\":\"c41a4808\",\"8772\":\"0304dc81\",\"8823\":\"94e12ffd\",\"8835\":\"9ad18d57\",\"8864\":\"5fb6334e\",\"8891\":\"f337b762\",\"8903\":\"ded41d1f\",\"8928\":\"e239518e\",\"8975\":\"f4b7e007\",\"9019\":\"60dc547b\",\"9039\":\"2730cae4\",\"9100\":\"cd53380d\",\"9209\":\"fd1d5db3\",\"9218\":\"5d0c4017\",\"9225\":\"83a58f96\",\"9306\":\"22b283e0\",\"9331\":\"9f15df8e\",\"9334\":\"c3f45316\",\"9389\":\"49cb320a\",\"9570\":\"b6e5870c\",\"9595\":\"e050682c\",\"9637\":\"1845e05e\",\"9683\":\"cda538b4\",\"9785\":\"8622ec68\",\"9792\":\"0c683ed0\",\"9809\":\"ea7ae52d\",\"9813\":\"93c07be2\",\"9836\":\"dbd02ef4\",\"9850\":\"48b1a1f9\",\"9863\":\"ce8c82a4\",\"9873\":\"b4522bab\",\"9876\":\"963da9cd\",\"9950\":\"18ebd1e5\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"dve-frontend:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t3524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdve_frontend\"] = self[\"webpackChunkdve_frontend\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(20554); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","uppercaseFirstLetter","word","charAt","toUpperCase","slice","debounce","fn","delay","timeoutID","args","clearTimeout","setTimeout","inputSanitizer","event","input","target","inputValue","value","undefined","style","color","parseFloat","max","min","changeSanitizer","Number","isNaN","dispatchEvent","CustomEvent","decimalAdjust","type","exp","String","includes","TypeError","NaN","Math","magnitude","exponent","toString","split","adjustedValue","newMagnitude","newExponent","roundNumber","number","digits","multiple","round","hslToHex","h","s","l","a","f","n","k","padStart","getColorByIndexFromScale","index","hue","getColorByIndex","colorsHSL","getColor","wait","Promise","fetchRetry","url","tries","backoff_factor","fetchOptions","onError","err","triesLeft","delayWithBackoff","then","fetch","catch","async","getFileContents","file","reject","reader","FileReader","onload","fileContents","result","onerror","readAsText","parseJwt","token","base64Url","base64","replace","jsonPayload","decodeURIComponent","window","atob","c","charCodeAt","join","JSON","parse","deepCompare","obj1","obj2","keys1","keys2","length","key","val1","val2","txtFormat5","txtFormat6","txtFormatSegment","parseLabelIndex","format","columns","annotation","i","indexOf","label_index","parseInt","parseScore","score","parseCenterX","cx","w","x","parseCenterY","cy","y","parseWidth","w_i","parseHeight","h_i","parsePolygon","polygon_i","polygonColumns","points","push","polygon","stringify","formatMap","center_x","center_y","width","height","parseAnnotationTextFile","annotations","forEach","line","col","parseAnnotationJsonFile","labels","meta","json","error","boxes","box","segment","class","combinedPolygons","objects","obj","label","label_name","bbox","xmin","ymin","xmax","ymax","device_id","source","filenameParts","name","timestamp","gps","lat","lon","parseAnnotationsJSON","annotationURLs","annotationsJSON","all","annotationURL","getLabelIndex","category_id","categories","databaseLabels","categoryObj","find","category","categoryName","supercategory","labelObj","parseSegmentation","originalSegmentation","image","normalizedSegmentation","segmentation","normalizedPoints","convertAnnotation","convertedAnnotation","importDataset","commit","dispatch","urls","importParams","dataConnect","imageURLs","filter","startsWith","size","numImages","alert","imageNameURLMap","reduce","acc","img","annotationJSON","allLabelObjects","groupJSON","flat","labelsToAdd","Set","addLabel","label_names","dataset_id","getLabelList","resp","dbTask","imagesIDMap","images","anno","image_id","values","imageWithAnnotations","file_name","data","task","updatedTask","updateDockerTaskStatus","docker_task_id","status","console","root","addDockerTask","dataset_name","project_id","docker_id","total","annotation_set_id","s3_path","importer_source","import_type","groups","create_image_groups","createGroupsParams","group_names","group_splits","createGroup","createGroupsForDataset","promises","max_concurrent_req","limit","numAnnotationFileParseFailed","imageUploadSuccessCount","imageRelativePath","relativePath","webkitRelativePath","imageInfo","thumbnail","log","uploadData","image_width","image_height","image_filepath","pathSplit","toCreateGroup","group","group_id","date_captured","Date","getTime","addUploadData","method","body","thumbnail_url","completeUpload","annotationImporters","darknet","modelpack","maivin","thumbnailSize","parseLabelsTxt","parseAnnotationFile","importer","createVideoThumbnail","videoDimensions","videoPath","URL","createObjectURL","video","document","createElement","onloadeddata","canvas","ctx","getContext","maxWidth","maxHeight","aspectRatio","drawImage","pause","toBlob","autoplay","muted","src","readUserComment","json_raw","json_str","substring","trim","userComment","getExifData","imageData","exifResult","options","exifData","latitude","longitude","DateTimeOriginal","getMediaInfo","mediaInfo","getSize","readChunk","chunkSize","offset","Uint8Array","readAsArrayBuffer","mediaInfoResult","analyzeData","actions","parseImage","imageArrayBuffer","Image","naturalWidth","naturalHeight","exif","parseVideo","videoMeta","controls","videoArrayBuffer","onloadedmetadata","this","videoWidth","videoHeight","generalTrack","media","track","Blob","import","annotationFileTypes","importFileGroups","labelsFromFile","presignedUrl","basename","fileGroup","imageFile","videoFile","annotationFile","fromEntries","entries","updateDataset","importFileGroup","annotationMeta","annotationImporter","image_source","user_comment","importWithDocker","taskID","importByType","coco","namespaced","importAnnotationsDarknet","files","numAnnotations","img_name","now","uploadAnnotations","vuexLocal","storage","sessionStorage","modules","appVersion","state","version","isSaas","allowDebug","frontendVersion","mutations","setVersion","payload","setIsSaas","setFrontendVersion","setAllowDebug","user","tokenRefreshTask","permissions","userList","setUser","userPayload","setToken","tokenPayload","store","logout","clearInterval","removeToken","setTokenRefreshTask","tokenRefreshTimerPayload","setPermissions","setUserList","autoRefreshToken","context","parsedToken","tokenExpireInSeconds","tokenRefreshTimer","enterpriseServerUrl","refreshToken","username","newToken","refreshUserList","organization_id","getUserListByOrganization","projects","projectList","currentProject","setCurrentProject","setProjectList","resetState","statistics","datasetID","set","labelLocation","labelVisualizer","setDatasetID","setAnnotationSet","setLabelLocation","setLabelVisualizer","reviews","usersFilter","setUsersFilter","datasets","currentDataset","datasetList","annotationSetColorMap","annotationsTabState","labelColorMap","uploadFolderTasks","confMatrixTargetSet","setCurrentDataset","setAnnotationsTabState","clearDatasetsState","setAnnotationSetColorMap","setLabelColorMap","setDatasetList","setConfMatrixTargetSet","setDataset","assign","dataset","setDatasetAnnotationSets","sets","setDatasetLabels","updateCurrentDataset","updateCurrentDatasetAction","tasks","uploadTasks","importTasks","exportTasks","resetAllTasks","interval","converterTasks","addNewUploadTask","isLocal","setInterval","resumeUploadTask","addExistingUploadTask","removeUploadTask","updateUploadTask","clearUploadTaskInterval","addImportTask","removeImportTask","clearImportTaskInterval","updateImportTaskStatus","date","progress","addExportTask","removeExportTask","clearExportTaskInterval","updateExportTaskStatus","resetUploadTasks","resetImportTasks","resetExportTasks","resetConverterTasks","addSnapshotUploadTask","removeSnapshotUploadTask","updateSnapshotUploadTaskStatus","getUploadTaskDockerInterval","getDockerTaskById","getImportTaskDockerInterval","res","message","count","getExportTaskDockerInterval","annotationTool","samEnabled","toggleSAMEnabled","isEnabled","notifications","hasNotifications","updateNotifications","strict","debugMode","theme","trainerServerUrl","datastoreServerUrl","enterpriseServerHost","samServerUrl","setDebugMode","mode","setTrainerServerUrl","setDatastoreServerUrl","setEnterpriseServerHost","host","setEnterpriseServerUrl","setSAMServerUrl","setTheme","app","querySelector","className","classList","add","documentElement","plugins","plugin","ref","currentTab","navigateToAccount","iconName","navigateToEditUser","role","fill","iconColor","title","mirrored","href","iconFile","props","default","Boolean","computed","__exports__","gotoHome","auzone_logo","placement","appendToBody","menu","closeMenu","$router","path","isSuper","isAdmin","openPricingModal","active","debugModeActive","logOut","userInfo","trigger","config","menuPopperConfig","virtualReferenceElement","ignoreClickOutside","$attrs","handlePopperOpened","handlePopperClosed","isActive","internalIsOpen","background","disabled","teleportEl","to","close","isOpen","on","element","handler","addEventListener","attachEvent","components","OnClickOutside","referenceElement","transition","delayOnMouseOver","delayOnMouseOut","Array","show","teleport","HTMLElement","emits","hidden","triggerEl","popperEl","popperJS","watch","setupEvents","open","beforeUnmount","destroyPopper","mounted","methods","setupTriggerEvents","getElementById","$el","nextElementSibling","doShow","togglePopper","onMouseOver","onMouseOut","setupPopperEvents","$refs","_timer","$nextTick","$emit","contains","update","destroy","handleDocumentClick","overflowPadding","Popper","text","flip","detectOverflowModifier","enabled","phase","requiresIfExists","overflow","detectOverflow","styles","popper","elements","offsetWidth","right","left","detectHeightOverflowModifier","offsetHeight","bottom","top","modifiers","padding","uid","checked","handleSwitchToggle","fontSize","colspan","textColor","contactSales","costPackage","freePackage","basicPackage","proPackage","businessPackage","span","roundToTwoDecimals","sliderValue","placeholder","updateInput","seats","step","mlops","displayWithComma","displayTotal","displayPlan","handleSliderInput","localValue","resizeObserver","newVal","refresh","beforeMount","removeEventListener","thumbHalfWidth","minValue","maxValue","totalInputWidth","singleSlider","clientWidth","SingleSliderWithTwoColors","dsConn","sliderInput","$store","totalMonthlyCostBasic","getCreditCost","totalMonthlyCostPro","totalMonthlyCostBusiness","basic","package_cost_dollar","pro","business","deep","created","getFreeCostPackage","getBasicCostPackage","getProCostPackage","getBusinessCostPackage","inputs","querySelectorAll","onkeydown","keyCode","blur","getCostPackageByName","package_name","log10","floor","div","Intl","NumberFormat","itemName","pkg","credit_range","total_dollar_used","localTotal","range","Infinity","zIndex","tabindex","mousedown","mouseup","handleEscapeKey","fullScreen","pop","isPopping","icon","closeModal","btnStyles","handleButtonClick","currIcon","SVGIcon","modelValue","iconActive","showHover","showActive","allowClick","hoverStyle","immediate","val","IconButton","isPluginModal","closeWithEscapeKey","persistent","setup","modal","activate","activateFocusTrap","deactivate","deactivateFocusTrap","useFocusTrap","allowOutsideClick","localShow","mousedownOnBackdrop","shouldShow","isShown","focus","showModal","srcElement","isDescendantOfModal","startPopAnimation","Modal","PriceTable","pricingModal","imageUrl","sizeStyle","BaseSwitch","BaseMenu","BaseMenuButton","PricingModal","UserIcon","darkModeActive","themeStoreState","debugModeStoreState","page","openFeedbackModal","clearData","required","subject","rows","cols","success","send","feedbackModal","sendFeedback","issue_type","response","FeedbackModal","Project","Dataset","Trainer","Validator","Automation","Tasks","Servers","Snapshots","RecycleBin","goto","route","notificationCounter","notif","refreshTrigger","shouldRefresh","getNotifications","listWarnings","ModuleMenu","UserMenu","HelpMenu","WarningMenu","headerTitle","show_menu","isDebugMode","items","crumbs","item","siblings","idx","breadCrumb","navigate","toggleShow","pathArray","$route","shift","breadcrumbs","breadcrumbArray","matched","children","some","Header","BreadcrumbNavigation","from","fullPath","query","editUser","totalDollars","toLocaleString","userLocale","minimumFractionDigits","maximumFractionDigits","numProject","showDetailedDatasets","numActiveDataset","numParkedDataset","numDeletedDataset","numDataset","showDetailedImages","numActiveImages","numParkedImages","numDeletedImages","parseDuration","trainingTime","autoAnnotationsTime","aigtTime","snapshotRestoreTime","snapshotCreationTime","validationTime","months","month","selectMonth","years","year","selectYear","retrieveMonthlyBill","headers","mainTableRows","groupBy","density","abs","totalCreditUsage","toggleGroup","isGroupOpen","variant","getCreditForKey","selectTimeZone","for","header","border","$toast","useToast","InlineLoader","dollars","hasDetailedDatasets","hasDetailedImages","numTasks","refreshTimeOut","sortable","align","order","orgId","numImagesRecord","numParkedImagesRecord","numAnnotationsRecord","bulkRecord","trainingTimeRecord","validationTimeRecord","autoAnnRecord","usersRecord","serviceRecord","aigtRecord","snapshotRestoreRecord","snapshotCreationRecord","timeZone","DateTimeFormat","resolvedOptions","currentDateDollarCost","doneSummaryFetch","doneDetailsFetch","navigator","language","organization","instances","doneFetch","parseLocaleNumber","currentYear","getFullYear","startingYear","totalAnnotationCredit","totalImageCredit","totalParkedImageCredit","totalAutoAnnCredit","totalTrainingCredit","totalUsersCredit","totalValidationCredit","totalBulkCredit","totalServiceCharge","totalAIGTCredit","record","totalSnapshotRestoreCredit","totalSnapshotCreationCredit","v","getDetailedDatasets","getDetailedImages","org","getMonth","getAllInstances","getOrganization","getCostPackage","getUsagePercentage","hrs","msDiff","minutes","hours","days","stringNumber","locale","formatter","parts","formatToParts","groupSeparator","part","decimalSeparator","normalizedNumber","RegExp","getOrg","queue","duration","position","parseReport","getUsageSummaryForOrganization","project","train_time","autoanns","aigt_time","snapshot_restore","snapshot_creation","validation_time","credits","parked_dataset","deleted_dataset","parked_images","deleted_images","num_images_array","reduced_num_images_array","curr","description","comments","day","hour","minute","second","hour12","rate","amount","getDollarCost","appendCurrentDateRecord","num_parked_images_array","reduced_num_parked_images_array","num_annotations_array","reduced_num_annotations_array","seat_array","reduced_seat_array","bulk_array","reduced_bulk_array","service_array","reduced_service_array","credit_change","training_array","reduced_training_array","cost","getDollarCostForCloudInstances","instance_type","toFixed","aigt_array","reduced_aigt_array","autoann_array","reduced_autoann_array","validation_array","reduced_validation_array","snapshot_restore_array_array","reduced_snapshot_restore_array","snapshot_creation_array","reduced_snapshot_creation_array","array","latest","first","latestDate","firstDate","getUTCFullYear","getUTCMonth","diff","getDateDifferenceInDays","parsedEndDate","parseToYYYMMDD","costPkgKey","modifier","unit","newRecord","unshift","dateString","getUTCDate","formattedDate","date1","date2","startDate","endDate","startTime","endTime","differenceInMilliseconds","differenceInDays","timeOut","prorated","pkgName","instance","inst","package","transactions","totalAmount","getTransactions","retrieveAnnualBill","arr","datum","change","date_generated","switchTime","navigateToOrganization","navigateToEditOrganization","navigateToOrganizationSecurity","navigateToUserManager","navigateToCreatingUser","navigateToUserUsageLogs","navigateToTransactions","navigateToOrganizationList","navigateToCreateOrganization","hasOrg","navigateToAddCredits","navigateToUserEmulation","send2FA","first_name","last_name","email","orgName","bucket","allRoles","getAllRoles","getUserBucket","errorUsername","errorFirstname","firstname","errorLastname","lastname","errorEmail","presetRole","project_read","project_write","dataset_read","dataset_write","trainer_read","trainer_write","annotator_read","annotator_write","isError","applyChanges","go","errorPassword","password","errorConfirmPassword","confirmPassword","passwordError","passwordMessage","changePassword","errorRole","backendError","canWrite","getExistingUser","getUserPermissions","u","checkForUser","resetErrors","tempMessage","updateUserPasswordAuth","params","updateUser","newUserObj","errorName","errorStreet","street","errorCity","city","errorCountry","country","errorContactName","contactName","errorContactEmail","contactEmail","errorContactPhone","contactPhone","editOrg","packages","pack","paidPackage","getAllPackages","getPackageList","contact_name","contact_email","contact_phone","updateOrg","temp","editPaidOrg","imageLimit","hasError","hasChanges","apply","originalImageLimit","getOrgDataImageLimit","getOrgDataField","setOrgDataField","navigateToCreateUser","users","j","openConfirmDeleteUserModal","messageHeader","confirmMessageHeader","confirmMessage","buttonClass","buttonText","removeUser","handleKeyup","note","handleCancelClicked","handleMainButtonClicked","confirmModal","handleSubmit","stopPropagation","ConfirmModal","getUsers","toDelete","reverse","deleteUser","navigateToEditOrg","errorFirstName","errorLastName","createUser","allOrgs","navigateToOrgDetails","openedDropdowns","dollarCreditRatio","getAllOrgs","getOrgList","createOrg","parent_username","errorAmount","openConfirmModal","orgList","purchaseCredits","errorCode","authCode","sendCode","emulate_user","signIn","performUserCheckAndLogin","userResp","userObj","showDetailedOrg","useSummary","generateMonthlyBill","navigateToBilling","autosegs","getDollarCreditRatio","getCreditCostForCount","displayTag","$event","focused","showMenu","legendText","option","handleMenuButtonClick","handleResize","select","handleInput","BaseSelect","showTasksModal","popperConfig","inProgress","numLocalTasks","numInProgressTasks","localTasks","t","getStatusComponent","handleCancelDockerTask","inProgressTasks","completeTasks","subtitle","localTitle","internalTask","dateParser","countValue","countUnit","totalValue","totalUnit","startedByUser","handleResumeUploading","showResumeUploadModal","sourceDir","parsingFiles","chooseSourceFolder","webkitdirectory","mozdirectory","msdirectory","odirectory","directory","sourceSelected","startingImport","handleStartImportScript","annotationSets","selectedAnnotationSet","files_parsed","taskData","datasetName","d","uploadImagesModal","directoryHandle","showDirectoryPicker","_preferPolyfill","tree","handleDirectory","dirhandle","subtree","handle","kind","newRelativePath","getFile","folder","s3MultipleImageUpload","fileList","maxFileSize","imgCount","imgTooLargeErrCount","imgSizeResp","getAccountingMaxImageSize","trimmedPath","checkImageUploadLimitResp","checkImageLimitForAccounting","image_count","presignedResponse","s3CreatePresignedUrl","newFileList","importerSource","indexes","presignedUrls","tnPresignedUrls","processingFiles","importResponse","ResumeUploadImagesModal","structuredClone","formatBytes","cancel","bytes","units","BaseCard","UploadStatusBar","numUploadTasks","inProgressUploadTasks","completeUploadTasks","numRunningTasks","hasTasks","oldVal","deleteDockerTask","BreadcrumbSelect","TasksModal","redirect","get","list","loadingFinished","openCreateModal","notEmpty","p","selected","projectID","refreshCardID","openUpdateProjectModal","openConfirmDeleteProjectModal","handleSelectNewProject","handleOpenProjectAccessManagement","createProject","handleDeleteProject","modalProject","updateProject","getProjectList","editTitle","handleApplyEdit","handleClickEvent","handleManageAccess","deleteProject","barstyle","tooltip","no_of_datasets","total_datasets","moveToHandlerPage","no_of_trainers","total_trainers","no_of_automations","total_automations","no_of_label_tasks","total_label_tasks","no_of_validations","total_validations","handleClickOutside","expand_text","ellipsisActive","isEllipsisActive","handleTextClick","checkIsEllipsisActive","textEl","container","el","scrollHeight","BaseTextExpander","ProjectRow","aa","stringToColour","GetPermissionsForCurrentUser","getProjectAccessForSingleUser","str","hash","char","colour","toLowerCase","createNewName","createNewDescription","getUsersListByOrganization","createProjectModal","project_name","updateProjectModal","resetData","shareMode","accessListByType","sort","sortByName","remove","currentUser","selectAccess","toggleRemoveAccess","project_writed","userInputValue","chips","clearable","formatOrgUserListObject","role_viewer","role_writer","hasRemoved","hasAccessModeChange","confirmChanges","addAccess","organizationDefaultAccessList","originalProjectAccessList","projectAccessList","orgUserList","originalShareMode","tempChange","project_access","r","permission_type","getOrganizationDefaultPermissions","b","splice","projectAccessModal","getProjectAccessList","deleted_ids","updated_project_access","revertProjectAccessToDefault","setProjectAccessToPrivate","deleteProjectAccess","updateProjectAccess","project_access_list","project_access_usernames","orginalNameMap","overlap","addProjectAccess","usernames","ProjectCard","ProjectCreate","PageLoader","ProjectUpdateModal","ProjectAccessModal","mergeSource","get_num_datasets","noLT","noDS","noTR","noVA","noAU","proj","addProject","refreshDatasetList","getDatasets","getDatasetDetails","get_labels","get_annotation_sets","get_groups","get_parked","getDatasetList","shallowDatasets","annotation_sets","num_images","num_annotations","numLabels","trainers","trainer","openTrainerStartModal","handleSessionInfoClick","handleSessionAnalyticsClick","openConfirmDeleteSessionModal","openConfirmStopTrainingSessionModal","openConfirmDeleteTrainerModal","openEditModal","handleShowChartsClick","session","handleRefreshSession","handleTrainerCreated","modalTrainer","handleUpdateTrainer","trainerToCreateSession","handleTrainingSessionCreated","selectedTrainingSession","trainerSession","trainerToShowAnalytics","trainerExperiment","selectedTrainingExperiment","launchTrainedModelCompare","confirmFunction","training_sessions","handleShowAllChartsClick","handleTrainerStart","handleDeleteTrainer","docker_task","toggleHideProgress","hiddenProgress","hasMetrics","hasResults","handleRefresh","terminateTask","deleteTask","hideLabel","sessionStatusList","trainer_params","formatTime","getEndTime","metrics","metricVal","metric","results","series","chartZoomHandler","chartOptions","ApexCharts","isFullScreen","isZoomed","chart","zoom","animations","stroke","xaxis","tickAmount","yaxis","decimalsInFloat","Event","clicked","tooltipPopperConfig","capitalizeWords","parseId","prefix","copyToClipboard","clipboard","writeText","stages","hideBars","emit","getProgress","percentage","parseData","dataJson","timer","timeDiff","stages_json","stage_definitions","stage_definitions_keys","cloud_instance_id","stage","def","newObj","removeIndex","findIndex","EncodedIdField","TaskStatusBars","TrainingChartSingle","getStatus","handleOpenInFull","getMessage","getCount","getTotal","end_date","toLocaleTimeString","parseMPKShape","shape","highlightedCode","highlighter","highlightCode","themes","langs","lang","codeToHtml","getHighlighter","trainingSessionDetailsModal","tab","logs","artifacts","logLines","model_parameters","model_params","indent","pauseGetLogs","resumeGetLogs","listTrainingSessionArtifacts","handleModalClosed","getLogs","getTrainingSessionLogs","session_id","isGetLogsActive","resume","handleDownloadModel","model","setAttribute","appendChild","click","removeChild","getTrainingSessionArtifacts","training_session_id","tensorboardURL","scrolling","frameborder","trainerParam","tensorboardReady","tensorboardPort","dockerTask","preventDefault","closeAnalytics","returnValue","unmounted","launchAnalytics","port","retryFetch","trainingSessionAnalyticsModal","trainer_id","trainer_ids","getCharts","maxRetries","retries","ok","warn","selectedTrainers","launchGraph","trainerCompareTrainedModelsModal","updateTrainerModal","createTrainer","createTrainerModal","initializeModal","addTrainer","schemaList","schema","schemaType","is_local","groupSplit","annset","trainGroup","valGroup","componentKey","configGroupValues","fields","startingTrainer","startSessionV2","valueLower","lowerValue","valueUpper","upperValue","showMiddle","handleSliderLowerInput","localValueLower","handleSliderUpperInput","localValueUpper","localValueMiddle","handleRangeSliderMiddleDiv","handleRangeSliderRightDiv","ResizeObserver","onResize","observe","sliderContainer","unobserve","disconnect","newValueLower","newValueUpper","value1","minValue1","sliderLower","maxValue1","value2","minValue2","sliderUpper","maxValue2","left1","left2","middleWidth","middleDiv","rightDiv","TriRangeSlider","tagValue","debouncedUpdateFilters","updateFilters","parent","parameters","getSelectChildren","field","getSpecificValue","getChildren","getBooleanValue","isChecked","getSelectValue","optionName","notSelectedOptions","isArray","stringArray","arrIndex","multi_select","TrainValTestSplitSlider","ConfigureFieldsGroup","trainerSessionList","version_params","custom_split_slider_values","custom_split_train_input","custom_split_val_input","dataset_split_params","train","test","default_split_params","modelList","selectedModel","advancedSettings","upsample","custom_split_params","percent","getTrainerSchema","getAllTrainerSchema","getTrainerParametersSchema","schema_list","trainMode","device","split_mode","session_name","session_description","trainer_type","startCloudInstance","docker_data","getSessionName","chartModalClosed","chartsReady","chartsData","GetChartsData","trainingChartsModal","fetchCharts","localChartsData","chartName","charts","chart_data","lines","xv","yv","TrainerCard","CreateTrainerModal","CreateTrainerSessionModal","TrainingSessionDetailsModal","TrainingSessionAnalyticsModal","TrainerCompareTrainedModelsModal","TrainingChartsModal","TrainerUpdateModal","trainingSessionList","selectedTrainerDetails","trainerIds","getTrainingSessionList","getTrainerList","openedTrainer","stopInterval","startInterval","handleTrainerDelete","handleStopTrainingSessions","handleDeleteSession","handlePauseClicked","trainerIndex","getSession","updateEC2InstanceStatus","updateEC2Status","getTrainerList2","getTrainingSession","trainer_session_id","createEditTrainerModal","trainerUpdateModal","startTrainerSessionModal","handleProjectAnalyticsClick","handleCompareTrainedModelsOpen","deleteTrainer","ids","terminateTrainingSessions","session_ids","deleteTrainingSession","updateTrainer","imageName","useViewerVisualizationsStore","mouse","samples","animationImageCache","currentAnimationSample","frame","playing","topics","fps","isInitializingAnimation","abortControllerForCaching","limitAnnotationsToSet","frameCount","buffered","bufferedIndex","lastFrame","loaded","addNewSampleToCache","imageObj","clearSample","updateSample","throttledUpdateSample","pauseAnimation","getAnimationDelay","$reset","keyframes","resetForNewSequence","removeKeyframe","selectedKeyframeObject","keyframeObject","doKeyframesExist","setKeyframeNew","existingAnnotationKeyframes","end","tracking_id","keyframeAnnotations","keyframeBelow","keyframeBelowVal","keyframeAbove","aboveKeyframes","keyframe","keyframeAboveVal","keyframeAnnotationsArr","annotationBelow","annotationAbove","interpolatedAnnotation","data_json","z","dx","dy","dz","removeAnnotationsFromCache","excludeIds","imageCache","excluded","excludedAnno","addNewAnnotationsArrayToCache","newAnnotations","groupedNewAnnotations","cacheFrame","reviewStatus","combined","get_num_images","get_num_labels","get_docker_tasks","selectedAnnotationsToEdit","handleEscape","collapsible","displayLabelTags","displayProjection","selectedAnnotationSets","annotationDisplaySettings","displayAnnotationSets","selectedLabels","displayLabels","colorAnnotationsBy","displayImageObj","groupedAnnotations","hideAddTopics","isEditing","handleEditAnnotations","updateLabelColor","internalImageObj","layout","handleAddVisualization","toggleVisibility","handleLayoutSelected","showEditorModal","loading","isLoadingSample","failed","isLoadingSampleFailed","handleVisualizationContainerDrop","handleVisualizationSelected","imagesParams","currentImage","isTask","visualizationLocations","paneType","getLocationId","hasImage","hasSelection","selectedAnnotationIdentifiers","handleZoomToFit","handleZoomToSelection","downloadImage","scale","annotationToolScale","displayAnnotations","colorBy","showAnnotations","editingEnabled","useImageCacheOnly","imageCacheElem","showTypes","jsonViewerShowTypes","showPointerAxes","enableDepthMap","lidarProjections","pcdProjections","pcd","lidar","showDepthMap","initialLabels","reviewSettings","initialAuditorType","editAsSequence","showSequences","handleExitEditor","reviewTask","_hide","closeSidebar","closeable","handleCanvasMouseout","configKonva","handleCanvasZoomScroll","handleStageClick","debounceHandleMouseover","handleDragStart","handleDragEnd","imageComponent","imagePath","imageId","handleMouseCoordinates","handleImageLoaded","isSAMToolSelected","samActive","samMaskImg","debouncedHandleSAMMousemove","stageNode","stageReady","samBoxActive","stageScale","imageNode","handleSAMBoxDimensionChanged","isSAM2ToolSelected","isSAM2BoxMode","isBoxAnnotating","selectedLabel","imageDimensions","handleAnnotationBoxCreated","selectedObjects","sam2Options","samOptions","clicks","samClicks","imageIdDisplayed","mask","maskAnnotations","canvasObjects","seg","segmentationPolygonAnnotations","identifier","isSelected","isAnnotating","pointerCoordinates","imagePointerCoordinates","getAnnotationColor","pending","handleShapeSelected","pendingAnnotations","pendingSelected","sam2SelectedObject","object_reference","boxAnnotations","displayLabelTag","getAnnotationName","fillColor","isHighlighting","highlightedAnnotationIdentifier","dashEnabled","isAuditMode","handleAnnotationTransformed","handleBoxClickWhileAnnotating","handleBoxMouseoverWhileAnnotating","handleBoxMouseoutWhileAnnotating","boxes3D","box3DAnnotations","pending3dBoxes","lidarProjection","pcdProjection","drawMode","configSAMMaskImg","handleSAMMouseout","handleSAMMaskClick","handleSAM2ImageClick","drawCursorSize","drawToolColor","editingSegmentationPolygonAnnotation","enableBrush","doneVertexDraw","handleBrushEditPolygon","handleNewBrushPolygon","useZoom","konvaContainer","calculateZoomToFitScale","konvaContainerRect","stageAspectRatio","imageAspectRatio","getAspectRatios","zoomToFitImage","getBoundingClientRect","scaleX","scaleY","evt","scaleBy","currentTarget","oldScale","pointer","getPointerPosition","mousePointTo","direction","deltaY","ctrlKey","newScale","newPos","zoomToSelection","selectedNodes","minX","maxX","minY","maxY","node","nodeMinX","getAttrs","nodeMaxX","nodeMinY","nodeMaxY","xPos","xOffset","yPos","yOffset","zoomToBox","x1","x2","y1","y2","zoomToFitScale","modelData","tensor","modelScale","imageEmbedding","pointCoords","pointLabels","pointCoordsTensor","pointLabelsTensor","clickType","Float32Array","samScale","Tensor","imageSizeTensor","maskInput","hasMaskInput","image_embeddings","point_coords","point_labels","orig_im_size","mask_input","has_mask_input","handleImageScale","imageNaturalWidth","imageNaturalHeight","LONG_SIDE_LENGTH","arrayToImageData","g","Uint8ClampedArray","ImageData","imageDataToImage","imageDataToCanvas","toDataURL","putImageData","clearMask","onnxMaskToImage","SAMEventBus","SAMModelURL","SAMImageEmbedding","samMaskValue","SAMSession","isCreatingPolygon","useSAMCanvas","newSAMOptions","controller","AbortController","samIp","ip","samBox","pointType","samClickActive","draggable","opacity","startSAMCanvas","getNewSAMImageEmbedding","getSAMSession","handleSAMClicks","abortSAMFetching","SAMEventListener","abort","reset","imageID","signal","buf","arrayBuffer","data32","InferenceSession","create","isPreview","output","calculateSAMMask","dims","feeds","run","outputNames","getRelativePointerPosition","button","handleSAMMousemove","previewClickType","previewClick","debouncedHandleSAMMouseout","dimensions","handleCreateSAMPolygon","processImage","newAnnotationPolygon","label_id","mat","mat8U","convertTo","thresh","contours","hierarchy","simplifiedPolygon","currentPolygon","ctr","epsilon","approx","intPtr","delete","useAnnotationColorMap","colorMap","useColorParser","parseColor","isInteger","hexString","match","hueToRgb","q","toHex","hex","useSAM2Store","sam2Server","isSam2ServerFound","sam2Annotations","sam2LastPropagatedAnnotations","aigt3dAnnotations","aigt3dLastPropagatedAnnotations","aigt2dAnnotations","aigt2dLastPropagatedAnnotations","sam2Active","isSAM2ClickMode","isInitializingState","hasInitState","initStatus","initDetail","initProgress","initTotal","initError","initStartFrame","initEndFrame","isPropagating","propagateStatus","propagateDetail","propagateProgress","propagateTotal","shouldClearNextPoints","isCreatingAnnotations","propagateLastAnnotationIndex","reversePropagateEnabled","objectsLabelMap","selectedObject","isAddingNewPointsOrBox","isCancellingPropagation","frame_idx","obj_id","getFrameSAM2Annotations","frame_image_id","getFrameAndObjectSAM2LastPropagatedAnnotations","getFrameAndObjectAigt3dLastPropagatedAnnotations","getFrameAndObjectAigt2dLastPropagatedAnnotations","configImg","updateImagePointerLeave","nodes","rotateEnabled","configAxisX","configAxisY","resizeEnabled","anchorDragBoundFunc","oldAbsPos","newAbsPos","imagePos","absolutePosition","imageAttr","KonvaTransformer","strokeWidth","loadImage","offsetX","offsetY","getNode","blob","revokeObjectURL","handleImagePointerMove","pointerPos","ptrX","ptrY","calcX","calcY","getImageNode","handlePointerClick","useVideoPlayerStore","videoElement","volume","currentTime","togglePictureInPicture","loadVideo","newSrc","isFullscreen","enter","exit","toggle","toggleFullScreen","videoPlayerStore","animation","preview","videoReady","played","stageAndVideoReady","Animation","getLayer","start","stop","oncanplay","play","rectConfig","listening","freeDrawLineConfig","freeDrawLinePoints","polygonClipping","useBrushToPolygon","rectX","rectY","willReadFrequently","imgData","getImageData","gray","binary","maxLen","contour","largestContour","tempPolygon","originalPoly","mergePolygons","polygons","targetPolygon","formatted","poly4D","union","poly","difference","combineResult","lineObjects","brushCanvas","brushCursor","isDrawing","cursorConfig","radius","toolColor","fillEnabled","closed","freeDrawCircleCoordinates","newArr","points1D","cursor","clearBrushCanvas","setUpBrushEvents","setUpVertexDrawEvents","processPolygon","clearAllLines","clearPreviousLine","off","browserZoom","devicePixelRatio","getCanvas","clientRect","getClientRect","originalPolygon","processed","attrs","cancelBubble","hide","lastLine","globalCompositeOperation","lineCap","lineJoin","newPoints","concat","maskCtx","mouseOver","imageEl","displayOpacity","fetchMask","getAnnotationFile","decodedImage","renderedBlob","convertBlobToRGBImageWorkerFn","convertBlobToRGBImage","uint8Array","OffscreenCanvas","createImageData","targetLabel","lbl","hexColor","convertToBlob","handleObjectClick","pos","coords","workerFn","workerStatus","workerTerminate","timeout","localDependencies","multiPolygonPoints","pts","nodeRadius","nodeFill","nodeStroke","nodeStrokeWidth","dashSize","isFocused","updatePointsV2","handleShapeClick","handleMouseover","handleMouseout","handleNodeMouseover","handleNodeMouseout","isDragging","getPolygonCoordinates","localPoints","handleVertexDragmove","nodeDragBoundFunc","Function","polygonDragBoundFunc","debounceUpdatePoints","updatePoints","xyArray","point","cID","handlePolygonDragmove","handlePolygonDragend","transform","getTransform","transformedPoints","Polygon","isMouseOver","internalPolygon","convertRatioArrayToPixelArrayV2","xPoints","yPoints","minXPoint","maxXPoint","minYPoint","maxYPoint","dashBaseSize","getNodeDragBoundFunc","dragBoundFunc","getPolygonDragBoundFunc","newFunc","convertPixelArrayToRatioArray","parsedInteralPolygon","convertPixelArrayToRatioArrayV2","pixelArray","ratioArray","convertRatioArrayToPixelArray","ratioArray2D","pixelArray2D","flatten","handleZoneTransformEnd","isBusy","handleBoxClick","handleMousedown","handleMouseup","keepRatio","borderStrokeWidth","borderStroke","borderDash","transformerDashSize","convertedBox","convertNormalilzedToPixels","borderWidth","boxAttr","dashMaxSize","minDimension","annotationBox","decompose","normalizedDimensions","convertPixelsToNormalized","newX","newY","newWidth","newHeight","getNodeFill","samSelectBoxNode","boxDimensions","visible","debounceHandleBoxDimensionsChanged","handleBoxDimensionsChanged","samSelectBox","setUpStageMouseEvents","selectionRectangle","setAttr","setAttrs","sam2Store","allClicks","filteredClicks","visualizationStore","boxObjDimensions","allBoxes","filteredBoxes","canvasSelectBoxNode","canvasSelectBox","getClassName","shapes","Util","haveIntersection","getParent","isSelectionDragging","annotationBoxRectNode","annotationBoxRect","annotationBoxRectangle","annotating","annotationBoxRectangleDimensions","newAnnotationBox","projectedBoxes2D","transformedBoxes3D","projectedBoxes","projectBoxes","inp","sizes","project_boxes","transpose","matrix","row","multRow","m","nc","normalizeByLastRow","nr","maximum","minimum","subtract","dropLastRow","multiply","aNumRows","aNumCols","bNumCols","getCol","column","bb3d","cameraMatrix","zxydwh2xyzmin","zxydwh2xyzmax","coordinateTransform","xyzmin","bbmin","xyzmax","bbmax","bbmax_","b2","dragButtons","KonvaImage","KonvaVideo","KonvaSegmentationMask","KonvaSegmentationPolygon","CanvasSelectBox","AnnotationBoxTool","AnnotationBox","SAMClickPoint","SAMSelectBox","SAM2ClickPoint","SAM2SelectBox","SAM2Boxes","Project3Dto2D","ProjectLidarTo2D","ProjectPCDTo2D","KonvaBrush","updatedAnnotations","enableSAM","hasSAMImageEmbedding","hasSAMImageEmbeddingError","shouldZoomToFit","expose","getStage","baseZoomToSelection","baseZoomToBox","handleCanvasResize","clientHeight","SAM","useSAM","isSAMAnnotating","isSelectionMousedown","isStageDragging","isAnnotationBoxMousedown","isAnnotationBoxDragging","internalAnnotations","mouseoverObjectWhileAnnotating","isBox","isColoring","annotationIdentifierMap","isLabelSelected","isAnnotationSetSelected","editingBoxAnnotation","labelIndexMap","ann","konvaImage","startPointDrawing","handleShowImageInfo","handleShowAnnotationInfo","handleShowImageMetadata","isReviewMode","canUndo","handleUndo","handleRevertChanges","handleDeleteAnnotationsBulk","handleSkipImage","handleDeleteImageFromDataset","submitType","submitTypes","handleReviewSubmit","location","activator","handleMainClick","selectedOption","handleListItemClick","prepend","useAnnotationDatabase","datastore","createNewAnnotation","annoObj","dest_annotation_set_id","data_url","createExistingAnnotation","createNewAnnotationInDatabase","newAnnotation","addAnnotations","updateExistingAnnotationInDatabase","updatedAnnotation","updateAnnotations","deleteAnnotationInDatabase","annotation_id","deletedAnnotation","deleteAnnotations","getAnnotationsForDatabase","_initialAnnotations","_newAnnotations","source_annotation_set_id","_doneImageOpen","hasSourceAnnotationSet","isAudit","initialAnnotations","doneImageOpen","annotationsToSubmit","create_annotations","update_annotations","delete_annotations","newAnno","updatedAnno","annotationsToDelete","existingAnno","doneImages","useTasksHistory","currentTaskImage","activeImageIndex","startTaskHistory","getTaskDoneImagesByUser","review_task_id","total_count","switchToTaskImage","imageIndex","switchToNextTaskImage","switchToPreviousTaskImage","useEditorStore","sequences","sequenceId","sequence_id","usePCDStore","pointArray","pcdAnnotations","enablePCD","usePCD","SPHERE_TEXTURE","createSphereTexture","tempcanvas","clearRect","fillStyle","beginPath","arc","PI","CanvasTexture","setPointsMaterial","pointsMaterial","transparent","sizeAttenuation","alphaTest","needsUpdate","parseFields","lineSplit","parsePoints","labelIndex","px","py","pz","raw","jetColormap","Color","setRGB","parsePCDFileAsPointsBuffer","loader","PCDLoader","material","colorPointsByXValue","geometry","positionAttribute","attributes","numPoints","xValues","getX","lowerPercentile","upperPercentile","rangeX","colors","normalizedX","BufferAttribute","vertexColors","getPointsColorByXValue","parsePCDFile","pcdFile","cloneLidarPointsBuffer","positions","computeBoundingSphere","computeBoundingBox","clonePcdPointsBuffer","imageFilters","pendingTaskImages","isTaskComplete","remainingImagesCount","totalImagesCount","auditorType","isFetchingNewImage","useTasks","newReviewSettings","editorStore","startTask","isComplete","hasReviewTask","getRemainingCount","total_images","remaining_images","newImage","getImageForTask","sourceDataset","sourceAnnotationSet","as","destinationAnnotationSet","imageResult","images_filter","annotations_filter","aggregate_annotations_filter","image_files_filter","aggregate_annotation_set_ids","images_with_annotation_set_ids","current_image_id","getLabellingImages","getImage","getReviewTaskRemainingCount","setImageReviewStatusDone","setupTaskImages","skipTaskImage","newDoneImages","deleteImageReviewStatus","skipTaskSequence","completeTaskSequence","updateTaskImages","switchToImageID","switchToDoneImage","reviewedAnnotations","updateTaskImageFilters","newFilters","handleImageGroupChanged","deleteTaskImageFromDataset","param","image_ids","deletedResponse","deleteImageFromDataset","handleAuditSubmitAllAnnotations","submitAuditManualAnnotationTask","review_session_id","reviewSession","handleAuditSubmitAcceptedAnnotations","verifiedAnnotations","handleFrameAuditSubmitAllAnnotations","handleFrameAuditSubmitAcceptedAnnotations","handleLabellingSubmitAnnotations","handleFrameLabellingSubmitAnnotations","acceptAllAnnotations","getTaskSequences","getFilteredImages","combine_sequence_frames","sort_by","only_sequences","BasePersistentSplitButton","internalAnnotationDisplaySettings","SAMActive","handleEnter","useProjection","convert3d2d","intrinsic","fx","fy","drawPCDPoints","pcdPoints","camera_fx","camera_fy","getAttribute","filteredColors","getY","getZ","cameraIntrinsic","convertedPoints","centers_2d","center","loadedImg","WorkerPool","constructor","workerUrl","maxWorkers","workerQueue","activeWorkers","workerPool","listeners","Map","worker","Worker","onmessage","handleWorkerError","notifyListeners","assignTask","errorEvent","addTask","getAvailableWorker","postMessage","listener","callback","terminate","clearQueue","getQueue","restartWorkers","clear","useViewerVisualizations","cacheWorkerPool","bufferLength","backCache","cacheTypes","blobCacheTypes","arrayBufferCacheTypes","fpsSkipMap","skip","getAnnotationResponseDataType","cacheImages","lower","upper","fetchImageObjAndAnnotations","get_annotations","loadSample","localSignal","aborted","imageObjAndAnnotations","cacheEntry","loadAnnotationUrls","parseAnnotation","annotationCacheEntry","pointsBuffer","projectionImage","resultImage","convertBlobToGradientImage","depthmap","sampleIndex","annotationPromises","textEncoder","TextEncoder","encode","buffer","allSettled","allSuccess","every","loadSampleToCache","startAnimation","ms","nextFrame","uint16Array","depthData16Bit","minDepthValue","maxDepthValue","offscreenCanvas","depth16Bit","normalizedDepth","scaledDepth","red","blue","green","pixelIndex","newBlob","handleImageBlob","imgElement","handleCacheWorkerStarted","handleCacheWorkerResults","imageBlob","parsedAnnotations","pcdProjectionBlobs","lidarProjectionBlobs","depthmapBlobs","processSample","annotationSetId","indexToCache","abortCaching","recacheAndSetCurrentSample","currentFrame","annotatationSetId","frameImageObj","selectedAnnotations","copiedAnnotations","isSubmittingKeyframes","isKeyframeSelected","hasCopiedAnnotations","keyframeSelected","trackingIdSelected","handleLabellingSubmit","review_status","handleSetKeyframe","handleRemoveKeyframe","handleDeleteTrackingIdClicked","trackingId","handleDeleteTrackingId","removedAnnotations","deleteAnnotationsByTrackingId","handleSubmitKeyframes","submitKeyframes","handleCopyAnnotation","handlePasteAnnotation","annotationObj","toDateString","toTimeString","crop","imageCrop","cropPadding","annotationDisplayType","imageQuality","handleImageClicked","handleMouseEnter","handleMouseOut","handleLabelChanged","verified","verifiedIcon","handleVerifiedClicked","handleEditClicked","content","flagged","pendingFlagged","pendingVerified","segmentations","fetchPriority","useFetchImage","_data","execute","isFetching","canAbort","beforeFetch","Authorization","getThumbnail","showCanvas","zoomShift","imageRef","containerRef","imageSrc","croppedImageSrc","containerSize","renderedImageDimensions","cancelImgLoad","imageLoaded","getCroppedImage","fetchpriority","drawAnnotations","drawBox","drawSegmentation","totalCropWidth","totalCropHeight","boxLineWidth","lineWidth","strokeStyle","globalAlpha","rect","borderLineWidth","hexToRgba","addOpacityToHSL","vertex","lineTo","closePath","handleImageLoad","getRenderedImageDimensions","handleImageLoadError","naturalRatio","elementRatio","renderedWidth","renderedHeight","bigint","colorString","colorValues","saturation","lightness","hslaColor","handleCroppedImageLoadError","findMouseOverBox","mouseX","mouseY","hoveredBox","handleMouseMove","bounds","clientX","clientY","zoomShiftTransform","ImageCanvas","filterAnnotationsBySets","filterAnnotationsByLabelIndexes","filteredAnnotations","annotationsArray","convertAnnotationToCanvasBox","convertAnnotationToSegmentation","originX","originY","annoTask","origin_x","origin_y","Statuses","Verified","Flagged","Unreviewed","BaseGalleryGridItem","annotationSet","localReviewStatus","flagIcon","unreviewed","toPrecision","handleFlaggedClicked","handleKeydown","shiftKey","component","absolute","showGallery","attach","scrim","eager","handleGalleryImageClicked","galleryButtonText","numPages","handleLeftNavigation","imagesToShow","activeIndex","numImagesPerPage","imagesToShowUrls","handleRightNavigation","pendingImages","pendingImage","pendingImagesUrls","handleSelectedSequenceChanged","sequence","selectedSequence","datasetFilters","types","currentPage","totalPages","totalPagesCount","imageList","totalImageCount","imagesPerPage","showSplitAnnotationOption","shouldShowSplitAnnotationOption","sortBy","ascend","getDisplayAnnotationSet","imageReviewStatus","image_review_status","splitAnnotations","showSplitAnnotations","gridItemDisplayProp","imageClicked","collapse","filterList","filters","invert","filterProps","showDeleteFilteredImagesBtn","hasFilters","menuOpen","cameraSources","selectedCameraSources","clearSelection","inject","handleCloseFilter","FilterPopper","BaseFilterButton","getDatasetImageSources","selectedGroups","lowerBoundWidth","upper_width","lower_width","upperBoundWidth","lowerBoundHeight","upper_height","lower_height","upperBoundHeight","updateBounds","RangeSlider","internalTypes","selectedTypes","getTypeDisplayString","isInvertSelected","useAnnotationTypeStore","selectedDisplayTypes","useAnnotationType","ALL_TYPES","display","getDatasetAnnotationTypes","internalTags","tag","selectedTags","listTagsForDataset","timeToDecimal","timeStr","decimalTime","maxDateFormatted","minDateFormatted","elevation","minDate","maxDate","initialized","currentDate","startDateValid","endDateValid","startDateDifferent","endDateDifferent","getDate","getDatasetDateRange","min_date","max_date","setHours","newTime","oldTime","oldStartTime","oldEndTime","newStartTime","newEndTime","reviewStatuses","selectedReviewStatuses","useGalleryStore","imageDisplaySettings","currentDatasetID","internalCurrentDataset","combineSequenceFrames","getImagesParams","getImagesFilterParams","executing","isFetchingImages","ceil","setImageParams","setDatasetFilters","persist","useGallery","get_tags","image_tags_filter","groupsFilter","group_ids","confidenceRangeFilter","lower_score","upper_score","annotationTypeFilter","annotationTypeFilterInvert","types_inverse","annotationSetFilter","annotation_set_ids","imagesWithAnnotationSetFilter","annotationLabelFilter","images_with_annotation_label_indexes","boundingBoxSizeFilter","imageNameFilter","image_name","timeRangeFilter","lower_time","upper_time","dateRangeFilter","lower_date","toISOString","upper_date","cameraSourceFilter","image_sources","imageTagFilter","tag_names","getSelectionImageCount","filterParams","only_count","getImages","parked_at","newPage","imageListParams","deleteFilteredImages","handleGetPreviousImage","currentImageObj","resultImageObj","previousImageObj","promise","nextImageObj","handleGetNextImage","getHasPreviousImage","getHasNextImage","selectedSets","CameraSourceFilter","ConfidenceRangeFilter","AnnotationSetFilter","ImagesWithAnnotationSetFilter","AnnotationLabelFilter","AnnotationTypeFilter","ImageTagFilter","TimeRangeFilter","DateRangeFilter","ImageReviewStatusFilter","ImageNameFilter","MoreFilters","GroupsFilter","BoundingBoxSizeFilter","provide","showCopyFilteredImagesBtn","additionalFilterList","showFilters","filterValue","filterKeys","parentElement","filter_params","decodeURI","displayActive","menuValue","splitActive","handleSplitAnnotations","menuItems","menuItem","hoveredDisplayType","submenu","submenuItem","submenuIndex","selectedAnnotationLabels","labelMenuItems","dataReady","ready","mapMenuItemValue","newSets","existingSet","parentValue","unique","gridContainerStyles","hasGridItemSlot","gridItemStyles","handleScroll","mouseHover","handleDeleteClicked","allLabelNames","timeofLastErrorMessage","showError","timeNow","msSinceLastMessage","datastoreURL","allLabelIDs","protocol","gridItemImg","api","invoke","buttons","detail","deleteImage","handleInfoClicked","getImageObject","mime","getItem","img_url","img_url_orig","gridItemCanvas","drawBoundingBoxes","getRenderedSize","xRatio","yRatio","widthRatio","heightRatio","GalleryGridItem","selectedImages","gridItemScale","minGridItemHeight","minGridItemWidth","showHeader","_","slots","gridContainer","scrollTop","imageOffset","selectedIDs","selectedItemsSet","canSelectImage","annotationList","showName","showTags","imgName","uuid","tagColor","allTagNames","closable","ripple","link","removeTagsForImages","tags","allLabelIndexes","borderColor","getHue","tag_name","removeTagForImages","GalleryGridItemLabelTags","filteredAnnotationList","reviewer","handleImportClicked","sortTypes","selectedSort","listAscend","GalleryGrid","DatasetFilter","DisplayAnnotationsFilter","AnnotationEditorGalleryGridItem","GalleryEmptyState","GalleryImageSort","imageListPromise","minImageNumber","maxImageNumber","filtersUpdated","annotation_types","getImagesListParams","image_review_status_filter","displayAnnotationsFilter","displayType","handleGalleryOpened","handleGalleryClosed","newList","getReviewTaskImageList","currentController","AnnotationEditorGallery","seq","getImageBlobUrl","getDataset","getDatasetById","displayImage","imageDetailSettings","annotationCount","imageLoadedOnCanvas","activeAnnotationIndex","_rejected","_active","annotationTitle","rejectedIcon","canvasAnnotationArray","handleSpace","handleLeftArrow","handleRightArrow","handleShiftRightArrow","handleDelete","handleZKey","handleLabelListClick","getLabelKeyArray","handleTaskImageClicked","toUTCString","imageGroupID","selectedGroup","flexStyles","toggleSelection","ImageGroupSelector","showDate","showFileLocation","showExternalURL","showImageLocation","showCameraSource","AnnotationEditorHistoryDrawer","ImageDetails","AnnotationReviewAnnotationDetails","AnnotationCanvas","enableAnnotationNavigation","shiftState","keysPressedWhileShiftHeld","zoomedIn","hasPreviousAnnotation","hasNextAnnotation","reviewedAnnotationCount","verifiedAnnotationCount","hotkeyLabelMap","labelHotkeyMap","pressed","handleLabelHotkey","annotationCanvas","isLoaded","getPreviousAnnotation","getNextAnnotation","getNextImage","getNewImage","getPreviousImage","initialEditingAnnotations","hotkey","getLabelKeys","fromCharCode","annotationReviewContainer","rotate","taskProgress","activeTimeFormatted","seconds","useActiveTimer","activeTime","idle","remainingSeconds","isIdle","resumeActiveTimer","pauseActiveTimer","destAnnotationSet","selectedTool","useAnnotationEditorModalHotkeys","hotkeys","areListenersActive","attachEventListeners","handleKeyDown","handleKeyUp","detachEventListeners","setEventListenersActive","activateListeners","deactivateListeners","metaKey","scrubber","scrubbing","pendingValue","elementX","elementWidth","emitScrubbing","roundToStep","roundedValue","endBuffer","volumeButton","isVolumeButtonHovered","formatDuration","servers","handleSAMHoverAndClickAdd","handleSAMHoverAndClickMinus","handleSAMAddBox","handleSAMReset","handleCreatePolygon","fetchingCloudInstances","selectedServer","internalMode","listCloudInstances","allTypes","listedTopics","hoveredAnnotationListItem","handleAnnotationListItemHovered","hovered","groupedData","itemType","labelIndexToName","handleAnnotationClicked","useEditorControlsStore","currentCanvasTool","current3DCanvasTool","usePerspectiveCamera","useOrthographicCamera","handleFrontView","handleTopView","annotationCache","currentTool","gl","clearColor","shadows","alpha","shadowMapType","outputEncoding","toneMapping","grid","cameraPerspective","cameraOrthographic","transformControls","scene","renderer","raycaster","cameraType","cameraPerspectivePosition","cameraOrthographicPosition","upDirection","lookAt","transformObject","transformMode","transformEnabled","boxRefs","boxRefsFn","object","boxIndex","userData","invalidateBoxes","currentCamera","boxes3d","processLidar","lidarToProcess","clonedItem","processPcd","pcdToProcess","handleKeyEvent","deleteObjects","getPointArray","handleBoxClicked","intersection","pointerEvent","selectBox","deselectAllBoxes","clone","getLabelColor","lineMaterial","newTool","selectedBox","boxRef","newImageObj","updateBoxSelection","setPixelRatio","enableCanvasClick","getBoxTopEdges","vertices","lineGeometry","LineGeometry","setPositions","LineMaterial","linewidth","Line2","getBoxBottomEdges","getBoxLeftEdges","getBoxRightEdges","enableDamping","gsap","ease","onComplete","up","switchToPerspectiveCamera","currentUp","updateProjectionMatrix","switchToOrthographicCamera","distance","distanceTo","halfWidth","frustumWidthAtDistance","halfHeight","frustumHeightAtDistance","camera","vFov","fov","tan","aspect","handleTransformMouseUp","transformAnnotation","handleCanvasClick","intersects","intersectObjects","boxIntersects","gridIntersects","new3DBox","canvasEl","domElement","handleBoxPointerEnter","handleBoxPointerLeave","deleteSelectedBoxes","selectedBoxes","colorScheme","parsed","maxDepth","canSelect","hasSelectedListener","itemId","removable","itemSelected","handleOpen","opened","handleSelect","removeAnnotation","child","getKey","bubbleSelected","dataValue","emitSelect","getValueStyle","JsonDataType","ARRAY","VALUE","OBJECT","lengthString","openInFull","LIGHT","DARK","JsonViewItem","rootKey","build","depth","onSelected","includeKey","isObject","childKey","childValue","localColor","modes","handleNewColorPicked","colorPickerParent","strategy","colorCode","hexToUint32","uint32ToHex","uint32Value","fixedAnnotationSet","selectedTopics","internalSelectedAnnotationSets","internalSelectedLabels","openedTopics","displayColorBy","loadingRaw","allTypeKeys","at","unknownTypes","unknown","selectedLabelForAudit","isSelectedLabelInList","stopEditingColor","label_color","formatAnnotation","segments","formatDataJson","readFile","handleAnnotationOpened","handleLabelListItemClicked","handleDeleteAnnotation","toggleDropdownAll","toggleDisplayLabelTags","toggleDisplayProjection","bulkDeleteModal","deleteAll","delete_all","deleteAnnotationBulk","configTextBox","configText","fontFamily","textNode","depthmapAnn","anns","getImageBlob","get16BitValueAt","channels","elemWidth","textWidth","elemHeight","textHeight","relPtr","shouldEnableEraser","isSAMActive","increaseCursorSize","decreaseCursorSize","handleSetDrawingMode","newDrawingMode","isSamActive","handleClick","visualization","pane","handleVisualizationSelect","paneValue","dataTransfer","setData","onDrop","draggedVisualization","getData","testDragDataTypes","isOverDropZone","dataTypes","preventDefaultForUnhandled","handlePaneClick","handleClose","newLayout","hasOnlyOneDisplay","layouts","layout_single","layout_2_columns","layout_2x1","layout_2x2","layoutHasVisualization","checkForNestedArrayValue","wasReplaced","replaceFirstNull","newValue","removeNestedArrayValue","setNestedArrayValue","currentLocation","targetValue","getNestedArrayValue","layoutSelected","existingVisualizations","flatMap","traverseAndFill","indices","indicesClone","lastIndex","targetArray","currentIndex","valueToRemove","mapNonNullValues","traverse","newIndex","useImagesFetch","only_ids","getLabellingSequenceFrames","labelMargin","rowHeight","frameWidth","margin","gridHeader","timeline","scrubberPosition","scrubberHeight","lineCoordinates","svg","svgGroup","xAxis","yAxis","svgHeader","svgHeaderGroup","xAxisHeader","xScale","yScale","properties","rowIndex","keyframeRanges","ranges","keyframeObjectIndex","scrollToFrame","scrollTo","behavior","createGrid","append","attr","handleTimelineClick","domain","ticks","tickSize","tickFormat","call","selectAll","classed","handleKeyframeNodeClick","createHeader","snapToTick","moveScrubber","updateLineCoordinates","updateChart","updateHeader","updateAxes","updateScrubber","updateKeyframes","raise","nearestTick","tempData","clickedFrame","handleSkipPrevious","handleSkipNext","handleClearCache","show_playback_menu","playback_options","imagesFilterParams","doneScrubbing","loadFirstImage","currentSignal","firstSample","formatScrubberValue","handlePlayButtonClick","newFrame","oldFrame","newClicks","oldClicks","clicksToAdd","handleAddNewPointsOrBox","newBox","numFrames","isFetchServerHealthActive","pauseFetchServerHealth","resumeFetchServerHealth","fetchServerHealth","isFetchInitStatusActive","pauseFetchInitStatus","resumeFetchInitStatus","fetchInitStatus","isFetchPropagateActive","pauseFetchPropagateStatus","resumeFetchPropagateStatus","fetchPropagateStatus","isFetchAnnotationsActive","pauseFetchAnnotationsStatus","resumeFetchAnnotationsStatus","fetchAnnotationsStatus","handleSAMAddObject","isResetSuccessful","handleResetSAMState","handleSAMInitReset","handleInitState","requestData","start_frame","end_frame","handlePropagate","startFrameIdx","getFirstClickOrBoxFrameIndex","start_frame_idx","max_frame_num_to_track","lastFrameIdx","getLastClickOrBoxFrameIndex","ann_frame_idx","ann_obj_id","clear_old_points","normalize_coords","resultAnno","isSameImage","isSameObject","box3d","boxes2d","box2d","new2DBox","handleCancelPropagation","handleSAMClearAllPromptsInFrame","clicked_obj_id","postClearAllPromptsInFrame","sam2AnnotationsWithoutSameObjIdAndImageId","sam2anno","lastProagatedSAM2Annotations","aigt3dAnnotationsWithoutSameObjIdAndImageId","lastProagatedAigt3dAnnotations","aigt2dAnnotationsWithoutSameObjIdAndImageId","lastProagatedAigt2dAnnotations","handleRemoveObject","task_types","handleSAMRemoveObject","sam2AnnotationsWithoutObjId","aigt3dAnnotationsWithoutObjId","aigt3danno","aigt2dAnnotationsWithoutObjId","aigt2danno","handleSaveSAM2Annotations","addAnnotationsBulk","last_index","polygonAnnotations","box3dAnnotations","box2dAnnotations","minBoxFrameIdx","minClickFrameIdx","maxBoxFrameIdx","maxClickFrameIdx","initialAnnotationDisplaySettings","$dispose","auzone_log_svg","imageModal","prevInternalAnnotations","annotationSetToEdit","showAnnotationInfo","hoveredAnnotationListIdentifier","activePane","isMounted","internalEditAsSequence","newSamOptions","resetSAM2","isSAM2Selected","_isSAM2Selected","initialImageAnnotations","filterAnnotationsBySet","newAnnotationIdentifierMap","canvasHotkeys","toolHotkeys","auditHotkeys","isSequence","handleSequenceSubmit","drawToolHotKeys","handleCursorSizeUpdated","imageAuditHotkeys","sequenceAuditHotkeys","animationControls","imageEditorHotkeys","handleCopyAnnotations","handlePasteAnnotations","handleDeleteAnnotationBulk","activateImageAuditListeners","deactivateImageAuditListeners","auditorTypeVal","showLayouts","filterAnnotations","isVideo","selectedAnnotationInfo","showPanes","showCanvasTypes","showDepthTypes","totalAnnotations","createNewInternalAnnotation","handleAnnotationBulkDeleteComplete","getTopics","prevAnnotations","handleAnnotationReviewItemEdit","annotationIdentifier","handleSelectAnnotationFromSidebar","topicsResp","getDatasetTopics","handleAnnotationDeleteClicked","Headers","blobUrl","download","useDepthMapStore","depthMapFile","depthAnnotations","useDepthMap","parseDepthMapFile","AnnotationToolViewingModeControls","BaseSidebar","VideoControls","AnimationControls","PointCloudViewer","DepthMapViewer","JsonRawViewer","AnnotationEditorModal","VisualizationDisplays","VisualizationPane","SelectLayoutMenu","AddVisualizationMenu","encodeURI","settings","refreshAnnotationSets","refreshLabels","labelIndexes","handleAnnotationListItemClicked","arrayIndex","getAnnotationSetsForDataset","getLabelListForDataset","getAnnotationSets","get_num_annotations","reviewSessionMethod","batchSize","samplingMethod","created_at","remainingCount","updateLabel","internalDatasetList","handleOpenAnnotationCopy","openConfirmDeleteDatasetModal","handleCopyDatasetClicked","handleSelectDataset","handleCreateAnnotationSet","openConfirmDeleteAnnsetModal","handleCreateLabel","handleUpdateLabel","handleLabelDeletedEvent","handleOpenDatasetAccessManagement","refreshDatasetCard","openImportModal","openExportModal","openUploadModal","openUpdateModal","isFrozen","handleToggleFreeze","openImportAnnsetModal","openCreateGroupsModal","openConfirmDeleteGroupModal","handleNavigateToGallery","handleOpenGenerateTokenModal","handleOpenConfMatrix","handleUpdateAnnotationSet","handleParkDatasetEvent","handleUnparkDatasetEvent","handleOpenAddSnapshotModal","dismissError","generateHash","createDataset","modalDataset","showCopyModal","destDatasetID","getDatasetWithID","confirmNote","copyAnnotationSetDataset","clearCopyAnnset","handleAnnotationSetCreatedEvent","handleAnnotationSetCreatedErrorEvent","modalAnnotationSet","handleAnnotationSetUpdatedEvent","handleLabelCreatedEvent","handleAccessUpdated","exportDataset","impexDataset","handleStartExport","showUploadModal","handleUploadError","inputDataset","inputProject","dataset_writed","originalDatasetAccessList","datasetAccessList","dataset_access","datasetAccessModal","getDatasetAccessList","updated_dataset_access","revertDatasetAccessToDefault","setDatasetAccessToPrivate","deleteDatasetAccess","updateDatasetAccess","dataset_access_list","dataset_access_usernames","addDatasetAccess","createLabels","createLabelsModal","isJSON","parseInput","addLabel2","cardTitle","getDatasetStatusIcon","getDatasetStatus","handleWarning","isParked","handleGalleryClicked","handleRefreshClicked","openUploadDataset","canRead","openExportDataset","handleOpenSnapshot","handleCopyClicked","openAnalytics","openMap","generateAPIToken","parkDataset","unparkDataset","deleteDataset","disableDelete","handleDeleteLabelClicked","createLabel","checkDockerTaskProgress","createGroupClicked","numAnnotationSets","createAnnotationSetClicked","annotationSetsLoading","internalAnnotationSets","numImg","hashId","hashed_id","handleCopyAnnSetClicked","footer","loadingHash","shorten","Tooltip","imgTotal","navigateToValidator","copyLabels","newLabel","internalLabels","startEditingIndex","editingIndex","stopEditingIndex","unfocus","startEditingName","editingName","stopEditingName","newName","deleteLabel","ColorPicker","existingIndices","existingNames","newColor","labelString","inputField","startEditingColor","editingColor","DatasetCardLabelsPopper","AnnotationSetListItem","GroupListItem","statusType","datasetNotifications","is_frozen","onDismiss","getDatasetAccessForSingleUser","handleEditAnnset","openImportDataset","handleFreezeDataset","importAnnotationSet","novalidate","handleFormChange","lockSource","selectedProjectChange","sourceParams","sourceDatasets","sourceDS","copySequences","sourceGroup","sourceAnnset","copyAnnSetForDuplicate","onlyAnnotations","annotationTypes","filterTypes","panels","addNewDestDS","chosenDestDatasetAnnset","invalidDestinationsIndexes","isDestinationSplitValid","removeDestDS","awaitMergerResult","destinationParams","applyCopySequences","applyCopy","selectedSet","restore","AnnotationSetsRadioSelect","random","sourceDatasetLabels","dest","destParams","dataset_group_id_src","annotation_set_id_src","destinationSum","invalidDestinations","getAnnotationTypes","ds","ds_id","mergeDatasetModal","dest_dataset_id","should_copy_annset_for_duplicate","filter_types","copyDataset","clearMessage","createDatasetModal","updateDatasetModal","clearSourceDest","localSource","chosenSourceAnnotationSet","chosenDestAnnotationSet","localDest","annSetCopyModal","annotation_set_id_dst","copyAnnotationSet","createAnnotationSet","createAnnotationSetModal","annSetName","operator","updateAnnotationSet","updateAnnotationSetModal","clearInput","exportMode","detectionTypes","segmentationTypes","allSequences","selectedSequences","exportSecondaryMode","downloadParams","imgFolder","URLSearchParams","exportName","getSequencesForDataset","exportDatasetModal","getSequences","auto_remove","startExport","importTypeSelected","accept","fileSelected","uploadStatus","dropHighlighted","chooseFiles","handleDragEnter","handleDragLeave","handleDrop","isMobileDevice","importTypes","selectedImportType","importType","arg","optional","textInput","shouldCreateImageGroups","sourceFile","chooseSourceFile","sourceFileSelected","videoFPS","handleCancel","handleStartImport","isFilesParsed","shouldCancelFileParsing","imageGroupsToCreate","formValue","getDatasetGroups","getGroupListForDataset","validateForm","handleVideoImport","formData","FormData","paramObj","uploadVideo","errorMessage","s3MultipleAnnotationFileUpload","startImport","import_data","dropbox_access_code","dropbox_root","s3MultipleFileUpload","getMaxImageSize","isImage","checkImageUploadLimit","DefaultImportScriptForm","matchMedia","matches","blockSize","blockCount","blockNo","uploadInProgress","uploadMessage","uploadErrorMessage","dragCounter","getSupportedTypes","getSupportedImportTypes","uploadFiles","imageFiles","createGroups","totalPercentage","addGroupsModal","totalPercent","annSet","createToken","dsConnect","generateTokenModal","generateBridgeToken","currentLabels","loadingValidations","loadingValidation","applyFilters","abortAllSignals","validations","handleAnnotationSetSummarySelected","confusionMatrixData","sliderVal","SingleSlider","selectedMetric","ComparisonTaskGroundTruth","ChooseValidationTarget","ConfidenceThresholdFilter","IoUThresholdFilter","MetricFilter","IgnoreBoxesFilter","ground_truth_annotation_set_id","predicted_annotation_set_id","confidence","iou","ignoreBoxes","tableEntries","entry","currentEntry","handleSelectEntry","target_set_id","total_tp","total_fn","total_class_fp","total_loc_fp","accuracy","precision","recall","localMatrix","tooltipBubbleHeight","dataRange","axisLabels","divWidth","divHeight","rects","tooltipBubble","xAxisLabel","yAxisLabel","successColor","failColor","containerElement","Value","setAxisLabels","updateData","debouncedHandleWindowResize","initChart","initAxis","inputChartData","cellClicked","imageArr","clearSelectedRects","handleMouseOver","tooltipBottomMargin","tooltipTextMargin","checkIfSelected","insertBefore","newBubbleWidth","xPosition","yPosition","accurateSamples","inaccurateSamples","totalSamples","Xlabel","Ylabel","bandwidth","numSamples","rangeRound","paddingInner","getDivDimensions","resizeAxis","transitionDuration","resizeRects","resizeChart","handleWindowResize","datavizRef","selectedRects","selectedRow","selectedCol","each","merge","ConfusionMatrixV2","formattedData","ComparisonFilter","ComparisonTableDynamic","ConfusionMatrixCardV2","annotationsForDisplay","confMatrixChartProperties","controllers","shouldClearValidations","targetSet","hasValidations","resetList","compare","compareSets","statsCompare","confusion_matrix_data","index_name_map","validation","confusionMatrixModal","new_snapshot","snapshot","mcapTopics","topic","useFPS","depthGen","agtgPipeline","addSnapshot","restoreSnapshot","loadingDatasets","snapshotsModal","createNewSnapshot","snapshot_id","dataset_description","depth_gen","agtg_pipeline","enabled_topics","DatasetCard","DatasetCopyModal","DatasetCreateModal","AnnSetCopyModal","CreateAnnotationSetModal","UpdateAnnotationSetModal","CreateLabelsModal","ManageDatasetAccess","DatasetExportModal","DatasetUpdateModal","UploadImagesModal","CreateGroupsModal","GenerateTokenModal","ConfusionMatrixModal","SnapshotAddModal","isImport","isUpdate","showSnapshotsModal","refreshedAnnotationSets","getDatasetsDetails","unsubscribe","subscribe","mutation","dsID","stopStatusInterval","startStatusInterval","getDatasetIndex","openCopyAnnSetModal","dsList","toRemove","deleteAnnset","deleteAnnotationSet","handleAnnotationSetDeletedEvent","deleteGroup","closeCreateModal","closeUpdateModal","datasetExportModal","openSnapshotsModal","importAnnsetModal","closeExportModal","handleCopyAnnSetCompleted","refreshDatasetInfo","newDatasetInfo","getDatasetInfo","refreshedLabels","copyAnnSetModal","manageDatasetAccessModal","getExportList","updatedParams","createDatasetResp","freezeDataset","createGroupsModal","dateDiff","refreshPage","addSnapshotModal","sleep","time","GetDatasetAnnotationsHash","currentTypes","openCopyFilteredImagesModal","openConfirmDeleteFilteredImagesModal","handleRemoveTagsForSelectedImages","handleAddTagsForSelectedImages","openConfirmDeleteImageModal","handleRefreshPage","showImageName","shouldShowSelector","handleCopy","handleDownload","overlay","showIcon","handleImageUploadComplete","imageFilterParams","showCopyImageModal","internalSelectedImages","copy","selectedImportScript","importScriptType","importScriptAnnsetID","dropZone","handleDragOver","upload","displayDetails","selectedImage","copyImageModal","destDataset","selectedSrcAnnotationSet","destAnnotationSets","tagOpen","updateTagOpen","newTag","newTagClicked","createNewTag","allTags","editing","editDone","handleTagsToggle","edit","openConfirmRemoveTagsForDatasetModal","deleteImages","refreshDatasetTags","refreshImagesTags","listTagsForImages","removeTagForDataset","updateTagName","old_name","addTagsForImages","addNewTagForImages","textEditorNewTag","addNewTagForDataset","DisplayImageDetails","GalleryGridItem2","GalleryDropZone","ImageCopyModal","GalleryActionsDropdown","mapImageList","gallerySelection","showExportModal","getAnnotationSetsParams","include_empty","imageParams","getImagesCombinedParams","combinedParams","imgListLength","image_params","annotation_display","image_display","getAnnotationSetList","displayFilters","handleGallerySelectionChanged","selection","handleCopyCompleted","handleAnnotationSetCreated","filtered","sequence_ids","handleMultiSelect","IDs","selectedImageIds","boxSize","handleNewSetSelected","isNotEmpty","fetching","dataArray","labelCountData","histogramData","bboxSizeHistogram","getBBoxSizeHistogram","labelList","locationMap","handleNewLabelSelected","handleNewLabelVisualizerSelected","min_width","min_height","max_width","max_height","toolbar","rotateAlways","tickPlacement","dataLabels","fillSeriesColor","legend","showForSingleSeries","componentIsActive","updateHistogram","singleSeries","getColors","mandatory","chartPieOptions","chartBarOptions","seriesIndex","plotOptions","bar","columnWidth","distributed","updatePie","updateBar","counts","pieSeries","sum","partialSum","LabelSelector","heatmap","enableShades","useFillColorAsStroke","axisTicks","borderType","updateMap","restoreDS","restoreLabel","localSeries","localData","updateCanvas","bboxGraph","debounceResize","canvasContainer","fillRect","canvasRect","chooseRange","dataPointSelection","exp0","exp1","fontWeight","states","allowMultipleDataPointsSelection","zoomLimit","chartContext","selectedDataPoints","parseRangeString","annotation_set_name","StatsOverview","LabelsPieChart","ConfidenceHistogram","LabelLocationMap","BoundingBoxDisplay","BoundingBoxSizeHistogram","fullAnnotationList","getLocationMap","getAllStats","getConfHist","getLabelCount","getMinMaxBox","getAllAnnotations","getDatasetStats","getAnnotationsForAnnotationSets","markersLayer","markersSource","clusterSource","imagesLimit","updateSize","addMarker","layers","Tile","OSM","view","View","features","Feature","Point","clusterDistance","minDistanceBetweenClusters","Cluster","minDistance","styleCache","Vector","feature","Style","Circle","Fill","addLayer","handleCompareSessionsClicked","openStartValidatorModal","validateSessions","toggleSession","handleSessionChartsClick","openConfirmDeleteValidation","handleSessionInfoClicked","experiments","snapshots","handleValidateSessionCreated","selectedValidateSession","model_experiment","model_training_session","model_file","model_data","model_dataset","model_annotation_set","legacy_gt_dataset","legacy_gt_annotation_set","legacy_target_dataset","legacy_target_annotation_set","startingValidator","startSession","model_snapshot","legacy_confidence","legacy_iou","legacy_metric","legacy_ignore_boxes","getValidatorSchema","createValidatorModal","val_params","val_type","gt_id","target_id","toggleSelectSession","toggleHide","hideProgress","sessionStatus","validate_params","ShikiHighlight","internalSession","YAMLfile","newval","old","validateSessionDetailsModal","getValidateSessionLogs","validate_session_id","StartValidatorModal","ValidatorCard","ValidateSessionDetailsModal","selectedSessions","getValidateSessionList","getSnapshots","toDataset","getValidateSession","startValidatorModal","handleDeleteValidateSessions","deleteValidateSessions","listSnapshots","filteredInternalDatasets","openConfirmTerminateTaskModal","openConfirmDeleteTaskModal","internalDatasets","trainerList","getAutoAnnotationList","selectedExperiment","autoAnnTrainingSessions","selectedSessionAvailableFiles","selectedModelFiles","autoSegTrainingSessions","save_as","inline","compact","segmentationSourceDataset","segmentationSourceAnnset","selectedDestinationDataset","destinationAnnset","starting","modelFileTypes","trainingSessions","getAllFiles","createTaskModal","convertorFindAllFiles","allFiles","task_name","is_segment","experiment_id","backbone","decoder","startAutoAnn","src_annotation_set_id","dst_annotation_set_id","startAutoSegmentation","use_mask","handleAutomatedTaskStart","getString","getAnnotationSetNameFromId","getStyle","CreateAutoAnnotationTaskModal","AutoAnnotationCard","hideNoExists","taskList","datasetMap","handleTerminateClicked","getAutoAnnList","terminateAutoAnn","task_ids","deleteAutoAnn","task_id","AutomatedTasks","openCreateTaskModal","reviewTasks","hasPermission","shouldAccessTask","createReviewSession","createAnnotationReviewSession","handleOpenManageAccess","handleReviewTaskCreated","handleReviewTaskCreatedError","showCreateModal","editorLabels","handleExitReview","handleDeleteReviewTask","modalTask","updateAllReviewCards","handleStartAnnotationAudit","handleDeleteReviewTaskClicked","destAnnSet","sourceAnnSet","numImagesRemaining","reviewers","numAnnotationsRemaining","cardActionText","getReviewTaskAccessList","reviewTaskInputName","reviewTaskInputDescription","srcDataset","destAnnotationSetName","srcAnnotationSet","createReviewTask","createAnnotationReviewModal","reviewTaskDestinationAnnotationSet","inputName","addReviewTask","annotationSetName","annotationSetExists","getReviewTaskAnnotationSetName","srcName","annotationSetNames","tempSrcName","num","taskAccessList","taskAccessModal","task_access","deleteReviewTaskAccess","revertReviewTaskAccessToDefault","review_task_access_usernames","nameMap","addReviewTaskAccess","CreateAnnotationReviewTaskModal","ReviewTaskCard","ManageReviewsAccess","manageReviewsAccessModal","getReviewTasks","updatedTasksPromises","updateReviewCardCount","getLabelingTaskRemainingCount","showBulkReview","access","addReviewSession","reviewSessionSettings","handleReviewSessionCreated","getAnnotationSet","deleteReviewTask","ReviewsTab","toggleTypes","selectType","dates","selectDate","selectedDate","selectedItems","handleRestoreAll","handleDeleteAll","sortDateAsc","getSortIcon","handleSelectAllClicked","undelete","confirmPurge","HeaderDve","listDeletedItems","sortByDate","getUserList","date_removed","deleted_start","deleted_end","current","setDate","UTC","getListOfRecycledItems","deleted","findProjectNameById","decode","valueHex","notIn","undeleteRecycledItem","item_id","purge","purgeRecycledItem","restoreAll","allInstances","selectedInstances","selectAllInstances","sortStateAsc","taskTypeMap","getInstances","sortedAsc","launch","sortByState","localeCompare","newInstances","instanceCount","handleStopClicked","handleStartClicked","startingInstance","createServerModal","startInstance","cloudInstanceList","createInstanceModal","handleUpdateInstanceCount","handleSelectedInstances","openConfirmDeleteModal","deleteInstance","selected_ids","cloud_instance_ids","stopMultipleCloudInstance","allSnapshots","modalSnapshot","snapshotNameEditors","importFolderInput","disableSnapshot","sortAsc","handleFileInput","selectedFiles","compileFiles","processFolder","fileObjs","dismissible","dirName","lastIndexOf","fileNames","fileSizes","createSnapshotUploadMultipartUrl","snapshot_name","file_sizes","firstKey","directoryPath","uploadId","totalSize","sizeMap","fileMap","totalParts","completedPart","uploadPromises","fileObj","uploadFileMultipart","fileName","fileEvent","totalFileParts","partIndex","countSum","PartNumber","ETag","uploadedData","completeResponse","completeSnapshotUploadMultipartUrl","upload_id","etag_list","updateStatus","progressCallback","partCompleteCallback","errorCallback","CHUNK_SIZE","chunk","xhr","XMLHttpRequest","lengthComputable","etag","getResponseHeader","handleRemoveSnapshot","removeSnapshot","findProjectName","updateName","updateSnapshot","filePromises","folderPromise","getAsFileSystemHandle","downloadSnapshot","createSnapshotDownloadUrl","downloadFile","SnapshotList","navigationFixed","agtg","edge","price","trial","contact","sections","mlopsTab","contactFormMessage","pauseChangeImage","resumeChangeImage","changeImage","option_hero_animate_content_on_scroll","option_hero_3d_hover_effect","option_hero_parallax_hover_effect","option_hero_gravity_effect","option_hero_background_mode","option_hero_background_image_path","option_hero_background_slider_path","option_hero_background_slider_delay","option_hero_background_slider_transition","option_hero_background_slider_transitionDuration","option_hero_background_kenburns_path","option_hero_background_kenburns_delay","option_hero_background_kenburns_transition","option_hero_background_kenburns_transitionDuration","option_analytics_tracking","option_analytics_tracking_id","heroImage","heroImages","handleMenuClick","navbarToggle","navbarCollapse","isExpanded","handleMenuClickOutside","handleScrollToSection","section","scrollIntoView","scrollToTop","scrollableElement","loadScripts","handleMlopsTab","handleContactSubmit","requiredFields","missingFields","userContact","handleSignIn","userEmail","userPassword","maxlength","handleNewUserToggle","handleCreateAccount","userCreateFirstname","userCreateLastname","userCreateUsername","userCreateEmail","userCreateOrganization","userCreatePassword","userConfirmPassword","successMessage","updatePassword","userChangePassword","userChangePasswordConfirm","authUsername","require2fa","slides","details","slideshowInterval","showSlideshow","initialMode","changeSlideshow","slide","slideshow","slideshowImg","descriptionTitle","innerHTML","descriptionDetails","pw","conf","updateUserPassword","handleSignInError","inputUsername","inputPassword","authResult","tokenJson","changepassword","registerNewUser","company","handleCreateAccountError","multi","apex","ChartCard","isMultiSession","stopEC2StatusInterval","getValidateGraphs","N","logsInterval","refreshTimeout","getName","getEpoch","getTotalEpochs","epochs","openConfirmStopValidateSessionModal","handleStopValidateSessions","terminateValidateSessions","updateValidatorEC2InstanceStatus","validateUpdateEC2","dataset_ids","startEC2StatusInterval","ec2Interval","routes","Login","UserPage","AccountSettings","EditUser","AdminPage","OrganizationSettings","EditOrganization","OrganizationSecuritySettings","UserManagement","CreateSecondaryUser","UserUsageLogs","Transactions","SuperAdminPage","OrganizationManagement","AddNewOrganization","UserAddCredits","EmulateUser","ShowDetailedOrganization","TrainerManagement","ValidatorManagement","Projects","ProjectManagement","Datasets","DatasetManagement","GalleryLandingPage","Gallery","AnnotationViewer","DatasetStats","TaskBoard","CloudInstancesPage","beforeRouteEnter","next","router","history","clearTaskIntervals","handleAuthentication","beforeEach","currentToken","verifyToken","DatastoreConnect","createRPCQuery","jsonrpc","credentials","formattedUrl","handleResponse","retryOptions","backoff","fetchWithAuth","addPackage","updatePackageQuota","getPackage","deletePackage","getDateRangeReport","getProject","copyDatasetWithFilters","getDatasetDownloads","getDatasetAccessUserList","getProjectDatasetAccessUserList","getImagesCount","getImageMetadata","copyImages","getAnnotations","getAnnotationJson","dataType","requestOptions","updateAnnotationFile","getAnnotationSetConfusionMatrix","getAutoAnnSet","getAutoSegList","getAutoSeg","removeAutoSeg","addReviews","getReviewImages","getReviewTaskById","getReviewerList","deleteReviewTaskUser","addReviewTaskUser","updateReviewTaskAccess","getReviewTaskAccessForSingleUser","s3SingleImageImport","getTrainerData","startTrainer","stopTrainer","getTrainerStatus","generateTwoStageModel","getUserListByParent","generateUserAvatar","getOrgForUser","updateBucket","getExportStatus","deleteExport","updateGroup","getTrainingSetList","getTrainingSet","addTrainingSet","deleteTrainingSet","updateTrainingSet","getTrainingSetConversionList","addTrainingSetConversion","deleteTrainingSetConversion","updateTrainingSetConversion","getTrainingSetCacheList","addTrainingSetCache","deleteTrainingSetCache","updateTrainingSetCache","getDockerTasksDashboard","updateDockerTask","startGraph","stopGraph","validate","videoImport","getAppVersion","getConverterOptions","convertModel","convertorStatus","convertorGetDockerTasks","purgeSequence","stopCloudInstance","getCloudInstanceStatus","createSnapshotUploadUrl","routerIsReady","currentRoutePath","isTokenExpired","isExpired","getDockerTasksForProject","isReady","handleBeforeUnload","stopImmediatePropagation","currentVersion","incomingVersion","reload","is_saas","completed_limit","render","clickOutside","binding","clickOutsideEvent","visibleToggle","visibility","vuetify","icons","defaultSet","VNumberInput","directives","use","App","directive","mount","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","deferred","O","chunkIds","priority","notFulfilled","fulfilled","getter","__esModule","definition","defineProperty","enumerable","chunkId","miniCssF","globalThis","prop","prototype","hasOwnProperty","dataWebpackPrefix","done","script","needAttach","scripts","getElementsByTagName","charset","onScriptComplete","prev","doneFns","parentNode","bind","head","Symbol","toStringTag","baseURI","self","installedChunks","installedChunkData","loadingEnded","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}