{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/KingroonNavBar.vue?1e18","webpack:///../app_ent/static/img/partners/app-screenshot-2.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue?40fd","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/i18n/i18n.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/fluidd_logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/gaps-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/raisedRipples-2.jpg","webpack:///../app_ent/static/img/partners/app-screenshot-3.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue?d992","webpack:///../app_ent/static/img/partners/app-screenshot-4.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?1d7c","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintHistoryItem.vue?ec6d","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/generic-app.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue?a80c","webpack:///./src/views/TimelapseUploadPage.vue?3753","webpack:///./src/views/CelestriusConfigurePage.vue?0a0c","webpack:///../app_ent/static/img/partners/printer-management.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue?ac43","webpack:///./src/views/DetectiveHourCouponCodesPage.vue?ee77","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue?ad4e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue?36dc","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterSettingsPage.vue?6a49","webpack:///../app_ent/static/img/partners/bigtree-tech-obico-logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/UserPreferencesPage.vue?b660","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TerminalWidget.vue?39f2","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?fb85","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterControlPage.vue?ee85","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue?7e8f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/RenameModal.vue?d725","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue?48f7","webpack:///./src/views/partners/BttRedeemPage.vue?1ca1","webpack:///../app_ent/static/img/partners/ai-failure-detection.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/printer-wizard/commandLinePrompt.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CascadedDropdown.vue?ac9a","webpack:///../app_ent/static/img/partners/app-screenshot-5.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ReorderModal.vue?34f1","webpack:///../app_ent/static/img/partners/get-on-google-play.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue?4f77","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/bubbling-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/polymer.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue?3f1b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue?41b4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/SharePrinter.vue?96e0","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue?0a91","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/pref.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue?3f63","webpack:///../app_ent/static/img/partners/mobile-web-app.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FailureDetectionGauge.vue?c1b1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/printer.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?30fb","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/raspberry_pi.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/TerminalFeedView.vue?3d3c","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/PrinterTerminal.vue?2be0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/printer-wizard/lcdScreenLarge.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/PrinterCard.vue?624e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/mainsail_logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?8b96","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue?ba11","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue?e6cf","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/octoapp.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/HelpWidget.vue","webpack:///../../obico-server/frontend/src/components/HelpWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/HelpWidget.vue?2f5c","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/HelpWidget.vue?4299","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/printer-wizard/klipperScreenMenu.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/StatusTemp.vue?f338","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/HelpWidget.vue?084d","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue?da8a","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue?3393","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/vue-swal.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/filters.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/sentry.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/LoadingPlaceholder.vue","webpack:///../../obico-server/frontend/src/components/LoadingPlaceholder.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/LoadingPlaceholder.vue?bbfa","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/LoadingPlaceholder.vue?93cd","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SyndicateAwareSVG.vue","webpack:///../../obico-server/frontend/src/components/SyndicateAwareSVG.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SyndicateAwareSVG.vue?1f42","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SyndicateAwareSVG.vue?0220","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/config/syndicateText.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/mount.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/formatters.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/gcode-metadata.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/printer-transient-state.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/normalizers.js","webpack:///../../obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue?fbbf","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue?d81e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/OctoPrintTunnelPage.vue","webpack:///../../obico-server/frontend/src/views/OctoPrintTunnelPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?062c","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?cf21","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintShotFeedbackApp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue","webpack:///../../obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue?3783","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue?5955","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/PageLayout.vue","webpack:///../../obico-server/frontend/src/components/PageLayout.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/PageLayout.vue?f4f8","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/PageLayout.vue?e136","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/VideoBox.vue","webpack:///../../obico-server/frontend/src/components/VideoBox.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/VideoBox.vue?a805","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/VideoBox.vue?9aab","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DetectiveWorking.vue","webpack:///../../obico-server/frontend/src/components/DetectiveWorking.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DetectiveWorking.vue?e8fa","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DetectiveWorking.vue?c27e","webpack:///../../obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue?afe7","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue?198b","webpack:///../../obico-server/frontend/src/views/PrintShotFeedbackApp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintShotFeedbackApp.vue?011f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintShotFeedbackApp.vue?0822","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintHistoryPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CascadedDropdown.vue","webpack:///../../obico-server/frontend/src/components/CascadedDropdown.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CascadedDropdown.vue?cc06","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CascadedDropdown.vue?d559","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SortingDropdown.vue","webpack:///../../obico-server/frontend/src/components/SortingDropdown.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SortingDropdown.vue?67fd","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SortingDropdown.vue?21e2","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FilteringDropdown.vue","webpack:///../../obico-server/frontend/src/components/FilteringDropdown.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FilteringDropdown.vue?4f4a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FilteringDropdown.vue?187b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ActiveFilterNotice.vue","webpack:///../../obico-server/frontend/src/components/ActiveFilterNotice.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ActiveFilterNotice.vue?72b1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ActiveFilterNotice.vue?f517","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintHistoryItem.vue","webpack:///../../obico-server/frontend/src/components/prints/PrintHistoryItem.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintHistoryItem.vue?792b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintHistoryItem.vue?d7b3","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DatePickerModal.vue","webpack:///../../obico-server/frontend/src/components/DatePickerModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DatePickerModal.vue?3929","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DatePickerModal.vue?0c27","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/time-period-filtering.js","webpack:///../../obico-server/frontend/src/views/PrintHistoryPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintHistoryPage.vue?eb66","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintHistoryPage.vue?9dde","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/StatsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/MutedAlert.vue","webpack:///../../obico-server/frontend/src/components/MutedAlert.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/MutedAlert.vue?a1b4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/MutedAlert.vue?1cd9","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/charts/donut-chart.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/charts/bar-chart.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/printStats.js","webpack:///../../obico-server/frontend/src/views/StatsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/StatsPage.vue?dcc0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/StatsPage.vue?a94e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FailureDetectionGauge.vue","webpack:///../../obico-server/frontend/src/components/FailureDetectionGauge.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FailureDetectionGauge.vue?6b04","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FailureDetectionGauge.vue?0ed7","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/printer-comm.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/printer-local-comm.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/sendToPrint.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/GCodeDetails.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CollapsableDetails.vue","webpack:///../../obico-server/frontend/src/components/CollapsableDetails.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CollapsableDetails.vue?fc15","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CollapsableDetails.vue?bb0d","webpack:///../../obico-server/frontend/src/components/GCodeDetails.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/GCodeDetails.vue?d99e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/GCodeDetails.vue?1538","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue","webpack:///../../obico-server/frontend/src/components/prints/FirstLayerReportModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?1499","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?856c","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/services/gradeCalculator.js","webpack:///../../obico-server/frontend/src/views/PrintPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintPage.vue?74b4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintPage.vue?8ffb","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterListPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/PrinterCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/janus.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/webrtc.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/StreamingBox.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/viewing-throttle.js","webpack:///../../obico-server/frontend/src/components/StreamingBox.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/StreamingBox.vue?8685","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/StreamingBox.vue?3152","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/DurationBlock.vue","webpack:///../../obico-server/frontend/src/components/printers/DurationBlock.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/DurationBlock.vue?09e5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/DurationBlock.vue?24b0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/StatusTemp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TemperatureItem.vue","webpack:///../../obico-server/frontend/src/components/printers/TemperatureItem.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TemperatureItem.vue?0482","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TemperatureItem.vue?1c70","webpack:///../../obico-server/frontend/src/components/printers/StatusTemp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/StatusTemp.vue?c39b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/StatusTemp.vue?8dca","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TempTargetEditor.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SliderInput.vue","webpack:///../../obico-server/frontend/src/components/SliderInput.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SliderInput.vue?a4de","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SliderInput.vue?10b3","webpack:///../../obico-server/frontend/src/components/printers/TempTargetEditor.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TempTargetEditor.vue?86b1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TempTargetEditor.vue?dac8","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/SharePrinter.vue","webpack:///../../obico-server/frontend/src/components/printers/SharePrinter.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/SharePrinter.vue?fd01","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/SharePrinter.vue?87fd","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue","webpack:///../../obico-server/frontend/src/components/printer-control/WidgetTemplate.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue?48e0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue?6a40","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFoldersPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SearchInput.vue","webpack:///../../obico-server/frontend/src/components/SearchInput.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SearchInput.vue?d62f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SearchInput.vue?0d32","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/NewFolderModal.vue","webpack:///../../obico-server/frontend/src/components/g-codes/NewFolderModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/NewFolderModal.vue?9b2d","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/NewFolderModal.vue?0e17","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/RenameModal.vue","webpack:///../../obico-server/frontend/src/components/g-codes/RenameModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/RenameModal.vue?f8c1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/RenameModal.vue?b966","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/MoveModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/FileStructureItem.vue","webpack:///../../obico-server/frontend/src/components/g-codes/FileStructureItem.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/FileStructureItem.vue?00d1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/FileStructureItem.vue?7ae1","webpack:///../../obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue?8998","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue?efd5","webpack:///../../obico-server/frontend/src/components/g-codes/MoveModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/MoveModal.vue?acdd","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/MoveModal.vue?820d","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue","webpack:///../../obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue?7025","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue?bc87","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/dropzone-upload-error.js","webpack:///../../obico-server/frontend/src/views/GCodeFoldersPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFoldersPage.vue?3cb5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFoldersPage.vue?b558","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFilePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue","webpack:///../../obico-server/frontend/src/components/g-codes/AvailablePrinters.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue?3380","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue?7c3b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue","webpack:///../../obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue?ec3f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue?1df9","webpack:///../../obico-server/frontend/src/components/g-codes/JusprinFeedback.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue?611a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue?ef58","webpack:///../../obico-server/frontend/src/views/GCodeFilePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFilePage.vue?07d7","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFilePage.vue?6504","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/ConnectPrinter.vue","webpack:///../../obico-server/frontend/src/components/printers/ConnectPrinter.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/ConnectPrinter.vue?081f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/ConnectPrinter.vue?0cd7","webpack:///../../obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue?c5ee","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue?dce6","webpack:///../../obico-server/frontend/src/components/printers/PrinterCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/PrinterCard.vue?cf4a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/PrinterCard.vue?b8ed","webpack:///../../obico-server/frontend/src/views/PrinterListPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterListPage.vue?fc15","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterListPage.vue?7a56","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/SharedPrinterPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NavBar.vue","webpack:///../../obico-server/frontend/src/components/NavBar.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NavBar.vue?b71b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NavBar.vue?e038","webpack:///../../obico-server/frontend/src/views/SharedPrinterPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/SharedPrinterPage.vue?1c68","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/SharedPrinterPage.vue?5987","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterSettingsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberInput.vue","webpack:///../../obico-server/frontend/src/components/NumberInput.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberInput.vue?2f13","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberInput.vue?3d78","webpack:///../../obico-server/frontend/src/views/PrinterSettingsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterSettingsPage.vue?5550","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterSettingsPage.vue?cb9b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue","webpack:///./src/config/event-handler.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue","webpack:///../../obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue?a9d9","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue?e04f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue","webpack:///../../obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue?eba2","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue?2632","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue","webpack:///../../obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue?b98b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue?e05c","webpack:///../../obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?048a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?db29","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue","webpack:///../../obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue?ca76","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue?9e7a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue","webpack:///../../obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue?1afc","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue?0896","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue","webpack:///../../obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue?fd33","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue?d2ff","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterControlPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue?21d6","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue?bd84","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue?a1d7","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue?cef8","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TempPresets.vue","webpack:///../../obico-server/frontend/src/components/printers/TempPresets.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TempPresets.vue?5614","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TempPresets.vue?3e42","webpack:///../../obico-server/frontend/src/components/printer-control/TemperatureWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue?c661","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue?9e99","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue?5e6e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue?ab0f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ReorderModal.vue","webpack:///../../obico-server/frontend/src/components/ReorderModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ReorderModal.vue?8441","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ReorderModal.vue?538e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TerminalWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/PrinterTerminal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/TerminalFeedView.vue","webpack:///../../obico-server/frontend/src/components/terminal/TerminalFeedView.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/TerminalFeedView.vue?70f3","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/TerminalFeedView.vue?fb6d","webpack:///../../obico-server/frontend/src/components/terminal/PrinterTerminal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/PrinterTerminal.vue?6703","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/terminal/PrinterTerminal.vue?b970","webpack:///../../obico-server/frontend/src/components/printer-control/TerminalWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TerminalWidget.vue?b43f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TerminalWidget.vue?2eb2","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue?881c","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue?9371","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/PowerControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue?e2a5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue?8533","webpack:///../../obico-server/frontend/src/views/PrinterControlPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterControlPage.vue?39be","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterControlPage.vue?b6a2","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/UserPreferencesPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/config/user-preferences/sections.js","webpack:///./src/config/user-preferences/sections.js","webpack:///../../obico-server/frontend/src/views/UserPreferencesPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/UserPreferencesPage.vue?a1ba","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/UserPreferencesPage.vue?bfd5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterEventsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue","webpack:///../../obico-server/frontend/src/components/printer-events/PrinterEventCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue?9147","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue?bc7d","webpack:///../../obico-server/frontend/src/views/PrinterEventsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterEventsPage.vue?5f91","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterEventsPage.vue?876a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterTerminalPage.vue","webpack:///../../obico-server/frontend/src/views/PrinterTerminalPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterTerminalPage.vue?831e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterTerminalPage.vue?a47e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue","webpack:///../../obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue?91f0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue?f765","webpack:///../../obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue?bf6b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue?07d9","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue?609f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue?048b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/lib/api.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/lib/agentAction.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/mixins/quickButtonsMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/mixins/messagesMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/mixins/slicingParamFixerMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue?f73f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue?a092","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue?0ae5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue?355e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/mixins/userNotificationMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue?80fe","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue?e674","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue?55b6","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue?27de","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue?e105","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue?87b6","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue?27e8","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue?e36b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/lib/api.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/lib/agentAction.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/mixins/quickButtonsMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/mixins/messagesMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/mixins/slicingParamFixerMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue?f495","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue?4b03","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue?ccd1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue?f33e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/mixins/userNotificationMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue?c4f3","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue?23a4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue?9746","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue?01ea","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue?9e41","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue?13b8","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/pages.js","webpack:///./src/views/PricingPage.vue","webpack:///./src/components/pricing/QuestionsSection.vue","webpack:///src/components/pricing/QuestionsSection.vue","webpack:///./src/components/pricing/QuestionsSection.vue?598d","webpack:///./src/components/pricing/QuestionsSection.vue?c985","webpack:///src/views/PricingPage.vue","webpack:///./src/views/PricingPage.vue?b0b0","webpack:///./src/views/PricingPage.vue?aa3b","webpack:///./src/views/ArchivedPrintersPage.vue","webpack:///src/views/ArchivedPrintersPage.vue","webpack:///./src/views/ArchivedPrintersPage.vue?ab1e","webpack:///./src/views/ArchivedPrintersPage.vue?da12","webpack:///./src/views/DetectiveHourCouponCodesPage.vue","webpack:///src/views/DetectiveHourCouponCodesPage.vue","webpack:///./src/views/DetectiveHourCouponCodesPage.vue?3775","webpack:///./src/views/DetectiveHourCouponCodesPage.vue?2a44","webpack:///./src/views/PublicTimelapsesPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintCard.vue","webpack:///../../obico-server/frontend/src/components/prints/PrintCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintCard.vue?4104","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintCard.vue?9280","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue","webpack:///../../obico-server/frontend/src/components/prints/FullScreenPrintCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue?104f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue?b32e","webpack:///src/views/PublicTimelapsesPage.vue","webpack:///./src/views/PublicTimelapsesPage.vue?4c7b","webpack:///./src/views/PublicTimelapsesPage.vue?22ea","webpack:///./src/views/TimelapseUploadPage.vue","webpack:///src/views/TimelapseUploadPage.vue","webpack:///./src/views/TimelapseUploadPage.vue?9bd0","webpack:///./src/views/TimelapseUploadPage.vue?7e64","webpack:///./src/views/WelcomePage.vue","webpack:///src/views/WelcomePage.vue","webpack:///./src/views/WelcomePage.vue?5732","webpack:///./src/views/WelcomePage.vue?99a8","webpack:///./src/views/CelestriusConfigurePage.vue","webpack:///src/views/CelestriusConfigurePage.vue","webpack:///./src/views/CelestriusConfigurePage.vue?09cf","webpack:///./src/views/CelestriusConfigurePage.vue?fa2d","webpack:///./src/views/partners/MintionRedeemPage.vue","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue","webpack:///src/views/partners/components/BttUserNotAuthenticatedModal.vue","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue?8f86","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue?730c","webpack:///src/views/partners/MintionRedeemPage.vue","webpack:///./src/views/partners/MintionRedeemPage.vue?a32d","webpack:///./src/views/partners/MintionRedeemPage.vue?d8d4","webpack:///./src/views/partners/BttRedeemPage.vue","webpack:///src/views/partners/BttRedeemPage.vue","webpack:///./src/views/partners/BttRedeemPage.vue?787e","webpack:///./src/views/partners/BttRedeemPage.vue?653f","webpack:///./src/views/partners/SovolRedeemPage.vue","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue","webpack:///src/views/partners/components/SovolUserNotAuthenticatedModal.vue","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue?1e7c","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue?773e","webpack:///src/views/partners/SovolRedeemPage.vue","webpack:///./src/views/partners/SovolRedeemPage.vue?412d","webpack:///./src/views/partners/SovolRedeemPage.vue?4cc6","webpack:///./src/views/partners/ThreeDORedeemPage.vue","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue","webpack:///src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue?25fd","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue?fe1d","webpack:///src/views/partners/ThreeDORedeemPage.vue","webpack:///./src/views/partners/ThreeDORedeemPage.vue?aa63","webpack:///./src/views/partners/ThreeDORedeemPage.vue?36c5","webpack:///./src/views/partners/KingroonPricingPage.vue","webpack:///./src/components/pricing/QuestionsKingroonSection.vue","webpack:///src/components/pricing/QuestionsKingroonSection.vue","webpack:///./src/components/pricing/QuestionsKingroonSection.vue?0261","webpack:///./src/components/pricing/QuestionsKingroonSection.vue?664d","webpack:///./src/components/KingroonNavBar.vue","webpack:///src/components/KingroonNavBar.vue","webpack:///./src/components/KingroonNavBar.vue?bfef","webpack:///./src/components/KingroonNavBar.vue?804a","webpack:///src/views/partners/KingroonPricingPage.vue","webpack:///./src/views/partners/KingroonPricingPage.vue?af80","webpack:///./src/views/partners/KingroonPricingPage.vue?6461","webpack:///./src/views/jusprin/JusPrinPricingPage.vue","webpack:///./src/views/jusprin/lib/jusprin_chargebee.js","webpack:///./src/views/jusprin/components/DowngradeConfirmation.vue","webpack:///src/views/jusprin/components/DowngradeConfirmation.vue","webpack:///./src/views/jusprin/components/DowngradeConfirmation.vue?c491","webpack:///./src/views/jusprin/components/DowngradeConfirmation.vue?31ff","webpack:///src/views/jusprin/JusPrinPricingPage.vue","webpack:///./src/views/jusprin/JusPrinPricingPage.vue?f581","webpack:///./src/views/jusprin/JusPrinPricingPage.vue?a0e5","webpack:///./src/pages.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/store/sliceSettingsStore.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/store/index.js","webpack:///./src/main.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterTerminalPage.vue?5eb2","webpack:///./src/views/ArchivedPrintersPage.vue?409a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/octopod.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SearchInput.vue?1dfa","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue?5d82","webpack:///./src/lib/consts.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/octoprint-plugin-guide/plugin_verification_code.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/klipper_logo.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/StreamingBox.vue?15a6","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/detached-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/bumpsAndRoughSurface-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DatePickerModal.vue?1b62","webpack:///../app_ent/static/img/partners/app-screenshot-7.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberSpinner.vue?6a50","webpack:///./src/components/pricing/QuestionsKingroonSection.vue?e5b0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue?3bed","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/StatsPage.vue?b650","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintShotFeedbackApp.vue?40a0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/TemperatureItem.vue?0f81","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/octoprint-plugin-guide/install_plugin.png","webpack:///../app_ent/static/img/partners/download-on-app-store.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue?242a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberInput.vue?cb87","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NavBar.vue?a220","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/DetectiveWorking.vue?b0c7","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SavingAnimation.vue?c602","webpack:///./src/lib/pricing.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/octoprint_logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterListPage.vue?6092","webpack:///./src/views/partners/ThreeDORedeemPage.vue?36d5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue?136d","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/octoprint-plugin-guide/moonraker_verification_code.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/detached-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue?48f9","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue?4bee","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/FileStructureItem.vue?5883","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue?784a","webpack:///./src/components/pricing/QuestionsSection.vue?3158","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue?8c85","webpack:///../app_ent/static/img/partners/app-screenshot-1.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue?f727","webpack:///../app_ent/static/img/partners/webcam-streaming.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?0d18","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/gaps-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/NewFolderModal.vue?78c4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/js/utils.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue?4fd2","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/PageLayout.vue?1c1b","webpack:///./src/lib/chargebee.js","webpack:///./src/components/pricing/ConfigureSubscription.vue?fd0f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/detective-working.gif","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintPage.vue?8ac9","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue?7a57","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/FilteringDropdown.vue?51df","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/vacation.gif","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue?0bbd","webpack:///./src/components/pricing/ConfigureSubscription.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberSpinner.vue","webpack:///../../obico-server/frontend/src/components/NumberSpinner.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberSpinner.vue?03f7","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/NumberSpinner.vue?9216","webpack:///src/components/pricing/ConfigureSubscription.vue","webpack:///./src/components/pricing/ConfigureSubscription.vue?487a","webpack:///./src/components/pricing/ConfigureSubscription.vue?a7d1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue?62d5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/PrintCard.vue?9b33","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SliderInput.vue?446c","webpack:///./src/views/WelcomePage.vue?af24","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue?203a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/bubbling-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue?6702","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/PageLayout.vue?e69f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/ActiveFilterNotice.vue?a227","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue?cabd","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/page-context.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/axios-csrf.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/g-codes/MoveModal.vue?115e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue?74a2","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue?0a11","webpack:///../app_ent/static/img/partners/full-remote-access.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrintHistoryPage.vue?050b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?e43a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/HelpWidget.vue?3baa","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/config/server-urls.js","webpack:///./src/config/server-urls.js","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue?992e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/printoid.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFilePage.vue?93af","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/print-padded.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/notifications/plugins lazy ^\\.\\/.*$ namespace object","webpack:///./src/views/partners/KingroonPricingPage.vue?7e19","webpack:///./src/views/partners/MintionRedeemPage.vue?c50e","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue?cc6a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/utils.js","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue?61d3","webpack:///./src/views/partners/SovolRedeemPage.vue?1ff0","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SavingAnimation.vue","webpack:///../../obico-server/frontend/src/components/SavingAnimation.vue","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SavingAnimation.vue?f2b1","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/SavingAnimation.vue?7fcf","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/LoadingPlaceholder.vue?60a4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/bumpsAndRoughSurface-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/notifications/plugins.js","webpack:///../app_ent/static/img/partners/compatible-with-favorite-software.png","webpack:///../app_ent/static/img/partners/mintion-obico-logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue?475a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/CollapsableDetails.vue?1bbb","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/webpage-multiple.svg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue?831a","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/img/mobileraker.webp","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/styles/main.sass?8c83","webpack:///./src/views/PublicTimelapsesPage.vue?554f","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/js/syndicate.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/static/js/color-scheme.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/lib/color-scheme-controller.js","webpack:///../app_ent/static/img/partners/sovol-obico-logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/VideoBox.vue?eabe","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/first-layer-review/example-images/raisedRipples-3.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue?3035","webpack:///./src/views/jusprin/JusPrinPricingPage.vue?5bd4","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/config/user-preferences/pref-routes.js","webpack:///./src/config/user-preferences/pref-routes.js","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/GCodeFoldersPage.vue?71de","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/GCodeDetails.vue?e1ce","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue?e43d","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/SharedPrinterPage.vue?96a5","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/views/PrinterListPage.vue?9442","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue?7749","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/MutedAlert.vue?7e97","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue?cf4b","webpack:////Users/kenneth/Projects/tsd-enterprise-release/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue?3f62","webpack:///../app_ent/static/img/partners/app-screenshot-6.webp","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue?1718","webpack:///../app_ent/static/img/partners/3do-obico-logo.png"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","getCurrentLanguage","savedLanguage","getLocalPref","lang","language","replace","currentLanguage","resources","translation","baseEn","entBaseEn","baseZhCN","entBaseZhCN","baseZhTW","entBaseZhTW","baseCa","entBaseCa","baseCs","entBaseCs","baseDe","entBaseDe","baseEs","entBaseEs","baseFr","entBaseFr","baseHu","entBaseHu","baseIt","entBaseIt","baseJa","entBaseJa","baseKo","entBaseKo","baseNl","entBaseNl","basePl","entBasePl","basePtBR","entBasePtBR","baseRu","entBaseRu","baseSv","entBaseSv","baseTr","entBaseTr","baseUk","entBaseUk","i18n","init","lng","fallbackLng","interpolation","escapeValue","debug","nsSeparator","prefId","defaultValue","printerId","storageKey","savedVal","isLocalStorageSupported","localStorage","getItem","val","JSON","parse","setLocalPref","setItem","render","_vm","this","_c","_self","_setupProxy","staticClass","attrs","_v","_s","$t","$syndicateText","brandName","staticRenderFns","directives","rawName","show","expression","class","highlighted","highlight","on","$event","positionWidget","_t","ref","xDirection","yDirection","showCloseButton","_e","id","scopedSlots","_u","fn","proxy","getDocUrl","require","ClickOutside","props","String","required","Boolean","default","textBefore","methods","$nextTick","_this$$refs$widget","_this$$refs$widget2","widgetWidth","$refs","widget","offsetWidth","widgetHeight","offsetHeight","minHorizontalSpace","minVerticalSpace","helpIconPosition","widgetWrapper","getBoundingClientRect","distanceFromRightEdge","innerWidth","left","width","distanceFromBottomEdge","innerHeight","top","height","component","openModalWithComponent","C","modalOptions","wrapper","Vue","h","$mount","swal","customClass","container","html","onBeforeOpen","el","querySelector","replaceWith","$el","onDestroy","$destroy","remove","openModalWithElement","element","install","options","use","VueSwal","Confirm","mixin","title","showCancelButton","confirmButtonText","cancelButtonText","Toast","toast","position","showConfirmButton","timer","Reject","icon","Prompt","DismissableToast","swalOpt","dismissKey","opt","log","$swal","filter","Math","floor","COMPONENT_NAME_REGEXP","ROOT_COMPONENT_NAME","ANONYMOUS_COMPONENT_NAME","splitPathRe","splitPath","filename","parts","exec","basename","path","ext","f","substr","getComponentName","vm","$root","$options","_componentTag","__file","unifiedFile","_","toUpperCase","build","to","from","prefix","depth","maxDepth","maxKeys","setup","defaultErrorHandler","config","errorHandler","info","Sentry","metadata","obj","_original","componentName","stringify","propsData","_oO","lifecycleHook","getCurrentHub","withScope","scope","setContext","captureException","util","warn","toString","_b","$attrs","syndicateAwareHref","computed","$syndicate","syndicateTextConstant","base","docRoot","appRoot","yumi","mintion","kingroon","jusprin","syndicate","store","routes","components","initTheme","setupSentry","VueRouter","BootstrapVue","Sticky","VueMoment","VuePluralize","OnoffToggle","LoadScript","I18NextVue","i18next","errorDialog","errorObj","userMessage","fire","$i18next","getAppUrl","router","beforeEach","next","changeLanguage","LoadingPlaceholder","SyndicateAwareSVG","library","add","faStar","faFileCode","faCalendarDays","faChartPie","faMoneyCheckDollar","faCircleQuestion","faBell","faCog","faDiscord","faRotateRight","faCirclePause","faCirclePlay","faCircleXmark","faPowerOff","faGear","faLayerGroup","faChevronDown","faRulerVertical","faCheck","FontAwesomeIcon","getElementById","app","moment","updateLocale","week","dow","user","printersToShow","isEnt","trialDaysLeft","platformDisplayName","wizardUrl","authorized","appDisplayName","is_pro","printerToAuthorize","$$selectedVal","Array","selected","map","_value","multiple","domProps","_l","printer","staticStyle","performingAuthRequest","authorize","logoutUrl","appLogo","platformLogo","loginUrl","signupUrl","humanizedDuration","durationInSeconds","seconds","round","getDurationComponents","days","hoursRounded","hours","minutes","duration","asDays","humanizedFilamentUsage","millimeters","meters","twoDecimal","timeFromNow","timeFormat","date","Date","newDate","setSeconds","getSeconds","format","gcodeMetadata","faIcon","formatter","formatters","svgIcon","v","TRANSIENT_STATES","fromStates","Starting","Pausing","Resuming","Cancelling","setPrinterTransientState","transientStateName","currentTime","timeOutInSeconds","isAgentVersionGte","getTime","getPrinterCalculatedState","underlinedState","_TRANSIENT_STATES$per","clearPrinterTransientState","persistedTransientState","calculatedState","includes","showTimeoutError","removeItem","localTransientState","newPrinterState","_window$Sentry","captureMessage","location","reload","toMomentOrNull","datetimeStr","PrintStatus","Printing","isActive","Paused","Finished","Cancelled","normalizedPrint","print","started_at","uploaded_at","finished_at","cancelled_at","ended_at","diff","asSeconds","has_alerts","alerted_at","printShotFeedbackEligible","printshotfeedback_set","status","paused_at","normalizedPrinter","g_code_file","normalizedGcode","gcode","created_at","updated_at","deleted","filesize","num_bytes","print_set","sort","a","b","last_print","failedPrints","successPrints","totalPrints","metadata_json","analysis","_gcode$analysis$dimen","filament_total","object_height","dimensions","estimated_time","estimatedPrintTime","filament","tools","keys","forEach","getBigThumbnailUrl","thumbnail1_url","thumbnail2_url","thumbnail3_url","getSmallThumbnailUrl","normalizedGcodeFolder","folder","numItems","g_code_file_count","g_code_folder_count","newData","oldData","printerMixin","createdAt","progressCompletion","isOffline","isPaused","isDisconnected","flags","operational","ready","paused","inTransientState","endsWith","_this$status","_this$status$state","state","text","calculatedStateColor","calcState","colorMapping","secondary","success","neutral","warning","danger","color","states","entries","setTransientState","stateText","inUserInteractionRequired","hasError","toLowerCase","isAgentMoonraker","agentDisplayName","minOctoPrintAgentVersion","minMoonrakerAgentVersion","semverGte","alertUnacknowledged","isAfter","isPrintable","archived_at","printabilityText","normalizedPrinterEvent","printerEvent","printers","encodeURIComponent","pathname","search","appName","URLSearchParams","platform","_this$user","_this$user$subscripti","subscription","plan_id","expired_at","octopodLogo","printoidLogo","polymerLogo","octoappLogo","mobilerakerLogo","genericAppLogo","isKlipper","klipperLogo","octoprintLogo","created","IS_ENT","settings","fetchPrinters","axios","urls","response","post","tunnels","app_name","target_printer_id","tunnelEndpoint","tunnel_endpoint","redirectUrl","catch","isPro","usageFetched","showDetails","daysUntilReset","usageClass","usageMTD","humanizedUsageCap","overage","percentage","iframeUrl","bytesMTD","usageCap","endOfMonth","endOf","split","pop","mounted","skipWarning","input","inputPlaceholder","isConfirmed","matchMedia","classList","self","fetchUsage","firstFetch","tunnelUsage","resp","total","monthly_cap","setInterval","access_consented_at","onNextShot","page","pageClass","shots","shot","onShotChanged","onPrev","onNext","consentBtnPressed","image_url","updateShot","model","answer","callback","$$v","_m","$emit","BFormGroup","BFormRadioGroup","put","printShotFeedback","print_id","instance","credited_dhs","collapsed","inMobileWebView","isPopup","active","hasUnseenPrinterEvents","unseenPrinterEventsDisplay","$slots","topBarLeft","topBarRight","hideHeader","allowSignUp","urlParams","num","ACCOUNT_ALLOW_SIGN_UP","staticAlert","style","paddingBottom","estimatedFeedbackTime","consentChecked","isArray","_i","$$a","$$el","$$c","checked","$$i","concat","fromNow","video_url","poster_url","playerOptions","onTimeUpdate","downloadBtn","fullscreenBtn","exitFullscreenBtn","videoPlayer","videoUrl","posterUrl","fluid","autoplay","defaultFullScreenToggle","muted","preload","playbackRates","fill","sources","controlBar","fullscreenToggle","poster","VideoBox","DetectiveWorking","humanize","FocusedFeedbackConsent","Loading","PrintShotCard","VueSlickCarousel","PageLayout","currentShot","fetchData","printId","sortBy","updatePrint","patch","findIndex","$set","carousel","shotIndex","prev","answered_at","allPrintsSelected","selectedPrintIds","size","onDeleteBtnClick","sortingLocalStoragePrefix","sortingOptions","sortingValue","onSortingUpdated","filterLocalStoragePrefix","filterOptions","filterValues","filterUpdateMixin","onFilterUpdated","expandable","resetFilters","prints","loading","stats","total_print_count","total_succeeded_print_count","total_cancelled_print_count","totalPrintTimeFormatted","totalFilamentUsedFormatted","index","has","onSelectedChanged","fetchMoreData","noMoreData","onDatesPicked","menuExpanded","menuOptions","option","onClick","stopPropagation","preventDefault","customMenuOptionClass","resetMenuExpanded","menuOption","sorting","nativeOn","updateSorting","visibility","sortingDirections","direction","SortingDirections","localStoragePrefix","restoreSortingValue","sortingKey","directionKey","find","values","updateFiltering","filterOptionKey","filterValueKey","includesAll","subtitle","Function","filterOption","filterValue","currentFilterValue","newFilterValue","_filterOption$values$","restoreFilterValues","allOption","getFilterParams","customFilterParamsBuilder","params","buildQueryParam","customParams","queryParam","shouldShowFilterWarning","activeFilters","selectable","isSelected","fileName","backgroundImage","Number","watch","newValue","handleOk","resetModal","focusInput","handleSubmit","arguments","dateFrom","dateTo","errorMessage","isOpen","initDateFrom","initDateTo","$bvModal","select","close","hide","bvModalEvent","DateParamFormat","queryBuilder","customDateFrom","customDateTo","from_date","getDateFrom","to_date","getDateTo","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","today","firstDayOfWeek","setDate","getDate","getDay","firstDayOfMonth","getFullYear","getMonth","firstDayOfYear","date_joined","lastDayOfWeek","lastDayOfMonth","lastDayOfYear","getRecommendedGrouping","fromDate","toDate","PAGE_SIZE","SortingLocalStoragePrefix","SortingOptions","FilterLocalStoragePrefix","FilterOptions","timePeriod","printStatus","feedbackNeeded","MugenScroll","CascadedDropdown","DatePickerModal","SortingDropdown","FilteringDropdown","ActiveFilterNotice","PrintHistoryItem","HelpWidget","Set","total_print_time","_this$stats","total_filament_used","defaultStatsParams","group_by","set","updateCustomPeriodFilterSubtitle","with_archived","validPrinterIds","refetchData","start","limit","fetchStats","selectedPrintIdsClone","delete","userAction","printsBulkDelete","print_ids","filterOptionValue","getCurrentDateFrom","getCurrentDateTo","datePickerModal","newTitle","dateFormat","currentDateFrom","currentDateTo","dateFromFormatted","dateToFormatted","filteringDropdown1","$forceUpdate","filteringDropdown2","groupingOptions","grouping","updateChartGrouping","activeGrouping","groupingAdjusted","groupingNotice","longest_print_time","average_print_time","DonutChart","x","y","totalValue","totalValueFormat","innerRadius","min","outerRadius","labelRadius","names","colors","stroke","strokeWidth","strokeLinejoin","padAngle","emptyState","N","d3","V","I","isNaN","formatValue","O","T","arcs","arc","arcLabel","svg","attr","append","selectAll","join","centroid","lines","endAngle","startAngle","formatTotalValue","assign","node","scales","BarChart","marginTop","marginRight","marginBottom","marginLeft","xDomain","xRange","xLabelShow","xLabelRotation","yType","yDomain","yRange","yTicks","xPadding","yFormat","yTickFormat","yLabel","X","Y","xScale","padding","yScale","xAxis","tickSizeOuter","yAxis","ticks","tickFormat","g","clone","bar","bandwidth","each","xAxisLabelsFormat","wrapperWidth","barsCount","lastDayInDataset","barWidth","horizontalLabelRequiredWidth","rotatedLabelRequiredWidth","frequency","rotation","ceil","firstLine","secondLine","endOfWeek","isBefore","month","label","uniqueDateKey","shouldShow","async","fetchPrintStats","groupings","requestedGrouping","effectiveGrouping","_error$response","_error$response$data","_error$response2","_error$response3","_error$response3$data","suggestedGrouping","suggested_group_by","indexOf","GroupingLocalStorageKey","MutedAlert","effectiveGroupingTitle","_this$groupingOptions","getActiveGrouping","isEmptyState","finishedPrintsPercentage","_this$stats2","_this$stats3","finished","cancelledPrintsPercentage","_this$stats4","_this$stats5","addEventListener","drawCharts","unmounted","removeEventListener","getFilterParamsFromQuery","excludeParams","with_deleted","totalPrintsDonutChart","replaceChildren","printCountMaxValue","max","print_count_groups","drawBarChart","printCountGroupsChart","titleValue","printTimeMaxValue","print_time_groups","printTimeMaxvalueHours","printTimeGroupsChart","filamentUsedMaxValue","filament_used_groups","filamentUsedMaxvalueMeters","filamentUsedGroupsChart","chartWidth","xLabelsFormat","isLoading","currentIndex","prevPrint","switchToPrint","PrevPrintButtonTitle","absoluteDateFormat","nextPrint","NextPrintButtonTitle","filament_used","canOpenFile","url","onRepeatPrintClicked","isSending","firstLayerInspection","gradeResult","gradeAccent","gradeTitle","firstLayerPrintTime","onOpenDetailedReport","fullscreenUrl","tagged_video_url","aiTimeLapsePosterImageUrl","fullscreen","enterFullscreen","exitFullscreen","download","downloadFile","video_archived_at","canShowDetectiveView","prediction_json_url","normalizedP","thumbedUp","onThumbUpClick","inflightAlertOverwrite","thumbedDown","onThumbDownClick","need_print_shot_feedback","titleColor","titleText","computedOptions","RadialGauge","isWatching","inactiveColor","highlight1","currentThemeValue","Themes","Light","highlight2","highlight3","needle","valueDec","valueInt","units","box","minValue","maxValue","majorTicks","minorTicks","highlights","colorPlate","colorTitle","colorStrokeTicks","colorNeedleEnd","colorNeedle","colorNeedleShadowUp","valueBox","animationRule","animationDuration","animatedValue","ticksAngle","borders","level","PrinterCommManager","constructor","printerCommMap","Map","setPrinterComm","printerComm","getPrinterComm","getOrCreatePrinterComm","PrinterComm","closeConnection","closeServerWebSocket","webrtcConnections","webrtc","closeAllConnections","token","printerCommManager","wsUri","callbacks","ws","passthruQueue","ifvisible","closeWebSocket","connect","onPassThruReceived","msg","refId","ret","onTerminalFeedReceived","terminal_feed","printer_event","event_class","event_title","event_text","isDismissed","dismiss","onOpenCallback","readyState","WebSocket","OPEN","protocol","host","onmessage","passthru","onPrinterUpdateReceived","onopen","ensureWebsocketClosed","heartbeat","setWebRTCConnection","webcamName","parseJsonData","jsonData","onStatusReceived","callbacksFuncs","onData","maybeBin","toArrayBuffer","arrayBuffer","pako","ungzip","Uint8Array","setCallbacks","passThruToPrinter","canSend","random","dataChannelWebrtc","sendData","send","onclose","ev","freeze","listPrinterLocalGCodesOctoPrint","searchKeyword","listRecoursively","fileObj","fileList","item","children","kwargs","recursive","func","folders","files","local","ObicoUpload","items","display","listPrinterLocalGCodesMoonraker","pathPrefix","extended","dirsInServerFormat","dirname","startsWith","modified","filesInServerFormat","printPrinterLocalGCodeOctoPrint","args","printAfterSelect","printPrinterLocalGCodeMoonraker","verb","repeatPrinterLocalGCode","getMoonrakerWebcams","webcams","requestSnapshot","pic","confirmPrint","imageUrl","reverseButtons","printCloudGCode","safe_filename","sendToPrint","isCloud","Swal","onCommandSent","onPrinterStatusChanged","printerWebSocket","printGCode","checkPrinterStatus","REDIRECT_TIMER","showRedirectModal","onClose","timerInterval","onOpen","htmlContainer","getHtmlContainer","timerElement","textContent","getTimerLeft","toFixed","clearInterval","fileDetailsToShow","compact","compactView","showThumbnail","bigThumbnailUrl","file","showOpenButton","openButtonVariant","openButtonText","numberOfVisibleLines","shouldShowDataNotice","expanded","rotated","CollapsableDetails","showPrintStats","unshift","showIconThumbnail","fileUploadedTime","grade","gradeRemarks","isGradeA","gradeSuggestion","suggestion","images","showCarouselAnimation","first_layer_info","carouselItems","dots","infinite","speed","slidesToShow","slidesToScroll","adaptiveHeight","initialSlide","activeTab","carouselKey","activeThumbnail","thumbnailStyle","zIndex","_this$firstLayerInspe","firstLayerInfo","handler","prepareFirstLayerInfo","immediate","calculateGrade","score","FailureDetectionGauge","GCodeDetails","image","isFirstLayerReportModalOpen","predictions","currentPosition","currentPrint","printerStateCheckInterval","resident_printer","currentPrintId","_this$currentPrint","indexParam","parseInt","getNormalizedP","alert_overwrite","_this$printer","printerState","fetchSiblingPrints","clearPreviousData","printResponse","prepareFirstLayerReport","firstlayerinspection_set","finally","firstLayerInspectionData","newUrl","history","replaceState","prevExists","alertOverwrite","_this$print$g_code_fi","FirstLayerReportModal","dhBadgeNum","mobileMenuOptions","visiblePrinters","onPrinterUpdated","shouldShowArchiveWarning","archivedPrinterNum","_f","handleNeverShowAgain","hasCurrentPrintFilename","current_print","statusClass","statusText","onSharePrinter","octoPrintTunnelUrl","settingsUrl","isProAccount","webcam","onNotAFailureClicked","overlay","not_watching_reason","normalized_p","sendPrinterAction","pressed","section_toggles","onSettingsToggleClicked","time","onTimeToggleClicked","statusTemp","onStatusTempToggleClicked","watchForFailures","onWatchForFailuresToggled","pauseOnFailure","onPauseOnFailureToggled","timeRemaining","timeTotal","progressPct","tempProps","onTempEditClicked","Janus","sessions","isExtensionEnabled","navigator","mediaDevices","getDisplayMedia","userAgent","match","chromever","maxver","extension","isInstalled","defaultExtension","extensionId","getScreen","pending","cache","postMessage","origin","sourceId","gatewayCallbacks","noop","wsopened","destroyed","initDone","isWebrtcSupported","server","websockets","wsHandlers","wsKeepaliveTimeoutId","servers","serversIndex","iceServers","iceTransportPolicy","bundlePolicy","ipv6Support","ipv6","withCredentials","maxev","max_poll_events","apisecret","destroyOnUnload","keepAlivePeriod","longPollTimeout","getMaxBitrates","simulcastMaxBitrates","maxBitrates","high","medium","low","connected","sessionId","pluginHandles","that","retries","transactions","eventHandler","longpoll","httpAPICall","handleEvent","textStatus","errorThrown","json","skipTimeout","session_id","sender","pluginHandle","candidate","webrtcStuff","pc","remoteSdp","completed","addIceCandidate","endOfCandidates","candidates","webrtcState","hangup","detached","ondetached","detach","mediaState","slowLink","reason","transaction","reportSuccess","plugindata","jsep","vdebug","keepAlive","randomString","createSession","eventName","newWebSocket","body","getInfo","destroySession","unload","notifyDestroyed","cleanupHandles","handleId","destroyHandle","noRequest","sendBeacon","unbindWebSocket","onUnbindMessage","onUnbindError","createHandle","consentDialog","iceState","onlocalstream","onremotestream","ondata","ondataopen","oncleanup","plugin","opaqueId","handleToken","session","started","myStream","streamExternal","remoteStream","mySdp","mediaConstraints","dataChannel","dtmfSender","trickle","iceDone","volume","bitrate","bsnow","bsbefore","tsnow","tsbefore","getId","getPlugin","getVolume","getRemoteVolume","getLocalVolume","isAudioMuted","isMuted","muteAudio","mute","unmuteAudio","isVideoMuted","muteVideo","unmuteVideo","getBitrate","sendMessage","dtmf","sendDtmf","createOffer","prepareWebrtc","createAnswer","handleRemoteJsep","prepareWebrtcPeer","ontrackmuted","ontrackunmuted","sendRequest","cleanupWebrtc","sdp","e2ee","rid_order","sendTrickleCandidate","createDataChannel","dclabel","dcprotocol","incoming","pendingData","onDataChannelMessage","onDataChannelStateChange","dcState","onDataChannelError","dcoptions","ordered","dataChanDefaultLabel","senders","getSenders","audioSender","track","kind","ontonechange","tone","tones","gap","insertDTMF","streamsDone","media","stream","stopAllTracks","getAudioTracks","getVideoTracks","addTracks","update","replaceAudio","replaceVideo","isAudioSendEnabled","addAudio","addTrack","unifiedPlan","audioTransceiver","transceivers","getTransceivers","receiver","replaceTrack","isVideoSendEnabled","addVideo","videoTransceiver","pc_config","webRTCAdapter","browserDetails","browser","version","pc_constraints","optional","rtcConstraints","RTCRtpSender","createEncodedStreams","createEncodedAudioStreams","createEncodedVideoStreams","senderTransforms","receiverTransforms","RTCPeerConnection","getStats","oniceconnectionstatechange","iceConnectionState","onicecandidate","sendSDP","sdpMid","sdpMLineIndex","ontrack","streams","onended","receiverStreams","createAudioEncodedStreams","readableStream","writableStream","pipeThrough","pipeTo","readable","writable","trackMutedTimeoutId","removeTrack","onmute","onunmute","simulcast2","getTracks","tr","addTransceiver","sendEncodings","rid","maxBitrate","scaleResolutionDownBy","senderStreams","isDataEnabled","ondatachannel","channel","oldsdp","pattern","newsdp","setRemoteDescription","offer","webrtcError","audio","video","isTrickleEnabled","keepAudio","removeAudio","audioSend","keepVideo","removeVideo","videoSend","addData","at","stop","ra","asnd","vt","rv","vsnd","isGetUserMediaAvailable","constraints","mandatory","audioSupport","videoSupport","simulcast","screenshareFrameRate","frameRate","screenshareHeight","screenshareWidth","captureDesktopAudio","getUserMedia","audioStream","callbackUserMedia","getScreenMedia","gsmCallback","useAudio","googLeakyBucket","maxWidth","screen","maxHeight","minFrameRate","maxFrameRate","chromeMediaSource","googTemporalLayeredScreencast","chromeMediaSourceId","mozMediaSource","mediaSource","lastTime","polly","enumerateDevices","devices","audioExist","some","device","videoExist","isScreenSendEnabled","needAudioDevice","isAudioSendRequired","needVideoDevice","isVideoSendRequired","haveAudioDevice","haveVideoDevice","gumConstraints","customizeSdp","audioRecv","isAudioRecvEnabled","setDirection","videoRecv","isVideoRecvEnabled","iceRestart","sendVideo","parameters","getParameters","encodings","setParameters","mungeSdpForSimulcasting","setLocalDescription","offerToReceiveAudio","offerToReceiveVideo","OfferToReceiveAudio","OfferToReceiveVideo","localDescription","sdpSent","remote","res","remoteSource","audioLevel","enabled","inStats","mediaType","bytesReceived","googCodecName","fps","framesPerSecond","timestamp","timePassed","bitRate","hangupRequest","ssrc","ssrc_fid","cname","msid","mslabel","insertAt","mline","sim","fid","failIfNoAudio","failIfNoVideo","getServer","isConnected","reconnect","getSessionId","destroy","attach","useDefaultDependencies","deps","fetch","socketCls","proto","arr","adapter","fetchOptions","method","headers","credentials","fetching","timerId","race","ok","parsed","useOldDependencies","jq","jQuery","payload","contentType","xhrFields","ajax","extend","dataType","xhr","tracks","mst","trace","usedDependencies","dependencies","listDevices","attachMediaStream","srcObject","URL","createObjectURL","reattachMediaStream","iOS","oldOBF","safariVp8","getCapabilities","codecs","codec","mimeType","testpc","RTCRtpTransceiver","tempPc","len","charSet","randomPoz","substring","printerWebRTCUrl","printerSharedWebRTCUrl","authToken","_syndicate","turnServer","turn_server","credential","username","WebRTCConnection","streamMode","streamIdToTest","h264Webrtc","mjpegWebrtc","H264WebRTCConnection","MJpegWebRTCConnection","initialized","h264WebRTCConn","mjpegWebRTCConn","openForShareToken","shareToken","openForPrinter","disconnect","janus","stopStream","startStream","streamIdsToTest","baseConnection","BaseWebRTCConnection","infoSuccessCallback","streamId","streaming","mjpegStreamExisting","onStreamAvailable","onRawData","rawData","onMJpegData","_baseConnection$strea","channelOpen","offer_video","videoStreamExisting","_baseConnection$strea2","clearBitrateInterval","bitrateInterval","onBitrateUpdated","DataChannelOnlyWebRTCConnection","dataStreamExisting","connectJanusWebSocket","onMessage","onRemoteStream","onTrackMuted","onTrackUnmuted","uplink","lost","onSlowLink","onDefaultStreamCleanup","_self$streaming","_self$streaming2","_self$streaming3","_self$streaming4","_self$streaming5","_self$streaming6","slowLinkLoss","slowLinkClicked","fixSlowLinkTextWidth","slowLinkShowing","slowLinkHiding","showing","hiding","trackMuted","showMutedStatusDescription","isVideoAvailable","isBasicStreamingReadyToPlay","isBasicStreamingFrozen","onPlayBtnClicked","remainingSecondsUntilNextCycle","videoLoading","taggedSrc","showMJpeg","showVideo","isBasicStreamingInProgress","currentBitrate","clickable","onInfoClicked","remainingSecondsCurrentVideoCycle","webcamStyle","mjpgSrc","onLoadStart","onCanPlay","onRotateRightClicked","ViewingThrottle","countDownCallback","localStorageItemId","remainingSeconds","countDownTimer","startOrResumeVideoCycle","countDown","resumeVideoCycle","updateRemainingSeconds","remainingViewableSeconds","tsNextVideoCycle","parseFloat","now","MJpegStreamDecoder","onFrame","contentLength","NaN","imageBuffer","bytesRead","originalJpgLength","TextDecoder","decode","jpg","jpgLength","lengthHeaders","halfHeight","_this$webcam","stickyStreamingSrc","isVideoVisible","localStorageRotationKey","stream_id","customRotationDeg","videoRotationDeg","_this$webcam2","webcamVideoHeight","ratio169","_this$webcam3","is_primary_camera","basicStreamingInWebrtc","_this$webcam$flipH","_this$webcam4","_this$webcam$flipV","_this$webcam5","_this$videoRotationDe","_this$webcam6","_this$webcam7","output","transform","generateTransform","flipH","flipV","aspectRatio","streamRatio","scale","mjpegStreamDecoder","videoLimit","initWebRTC","onWebRTCRemoteStream","onMJpegChunk","webrtcConn","videoTracks","getComputedStyle","slowLinkText","loss","flip_horizontal","flip_vertical","transforms","trimStart","valid","printing","showHours","showMinutes","showSeconds","temperatures","isPluginVersionSufficient","onEditClicked","editable","tempKey","tempItem","heaterIcon","temperatureDisplayName","actual","TemperatureItem","onPresetChanged","preset","allPresets","pre","maxTemp","onSliderChanged","composing","step","SliderInput","presets","curTarget","curPreset","sharedResource","onSharingToggled","sharedLink","copyToClipboard","copyStatus","copyMessage","share","share_token","fetchSharedResources","sharedResources","printer_id","postSharedResources","deleteSharedResources","focus","execCommand","insideCard","onPauseToggled","onCancelClicked","openObicoFiles","openPrinterFiles","connecting","onConnectClicked","modalId","resetGcodesModal","selectedGcodeId","fileId","printerFiles","on-close","goBack","scrollToTop","parentFolder","savedPath","openFile","allSelected","toggleSelectAll","selectedItemsCount","moveSelectedItems","deleteSelectedItems","updateSearch","createFolder","switchToCloudStorage","click","switchToPrinterStorage","selectedPrinterId","isPrinterBrowsable","printerBrowsabilityText","onMenuOptionClicked","cascadedDropdown","dropzoneOptions","gcodeUploadSuccess","gcodeUploadError","addParentFolderParam","maxFilesize","maxTotalFilesize","searchStateIsActive","searchInProgress","targetPrinter","nothingFound","scrollContainerId","noMoreFolders","noMoreFiles","localFilesLoading","openFolder","renameItem","moveItem","deleteItem","onPrintClicked","fetchFilesAndFolders","onSelectFiles","onSelectFolders","activeItem","verifyItemRename","onItemRenamed","activeItems","onItemMoved","onItemDeleted","verifyNewFolder","onFolderCreated","newFolderName","preConfirm","parentFolderId","newFolder","gcodeFolders","parent_folder","newItemName","itemType","fullName","fileExt","nameWithoutExt","newNameWithExt","gcodeFile","gcodeFolder","isSameDir","patchLoading","disabledItems","isMoveModal","isFolder","selectedFolders","selectedFiles","isFolderEmpty","disabled","isDisabled","cancelled","FileStructureItem","selectedItemsCopy","unselectAll","GCodeFileStructure","itemParentFolderId","currentFoldersPage","currentFilesPage","resetFiles","reset","_response","_response2","page_size","folderKey","results","gcodeFolderBulkMove","folder_ids","gcodeFileBulkMove","file_ids","msgBoxConfirm","centered","okTitle","okVariant","autoFocusButton","MAX_USER_MESSAGE_LENGTH","MAX_SENTRY_MESSAGE_LENGTH","isObject","truncate","maxLength","normalizeWhitespace","trim","looksLikeHtml","test","decodeHtmlEntities","textarea","innerHTML","stripHtml","extractHtmlTitle","_value$match","getHeader","getResponseHeader","_error","getResponseText","responseText","getStatus","parseJson","safeString","flattenApiErrors","directValue","flatMap","detail","sanitizeUserMessage","userMessageFromApiBody","errors","defaultUploadErrorMessage","fallbackMessageForStatus","defaultMessage","normalizeDropzoneUploadError","jsonBody","htmlResponse","isHtmlResponse","responseTitle","responseSnippet","dropzoneMessage","fileSize","getDropzoneUploadErrorMessage","SEARCH_API_CALL_DELAY","SearchInput","vueDropzone","vue2Dropzone","RenameModal","MoveModal","DeleteConfirmationModal","NewFolderModal","routeParams","csrf","searchQuery","searchTimeoutId","selectedPrinterComm","itemsCount","selectedPrinter","acceptedFiles","gcodeFiles","getCsrfFromDocument","getRouteParam","$watch","$route","toParams","previousParams","gCodeFileStructure","moveModal","selectedFolderIds","selectedFileIds","gcodeFolderBulkDelete","gcodeFileBulkDelete","$router","browsabilityMinPluginVersion","listPrinterLocalGCodes","decodeURIComponent","sortLocalItems","printLastUploadedFile","fetchLocalFiles","_response3","_response4","q","_response5","formData","printAfterUpload","gcodesDropzone","getAcceptedFiles","getRejectedFiles","removeAllFiles","renameModal","newName","targetArr","deleteConfirmationModal","newFolderModal","menuOptionKey","newFolderId","compareValues","av","bv","localeCompare","sensitivity","cmp","an","bn","canDownloadGcode","downloadGcode","renameFile","deleteFile","dropdownMenuOptions","gcodeNotFound","isDeleted","targetPrinterId","onRefresh","printersLoading","selectPrinter","printerComms","_this$selectedPrinter","chat","showChatHistory","userFeedback","submitFeedback","showTextFeedback","textFeedback","submitFeedbackText","messages","role","content","changedParams","VueMarkdown","_message$slicing_prof","_message$slicing_prof2","_message$slicing_prof3","_message$slicing_prof4","_message$slicing_prof5","slicing_profiles","filament_overrides","print_process_overrides","gCodeFileId","fetchChat","thumbsUp","_this$chat","user_feedback","thumbsDown","_this$chat2","jusprinChats","_this$chat3","g_code_file_id","feedback","user_feedback_text","_this$chat4","JusPrinChatHistory","availablePrinters","JusprinFeedback","_this$gcode","_this$gcode2","_this$gcode3","fetchPrinter","gcodeId","fetchGcode","decodedPath","dir_path","getPrinterLocalGCode","_result$files","hash","safeFilename","agent_signature","gcodeFileOnServer","cloudCopy","_file","_file2","fetchLocalFile","go","fileUrl","blob","link","revokeObjectURL","selectedPort","connectionOptions","ports","port","selectedBaudrate","baudrates","baudrate","PAUSE_PRINT","RESUME_PRINT","CANCEL_PRINT","WidgetTemplate","GCodeFoldersPage","GCodeFilePage","connectBtnClicked","openFiles","scrollTo","ConnectPrinter","MUTE_CURRENT_PRINT","ACK_ALERT_NOT_FAILED","Show","Hide","LocalPrefNames","Settings","Time","StatusTemp","StreamingBox","DurationBlock","PrintJobControlWidget","toDuration","secondsLeft","secs","secondsPrinted","watching_enabled","action_on_failure","actionsProps","_data$settings","updatedPrinter","_data$settings2","stream_mode","auth_token","printerStatus","octoprint_data","resumePrint","updatePrinter","tempProfiles","TempTargetEditor","targetTemp","succeeded","printerAction","shouldVideoBeFull","hasImage","shouldBeThumb","asHours","SharePrinter","PrinterCard","is_dh_unlimited","dh_balance","reverse","hiddenPrinterCount","insertPrinter","shouldShowArchiveWarningFunc","shouldNeverShow","_vm$printer","_vm$printer$pic","_vm$printer2","_vm$printer2$pic","_vm$printer3","_vm$printer3$pic","img_url","theme","themes","Dark","showMainMenu","viewName","first_name","email","hideDropdowns","accountDropdown","NavBar","videoAvailable","isWebrtcOpened","printerSharedWebSocket","_this$printer$setting","_this$printer2","_this$printer2$settin","webcamsDeepCopy","errorMessages","saving","action_on_failure_NONE","_q","updateSetting","action_on_failure_PAUSE","tools_off_on_pause","bed_off_on_pause","retract_on_pause","retractFilamentByEnabled","retractOnPause","lift_z_on_pause","liftExtruderByEnabled","liftExtruderBy","detective_sensitivity","sensitivityTooltipFormatter","detectiveSensitivity","timelapseOnFinishEnabled","timelapseOnCancelEnabled","min_timelapse_secs_on_finish","minTimelapseMinutesOnFinish","min_timelapse_secs_on_cancel","minTimelapseMinutesOnCancel","printerWizardUrl","archivePrinter","deletePrinter","disable","inputValue","opacity","unit","SavingAnimation","NumberInput","VueSlider","delayedSubmit","delay","timeoutId","printerWizard","printerName","oldValue","changeRetractOnPause","changeLiftExtruderBy","patchPrinter","propName","propValue","inputElem","getSettingsItemInput","setSavingStatus","non_field_errors","errorAlert","settingsItem","delayInfo","chosenDeviceId","discoveryEnabled","canStartLinking","discoveredPrinters","discoveredPrinter","device_id","autoLinkPrinter","discoveryCount","targetOctoPrint","useLegacyVerificationCode","verificationCode","copied","timeToExpire","zoomIn","targetKlipper","showVerificationCodeHelpModal","oneTimePasscode","oneTimePasscodeStatus","oneTimePasscodeChanged","back","onPrinterLinked","posthog","capture","agent","rpi_model","machine_type","host_or_ip","hostname","octopi_version","os","linking","cancel","switchToManualLinking","secretObtained","gotWindowMessage","beforeDestroy","gotSecret","obicoDiscoveryPopup","open","destUrl","closeDiscoveryPopup","pluginName","switchToManual","device_secret","done","DiscoveredPrinter","PrinterProgress","verifiedPrinter","apiCallIntervalId","printerIdToLink","query","expiryMoment","_this$verificationCod","_this$discoveredPrint","targetPlatform","getVerificationCode","discoverPrinter","oneTimePasscodes","one_time_passcode","verification_code","verificationCodeUrl","baseUrl","verified_at","callVerificationCodeApi","toggle","callPrinterDiscoveryApi","printerDiscovery","AutoLinkPopup","secret","allowOutsideClick","devicesWithObicoPreInstalled","targetPlatformClicked","brand","printerItem","targetKlipperPreInstall","targetKlipperGeneric","goForward","printer_name","updatePrinterName","redirectToTunnelCreation","editPrinterUrl","widgets","isWidgetVisible","lastPrint","onSendPrinterAction","onUpdateSettings","onReorderClicked","selectedWebcam","chooseWebcam","isWebcamSelected","deg","handleRotateRightClicked","isPrinting","printProgressPercentage","layerProgress","finishingAt","DATE_TIME_FORMAT","timeElapsed","mmProgress","isPrintStarting","onRepeatClicked","startedAt","extraVisible","_this$print","_this$printer$status","_this$printer$status2","_this$printer$status3","_this$printer$status4","_this$printer$status5","progressInMillimeters","progressMillimeters","currentZ","totalMillimeters","file_metadata","printingArea","maxZ","_this$printer$status6","_this$printer$status7","_this$printer$status8","_this$printer$status9","progressInLayers","progressLayers","currentLayerHeight","totalLayers","obico","totalLayerCount","_this$printer$status$","_this$printer$status10","_this$printer$status11","progress","printTime","_this$printer$status$2","_this$printer2$status","_this$printer2$status2","printTimeLeft","updatePrintProgress","deep","toggleZHeightProgressType","preferZHeightProgressInLayers","_this$printer$status12","_this$printer$status13","_this$printer$status14","_this$printer$status15","_this$printer$status16","elapsed","printProgressMillimeters","printMillimetersTotal","enableFailureDetection","onFailureDetectionToggled","notWatchingExplanation","settingName","settingValue","onTemperaturePresetsClicked","currentPreset","agentName","handleSetTemp","TempPresets","_result$value","applyTempPreset","profile","presetObj","presetName","bed","extruder","chamber","toolName","temp","activeMenu","hideTunePrinter","xyzJogDistance","xyzControl","axis","directions","down","up","xy","home","z","homeAll","disableSteppers","showExtrudeControl","extrudeJogDistance","handleFilament","filamentDirections","retract","extrude","showToolsSelector","activeTool","activeToolTemperature","activeToolDisplayName","activeToolActualTemperature","activeToolTargetTemperature","zOffsetJogDistance","controlZOffset","currentZOffset","currentFeedRate","customFeedRateFactor","setPrintSpeed","currentFlowRate","customFlowRateFactor","setFlowRate","currentFanSpeed","customFanSpeed","setFanSpeed","AXIS","xyz","DIRECTIONS","FILAMENT_DIRECTIONS","extruders","_this$activeToolTempe","prevValue","toolKeys","getCurrentZOffset","onEscape","keyCode","$once","moonrakerPayload","offset","gcode_move","homing_origin","cleanOffset","octoPayload","currentToolTemp","toolNum","changeAmount","commandScript","octoVal","moonrakerVal","force","sendCommandToPrinter","command","onError","onSuccess","dragging","currentItems","getTitle","toggleItemEnabled","draggable","extraInfo","newVal","oldVal","saveNewOrder","sortingConfig","fullScreenHeight","showFullScreenOpt","feedIsOn","canToggleFeed","toggleTerminalPower","clearFeed","updateFilterPrefs","hideTempMessages","hideSDMessages","hideGCodeMessages","hideOKMessages","terminalFeedArray","_k","feed","normalTimeStamp","TerminalFeedView","oldTerminalFeed","onNextTerminalFeed","terminalSetup","hideTempPref","hideSDPref","hideOKPref","hideGCodePref","newTerminalFeed","_this$oldTerminalFeed","_this$oldTerminalFeed2","sameMsg","same_ts","_ts","newMsg","tempRegex","SDRegex","gCodeRegex","newString","str","PrinterTerminal","display_status","onDisplayClear","availablePowerDevices","togglePower","batchPowerControl","powerDevices","getPowerDevices","action","WIDGETS","PrintProgressWidget","FailureDetectionWidget","TemperatureWidget","PrinterControlWidget","PowerControlWidget","TerminalWidget","DisplayStatusWidget","lastPrintFetchCounter","widgetsConfig","preferredWebcam","customRotationData","configItem","w","_this$printer$setting2","webcam_rotation","_newValue$current_pri","_oldValue$current_pri","restoreWidgets","fetchLastPrint","pollForCorrect","_this$printer3","_this$printer3$settin","_this$printer4","_this$printer4$settin","data_channel_id","dataChannelOnlyWebrtc","_this$printer5","_this$printer5$settin","agent_connected","webcamExists","customRotationIndex","custom","customRotation","WIDGET","terminalWidget","defaultProps","filter_by_printer_ids","retry","newDelay","isOctoPrintCommand","ReorderModal","useMobileLayout","onlyNotifications","sections","isHidden","isSubcategory","route","logout","currentSection","isNotificationChannel","availableNotificationPlugins","currentRouteComponent","createNotificationChannel","patchNotificationChannel","deleteNotificationChannel","clearErrorMessages","addErrorMessage","updateRoute","notification_enabled","defaultSections","GeneralPreferences","importComponent","ThemePreferences","ProfilePreferences","AuthorizedApps","GeneralNotifications","PushNotifications","notificationSections","notificationPlugins","reduce","displayName","channelName","entSections","subscriptionSection","Subscription","detectiveHoursSection","DetectiveHours","deleteAccountSection","DeleteAccount","publicSections","configuredNotificationChannels","last_name","combinedInputs","visibleSections","section","clientIsThemeable","fetchNotificationPlugins","fetchNotificationChannels","fetchUser","checkMobileLayout","onresize","paddingTop","newTabIndex","vw","documentElement","clientWidth","plugins","pluginInfo","env_vars","needHidden","envItem","is_required","is_set","notificationChannels","channels","channelInfo","opts","getNotificationSettingKey","innnerError","propNames","propValues","prop","updateNotificationChannel","patchUser","checkForCombinedValues","inputs","emptyValues","ReactNativeWebView","firstName","lastName","eventClassFiltering","eventClass","toggleEventFiltering","cssClassFromEventClass","eventTypeFiltering","eventType","printerEvents","tintBorderClass","info_url","onTextClick","tintClass","eventTitle","LOCAL_PREF_NAMES","localPrefKey","localPref","PrinterEventCard","filter_by_classes","filter_by_types","original","onImageUpdated","labels","raisedRipples","openExample","bubbling","bumpsAndRoughSurface","gaps","other","noIssues","notANozzleCam","isFirst","labelsSelected","isLast","totalShots","labelsToString","parseLabelsString","updateLabels","labelsString","labelArray","desc","imageUrls","raised","raised1","raised2","bubbling1","bubbling2","bumps","bumps1","bumps2","detached1","detached2","gaps1","gaps2","FirstLayerShotCard","inspectionId","urlParts","_vm$slicingProgress","_vm$slicingProgress2","oauthAccessToken","creditsInfo","callAgentAction","showContactSupportForm","showDiscordSupportMessage","openUpgradeModal","showUpgradeModal","closeUpgradeModal","handleChatScroll","has_upgrade_link","per_override_explanations","explanation","parameter","slicingSettingsInMessage","use_print_process_preset","applySettingsInMessage","suggested_printing_method","jusprinNotification","discord_support","qr_code_url","handleQRCodeError","thinking","showContactSupport","handleContactSupportFormDismissed","slicingProgress","fadeOut","overrun","quickButtons","showScrollButton","scrollToBottom","userInput","readyForUserQuery","handleEnterKey","onUserInput","handleClick","Authorization","setAgentActionRetVal","retVal","agentActionCallMap","_window$wx","wx","stubAgentActionResponse","getAgentActionResponse","checkResponse","quickButtonsStack","cannedActions","addPrinters","popQuickButtons","callLongRunningAgentActionThenRefreshPresets","addFilaments","changePrinter","showPresetOptions","changeFilament","moreOptions","showMoreOptions","sliceWithCurrentSettings","doSliceWithCurrentSettings","endTroubleshooting","current_workflow","onUserQueryQuickButton","stayInTroubleshooting","startOver","exportGCode","switchToPreview","autoOrient","autoOrientAllObjects","undoAutoOrient","removeQuickButtons","undoAutoArrange","enableSupport","paramOverridesToApplyConfigPayload","enable_support","setQuickButtons","undoEnableSupport","tellMeWhatNotificationMeans","lastErrorMessage","originalErrorMessage","newMessage","acknowledgeError","commonPrintingPrompts","showCommonPrintingPrompts","testRender","renderPlateForAnalysis","analyseModel","getAnalysisResult","plateAnalysisLooksGoodToMe","queryWithSuggestedPrintingMethod","plateAnalysisIsNotGood","removePlateAnalysis","editPlateAnalysis","shouldShowSliceWithCurrentSettingsQuickButton","lastMessage","shouldShowStartOverQuickButton","shouldShowPlateAnalysisQuickButton","haveDonePlateAnalysis","hasModelObjects","pushQuickButtons","actions","actionMessages","topActions","clearQuickButtons","initUserQueryHintButtons","initQueryHints","hint","presetType","refreshSelectedPresets","populateQuickButtons","charAt","additionalActions","newActions","newAction","existing","populateQuickButtonsOnError","cannedMessages","greeting","needToAddPrinters","needToAddFilaments","noModelObjects","noSupportForMultiplePlatesOrFilaments","currentPresetSelections","filamentName","currentModelObjects","modelObjectCount","newModelObjects","modelName","generalError","fixFilamentParamOverrides","param_overrides","plateTemps","existingTemp","tempValue","plateTempsInitialLayer","existingTempInitialLayer","isUnfaded","toggleFade","hasFade","checkIfNeedsFade","updated","scrollHeight","clientHeight","chatPanelPopUpOnErrors","creditStatusClass","creditTooltipText","ai_credit_free_monthly_quota","remainingCredits","handleSupportButtonClick","curChatPanelViewMode","changeChatPanelViewMode","changeChatPanelVisibility","shouldPopupChatPanel","preferredChatPanelViewModeValue","curChatPanelVisible","popupChatPanelTimeout","notificationBadgeCount","green_badge","orange_badge","red_badge","chatPanelPopUpOnErrorsValue","preferredChatPanelViewMode","newViewMode","ai_credit_used_current_month","remaining","ratio","devMode","savePreferredViewMode","view_mode","newVisible","visible","_event$data","focusEventType","processedNotifications","processNotificationPushedEvent","notificationKey","chatHeader","popupChatPanelIfNecessary","supportMessage","isSubmitting","sendSupportRequest","cancelSupportRequest","lastUserMessage","lastUserMsg","api","jusprinContactSupport","closeModal","isUnlimitedPlan","userInfo","userDisplayName","progressPercentage","credits","resetDate","nextMonthResetDate","has_active_subscription","_this$credits","nextMonth","toLocaleDateString","day","fetchAICreditsData","jusprinMe","ai_credits","QuickButtonComponent","GradientFadableContainer","ChatPanelHeader","ContactSupportForm","UpgradeModal","mixins","QuickButtonsMixin","MessagesMixin","SlicingParamFixerMixin","userNotificationMixin","currentChatId","modelObjects","supportedActions","autoOrientInProgress","isDevMode","readyToSlice","_message$agent_action","agent_actions","adjustTextareaHeight","fetchUserData","initMessagesAndQuickButtons","apiCall","processAgentEvent","processModelObjectsChangedEvent","processAutoOrientEvent","processNativeErrorOccurredEvent","processChatPanelFocusEvent","processSlicingProgressEvent","editedPreset","editedPresets","overridesFromEditedPreset","dirty_options","overrides","selectedPreset","_presets","is_selected","sendUserQuery","chatTextarea","currentProject","plates","userQueryPreconditionsMet","preset_type","_this$editedPreset","_this$selectedPreset","_this$editedPreset2","getCurrentChatId","withCreditCheck","jusprinChatMessages","filament_presets","print_process_presets","printProcessPresets","chat_id","processChatResponse","_window$Sentry2","_newChatResponse$data","chatsApiUrl","newChatResponse","responseData","_this$selectedPreset2","_this$selectedPreset3","_this$selectedPreset4","_message$agent_action2","machine_name","filament_name","print_process_name","populateDatabaseWithChat","processAgentActions","chatsApiVerb","_message$agent_action3","autoArrangeAllObjects","showOptionsAsQuickButtons","filamentOverrides","_window$Sentry3","hasModels","plate","_plate$model_objects","model_objects","_this$selectedPreset5","_this$selectedPreset6","doSlice","agentActionName","autoArrangeInProgress","_message$slicing_prof6","_message$slicing_prof7","_message$slicing_prof8","_message$slicing_prof9","refreshModelObjects","project","distinctModelObjectsInProject","_this$selectedPreset7","_this$selectedPreset8","fixBrokenMarkdown","formattedText","chatMessageContainer","scrollTop","onChatContentChanged","_presets$printerPrese","_presets$printerPrese2","_presets$filamentPres","_presets$filamentPres2","printerPresets","every","is_default","filamentPresets","modelObjectsWithOverhang","_obj$features$overhan","_obj$features","features","overhang","unique","exists","_event$data2","_window$Sentry4","_event$data3","_event$data4","_event$data5","jusprinPlateAnalysisProcess","cameraPositionByDegrees","xyPlaneAngle","zPlaneAngle","distanceFromTarget","xyPlaneAngleRadians","PI","zPlaneAngleRadians","sin","cos","bounding_box","views","camera_position","renderResult","plate_index","base64","analysisResponse","callPlateAnalysis","processAnalysisResponse","ensurePlateAnalysisMessageExists","plateAnalysisMessage","atBottom","chatMessages","newHeight","chatInput","closest","inputTotalHeight","shiftKey","metaKey","ctrlKey","altKey","supportMsgIndex","_message$agent_action4","user_options_to_choose_from","newQuickButtons","getHeaders","getConfig","isFirstTime","showPricingPlan","slicingProgressCompletionTimeout","_window$Sentry5","UserPreferencesPage","TargetPlatformSelectionPage","ObicoInstallationGuidePage","PrinterLinkingPage","AddPrinterSuccessPage","prefRoutes","NewOctoPrintTunnelPage","OctoPrintTunnelPage","PrintShotFeedbackApp","PrinterListPage","SharedPrinterPage","PrinterSettingsPage","PrinterControlPage","PrintPage","PrintHistoryPage","StatsPage","PrinterEventsPage","PrinterTerminalPage","FirstLayerInspectionImagePage","EmbeddedChatV10Page","EmbeddedChatV12Page","loaded","couponCode","hasSubscription","btn","isAnnual","billingCycle","BillingCycle","Annual","Monthly","isAuthenticated","priceTable","basePlanPrice","totalPlanPrice","basePrinterPrice","calc","placement","modifiers","upgrade","PrepaidDHPacks","price","selectedPrepaidPack","purchasePrepaidPack","DHPacks","dhPackKey","getDHPackLabel","getDHPackSubLabel","upgradeWithDHPack","calcWithDHPack","mailto","SupportEmail","QuestionsSection","primaryEmailVerified","chargeBeeSite","initialNumPrinters","annualAsDefault","initialCBSubscription","numPrinters","isCalcOpen","calcPriceTable","chargeBeeInstance","chargeBee","activeSubscription","cb_subscription","googleOptimizeScript","year","calcDHPackPrice","CalcPeriod","Year","Month","hour","ConfigureSubscription","calculateOnly","initialDHPackKey","initialBillingCycle","checkoutPrepaidDHPack","dhpack_level","overSubscribed","archivedPrinters","unarchivePrinter","over_subscribed","lastRedeemedCode","description","formatDate","redeemed_at","couponCodes","detectiveHourCouponCodes","dateString","_this$$i18n","locale","$i18n","minute","pageTimelapses","timelapse","openFullScreen","fullScreenPrintTitle","fullScreenClosed","fullScreenPrint","fullScreenPrintVideoUrl","isPublic","creator_name","hasSelectedChangedListener","selectedCardView","deleteVideo","posterSrc","showVideoArchivedDescription","hasFullscreenListener","cardView","humanizedPrintedOrUploadedTime","longFormat","wasTimelapseUploaded","endStatus","focusedFeedbackLink","ALERT_THRESHOLD","$listeners","selectedChanged","fetchPredictions","ts","initialPosition","PrintCard","FullScreenPrintCard","perLoad","loadsNumber","timelapses","end","publicTimelapses","adaptTimelapseToPrint","p_json_url","onUploadSuccess","onUploadError","openTimelapse","issue_severity","statusIcon","selectedTimelapse","onModalHidden","warningTriggered","original_video_url","uploadedTimelapses","paramName","pollInterval","fetchTimelapses","computeIssueFromPredictions","MINOR_THRESHOLD","MAJOR_THRESHOLD","firstIssueFrame","issueSeverity","pred","frame","predictions_json_url","predResponse","dropzone","removeFile","alert","first_issue_frame","showSuccess","agent_name","firstLayerOptedIn","updateFirstLayerOptedIn","updateFirstLayerZhop","firstLayerScanZhop","updateFirstLayerCooldownTemp","firstLayerCooldownTemp","updateFirstLayerRetract","firstLayerScanRetract","updateFirstLayerScanRetractSpeed","firstLayerScanRetractSpeed","showFetchingWebcamLoader","testSnapshotString","urlPlaceHolder","nozzlecam_url","first_layer_scan_opted_in","first_layer_scan_zhop","first_layer_scan_retract","first_layer_scan_retract_speed","first_layer_scan_cooldown_temp","webcamUrls","more","isValidCouponCode","redeemPeriod","redeemClicked","isPlanAdded","cbSubscription","free3mCouponCodePrefix","free6mCouponCodePrefix","redirectUrlWhenNotAuthenticated","isRedirectedAfterLoginOrSignup","$loadScript","handlePlanAdded","openBttUserNotAuthenticatedModal","BttUserNotAuthenticatedModal","redeemMintion3mUnlimited","coupon_code","BttRedeemCompletedModal","openAlreadyHaveProPlanModal","plan","annual","coupon","choosePlanClicked","free3mCouponCode","discount25pctCouponCode","discount25pctCodeOnly","hasFreePlan","handlePlanNotAdded","redeemBtt3mUnlimited","couponPrefix","couponCodeParam","validateSovolCode","openUserNotAuthenticatedModal","SovolUserNotAuthenticatedModal","open3doUserNotAuthenticatedModal","ThreeDOUserNotAuthenticatedModal","redeemThreeDO3mUnlimited","ThreeDORedeemCompletedModal","QuestionsKingroonSection","canGoBackToChat","hasActiveSubscription","downgradeToFree","freeButtonText","hasActiveObicoProSubscription","originalPriceDollars","originalPriceCents","discountedPriceDollars","discountedPriceCents","obicoProDiscountPercentage","upgradeToProPlan","upgradeButtonText","showSuccessPopup","circleCircumference","circleOffset","countdownSeconds","cancelRedirect","redirectToChat","closeSuccessPopup","site","Chargebee","checkout","chargebeeInstance","openCheckout","hostedPage","Accept","portal","setPortalSession","cbPortal","createChargebeePortal","confirm","currentSubscription","obicoSubscription","showBackToChatHeader","countdownInterval","jusprinChargebee","handleCanGoBackToChatParam","fetchCurrentSubscription","fetchObicoSubscription","checkForCheckoutSuccess","is_active","isCurrentPlanAnnual","is_annual","isCurrentPlanMonthly","is_monthly","_this$obicoSubscripti","discountedPrice","originalPrice","discountMultiplier","hasBillingCycleChanged","getCsrfToken","cookies","cookie","checkoutOptions","DowngradeConfirmation","startCountdown","searchParams","canGoBack","sessionStorage","beforeUnmount","PricingPage","KingroonPricingPage","ArchivedPrintersPage","DetectiveHourCouponCodesPage","PublicTimelapsesPage","TimelapseUploadPage","WelcomePage","CelestriusConfigurePage","MintionRedeemPage","BttRedeemPage","SovolRedeemPage","ThreeDoRedeemPage","JusPrinPricingPage","RotationbottomSheetOpen","ScalebottomSheetOpen","TranslatebottomSheetOpen","PrintProfilebottomSheetOpen","MachineSelectionOpen","PatternSelectionOpen","GeneralTypeSelectionOpen","PatternSelectionType","GeneralTypeSelectionType","FilamentSelectionOpen","PrintProcessSelectionOpen","isInitialLoad","profilePreset","profileOverwrites","filamentProfilePreset","filamentProfileOverwrites","selectedMachine","selectedFilament","selectedPrintProcess","suggestedPrintProcess","meshes","selectedMeshIndex","jusprintCurrentChatId","mutations","ADD_MODEL","mesh","SET_SELECTED_MESH_INDEX","UPDATE_MESH_ROTATION","meshIndex","UPDATE_MESH_TRANSLATE","translate","UPDATE_MESH_DEFAULT_TRANSLATE","defaultTranslate","UPDATE_MESH_DIMENSIONS","currentDimensions","SET_ROTATION_BOTTOM_SHEET_OPEN","SET_SCALE_BOTTOM_SHEET_OPEN","SET_TRANSLATE_BOTTOM_SHEET_OPEN","SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN","SET_MACHINE_SELECTION_OPEN","SET_PATTERN_SELECTION_OPEN","SET_PATTERN_SELECTION_TYPE","SET_GENERAL_TYPE_SELECTION_OPEN","SET_GENERAL_TYPE_SELECTION_TYPE","SET_FILAMENT_SELECTION_OPEN","SET_PRINT_PROCESS_SELECTION_OPEN","SET_SELECTED_MACHINE","SET_SELECTED_FILAMENT","SET_SELECTED_PRINT_PROCESS","SET_SUGGESTED_PRINT_PROCESS","SET_PROFILE_PRESET","fuzzy_skin","internal_solid_infill_pattern","brim_type","CLEAR_PROFILE_OVERWRITE_VALUE","UPDATE_PROFILE_OVERWRITE_VALUE","SET_PROFILE_OVERWRITE","SET_FILAMENT_PROFILE_PRESET","SET_FILAMENT_PROFILE_OVERWRITE_VALUE","CLEAR_FILAMENT_PROFILE_OVERWRITE_VALUE","SET_FILAMENT_PROFILE_OVERWRITE","SET_INITIAL_LOAD","SET_JUSPRINT_CURRENT_CHAT_ID","addMesh","commit","setSelectedMeshIndex","updateMeshRotation","updateMeshTranslate","updateCurrentDimensions","openMeshRotationBottomSheet","closeMeshRotationBottomSheet","openMeshScaleBottomSheet","closeMeshScaleBottomSheet","openTranslateBottomSheet","closeTranslateBottomSheet","openPrintProfileBottomSheet","closePrintProfileBottomSheet","updateProfileValue","openMachineSelection","closeMachineSelectionAndClearInitialLoad","openPatternSelection","closePatternSelection","setPatternSelectionType","openGeneralTypeSelection","closeGeneralTypeSelection","setGeneralTypeSelectionType","changeMachineAndRelatedPresets","dispatch","machine","default_filament","default_print_process","changePrintProcessAndLoadPreset","slicer_profile_url","encodedUrl","encodeURI","changeFilamentAndLoadPreset","openFilamentSelection","closeFilamentSelection","openPrintProcess","closePrintProcess","setInitialLoadDone","getters","selectedMeshRotation","_state$meshes$state$s","selectedMeshTranslate","_state$meshes$state$s2","selectedMeshDefaultTranslate","_state$meshes$state$s3","selectedMeshCenter","_state$meshes$state$s4","center","selectedMeshDimensions","_state$meshes$state$s5","_state$meshes$state$s6","originalDimensions","FilamentSelectionOpenn","getProfileValue","getFilamentProfileValue","namespaced","Vuex","Store","sliceSettingsStore","mountVue","entRoutes","entComponents","Hour","PlanMonthlyPrice","LoyaltyMonthlyPrice","monthlyPriceFor","isLoyalty","DHPackBillingCycleMul","AdditionalPrinterPrice","CalcPeriodMonths","roundCurrency","EPSILON","toCalcPeriod","0","2","5","10","20","RecommendedDHPackKey","calcPlanPrice","calcPeriod","calcPrinterPrice","numAdditionalPrinters","billingCycleMonths","additionalPrintersPrice","dhPackPrice","totalAdditionalPrintersPrice","totalDHPackPrice","totalPrice","urlObj","fetchPortalSession","portalSession","access_url","changeSubscription","recommended","recommendedDHPackKey","getDHPackChoiceLabel","priceDisplay","priceSubDisplay","dhPackName","groupClass","buttonsClass","buttonsWidth","decrease","whileMouseDown","clearTimer","classes","textAlign","onInput","increase","mouseDownSpeed","onNewValue","NumberSpinner","currentPlanId","isLoyaltyPlan","showPrimaryEmailUnverifiedWarning","pageContext","mobilePlatform","defaults","common","shotId","pubPrinter","tunnel","paramsObj","entry","resourceId","testNotificationChannel","printerControl","chatId","publicUrls","getMessages","dismissMessage","deleteAccount","userExt","switchLegacySubscriptionToLoyalty","subscriptions","cancelSubscription","webpackAsyncContext","req","ids","notificationChannel","startCase","toLower","Blob","reader","FileReader","srcElement","readAsArrayBuffer","_document$getElements","getElementsByName","aElement","formatWithoutDaylightSavingShift","formattingStr","utcOffset","_tzm","savingClass","savingDoneClass","savingFailedClass","smallHeightClass","errorMsg","savingTimeout","savingDoneTimeout","nowSaving","prevSaving","clearSavingTimeout","twilio","pushbullet","discord","telegram","pushover","slack","webhook","apprise","System","biqu","defaultTheme","shadows","singleThemeSyndicates","matches","mergeColorOverrides","defaultColors","syndicateColors","merged","themeValue","finalColors","syndicates","setProperty","meta","shadow","observable","setTheme","newTheme","defaultRoutes","notificationRoutes","publicRoutes"],"mappings":"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","file":"js/root.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"root\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"root\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-07cc365e\":1,\"chunk-19479659\":1,\"chunk-24e37396\":1,\"chunk-312ac63a\":1,\"chunk-38e6bf7c\":1,\"chunk-4c1203f5\":1,\"chunk-5f4cc896\":1,\"chunk-683e0066\":1,\"chunk-691bc59e\":1,\"chunk-716240ff\":1,\"chunk-7c899771\":1,\"chunk-c8beb52c\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\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\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/frontend/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonNavBar.vue?vue&type=style&index=0&id=3e53836d&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-2.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewOctoPrintTunnelPage.vue?vue&type=style&index=0&id=b30f9c60&prod&lang=sass&scoped=true&\"","import i18n from 'i18next';\n\nimport baseEn from './locales/en.json';\nimport baseZhCN from './locales/zh-CN.json';\nimport baseZhTW from './locales/zh-TW.json';\nimport baseCa from './locales/ca.json';\nimport baseCs from './locales/cs.json';\nimport baseDe from './locales/de.json';\nimport baseEs from './locales/es.json';\nimport baseFr from './locales/fr.json';\nimport baseHu from './locales/hu.json';\nimport baseIt from './locales/it.json';\nimport baseJa from './locales/ja.json';\nimport baseKo from './locales/ko.json';\nimport baseNl from './locales/nl.json';\nimport basePl from './locales/pl.json';\nimport basePtBR from './locales/pt-BR.json';\nimport baseRu from './locales/ru.json';\nimport baseSv from './locales/sv.json';\nimport baseTr from './locales/tr.json';\nimport baseUk from './locales/uk.json';\n\nimport entBaseEn from './locales/ent_en.json';\nimport entBaseZhCN from './locales/ent_zh-CN.json';\nimport entBaseZhTW from './locales/ent_zh-TW.json';\nimport entBaseCa from './locales/ent_ca.json';\nimport entBaseCs from './locales/ent_cs.json';\nimport entBaseDe from './locales/ent_de.json';\nimport entBaseEs from './locales/ent_es.json';\nimport entBaseFr from './locales/ent_fr.json';\nimport entBaseHu from './locales/ent_hu.json';\nimport entBaseIt from './locales/ent_it.json';\nimport entBaseJa from './locales/ent_ja.json';\nimport entBaseKo from './locales/ent_ko.json';\nimport entBaseNl from './locales/ent_nl.json';\nimport entBasePl from './locales/ent_pl.json';\nimport entBasePtBR from './locales/ent_pt-BR.json';\nimport entBaseRu from './locales/ent_ru.json';\nimport entBaseSv from './locales/ent_sv.json';\nimport entBaseTr from './locales/ent_tr.json';\nimport entBaseUk from './locales/ent_uk.json';\n\nimport {language} from '@src/lib/page-context'\nimport { getLocalPref } from '@src/lib/pref'\n\nconst getCurrentLanguage = () => {\n  // Check for saved language preference first\n  const savedLanguage = getLocalPref('user-language', null)\n  if (savedLanguage) {\n    return savedLanguage\n  }\n\n  // Fall back to backend page context\n  const lang = language().replace(/_/g, '-');\n  if (lang === 'zh') return 'zh-CN';\n  if (lang === 'zh_Hans' || lang === 'zh-Hans') return 'zh-CN';\n  if (lang === 'zh_Hant' || lang === 'zh-Hant') return 'zh-TW';\n  return lang;\n};\n\nconst currentLanguage = getCurrentLanguage()\n\nconst resources = {\n  'en': {\n    translation: {\n      ...baseEn,\n      ...entBaseEn\n    }\n  },\n  'zh-CN': {\n    translation: {\n      ...baseZhCN,\n      ...entBaseZhCN\n    }\n  },\n  'zh-TW': {\n    translation: {\n      ...baseZhTW,\n      ...entBaseZhTW\n    }\n  },\n  'ca': {\n    translation: {\n      ...baseCa,\n      ...entBaseCa\n    }\n  },\n  'cs': {\n    translation: {\n      ...baseCs,\n      ...entBaseCs\n    }\n  },\n  'de': {\n    translation: {\n      ...baseDe,\n      ...entBaseDe\n    }\n  },\n  'es': {\n    translation: {\n      ...baseEs,\n      ...entBaseEs\n    }\n  },\n  'fr': {\n    translation: {\n      ...baseFr,\n      ...entBaseFr\n    }\n  },\n  'hu': {\n    translation: {\n      ...baseHu,\n      ...entBaseHu\n    }\n  },\n  'it': {\n    translation: {\n      ...baseIt,\n      ...entBaseIt\n    }\n  },\n  'ja': {\n    translation: {\n      ...baseJa,\n      ...entBaseJa\n    }\n  },\n  'ko': {\n    translation: {\n      ...baseKo,\n      ...entBaseKo\n    }\n  },\n  'nl': {\n    translation: {\n      ...baseNl,\n      ...entBaseNl\n    }\n  },\n  'pl': {\n    translation: {\n      ...basePl,\n      ...entBasePl\n    }\n  },\n  'pt-BR': {\n    translation: {\n      ...basePtBR,\n      ...entBasePtBR\n    }\n  },\n  'ru': {\n    translation: {\n      ...baseRu,\n      ...entBaseRu\n    }\n  },\n  'sv': {\n    translation: {\n      ...baseSv,\n      ...entBaseSv\n    }\n  },\n  'tr': {\n    translation: {\n      ...baseTr,\n      ...entBaseTr\n    }\n  },\n  'uk': {\n    translation: {\n      ...baseUk,\n      ...entBaseUk\n    }\n  }\n};\n\ni18n\n  .init({\n    resources,\n    lng: currentLanguage,\n    fallbackLng: ['en'],\n    interpolation: {\n      escapeValue: false,\n    },\n    debug: true,\n    nsSeparator:false\n  });\n\nexport default i18n;\n","module.exports = __webpack_public_path__ + \"img/fluidd_logo.png\";","module.exports = __webpack_public_path__ + \"img/gaps-2.jpg\";","module.exports = __webpack_public_path__ + \"img/raisedRipples-2.jpg\";","module.exports = __webpack_public_path__ + \"img/app-screenshot-3.webp\";","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DiscoveredPrinter.vue?vue&type=style&index=0&id=9def43e8&prod&lang=sass&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-4.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=style&index=0&id=60f4cf2a&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryItem.vue?vue&type=style&index=0&id=a071ad6e&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/generic-app.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AvailablePrinters.vue?vue&type=style&index=0&id=40347b7f&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimelapseUploadPage.vue?vue&type=style&index=0&id=3178e435&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CelestriusConfigurePage.vue?vue&type=style&index=0&id=e62ff952&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/printer-management.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PowerControlWidget.vue?vue&type=style&index=0&id=6b4f0900&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveHourCouponCodesPage.vue?vue&type=style&index=0&id=3931bb0f&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./WidgetTemplate.vue?vue&type=style&index=0&id=00f2b5bc&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerInspectionImagePage.vue?vue&type=style&index=0&id=07968630&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterSettingsPage.vue?vue&type=style&index=0&id=5dd13e88&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bigtree-tech-obico-logo.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UserPreferencesPage.vue?vue&type=style&index=0&id=6717962a&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalWidget.vue?vue&type=style&index=0&id=78933ce3&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=style&index=0&id=7e0a0f74&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlPage.vue?vue&type=style&index=0&id=b5382844&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=style&index=0&id=7f13343f&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./RenameModal.vue?vue&type=style&index=0&id=1c69e3a5&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=style&index=0&id=7ae7d3b0&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemPage.vue?vue&type=style&index=0&id=7c122ccc&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/ai-failure-detection.png\";","module.exports = __webpack_public_path__ + \"img/commandLinePrompt.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CascadedDropdown.vue?vue&type=style&index=0&id=e01269fe&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-5.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ReorderModal.vue?vue&type=style&index=0&id=74b26ea3&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/get-on-google-play.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventCard.vue?vue&type=style&index=0&id=6e084bdc&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bubbling-1.jpg\";","module.exports = __webpack_public_path__ + \"img/polymer.webp\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFileStructure.vue?vue&type=style&index=0&id=f3289a68&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=style&index=0&id=81513708&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharePrinter.vue?vue&type=style&index=0&id=29e8b0b6&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDOUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=217c34d2&prod&lang=sass&scoped=true&\"","import { isLocalStorageSupported } from '@static/js/utils'\n\nexport const getLocalPref = (prefId, defaultValue, printerId = null) => {\n  const storageKey = printerId === null ? prefId : `${prefId}_${printerId}`;\n  var savedVal = isLocalStorageSupported() ? localStorage.getItem(storageKey) : null\n  var val = savedVal || defaultValue\n  // Hack to deal with data type such as boolean and number\n  try {\n    return JSON.parse(val)\n  } catch (e) {\n    return val\n  }\n}\n\nexport const setLocalPref = (prefId, value, printerId = null) => {\n  if (isLocalStorageSupported()) {\n    const storageKey = printerId === null ? prefId : `${prefId}_${printerId}`;\n    localStorage.setItem(storageKey, value);\n  }\n}","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TargetPlatformSelectionPage.vue?vue&type=style&index=0&id=7924844c&prod&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/mobile-web-app.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionGauge.vue?vue&type=style&index=0&id=1f5952c0&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/printer.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=style&index=1&id=60f4cf2a&prod&lang=sass&\"","module.exports = __webpack_public_path__ + \"img/raspberry_pi.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalFeedView.vue?vue&type=style&index=0&id=04d63edc&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('Your three-month'))+\" AI Premium \"+_vm._s(_vm.$t('Plan Is Now Active')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Go To Printer Control Page'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminal.vue?vue&type=style&index=0&id=7c771c69&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/lcdScreenLarge.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterCard.vue?vue&type=style&index=0&id=44dc68ea&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/mainsail_logo.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=style&index=1&id=7e0a0f74&prod&lang=sass&\"","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterProgress.vue?vue&type=style&index=0&id=b4e920a0&prod&scoped=true&lang=scss&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteConfirmationModal.vue?vue&type=style&index=0&id=1c764133&prod&lang=sass&\"","module.exports = __webpack_public_path__ + \"img/octoapp.webp\";","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(() => (_vm.show = false)),expression:\"() => (show = false)\"}],staticClass:\"help-wrapper\",class:{ highlighted: _vm.highlight }},[_c('div',{staticClass:\"text\",on:{\"click\":function($event){_vm.positionWidget()\n      _vm.show = !_vm.show}}},[_vm._t(\"default\")],2),_c('div',{ref:\"widgetWrapper\",staticClass:\"widget-wrapper\"},[_c('div',{staticClass:\"question-mark\",on:{\"click\":function($event){_vm.positionWidget()\n        _vm.show = !_vm.show}}},[_c('svg',[_c('use',{attrs:{\"href\":\"#svg-question-icon\"}})])]),_c('transition',{attrs:{\"name\":\"pop-up\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show),expression:\"show\"}],ref:\"widget\",staticClass:\"widget\",class:[_vm.xDirection, _vm.yDirection]},[(_vm.showCloseButton)?_c('div',{staticClass:\"close-button\",on:{\"click\":function($event){_vm.show = false}}},[_c('svg',{attrs:{\"width\":\"16\",\"height\":\"16\"}},[_c('use',{attrs:{\"href\":\"#svg-cross-icon\"}})])]):_vm._e(),_c('div',{staticClass:\"content\"},[(_vm.id === 'basic-streaming-on-kingroon-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Basic Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"1 FPS (frame-per-second), 100 hours of streaming per month\")))])])]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Learn more about {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])]},proxy:true}],null,false,1592606660)})],1)]:_vm._e(),(_vm.id === 'detective-hours-free-plan-on-kingroon-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Basic AI Detection checks for failures every 30 seconds.\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"AI usage is reset on the 1st of each month. Hours do not roll over month to month.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-free-plan-on-kingroon-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\"))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'premium-streaming-on-kingroon-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Premium Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 25 FPS (frame-per-second)\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 5 FPS with any webcam\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 25 FPS with Kingroon H.264 Camera.\")))])])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'detective-hours-pro-plan-on-kingroon-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Advanced AI checks for failures more frequently - Catch failures up to 2X faster than Basic AI.\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"Unused AI Detection Hours roll over month-to-month\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-pro-plan-on-kingroon-pricing-page')?[_c('div',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere. Unlimited.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'basic-streaming-on-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Basic Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 5 FPS (frame-per-second)\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Throttled for 30 seconds every minute\")))])])]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Learn more about {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/webcam-streaming-for-human-eyes/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])]},proxy:true}],null,false,3864550040)})],1)]:_vm._e(),(_vm.id === 'first-gen-ai-on-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Our original AI failure detection model.\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"Upgrade to AI Premium for the Next-gen AI model with 63% fewer missed failures and 56% fewer false alerts.\")))])]:_vm._e(),(_vm.id === 'next-gen-ai-on-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Our latest AI failure detection model.\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"63% fewer missed failures than the First-gen AI model.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"56% fewer false alerts than the First-gen AI model.\")))])])]:_vm._e(),(_vm.id === 'detective-hours-free-plan-on-pricing-page')?[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Yup! Even Free account gets 10 AI Detection Hours for FREE each month.\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Unused AI Detection Hours roll over month to month.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"earn free AI Detection Hours by helping her improve\")))]),_vm._v(\". \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can also\"))+\" \"),_c('a',{staticClass:\"link\",attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t(\"purchase additional AI hours\")))]),_vm._v(\". \")])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-detective-hour-work/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'detective-hours-pro-plan-on-pricing-page')?[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Pro plan includes 50 AI Detection Hours each month.\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Unused AI Detection Hours roll over month to month.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"AI Detection Hours expire when subscription ends.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"earn more AI Detection Hours by helping her improve\")))]),_vm._v(\". \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can also\"))+\" \"),_c('a',{staticClass:\"link\",attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t(\"purchase additional AI hours\")))]),_vm._v(\". \")])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-detective-hour-work/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'premium-streaming-on-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Premium Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 25 FPS (frame-per-second)\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Un-throttled\")))])])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/webcam-streaming-for-human-eyes/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-free-plan-on-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your OctoPrint/Klipper from anywhere.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\"))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"OctoPrint/Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-pro-plan-on-pricing-page')?[_c('div',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your OctoPrint/Klipper from anywhere. Unlimited.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"OctoPrint/Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === '3rd-party-app-integration-free-on-pricing-page')?[_c('div',[_c('div',[_vm._v(_vm._s(_vm.$t(\"The monthly cap is shared between 3rd-party app and OctoPrint tunnel\"))+\":\")]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"The combined usage can't exceed 300MB per month.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Data usage is reset on the 1st day of each month.\")))])]),_c('p',[_vm._v(_vm._s(_vm.$t(\"Supported 3rd-party mobile apps\"))+\":\")]),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octoapp.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/printoid.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octopod.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/polymer.webp')}})])]:_vm._e(),(_vm.id === '3rd-party-app-integration-pro-on-pricing-page')?[_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t(\"Supported 3rd-party mobile apps\"))+\":\")]),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octoapp.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/printoid.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octopod.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/polymer.webp')}})])]:_vm._e(),(_vm.id === 'filament-change-on-notification-preferences')?[_c('i',[_c('ul',[_vm._v(\" \"+_vm._s(_vm.$t(\"Required versions\"))+\": \"),_c('li',[_vm._v(_vm._s(_vm.$t(\"OctoPrint 1.7.0 or higher\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"The {brandName} plugin 1.8.11 or higher\",{brandName: _vm.$syndicateText.brandName })))])])]),_c('h3',[_vm._v(_vm._s(_vm.$t(\"Filament Runout Notifications\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Host_action_commands must be enabled in your firmware to make it possible for your filament runout sensor to communicate with OctoPrint and the {brandName} app. If you enable action commands in your firmware, then the filament runout sensor can work properly and the {brandName} app can notify you when the filament runs out. Unfortunately, without host_action_commands enabled, OctoPrint is unable to communicate with the printer to know that a filament runout was detected.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_vm._v(_vm._s(_vm.$t(\"To enable support, you need to do the following\"))+\":\")]),_c('ul',[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Marlin: Uncomment #define HOST_ACTION_COMMANDS in Configuration_adv.h and recompile. See here for more information on host_action_commands.\"))+\" \")])]),_c('h3',[_vm._v(_vm._s(_vm.$t(\"Color Change Notifications\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Notifications on color change will work with any printer that has M600 enabled in its firmware. You do not need host_action_commands enabled to get notified when a color change is needed.\"))+\" \")])]:_vm._e(),(_vm.id === 'filament-used-may-be-incorrect')?[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Is filament usage inaccurate?\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('G-code files uploaded to your {brandName} account before upgrading to {brandName} for OctoPrint version 2.3.0 or {brandName} for Klipper version 1.2.0 do not include filament usage data.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_c('strong',[_vm._v(_vm._s(_vm.$t(\"To ensure accurate filament usage and other statistics\"))+\":\")])]),_c('ul',[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t('Upload G-code files and start prints directly through {brandName} instead of OctoPrint/Klipper.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Use a slicer that supports filament usage parameters, such as Cura, Prusa Slicer, SuperSlicer, IdeaMaker, or Simplify3D.\"))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Print statistics for G-code files deleted before 12/20/2022 are not included. For files deleted after 12/20/2022, statistics are preserved.\"))+\" \")])])]:_vm._e(),(_vm.id === 'thumbnail-setup-guide')?[_c('p',[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/enable-gcode-thumbnails/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Learn how to configure G-Code preview generation in your slicer\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'fan-speed-widget-help')?[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Adjust the speed of the cooling fan by setting a percentage value between 0 and 100. The default value is usually 100, which means the fan will run at full speed. Lowering the fan speed can reduce noise and save energy, but may also affect print quality if the printer gets too hot.\"))+\" \")])]:_vm._e(),(_vm.id === 'print-speed-widget-help')?[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Adjust the speed of your 3D printer by changing the speed of all movement commands by a specified factor. The default value is 100%, meaning that the printer will move at its standard speed. Lowering the print speed factor will slow down your print, while increasing it will speed it up. Value of 200% will double the speed.\"))+\" \")])]:_vm._e(),(_vm.id === 'flow-rate-widget-help')?[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Flow rate is the speed at which the printer extrudes plastic. If the flow rate is too high, the printer may extrude too much plastic and create blobs or stringing, while too low flow rate may result in weak and brittle prints. Adjusting the flow rate can help achieve the optimal balance between speed and quality. The default value is 100%.\"))+\" \")])]:_vm._e(),(_vm.id === 'coupon-entered-automatically')?[_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t('No cost for three months. Plan renews after expiration. Cancel anytime.')))])])]:_vm._e()],2)])])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    v-click-outside=\"() => (show = false)\"\n    class=\"help-wrapper\"\n    :class=\"{ highlighted: highlight }\"\n  >\n    <!-- Slot for text -->\n    <div\n      class=\"text\"\n      @click=\"\n        positionWidget()\n        show = !show\n      \"\n    >\n      <slot></slot>\n    </div>\n\n    <div ref=\"widgetWrapper\" class=\"widget-wrapper\">\n      <!-- Help icon -->\n      <div\n        class=\"question-mark\"\n        @click=\"\n          positionWidget()\n          show = !show\n        \"\n      >\n        <svg>\n          <use href=\"#svg-question-icon\" />\n        </svg>\n      </div>\n\n      <!-- Help widget -->\n      <transition name=\"pop-up\">\n        <div v-show=\"show\" ref=\"widget\" class=\"widget\" :class=\"[xDirection, yDirection]\">\n          <div v-if=\"showCloseButton\" class=\"close-button\" @click=\"show = false\">\n            <svg width=\"16\" height=\"16\">\n              <use href=\"#svg-cross-icon\" />\n            </svg>\n          </div>\n\n          <!-- Help content -->\n          <div class=\"content\">\n            <!-- KINGROON PRICING PAGE HELP CONTENT START -->\n            <!-- basic-streaming-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'basic-streaming-on-kingroon-pricing-page'\">\n              <div>\n                {{$t(\"Basic Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"1 FPS (frame-per-second), 100 hours of streaming per month\") }}</li>\n                </ul>\n              </div>\n              <div>\n                <i18next :translation=\"$t('Learn more about {localizedDom}')\">\n                  <template #localizedDom>\n                    <a href=\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\" target=\"_blank\">{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}} <i class=\"fas fa-external-link-alt\"></i></a>\n                  </template>\n                </i18next>\n\n              </div>\n            </template>\n\n            <!-- detective-hours-free-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'detective-hours-free-plan-on-kingroon-pricing-page'\">\n                <p>{{ $t(\"Basic AI Detection checks for failures every 30 seconds.\") }}</p>\n                <p>{{ $t(\"AI usage is reset on the 1st of each month. Hours do not roll over month to month.\") }}</p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  href=\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-free-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'tunneling-free-plan-on-kingroon-pricing-page'\">\n              <p>{{ $t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere.\") }}</p>\n              <p>\n                {{$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\")}}\n              </p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a href=\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\" target=\"_blank\"\n                  >{{ $t(\"Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- premium-streaming-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'premium-streaming-on-kingroon-pricing-page'\">\n              <div>\n                {{$t(\"Premium Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"Up to 25 FPS (frame-per-second)\") }}</li>\n                  <li>{{ $t(\"Up to 5 FPS with any webcam\") }}</li>\n                  <li>{{ $t(\"Up to 25 FPS with Kingroon H.264 Camera.\") }}</li>\n                </ul>\n              </div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  href=\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\"\n                  target=\"_blank\"\n                  >{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}}\n                  <i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- detective-hours-pro-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'detective-hours-pro-plan-on-kingroon-pricing-page'\">\n              <p>{{ $t(\"Advanced AI checks for failures more frequently - Catch failures up to 2X faster than Basic AI.\") }}</p>\n              <p>{{ $t(\"Unused AI Detection Hours roll over month-to-month\") }}</p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  href=\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-pro-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'tunneling-pro-plan-on-kingroon-pricing-page'\">\n              <div>{{ $t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere. Unlimited.\") }}</div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a href=\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\" target=\"_blank\"\n                  >{{ $t(\"Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- KINGROON PRICING PAGE HELP CONTENT END -->\n\n            <!-- basic-streaming-on-pricing-page -->\n            <template v-if=\"id === 'basic-streaming-on-pricing-page'\">\n              <div>\n                {{$t(\"Basic Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"Up to 5 FPS (frame-per-second)\") }}</li>\n                  <li>{{ $t(\"Throttled for 30 seconds every minute\") }}</li>\n                </ul>\n              </div>\n              <div>\n                <i18next :translation=\"$t('Learn more about {localizedDom}')\">\n                  <template #localizedDom>\n                    <a :href=\"getDocUrl('/user-guides/webcam-streaming-for-human-eyes/')\" target=\"_blank\">{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}} <i class=\"fas fa-external-link-alt\"></i></a>\n                  </template>\n                </i18next>\n\n              </div>\n            </template>\n\n            <!-- first-gen-ai-on-pricing-page -->\n            <template v-if=\"id === 'first-gen-ai-on-pricing-page'\">\n              <p>{{ $t(\"Our original AI failure detection model.\") }}</p>\n              <p>{{ $t(\"Upgrade to AI Premium for the Next-gen AI model with 63% fewer missed failures and 56% fewer false alerts.\") }}</p>\n            </template>\n\n            <!-- next-gen-ai-on-pricing-page -->\n            <template v-if=\"id === 'next-gen-ai-on-pricing-page'\">\n              <p>{{ $t(\"Our latest AI failure detection model.\") }}</p>\n              <ul>\n                <li>{{ $t(\"63% fewer missed failures than the First-gen AI model.\") }}</li>\n                <li>{{ $t(\"56% fewer false alerts than the First-gen AI model.\") }}</li>\n              </ul>\n            </template>\n\n            <!-- detective-hours-free-plan-on-pricing-page -->\n            <template v-if=\"id === 'detective-hours-free-plan-on-pricing-page'\">\n              <h3>{{ $t(\"Yup! Even Free account gets 10 AI Detection Hours for FREE each month.\") }}</h3>\n              <ul>\n                <li>{{ $t(\"Unused AI Detection Hours roll over month to month.\") }}</li>\n                <li>\n                  {{$t(\"You can\")}}\n                  <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                    >{{ $t(\"earn free AI Detection Hours by helping her improve\") }}</a\n                  >.\n                </li>\n                <li>\n                  {{$t(\"You can also\")}} <a class=\"link\" href=\"#need-more\">{{ $t(\"purchase additional AI hours\") }}</a>.\n                </li>\n              </ul>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  :href=\"getDocUrl('/user-guides/how-does-detective-hour-work/')\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- detective-hours-pro-plan-on-pricing-page -->\n            <template v-if=\"id === 'detective-hours-pro-plan-on-pricing-page'\">\n              <h3>{{ $t(\"Pro plan includes 50 AI Detection Hours each month.\") }}</h3>\n              <ul>\n                <li>{{ $t(\"Unused AI Detection Hours roll over month to month.\") }}</li>\n                <li>{{ $t(\"AI Detection Hours expire when subscription ends.\") }}</li>\n                <li>\n                  {{$t(\"You can\")}}\n                  <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                    >{{ $t(\"earn more AI Detection Hours by helping her improve\") }}</a\n                  >.\n                </li>\n                <li>\n                  {{$t(\"You can also\")}} <a class=\"link\" href=\"#need-more\">{{ $t(\"purchase additional AI hours\") }}</a>.\n                </li>\n              </ul>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  :href=\"getDocUrl('/user-guides/how-does-detective-hour-work/')\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- premium-streaming-on-pricing-page -->\n            <template v-if=\"id === 'premium-streaming-on-pricing-page'\">\n              <div>\n                {{$t(\"Premium Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"Up to 25 FPS (frame-per-second)\") }}</li>\n                  <li>{{ $t(\"Un-throttled\") }}</li>\n                </ul>\n              </div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  :href=\"getDocUrl('/user-guides/webcam-streaming-for-human-eyes/')\"\n                  target=\"_blank\"\n                  >{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}}\n                  <i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-free-plan-on-pricing-page -->\n            <template v-if=\"id === 'tunneling-free-plan-on-pricing-page'\">\n              <p>{{ $t(\"Securely tunnel to your OctoPrint/Klipper from anywhere.\") }}</p>\n              <p>\n                {{$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\")}}\n              </p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/')\" target=\"_blank\"\n                  >{{ $t(\"OctoPrint/Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-pro-plan-on-pricing-page -->\n            <template v-if=\"id === 'tunneling-pro-plan-on-pricing-page'\">\n              <div>{{ $t(\"Securely tunnel to your OctoPrint/Klipper from anywhere. Unlimited.\") }}</div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/')\" target=\"_blank\"\n                  >{{ $t(\"OctoPrint/Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- 3rd-party-app-integration-free-on-pricing-page -->\n            <template v-if=\"id === '3rd-party-app-integration-free-on-pricing-page'\">\n              <div>\n                <div>{{ $t(\"The monthly cap is shared between 3rd-party app and OctoPrint tunnel\") }}:</div>\n                <ul>\n                  <li>{{ $t(\"The combined usage can't exceed 300MB per month.\") }}</li>\n                  <li>{{ $t(\"Data usage is reset on the 1st day of each month.\") }}</li>\n                </ul>\n                <p>{{ $t(\"Supported 3rd-party mobile apps\") }}:</p>\n                <img class=\"logo-icon\" :src=\"require('@static/img/octoapp.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/printoid.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/octopod.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/polymer.webp')\" />\n              </div>\n            </template>\n\n            <!-- 3rd-party-app-integration-pro-on-pricing-page -->\n            <template v-if=\"id === '3rd-party-app-integration-pro-on-pricing-page'\">\n              <div>\n                <p>{{ $t(\"Supported 3rd-party mobile apps\") }}:</p>\n                <img class=\"logo-icon\" :src=\"require('@static/img/octoapp.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/printoid.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/octopod.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/polymer.webp')\" />\n              </div>\n            </template>\n\n            <!-- filament-change-on-notification-preferences -->\n            <template v-if=\"id === 'filament-change-on-notification-preferences'\">\n              <i>\n                <ul>\n                  {{$t(\"Required versions\")}}:\n                  <li>{{ $t(\"OctoPrint 1.7.0 or higher\") }}</li>\n                  <li>{{$t(\"The {brandName} plugin 1.8.11 or higher\",{brandName: $syndicateText.brandName })}}</li>\n                </ul>\n              </i>\n              <h3>{{ $t(\"Filament Runout Notifications\") }}</h3>\n              <p>\n                {{ $t('Host_action_commands must be enabled in your firmware to make it possible for your filament runout sensor to communicate with OctoPrint and the {brandName} app. If you enable action commands in your firmware, then the filament runout sensor can work properly and the {brandName} app can notify you when the filament runs out. Unfortunately, without host_action_commands enabled, OctoPrint is unable to communicate with the printer to know that a filament runout was detected.',{brandName:$syndicateText.brandName}) }}\n              </p>\n\n              <p>{{ $t(\"To enable support, you need to do the following\") }}:</p>\n              <ul>\n                <li>\n                  {{$t(\"Marlin: Uncomment #define HOST_ACTION_COMMANDS in Configuration_adv.h and recompile. See here for more information on host_action_commands.\")}}\n                </li>\n              </ul>\n\n              <h3>{{ $t(\"Color Change Notifications\") }}</h3>\n              <p>\n                {{$t(\"Notifications on color change will work with any printer that has M600 enabled in its firmware. You do not need host_action_commands enabled to get notified when a color change is needed.\")}}\n              </p>\n            </template>\n\n            <!-- filament-used-may-be-incorrect -->\n            <template v-if=\"id === 'filament-used-may-be-incorrect'\">\n              <h3>{{ $t(\"Is filament usage inaccurate?\") }}</h3>\n              <p>\n                {{ $t('G-code files uploaded to your {brandName} account before upgrading to {brandName} for OctoPrint version 2.3.0 or {brandName} for Klipper version 1.2.0 do not include filament usage data.',{brandName:$syndicateText.brandName}) }}\n              </p>\n              <p><strong>{{ $t(\"To ensure accurate filament usage and other statistics\") }}:</strong></p>\n              <ul>\n                <li>\n                  {{ $t('Upload G-code files and start prints directly through {brandName} instead of OctoPrint/Klipper.',{brandName:$syndicateText.brandName}) }}\n\n                </li>\n                <li>\n                  {{$t(\"Use a slicer that supports filament usage parameters, such as Cura, Prusa Slicer, SuperSlicer, IdeaMaker, or Simplify3D.\")}}\n                </li>\n                <li>\n                  {{$t(\"Print statistics for G-code files deleted before 12/20/2022 are not included. For files deleted after 12/20/2022, statistics are preserved.\")}}\n                </li>\n              </ul>\n            </template>\n\n            <!-- thumbnail-setup-guide -->\n            <template v-if=\"id === 'thumbnail-setup-guide'\">\n              <p>\n                <a :href=\"getDocUrl('/user-guides/enable-gcode-thumbnails/')\" target=\"_blank\"\n                  >{{$t(\"Learn how to configure G-Code preview generation in your slicer\")}}\n                  <i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <template v-if=\"id === 'fan-speed-widget-help'\">\n              <p>\n                {{$t(\"Adjust the speed of the cooling fan by setting a percentage value between 0 and 100. The default value is usually 100, which means the fan will run at full speed. Lowering the fan speed can reduce noise and save energy, but may also affect print quality if the printer gets too hot.\")}}\n              </p>\n            </template>\n            <template v-if=\"id === 'print-speed-widget-help'\">\n              <p>\n                {{$t(\"Adjust the speed of your 3D printer by changing the speed of all movement commands by a specified factor. The default value is 100%, meaning that the printer will move at its standard speed. Lowering the print speed factor will slow down your print, while increasing it will speed it up. Value of 200% will double the speed.\")}}\n              </p>\n            </template>\n            <template v-if=\"id === 'flow-rate-widget-help'\">\n              <p>\n                {{$t(\"Flow rate is the speed at which the printer extrudes plastic. If the flow rate is too high, the printer may extrude too much plastic and create blobs or stringing, while too low flow rate may result in weak and brittle prints. Adjusting the flow rate can help achieve the optimal balance between speed and quality. The default value is 100%.\")}}\n              </p>\n            </template>\n\n            <!-- coupon-entered-automatically -->\n            <template v-if=\"id === 'coupon-entered-automatically'\">\n              <div>\n                <p>{{ $t('No cost for three months. Plan renews after expiration. Cancel anytime.') }}</p>\n              </div>\n            </template>\n          </div>\n        </div>\n      </transition>\n    </div>\n  </div>\n</template>\n\n<script>\n/**\n * Pop-up widget to show additional help notes\n * To work properly should wrap raw text\n *\n * @example\n * <div>\n *   <help-widget src=\"...\">Webcam streaming</help-widget>\n * </div>\n */\n\nimport ClickOutside from 'vue-click-outside'\n\nexport default {\n  name: 'HelpWidget',\n\n  directives: {\n    ClickOutside,\n  },\n\n  props: {\n    id: {\n      type: String,\n      required: true,\n    },\n    highlight: {\n      type: Boolean,\n      default: true,\n    },\n    showCloseButton: {\n      type: Boolean,\n      default: false,\n    },\n    textBefore: {\n      type: String,\n      default: '',\n    },\n  },\n\n  data() {\n    return {\n      show: false,\n      xDirection: 'left',\n      yDirection: 'top',\n    }\n  },\n\n  methods: {\n    // Find preferred direction for widget to pup-up\n    // Based on help icon position inside viewport\n    positionWidget() {\n      this.$nextTick(() => {\n        const widgetWidth = this.$refs.widget?.offsetWidth || 360\n        const widgetHeight = this.$refs.widget?.offsetHeight || 420\n\n        const minHorizontalSpace = widgetWidth + 10\n        const minVerticalSpace = widgetHeight + 10\n\n        const helpIconPosition = this.$refs.widgetWrapper.getBoundingClientRect()\n        const distanceFromRightEdge =\n          window.innerWidth - (helpIconPosition.left + helpIconPosition.width)\n        const distanceFromBottomEdge =\n          window.innerHeight - (helpIconPosition.top + helpIconPosition.height)\n\n        if (distanceFromRightEdge < minHorizontalSpace) {\n          this.xDirection = 'right'\n        } else {\n          this.xDirection = 'left'\n        }\n\n        if (distanceFromBottomEdge < minVerticalSpace) {\n          this.yDirection = 'bottom'\n        } else {\n          this.yDirection = 'top'\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.help-wrapper\n  display: inline\n  position: relative\n  &.highlighted\n    text-decoration: underline\n    text-decoration-color: var(--color-text-help)\n  .text\n    display: inline\n    &:hover\n      cursor: pointer\n\n.widget-wrapper\n  $widget-width: 360px\n  $x-breakpoint: #{$widget-width + 20px}\n  $x-breakpoint-2: #{$widget-width * 2 + 20px}\n  position: relative\n  left: .1rem\n  top: .1rem\n  width: 1rem\n  height: 1rem\n  display: inline-block\n\n  .question-mark\n    display: flex\n    color: var(--color-text-help)\n    transition: all .2s ease-out\n    height: 1rem\n    &:hover\n      cursor: pointer\n\n    svg\n      width: 1rem\n      height: 1rem\n\n  .widget\n    width: $widget-width\n    z-index: 10\n    position: absolute\n    box-shadow: 0 0 0 9999px rgb(0 0 0 / 0.5)\n    border-radius: 12px\n    background-color: var(--color-surface-primary)\n    display: flex\n    flex-direction: column\n    color: var(--color-text-primary)\n\n    .logo-icon\n      max-height: 50px\n      object-fit: contain\n      border-radius: 8px\n      margin: 0px 15px\n\n    @media (min-width: $x-breakpoint-2)\n      &.left\n        left: 100%\n      &.right\n        right: 100%\n      &.bottom\n        bottom: 100%\n      &.top\n        top: 100%\n\n    @media (max-width: $x-breakpoint-2)\n      left: 0rem\n      right: 0rem\n      top: 5rem\n      margin: auto\n      position: fixed\n\n    @media (max-width: $x-breakpoint)\n      left: 1rem\n      right: 1rem\n      width: auto\n\n    .close-button\n      $close-btn-height: 24px\n      position: absolute\n      left: #{$close-btn-height * -.5}\n      top: #{$close-btn-height * -.5}\n      color: var(--color-text-primary)\n      transition: all .2s ease-out\n      &:hover\n        cursor: pointer\n        opacity: .7\n\n      svg\n        width: $close-btn-height\n        height: $close-btn-height\n\n    .content\n      padding: 1rem .875rem\n      font-size: 14px\n      font-weight: normal\n\n      & > *\n        margin-bottom: 1em\n        display: block\n\n      h1, h2, h3\n        font-weight: bold\n\n      h1\n        font-size: 1.3em\n      h2\n        font-size: 1.2em\n      h3\n        font-size: 1.1em\n\n      ul\n        padding-left: 2em\n\n      .video-wrapper\n        position: relative\n        padding-bottom: 56.25%\n        height: 0\n\n        iframe\n          position: absolute\n          top: 0\n          left: 0\n          width: 100%\n          height: 100%\n</style>\n\n<style scoped>\n/*\n  Widget animation\n  Defined with native CSS due to SASS and Vue conflict\n*/\n\n.pop-up-enter-active {\n  transition: all 0.1s ease-out;\n}\n\n.pop-up-leave-active {\n  transition: all 0.1s ease-in;\n}\n\n.pop-up-enter,\n.pop-up-leave-to {\n  transform: translate(-2rem, -1rem) scale(0.8);\n  opacity: 0;\n}\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./HelpWidget.vue?vue&type=template&id=40661357&scoped=true&\"\nimport script from \"./HelpWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./HelpWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./HelpWidget.vue?vue&type=style&index=0&id=40661357&prod&lang=sass&scoped=true&\"\nimport style1 from \"./HelpWidget.vue?vue&type=style&index=1&id=40661357&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"40661357\",\n  null\n  \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/klipperScreenMenu.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusTemp.vue?vue&type=style&index=0&id=395dc948&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=style&index=0&id=40661357&prod&lang=sass&scoped=true&\"","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BttRedeemCompletedModal.vue?vue&type=template&id=058adf52&scoped=true&\"\nimport script from \"./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BttRedeemCompletedModal.vue?vue&type=style&index=0&id=058adf52&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"058adf52\",\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueSwal from 'vue-sweetalert2'\n\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\n\nconst openModalWithComponent = (C, props, modalOptions) => {\n  let wrapper = document.createElement('div')\n  const c = new Vue({\n    render: (h) => h(C, { props: props }),\n  }).$mount(wrapper)\n\n  return Vue.swal({\n    ...modalOptions,\n    customClass: {\n      container: 'dark-backdrop',\n    },\n    html: '<div id=\"replace-here\">Placeholder</div>',\n    onBeforeOpen: (el) => {\n      el.querySelector('#replace-here').replaceWith(c.$el)\n    },\n    onDestroy: () => {\n      c.$destroy()\n      wrapper.remove()\n    },\n  })\n}\n\nconst openModalWithElement = (element, props, modalOptions) => {\n  return Vue.swal({\n    ...modalOptions,\n    customClass: {\n      container: 'dark-backdrop',\n    },\n    html: '<div id=\"replace-here\">Placeholder</div>',\n    onBeforeOpen: (el) => {\n      el.querySelector('#replace-here').replaceWith(element)\n    },\n  })\n}\n\nconst install = (Vue, options) => {\n  Vue.use(VueSwal, options)\n\n  const Confirm = Vue.swal.mixin({\n    title: 'Are you sure?',\n    showCancelButton: true,\n    confirmButtonText: 'Yes',\n    cancelButtonText: 'No',\n    customClass: {\n      container: 'dark-backdrop',\n    },\n  })\n\n  const Toast = Vue.swal.mixin({\n    toast: true,\n    position: 'top-end',\n    showConfirmButton: false,\n    timer: 5000,\n  })\n\n  const Reject = Vue.swal.mixin({\n    icon: 'error',\n    customClass: {\n      container: 'dark-backdrop error-alert',\n    },\n  })\n\n  const Prompt = Vue.swal.mixin({\n    customClass: {\n      container: 'dark-backdrop',\n    },\n  })\n\n  const DismissableToast = (swalOpt, dismissKey) => {\n    if (!getLocalPref(dismissKey, false)) {\n      const opt = {\n        ...swalOpt,\n        position: 'top-end',\n        confirmButtonText: \"Gotcha! Don't show this again.\",\n      }\n      return Vue.swal(opt).then(function (result) {\n        if (result.value) {\n          setLocalPref(dismissKey, true)\n          console.log(result)\n        }\n      })\n    }\n  }\n\n  Vue.prototype.$swal['openModalWithComponent'] = openModalWithComponent\n  Vue.prototype.$swal['openModalWithElement'] = openModalWithElement\n  Vue.prototype.$swal['Confirm'] = Confirm\n  Vue.prototype.$swal['Toast'] = Toast\n  Vue.prototype.$swal['DismissableToast'] = DismissableToast\n  Vue.prototype.$swal['Reject'] = Reject\n  Vue.prototype.$swal['Prompt'] = Prompt\n}\n\nexport default { install: install }\n","import Vue from 'vue'\n\nVue.filter('floor', (value) => Math.floor(value))\n","// extract from @sentry/vue package\n\nconst COMPONENT_NAME_REGEXP = /(?:^|[-_/])(\\w)/g\nconst ROOT_COMPONENT_NAME = 'root'\nconst ANONYMOUS_COMPONENT_NAME = 'anonymous component'\n\nconst splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^/]+?|)(\\.[^./]*|))(?:[/]*)$/\nconst splitPath = (filename) => {\n  const parts = splitPathRe.exec(filename)\n  return parts ? parts.slice(1) : []\n}\n\nconst basename = (path, ext) => {\n  let f = splitPath(path)[2]\n  if (ext && f.substr(ext.length * -1) === ext) {\n    f = f.substr(0, f.length - ext.length)\n  }\n  return f\n}\n\nconst getComponentName = (vm) => {\n  if (!vm) {\n    return ANONYMOUS_COMPONENT_NAME\n  }\n\n  if (vm.$root === vm) {\n    return ROOT_COMPONENT_NAME\n  }\n\n  if (!vm.$options) {\n    return ANONYMOUS_COMPONENT_NAME\n  }\n\n  if (vm.$options.name) {\n    return vm.$options.name\n  }\n\n  if (vm.$options._componentTag) {\n    return vm.$options._componentTag\n  }\n\n  // injected by vue-loader\n  if (vm.$options.__file) {\n    const unifiedFile = vm.$options.__file.replace(/^[a-zA-Z]:/, '').replace(/\\\\/g, '/')\n    const filename = basename(unifiedFile, '.vue')\n    return filename.replace(COMPONENT_NAME_REGEXP, (_, c) =>\n      c ? c.toUpperCase() : '',\n    )\n  }\n\n  return ANONYMOUS_COMPONENT_NAME\n}\n\nconst build = (to, from, prefix, depth, maxDepth, maxKeys) => {\n  let c = 0\n  for (let key in from) {\n    c += 1\n    if (c > maxKeys) {\n      break\n    }\n    if (typeof from[key] == 'object') {\n      if (maxDepth > depth) {\n        build(to, from[key], prefix + '.' + key, depth + 1, maxDepth, maxKeys)\n      }\n    } else {\n      to[prefix + '.' + key] = from[key]\n    }\n  }\n}\n\nconst setup = (Vue) => {\n  const defaultErrorHandler = Vue.config.errorHandler\n\n  Vue.config.errorHandler = (error, vm, info) => {\n    if (window.Sentry) {\n      const metadata = {}\n\n      let obj = vm\n      if (vm._original) {\n        obj = vm._original\n      }\n\n      if (obj) {\n\n        try {\n          metadata.componentName = getComponentName(obj)\n          build(metadata, JSON.parse(JSON.stringify(obj.$options.propsData)), 'props', 0, 2, 10)\n        } catch (_oO) {\n          console.log('Unable to extract metadata from Vue component.')\n        }\n      }\n\n      if (info) {\n        metadata.lifecycleHook = info\n      }\n\n      // Capture exception in the next event loop, to make sure that all breadcrumbs are recorded in time.\n      setTimeout(() => {\n        window.Sentry.getCurrentHub().withScope(scope => {\n          scope.setContext('vue', metadata)\n          window.Sentry.getCurrentHub().captureException(error)\n        })\n      })\n    }\n\n    if (typeof defaultErrorHandler === 'function') {\n      defaultErrorHandler.call(Vue, error, vm, info)\n    }\n\n    if (Vue.util) {\n      Vue.util.warn(`Error in ${info}: \"${error.toString()}\"`, vm)\n    }\n    console.error(error)\n  }\n}\n\nexport default setup\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper\"},[_c('b-spinner')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"wrapper\">\n    <b-spinner />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'LoadingPlaceholder',\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  margin: 5rem\n  text-align: center\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingPlaceholder.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingPlaceholder.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LoadingPlaceholder.vue?vue&type=template&id=18d7f03c&scoped=true&\"\nimport script from \"./LoadingPlaceholder.vue?vue&type=script&lang=js&\"\nexport * from \"./LoadingPlaceholder.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LoadingPlaceholder.vue?vue&type=style&index=0&id=18d7f03c&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"18d7f03c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('svg',_vm._b({},'svg',_vm.$attrs,false),[_c('use',{attrs:{\"xlink:href\":_vm.syndicateAwareHref}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <svg v-bind=\"$attrs\">\n    <use :xlink:href=\"syndicateAwareHref\" />\n  </svg>\n</template>\n\n<script>\nexport default {\n  name: 'SyndicateAwareSVG',\n  props: ['href'],\n  computed: {\n    syndicateAwareHref() {\n      return this.$syndicate === 'base' ? this.href : `#${this.$syndicate}-${this.href.slice(1)}`;\n    },\n  },\n};\n</script> ","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SyndicateAwareSVG.vue?vue&type=template&id=2c76d918&\"\nimport script from \"./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"\nexport * from \"./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","export const syndicateTextConstant = {\n  base:{\n    brandName: 'Obico',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  yumi:{\n    brandName: 'Yumi',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  mintion:{\n    brandName: 'Mintion',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  kingroon:{\n    brandName: 'Kingroon',\n    docRoot: 'https://docs.kingroon.com/docs',\n    appRoot: 'https://app.kingroon.com',\n  },\n  jusprin:{\n    brandName: 'JusPrin',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n};\n","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport VueSwal from '@src/lib/vue-swal'\nimport { BootstrapVue } from 'bootstrap-vue'\nimport '@mdi/font/css/materialdesignicons.css'\nimport Sticky from 'vue-sticky-directive'\nimport VueMoment from 'vue-moment'\nimport '@src/lib/filters'\nimport setupSentry from '@src/lib/sentry'\nimport { initTheme } from '@src/lib/color-scheme-controller'\nimport VuePluralize from 'vue-pluralize'\nimport OnoffToggle from 'vue-onoff-toggle'\nimport LoadScript from 'vue-plugin-load-script'\nimport LoadingPlaceholder from '@src/components/LoadingPlaceholder.vue'\nimport SyndicateAwareSVG from '@src/components/SyndicateAwareSVG.vue'\nimport moment from 'moment'\n\nimport { library } from '@fortawesome/fontawesome-svg-core'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport I18NextVue from \"i18next-vue\";\nimport {\n  faStar,\n  faFileCode,\n  faCalendarDays,\n  faChartPie,\n  faMoneyCheckDollar,\n  faCircleQuestion,\n  faBell,\n  faCog,\n  faCirclePause,\n  faCirclePlay,\n  faCircleXmark,\n  faPowerOff,\n  faGear,\n  faRotateRight,\n  faLayerGroup,\n  faChevronDown,\n  faRulerVertical,\n  faCheck\n} from '@fortawesome/free-solid-svg-icons'\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons'\nimport { syndicate } from '@src/lib/page-context'\nimport { syndicateTextConstant } from '@src/config/syndicateText'\nimport { getLocalPref } from '@src/lib/pref'\nimport i18next from '@src/i18n/i18n.js'\n\nVue.prototype.$syndicate = syndicate().name\nVue.prototype.$syndicateText = syndicateTextConstant[syndicate().name||'base'] || syndicateTextConstant.base\n\nexport default (store, routes, components) => {\n  initTheme()\n  setupSentry(Vue)\n  Vue.use(VueRouter)\n  Vue.use(BootstrapVue)\n  Vue.use(VueSwal)\n  Vue.use(Sticky)\n  Vue.use(VueMoment)\n  Vue.use(VuePluralize)\n  Vue.use(OnoffToggle)\n  Vue.use(LoadScript)\n  Vue.use(I18NextVue, { i18next });\n  Vue.mixin({\n    methods: {\n      errorDialog: function (errorObj, userMessage) {\n        console.error('logError', errorObj)\n        if (userMessage) {\n          this.$swal.Reject.fire({\n            title: `${this.$i18next.t('Error')}`,\n            html: `<p style=\"line-height: 1.5; max-width: 400px; margin: 0 auto;\">\n              ${userMessage}.\n              ${this.$i18next.t(\"Get help from\")} <a href=\"https://obico.io/discord-obico-klipper\">${this.$i18next.t(\"the {brandName} for Klipper support forum\",{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"or\")} <a href=\"https://obico.io/discord\">${this.$i18next.t('the {brandName} general support forum',{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"if this error persists.\")}\n            </p>`,\n            showConfirmButton: false,\n            showCancelButton: true,\n            cancelButtonText: 'Close',\n          })\n        }\n      },\n      getDocUrl(path) {\n        return this.$syndicateText.docRoot + path;\n      },\n      getAppUrl(path) {\n        if(path)\n          return this.$syndicateText.appRoot + path;\n        else\n        return this.$syndicateText.appRoot;\n      }\n    },\n  })\n\n  const router = new VueRouter({\n    mode: 'history',\n    routes,\n  })\n\n  // Apply saved language preference on navigation\n  router.beforeEach((to, from, next) => {\n    const savedLanguage = getLocalPref('user-language', null)\n\n    if (savedLanguage && savedLanguage !== i18next.language) {\n      i18next.changeLanguage(savedLanguage)\n    }\n\n    next()\n  })\n\n  Vue.component('LoadingPlaceholder', LoadingPlaceholder)\n  Vue.component('SyndicateAwareSVG', SyndicateAwareSVG)\n\n  library.add(\n    faStar,\n    faFileCode,\n    faCalendarDays,\n    faChartPie,\n    faMoneyCheckDollar,\n    faCircleQuestion,\n    faBell,\n    faCog,\n    faDiscord,\n    faRotateRight,\n    faCirclePause,\n    faCirclePlay,\n    faCircleXmark,\n    faPowerOff,\n    faGear,\n    faLayerGroup,\n    faChevronDown,\n    faRulerVertical,\n    faCheck\n  )\n  Vue.component('FontAwesomeIcon', FontAwesomeIcon)\n\n  if (document.getElementById('app')) {\n    window.app = new Vue({\n      store,\n      router,\n      components,\n    }).$mount('#app')\n  }\n\n  // FIXME: make start of the week dynamic when/if it will be done in the backend\n  moment.updateLocale('en', {\n    week: {\n      dow: 0, // Sunday is the first day of the week.\n    },\n  })\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[(_vm.user)?_c('b-col',{staticClass:\"mt-3\",attrs:{\"lg\":\"8\"}},[(_vm.printersToShow.length === 0)?_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"mx-auto\"},[_vm._v(_vm._s(_vm.$t(\"Welcome To\"))+\" \"+_vm._s(_vm.$syndicateText.brandName))])]),_c('b-row',[_c('b-col',[_c('hr')])],1),(_vm.isEnt && _vm.trialDaysLeft > 0)?_c('b-row',[_c('b-col',[(_vm.trialDaysLeft >= 29)?_c('h3',{staticClass:\"py-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Your 30-Day {localizedDom} Free Trial Has Started!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(_vm._s(_vm.$t(\"Pro Plan\")))])]},proxy:true}],null,false,2641834975)})],1):_c('h3',{staticClass:\"py-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(_vm._s(_vm.$t(\"Pro Plan\"))+\" \")])]},proxy:true},{key:\"trialDaysLeft\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.trialDaysLeft)+\" \")]},proxy:true}],null,false,1171636685)})],1),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to your {platformDisplayName}',{platformDisplayName: _vm.platformDisplayName})))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t(\"Premium 25 FPS Webcam Streaming\")))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t(\"250 AI Failure Detection Hours\")))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t(\"G-Code Remote Upload and Printing\")))])]),_c('div',{staticClass:\"lead py-4\"},[_vm._v(_vm._s(_vm.$t(\"{platformDisplayName} has not been linked to your {brandName} account.\",{platformDisplayName: _vm.platformDisplayName,brandName:_vm.$syndicateText.brandName})))]),_c('div',{staticClass:\"d-flex flex-column align-center justify-content-center\"},[_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.wizardUrl}},[_vm._v(_vm._s(_vm.$t(\"Link {platformDisplayName} Now\",{platformDisplayName: _vm.platformDisplayName})))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"It's as easy as 1-2-3.\"))+\" \")])])])])],1):_vm._e(),_c('div',{staticClass:\"footer-note small\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Not ready to start yet? {localizedDom} to pause your free trial.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\"}},[_vm._v(_vm._s(_vm.$t(\"Email us\")))])]},proxy:true}],null,false,51292438)})],1)],1)],1):_c('div',[_c('div',{staticClass:\"text-center\"},[_c('svg',{attrs:{\"width\":\"100\",\"height\":\"30\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-full\"}})])]),(_vm.authorized)?_c('div',{staticClass:\"authorization-successful\"},[_c('h4',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Authorization Successful!\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"You can close this page\")))])]):_c('div',[_c('div',[_c('div',{staticClass:\"lead text-center mt-3 mb-5\"},[_vm._v(_vm._s(_vm.$t(\"Tunnel Access Authorization\")))]),_c('h4',{staticClass:\"my-4\"},[_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(_vm.appDisplayName))]),_vm._v(\" \"+_vm._s(_vm.$t('is requesting to access you {platformDisplayName} Tunnel.',{platformDisplayName: _vm.platformDisplayName}))+\" \")]),_c('p',{staticClass:\"text-muted\"},[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.platformDisplayName)+\" \"+_vm._s(_vm.$t(\"Tunnel\")))]),_c('i18next',{attrs:{\"translation\":_vm.$t('is a secure way provided by {localizedDom} to remotely access your {platformDisplayName}. With the {platformDisplayName} Tunnel, you can use {appDisplayName} to access your {platformDisplayName} from anywhere.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://www.obico.io/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$syndicateText.brandName))])]},proxy:true},{key:\"platformDisplayName\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.platformDisplayName)+\" \")]},proxy:true},{key:\"appDisplayName\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.appDisplayName)+\" \")]},proxy:true}],null,false,145365998)})],1),(!_vm.user.is_pro)?_c('b-alert',{staticClass:\"my-3\",attrs:{\"variant\":\"warning\",\"dismissible\":\"\",\"show\":\"\"}},[_c('div',[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_c('i18next',{attrs:{\"translation\":_vm.$t('Tunnel usage of a free account is {localizedDom} to enjoy unlimited tunnel usage.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"capped at 300MB per month\")))]),_vm._v(\". \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:_vm.$syndicateText.brandName})))])]},proxy:true}],null,false,2385482320)})],1)]):_vm._e(),(_vm.user.is_pro && _vm.trialDaysLeft > 0)?_c('b-alert',{staticClass:\"my-3\",attrs:{\"variant\":\"warning\",\"dismissible\":\"\",\"show\":\"\"}},[_c('div',[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_c('i18next',{attrs:{\"translation\":_vm.$t('After the Free trial expires, tunnel data usage will be {localizedDom} to continue enjoying unlimited tunnel usage.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"capped at 300MB per month\")))]),_vm._v(\". \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:_vm.$syndicateText.brandName})))])]},proxy:true}],null,false,2385482320)})],1)]):_vm._e(),_c('div',{staticClass:\"mt-5\"},[_c('p',{staticClass:\"lead\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Tunnel access by {localizedDom} (make sure you trust it)')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(_vm.appDisplayName))])]},proxy:true}],null,false,460061086)})],1),(_vm.printersToShow.length === 0)?_c('h5',[_vm._v(_vm._s(_vm.$t(\"You have 0 active printers\")))]):(_vm.printersToShow.length === 1)?_c('h5',{staticClass:\"font-weight-bold\"},[_vm._v(\" \"+_vm._s(_vm.printersToShow[0].name)+\" \")]):(_vm.printersToShow.length > 1)?_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printerToAuthorize),expression:\"printerToAuthorize\"}],staticClass:\"custom-select\",on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.printerToAuthorize=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":null}},[_vm._v(_vm._s(_vm.$t(\"Please select a printer\")))]),_vm._l((_vm.printersToShow),function(printer){return _c('option',{key:printer.id,domProps:{\"value\":printer.id}},[_vm._v(\" \"+_vm._s(printer.name)+\" \")])})],2):_vm._e(),(_vm.printersToShow.length)?_c('div',{staticClass:\"d-flex mt-4 mb-3\"},[_c('button',{staticClass:\"btn btn-primary\",staticStyle:{\"flex\":\"1\"},attrs:{\"disabled\":!_vm.printerToAuthorize || _vm.performingAuthRequest},on:{\"click\":_vm.authorize}},[(_vm.performingAuthRequest)?_c('b-spinner',{attrs:{\"small\":\"\",\"label\":\"Loading...\"}}):_c('span',[_vm._v(_vm._s(_vm.$t(\"Authorize\")))])],1),_c('a',{staticClass:\"btn btn-outline-secondary ml-2\",staticStyle:{\"flex\":\"1\"},attrs:{\"href\":\"/user_preferences/authorized_apps\"}},[_vm._v(_vm._s(_vm.$t(\"Manage Apps\")))])]):_vm._e()])],1),_c('div',{staticClass:\"mt-4\"},[_c('p',{staticClass:\"text-muted small mb-1\"},[_vm._v(_vm._s(_vm.$t(\"Security notes\"))+\":\")]),_c('ul',{staticClass:\"text-muted small pl-4\"},[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"The app can only access the tunnel, not your {brandName} account info such as your email address.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"The access remains valid until explicitly revoked. You can revoke the access by going to Preferences -> Authorized Apps.\"))+\" \")])])])])]),_c('div',{staticClass:\"text-center pt-3 w-100\"},[_c('a',{staticClass:\"btn btn-secondary\",attrs:{\"href\":_vm.logoutUrl}},[_vm._v(_vm._s(_vm.$t(\"Log Out\")))])])]):_c('b-col',{staticClass:\"mt-5\"},[_c('div',[_c('b-container',[_c('div',{staticClass:\"d-flex justify-content-center align-items-center\"},[_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":_vm.appLogo}}),_c('h3',[_vm._v(\"⇄\")]),_c('svg',{staticClass:\"logo-icon obico\"},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})]),_c('h3',[_vm._v(\"⇄\")]),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":_vm.platformLogo}})]),_c('div',{staticClass:\"my-4\"},[_c('div',{staticClass:\"mx-auto text-center\"},[_c('h4',[_vm._v(_vm._s(_vm.$t(\"Free {platformDisplayName} Tunnel\",{platformDisplayName: _vm.platformDisplayName})))]),_c('div',{staticClass:\"lead\"},[_vm._v(_vm._s(_vm.$t(\"Powered by {brandName}\",{brandName:_vm.$syndicateText.brandName})))])])]),_c('div',{staticClass:\"account-details\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"With the Free {platformDisplayName} Tunnel by {brandName}, you can now use {appDisplayName} to\",{platformDisplayName: _vm.platformDisplayName,brandName:_vm.$syndicateText.brandName,appDisplayName: _vm.appDisplayName}))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"securely control and monitor your printer from anywhere\")))])]),_c('ul',{staticClass:\"text-muted\"},[_c('li',[_vm._v(_vm._s(_vm.$t(\"Unlimited realtime webcam at 0.1FPS.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"300MB monthly tunnel data cap (excluding webcam streaming).\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"10 hours/mo AI failure detection.\")))])]),_c('div',[_vm._v(\" 🔥🔥🔥 \"),_c('i18next',{attrs:{\"translation\":_vm.$t('Upgrade to {brandName} Pro Account ({localizedDom}) to get premium features')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"from $4/mo\")))])]},proxy:true},{key:\"brandName\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")]},proxy:true}])})],1),_c('ul',[_c('li',[_vm._v(\"📷\"+_vm._s(_vm.$t(\"Unlimited realtime webcam streaming.\")))]),_c('li',[_vm._v(\"📶 \"+_vm._s(_vm.$t(\"Unlimited tunnel data usage.\")))]),_c('li',[_vm._v(\"🤖 \"+_vm._s(_vm.$t(\"50 hours/mo AI failure detection.\")))]),_c('li',[_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"And much more...\")))])])])]),_c('div',[_c('div',{staticClass:\"my-5 w-100\"},[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"href\":_vm.loginUrl}},[_vm._v(_vm._s(_vm.$t(\"SIGN IN \")))]),_c('div',{staticClass:\"text-center pt-3 w-100\"},[_c('div',{staticClass:\"font-weight-light text-muted\"},[_vm._v(_vm._s(_vm.$t(\"- OR -\")))]),_c('a',{staticClass:\"btn\",attrs:{\"href\":_vm.signupUrl}},[_vm._v(_vm._s(_vm.$t(\"SIGN UP\")))])])])])])],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import moment from 'moment'\n\nexport const humanizedDuration = (durationInSeconds) => {\n  const seconds = Math.round(durationInSeconds || 0)\n  const components = getDurationComponents(seconds)\n\n  if (components.days !== 0) {\n    const hoursRounded = components.hours + Math.round(components.minutes / 60)\n    if (hoursRounded === 24) {\n      return `${components.days + 1}d ${0}h`\n    } else {\n      return `${components.days}d ${hoursRounded}h`\n    }\n  } else if (components.hours !== 0) {\n    if (components.minutes === 60) {\n      const hoursRounded = components.hours + 1\n      if (hoursRounded === 24) {\n        return `${1}d ${0}h`\n      } else {\n        return `${components.hours + 1}h ${0}m`\n      }\n    } else {\n      return `${components.hours}h ${components.minutes}m`\n    }\n  } else {\n    return `${components.minutes}m`\n  }\n}\n\nexport const getDurationComponents = (durationInSeconds) => {\n  const duration = moment.duration(durationInSeconds || 0, 'seconds')\n  const days = Math.floor(duration.asDays())\n  const hours = duration.hours()\n  const minutes = duration.minutes() + Math.round(duration.seconds() / 60)\n  return {\n    days,\n    hours,\n    minutes,\n  }\n}\n\nexport const humanizedFilamentUsage = (millimeters) => {\n  const meters = (millimeters || 0) / 1000\n  const twoDecimal = Math.round(meters * 100) / 100\n  return `${twoDecimal}m`\n}\n\nexport const timeFromNow = (duration, timeFormat = 'MMM D, h:mm a') => {\n  if (!duration) {\n    return '-'\n  }\n  let date = new Date()\n  let newDate = new Date(date.setSeconds(date.getSeconds() + duration))\n  return moment(newDate).format(timeFormat)\n}\n","import * as formatters from '@src/lib/formatters'\nimport i18n from '@src/i18n/i18n.js'\n\nexport const gcodeMetadata = [\n  {\n    name: 'estimated_time',\n    faIcon: 'fas fa-clock',\n    title: `${i18n.t('Print duration estimate')}`,\n    formatter: formatters.humanizedDuration,\n  },\n  {\n    name: 'filament_total',\n    faIcon: 'fas fa-ruler-horizontal',\n    title: `${i18n.t('Filament usage estimate')}`,\n    formatter: formatters.humanizedFilamentUsage,\n  },\n  {\n    name: 'first_layer_bed_temp',\n    svgIcon: 'bed-temp',\n    title: `${i18n.t('First layer bed temperature')}`,\n    formatter: (v) => `${v}°C`,\n  },\n  {\n    name: 'first_layer_extr_temp',\n    svgIcon: 'extruder',\n    title: `${i18n.t('First layer extruder temperature')}`,\n    formatter: (v) => `${v}°C`,\n  },\n  {\n    name: 'first_layer_height',\n    faIcon: 'fas fa-layer-group',\n    title: `${i18n.t('First layer height')}`,\n    formatter: (v) => `${v}mm`,\n  },\n  {\n    name: 'layer_height',\n    faIcon: 'fas fa-layer-group',\n    title: `${i18n.t('Layer height')}`,\n    formatter: (v) => `${v}mm`,\n  },\n  {\n    name: 'object_height',\n    faIcon: 'fas fa-ruler-vertical',\n    title: `${i18n.t('Object height')}`,\n    formatter: (v) => `${Math.round(v)}mm`,\n  },\n  {\n    name: 'filament_type',\n    svgIcon: 'filament',\n    title: `${i18n.t('Filament type')}`,\n    formatter: (v) => v,\n  },\n  {\n    name: 'filament_name',\n    svgIcon: 'filament',\n    title: `${i18n.t('Filament name')}`,\n    formatter: (v) => v,\n  },\n  {\n    name: 'slicer',\n    svgIcon: 'slicer-program',\n    title: `${i18n.t('Slicer')}`,\n    formatter: (v) => v,\n  },\n  {\n    name: 'slicer_version',\n    svgIcon: 'slicer-version',\n    title: `${i18n.t('Slicer version')}`,\n    formatter: (v) => v,\n  },\n]\n","import Vue from 'vue'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport i18n from '@src/i18n/i18n.js'\n\nconst TRANSIENT_STATES = {\n  'G-Code Downloading': {\n    fromStates: ['Operational'],\n  },\n  Starting: {\n    fromStates: ['Operational'],\n  },\n  Pausing: {\n    fromStates: ['Printing'],\n  },\n  Resuming: {\n    fromStates: ['Paused'],\n  },\n  Cancelling: {\n    fromStates: ['Printing', 'Paused'],\n  },\n}\n\nexport const setPrinterTransientState = (printer, transientStateName) => {\n  const printerId = printer.id\n  if (!isLocalStorageSupported()) return\n  const prefix = `printer-${printerId}-state-transitioning`\n  localStorage.setItem(`${prefix}-name`, transientStateName)\n\n  const currentTime = new Date()\n  // Agents in older versions didn't have all transient states implemented. So we make it more forgiving even if it increases the chance for app to be stuck in a transient state.\n  const timeOutInSeconds = printer.isAgentVersionGte('2.3.7', '1.4.2') ? 15 : 5 * 60\n  const timeout = new Date(currentTime.getTime() + timeOutInSeconds * 1000)\n  localStorage.setItem(`${prefix}-timeout`, timeout)\n}\n\nexport const getPrinterCalculatedState = (printer, underlinedState) => {\n  const printerId = printer.id\n\n  if (!isLocalStorageSupported()) return underlinedState\n\n  if (!underlinedState) {\n    // Printer is offline or disconnected, clear transient state if any\n    clearPrinterTransientState(printerId)\n    return null\n  }\n\n  const prefix = `printer-${printerId}-state-transitioning`\n  const persistedTransientState = localStorage.getItem(`${prefix}-name`)\n  const timeout = localStorage.getItem(`${prefix}-timeout`)\n  const fromStates = TRANSIENT_STATES[persistedTransientState]?.fromStates\n\n  let calculatedState = underlinedState\n  if (persistedTransientState && timeout && fromStates) {\n    if (fromStates.includes(underlinedState)) {\n      if (new Date() > new Date(timeout)) {\n        clearPrinterTransientState(printerId)\n        showTimeoutError(printer, persistedTransientState, underlinedState)\n      } else {\n        // underlinedState is still the previous state. Transition not finished\n        calculatedState = persistedTransientState\n      }\n    } else {\n      clearPrinterTransientState(printerId)\n    }\n  }\n\n  return calculatedState\n}\n\nexport const clearPrinterTransientState = (printerId) => {\n  if (!isLocalStorageSupported()) return\n  localStorage.removeItem('printer-' + printerId + '-state-transitioning-name')\n  localStorage.removeItem('printer-' + printerId + '-state-transitioning-timeout')\n}\n\nexport const showTimeoutError = (printer, localTransientState, newPrinterState) => {\n  window.Sentry?.captureMessage(\n    `Transient state timeout: \"${localTransientState}\" -> \"${newPrinterState}\" (printer ID: ${printer.id})`\n  )\n\n  Vue.swal\n    .fire({\n      icon: 'error',\n      title: `${i18n.t('Printer not responding')}`,\n      html: `${i18n.t(\"The printer doesn't seem to be responding. Is it powered on and connected to the Internet? Please\")} <a href=\"mailto:support@obico.io\">${i18n.t(\"report the problem to us\")}</a> ${i18n.t(\"if this error repeats multiple times.\")}`,\n    })\n    .then(() => {\n      window.location.reload()\n    })\n}\n","import moment from 'moment'\nimport get from 'lodash/get'\nimport filesize from 'filesize'\nimport semverGte from 'semver/functions/gte'\nimport { humanizedDuration } from '@src/lib/formatters'\nimport { gcodeMetadata } from '@src/components/g-codes/gcode-metadata'\nimport {\n  setPrinterTransientState,\n  getPrinterCalculatedState,\n} from '@src/lib/printer-transient-state'\n\nexport const toMomentOrNull = (datetimeStr) => {\n  if (!datetimeStr) {\n    return null\n  }\n  return moment(datetimeStr)\n}\n\nexport const PrintStatus = {\n  Printing: { key: 'printing', title: 'Printing...', isActive: true },\n  Paused: { key: 'paused', title: 'Paused', isActive: true },\n  Finished: { key: 'finished', title: 'Finished', isActive: false },\n  Cancelled: { key: 'cancelled', title: 'Cancelled', isActive: false },\n}\n\n// ––––––––––––––––––––––\n\nexport const normalizedPrint = (print) => {\n  print.started_at = toMomentOrNull(print.started_at)\n  print.uploaded_at = toMomentOrNull(print.uploaded_at)\n  print.finished_at = toMomentOrNull(print.finished_at)\n  print.cancelled_at = toMomentOrNull(print.cancelled_at)\n  print.ended_at = toMomentOrNull(print.ended_at)\n  if (print.ended_at) {\n    const duration = moment.duration(print.ended_at.diff(print.started_at))\n    print.duration = humanizedDuration(duration.asSeconds())\n  }\n  print.has_alerts = Boolean(print.alerted_at)\n  print.printShotFeedbackEligible =\n    print.printshotfeedback_set && print.printshotfeedback_set.length > 0\n  print.status = print.ended_at\n    ? print.cancelled_at\n      ? PrintStatus.Cancelled\n      : PrintStatus.Finished\n    : print.paused_at\n    ? PrintStatus.Paused\n    : PrintStatus.Printing\n  if (print.printer) {\n    print.printer = normalizedPrinter(print.printer)\n  }\n  if (print.g_code_file) {\n    print.g_code_file = normalizedGcode(print.g_code_file)\n  }\n  return print\n}\n\nexport const normalizedGcode = (gcode) => {\n  if (!gcode) {\n    return\n  }\n\n  gcode.created_at = toMomentOrNull(gcode.created_at)\n  gcode.updated_at = toMomentOrNull(gcode.updated_at)\n  gcode.deleted = toMomentOrNull(gcode.deleted)\n  gcode.filesize = filesize(gcode.num_bytes)\n\n  if (gcode.print_set) {\n    gcode.print_set.map((p) => normalizedPrint(p))\n    gcode.print_set.sort((a, b) => {\n      if (!a.ended_at && !b.ended_at) {\n        // if both in progress, sort by started_at\n        if (a.started_at > b.started_at) {\n          return -1\n        } else if (a.started_at < b.started_at) {\n          return 1\n        } else {\n          return 0\n        }\n      } else if (!a.ended_at) {\n        return -1\n      } else if (!b.ended_at) {\n        return 1\n      } else {\n        if (a.ended_at > b.ended_at) {\n          return -1\n        } else if (a.ended_at < b.ended_at) {\n          return 1\n        } else {\n          return 0\n        }\n      }\n    })\n    gcode.last_print = gcode.print_set[0]\n\n    gcode.failedPrints = gcode.print_set.filter((p) => p.cancelled_at).length\n    gcode.successPrints = gcode.print_set.filter((p) => p.finished_at).length\n    gcode.totalPrints = gcode.print_set.length\n  }\n\n  // Normalize metadata\n  gcode.metadata = {}\n\n  if (gcode.metadata_json) {\n    // obico file with metadata\n    gcode.metadata = JSON.parse(gcode.metadata_json)\n  } else if (gcode.analysis) {\n    // octoprint file\n    gcode.metadata.object_height = gcode.analysis.dimensions?.height\n    gcode.metadata.estimated_time = gcode.analysis.estimatedPrintTime\n\n    let filament_total\n    if (gcode.analysis.filament) {\n      const tools = Object.keys(gcode.analysis.filament)\n      if (tools.length) {\n        filament_total = 0\n        tools.forEach((key) => {\n          filament_total += gcode.analysis.filament[key].length\n        })\n      }\n    }\n    gcode.metadata.filament_total = filament_total\n  } else {\n    // either obico file without metadata or klipper file\n    gcodeMetadata.forEach((v) => {\n      if (gcode[v.name]) {\n        gcode.metadata[v.name] = gcode[v.name]\n      }\n    })\n  }\n\n  // leave only non-null metadata\n  Object.keys(gcode.metadata).forEach((key) => {\n    if (gcode.metadata[key] === null || gcode.metadata[key] === undefined) {\n      delete gcode.metadata[key]\n    }\n  })\n\n  // Normalize thumbnail\n  gcode.getBigThumbnailUrl = () => {\n    return gcode.thumbnail1_url || gcode.thumbnail2_url || gcode.thumbnail3_url\n  }\n  gcode.getSmallThumbnailUrl = () => {\n    return gcode.thumbnail3_url || gcode.thumbnail2_url || gcode.thumbnail1_url\n  }\n\n  return gcode\n}\n\nexport const normalizedGcodeFolder = (folder) => {\n  folder.created_at = toMomentOrNull(folder.created_at)\n  folder.updated_at = toMomentOrNull(folder.updated_at)\n  folder.numItems = folder.g_code_file_count + folder.g_code_folder_count\n  return folder\n}\n\nexport const normalizedPrinter = (newData, oldData) => {\n  const printerMixin = {\n    createdAt: function () {\n      return toMomentOrNull(this.created_at)\n    },\n    progressCompletion: function () {\n      return get(this, 'status.progress.completion', 0)\n    },\n    isOffline: function () {\n      return get(this, 'status', null) === null\n    },\n    isPaused: function () {\n      return get(this, 'status.state.flags.paused', false)\n    },\n    isDisconnected: function () {\n      return get(this, 'status.state.flags.closedOrError', true)\n    },\n    isActive: function () {\n      const flags = get(this, 'status.state.flags')\n      // https://discord.com/channels/704958479194128507/705047010641838211/1013193281280159875\n      return (\n        Boolean(flags && flags.operational && (!flags.ready || flags.paused)) ||\n        this.inTransientState()\n      )\n    },\n    inTransientState: function () {\n      const calculatedState = this.calculatedState()\n      // Backward compatibility with OctoPrint-Obico 2.3.7 - 2.3.9\n      if (calculatedState === 'Downloading G-Code') {\n        return true\n      }\n\n      return calculatedState && calculatedState.endsWith('ing') && calculatedState !== 'Printing'\n    },\n    calculatedState: function () {\n      return getPrinterCalculatedState(this, this.status?.state?.text)\n    },\n    calculatedStateColor: function () {\n      const calcState = this.calculatedState()\n      const colorMapping = {\n        secondary: ['Offline', undefined, null],\n        success: ['Operational'],\n        neutral: ['Printing', 'G-Code Downloading', 'Downloading G-Code', 'Starting'],\n        warning: ['Paused', 'Pausing', 'Resuming'],\n        danger: ['Cancelling'],\n      }\n\n      for (const [color, states] of Object.entries(colorMapping)) {\n        if (states.includes(calcState)) {\n          return color\n        }\n      }\n      return 'neutral' // fallback\n    },\n    setTransientState: function (stateText) {\n      setPrinterTransientState(this, stateText)\n      if (this.status) this.status = { ...this.status } // clone status to trigger immidiate UI update\n    },\n    inUserInteractionRequired: function () {\n      return get(this, 'status.user_interaction_required', false)\n    },\n    hasError: function () {\n      return (\n        get(this, 'status.state.flags.error') ||\n        get(this, 'status.state.text', '').toLowerCase().includes('error')\n      )\n    },\n    isAgentMoonraker: function () {\n      return get(this, 'agent_name', '') === 'moonraker_obico'\n    },\n    agentDisplayName: function () {\n      return this.isAgentMoonraker() ? 'Klipper' : 'OctoPrint'\n    },\n    isAgentVersionGte: function (minOctoPrintAgentVersion, minMoonrakerAgentVersion) {\n      return (\n        (get(this, 'settings.agent_name', '') === 'octoprint_obico' &&\n          semverGte(get(this, 'settings.agent_version', '0.0.0'), minOctoPrintAgentVersion)) ||\n        (get(this, 'settings.agent_name', '') === 'moonraker_obico' &&\n          semverGte(get(this, 'settings.agent_version', '0.0.0'), minMoonrakerAgentVersion))\n      )\n    },\n    alertUnacknowledged: function () {\n      return (\n        get(this, 'current_print.alerted_at') &&\n        moment(get(this, 'current_print.alerted_at')).isAfter(\n          moment(get(this, 'current_print.alert_acknowledged_at') || 0)\n        )\n      )\n    },\n    // Printing availability\n    isPrintable: function () {\n      return !this.isOffline() && !this.isDisconnected() && !this.isActive() && !this.archived_at\n    },\n    printabilityText: function () {\n      return this.isPrintable() ? 'Ready' : 'Unavailable'\n    },\n  }\n  if (oldData) {\n    if (\n      get(oldData, 'status._ts', -1) > get(newData, 'status._ts', get(oldData, 'status._ts', 0))\n    ) {\n      delete newData.status\n    }\n    return {\n      ...oldData,\n      ...newData,\n      ...printerMixin,\n    }\n  } else {\n    return {\n      ...newData,\n      ...printerMixin,\n    }\n  }\n}\n\nexport const normalizedPrinterEvent = (printerEvent) => {\n  printerEvent.created_at = toMomentOrNull(printerEvent.created_at)\n  return printerEvent\n}\n","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col v-if=\"user\" lg=\"8\" class=\"mt-3\">\n        <div v-if=\"printersToShow.length === 0\" class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h1 class=\"mx-auto\">{{$t(\"Welcome To\")}} {{ $syndicateText.brandName }}</h1>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row v-if=\"isEnt && trialDaysLeft > 0\">\n              <b-col>\n                <h3 v-if=\"trialDaysLeft >= 29\" class=\"py-3\">\n                  <i18next :translation=\"$t('Your 30-Day {localizedDom} Free Trial Has Started!')\">\n                    <template #localizedDom>\n                      <a class=\"link\" target=\"_blank\" :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\">{{$t(\"Pro Plan\")}}</a>\n                    </template>\n                  </i18next>\n                </h3>\n                <h3 v-else class=\"py-3\">\n                  <i18next :translation=\"$t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')\">\n                    <template #localizedDom>\n                      <a class=\"link\" target=\"_blank\" :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\">{{$t(\"Pro Plan\")}} </a>\n                    </template>\n                    <template #trialDaysLeft>\n                      {{trialDaysLeft}}\n                    </template>\n                  </i18next>\n\n                </h3>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\"\n                    >{{ $t('Unlimited Secure Tunnel to your {platformDisplayName}',{platformDisplayName}) }}</span\n                  >\n                </div>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{$t(\"Premium 25 FPS Webcam Streaming\")}}</span>\n                </div>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t(\"250 AI Failure Detection Hours\") }}</span>\n                </div>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t(\"G-Code Remote Upload and Printing\") }}</span>\n                </div>\n                <div class=\"lead py-4\">{{ $t(\"{platformDisplayName} has not been linked to your {brandName} account.\",{platformDisplayName,brandName:$syndicateText.brandName}) }}</div>\n                <div class=\"d-flex flex-column align-center justify-content-center\">\n                  <div>\n                    <a :href=\"wizardUrl\" class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                      >{{ $t(\"Link {platformDisplayName} Now\",{platformDisplayName}) }}</a\n                    >\n                  </div>\n                  <div>\n                    <div class=\"text-muted mx-auto text-center font-weight-light\">\n                      {{$t(\"It's as easy as 1-2-3.\")}}\n                    </div>\n                  </div>\n                </div>\n              </b-col>\n            </b-row>\n            <div class=\"footer-note small\">\n              <i18next :translation=\"$t('Not ready to start yet? {localizedDom} to pause your free trial.')\">\n                <template #localizedDom>\n                  <a href=\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\">{{$t(\"Email us\")}}</a>\n                </template>\n              </i18next>\n            </div>\n          </b-container>\n        </div>\n        <div v-else>\n          <div class=\"text-center\">\n            <svg width=\"100\" height=\"30\">\n              <use href=\"#svg-logo-full\" />\n            </svg>\n          </div>\n\n          <div v-if=\"authorized\" class=\"authorization-successful\">\n            <h4 class=\"title\">{{ $t(\"Authorization Successful!\") }}</h4>\n            <p>{{ $t(\"You can close this page\") }}</p>\n          </div>\n          <div v-else>\n            <div>\n              <div class=\"lead text-center mt-3 mb-5\">{{ $t(\"Tunnel Access Authorization\") }}</div>\n              <h4 class=\"my-4\">\n                <span class=\"font-weight-bold\">{{appDisplayName}}</span>\n\n                {{ $t('is requesting to access you {platformDisplayName} Tunnel.',{platformDisplayName}) }}\n              </h4>\n              <p class=\"text-muted\">\n                <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/')\" target=\"_blank\">{{platformDisplayName}} {{$t(\"Tunnel\")}}</a>\n                <i18next :translation=\"$t('is a secure way provided by {localizedDom} to remotely access your {platformDisplayName}. With the {platformDisplayName} Tunnel, you can use {appDisplayName} to access your {platformDisplayName} from anywhere.')\">\n                    <template #localizedDom>\n                      <a href=\"https://www.obico.io/\" target=\"_blank\">{{$syndicateText.brandName}}</a>\n                    </template>\n                    <template #platformDisplayName>\n                      {{platformDisplayName}}\n                    </template>\n                    <template #appDisplayName>\n                      {{appDisplayName}}\n                    </template>\n                  </i18next>\n              </p>\n\n              <b-alert v-if=\"!user.is_pro\" variant=\"warning\" dismissible class=\"my-3\" show>\n                <div>\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  <i18next :translation=\"$t('Tunnel usage of a free account is {localizedDom} to enjoy unlimited tunnel usage.')\">\n                    <template #localizedDom>\n                      <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb')\" target=\"_blank\">{{$t(\"capped at 300MB per month\")}}</a>. {{$t(\"You can\")}} <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\">{{$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:$syndicateText.brandName})}}</a>\n                    </template>\n                  </i18next>\n                </div>\n              </b-alert>\n              <b-alert\n                v-if=\"user.is_pro && trialDaysLeft > 0\"\n                variant=\"warning\"\n                dismissible\n                class=\"my-3\"\n                show\n              >\n                <div>\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  <i18next :translation=\"$t('After the Free trial expires, tunnel data usage will be {localizedDom} to continue enjoying unlimited tunnel usage.')\">\n                    <template #localizedDom>\n                      <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb')\" target=\"_blank\">{{$t(\"capped at 300MB per month\")}}</a>. {{$t(\"You can\")}} <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\">{{$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:$syndicateText.brandName})}}</a>\n                    </template>\n                  </i18next>\n\n                </div>\n              </b-alert>\n\n              <div class=\"mt-5\">\n                <p class=\"lead\">\n                  <i18next :translation=\"$t('Tunnel access by {localizedDom} (make sure you trust it)')\">\n                    <template #localizedDom>\n                      <span class=\"font-weight-bold\">{{appDisplayName}}</span>\n                    </template>\n                  </i18next>\n                </p>\n                <h5 v-if=\"printersToShow.length === 0\">{{ $t(\"You have 0 active printers\") }}</h5>\n                <h5 v-else-if=\"printersToShow.length === 1\" class=\"font-weight-bold\">\n                  {{ printersToShow[0].name }}\n                </h5>\n                <select\n                  v-else-if=\"printersToShow.length > 1\"\n                  v-model=\"printerToAuthorize\"\n                  class=\"custom-select\"\n                >\n                  <option :value=\"null\" selected disabled>{{ $t(\"Please select a printer\") }}</option>\n                  <option v-for=\"printer in printersToShow\" :key=\"printer.id\" :value=\"printer.id\">\n                    {{ printer.name }}\n                  </option>\n                </select>\n                <div v-if=\"printersToShow.length\" class=\"d-flex mt-4 mb-3\">\n                  <button\n                    class=\"btn btn-primary\"\n                    style=\"flex: 1\"\n                    :disabled=\"!printerToAuthorize || performingAuthRequest\"\n                    @click=\"authorize\"\n                  >\n                    <b-spinner v-if=\"performingAuthRequest\" small label=\"Loading...\"></b-spinner>\n                    <span v-else>{{ $t(\"Authorize\") }}</span>\n                  </button>\n                  <a\n                    class=\"btn btn-outline-secondary ml-2\"\n                    style=\"flex: 1\"\n                    href=\"/user_preferences/authorized_apps\"\n                    >{{ $t(\"Manage Apps\") }}</a\n                  >\n                </div>\n              </div>\n            </div>\n            <div class=\"mt-4\">\n              <p class=\"text-muted small mb-1\">{{ $t(\"Security notes\") }}:</p>\n              <ul class=\"text-muted small pl-4\">\n                <li>\n                  {{ $t(\"The app can only access the tunnel, not your {brandName} account info such as your email address.\",{brandName:$syndicateText.brandName}) }}\n                </li>\n                <li>\n                  {{ $t(\"The access remains valid until explicitly revoked. You can revoke the access by going to Preferences -> Authorized Apps.\") }}\n                </li>\n              </ul>\n            </div>\n          </div>\n        </div>\n        <div class=\"text-center pt-3 w-100\">\n          <a class=\"btn btn-secondary\" :href=\"logoutUrl\">{{ $t(\"Log Out\") }}</a>\n        </div>\n      </b-col>\n      <b-col v-else class=\"mt-5\">\n        <div>\n          <b-container>\n            <div class=\"d-flex justify-content-center align-items-center\">\n              <img class=\"logo-icon\" :src=\"appLogo\" />\n              <h3>&#8644;</h3>\n              <svg class=\"logo-icon obico\">\n                <use href=\"#svg-logo-compact\" />\n              </svg>\n              <h3>&#8644;</h3>\n              <img class=\"logo-icon\" :src=\"platformLogo\" />\n            </div>\n            <div class=\"my-4\">\n              <div class=\"mx-auto text-center\">\n                <h4>{{ $t(\"Free {platformDisplayName} Tunnel\",{platformDisplayName}) }}</h4>\n                <div class=\"lead\">{{ $t(\"Powered by {brandName}\",{brandName:$syndicateText.brandName}) }}</div>\n              </div>\n            </div>\n            <div class=\"account-details\">\n              <p>\n                {{ $t(\"With the Free {platformDisplayName} Tunnel by {brandName}, you can now use {appDisplayName} to\",{platformDisplayName,brandName:$syndicateText.brandName,appDisplayName}) }}\n                  <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb')\" target=\"_blank\"> {{$t(\"securely control and monitor your printer from anywhere\")}}</a>\n              </p>\n              <ul class=\"text-muted\">\n                <li>{{ $t(\"Unlimited realtime webcam at 0.1FPS.\") }}</li>\n                <li>{{ $t(\"300MB monthly tunnel data cap (excluding webcam streaming).\") }}</li>\n                <li>{{ $t(\"10 hours/mo AI failure detection.\") }}</li>\n              </ul>\n              <div>\n                🔥🔥🔥\n                <i18next :translation=\"$t('Upgrade to {brandName} Pro Account ({localizedDom}) to get premium features')\">\n                    <template #localizedDom>\n                      <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\">{{$t(\"from $4/mo\")}}</a>\n                    </template>\n                    <template #brandName>\n                      {{$syndicateText.brandName}}\n                    </template>\n                  </i18next>\n              </div>\n              <ul>\n                <li>📷{{ $t(\"Unlimited realtime webcam streaming.\") }}</li>\n                <li>📶 {{ $t(\"Unlimited tunnel data usage.\") }}</li>\n                <li>🤖 {{ $t(\"50 hours/mo AI failure detection.\") }}</li>\n                <li>\n                  <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\"\n                    >{{ $t(\"And much more...\") }}</a\n                  >\n                </li>\n              </ul>\n            </div>\n            <div>\n              <div class=\"my-5 w-100\">\n                <a class=\"btn btn-primary btn-block\" :href=\"loginUrl\">{{ $t(\"SIGN IN \") }}</a>\n                <div class=\"text-center pt-3 w-100\">\n                  <div class=\"font-weight-light text-muted\">{{ $t(\"- OR -\") }}</div>\n                  <a class=\"btn\" :href=\"signupUrl\">{{ $t(\"SIGN UP\") }}</a>\n                </div>\n              </div>\n            </div>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport urls from '@config/server-urls'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { user, settings } from '@src/lib/page-context'\nimport octopodLogo from '@static/img/octopod.webp'\nimport octoappLogo from '@static/img/octoapp.webp'\nimport polymerLogo from '@static/img/polymer.webp'\nimport printoidLogo from '@static/img/printoid.webp'\nimport mobilerakerLogo from '@static/img/mobileraker.webp'\nimport genericAppLogo from '@static/img/generic-app.png'\nimport octoprintLogo from '@static/img/octoprint_logo.png'\nimport klipperLogo from '@static/img/klipper_logo.jpg'\n\nexport default {\n  name: 'NewOctoPrintTunnelPage',\n\n  components: {},\n\n  data() {\n    return {\n      user: null,\n      printers: [],\n      printerId: null,\n      printerToAuthorize: null,\n      performingAuthRequest: false,\n      authorized: false,\n    }\n  },\n\n  computed: {\n    printersToShow() {\n      return this.printerId\n        ? this.printers.filter((printer) => printer.id == this.printerId)\n        : this.printers\n    },\n    loginUrl() {\n      return `/accounts/login/?hide_navbar=true&next=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    logoutUrl() {\n      return `/accounts/logout/?hide_navbar=true&next=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    signupUrl() {\n      return `/accounts/signup/?hide_navbar=true&next=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    wizardUrl() {\n      return `/printers/wizard/?redirectToTunnelCreation=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    appName() {\n      return new URLSearchParams(window.location.search).get('app') || 'Unknown App'\n    },\n    platform() {\n      return new URLSearchParams(window.location.search).get('platform')\n    },\n    trialDaysLeft() {\n      if (this.user?.subscription?.plan_id !== 'pro-trial') {\n        return -1\n      }\n      return moment(this.user.subscription.expired_at).diff(moment(), 'days') + 1\n    },\n    appLogo() {\n      switch (this.appName.toLowerCase()) {\n        case 'octopod':\n          return octopodLogo\n        case 'printoid':\n          return printoidLogo\n        case 'polymer':\n          return polymerLogo\n        case 'octoapp':\n          return octoappLogo\n        case 'mobileraker-ios':\n          return mobilerakerLogo\n        case 'mobileraker-android':\n          return mobilerakerLogo\n        default:\n          return genericAppLogo\n      }\n    },\n    appDisplayName() {\n      if (this.appName.toLowerCase().includes('mobileraker')) {\n        return 'Mobileraker'\n      }\n      return this.appName\n    },\n    isKlipper() {\n      if (this.platform) {\n        if (this.platform.toLowerCase() === 'klipper') {\n          return true\n        }\n      } else {\n        if (this.appName.toLowerCase().includes('mobileraker')) {\n          return true\n        }\n      }\n      return false\n    },\n    platformLogo() {\n      return this.isKlipper ? klipperLogo : octoprintLogo\n    },\n    platformDisplayName() {\n      return this.isKlipper ? 'Klipper' : 'OctoPrint'\n    },\n  },\n\n  created() {\n    this.user = user()\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.printerId = new URLSearchParams(window.location.search).get('printer_id')\n    if (this.user) {\n      this.fetchPrinters()\n    }\n  },\n\n  methods: {\n    fetchPrinters() {\n      return axios.get(urls.printers()).then((response) => {\n        response.data.forEach((p) => {\n          this.printers.push(normalizedPrinter(p))\n        })\n        if (this.printersToShow.length == 1) {\n          this.printerToAuthorize = this.printersToShow[0].id\n        }\n      })\n    },\n\n    authorize() {\n      if (this.printersToShow.length) {\n        this.performingAuthRequest = true\n        axios\n          .post(urls.tunnels(), {\n            app_name: this.appName,\n            target_printer_id: this.printerToAuthorize || this.printersToShow[0].id,\n          })\n          .then((response) => {\n            this.authorized = true\n            const tunnelEndpoint = response.data.tunnel_endpoint\n            const redirectUrl =\n              new URLSearchParams(window.location.search).get('success_redirect_url') ||\n              '/tunnels/succeeded/'\n            window.location.replace(`${redirectUrl}?tunnel_endpoint=${tunnelEndpoint}`)\n          })\n          .catch((error) => {\n            this.performingAuthRequest = false\n            this.errorDialog(error)\n          })\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\nbody\n  padding-bottom: 0\n\n.wizard-container\n  padding: 1.5rem 0.6rem 3rem\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 0.5em\n\n.authorization-successful\n  padding-top: 6rem\n  text-align: center\n\n.logo-img\n  max-height: 4em\n  margin-bottom: 2em\n\n.logo-icon\n  max-height: 50px\n  max-width: 50px\n  margin: 0px 15px\n  border-radius: 50%\n  object-fit: cover\n\n  &.obico\n    max-width: 46px\n    color: var(--color-primary)\n\n.account-details\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-sm)\n  padding: 15px\n  margin-left: -15px\n  margin-right: -15px\n\n.footer-note\n  margin: 3rem 0 -1.5rem\n  text-align: right\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NewOctoPrintTunnelPage.vue?vue&type=template&id=b30f9c60&scoped=true&\"\nimport script from \"./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nexport * from \"./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewOctoPrintTunnelPage.vue?vue&type=style&index=0&id=b30f9c60&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b30f9c60\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.isPro && _vm.usageFetched)?_c('div',{staticClass:\"floating-panel\"},[(_vm.showDetails)?_c('div',{on:{\"click\":function($event){_vm.showDetails = false},\"mouseover\":function($event){_vm.showDetails = true},\"mouseleave\":function($event){_vm.showDetails = false}}},[_c('div',{staticClass:\"text-muted\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Monthly data usage ({localizedDom})')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#is-octoprint-tunneling-free-to-all-users'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Resets in {daysUntilReset} days\",{daysUntilReset: _vm.daysUntilReset})))])]},proxy:true}],null,false,1207903965)})],1),_c('div',{class:_vm.usageClass},[_vm._v(_vm._s(_vm.$t(\"Used {usageMTD} of {humanizedUsageCap}.\",{usageMTD: _vm.usageMTD,humanizedUsageCap: _vm.humanizedUsageCap})))]),(_vm.overage)?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Your month-to-date tunnel data usage is over the Free plan limit.\"))+\" \"),_c('a',{staticClass:\"btn btn-sm btn-primary\",attrs:{\"type\":\"button\",\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Get Unlimited Tunnel Data\")))])]):_vm._e()]):_c('div',{class:_vm.usageClass,on:{\"click\":function($event){_vm.showDetails = true},\"mouseover\":function($event){_vm.showDetails = true},\"mouseleave\":function($event){_vm.showDetails = false}}},[_vm._v(\" \"+_vm._s(_vm.percentage)+\"% \")])]):_vm._e(),_c('div',[(_vm.printerId)?_c('iframe',{staticClass:\"tunnel-iframe\",attrs:{\"src\":_vm.iframeUrl() + '#temp'}}):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div v-if=\"!isPro && usageFetched\" class=\"floating-panel\">\n      <div\n        v-if=\"showDetails\"\n        @click=\"showDetails = false\"\n        @mouseover=\"showDetails = true\"\n        @mouseleave=\"showDetails = false\"\n      >\n        <div class=\"text-muted\">\n          <i18next :translation=\"$t('Monthly data usage ({localizedDom})')\">\n            <template #localizedDom>\n              <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#is-octoprint-tunneling-free-to-all-users')\" target=\"_blank\">{{$t(\"Resets in {daysUntilReset} days\",{daysUntilReset})}}</a>\n            </template>\n          </i18next>\n        </div>\n        <div :class=\"usageClass\">{{ $t(\"Used {usageMTD} of {humanizedUsageCap}.\",{usageMTD,humanizedUsageCap}) }}</div>\n        <div v-if=\"overage\">\n          {{$t(\"Your month-to-date tunnel data usage is over the Free plan limit.\")}}\n          <a type=\"button\" class=\"btn btn-sm btn-primary\" href=\"/ent_pub/pricing/\"\n            >{{ $t(\"Get Unlimited Tunnel Data\") }}</a\n          >\n        </div>\n      </div>\n      <div\n        v-else\n        :class=\"usageClass\"\n        @click=\"showDetails = true\"\n        @mouseover=\"showDetails = true\"\n        @mouseleave=\"showDetails = false\"\n      >\n        {{ percentage }}%\n      </div>\n    </div>\n    <div>\n      <iframe v-if=\"printerId\" :src=\"iframeUrl() + '#temp'\" class=\"tunnel-iframe\"></iframe>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport split from 'lodash/split'\nimport filesize from 'filesize'\nimport urls from '@config/server-urls'\nimport { user } from '@src/lib/page-context'\nimport { isLocalStorageSupported } from '@static/js/utils'\n\nexport default {\n  name: 'OctoPrintTunnelPage',\n\n  components: {},\n\n  props: {},\n  data: function () {\n    return {\n      bytesMTD: null,\n      usageCap: null,\n      usageFetched: false,\n      isPro: true,\n      printerId: null,\n      showDetails: false,\n    }\n  },\n\n  computed: {\n    usageClass() {\n      return {\n        'text-success': this.bytesMTD < this.usageCap * 0.8,\n        'text-warning': this.bytesMTD >= this.usageCap * 0.8 && this.bytesMTD < this.usageCap,\n        'text-danger': this.bytesMTD >= this.usageCap,\n      }\n    },\n    usageMTD() {\n      return filesize(this.bytesMTD)\n    },\n    humanizedUsageCap() {\n      return filesize(this.usageCap)\n    },\n    overage() {\n      return this.bytesMTD >= this.usageCap\n    },\n    percentage() {\n      return Math.round((this.bytesMTD / this.usageCap) * 100)\n    },\n    daysUntilReset() {\n      const endOfMonth = moment().endOf('month')\n      return endOfMonth.diff(moment(), 'days') + 1\n    },\n  },\n\n  created() {\n    this.isPro = user().is_pro\n    this.printerId = split(window.location.pathname, '/').slice(-2, -1).pop()\n  },\n\n  mounted() {\n    const skipWarning = isLocalStorageSupported()\n      ? localStorage.getItem('skip-tunneling-warning')\n      : null\n    if (skipWarning !== 'yes') {\n      this.$swal.Prompt.fire(\n        {\n          html: `\n          <h4 class=\"text-center p-2\">\n            <svg class=\"menu-icon\" style=\"height: 1.1em; width: 1em; margin-right: 0.75em;\">\n              <use href=\"#svg-tunnel\" />\n            </svg>\n            ${this.$i18next.t(\"OctoPrint/Klipper Secure Tunnel\")}\n          </h4>\n          <div class=\"p-1\">\n            ${this.$i18next.t(\"It may take long time for OctoPrint/Mainsail/Fluidd page to load as it is securely tunneled via the {brandName} app server.\",{brandName:this.$syndicateText.brandName})}\n          </div>\n          <div class=\"p-1\">\n            <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/octoprint-tunneling/#is-octoprint-tunneling-free-to-all-users')}\">\n            ${this.$i18next.t(\"Learn more about OctoPrint/Klipper tunnel's security and page load speed.\")}\n            <i class=\"fas fa-external-link-alt\"></i>\n          </a>\n        </div>\n        `,\n          input: 'checkbox',\n          inputPlaceholder: `${this.$i18next.t(\"Don't show again\")}`,\n        },\n        'octoprint-tunnel.warning'\n      ).then((result) => {\n        if (result.isConfirmed) {\n          if (result.value && isLocalStorageSupported()) {\n            localStorage.setItem('skip-tunneling-warning', 'yes')\n          }\n        }\n      })\n\n      // Scale up popup on mobiles, otherwise it's too small (because of disabled meta viewport tag)\n      if (window.matchMedia('(pointer:none), (pointer:coarse)')) {\n        document.querySelector('.swal2-popup').classList.add('x150')\n      }\n    }\n\n    const self = this\n    const fetchUsage = (firstFetch = false) => {\n      axios.get(urls.tunnelUsage()).then((resp) => {\n        self.bytesMTD = resp.data.total\n        self.usageCap = resp.data.monthly_cap\n        if (firstFetch) {\n          self.usageFetched = true\n        }\n      })\n    }\n    setInterval(fetchUsage, 15 * 1000)\n    setTimeout(() => {\n      fetchUsage(true)\n    }, 4000)\n  },\n\n  methods: {\n    iframeUrl() {\n      return `/octoprint/${this.printerId}/`\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.tunnel-iframe\n    width: 100%\n    height: 100vh\n    background: var(--color-background)\n    position: absolute\n    top: 0\n    left: 0\n\n.floating-panel\n  position: fixed\n  bottom: 0px\n  right: 0px\n  box-shadow: 2px 2px 10px rgba(0,0,0,.3)\n  background-color: var(--color-surface-primary)\n  padding: 10px\n  max-width: 300px\n  z-index: 10\n  display: flex\n  align-items: center\n</style>\n\n<style lang=\"sass\">\n@media (pointer:none), (pointer:coarse)\n  .swal2-popup.x150\n    transform: scale(1.5)\n  .floating-panel\n    transform: scale(2)\n    transform-origin: right bottom\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./OctoPrintTunnelPage.vue?vue&type=template&id=60f4cf2a&scoped=true&\"\nimport script from \"./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nexport * from \"./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./OctoPrintTunnelPage.vue?vue&type=style&index=0&id=60f4cf2a&prod&lang=sass&scoped=true&\"\nimport style1 from \"./OctoPrintTunnelPage.vue?vue&type=style&index=1&id=60f4cf2a&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"60f4cf2a\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',{staticClass:\"feedback-container\"},[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',{attrs:{\"lg\":\"8\"}},[_c('div',{staticClass:\"card\"},[_c('h5',{staticClass:\"card-header text-center\"},[_vm._v(\" F \"),_c('i',{staticClass:\"fas fa-search focused-feedback-icon\"}),_vm._v(_vm._s(_vm.$t(\"CUSED FEEDBACK\"))+\" \")]),_c('loading',{attrs:{\"active\":_vm.print === null,\"is-full-page\":true}}),(_vm.print !== null)?_c('div',[(!_vm.print.access_consented_at)?_c('focused-feedback-consent',{attrs:{\"print\":_vm.print},on:{\"continue-btn-pressed\":_vm.consentBtnPressed}}):_c('div',[_c('div',[_c('vue-slick-carousel',{ref:\"carousel\",attrs:{\"arrows\":false,\"dots\":true},on:{\"afterChange\":_vm.onNextShot},scopedSlots:_vm._u([{key:\"customPaging\",fn:function(page){return [_c('div',{class:_vm.pageClass(page)},[_vm._v(\"•\")])]}}],null,false,3226812120)},_vm._l((_vm.shots),function(shot,i){return _c('print-shot-card',{key:i,attrs:{\"shot\":shot},on:{\"shotChanged\":_vm.onShotChanged,\"prev\":_vm.onPrev,\"next\":_vm.onNext}})}),1)],1),_c('br'),_c('div',{staticClass:\"card-body p-3\"},[_c('a',{attrs:{\"href\":`/prints/${_vm.print.id}/`}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Print Page\"))+\" \")])])])],1):_vm._e()],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('img',{staticClass:\"card-img-top\",attrs:{\"src\":_vm.shot.image_url}}),_c('div',{staticClass:\"px-3 pt-4\"},[_c('b-form-group',{attrs:{\"label\":\"Do you see any spaghetti in this picture?\"}},[_c('b-form-radio-group',{attrs:{\"options\":_vm.options},on:{\"change\":_vm.updateShot},model:{value:(_vm.answer),callback:function ($$v) {_vm.answer=$$v},expression:\"answer\"}})],1),_c('small',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Not sure? Look at\"))+\" \"),_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#spaghetti-examples')}},[_vm._v(_vm._s(_vm.$t(\"some examples. \"))),_vm._m(0)])]),_c('div',{staticClass:\"navigation-container my-4\",staticStyle:{\"display\":\"flex\"}},[_c('b-button',{attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":function($event){return _vm.$emit('prev')}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\"  \"+_vm._s(_vm.$t(\"Previous\"))+\" \")]),_c('b-button',{attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":function($event){return _vm.$emit('next')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Next\"))+\"  \"),_c('i',{staticClass:\"fas fa-chevron-right\"})])],1)],1)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <img class=\"card-img-top\" :src=\"shot.image_url\" />\n    <div class=\"px-3 pt-4\">\n      <b-form-group label=\"Do you see any spaghetti in this picture?\">\n        <b-form-radio-group\n          v-model=\"answer\"\n          :options=\"options\"\n          @change=\"updateShot\"\n        ></b-form-radio-group>\n      </b-form-group>\n      <small class=\"text-muted\">\n        {{$t(\"Not sure? Look at\")}}\n        <a\n          target=\"_blank\"\n          :href=\"getDocUrl('/user-guides/how-does-credits-work#spaghetti-examples')\"\n          >{{ $t(\"some examples. \") }}<small><i class=\"fas fa-external-link-alt\"></i></small\n        ></a>\n      </small>\n      <div class=\"navigation-container my-4\" style=\"display: flex\">\n        <b-button variant=\"outline-secondary\" @click=\"$emit('prev')\">\n          <i class=\"fas fa-chevron-left\"></i>&nbsp;&nbsp;{{$t(\"Previous\")}}\n        </b-button>\n\n        <b-button variant=\"outline-secondary\" @click=\"$emit('next')\">\n          {{$t(\"Next\")}}&nbsp;&nbsp;<i class=\"fas fa-chevron-right\"></i>\n        </b-button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\n\nimport urls from '@config/server-urls'\nimport { BFormGroup, BFormRadioGroup } from 'bootstrap-vue'\n\nexport default {\n  name: 'PrintShotCard',\n\n  components: {\n    BFormGroup,\n    BFormRadioGroup,\n  },\n\n  props: {\n    shot: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      answer: this.shot.answer,\n      options: [\n        { text: 'Yes', value: 'LOOKS_BAD' },\n        { text: 'No', value: 'LOOKS_OK' },\n        { text: 'I am not sure', value: 'UNDECIDED' },\n      ],\n    }\n  },\n\n  methods: {\n    updateShot: function (answer) {\n      axios\n        .put(urls.printShotFeedback(this.shot.id, this.shot.print_id), {\n          answer: answer,\n        })\n\n        .then((response) => {\n          const { instance, credited_dhs } = response.data\n\n          if (credited_dhs > 0) {\n            this.$swal.Prompt.fire({\n              title: `${this.$i18next.t('You are awesome!')}`,\n              html: `<p>${this.$i18next.t(\"The AI failure detection just got a little better because of your feedback!\")}</p><p>${this.$i18next.t(\"You just earned 2 non-expirable AI Detection Hours - Yay!\")}</p>`,\n              confirmButtonText: `${this.$i18next.t(\"I'm done!\")}`,\n              showCancelButton: true,\n              cancelButtonText: `${this.$i18next.t('Change feedback')}`,\n            }).then((result) => {\n              if (result.isConfirmed) {\n                window.location.href = '/print_history/'\n              } else {\n                this.$emit('shotChanged', instance)\n              }\n            })\n          } else {\n            this.$emit('shotChanged', instance)\n          }\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.navigation-container\n  display: flex\n  justify-content: space-between\n  align-items: center\n  gap: 1rem\n  margin: -1.5em\n  margin-bottom: .5em\n  padding: 1em 1.5em\n  background-color: var(--color-surface-primary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintShotCard.vue?vue&type=template&id=413ec1b9&scoped=true&\"\nimport script from \"./PrintShotCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintShotCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintShotCard.vue?vue&type=style&index=0&id=413ec1b9&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"413ec1b9\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"page-wrapper\",class:{ collapsed: _vm.collapsed, 'is-in-mobile': _vm.inMobileWebView, 'is-in-popup': _vm.isPopup }},[_c('nav',{staticClass:\"side-nav\"},[_c('a',{staticClass:\"sidebar-header\",attrs:{\"href\":\"/\"}},[_c('SyndicateAwareSVG',{attrs:{\"href\":\"#svg-logo-compact\",\"width\":\"100\",\"height\":\"30\"}})],1),_c('ul',{staticClass:\"list-unstyled m-0\"},[(_vm.isEnt && !_vm.user.is_pro)?_c('li',{class:{ active: _vm.path === '/ent_pub/pricing/' }},[_c('a',{staticClass:\"primary\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"star\"}}),_vm._v(\" \"+_vm._s(_vm.$t('Upgrade to'))+\" AI Premium \")],1)]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/printers/') }},[_c('a',{attrs:{\"href\":\"/printers/\"}},[_c('svg',{staticStyle:{\"margin-bottom\":\"5px\"},attrs:{\"width\":\"1.4em\",\"height\":\"1.4em\"}},[_c('use',{attrs:{\"href\":\"#svg-3d-printer\"}})]),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t(\"Printers\"))+\" \")])]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/g_code_') }},[_c('a',{attrs:{\"href\":\"/g_code_folders/cloud/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-file-code\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"G-Codes\"))+\" \")],1)]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/print_history/') || _vm.path.includes('/prints/') }},[_c('a',{attrs:{\"href\":\"/print_history/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-calendar-days\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Print History\"))+\" \")],1)]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/stats/') }},[_c('a',{attrs:{\"href\":\"/stats/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-chart-pie\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Statistics\"))+\" \")],1)]):_vm._e()]),_c('div',{staticClass:\"side-nav-footer\"},[_c('ul',{staticClass:\"list-unstyled m-0\"},[(_vm.isEnt)?_c('li',{class:{ active: _vm.path === '/ent_pub/pricing/' }},[_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-money-check-dollar\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Pricing\"))+\" \")],1)]):_vm._e(),_c('li',[_c('a',{attrs:{\"href\":\"https://www.obico.io/help/\",\"target\":\"_blank\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-circle-question\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Help\"))+\" \")],1)]),_c('li',[_c('a',{attrs:{\"href\":\"https://obico.io/discord\",\"target\":\"_blank\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-brands fa-discord\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Community\"))+\" \")],1)]),_vm._m(0),(_vm.user)?_c('li',{class:{ active: _vm.path === '/printer_events/' }},[_c('a',{attrs:{\"href\":\"/printer_events/\"}},[_c('div',{staticClass:\"position-relative\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"fas fa-bell\"}}),(_vm.hasUnseenPrinterEvents)?_c('span',{staticClass:\"badge\"},[_vm._v(_vm._s(_vm.unseenPrinterEventsDisplay))]):_vm._e()],1),_c('span',{staticClass:\"trim-text\"},[_vm._v(_vm._s(_vm.$t(\"Notifications\")))])])]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/user_preferences/') }},[_c('a',{attrs:{\"href\":\"/user_preferences/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fas fa-cog\"}}),_c('span',{staticClass:\"trim-text\"},[_vm._v(_vm._s(_vm.$t(\"Preferences\")))])],1)]):_vm._e()])])]),_c('div',{staticClass:\"content-wrapper\",class:{\n      'hide-top-nav': (!_vm.$slots.topBarLeft && !_vm.$slots.topBarRight) || _vm.hideHeader,\n    }},[_c('b-navbar',{staticClass:\"top-nav\"},[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('b-button',{staticClass:\"shadow-none p-0 mr-3 position-relative toggle-sidebar\",attrs:{\"variant\":\"_\"},on:{\"click\":function($event){_vm.collapsed = !_vm.collapsed}}},[_c('i',{staticClass:\"fas fa-bars position-relative\"},[(_vm.hasUnseenPrinterEvents)?_c('div',{staticClass:\"notification-dot\"},[_c('svg',{attrs:{\"width\":\"8px\",\"height\":\"8px\"}},[_c('use',{attrs:{\"href\":\"#svg-circle-icon\"}})])]):_vm._e()])]),_vm._t(\"topBarLeft\")],2),_vm._t(\"topBarRight\")],2),_c('div',{staticClass:\"page-content\"},[_vm._t(\"content\")],2)],1),_c('div',{staticClass:\"content-overlay\",on:{\"click\":function($event){_vm.collapsed = true}}})])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('li',[_c('hr',{staticClass:\"my-0 mx-2\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div\n    class=\"page-wrapper\"\n    :class=\"{ collapsed: collapsed, 'is-in-mobile': inMobileWebView, 'is-in-popup': isPopup }\"\n  >\n    <!-- Sidebar -->\n    <nav class=\"side-nav\">\n      <a href=\"/\" class=\"sidebar-header\">\n        <SyndicateAwareSVG href=\"#svg-logo-compact\" width=\"100\" height=\"30\" />\n      </a>\n      <ul class=\"list-unstyled m-0\">\n        <li v-if=\"isEnt && !user.is_pro\" :class=\"{ active: path === '/ent_pub/pricing/' }\">\n          <a href=\"/ent_pub/pricing/\" class=\"primary\">\n            <font-awesome-icon icon=\"star\" />\n            {{ $t('Upgrade to') }} AI Premium\n          </a>\n        </li>\n        <li v-if=\"user\" :class=\"{ active: path.includes('/printers/') }\">\n          <a href=\"/printers/\">\n            <svg width=\"1.4em\" height=\"1.4em\" style=\"margin-bottom: 5px\">\n              <use href=\"#svg-3d-printer\" />\n            </svg>\n            <br />\n            {{$t(\"Printers\")}}\n          </a>\n        </li>\n        <li v-if=\"user\" :class=\"{ active: path.includes('/g_code_') }\">\n          <a href=\"/g_code_folders/cloud/\">\n            <font-awesome-icon icon=\"fa-file-code\" />\n            {{$t(\"G-Codes\")}}\n          </a>\n        </li>\n        <li\n          v-if=\"user\"\n          :class=\"{ active: path.includes('/print_history/') || path.includes('/prints/') }\"\n        >\n          <a href=\"/print_history/\">\n            <font-awesome-icon icon=\"fa-calendar-days\" />\n            {{$t(\"Print History\")}}\n          </a>\n        </li>\n        <li v-if=\"user\" :class=\"{ active: path.includes('/stats/') }\">\n          <a href=\"/stats/\">\n            <font-awesome-icon icon=\"fa-chart-pie\" />\n            {{$t(\"Statistics\")}}\n          </a>\n        </li>\n      </ul>\n      <div class=\"side-nav-footer\">\n        <ul class=\"list-unstyled m-0\">\n          <li v-if=\"isEnt\" :class=\"{ active: path === '/ent_pub/pricing/' }\">\n            <a href=\"/ent_pub/pricing/\">\n              <font-awesome-icon icon=\"fa-money-check-dollar\" />\n              {{$t(\"Pricing\")}}\n            </a>\n          </li>\n          <li>\n            <a href=\"https://www.obico.io/help/\" target=\"_blank\">\n              <font-awesome-icon icon=\"fa-circle-question\" />\n              {{$t(\"Help\")}}\n            </a>\n          </li>\n          <li>\n            <a href=\"https://obico.io/discord\" target=\"_blank\">\n              <font-awesome-icon icon=\"fa-brands fa-discord\" />\n              {{$t(\"Community\")}}\n            </a>\n          </li>\n          <li>\n            <hr class=\"my-0 mx-2\" />\n          </li>\n          <li v-if=\"user\" :class=\"{ active: path === '/printer_events/' }\">\n            <a href=\"/printer_events/\">\n              <div class=\"position-relative\">\n                <font-awesome-icon icon=\"fas fa-bell\" />\n                <span v-if=\"hasUnseenPrinterEvents\" class=\"badge\">{{\n                  unseenPrinterEventsDisplay\n                }}</span>\n              </div>\n              <span class=\"trim-text\">{{ $t(\"Notifications\") }}</span>\n            </a>\n          </li>\n          <li v-if=\"user\" :class=\"{ active: path.includes('/user_preferences/') }\">\n            <a href=\"/user_preferences/\">\n              <font-awesome-icon icon=\"fas fa-cog\" />\n              <span class=\"trim-text\">{{ $t(\"Preferences\") }}</span>\n            </a>\n          </li>\n        </ul>\n      </div>\n    </nav>\n    <!-- Main view (with top-bar) -->\n    <div\n      class=\"content-wrapper\"\n      :class=\"{\n        'hide-top-nav': (!$slots.topBarLeft && !$slots.topBarRight) || hideHeader,\n      }\"\n    >\n      <!-- Top-bar -->\n      <b-navbar class=\"top-nav\">\n        <div class=\"d-flex align-items-center\">\n          <b-button\n            variant=\"_\"\n            class=\"shadow-none p-0 mr-3 position-relative toggle-sidebar\"\n            @click=\"collapsed = !collapsed\"\n          >\n            <i class=\"fas fa-bars position-relative\">\n              <div v-if=\"hasUnseenPrinterEvents\" class=\"notification-dot\">\n                <svg width=\"8px\" height=\"8px\">\n                  <use href=\"#svg-circle-icon\" />\n                </svg>\n              </div>\n            </i>\n          </b-button>\n          <slot name=\"topBarLeft\"></slot>\n        </div>\n        <slot name=\"topBarRight\"></slot>\n      </b-navbar>\n      <!-- Page content -->\n      <div class=\"page-content\">\n        <slot name=\"content\"></slot>\n      </div>\n    </div>\n    <div class=\"content-overlay\" @click=\"collapsed = true\"></div>\n  </div>\n</template>\n\n<script>\nimport get from 'lodash/get'\nimport { inMobileWebView, user, settings } from '@src/lib/page-context'\n\nexport default {\n  name: 'PageLayout',\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data() {\n    return {\n      collapsed: true,\n      path: window.location.pathname,\n      user: null,\n      allowSignUp: false,\n      isEnt: false,\n    }\n  },\n\n  computed: {\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n    hideHeader() {\n      const urlParams = new URLSearchParams(window.location.search)\n      return urlParams.get('hide_header') === 'true'\n    },\n    hasUnseenPrinterEvents() {\n      return get(this.user, 'unseen_printer_events', 0) > 0\n    },\n    unseenPrinterEventsDisplay() {\n      const num = get(this.user, 'unseen_printer_events', 0)\n      return num > 99 ? '99+' : num\n    },\n  },\n\n  created() {\n    const { ACCOUNT_ALLOW_SIGN_UP, IS_ENT } = settings()\n    this.allowSignUp = !!ACCOUNT_ALLOW_SIGN_UP\n    this.isEnt = !!IS_ENT\n    this.user = user()\n  },\n\n  mounted() {\n    // Temporary solution to correctly show alerts inserted by `snippets/messages.html` from Django\n    const staticAlert = document.querySelector('.message-snippet')\n    if (staticAlert && this.inMobileWebView) {\n      staticAlert.classList.add('is-in-mobile')\n    }\n    if (this.inMobileWebView) {\n      document.querySelector('body').style.paddingBottom = 0\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\">\n.message-snippet\n  margin-top: 50px\n  margin-left: 100px\n  @media (max-width: 768px)\n    margin-left: 0\n  &.is-in-mobile\n    margin-left: 0\n</style>\n\n<style lang=\"sass\" scoped>\n.page-wrapper\n  display: flex\n  padding-left: 100px\n  background-color: var(--color-background)\n  &.is-in-mobile\n    padding-left: 0\n    .side-nav\n      display: none\n    .toggle-sidebar\n      display: none\n\n    .content-wrapper.hide-top-nav\n      .top-nav\n        display: none\n      .page-content\n        padding: 15px 0\n\n  &.is-in-popup\n    padding-left: 0\n    .side-nav\n      display: none\n    .toggle-sidebar\n      display: none\n\n    .top-nav\n      position: relative\n      padding: 0 15px\n    .page-content\n      padding: 15px 0\n      min-height: unset\n\n.side-nav\n  min-width: 100px\n  max-width: 100px\n  text-align: center\n  background: var(--color-surface-primary)\n  position: fixed\n  left: 0\n  top: 0\n  height: 100%\n  display: flex\n  flex-direction: column\n  z-index: 1000\n  overflow-y: auto\n  transition: all .2s ease-out\n  border-right: 1px solid var(--color-divider)\n  .sidebar-header\n    flex: 0 0 50px\n    display: flex\n    align-items: center\n    justify-content: center\n    border-bottom: 1px solid var(--color-divider)\n  ul\n    li\n      a\n        display: block\n        color: var(--color-text-primary)\n        padding: 10px 5px\n        margin: 4px\n        border-radius: var(--border-radius-sm)\n        text-align: center\n        font-size: 0.85em\n        &:hover, &[aria-expanded=\"true\"]\n          color: var(--color-text-primary)\n        &:hover\n          background: var(--color-hover)\n        &.primary\n          color: var(--color-primary)\n        &.dropdown-toggle\n          cursor: pointer\n          padding-bottom: 20px\n        i, ::v-deep .svg-inline--fa\n          margin-right: 0\n          display: block\n          font-size: 1.4em\n          margin-bottom: 5px\n        ::v-deep .svg-inline--fa\n          margin: 0 auto 5px\n        .badge\n          border-radius: 2em\n          position: absolute\n          top: -0.35em\n          right: 2em\n          padding: 0.25em 0.3em\n          font-family: var(--default-font-family)\n          font-size: .714rem\n          font-weight: bold\n          color: var(--color-on-danger)\n          background-color: var(--color-danger)\n          min-width: 1.6em\n      &.active > a\n        background: var(--color-hover)\n      &.glowing\n        text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px var(--color-primary), 0 0 70px var(--color-primary), 0 0 80px var(--color-primary), 0 0 100px var(--color-primary), 0 0 150px var(--color-primary)\n    ul a\n      font-size: 0.9em !important\n      padding: 10px !important\n    .dropdown-toggle::after\n      top: auto\n      bottom: 10px\n      right: 50%\n      -webkit-transform: translateX(50%)\n      -ms-transform: translateX(50%)\n      transform: translateX(50%)\n  ul.components\n    padding: 20px 0\n  ::v-deep .logo-small\n    width: 30px\n    height: 30px\n    color: var(--color-text-primary)\n  .dropdown-toggle\n    position: relative\n    &::after\n      display: block\n      position: absolute\n      top: 50%\n      right: 20px\n      transform: translateY(-50%)\n  .side-nav-footer\n    margin-top: auto\n  .trim-text\n    white-space: nowrap\n    text-overflow: ellipsis\n    display: inline-block\n    overflow: hidden\n    width: 100%\n.content-wrapper\n  width: 100%\n.top-nav\n  height: 50px\n  background: var(--color-surface-primary) !important\n  position: fixed\n  top: 0\n  left: 0\n  width: 100%\n  padding-left: calc(100px + 15px)\n  padding-right: 32px\n  z-index: 100\n  box-shadow: var(--shadow-top-nav)\n  justify-content: space-between\n\n  ::v-deep .action-panel\n    .action-btn\n      box-sizing: border-box\n      width: 36px\n      padding-left: 0\n      padding-right: 0\n      @media (max-width: 768px)\n        display: none\n\n.is-in-mobile .top-nav\n  padding-left: 15px\n  padding-right: 15px\n  background: var(--color-surface-primary) !important\n\n.toggle-sidebar\n  color: var(--color-text-primary)\n  display: none\n\n.page-content\n  padding: calc(50px + var(--gap-between-blocks)) calc(var(--gap-between-blocks) - 15px) var(--gap-between-blocks)\n  display: flex\n  flex-direction: column\n  min-height: 100vh\n\n.content-overlay\n  position: fixed\n  top: 0\n  left: 0\n  width: 100%\n  height: 100%\n  z-index: 100\n  background: rgb(0,0,0,.5)\n  display: none\n\n::v-deep .search-input input\n  background-color: var(--color-surface-secondary)\n  border-color: var(--color-surface-secondary)\n\n.notification-dot\n  height: 50%\n  top: -9px\n  right: -3px\n  position: absolute\n  width: 50%\n  color: var(--color-danger)\n\n@media (min-width: 769px)\n  .content-wrapper\n    &.hide-top-nav\n      .top-nav\n        display: none\n      .page-content\n        padding-top: 30px\n        min-height: 100vh\n\n@media (max-width: 768px)\n  .page-wrapper\n    padding-left: 0\n    &:not(.collapsed) .content-overlay\n      display: block\n    &.collapsed\n      .side-nav\n        transform: translateX(-100px)\n\n  .top-nav\n    padding-left: 15px\n    padding-right: 15px\n    background: var(--color-surface-primary) !important\n\n  .toggle-sidebar\n    display: block\n\n  .page-content\n    padding: 15px 0\n    padding-top: calc(50px + 15px)\n    justify-content: start\n\n::v-deep .dropdown-menu\n  .dropdown-item\n    padding: 0.25rem 0.75rem\n    .clickable-area\n      margin: -0.25rem -0.75rem\n      padding: 0.25rem 0.75rem\n    i, .custom-svg-icon\n      width: 20px\n      margin-right: .5rem\n  .b-dropdown-text\n    padding-left: 0.75rem\n    padding-right: 0.75rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PageLayout.vue?vue&type=template&id=b5cfcc80&scoped=true&\"\nimport script from \"./PageLayout.vue?vue&type=script&lang=js&\"\nexport * from \"./PageLayout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PageLayout.vue?vue&type=style&index=0&id=b5cfcc80&prod&lang=sass&\"\nimport style1 from \"./PageLayout.vue?vue&type=style&index=1&id=b5cfcc80&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b5cfcc80\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-body consent-section\"},[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Number of snapshots\"))+\": \"),_c('span',{staticClass:\"feedback-estimate\"},[_vm._v(_vm._s(_vm.print.printshotfeedback_set.length))])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Estimated time to finish\"))+\": \"),_c('span',{staticClass:\"feedback-estimate\"},[_vm._v(_vm._s(_vm.estimatedFeedbackTime))])]),_c('p',{staticClass:\"font-weight-light\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Help Obi get better at detecting failures by giving her in-depth feedback on the snapshots of the print. You will earn {localizedDom} after you finish this Focused Feedback. {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',{staticClass:\"text-light\"},[_vm._v(_vm._s(_vm.$t(\"2 non-expirable AI Detection Hours\")))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t('Learn more'))+\". \"),_c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]},proxy:true}])})],1),_c('br'),_c('button',{staticClass:\"btn btn-primary btn-block\",attrs:{\"disabled\":!_vm.consentChecked,\"type\":\"button\"},on:{\"click\":function($event){return _vm.$emit('continue-btn-pressed')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Start Focused Feedback\"))+\" \")]),_c('br'),_c('div',{staticClass:\"custom-control custom-checkbox form-check-inline\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.consentChecked),expression:\"consentChecked\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"consented-checkbox\",\"type\":\"checkbox\",\"name\":\"consented\"},domProps:{\"checked\":Array.isArray(_vm.consentChecked)?_vm._i(_vm.consentChecked,null)>-1:(_vm.consentChecked)},on:{\"change\":function($event){var $$a=_vm.consentChecked,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.consentChecked=$$a.concat([$$v]))}else{$$i>-1&&(_vm.consentChecked=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.consentChecked=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"16px\"},attrs:{\"for\":\"consented-checkbox\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"I grant the {brandName} app team members the permission to review the time-lapse video of the print shown on this page.\", {brandName:_vm.$syndicateText.brandName}))+\" \"),_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#you-need-to-grant-permission-to-tsd-team-to-review-your-time-lapse')}},[_vm._v(_vm._s(_vm.$t(\"Why is this necessary? \"))),_vm._m(0)])])]),_c('br'),_c('div',[_c('span',{staticClass:\"text-muted\"},[_vm._v(_vm._s(_vm.$t(\"File\"))+\":\")]),_vm._v(\" \"+_vm._s(_vm.print.filename)+\" \")]),_c('div',[_c('span',{staticClass:\"text-muted\"},[_vm._v(_vm._s(_vm.$t(\"Printed\"))+\":\")]),_vm._v(\" \"+_vm._s(_vm.print.started_at.fromNow())+\" \")]),_c('br'),(_vm.print.video_url)?_c('video-box',{attrs:{\"video-url\":_vm.print.video_url,\"poster-url\":_vm.print.poster_url,\"full-screen-btn\":false}}):_c('div',[_c('detective-working')],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-img-top\"},[_c('video-player',{ref:\"videoPlayer\",staticClass:\"vjs-default-skin vjs-big-play-centered\",attrs:{\"options\":_vm.playerOptions,\"playsinline\":true},on:{\"timeupdate\":_vm.onTimeUpdate}}),_c('div',{staticClass:\"buttons-container\"},[(_vm.downloadBtn)?_c('a',{staticClass:\"action-btn\",attrs:{\"role\":\"button\",\"title\":\"Download\"},on:{\"click\":function($event){return _vm.$emit('download')}}},[_c('i',{staticClass:\"fas fa-download\",attrs:{\"aria-hidden\":\"true\"}})]):_vm._e(),(_vm.fullscreenBtn)?_c('a',{staticClass:\"action-btn\",attrs:{\"role\":\"button\",\"title\":\"Full screen\"},on:{\"click\":function($event){return _vm.$emit('fullscreen')}}},[_c('i',{staticClass:\"fa fa-expand\",attrs:{\"aria-hidden\":\"true\"}})]):_vm._e(),(_vm.exitFullscreenBtn)?_c('a',{staticClass:\"action-btn\",attrs:{\"role\":\"button\",\"title\":\"Exit full screen\"},on:{\"click\":function($event){return _vm.$emit('exitFullscreen')}}},[_c('i',{staticClass:\"fa fa-times\",attrs:{\"aria-hidden\":\"true\"}})]):_vm._e()])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"card-img-top\">\n    <video-player\n      ref=\"videoPlayer\"\n      class=\"vjs-default-skin vjs-big-play-centered\"\n      :options=\"playerOptions\"\n      :playsinline=\"true\"\n      @timeupdate=\"onTimeUpdate\"\n    />\n    <div class=\"buttons-container\">\n      <a\n        v-if=\"downloadBtn\"\n        class=\"action-btn\"\n        role=\"button\"\n        title=\"Download\"\n        @click=\"$emit('download')\"\n      >\n        <i class=\"fas fa-download\" aria-hidden=\"true\"></i>\n      </a>\n      <a\n        v-if=\"fullscreenBtn\"\n        class=\"action-btn\"\n        role=\"button\"\n        title=\"Full screen\"\n        @click=\"$emit('fullscreen')\"\n      >\n        <i class=\"fa fa-expand\" aria-hidden=\"true\"></i>\n      </a>\n      <a\n        v-if=\"exitFullscreenBtn\"\n        class=\"action-btn\"\n        role=\"button\"\n        title=\"Exit full screen\"\n        @click=\"$emit('exitFullscreen')\"\n      >\n        <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n      </a>\n    </div>\n  </div>\n</template>\n\n<script>\nimport 'video.js/dist/video-js.css'\nimport { videoPlayer } from 'vue-video-player'\n\nexport default {\n  name: 'VideoBox',\n  components: {\n    videoPlayer,\n  },\n  props: {\n    videoUrl: {\n      type: String,\n      required: true,\n    },\n    posterUrl: {\n      type: String,\n      default: null,\n    },\n    fullscreenBtn: {\n      type: Boolean,\n      default: true,\n    },\n    exitFullscreenBtn: {\n      type: Boolean,\n      default: false,\n    },\n    downloadBtn: {\n      type: Boolean,\n      default: false,\n    },\n    fluid: {\n      type: Boolean,\n      default: true,\n    },\n    autoplay: {\n      type: Boolean,\n      default: false,\n    },\n    defaultFullScreenToggle: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  computed: {\n    playerOptions() {\n      return {\n        // videojs options\n        muted: true,\n        preload: 'none',\n        language: 'en',\n        playbackRates: [0.5, 1, 1.5, 2],\n        fluid: this.fluid,\n        fill: !this.fluid,\n        autoplay: this.autoplay,\n        sources: [\n          {\n            type: 'video/mp4',\n            src: this.videoUrl,\n          },\n        ],\n        controlBar: { fullscreenToggle: this.defaultFullScreenToggle },\n        poster: this.posterUrl,\n      }\n    },\n  },\n  methods: {\n    onTimeUpdate(event) {\n      this.$emit('timeupdate', event.currentTime() / event.duration())\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-img-top\n  position: relative\n  background-color: black\n\n  .buttons-container\n    position: absolute\n    top: 0\n    right: 0\n    padding: 0.5rem\n    background-color: rgba(0,0,0,0.7)\n\n  a.action-btn\n    padding: 0.5rem\n    color: rgba(255,255,255,0.5)\n    font-size: 1.5rem\n    transition: all .3s ease-out\n    &:hover\n      color: rgba(255,255,255,0.9)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoBox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoBox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VideoBox.vue?vue&type=template&id=39b52572&scoped=true&\"\nimport script from \"./VideoBox.vue?vue&type=script&lang=js&\"\nexport * from \"./VideoBox.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VideoBox.vue?vue&type=style&index=0&id=39b52572&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"39b52572\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card bg-dark text-white\"},[_c('img',{staticClass:\"card-img\",attrs:{\"src\":require('@static/img/detective-working.gif'),\"alt\":\"Obi is still working\"}}),_c('div',{staticClass:\"card-img-overlay\",staticStyle:{\"background-color\":\"rgba(0, 0, 0, 0.6)\"}},[_c('h5',{staticClass:\"card-title text-center\"},[_vm._v(_vm._s(_vm.$t(\"Obi is still busy working on your time-lapse\")))])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"card bg-dark text-white\">\n    <img\n      class=\"card-img\"\n      :src=\"require('@static/img/detective-working.gif')\"\n      alt=\"Obi is still working\"\n    />\n    <div class=\"card-img-overlay\" style=\"background-color: rgba(0, 0, 0, 0.6)\">\n      <h5 class=\"card-title text-center\">{{ $t(\"Obi is still busy working on your time-lapse\") }}</h5>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'DetectiveWorking',\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-img-overlay\n  display: flex\n  align-items: center\n  justify-content: center\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveWorking.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveWorking.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DetectiveWorking.vue?vue&type=template&id=3c99e284&scoped=true&\"\nimport script from \"./DetectiveWorking.vue?vue&type=script&lang=js&\"\nexport * from \"./DetectiveWorking.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DetectiveWorking.vue?vue&type=style&index=0&id=3c99e284&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3c99e284\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"card-body consent-section\">\n    <div>\n      {{$t(\"Number of snapshots\")}}:\n      <span class=\"feedback-estimate\">{{ print.printshotfeedback_set.length }}</span>\n    </div>\n    <p>\n      {{$t(\"Estimated time to finish\")}}:\n      <span class=\"feedback-estimate\">{{ estimatedFeedbackTime }}</span>\n    </p>\n    <p class=\"font-weight-light\">\n      <i18next :translation=\"$t('Help Obi get better at detecting failures by giving her in-depth feedback on the snapshots of the print. You will earn {localizedDom} after you finish this Focused Feedback. {localizedDom2}')\">\n        <template #localizedDom>\n          <strong class=\"text-light\">{{$t(\"2 non-expirable AI Detection Hours\")}}</strong>\n        </template>\n        <template #localizedDom2>\n          <a target=\"_blank\" :href=\"getDocUrl('/user-guides/how-does-credits-work/')\">{{$t('Learn more')}}. <small><i class=\"fas fa-external-link-alt\"></i></small ></a>\n        </template>\n      </i18next>\n    </p>\n    <br />\n    <button\n      :disabled=\"!consentChecked\"\n      class=\"btn btn-primary btn-block\"\n      type=\"button\"\n      @click=\"$emit('continue-btn-pressed')\"\n    >\n      {{$t(\"Start Focused Feedback\")}}\n    </button>\n    <br />\n    <div class=\"custom-control custom-checkbox form-check-inline\">\n      <input\n        id=\"consented-checkbox\"\n        v-model=\"consentChecked\"\n        type=\"checkbox\"\n        name=\"consented\"\n        class=\"custom-control-input\"\n      />\n      <label class=\"custom-control-label\" style=\"font-size: 16px\" for=\"consented-checkbox\">\n        {{ $t(\"I grant the {brandName} app team members the permission to review the time-lapse video of the print shown on this page.\", {brandName:$syndicateText.brandName}) }}\n\n        <a\n          target=\"_blank\"\n          :href=\"getDocUrl('/user-guides/how-does-credits-work#you-need-to-grant-permission-to-tsd-team-to-review-your-time-lapse')\"\n          >{{$t(\"Why is this necessary? \")}}<small><i class=\"fas fa-external-link-alt\"></i></small\n        ></a>\n      </label>\n    </div>\n    <br />\n    <div>\n      <span class=\"text-muted\">{{ $t(\"File\") }}:</span>\n      {{ print.filename }}\n    </div>\n    <div>\n      <span class=\"text-muted\">{{ $t(\"Printed\") }}:</span>\n      {{ print.started_at.fromNow() }}\n    </div>\n    <br />\n    <video-box\n      v-if=\"print.video_url\"\n      :video-url=\"print.video_url\"\n      :poster-url=\"print.poster_url\"\n      :full-screen-btn=\"false\"\n    />\n    <div v-else>\n      <detective-working />\n    </div>\n  </div>\n</template>\n\n<script>\nimport moment from 'moment'\n\nimport VideoBox from '@src/components/VideoBox'\nimport DetectiveWorking from '@src/components/DetectiveWorking'\n\nexport default {\n  name: 'FocusedFeedbackConsent',\n\n  components: { VideoBox, DetectiveWorking },\n\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      consentChecked: false,\n    }\n  },\n\n  computed: {\n    estimatedFeedbackTime() {\n      const seconds = this.print.printshotfeedback_set.length * 12\n      if (seconds < 60) {\n        return `${seconds} ${this.$i18next.t('seconds')}`\n      } else {\n        return moment.duration(seconds, 'seconds').humanize()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.consent-section\n  background: var(--color-surface-secondary)\n\n.feedback-estimate\n  font-size: 1.2em\n  font-weight: bolder\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FocusedFeedbackConsent.vue?vue&type=template&id=91f97838&scoped=true&\"\nimport script from \"./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"\nexport * from \"./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FocusedFeedbackConsent.vue?vue&type=style&index=0&id=91f97838&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"91f97838\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container class=\"feedback-container\">\n        <b-row class=\"justify-content-center\">\n          <b-col lg=\"8\">\n            <div class=\"card\">\n              <h5 class=\"card-header text-center\">\n                F\n                <i class=\"fas fa-search focused-feedback-icon\"></i>{{$t(\"CUSED FEEDBACK\")}}\n              </h5>\n              <loading :active=\"print === null\" :is-full-page=\"true\"></loading>\n              <div v-if=\"print !== null\">\n                <focused-feedback-consent\n                  v-if=\"!print.access_consented_at\"\n                  :print=\"print\"\n                  @continue-btn-pressed=\"consentBtnPressed\"\n                />\n                <div v-else>\n                  <div>\n                    <vue-slick-carousel\n                      ref=\"carousel\"\n                      :arrows=\"false\"\n                      :dots=\"true\"\n                      @afterChange=\"onNextShot\"\n                    >\n                      <print-shot-card\n                        v-for=\"(shot, i) in shots\"\n                        :key=\"i\"\n                        :shot=\"shot\"\n                        @shotChanged=\"onShotChanged\"\n                        @prev=\"onPrev\"\n                        @next=\"onNext\"\n                      ></print-shot-card>\n                      <template #customPaging=\"page\">\n                        <div :class=\"pageClass(page)\">&bull;</div>\n                      </template>\n                    </vue-slick-carousel>\n                  </div>\n                  <br />\n                  <div class=\"card-body p-3\">\n                    <a :href=\"`/prints/${print.id}/`\">\n                      <i class=\"fas fa-chevron-left\"></i> {{$t(\"Print Page\")}}\n                    </a>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport sortBy from 'lodash/sortBy'\nimport findIndex from 'lodash/findIndex'\nimport VueSlickCarousel from 'vue-slick-carousel'\nimport 'vue-slick-carousel/dist/vue-slick-carousel.css'\n// optional style for arrows & dots\nimport 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'\n// TODO: this should be configured as global. But for some reason it doesn't work.\nimport Loading from 'vue-loading-overlay'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport PrintShotCard from '@src/components/print-shot-feedback/PrintShotCard'\nimport urls from '@config/server-urls'\nimport { normalizedPrint } from '@src/lib/normalizers'\nimport PageLayout from '@src/components/PageLayout'\nimport FocusedFeedbackConsent from '../components/print-shot-feedback/FocusedFeedbackConsent.vue'\n\nexport default {\n  name: 'PrintShotFeedbackApp',\n  components: {\n    FocusedFeedbackConsent,\n    Loading,\n    PrintShotCard,\n    VueSlickCarousel,\n    PageLayout,\n  },\n  props: {\n    config: {\n      default: () => {},\n      type: Object,\n    },\n  },\n  data: function () {\n    return {\n      shots: [],\n      currentShot: 0,\n      print: null,\n    }\n  },\n  computed: {},\n\n  mounted() {\n    this.fetchData()\n  },\n\n  methods: {\n    fetchData() {\n      axios.get(urls.print(this.config.printId)).then((response) => {\n        this.print = normalizedPrint(response.data)\n        this.shots = sortBy(this.print.printshotfeedback_set, 'id')\n      })\n    },\n\n    updatePrint(data) {\n      axios\n        .patch(urls.print(this.print.id), data)\n\n        .then((response) => (this.print = response.data))\n    },\n\n    consentBtnPressed() {\n      this.updatePrint({ access_consented_at: moment() })\n    },\n\n    onShotChanged(data) {\n      const i = findIndex(this.shots, (shot) => shot.id == data.id)\n      this.$set(this.shots, i, data)\n      this.$refs.carousel.next()\n    },\n\n    onNextShot(shotIndex) {\n      this.currentShot = shotIndex\n    },\n\n    onPrev() {\n      this.$refs.carousel.prev()\n    },\n\n    onNext() {\n      this.$refs.carousel.next()\n    },\n\n    pageClass(page) {\n      if (page === this.currentShot) {\n        return 'page-visiting'\n      }\n      return this.shots[page].answered_at ? 'text-success' : 'page-unvisited'\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.prev-btn\n  display: inline\n  position: absolute\n  left: 2%\n  top: 40%\n  opacity: 0.5\n\n.next-btn\n  display: inline\n  position: absolute\n  right: 2%\n  top: 40%\n  opacity: 0.5\n\n.page-visiting\n  color: var(--color-primary)\n\n.page-unvisited\n  color: var(--color-divider)\n\n.feedback-container\n  padding-left: 30px\n  padding-right: 30px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintShotFeedbackApp.vue?vue&type=template&id=3ab8d3da&scoped=true&\"\nimport script from \"./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintShotFeedbackApp.vue?vue&type=style&index=0&id=3ab8d3da&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3ab8d3da\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"actions-with-selected-desktop\"},[_c('b-form-group',{staticClass:\"m-0\"},[_c('b-form-checkbox',{attrs:{\"size\":\"md\"},model:{value:(_vm.allPrintsSelected),callback:function ($$v) {_vm.allPrintsSelected=$$v},expression:\"allPrintsSelected\"}})],1),_c('div',[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.selectedPrintIds.size),expression:\"!selectedPrintIds.size\"}],staticClass:\"label\",on:{\"click\":function($event){_vm.allPrintsSelected = !_vm.allPrintsSelected}}},[_vm._v(_vm._s(_vm.$t(\"Select all\")))]),_c('b-dropdown',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.selectedPrintIds.size),expression:\"selectedPrintIds.size\"}],attrs:{\"toggle-class\":\"btn btn-sm actions-with-selected-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.selectedPrintIds.size)+\" item\"+_vm._s(_vm.selectedPrintIds.size === 1 ? '' : 's')+\" \"+_vm._s(_vm.$t(\"selected\"))+\" \")]},proxy:true}])},[_c('b-dropdown-item',[_c('div',{staticClass:\"text-danger\",on:{\"click\":_vm.onDeleteBtnClick}},[_c('i',{staticClass:\"far fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t(\"Delete\"))+\" \")])])],1)],1)],1)]},proxy:true},{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"title\":_vm.$t('Sort By')},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-sort-amount-down\"})]},proxy:true}])},[_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":_vm.$t('Filter')},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('filtering-dropdown',{ref:\"filteringDropdown1\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'sorting',\n              icon: 'fas fa-sort-amount-down',\n              title: _vm.$t(`Sort`),\n              expandable: true,\n            },\n            {\n              key: 'filtering',\n              icon: 'fas fa-filter',\n              title: _vm.$t(`Filter`),\n              expandable: true,\n            },\n          ]},scopedSlots:_vm._u([{key:\"sorting\",fn:function(){return [_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})]},proxy:true},{key:\"filtering\",fn:function(){return [_c('filtering-dropdown',{ref:\"filteringDropdown2\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})]},proxy:true}])})],1)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('active-filter-notice',{attrs:{\"filter-values\":_vm.filterValues},on:{\"onShowAllClicked\":_vm.resetFilters}}),_c('b-container',[_c('b-row',[_c('b-col',[(_vm.prints.length && !_vm.loading)?_c('div',{staticClass:\"prints-summary\"},[_c('div',{staticClass:\"summary-item\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-hashtag\"})]),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Prints done\")))]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.stats.total_print_count)+\" (\"),_c('span',{staticClass:\"text-success\"},[_vm._v(_vm._s(_vm.stats.total_succeeded_print_count))]),_vm._v(\" / \"),_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.stats.total_cancelled_print_count))]),_vm._v(\") \")])])]),_c('div',{staticClass:\"summary-item\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total print time\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.totalPrintTimeFormatted))])])]),_c('div',{staticClass:\"summary-item\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-ruler-horizontal\"})]),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_c('help-widget',{attrs:{\"id\":\"filament-used-may-be-incorrect\",\"highlight\":false,\"show-close-button\":false}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Filament used\"))+\" \")])],1),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.totalFilamentUsedFormatted))])])]),_c('div',{staticClass:\"btn-wrapper\"},[_c('a',{staticClass:\"btn btn-secondary\",attrs:{\"href\":`/stats/`}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Full Stats\"))+\" \"),_c('i',{staticClass:\"fas fa-arrow-right\"})])])]):_vm._e()])],1),_c('b-row',[(_vm.prints.length || _vm.loading)?_c('b-col',[_vm._l((_vm.prints),function(print,index){return _c('print-history-item',{key:print.id,staticClass:\"print-item\",attrs:{\"print\":print,\"index\":index,\"selectable\":true,\"selected\":_vm.selectedPrintIds.has(print.id)},on:{\"selectedChanged\":_vm.onSelectedChanged}})}),_c('mugen-scroll',{attrs:{\"handler\":_vm.fetchMoreData,\"should-handle\":!_vm.loading}},[(!_vm.noMoreData)?_c('loading-placeholder'):_vm._e()],1)],2):_c('b-col',{staticClass:\"text-center my-5\"},[_vm._v(_vm._s(_vm.$t(\"No prints found\")))])],1)],1),_c('date-picker-modal',{ref:\"datePickerModal\",on:{\"picked\":_vm.onDatesPicked}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.menuExpanded === null)?_vm._l((_vm.menuOptions),function(option){return _c('b-dropdown-item',{key:option.key,attrs:{\"href\":option.href},on:{\"click\":function($event){return _vm.onClick(option)}}},[(option.expandable)?_c('div',{staticClass:\"d-flex justify-content-between clickable-area\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.menuExpanded = option.key}}},[_c('div',[(option.icon)?_c('i',{class:option.icon}):(option.svgIcon)?_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":`#${option.svgIcon}`}})]):_vm._e(),_c('span',[_vm._v(_vm._s(option.title))])]),_c('div',[_c('i',{staticClass:\"fas fa-chevron-right m-0\"})])]):_c('div',{staticClass:\"d-flex justify-content-between clickable-area\"},[_c('div',{class:option.customMenuOptionClass},[(option.icon)?_c('i',{class:option.icon}):(option.svgIcon)?_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":`#${option.svgIcon}`}})]):_vm._e(),_c('span',[_vm._v(_vm._s(option.title))])])])])}):_vm._e(),(_vm.menuExpanded !== null)?[_c('b-dropdown-item',[_c('div',{staticClass:\"clickable-area\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.menuExpanded = null}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(_vm._s(_vm.$t(\"Back\"))+\" \")])]),_c('b-dropdown-divider'),(_vm.menuExpanded === 'sorting')?_c('div',[_vm._t(\"sorting\")],2):_vm._e(),(_vm.menuExpanded === 'filtering')?_c('div',[_vm._t(\"filtering\")],2):_vm._e(),(_vm.menuExpanded === 'storage')?_c('div',[_vm._t(\"storage\")],2):_vm._e(),(_vm.menuExpanded === 'grouping')?_c('div',[_vm._t(\"grouping\")],2):_vm._e()]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <template v-if=\"menuExpanded === null\">\n      <b-dropdown-item\n        v-for=\"option in menuOptions\"\n        :key=\"option.key\"\n        :href=\"option.href\"\n        @click=\"onClick(option)\"\n      >\n        <div\n          v-if=\"option.expandable\"\n          class=\"d-flex justify-content-between clickable-area\"\n          @click.stop.prevent=\"menuExpanded = option.key\"\n        >\n          <div>\n            <i v-if=\"option.icon\" :class=\"option.icon\"></i>\n            <svg v-else-if=\"option.svgIcon\" class=\"custom-svg-icon\">\n              <use :href=\"`#${option.svgIcon}`\" />\n            </svg>\n            <span>{{ option.title }}</span>\n          </div>\n          <div><i class=\"fas fa-chevron-right m-0\"></i></div>\n        </div>\n        <div v-else class=\"d-flex justify-content-between clickable-area\">\n          <div :class=\"option.customMenuOptionClass\">\n            <i v-if=\"option.icon\" :class=\"option.icon\"></i>\n            <svg v-else-if=\"option.svgIcon\" class=\"custom-svg-icon\">\n              <use :href=\"`#${option.svgIcon}`\" />\n            </svg>\n\n            <span>{{ option.title }}</span>\n          </div>\n        </div>\n      </b-dropdown-item>\n    </template>\n    <template v-if=\"menuExpanded !== null\">\n      <b-dropdown-item>\n        <div class=\"clickable-area\" @click.stop.prevent=\"menuExpanded = null\">\n          <i class=\"fas fa-chevron-left\"></i>{{$t(\"Back\")}}\n        </div>\n      </b-dropdown-item>\n      <b-dropdown-divider />\n\n      <div v-if=\"menuExpanded === 'sorting'\">\n        <slot name=\"sorting\"></slot>\n      </div>\n      <div v-if=\"menuExpanded === 'filtering'\">\n        <slot name=\"filtering\"></slot>\n      </div>\n      <div v-if=\"menuExpanded === 'storage'\">\n        <slot name=\"storage\"></slot>\n      </div>\n      <div v-if=\"menuExpanded === 'grouping'\">\n        <slot name=\"grouping\"></slot>\n      </div>\n    </template>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'CascadedDropdown',\n\n  props: {\n    menuOptions: {\n      type: Array,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      menuExpanded: null,\n    }\n  },\n\n  methods: {\n    resetMenuExpanded() {\n      this.menuExpanded = null\n    },\n    onClick(menuOption) {\n      if (menuOption.callback) {\n        this.$emit('menuOptionClicked', menuOption.key)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.custom-svg-icon\n  height: 1.125rem\n  width: 1.125rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CascadedDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CascadedDropdown.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CascadedDropdown.vue?vue&type=template&id=e01269fe&scoped=true&\"\nimport script from \"./CascadedDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./CascadedDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CascadedDropdown.vue?vue&type=style&index=0&id=e01269fe&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e01269fe\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"SORT BY\")))]),_vm._l((_vm.sortingOptions.options),function(sorting){return _c('b-dropdown-item',{key:`s_${sorting.key}`,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateSorting({ sorting })}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({\n        visibility: _vm.sortingValue.sorting.key === sorting.key ? 'visible' : 'hidden',\n      })}),_vm._v(\" \"+_vm._s(sorting.title)+\" \")])}),_c('b-dropdown-divider'),_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"DIRECTION\")))]),_vm._l((_vm.sortingDirections),function(direction){return _c('b-dropdown-item',{key:`d_${direction.key}`,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateSorting({ direction })}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({\n        visibility: _vm.sortingValue.direction.key === direction.key ? 'visible' : 'hidden',\n      })}),_vm._v(\" \"+_vm._s(direction.title)+\" \")])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <b-dropdown-text class=\"small text-secondary\">{{ $t(\"SORT BY\") }}</b-dropdown-text>\n    <b-dropdown-item\n      v-for=\"sorting in sortingOptions.options\"\n      :key=\"`s_${sorting.key}`\"\n      @click.native.capture.stop.prevent=\"updateSorting({ sorting })\"\n    >\n      <i\n        class=\"fas fa-check text-primary\"\n        :style=\"{\n          visibility: sortingValue.sorting.key === sorting.key ? 'visible' : 'hidden',\n        }\"\n      ></i>\n      {{ sorting.title }}\n    </b-dropdown-item>\n\n    <b-dropdown-divider />\n\n    <b-dropdown-text class=\"small text-secondary\">{{ $t(\"DIRECTION\") }}</b-dropdown-text>\n    <b-dropdown-item\n      v-for=\"direction in sortingDirections\"\n      :key=\"`d_${direction.key}`\"\n      @click.native.capture.stop.prevent=\"updateSorting({ direction })\"\n    >\n      <i\n        class=\"fas fa-check text-primary\"\n        :style=\"{\n          visibility: sortingValue.direction.key === direction.key ? 'visible' : 'hidden',\n        }\"\n      ></i>\n      {{ direction.title }}\n    </b-dropdown-item>\n  </div>\n</template>\n\n<script>\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport i18n from '@src/i18n/i18n.js'\n\nconst SortingDirections = [\n  { key: 'asc', title: `${i18n.t('Ascending')}` },\n  { key: 'desc', title: `${i18n.t('Descending')}` },\n]\n\nexport default {\n  name: 'SortingDropdown',\n\n  props: {\n    localStoragePrefix: {\n      type: String,\n      required: true,\n    },\n    sortingOptions: {\n      type: Object,\n      required: true,\n    },\n    sortingValue: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      sortingDirections: SortingDirections,\n    }\n  },\n\n  methods: {\n    updateSorting({ sorting, direction }) {\n      if (sorting && sorting.key !== this.sortingValue.sorting.key) {\n        setLocalPref(`${this.localStoragePrefix}-sorting`, sorting.key)\n        this.$emit('onSortingUpdated', { ...this.sortingValue, sorting: sorting })\n        return\n      }\n      if (direction && direction.key !== this.sortingValue.direction.key) {\n        setLocalPref(`${this.localStoragePrefix}-direction`, direction.key)\n        this.$emit('onSortingUpdated', { ...this.sortingValue, direction: direction })\n        return\n      }\n    },\n  },\n}\n\nexport const restoreSortingValue = (localStoragePrefix, sortingOptions) => {\n  const sortingKey = getLocalPref(`${localStoragePrefix}-sorting`, sortingOptions.default.sorting)\n  const directionKey = getLocalPref(\n    `${localStoragePrefix}-direction`,\n    sortingOptions.default.direction\n  )\n\n  return {\n    sorting: sortingOptions.options.find((s) => s.key === sortingKey),\n    direction: SortingDirections.find((d) => d.key === directionKey),\n  }\n}\n</script>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SortingDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SortingDropdown.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SortingDropdown.vue?vue&type=template&id=7de1b93c&\"\nimport script from \"./SortingDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./SortingDropdown.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',_vm._l((_vm.filterOptions),function(option,key,index){return _c('div',{key:key},[(index !== 0)?_c('b-dropdown-divider'):_vm._e(),_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(option.title.toUpperCase()))]),_vm._l((option.values),function(val){return _c('b-dropdown-item',{key:`f_${key}_${val.key}`,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFiltering({ filterOptionKey: key, filterValueKey: val.key })}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",class:{\n            'checkmark-muted':\n              option.multiple &&\n              !val.includesAll &&\n              (!Array.isArray(_vm.filterValues[key]) || !_vm.filterValues[key].includes(val.key)),\n          },style:({\n            visibility:\n              (Array.isArray(_vm.filterValues[key]) && _vm.filterValues[key].includes(val.key)) ||\n              _vm.filterValues[key] === val.key ||\n              (option.multiple && !val.includesAll)\n                ? 'visible'\n                : 'hidden',\n          })}),_c('div',{staticClass:\"text\"},[_vm._v(\" \"+_vm._s(val.title)+\" \"),(val.subtitle)?_c('div',{staticClass:\"subtitle\"},[_vm._v(\" \"+_vm._s(val.subtitle)+\" \")]):_vm._e()])])])})],2)}),0)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div v-for=\"(option, key, index) in filterOptions\" :key=\"key\">\n      <b-dropdown-divider v-if=\"index !== 0\" />\n      <b-dropdown-text class=\"small text-secondary\">{{\n        option.title.toUpperCase()\n      }}</b-dropdown-text>\n      <b-dropdown-item\n        v-for=\"val in option.values\"\n        :key=\"`f_${key}_${val.key}`\"\n        @click.native.capture.stop.prevent=\"\n          updateFiltering({ filterOptionKey: key, filterValueKey: val.key })\n        \"\n      >\n        <div class=\"dropdown-text-group\">\n          <i\n            class=\"fas fa-check text-primary\"\n            :class=\"{\n              'checkmark-muted':\n                option.multiple &&\n                !val.includesAll &&\n                (!Array.isArray(filterValues[key]) || !filterValues[key].includes(val.key)),\n            }\"\n            :style=\"{\n              visibility:\n                (Array.isArray(filterValues[key]) && filterValues[key].includes(val.key)) ||\n                filterValues[key] === val.key ||\n                (option.multiple && !val.includesAll)\n                  ? 'visible'\n                  : 'hidden',\n            }\"\n          ></i>\n          <div class=\"text\">\n            {{ val.title }}\n            <div v-if=\"val.subtitle\" class=\"subtitle\">\n              {{ val.subtitle }}\n            </div>\n          </div>\n        </div>\n      </b-dropdown-item>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\n\nexport default {\n  name: 'FilteringDropdown',\n\n  props: {\n    localStoragePrefix: {\n      type: String,\n      required: true,\n    },\n    filterOptions: {\n      type: Object,\n      required: true,\n    },\n    filterValues: {\n      type: Object,\n      required: true,\n    },\n    filterUpdateMixin: {\n      type: Function,\n      default: null,\n    },\n  },\n\n  methods: {\n    updateFiltering({ filterOptionKey, filterValueKey }) {\n      if (this.filterUpdateMixin) {\n        const result = this.filterUpdateMixin(filterOptionKey, filterValueKey)\n        if (!result) {\n          return\n        }\n      }\n\n      const filterOption = this.filterOptions[filterOptionKey]\n      const filterValue = filterOption.values.find((v) => v.key === filterValueKey)\n\n      const currentFilterValue = this.filterValues[filterOptionKey]\n      let newFilterValue\n\n      if (filterOption.multiple) {\n        if (filterValue.includesAll) {\n          newFilterValue = filterValue.key\n        } else {\n          if (Array.isArray(currentFilterValue)) {\n            if (currentFilterValue.includes(filterValueKey)) {\n              newFilterValue = currentFilterValue.filter((v) => v !== filterValueKey)\n              if (!newFilterValue.length) {\n                // if user unselects all — switch to \"All\" option if exists\n                newFilterValue = filterOption.values.find((v) => v.includesAll)?.key || []\n              }\n            } else {\n              newFilterValue = [...currentFilterValue, filterValueKey]\n            }\n          } else {\n            newFilterValue = [filterValueKey]\n          }\n        }\n      } else {\n        newFilterValue = filterValueKey\n      }\n\n      if (newFilterValue === currentFilterValue) {\n        return // nothing changed\n      }\n\n      setLocalPref(`${this.localStoragePrefix}-${filterOptionKey}`, newFilterValue)\n      this.$emit('onFilterUpdated', filterOptionKey, newFilterValue)\n    },\n  },\n}\n\nexport const restoreFilterValues = (localStoragePrefix, filterOptions) => {\n  let values = {}\n  for (const [key, option] of Object.entries(filterOptions)) {\n    const val = String(getLocalPref(`${localStoragePrefix}-${key}`, option.default))\n    if (option.multiple) {\n      const allOption = option.values.find((v) => v.includesAll)\n      if (val === allOption.key) {\n        values[key] = val\n      } else {\n        values[key] = val.split(',')\n      }\n    } else {\n      values[key] = val\n    }\n  }\n  return values\n}\n\nexport const getFilterParams = (filterOptions, filterValues, customFilterParamsBuilder) => {\n  let params = {}\n\n  for (const [key, val] of Object.entries(filterValues)) {\n    const filterOption = filterOptions[key]\n\n    if (!filterOption.buildQueryParam) {\n      if (val !== 'none') {\n        params[filterOption.queryParam] = val\n      }\n    } else {\n      const customParams = customFilterParamsBuilder && customFilterParamsBuilder(key, val)\n      if (customParams) {\n        params = { ...params, ...customParams }\n      }\n    }\n  }\n  return params\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.checkmark-muted\n  color: var(--color-divider) !important\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FilteringDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FilteringDropdown.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FilteringDropdown.vue?vue&type=template&id=614429e6&scoped=true&\"\nimport script from \"./FilteringDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./FilteringDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FilteringDropdown.vue?vue&type=style&index=0&id=614429e6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"614429e6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.shouldShowFilterWarning)?_c('div',{staticClass:\"active-filter-notice\"},[_c('div',{staticClass:\"filter\"},[_c('i',{staticClass:\"fas fa-filter mr-2\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Filters applied\"))+\" \")]),_c('div',{staticClass:\"action-btn\",on:{\"click\":function($event){return _vm.$emit('onShowAllClicked')}}},[_vm._v(_vm._s(_vm.$t(\"SHOW ALL\")))])]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"shouldShowFilterWarning\" class=\"active-filter-notice\">\n    <div class=\"filter\">\n      <i class=\"fas fa-filter mr-2\"></i>\n      {{$t(\"Filters applied\")}}\n    </div>\n    <div class=\"action-btn\" @click=\"$emit('onShowAllClicked')\">{{ $t(\"SHOW ALL\") }}</div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'ActiveFilterNotice',\n\n  props: {\n    filterValues: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  computed: {\n    activeFilters() {\n      return Object.values(this.filterValues).filter((v) => v !== 'none')\n    },\n    shouldShowFilterWarning() {\n      return this.activeFilters.length !== 0\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.active-filter-notice\n  display: flex\n  align-items: center\n  justify-content: space-between\n  padding: 0.5rem 1rem\n  background-color: var(--color-surface-secondary)\n  margin: calc(-1 * var(--gap-between-blocks)) -15px var(--gap-between-blocks)\n  .filter\n    color: var(--color-primary)\n  .action-btn\n    color: var(--color-text-primary)\n    cursor: pointer\n\n  @media (max-width: 768px)\n    font-size: .875rem\n    margin-left: 0\n    margin-right: 0\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ActiveFilterNotice.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ActiveFilterNotice.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ActiveFilterNotice.vue?vue&type=template&id=061feff7&scoped=true&\"\nimport script from \"./ActiveFilterNotice.vue?vue&type=script&lang=js&\"\nexport * from \"./ActiveFilterNotice.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ActiveFilterNotice.vue?vue&type=style&index=0&id=061feff7&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"061feff7\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"print-container\",attrs:{\"href\":`/prints/${_vm.print.id}/${_vm.index !== null ? '?index=' + _vm.index : ''}`}},[_c('div',{staticClass:\"status-indicator print-status-bg\",class:_vm.print.status.key}),(_vm.selectable)?_c('div',{staticClass:\"checkbox-wrapper\",class:{ isSelected: _vm.isSelected }},[_c('b-form-checkbox',{attrs:{\"size\":\"md\"},model:{value:(_vm.isSelected),callback:function ($$v) {_vm.isSelected=$$v},expression:\"isSelected\"}})],1):_vm._e(),_c('div',{staticClass:\"main-content truncated-wrapper\"},[_c('div',{staticClass:\"top\"},[_c('div',{staticClass:\"title truncated\",attrs:{\"title\":_vm.fileName}},[_vm._v(_vm._s(_vm.fileName))])]),_c('div',{staticClass:\"bottom\"},[_c('div',{staticClass:\"info\"},[_c('svg',{staticClass:\"icon\",attrs:{\"width\":\"1em\",\"height\":\"1em\"}},[_c('use',{attrs:{\"href\":\"#svg-3d-printer\"}})]),_c('span',[_vm._v(_vm._s(_vm.print.printer ? _vm.print.printer.name : 'Unavailable'))])]),_c('div',{staticClass:\"info\"},[_c('i',{staticClass:\"fas fa-calendar-alt icon\"}),_c('span',[_vm._v(_vm._s(_vm.print.started_at.format('MMM D, YYYY')))])])])]),(_vm.print.poster_url)?_c('div',{staticClass:\"poster\"},[_c('div',{staticClass:\"img\",style:({ backgroundImage: `url(${_vm.print.poster_url})` })})]):_c('div',{staticClass:\"poster no-photo\"},[_c('svg',[_c('use',{attrs:{\"href\":\"#svg-no-photo\"}})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <a\n    :href=\"`/prints/${print.id}/${index !== null ? '?index=' + index : ''}`\"\n    class=\"print-container\"\n  >\n    <div class=\"status-indicator print-status-bg\" :class=\"print.status.key\"></div>\n    <div v-if=\"selectable\" class=\"checkbox-wrapper\" :class=\"{ isSelected }\">\n      <b-form-checkbox v-model=\"isSelected\" size=\"md\"></b-form-checkbox>\n    </div>\n    <div class=\"main-content truncated-wrapper\">\n      <div class=\"top\">\n        <div class=\"title truncated\" :title=\"fileName\">{{ fileName }}</div>\n      </div>\n      <div class=\"bottom\">\n        <div class=\"info\">\n          <svg width=\"1em\" height=\"1em\" class=\"icon\">\n            <use href=\"#svg-3d-printer\" />\n          </svg>\n          <span>{{ print.printer ? print.printer.name : 'Unavailable' }}</span>\n        </div>\n        <div class=\"info\">\n          <i class=\"fas fa-calendar-alt icon\"></i>\n          <span>{{ print.started_at.format('MMM D, YYYY') }}</span>\n        </div>\n      </div>\n    </div>\n    <div v-if=\"print.poster_url\" class=\"poster\">\n      <div class=\"img\" :style=\"{ backgroundImage: `url(${print.poster_url})` }\"></div>\n    </div>\n    <div v-else class=\"poster no-photo\">\n      <svg>\n        <use href=\"#svg-no-photo\" />\n      </svg>\n    </div>\n  </a>\n</template>\n\n<script>\nimport { PrintStatus } from '@src/lib/normalizers'\n\nexport default {\n  name: 'PrintHistoryItem',\n\n  components: {},\n\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n    index: {\n      type: Number,\n      default: null,\n    },\n    selectable: {\n      type: Boolean,\n      default: false,\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data: function () {\n    return {\n      PrintStatus,\n      isSelected: this.selected,\n    }\n  },\n\n  computed: {\n    fileName() {\n      return this.print.g_code_file === null ? this.print.filename : this.print.g_code_file.filename\n    },\n  },\n\n  watch: {\n    isSelected(newValue) {\n      this.$emit('selectedChanged', this.print.id, newValue)\n    },\n    selected(newValue) {\n      this.isSelected = newValue\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.print-container\n  display: flex\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  color: var(--color-text-primary)\n  &:hover\n    cursor: pointer\n    background: var(--color-hover-accent)\n    transition: all .3s ease-out\n\n.status-indicator\n  flex: 0 0 5px\n  margin-right: 1rem\n\n.checkbox-wrapper\n  display: flex\n  align-items: flex-start\n  justify-content: flex-end\n  padding-top: 1rem\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n    border-color: var(--color-divider)\n  &.isSelected\n    ::v-deep .custom-checkbox .custom-control-label::before\n      border-color: #00C4B4\n\n.main-content\n  padding: 1rem\n  padding-left: 0\n  flex: 1\n\n.top\n  display: flex\n  align-items: flex-end\n  margin-bottom: .25rem\n\n.title\n  font-weight: bold\n\n.bottom\n  display: flex\n  align-items: center\n  justify-content: flex-start\n  gap: 14px\n  @media (max-width: 768px)\n    flex-direction: column\n    gap: 2px\n    align-items: flex-start\n\n.info\n  display: flex\n  gap: .25em\n  align-items: center\n  font-size: 0.9375rem\n  overflow: hidden\n  max-width: 50%\n\n  span\n    text-overflow: ellipsis\n    white-space: nowrap\n    overflow: hidden\n\n  @media (max-width: 768px)\n    max-width: 100%\n\n.icon\n  color: var(--color-text-secondary)\n  font-size: .8em\n  flex-shrink: 0\n\n  &.fa-clock\n    position: relative\n    top: 1px\n\n.feedback-info\n  background-color: var(--color-surface-primary)\n  padding: .0625em .625em\n  border-radius: var(--border-radius-xs)\n  font-size: 0.8125rem\n  margin: 2px 0\n  &.focused\n    background-color: var(--color-primary)\n    color: var(--color-on-primary)\n\n.poster\n  margin-left: auto\n  background-color: var(--color-hover)\n  .img\n    background-size: cover\n    background-position: center\n    height: 100%\n    width: 100px\n    display: flex\n    justify-content: center\n    align-items: center\n    color: var(--color-text-secondary)\n    font-size: 0.875rem\n  &.no-photo\n    width: 100px\n    display: flex\n    align-items: center\n    justify-content: center\n    svg\n      width: 3rem\n      height: 3rem\n      color: var(--color-background)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintHistoryItem.vue?vue&type=template&id=a071ad6e&scoped=true&\"\nimport script from \"./PrintHistoryItem.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintHistoryItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintHistoryItem.vue?vue&type=style&index=0&id=a071ad6e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"a071ad6e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-pick-dates\",\"title\":_vm.$t('Select Dates'),\"ok-title\":_vm.$t('Apply'),\"cancel-title\":_vm.$t('Cancel'),\"centered\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal,\"shown\":_vm.focusInput}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"my-2\"},[_c('b-form-group',{attrs:{\"label\":_vm.$t('Date from'),\"label-for\":\"date_from\",\"description\":_vm.$t('If empty, will default to your registration date')}},[_c('b-form-input',{ref:\"dateFrom\",attrs:{\"id\":\"date_from\",\"type\":\"date\",\"placeholder\":_vm.$t('Enter date')},model:{value:(_vm.dateFrom),callback:function ($$v) {_vm.dateFrom=$$v},expression:\"dateFrom\"}})],1),_c('b-form-group',{attrs:{\"label\":_vm.$t('Date to'),\"label-for\":\"date_to\",\"description\":_vm.$t('If empty, will default to today')}},[_c('b-form-input',{ref:\"dateTo\",attrs:{\"id\":\"date_to\",\"type\":\"date\",\"placeholder\":_vm.$t('Enter date')},model:{value:(_vm.dateTo),callback:function ($$v) {_vm.dateTo=$$v},expression:\"dateTo\"}})],1),(_vm.errorMessage)?_c('b-alert',{staticClass:\"mt-3\",attrs:{\"variant\":\"danger\",\"show\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.errorMessage)+\" \")]):_vm._e()],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-modal\n    id=\"b-modal-pick-dates\"\n    :title=\"$t('Select Dates')\"\n    :ok-title=\"$t('Apply')\"\n    :cancel-title=\"$t('Cancel')\"\n    centered\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n    @shown=\"focusInput\"\n  >\n    <form @submit.prevent=\"handleSubmit\">\n      <div class=\"my-2\">\n        <b-form-group\n          :label=\"$t('Date from')\"\n          label-for=\"date_from\"\n          :description=\"$t('If empty, will default to your registration date')\"\n        >\n          <b-form-input\n            id=\"date_from\"\n            ref=\"dateFrom\"\n            v-model=\"dateFrom\"\n            type=\"date\"\n            :placeholder=\"$t('Enter date')\"\n          ></b-form-input>\n        </b-form-group>\n\n        <b-form-group\n          :label=\"$t('Date to')\"\n          label-for=\"date_to\"\n          :description=\"$t('If empty, will default to today')\"\n        >\n          <b-form-input\n            id=\"date_to\"\n            ref=\"dateTo\"\n            v-model=\"dateTo\"\n            type=\"date\"\n            :placeholder=\"$t('Enter date')\"\n          ></b-form-input>\n        </b-form-group>\n\n        <b-alert v-if=\"errorMessage\" variant=\"danger\" class=\"mt-3\" show>\n          {{ errorMessage }}\n        </b-alert>\n      </div>\n    </form>\n  </b-modal>\n</template>\n\n<script>\nexport default {\n  name: 'DatePickerModal',\n\n  data() {\n    return {\n      dateFrom: '',\n      dateTo: '',\n      isOpen: false,\n      errorMessage: '',\n    }\n  },\n\n  methods: {\n    show(initDateFrom, initDateTo) {\n      this.dateFrom = initDateFrom || ''\n      this.dateTo = initDateTo || ''\n\n      this.isOpen = true\n      this.$bvModal.show('b-modal-pick-dates')\n    },\n    focusInput() {\n      this.$refs.dateFrom.select()\n    },\n    close() {\n      this.$bvModal.hide('b-modal-pick-dates')\n      this.resetModal()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.errorMessage = ''\n    },\n    handleOk(bvModalEvent) {\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      if (!this.dateFrom && !this.dateTo) {\n        this.errorMessage = `${this.$i18next.t('At least one date is needed')}`\n        return\n      }\n\n      this.$emit('picked', this.dateFrom, this.dateTo)\n      this.$nextTick(() => {\n        this.close()\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-lg\n  height: 3rem\n  padding: .5rem 1rem\n  width: 100%\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DatePickerModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DatePickerModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DatePickerModal.vue?vue&type=template&id=56d59fd8&scoped=true&\"\nimport script from \"./DatePickerModal.vue?vue&type=script&lang=js&\"\nexport * from \"./DatePickerModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DatePickerModal.vue?vue&type=style&index=0&id=56d59fd8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"56d59fd8\",\n  null\n  \n)\n\nexport default component.exports","import moment from 'moment'\n\nconst DateParamFormat = 'YYYY-MM-DD'\n\nexport const queryBuilder = (filterValue, customDateFrom, customDateTo, user) => {\n  return {\n    from_date: getDateFrom(filterValue, customDateFrom, user).format(DateParamFormat),\n    to_date: getDateTo(filterValue, customDateTo).format(DateParamFormat),\n    timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n  }\n}\n\nexport const getDateFrom = (filterValue, customDateFrom, user) => {\n  const today = new Date()\n  const firstDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay()))\n  const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1)\n  const firstDayOfYear = new Date(today.getFullYear(), 0, 1)\n\n  switch (filterValue) {\n    case 'this_week':\n      return moment(firstDayOfWeek)\n    case 'this_month':\n      return moment(firstDayOfMonth)\n    case 'this_year':\n      return moment(firstDayOfYear)\n    case 'custom':\n      if (customDateFrom) {\n        return moment(customDateFrom)\n      }\n  }\n  return moment(user.date_joined)\n}\n\nexport const getDateTo = (filterValue, customDateTo) => {\n  const today = new Date()\n  const lastDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay() + 6))\n  const lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0)\n  const lastDayOfYear = new Date(today.getFullYear(), 11, 31)\n\n  switch (filterValue) {\n    case 'this_week':\n      return moment(lastDayOfWeek)\n    case 'this_month':\n      return moment(lastDayOfMonth)\n    case 'this_year':\n      return moment(lastDayOfYear)\n    case 'custom':\n      if (customDateTo) {\n        return moment(customDateTo)\n      }\n  }\n  return moment()\n}\n\nexport const getRecommendedGrouping = (filterValue, customDateFrom, customDateTo, user) => {\n  const fromDate = getDateFrom(filterValue, customDateFrom, user)\n  const toDate = getDateTo(filterValue, customDateTo)\n  const diff = toDate.diff(fromDate, 'days')\n  if (diff <= 31) {\n    return 'day'\n  } else if (diff <= 95) {\n    return 'week'\n  } else if (diff <= 366) {\n    return 'month'\n  } else {\n    return 'year'\n  }\n}\n","<template>\n  <page-layout>\n    <!-- Top bar -->\n    <template #topBarLeft>\n      <div class=\"actions-with-selected-desktop\">\n        <b-form-group class=\"m-0\">\n          <b-form-checkbox v-model=\"allPrintsSelected\" size=\"md\"></b-form-checkbox>\n        </b-form-group>\n        <div>\n          <span\n            v-show=\"!selectedPrintIds.size\"\n            class=\"label\"\n            @click=\"allPrintsSelected = !allPrintsSelected\"\n            >{{ $t(\"Select all\") }}</span\n          >\n          <b-dropdown\n            v-show=\"selectedPrintIds.size\"\n            toggle-class=\"btn btn-sm actions-with-selected-btn\"\n          >\n            <template #button-content>\n              {{ selectedPrintIds.size }} item{{ selectedPrintIds.size === 1 ? '' : 's' }}\n              {{$t(\"selected\")}}\n            </template>\n            <b-dropdown-item>\n              <div class=\"text-danger\" @click=\"onDeleteBtnClick\">\n                <i class=\"far fa-trash-alt\"></i>{{$t(\"Delete\")}}\n              </div>\n            </b-dropdown-item>\n          </b-dropdown>\n        </div>\n      </div>\n    </template>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Sorting -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\" :title=\"$t('Sort By')\">\n          <template #button-content>\n            <i class=\"fas fa-sort-amount-down\"></i>\n          </template>\n          <sorting-dropdown\n            :local-storage-prefix=\"sortingLocalStoragePrefix\"\n            :sorting-options=\"sortingOptions\"\n            :sorting-value=\"sortingValue\"\n            @onSortingUpdated=\"onSortingUpdated\"\n          />\n        </b-dropdown>\n        <!-- Filtering -->\n        <b-dropdown\n          right\n          no-caret\n          toggle-class=\"action-btn icon-btn\"\n          menu-class=\"scrollable\"\n          :title=\"$t('Filter')\"\n        >\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <filtering-dropdown\n            ref=\"filteringDropdown1\"\n            :local-storage-prefix=\"filterLocalStoragePrefix\"\n            :filter-options=\"filterOptions\"\n            :filter-values=\"filterValues\"\n            :filter-update-mixin=\"filterUpdateMixin\"\n            @onFilterUpdated=\"onFilterUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'sorting',\n                icon: 'fas fa-sort-amount-down',\n                title: $t(`Sort`),\n                expandable: true,\n              },\n              {\n                key: 'filtering',\n                icon: 'fas fa-filter',\n                title: $t(`Filter`),\n                expandable: true,\n              },\n            ]\"\n          >\n            <template #sorting>\n              <sorting-dropdown\n                :local-storage-prefix=\"sortingLocalStoragePrefix\"\n                :sorting-options=\"sortingOptions\"\n                :sorting-value=\"sortingValue\"\n                @onSortingUpdated=\"onSortingUpdated\"\n              />\n            </template>\n            <template #filtering>\n              <filtering-dropdown\n                ref=\"filteringDropdown2\"\n                :local-storage-prefix=\"filterLocalStoragePrefix\"\n                :filter-options=\"filterOptions\"\n                :filter-values=\"filterValues\"\n                :filter-update-mixin=\"filterUpdateMixin\"\n                @onFilterUpdated=\"onFilterUpdated\"\n              />\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <active-filter-notice :filter-values=\"filterValues\" @onShowAllClicked=\"resetFilters\" />\n\n      <!-- Prints list -->\n      <b-container>\n        <b-row>\n          <b-col>\n            <div v-if=\"prints.length && !loading\" class=\"prints-summary\">\n              <div class=\"summary-item\">\n                <div class=\"icon\">\n                  <i class=\"fas fa-hashtag\"></i>\n                </div>\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Prints done\") }}</div>\n                  <div class=\"value\">\n                    {{ stats.total_print_count }} (<span class=\"text-success\">{{\n                      stats.total_succeeded_print_count\n                    }}</span>\n                    / <span class=\"text-danger\">{{ stats.total_cancelled_print_count }}</span\n                    >)\n                  </div>\n                </div>\n              </div>\n              <div class=\"summary-item\">\n                <div class=\"icon\">\n                  <i class=\"far fa-clock\"></i>\n                </div>\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Total print time\") }}</div>\n                  <div class=\"value\">{{ totalPrintTimeFormatted }}</div>\n                </div>\n              </div>\n              <div class=\"summary-item\">\n                <div class=\"icon\">\n                  <i class=\"fas fa-ruler-horizontal\"></i>\n                </div>\n                <div class=\"info\">\n                  <div class=\"title\">\n                    <help-widget\n                      id=\"filament-used-may-be-incorrect\"\n                      :highlight=\"false\"\n                      :show-close-button=\"false\"\n                    >\n                      {{$t(\"Filament used\")}}\n                    </help-widget>\n                  </div>\n                  <div class=\"value\">{{ totalFilamentUsedFormatted }}</div>\n                </div>\n              </div>\n              <div class=\"btn-wrapper\">\n                <a class=\"btn btn-secondary\" :href=\"`/stats/`\">\n                  {{$t(\"Full Stats\")}}\n                  <i class=\"fas fa-arrow-right\"></i>\n                </a>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row>\n          <b-col v-if=\"prints.length || loading\">\n            <print-history-item\n              v-for=\"(print, index) of prints\"\n              :key=\"print.id\"\n              :print=\"print\"\n              :index=\"index\"\n              :selectable=\"true\"\n              :selected=\"selectedPrintIds.has(print.id)\"\n              class=\"print-item\"\n              @selectedChanged=\"onSelectedChanged\"\n            ></print-history-item>\n            <mugen-scroll :handler=\"fetchMoreData\" :should-handle=\"!loading\">\n              <loading-placeholder v-if=\"!noMoreData\" />\n            </mugen-scroll>\n          </b-col>\n          <b-col v-else class=\"text-center my-5\">{{ $t(\"No prints found\") }}</b-col>\n        </b-row>\n      </b-container>\n\n      <!-- Date picker for filter by time period -->\n      <date-picker-modal ref=\"datePickerModal\" @picked=\"onDatesPicked\" />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport moment from 'moment'\nimport axios from 'axios'\nimport MugenScroll from 'vue-mugen-scroll'\nimport urls from '@config/server-urls'\nimport { normalizedPrint } from '@src/lib/normalizers'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport SortingDropdown, { restoreSortingValue } from '@src/components/SortingDropdown'\nimport FilteringDropdown, {\n  restoreFilterValues,\n  getFilterParams,\n} from '@src/components/FilteringDropdown'\nimport ActiveFilterNotice from '@src/components/ActiveFilterNotice'\nimport PrintHistoryItem from '@src/components/prints/PrintHistoryItem.vue'\nimport DatePickerModal from '@src/components/DatePickerModal.vue'\nimport { user } from '@src/lib/page-context'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport { queryBuilder } from '@src/lib/time-period-filtering'\nimport { humanizedFilamentUsage, humanizedDuration } from '@src/lib/formatters'\nimport i18n from '@src/i18n/i18n.js'\nconst PAGE_SIZE = 24\n\nexport const SortingLocalStoragePrefix = 'printsSorting'\nexport const SortingOptions = {\n  options: [{ title: `${i18n.t('Date')}`, key: 'date' }],\n  default: { sorting: 'date', direction: 'desc' },\n}\n\nconst DateParamFormat = 'YYYY-MM-DD'\nexport const FilterLocalStoragePrefix = 'printsFiltering'\nexport const FilterOptions = {\n  timePeriod: {\n    title: `${i18n.t('Time Period')}`,\n    buildQueryParam: queryBuilder,\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'this_week', title: `${i18n.t('This Week') }`},\n      { key: 'this_month', title: `${i18n.t('This Month') }`},\n      { key: 'this_year', title: `${i18n.t('This Year') }`},\n      { key: 'custom', title: `${i18n.t('Custom') }`},\n    ],\n    default: 'none',\n  },\n  printStatus: {\n    title: `${i18n.t('Print Status')}`,\n    queryParam: 'filter',\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'finished', title: `${i18n.t('Finished') }`},\n      { key: 'cancelled', title: `${i18n.t('Cancelled') }`},\n    ],\n    default: 'none',\n  },\n  feedbackNeeded: {\n    title: `${i18n.t('Feedback Needed')}`,\n    queryParam: 'feedback_needed',\n    values: [\n      { key: 'none', title: `${i18n.t('All' )}`},\n      { key: 'need_alert_overwrite', title: `${i18n.t('Review Needed' )}`},\n      { key: 'need_print_shot_feedback', title: `${i18n.t('Focused Feedback Needed' )}`},\n    ],\n    default: 'none',\n  },\n  printers: {\n    title: `${i18n.t('Printers')}`,\n    queryParam: 'filter_by_printer_ids',\n    multiple: true,\n    values: [\n      { key: 'none', title:`${i18n.t('All')}`, includesAll: true },\n      // Other options are added on printers fetch\n    ],\n    default: 'none',\n  },\n}\n\nexport default {\n  name: 'PrintHistoryPage',\n\n  components: {\n    MugenScroll,\n    PageLayout,\n    CascadedDropdown,\n    DatePickerModal,\n    SortingDropdown,\n    FilteringDropdown,\n    ActiveFilterNotice,\n    PrintHistoryItem,\n    HelpWidget,\n  },\n\n  data: function () {\n    return {\n      stats: {},\n      prints: [],\n      loading: false,\n      noMoreData: false,\n      user: null,\n      selectedPrintIds: new Set(),\n\n      // Sorting\n      sortingLocalStoragePrefix: SortingLocalStoragePrefix,\n      sortingOptions: SortingOptions,\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n\n      // Filtering\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n    }\n  },\n\n  computed: {\n    totalPrintTimeFormatted() {\n      return humanizedDuration(this.stats.total_print_time)\n    },\n    totalFilamentUsedFormatted() {\n      return humanizedFilamentUsage(this.stats?.total_filament_used)\n    },\n    defaultStatsParams() {\n      return {\n        timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n        from_date: moment(this.user.date_joined).format(DateParamFormat),\n        to_date: moment(new Date()).format(DateParamFormat),\n        group_by: 'year',\n      }\n    },\n    allPrintsSelected: {\n      get: function () {\n        return this.selectedPrintIds.size >= this.prints.length && this.prints.length !== 0\n      },\n      set: function (newValue) {\n        if (newValue) {\n          this.selectedPrintIds = new Set(this.prints.map((p) => p.id))\n        } else {\n          if (this.selectedPrintIds.size === this.prints.length) {\n            this.selectedPrintIds = new Set()\n          }\n        }\n      },\n    },\n  },\n\n  created() {\n    this.user = user()\n    this.updateCustomPeriodFilterSubtitle()\n\n    // get printers first to remove deleted/archived printers from filtering before fetching prints\n    axios\n      .get(urls.printers(), {\n        params: {\n          with_archived: false,\n        },\n      })\n      .then((response) => {\n        response.data.forEach((p) => {\n          this.filterOptions.printers.values.push({\n            key: String(p.id),\n            title: p.name,\n          })\n        })\n\n        // remove deleted/archived printers from applied filter\n        if (this.filterValues.printers !== 'none') {\n          const validPrinterIds = response.data.map((p) => String(p.id))\n          this.filterValues.printers = this.filterValues.printers.filter((v) =>\n            validPrinterIds.includes(v)\n          )\n          setLocalPref(`${FilterLocalStoragePrefix}-printers`, this.filterValues.printers)\n        }\n\n        this.refetchData()\n      })\n  },\n\n  methods: {\n    fetchMoreData() {\n      if (this.noMoreData) {\n        return\n      }\n      this.loading = true\n      axios\n        .get(urls.prints(), {\n          params: {\n            start: this.prints.length,\n            limit: PAGE_SIZE,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              this.customFilterParamsBuilder\n            ),\n            sorting: `${this.sortingValue.sorting.key}_${this.sortingValue.direction.key}`,\n          },\n        })\n        .then((response) => {\n          this.loading = false\n          this.noMoreData = response.data.length < PAGE_SIZE\n          this.prints.push(...response.data.map((data) => normalizedPrint(data)))\n        })\n        .catch((error) => {\n          this.errorDialog(error)\n        })\n    },\n    refetchData() {\n      this.prints = []\n      this.selectedPrintIds = new Set()\n      this.noMoreData = false\n      this.fetchMoreData()\n      this.fetchStats()\n    },\n    fetchStats() {\n      axios\n        .get(urls.stats(), {\n          params: {\n            ...this.defaultStatsParams,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              this.customFilterParamsBuilder\n            ),\n          },\n        })\n        .then((response) => {\n          this.stats = response.data\n        })\n        .catch((error) => {\n          this.errorDialog(error)\n        })\n    },\n\n    onSelectedChanged(printId, selected) {\n      const selectedPrintIdsClone = new Set(this.selectedPrintIds)\n      if (selected) {\n        selectedPrintIdsClone.add(printId)\n      } else {\n        selectedPrintIdsClone.delete(printId)\n      }\n      this.selectedPrintIds = selectedPrintIdsClone\n    },\n    onDeleteBtnClick() {\n      const selectedPrintIds = Array.from(this.selectedPrintIds)\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t(`Delete {name} print(s)? This action can not be undone.`,{name:this.selectedPrintIds.size})}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.post(urls.printsBulkDelete(), { print_ids: selectedPrintIds }).then(() => {\n            this.refetchData()\n          })\n        }\n      })\n    },\n\n    // Sorting\n    onSortingUpdated(sortingValue) {\n      this.sortingValue = sortingValue\n      this.refetchData()\n    },\n\n    // Filtering\n    onFilterUpdated(filterOptionKey, filterOptionValue) {\n      this.filterValues[filterOptionKey] = filterOptionValue\n      this.refetchData()\n    },\n    resetFilters() {\n      for (const key of Object.keys(this.filterValues)) {\n        this.filterValues[key] = 'none'\n        setLocalPref(`${FilterLocalStoragePrefix}-${key}`, 'none')\n      }\n      this.updateCustomPeriodFilterSubtitle()\n      this.refetchData()\n    },\n    // custom logic for time period filters:\n    getCurrentDateFrom() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`) || null\n    },\n    getCurrentDateTo() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`) || null\n    },\n    filterUpdateMixin(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        if (filterValueKey === 'custom') {\n          if (this.filterValues.timePeriod !== 'custom') {\n            this.$refs.datePickerModal.show()\n          } else {\n            const initDateFrom = this.getCurrentDateFrom()\n            const initDateTo = this.getCurrentDateTo()\n            this.$refs.datePickerModal.show(initDateFrom, initDateTo)\n          }\n          return\n        } else {\n          this.$nextTick(() => {\n            this.updateCustomPeriodFilterSubtitle()\n          })\n        }\n      }\n      return true\n    },\n    onDatesPicked(dateFrom, dateTo) {\n      if (!dateFrom && !dateTo) {\n        return\n      }\n      this.filterValues.timePeriod = 'custom'\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod`, 'custom')\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`, dateFrom)\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`, dateTo)\n      this.updateCustomPeriodFilterSubtitle()\n      this.refetchData()\n    },\n    customFilterParamsBuilder(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        return this.filterOptions[filterOptionKey].buildQueryParam(\n          filterValueKey,\n          this.getCurrentDateFrom(),\n          this.getCurrentDateTo(),\n          this.user\n        )\n      }\n    },\n    updateCustomPeriodFilterSubtitle() {\n      let newTitle = ''\n      if (this.filterValues.timePeriod === 'custom') {\n        // variants:\n        // Feb 15, 2023 — Feb 16, 2023\n        // Feb 15, 2023 and later\n        // Until Feb 16, 2023\n        const dateFormat = 'MMM D, YYYY'\n        const currentDateFrom = this.getCurrentDateFrom()\n        const currentDateTo = this.getCurrentDateTo()\n        const dateFromFormatted = currentDateFrom\n          ? moment(currentDateFrom).format(dateFormat)\n          : `${this.$i18next.t('Until')}`\n        const dateToFormatted = currentDateTo\n          ? moment(currentDateTo).format(dateFormat)\n          : `${this.$i18next.t('and later')}`\n\n        newTitle = `${dateFromFormatted}${\n          currentDateFrom && currentDateTo ? ' - ' : ' '\n        }${dateToFormatted}`\n      }\n\n      const index = this.filterOptions.timePeriod.values.findIndex((v) => v.key === 'custom')\n      this.filterOptions.timePeriod.values[index].subtitle = newTitle\n\n      this.$refs.filteringDropdown1 && this.$refs.filteringDropdown1.$forceUpdate()\n      this.$refs.filteringDropdown2 && this.$refs.filteringDropdown2.$forceUpdate()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.print-item\n  margin-bottom: 10px\n\n.prints-summary\n  margin-bottom: var(--gap-between-blocks)\n  border: 1px solid var(--color-divider)\n  border-radius: var(--border-radius-lg)\n  padding: 1.5rem 2rem\n  display: flex\n  justify-content: space-between\n  align-items: center\n  .summary-item\n    display: flex\n    align-items: center\n    gap: 1rem\n  .icon\n    font-size: 1.5rem\n    color: var(--color-divider)\n  .value\n    font-weight: bold\n  .btn\n    display: inline-flex\n    gap: .5rem\n    align-items: center\n    justify-content: center\n    .fa-arrow-right\n      font-size: .8em\n\n  @media (max-width: 768px)\n    flex-direction: column\n    align-items: normal\n    gap: .25rem\n    padding: 1rem\n\n    .summary-item\n      gap: 0\n      .icon\n        font-size: 1rem\n        width: 2rem\n        text-align: center\n      .info\n        flex: 1\n        display: flex\n        justify-content: space-between\n\n    .btn-wrapper\n      text-align: center\n    .btn\n      margin-top: 1rem\n      font-size: .875rem\n\n.actions-with-selected-desktop\n  display: flex\n  align-items: center\n  .label\n    cursor: pointer\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintHistoryPage.vue?vue&type=template&id=29682057&scoped=true&\"\nimport script from \"./PrintHistoryPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintHistoryPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintHistoryPage.vue?vue&type=style&index=0&id=29682057&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29682057\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-chart-bar\"})]},proxy:true}])},[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"GROUP BY\")))]),_vm._l((_vm.groupingOptions),function(grouping){return _c('b-dropdown-item',{key:grouping.key,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return (() => _vm.updateChartGrouping(grouping)).apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.activeGrouping === grouping.key ? 'visible' : 'hidden' })}),_c('span',[_vm._v(_vm._s(grouping.title))])])})],2),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":_vm.$t('Filter')},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('filtering-dropdown',{ref:\"filteringDropdown1\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'grouping',\n              icon: 'fas fa-chart-bar',\n              title: _vm.$t(`Group By`),\n              expandable: true,\n            },\n            {\n              key: 'filtering',\n              icon: 'fas fa-filter',\n              title: _vm.$t(`Filter`),\n              expandable: true,\n            },\n          ]},scopedSlots:_vm._u([{key:\"grouping\",fn:function(){return [_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"GROUP BY\")))]),_vm._l((_vm.groupingOptions),function(grouping){return _c('b-dropdown-item',{key:grouping.key,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return (() => _vm.updateChartGrouping(grouping)).apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.activeGrouping === grouping.key ? 'visible' : 'hidden' })}),_c('span',[_vm._v(_vm._s(grouping.title))])])})]},proxy:true},{key:\"filtering\",fn:function(){return [_c('filtering-dropdown',{ref:\"filteringDropdown2\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})]},proxy:true}])})],1)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('active-filter-notice',{attrs:{\"filter-values\":_vm.filterValues},on:{\"onShowAllClicked\":_vm.resetFilters}}),(!_vm.stats)?_c('loading-placeholder'):_c('b-container',[_c('b-row',[_c('b-col',[_c('muted-alert',{staticClass:\"muted-alert\"},[_vm._v(_vm._s(_vm.$t(\"Statistics include deleted prints\")))]),(_vm.groupingAdjusted)?_c('muted-alert',{staticClass:\"muted-alert\"},[_vm._v(\" \"+_vm._s(_vm.groupingNotice)+\" \")]):_vm._e()],1)],1),_c('b-row',[_c('b-col',{staticClass:\"mb-4 mb-lg-0\",attrs:{\"lg\":\"6\"}},[_c('div',{staticClass:\"stats-block total-prints\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"fas fa-hashtag\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Total Prints\")))])]),_c('div',{staticClass:\"chart-wrapper\"},[_c('div',{staticClass:\"legend\"},[_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"square success\"}),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Finished\"))+\":\")]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.stats ? _vm.stats.total_succeeded_print_count : ''))])]),_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"square danger\"}),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Cancelled\"))+\":\")]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.stats ? _vm.stats.total_cancelled_print_count : ''))])])]),_c('div',{ref:\"totalPrintsDonutChart\"})])])]),_c('b-col',{attrs:{\"lg\":\"6\"}},[_c('div',{staticClass:\"stats-block print-time\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"far fa-clock\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Print Time\")))])]),_c('div',{staticClass:\"info total-print-time\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total print time\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.humanizedDuration(_vm.stats.total_print_time)))])]),_c('div',{staticClass:\"other-print-time-numbers\"},[_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Longest print\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.humanizedDuration(_vm.stats.longest_print_time)))])]),_c('div',{staticClass:\"divider\"}),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Average print\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.humanizedDuration(_vm.stats.average_print_time)))])])])])])],1),_c('b-row',{staticClass:\"mt-4\"},[_c('b-col',[_c('div',{staticClass:\"stats-block bar-chart\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"fas fa-hashtag\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Prints Count\")))])]),_c('div',{ref:\"printCountGroupsChart\",staticClass:\"bar-chart-wrapper\"})])])],1),_c('b-row',{staticClass:\"mt-4\"},[_c('b-col',[_c('div',{staticClass:\"stats-block bar-chart\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"far fa-clock\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Print Time\")))])]),_c('div',{ref:\"printTimeGroupsChart\",staticClass:\"bar-chart-wrapper\"})])])],1),_c('b-row',{staticClass:\"mt-4\"},[_c('b-col',[_c('div',{staticClass:\"stats-block bar-chart filament-used-groups\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"fas fa-ruler-horizontal\"}),_c('div',{staticClass:\"title-group\"},[_c('span',[_c('help-widget',{attrs:{\"id\":\"filament-used-may-be-incorrect\",\"highlight\":false,\"show-close-button\":false}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Filament Usage\"))+\" \")])],1),_c('div',{staticClass:\"divider\"}),_c('div',{staticClass:\"subtitle\"},[_vm._v(_vm._s(_vm.totalFilamentUsedFormatted)+\" \"+_vm._s(_vm.$t(\"total\")))])])]),_c('div',{ref:\"filamentUsedGroupsChart\",staticClass:\"bar-chart-wrapper\"})])])],1)],1),_c('date-picker-modal',{ref:\"datePickerModal\",on:{\"picked\":_vm.onDatesPicked}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert-wrapper\"},[_vm._m(0),_c('p',{staticClass:\"message\"},[_vm._t(\"default\")],2)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info-circle\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"alert-wrapper\">\n    <div class=\"icon\">\n      <i class=\"fas fa-info-circle\"></i>\n    </div>\n    <p class=\"message\">\n      <slot></slot>\n    </p>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'MutedAlert',\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.alert-wrapper\n  border: 1px solid var(--color-divider)\n  border-radius: var(--border-radius-md)\n  display: flex\n  align-items: center\n  padding: 1em\n\n  .icon\n    color: var(--color-divider)\n\n  .message\n    margin: 0\n    margin-left: 0.5em\n    line-height: 1.3\n\n  @media (max-width: 768px)\n    font-size: 0.8rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MutedAlert.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MutedAlert.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MutedAlert.vue?vue&type=template&id=74f6a500&scoped=true&\"\nimport script from \"./MutedAlert.vue?vue&type=script&lang=js&\"\nexport * from \"./MutedAlert.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MutedAlert.vue?vue&type=style&index=0&id=74f6a500&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"74f6a500\",\n  null\n  \n)\n\nexport default component.exports","// Credit: https://observablehq.com/@d3/donut-chart\n\nimport * as d3 from 'd3'\n\nexport const DonutChart = (\n  data,\n  {\n    name = ([x]) => x, // given d in data, returns the (ordinal) label\n    value = ([, y]) => y, // given d in data, returns the (quantitative) value\n    totalValue = null, // to show in the middle\n    totalValueFormat = ',', // a format specifier for total value\n    title, // given d in data, returns the title text\n    width = 180, // outer width, in pixels\n    height = 180, // outer height, in pixels\n    innerRadius = Math.min(width, height) / 3.6, // inner radius of pie, in pixels (non-zero for donut)\n    outerRadius = Math.min(width, height) / 2, // outer radius of pie, in pixels\n    labelRadius = (innerRadius + outerRadius) / 2, // center radius of labels\n    format = ',', // a format specifier for values (in the label)\n    names, // array of names (the domain of the color scale)\n    colors, // array of colors for names\n    stroke = innerRadius > 0 ? 'none' : 'white', // stroke separating widths\n    strokeWidth = 10, // width of stroke separating wedges\n    strokeLinejoin = 'round', // line join of stroke separating wedges\n    padAngle = stroke === 'none' ? 2 / outerRadius : 0, // angular separation between wedges\n    emptyState = false, // if true, show empty state\n  } = {}\n) => {\n  // Compute values\n  const N = d3.map(data, name)\n  const V = d3.map(data, value)\n  const I = d3.range(N.length).filter((i) => !isNaN(V[i]))\n\n  // Unique the names\n  if (names === undefined) names = N\n  names = new d3.InternSet(names)\n\n  // Chose a default color scheme based on cardinality\n  if (colors === undefined) colors = d3.schemeSpectral[names.size]\n  if (colors === undefined)\n    colors = d3.quantize((t) => d3.interpolateSpectral(t * 0.8 + 0.1), names.size)\n\n  // Construct scales\n  const color = d3.scaleOrdinal(names, colors)\n\n  // Compute titles\n  if (title === undefined) {\n    const formatValue = d3.format(format)\n    title = (i) => `${formatValue(V[i])}`\n  } else {\n    const O = d3.map(data, (d) => d)\n    const T = title\n    title = (i) => T(O[i], i, data)\n  }\n\n  // Construct arcs\n  const arcs = d3\n    .pie()\n    .padAngle(padAngle)\n    .sort(null)\n    .value((i) => V[i])(I)\n  const arc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius)\n  const arcLabel = d3.arc().innerRadius(labelRadius).outerRadius(labelRadius)\n\n  const svg = d3\n    .create('svg')\n    .attr('width', width)\n    .attr('height', height)\n    .attr('viewBox', [-width / 2, -height / 2, width, height])\n    .attr('style', 'max-width: 100%; height: auto; height: intrinsic;')\n\n  svg\n    .append('g')\n    .attr('stroke', stroke)\n    .attr('stroke-width', strokeWidth)\n    .attr('stroke-linejoin', strokeLinejoin)\n    .selectAll('path')\n    .data(arcs)\n    .join('path')\n    .attr('fill', (d) => color(N[d.data]))\n    .attr('d', arc)\n    .append('title')\n    .text((d) => title(d.data))\n\n  svg\n    .append('g')\n    .attr('font-family', 'sans-serif')\n    .attr('font-size', 14)\n    .attr('text-anchor', 'middle')\n    .selectAll('text')\n    .data(arcs)\n    .join('text')\n    .attr('transform', (d) => `translate(${arcLabel.centroid(d)})`)\n    .selectAll('tspan')\n    .data((d) => {\n      if (emptyState) return ['0%']\n      const lines = `${title(d.data)}`.split(/\\n/)\n      return d.endAngle - d.startAngle > 0.25 ? lines : lines.slice(0, 1)\n    })\n    .join('tspan')\n    .attr('x', 0)\n    .attr('y', (_, i) => `${0.3}em`)\n    .attr('font-weight', (_, i) => (i ? null : 'bold'))\n    .attr('fill', '#fff')\n    .text((d) => d)\n\n  // Total value at the center\n  if (totalValue) {\n    svg\n      .append('text')\n      .attr('font-size', 12)\n      .attr('dy', '-.75em')\n      .attr('text-anchor', 'middle')\n      .attr('fill', 'var(--color-text-secondary)')\n      .text('Total')\n\n    const formatTotalValue = d3.format(totalValueFormat)\n\n    svg\n      .append('text')\n      .attr('dy', '.75em')\n      .attr('font-size', 14)\n      .attr('text-anchor', 'middle')\n      .attr('font-weight', 'bold')\n      .attr('fill', 'var(--color-text-primary)')\n      .text(formatTotalValue(totalValue))\n  }\n\n  return Object.assign(svg.node(), { scales: { color } })\n}\n","// Credit: https://observablehq.com/@d3/bar-chart\n\nimport * as d3 from 'd3'\nimport moment from 'moment'\nimport { formatWithoutDaylightSavingShift as format } from '@src/lib/utils'\n\nexport const BarChart = (\n  data,\n  {\n    x = (d, i) => i, // given d in data, returns the (ordinal) x-value\n    y = (d) => d, // given d in data, returns the (quantitative) y-value\n    title, // given d in data, returns the title text\n    marginTop = 20, // the top margin, in pixels\n    marginRight = 0, // the right margin, in pixels\n    marginBottom = 40, // the bottom margin, in pixels\n    marginLeft = 40, // the left margin, in pixels\n    width = 640, // the outer width of the chart, in pixels\n    height = 210, // the outer height of the chart, in pixels\n    xDomain, // an array of (ordinal) x-values\n    xRange = [marginLeft, width - marginRight], // [left, right]\n    xLabelShow = (i) => true, // whether to show the x-axis label\n    xLabelRotation = 0, // the rotation of the x-axis label, in degrees\n    yType = d3.scaleLinear, // y-scale type\n    yDomain, // [ymin, ymax]\n    yRange = [height - marginBottom, marginTop], // [bottom, top]\n    yTicks = height / 40,\n    xPadding = 0.1, // amount of x-range to reserve to separate bars\n    yFormat, // a format specifier string for the y-axis\n    yTickFormat = null,\n    yLabel, // a label for the y-axis\n    color = 'currentColor', // bar fill color\n  } = {}\n) => {\n  // Compute values\n  const X = d3.map(data, x)\n  const Y = d3.map(data, y)\n\n  // Compute default domains, and unique the x-domain\n  if (xDomain === undefined) xDomain = X\n  if (yDomain === undefined) yDomain = [0, d3.max(Y)]\n  xDomain = new d3.InternSet(xDomain)\n\n  // Omit any data not present in the x-domain\n  const I = d3.range(X.length).filter((i) => xDomain.has(X[i]))\n\n  // Construct scales, axes, and formats\n  const xScale = d3.scaleBand(xDomain, xRange).padding(xPadding)\n  const yScale = yType(yDomain, yRange)\n  const xAxis = d3.axisBottom(xScale).tickSizeOuter(0)\n  const yAxis = d3.axisLeft(yScale).ticks(yTicks, yFormat)\n  if (yTickFormat) {\n    yAxis.tickFormat(yTickFormat)\n  }\n\n  // Compute titles\n  if (title === undefined) {\n    const formatValue = yScale.tickFormat(100, yFormat)\n    title = (i) => `${X[i]}: ${formatValue(Y[i])}`\n  } else {\n    const O = d3.map(data, (d) => d)\n    const T = title\n    title = (i) => T(O[i], i, data)\n  }\n\n  const svg = d3\n    .create('svg')\n    .attr('width', width)\n    .attr('height', height)\n    .attr('viewBox', [0, 0, width, height])\n    .attr('style', 'max-width: 100%; height: auto; height: intrinsic;')\n\n  svg\n    .append('g')\n    .attr('transform', `translate(${marginLeft},0)`)\n    .call(yAxis)\n    .call((g) =>\n      g\n        .selectAll('.tick line')\n        .clone()\n        .attr('x2', width - marginLeft - marginRight)\n        .attr('stroke-opacity', 0.1)\n    )\n    .call((g) => g.selectAll('text').attr('font-size', 11))\n\n  const bar = svg\n    .append('g')\n    .attr('fill', color)\n    .selectAll('rect')\n    .data(I)\n    .join('rect')\n    .attr('x', (i) => xScale(X[i]))\n    .attr('y', (i) => yScale(Y[i]))\n    .attr('height', (i) => yScale(0) - yScale(Y[i]))\n    .attr('width', xScale.bandwidth())\n    .attr('rx', 2)\n\n  if (title) bar.append('title').text(title)\n\n  svg\n    .append('g')\n    .attr('transform', `translate(0,${height - marginBottom})`)\n    .call(xAxis)\n    .selectAll('text')\n    .attr('transform', xLabelRotation ? `translate(-10,0)rotate(-${xLabelRotation})` : '')\n    .attr('font-size', 11)\n    .call(function (t) {\n      t.each(function (d, i) {\n        var self = d3.select(this)\n        var lines = self.text().split('\\r')[0].split('\\n') // get the text and split it\n        self.text('') // clear it out\n\n        if (xLabelShow(i)) {\n          self\n            .append('tspan')\n            .attr('x', 0)\n            .attr('dy', '1em')\n            .attr('text-anchor', xLabelRotation ? 'end' : 'middle')\n            .text(lines[0])\n\n          if (lines.length === 2) {\n            self.append('tspan').attr('x', 0).attr('dy', '1.2em').text(lines[1])\n          }\n        }\n      })\n    })\n\n  return svg.node()\n}\n\n// Adaptive x-axis labels based on the width of the chart and number of bars\nexport const xAxisLabelsFormat = (wrapperWidth, barsCount, grouping = 'day', lastDayInDataset) => {\n  const barWidth = wrapperWidth / barsCount\n\n  const horizontalLabelRequiredWidth = grouping === 'day' ? 30 : grouping === 'week' ? 70 : 35\n  const rotatedLabelRequiredWidth = 20\n\n  let frequency, rotation\n  if (barWidth >= horizontalLabelRequiredWidth) {\n    frequency = 1\n    rotation = 0\n  } else {\n    frequency = Math.ceil(rotatedLabelRequiredWidth / barWidth)\n    rotation = 45\n  }\n\n  return {\n    frequency,\n    rotation,\n\n    value: (d) => {\n      const date = moment(d.key)\n\n      let firstLine,\n        secondLine = ''\n      if (grouping === 'day') {\n        firstLine = format(date, 'M/D')\n        secondLine = format(date, 'ddd')\n      } else if (grouping === 'week') {\n        firstLine = format(date, 'M/D')\n\n        const endOfWeek = date.clone().endOf('week')\n        const lastDayOfWeek = endOfWeek.isBefore(lastDayInDataset) ? endOfWeek : lastDayInDataset\n\n        firstLine += `-${\n          lastDayOfWeek.month() === date.month()\n            ? lastDayOfWeek.format('D')\n            : lastDayOfWeek.format('M/D')\n        }`\n        secondLine = lastDayOfWeek.diff(date, 'days') === 6 ? `Week ${date.week()}` : ''\n      } else if (grouping === 'month') {\n        firstLine = format(date, 'MMM')\n        secondLine = format(date, 'YYYY')\n      } else {\n        firstLine = format(date, 'YYYY')\n      }\n\n      let label = firstLine\n      if (rotation === 0) {\n        label += `\\n${secondLine}`\n      }\n\n      const uniqueDateKey = format(date, 'M/D/YYYY')\n      label += `\\r${uniqueDateKey}` // so d3 won't skip same labels\n\n      return label\n    },\n\n    shouldShow: (index) => {\n      return index % frequency === 0\n    },\n  }\n}\n","export async function fetchPrintStats(request, params) {\n  const groupings = ['day', 'week', 'month', 'year']\n  const requestedGrouping = params.group_by.toLowerCase()\n  let effectiveGrouping = requestedGrouping\n\n  for (;;) {\n    try {\n      const response = await request({ ...params, group_by: effectiveGrouping })\n      return { response, requestedGrouping, effectiveGrouping }\n    } catch (error) {\n      const suggestedGrouping = error.response?.data?.suggested_group_by\n      if (\n        error.response?.status !== 400 ||\n        error.response?.data?.code !== 'too_many_stats_buckets' ||\n        !groupings.includes(suggestedGrouping) ||\n        groupings.indexOf(suggestedGrouping) <= groupings.indexOf(effectiveGrouping)\n      ) {\n        throw error\n      }\n      effectiveGrouping = suggestedGrouping\n    }\n  }\n}\n","<template>\n  <page-layout>\n    <!-- Top bar -->\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Grouping -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-chart-bar\"></i>\n          </template>\n          <b-dropdown-text class=\"small text-secondary\">{{ $t(\"GROUP BY\") }}</b-dropdown-text>\n          <b-dropdown-item\n            v-for=\"grouping in groupingOptions\"\n            :key=\"grouping.key\"\n            @click.native.capture.stop.prevent=\"() => updateChartGrouping(grouping)\"\n          >\n            <i\n              class=\"fas fa-check text-primary\"\n              :style=\"{ visibility: activeGrouping === grouping.key ? 'visible' : 'hidden' }\"\n            ></i>\n            <span>{{ grouping.title }}</span>\n          </b-dropdown-item>\n        </b-dropdown>\n        <!-- Filtering -->\n        <b-dropdown\n          right\n          no-caret\n          toggle-class=\"action-btn icon-btn\"\n          menu-class=\"scrollable\"\n          :title=\"$t('Filter')\"\n        >\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <filtering-dropdown\n            ref=\"filteringDropdown1\"\n            :local-storage-prefix=\"filterLocalStoragePrefix\"\n            :filter-options=\"filterOptions\"\n            :filter-values=\"filterValues\"\n            :filter-update-mixin=\"filterUpdateMixin\"\n            @onFilterUpdated=\"onFilterUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'grouping',\n                icon: 'fas fa-chart-bar',\n                title: $t(`Group By`),\n                expandable: true,\n              },\n              {\n                key: 'filtering',\n                icon: 'fas fa-filter',\n                title: $t(`Filter`),\n                expandable: true,\n              },\n            ]\"\n          >\n            <template #grouping>\n              <b-dropdown-text class=\"small text-secondary\">{{ $t(\"GROUP BY\") }}</b-dropdown-text>\n              <b-dropdown-item\n                v-for=\"grouping in groupingOptions\"\n                :key=\"grouping.key\"\n                @click.native.capture.stop.prevent=\"() => updateChartGrouping(grouping)\"\n              >\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: activeGrouping === grouping.key ? 'visible' : 'hidden' }\"\n                ></i>\n                <span>{{ grouping.title }}</span>\n              </b-dropdown-item>\n            </template>\n            <template #filtering>\n              <filtering-dropdown\n                ref=\"filteringDropdown2\"\n                :local-storage-prefix=\"filterLocalStoragePrefix\"\n                :filter-options=\"filterOptions\"\n                :filter-values=\"filterValues\"\n                :filter-update-mixin=\"filterUpdateMixin\"\n                @onFilterUpdated=\"onFilterUpdated\"\n              />\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <active-filter-notice :filter-values=\"filterValues\" @onShowAllClicked=\"resetFilters\" />\n\n      <loading-placeholder v-if=\"!stats\" />\n      <b-container v-else>\n        <b-row>\n          <b-col>\n            <muted-alert class=\"muted-alert\">{{ $t(\"Statistics include deleted prints\") }}</muted-alert>\n            <muted-alert v-if=\"groupingAdjusted\" class=\"muted-alert\">\n              {{ groupingNotice }}\n            </muted-alert>\n          </b-col>\n        </b-row>\n        <b-row>\n          <b-col lg=\"6\" class=\"mb-4 mb-lg-0\">\n            <div class=\"stats-block total-prints\">\n              <div class=\"stats-block-title\">\n                <i class=\"fas fa-hashtag\"></i>\n                <span>{{ $t(\"Total Prints\") }}</span>\n              </div>\n              <div class=\"chart-wrapper\">\n                <div class=\"legend\">\n                  <div class=\"line\">\n                    <div class=\"square success\"></div>\n                    <div class=\"title\">{{ $t(\"Finished\") }}:</div>\n                    <div class=\"value\">{{ stats ? stats.total_succeeded_print_count : '' }}</div>\n                  </div>\n                  <div class=\"line\">\n                    <div class=\"square danger\"></div>\n                    <div class=\"title\">{{ $t(\"Cancelled\") }}:</div>\n                    <div class=\"value\">{{ stats ? stats.total_cancelled_print_count : '' }}</div>\n                  </div>\n                </div>\n                <div ref=\"totalPrintsDonutChart\"></div>\n              </div>\n            </div>\n          </b-col>\n          <b-col lg=\"6\">\n            <div class=\"stats-block print-time\">\n              <div class=\"stats-block-title\">\n                <i class=\"far fa-clock\"></i>\n                <span>{{ $t(\"Print Time\") }}</span>\n              </div>\n              <div class=\"info total-print-time\">\n                <div class=\"title\">{{ $t(\"Total print time\") }}</div>\n                <div class=\"value\">{{ humanizedDuration(stats.total_print_time) }}</div>\n              </div>\n              <div class=\"other-print-time-numbers\">\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Longest print\") }}</div>\n                  <div class=\"value\">{{ humanizedDuration(stats.longest_print_time) }}</div>\n                </div>\n                <div class=\"divider\"></div>\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Average print\") }}</div>\n                  <div class=\"value\">{{ humanizedDuration(stats.average_print_time) }}</div>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row class=\"mt-4\">\n          <b-col>\n            <div class=\"stats-block bar-chart\">\n              <div class=\"stats-block-title\">\n                <i class=\"fas fa-hashtag\"></i>\n                <span>{{ $t(\"Prints Count\") }}</span>\n              </div>\n              <div ref=\"printCountGroupsChart\" class=\"bar-chart-wrapper\"></div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row class=\"mt-4\">\n          <b-col>\n            <div class=\"stats-block bar-chart\">\n              <div class=\"stats-block-title\">\n                <i class=\"far fa-clock\"></i>\n                <span>{{ $t(\"Print Time\") }}</span>\n              </div>\n              <div ref=\"printTimeGroupsChart\" class=\"bar-chart-wrapper\"></div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row class=\"mt-4\">\n          <b-col>\n            <div class=\"stats-block bar-chart filament-used-groups\">\n              <div class=\"stats-block-title\">\n                <i class=\"fas fa-ruler-horizontal\"></i>\n                <div class=\"title-group\">\n                  <span>\n                    <help-widget\n                      id=\"filament-used-may-be-incorrect\"\n                      :highlight=\"false\"\n                      :show-close-button=\"false\"\n                    >\n                      {{$t(\"Filament Usage\")}}\n                    </help-widget>\n                  </span>\n                  <div class=\"divider\"></div>\n                  <div class=\"subtitle\">{{ totalFilamentUsedFormatted }} {{$t(\"total\")}}</div>\n                </div>\n              </div>\n              <div ref=\"filamentUsedGroupsChart\" class=\"bar-chart-wrapper\"></div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n\n      <!-- Date picker for filter by time period -->\n      <date-picker-modal ref=\"datePickerModal\" @picked=\"onDatesPicked\" />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { user } from '@src/lib/page-context'\nimport MutedAlert from '../components/MutedAlert.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport FilteringDropdown, {\n  restoreFilterValues,\n  getFilterParams,\n} from '@src/components/FilteringDropdown'\nimport ActiveFilterNotice from '@src/components/ActiveFilterNotice'\nimport DatePickerModal from '@src/components/DatePickerModal.vue'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport { DonutChart } from '@src/lib/charts/donut-chart'\nimport { BarChart, xAxisLabelsFormat } from '@src/lib/charts/bar-chart'\nimport { queryBuilder, getDateTo, getRecommendedGrouping } from '@src/lib/time-period-filtering'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport { humanizedDuration, humanizedFilamentUsage } from '@src/lib/formatters'\nimport { fetchPrintStats } from '@src/lib/printStats'\nimport i18n from \"@src/i18n/i18n.js\"\nconst GroupingLocalStorageKey = 'statsGrouping'\n\nconst DateParamFormat = 'YYYY-MM-DD'\nconst FilterLocalStoragePrefix = 'statsFiltering'\nconst FilterOptions = {\n  timePeriod: {\n    title: `${i18n.t('Time Period')}`,\n    buildQueryParam: queryBuilder,\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'this_week', title: `${i18n.t('This Week') }`},\n      { key: 'this_month', title: `${i18n.t('This Month') }`},\n      { key: 'this_year', title: `${i18n.t('This Year') }`},\n      { key: 'custom', title: `${i18n.t('Custom') }`},\n    ],\n    default: 'none',\n  },\n  printStatus: {\n    title: `${i18n.t('Print Status')}`,\n    queryParam: 'filter',\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'finished', title: `${i18n.t('Finished') }`},\n      { key: 'cancelled', title: `${i18n.t('Cancelled') }`},\n    ],\n    default: 'none',\n  },\n  printers: {\n    title: `${i18n.t('Printers')}`,\n    queryParam: 'filter_by_printer_ids',\n    multiple: true,\n    values: [\n      { key: 'none', title: `${i18n.t('All')}`, includesAll: true },\n      // Other options are added on printers fetch\n    ],\n    default: 'none',\n  },\n}\n\nexport default {\n  name: 'StatsPage',\n\n  components: {\n    PageLayout,\n    MutedAlert,\n    CascadedDropdown,\n    FilteringDropdown,\n    ActiveFilterNotice,\n    DatePickerModal,\n    HelpWidget,\n  },\n\n  data: function () {\n    return {\n      user: null,\n      stats: null,\n      requestedGrouping: null,\n      effectiveGrouping: null,\n\n      groupingOptions: [\n        { key: 'auto', title: 'Auto' },\n        { key: 'day', title: 'Day' },\n        { key: 'week', title: 'Week' },\n        { key: 'month', title: 'Month' },\n        { key: 'year', title: 'Year' },\n      ],\n      activeGrouping: getLocalPref(GroupingLocalStorageKey, 'auto'),\n\n      // Filtering\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n    }\n  },\n\n  computed: {\n    groupingAdjusted() {\n      return this.requestedGrouping !== this.effectiveGrouping\n    },\n    effectiveGroupingTitle() {\n      return this.groupingOptions.find((grouping) => grouping.key === this.effectiveGrouping)?.title || ''\n    },\n    groupingNotice() {\n      return this.$t('Grouped by {{grouping}} to show the full selected period.', {\n        grouping: this.$t(this.effectiveGroupingTitle),\n      })\n    },\n    defaultStatsParams() {\n      return {\n        timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n        from_date: moment(this.user.date_joined).format(DateParamFormat),\n        to_date: moment(new Date()).format(DateParamFormat),\n        group_by: this.getActiveGrouping(),\n      }\n    },\n\n    isEmptyState() {\n      return !this.stats?.total_print_count\n    },\n\n    // Total prints count\n    finishedPrintsPercentage() {\n      const finished = this.stats?.total_succeeded_print_count\n      const total = this.stats?.total_print_count\n\n      if (!finished || !total) {\n        return 0\n      }\n\n      return Math.round((finished / total) * 100)\n    },\n    cancelledPrintsPercentage() {\n      const total = this.stats?.total_print_count\n\n      if (!total) {\n        return 0\n      } else {\n        return 100 - this.finishedPrintsPercentage\n      }\n    },\n\n    totalFilamentUsedFormatted() {\n      return humanizedFilamentUsage(this.stats?.total_filament_used)\n    },\n  },\n\n  created() {\n    this.user = user()\n    this.updateCustomPeriodFilterSubtitle()\n\n    // get printers first to remove deleted/archived printers from filtering before fetching prints\n    axios\n      .get(urls.printers(), {\n        params: {\n          with_archived: false,\n        },\n      })\n      .then((response) => {\n        response.data.forEach((p) => {\n          this.filterOptions.printers.values.push({\n            key: String(p.id),\n            title: p.name,\n          })\n        })\n\n        // remove deleted/archived printers from applied filter\n        if (this.filterValues.printers !== 'none') {\n          const validPrinterIds = response.data.map((p) => String(p.id))\n          this.filterValues.printers = this.filterValues.printers.filter((v) =>\n            validPrinterIds.includes(v)\n          )\n          setLocalPref(`${FilterLocalStoragePrefix}-printers`, this.filterValues.printers)\n        }\n\n        this.fetchStats()\n      })\n  },\n\n  mounted() {\n    addEventListener('resize', this.drawCharts)\n  },\n\n  unmounted() {\n    removeEventListener('resize', this.drawCharts)\n  },\n\n  methods: {\n    getFilterParamsFromQuery() {\n      let params = {}\n      const urlParams = new URLSearchParams(window.location.search)\n      const entries = urlParams.entries()\n\n      // frontend params without need to be passed to backend\n      const excludeParams = ['hide_header']\n\n      for (const [key, value] of entries) {\n        if (key && value && !excludeParams.includes(key)) {\n          params[key] = params[key]\n            ? Array.isArray(params[key])\n              ? [...params[key], value]\n              : [params[key], value]\n            : value\n        }\n      }\n      console.log('params', params)\n      return params\n    },\n    async fetchStats() {\n      try {\n        const { response, requestedGrouping, effectiveGrouping } = await fetchPrintStats(\n          (params) => axios.get(urls.stats(), { params }),\n          {\n            with_deleted: true,\n            ...this.defaultStatsParams,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              this.customFilterParamsBuilder\n            ),\n            ...this.getFilterParamsFromQuery(),\n          }\n        )\n        this.stats = response.data\n        this.requestedGrouping = requestedGrouping\n        this.effectiveGrouping = effectiveGrouping\n        this.$nextTick(this.drawCharts)\n      } catch (error) {\n        this.errorDialog(error, `${this.$i18next.t('Failed to fetch statistics')}`)\n      }\n    },\n    updateChartGrouping(grouping) {\n      this.activeGrouping = grouping.key\n      setLocalPref(GroupingLocalStorageKey, grouping.key)\n      this.fetchStats()\n    },\n    drawCharts() {\n      if (!this.stats) {\n        return\n      }\n\n      this.$refs.totalPrintsDonutChart.replaceChildren(\n        DonutChart(\n          [\n            {\n              name: 'Finished',\n              value: this.isEmptyState ? 0.5 : this.finishedPrintsPercentage / 100,\n            },\n            {\n              name: 'Cancelled',\n              value: this.isEmptyState ? 0.5 : this.cancelledPrintsPercentage / 100,\n            },\n          ],\n          {\n            name: (d) => d.name,\n            value: (d) => d.value,\n            format: '.0%',\n            totalValue: this.isEmptyState\n              ? '0'\n              : this.stats.total_succeeded_print_count + this.stats.total_cancelled_print_count,\n            names: ['Finished', 'Cancelled'],\n            colors: ['var(--color-success)', 'var(--color-danger)'],\n            emptyState: this.isEmptyState,\n          }\n        )\n      )\n\n      // Print count groups bars\n      const printCountMaxValue = Math.max(...this.stats.print_count_groups.map((d) => d.value))\n      this.drawBarChart({\n        data: this.stats.print_count_groups,\n        ref: this.$refs.printCountGroupsChart,\n        yFormat: 'd',\n        titleValue: (v) => `${v} print(s)`,\n        yDomain: [0, printCountMaxValue || 1],\n        yTicks: Math.min(printCountMaxValue || 1, 5),\n      })\n\n      // Print time groups bars\n      const printTimeMaxValue = Math.max(...this.stats.print_time_groups.map((d) => d.value))\n      const printTimeMaxvalueHours = Math.round(printTimeMaxValue / 3600)\n      this.drawBarChart({\n        data: this.stats.print_time_groups.map((d) => ({ ...d, value: d.value / 3600 })),\n        ref: this.$refs.printTimeGroupsChart,\n        yFormat: 'd',\n        yTickFormat: (h) => {\n          if (h > 24 * 365) {\n            return `${Math.round(h / (24 * 365))}y`\n          } else if (h >= 24) {\n            return `${Math.round(h / 24)}d`\n          } else {\n            return `${h}h`\n          }\n        },\n        titleValue: (v) => this.humanizedDuration(v * 3600),\n        yDomain: [0, printTimeMaxvalueHours || 1],\n        yTicks: Math.min(printTimeMaxvalueHours || 1, 5),\n      })\n\n      // Filament used groups bars\n      const filamentUsedMaxValue = Math.max(...this.stats.filament_used_groups.map((d) => d.value))\n      const filamentUsedMaxvalueMeters = Math.round(filamentUsedMaxValue / 1000)\n      this.drawBarChart({\n        data: this.stats.filament_used_groups.map((d) => ({ ...d, value: d.value / 1000 })),\n        ref: this.$refs.filamentUsedGroupsChart,\n        yFormat: 'd',\n        yTickFormat: (m) => `${m}m`,\n        titleValue: (v) => (v >= 1000 ? Math.round(v / 1000) + 'km' : v + 'm'),\n        yDomain: [0, filamentUsedMaxvalueMeters || 1],\n        yTicks: Math.min(filamentUsedMaxvalueMeters || 1, 5),\n      })\n    },\n    drawBarChart({ data, ref, yFormat, yTickFormat, yTicks, yDomain, titleValue }) {\n      const chartWidth = ref.offsetWidth\n      const barsCount = data.length\n      const xLabelsFormat = xAxisLabelsFormat(\n        chartWidth,\n        barsCount,\n        this.effectiveGrouping,\n        getDateTo(this.filterValues.timePeriod, this.getCurrentDateTo())\n      )\n\n      ref.replaceChildren(\n        BarChart(data, {\n          xLabelRotation: xLabelsFormat.rotation,\n          xLabelShow: xLabelsFormat.shouldShow,\n          x: xLabelsFormat.value,\n          y: (d) => d.value,\n          yFormat,\n          yTickFormat,\n          yDomain,\n          yTicks,\n          width: chartWidth,\n          color: 'var(--color-divider)',\n          title: (d) => {\n            const label = xLabelsFormat.value(d).split('\\r')[0].split('\\n')\n            return `${label[0] + (label[1] ? ', ' + label[1] : '')} — ${\n              titleValue ? titleValue(d.value) : d.value\n            }`\n          },\n          marginBottom: 55,\n        })\n      )\n    },\n\n    humanizedDuration,\n\n    // Filtering\n    onFilterUpdated(filterOptionKey, filterOptionValue) {\n      this.filterValues[filterOptionKey] = filterOptionValue\n      this.fetchStats()\n    },\n    resetFilters() {\n      for (const key of Object.keys(this.filterValues)) {\n        this.filterValues[key] = 'none'\n        setLocalPref(`${FilterLocalStoragePrefix}-${key}`, 'none')\n      }\n      this.updateCustomPeriodFilterSubtitle()\n      this.fetchStats()\n    },\n    // time periods grouping\n    getActiveGrouping() {\n      return this.activeGrouping === 'auto'\n        ? getRecommendedGrouping(\n            this.filterValues.timePeriod,\n            this.getCurrentDateFrom(),\n            this.getCurrentDateTo(),\n            this.user\n          )\n        : this.activeGrouping\n    },\n    // custom logic for time period filters:\n    getCurrentDateFrom() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`) || null\n    },\n    getCurrentDateTo() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`) || null\n    },\n    filterUpdateMixin(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        if (filterValueKey === 'custom') {\n          if (this.filterValues.timePeriod !== 'custom') {\n            this.$refs.datePickerModal.show()\n          } else {\n            const initDateFrom = this.getCurrentDateFrom()\n            const initDateTo = this.getCurrentDateTo()\n            this.$refs.datePickerModal.show(initDateFrom, initDateTo)\n          }\n          return\n        } else {\n          this.$nextTick(() => {\n            this.updateCustomPeriodFilterSubtitle()\n          })\n        }\n      }\n      return true\n    },\n    onDatesPicked(dateFrom, dateTo) {\n      if (!dateFrom && !dateTo) {\n        return\n      }\n      this.filterValues.timePeriod = 'custom'\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod`, 'custom')\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`, dateFrom)\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`, dateTo)\n      this.updateCustomPeriodFilterSubtitle()\n      this.fetchStats()\n    },\n    customFilterParamsBuilder(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        return this.filterOptions[filterOptionKey].buildQueryParam(\n          filterValueKey,\n          this.getCurrentDateFrom(),\n          this.getCurrentDateTo(),\n          this.user\n        )\n      }\n    },\n    updateCustomPeriodFilterSubtitle() {\n      let newTitle = ''\n      if (this.filterValues.timePeriod === 'custom') {\n        // variants:\n        // Feb 15, 2023 — Feb 16, 2023\n        // Feb 15, 2023 and later\n        // Until Feb 16, 2023\n        const dateFormat = 'MMM D, YYYY'\n        const currentDateFrom = this.getCurrentDateFrom()\n        const currentDateTo = this.getCurrentDateTo()\n        const dateFromFormatted = currentDateFrom\n          ? moment(currentDateFrom).format(dateFormat)\n          : 'Until'\n        const dateToFormatted = currentDateTo\n          ? moment(currentDateTo).format(dateFormat)\n          : 'and later'\n\n        newTitle = `${dateFromFormatted}${\n          currentDateFrom && currentDateTo ? ' - ' : ' '\n        }${dateToFormatted}`\n      }\n\n      const index = this.filterOptions.timePeriod.values.findIndex((v) => v.key === 'custom')\n      this.filterOptions.timePeriod.values[index].subtitle = newTitle\n\n      this.$refs.filteringDropdown1 && this.$refs.filteringDropdown1.$forceUpdate()\n      this.$refs.filteringDropdown2 && this.$refs.filteringDropdown2.$forceUpdate()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.muted-alert\n  margin-bottom: var(--gap-between-blocks)\n\n.stats-block\n  background-color: var(--color-surface-secondary)\n  padding: 1.75em 2.25em\n  border-radius: var(--border-radius-lg)\n  height: 280px\n  display: flex\n  flex-direction: column\n  &.bar-chart\n    height: auto\n    .chart-wrapper\n      height: 210px\n  @media (max-width: 768px)\n    padding: 1.25em 1.5em\n\n.stats-block-title\n  font-size: 1.125rem\n  color: var(--color-text-primary)\n  font-weight: medium\n  span\n    display: inline-block\n    margin-left: .5em\n  i\n    color: var(--color-divider)\n\n.print-time\n  justify-content: space-between\n  .title\n    font-size: 1.125rem\n    color: var(--color-text-secondary)\n  .value\n    font-size: 1.5rem\n    color: var(--color-text-primary)\n  .other-print-time-numbers\n    display: flex\n    .divider\n      width: 1px\n      background-color: var(--color-divider)\n      margin: 0 2rem\n    .info\n      .title\n        font-size: .875rem\n      .value\n        font-size: 1.125rem\n\n.total-prints\n  .chart-wrapper\n    flex: 1\n    display: flex\n    justify-content: space-between\n    align-items: center\n    gap: 1rem\n  .legend\n    display: flex\n    flex-direction: column\n    justify-content: center\n  .line\n    display: flex\n    align-items: center\n    gap: .3rem\n    margin: .25rem 0\n    @media (max-width: 768px)\n      font-size: .875rem\n  .square\n    width: 1.125rem\n    height: 1.125rem\n    border-radius: var(--border-radius-xs)\n    margin-right: .2rem\n    &.success\n      background-color: var(--color-success)\n    &.danger\n      background-color: var(--color-danger)\n  .value\n    font-weight: bold\n\n.filament-used-groups\n  .title-group\n    display: inline-flex\n    align-items: center\n    gap: .875rem\n    @media (max-width: 768px)\n      margin-left: 0.5rem\n      flex-direction: column\n      align-items: flex-start\n      gap: 0\n      .divider\n        display: none\n      span\n        margin-left: 0\n    .divider\n      width: 1px\n      background-color: var(--color-divider)\n      height: 1.25rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatsPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatsPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StatsPage.vue?vue&type=template&id=1a9239ba&scoped=true&\"\nimport script from \"./StatsPage.vue?vue&type=script&lang=js&\"\nexport * from \"./StatsPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StatsPage.vue?vue&type=style&index=0&id=1a9239ba&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1a9239ba\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [(_vm.isLoading)?_c('loading-placeholder'):_c('b-container',{attrs:{\"fluid\":\"\"}},[_c('b-row',[_c('b-col',{attrs:{\"lg\":\"5\"}},[_c('div',{staticClass:\"print-info\"},[_c('div',{staticClass:\"card-container print-details\"},[(_vm.currentIndex || _vm.currentIndex === 0)?_c('div',{staticClass:\"navigation-container\"},[_c('b-button',{attrs:{\"variant\":\"outline-secondary\",\"disabled\":!_vm.prevPrint},on:{\"click\":function($event){$event.preventDefault();return _vm.switchToPrint(_vm.prevPrint)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\"  \"+_vm._s(_vm.PrevPrintButtonTitle)+\" \")]),_c('div',{staticClass:\"summary truncated-wrapper\"},[_c('div',{staticClass:\"date truncated\"},[_vm._v(\" \"+_vm._s(_vm.print.started_at.format(_vm.absoluteDateFormat))+\" \")])]),_c('b-button',{attrs:{\"variant\":\"outline-secondary\",\"disabled\":!_vm.nextPrint},on:{\"click\":function($event){$event.preventDefault();return _vm.switchToPrint(_vm.nextPrint)}}},[_vm._v(\" \"+_vm._s(_vm.NextPrintButtonTitle)+\"  \"),_c('i',{staticClass:\"fas fa-chevron-right\"})])],1):_vm._e(),_c('div',[_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Status\")))])]),_c('div',{staticClass:\"value\"},[_c('div',{staticClass:\"print-status-color\",class:_vm.print.status.key},[_vm._v(\" \"+_vm._s(_vm.print.status.title)+\" \")])])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Start time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.print.started_at.format(_vm.absoluteDateFormat)))])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"End time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.ended_at ? _vm.print.ended_at.format(_vm.absoluteDateFormat) : '-')+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Duration\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.print.duration || '-'))])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-ruler-horizontal\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Filament used\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.filament_used ? _vm.humanizedFilamentUsage(_vm.print.filament_used) : '-')+\" \")])])])]),_c('g-code-details',{attrs:{\"file\":_vm.print.g_code_file || { filename: _vm.print.filename },\"show-open-button\":_vm.canOpenFile}}),(_vm.print.printer)?_c('div',{staticClass:\"card-container printer\"},[_c('div',{staticClass:\"icon\"},[_c('svg',{staticStyle:{\"margin-bottom\":\"5px\"},attrs:{\"width\":\"1em\",\"height\":\"1em\"}},[_c('use',{attrs:{\"href\":\"#svg-3d-printer\"}})])]),_c('div',{staticClass:\"info truncated-wrapper\"},[_c('div',{staticClass:\"title truncated\",attrs:{\"title\":_vm.print.printer.name}},[_vm._v(\" \"+_vm._s(_vm.print.printer.name)+\" \")]),_c('div',{staticClass:\"subtitle truncated\",class:[\n                    _vm.printer\n                      ? _vm.printer.isPrintable() && !_vm.printer.inTransientState()\n                        ? 'text-success'\n                        : 'text-warning'\n                      : 'text-danger',\n                  ]},[_vm._v(\" \"+_vm._s(_vm.printer ? _vm.printer.printabilityText() : 'Deleted')+\" \")])]),(\n                  _vm.printer &&\n                  _vm.print.g_code_file &&\n                  !_vm.print.g_code_file.deleted &&\n                  _vm.print.g_code_file.url\n                )?_c('div',{staticClass:\"action\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":!_vm.printer.isPrintable() || _vm.printer.inTransientState()},on:{\"click\":_vm.onRepeatPrintClicked}},[(_vm.isSending)?_c('b-spinner',{staticClass:\"mr-2\",attrs:{\"small\":\"\"}}):_vm._e(),_c('span',[_vm._v(_vm._s(_vm.$t(\"Reprint\")))])],1)]):_vm._e()]):_c('div',{staticClass:\"card-container printer\"},[_c('p',[_vm._v(\"Unknown Printer\")])])],1)]),_c('b-col',{attrs:{\"lg\":\"7\"}},[_c('div',{staticClass:\"print-info\"},[(_vm.firstLayerInspection.id)?_c('div',{staticClass:\"card-container\"},[_c('b-row',{staticClass:\"m-0\"},[_c('b-col',{staticClass:\"first-layer-info-column\",attrs:{\"cols\":\"12\",\"sm\":\"6\",\"md\":\"6\",\"lg\":\"12\",\"xl\":\"6\"}},[_c('div',[_c('b-row',{staticClass:\"mb-4\"},[_c('span',{staticClass:\"ml-3\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Report\")))])]),_c('div',{staticClass:\"first-layer-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Grade\")))])]),_c('div',{staticClass:\"value\"},[_c('div',{staticClass:\"print-status-color\",class:_vm.gradeResult.gradeAccent},[_vm._v(\" \"+_vm._s(_vm.gradeResult.gradeTitle || ' ')+\" \")])])]),_c('div',{staticClass:\"first-layer-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Print Time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.firstLayerPrintTime))])])],1),_c('b-row',{staticClass:\"m-0\"},[_c('b-button',{staticClass:\"open-detailed-report-button\",on:{\"click\":_vm.onOpenDetailedReport}},[_vm._v(_vm._s(_vm.$t(\"Open Detailed Report\")))])],1)],1),_c('b-col',{staticClass:\"first-layer-report-block-video-container\",attrs:{\"cols\":\"12\",\"sm\":\"6\",\"md\":\"6\",\"lg\":\"12\",\"xl\":\"6\"}},[_c('div',{staticClass:\"first-layer-video-wrapper\",class:{\n                            'is-fullscreen original':\n                              !!_vm.fullscreenUrl && _vm.fullscreenUrl === _vm.firstLayerInspection.tagged_video_url,\n                          }},[_c('video-box',{attrs:{\"video-url\":_vm.firstLayerInspection.tagged_video_url,\"poster-url\":_vm.aiTimeLapsePosterImageUrl,\"fluid\":false,\"fullscreen-btn\":_vm.fullscreenUrl === null,\"exit-fullscreen-btn\":_vm.fullscreenUrl !== null,\"download-btn\":true},on:{\"fullscreen\":() => _vm.enterFullscreen(_vm.firstLayerInspection.tagged_video_url),\"exitFullscreen\":_vm.exitFullscreen,\"download\":() => _vm.downloadFile(_vm.firstLayerInspection.tagged_video_url, `${_vm.print.id}_tagged_video_inspection.mp4`)}})],1)])],1)],1):_vm._e(),_c('div',{staticClass:\"time-lapse\"},[(_vm.print.video_archived_at)?_c('div',{staticClass:\"card-container\"},[_c('h2',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Time-Lapse video deleted\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Time-lapse videos older than 6-months are deleted from the {brandName} app server as they are rarely needed and cost significant amount to store in the cloud.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_c('i18next',{attrs:{\"translation\":_vm.$t(`If you are a Pro subscriber and you don't want your time-lapse videos to be deleted, please {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"mailto:support@obico.io?subject=Please%20keep%20my%20timelapse%20videos\"}},[_vm._v(_vm._s(_vm.$t(\"contact us\")))])]},proxy:true}],null,false,4060562873)}),_vm._v(\" . \")],1)]):(_vm.print.video_url || _vm.print.tagged_video_url)?_c('div',[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-tabs',{attrs:{\"pills\":\"\",\"card\":\"\"}},[_c('b-tab',{attrs:{\"title\":\"Detective Time-Lapse\",\"disabled\":!_vm.canShowDetectiveView}},[_c('b-card-text',[(_vm.print.tagged_video_url)?_c('div',{class:{\n                            'is-fullscreen':\n                              !!_vm.fullscreenUrl && _vm.fullscreenUrl === _vm.print.tagged_video_url,\n                          }},[_c('div',{staticClass:\"video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.print.tagged_video_url,\"poster-url\":_vm.print.poster_url,\"fluid\":false,\"fullscreen-btn\":_vm.fullscreenUrl === null,\"exit-fullscreen-btn\":_vm.fullscreenUrl !== null,\"download-btn\":true},on:{\"timeupdate\":_vm.onTimeUpdate,\"fullscreen\":() => _vm.enterFullscreen(_vm.print.tagged_video_url),\"exitFullscreen\":_vm.exitFullscreen,\"download\":() => _vm.downloadFile(_vm.print.tagged_video_url, `${_vm.print.id}_tagged.mp4`)}})],1),_c('div',{staticClass:\"detective-footer\"},[(_vm.print.prediction_json_url)?_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}}):_vm._e(),_c('div',{staticClass:\"feedback-section\"},[_c('div',{staticClass:\"lead\",class:[_vm.print.alerted_at ? 'text-danger' : 'text-success']},[_vm._v(\" \"+_vm._s(_vm.print.alerted_at ? 'Failure detected' : 'No failure detected')+\" \")]),_c('div',{staticClass:\"py-2\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Did we get it right?\"))+\" \"),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedUp ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbUpClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-up\"})],1),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedDown ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbDownClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-down\"})],1)],1),_c('transition',{attrs:{\"name\":\"bounce\"}},[(_vm.print.printShotFeedbackEligible)?_c('div',{staticClass:\"pt-2\"},[_c('b-button',{attrs:{\"variant\":\"outline-primary\",\"size\":\"sm\",\"href\":`/prints/shot-feedback/${_vm.print.id}/`}},[(!_vm.print.need_print_shot_feedback)?_c('i',{staticClass:\"fas fa-check mr-2\"}):_vm._e(),_vm._v(\" \"+_vm._s(_vm.$t(\"FOCUSED FEEDBACK\"))+\" \")])],1):_vm._e()]),_c('div',{staticClass:\"about-feedback\"},[(_vm.print.printShotFeedbackEligible)?_c('small',[(!_vm.print.need_print_shot_feedback)?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\"))+\" \")]):_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\"))+\" \")])])]):_c('small',[_vm._v(\" \"+_vm._s(_vm.$t(\"Every time you give us feedback,\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"you help us get better at detecting failures\"))+\" \")])])])],1)],1)]):_c('div',[_c('detective-working',{staticClass:\"detective-placeholder\"})],1)])],1),(_vm.print.video_url)?_c('b-tab',{attrs:{\"active\":!_vm.print.tagged_video_url,\"title\":\"Original Time-Lapse\"}},[_c('b-card-text',[_c('div',{class:{\n                            'is-fullscreen original':\n                              !!_vm.fullscreenUrl && _vm.fullscreenUrl === _vm.print.video_url,\n                          }},[_c('div',{staticClass:\"video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.print.video_url,\"poster-url\":_vm.print.poster_url,\"fluid\":false,\"fullscreen-btn\":_vm.fullscreenUrl === null,\"exit-fullscreen-btn\":_vm.fullscreenUrl !== null,\"download-btn\":true},on:{\"timeupdate\":_vm.onTimeUpdate,\"fullscreen\":() => _vm.enterFullscreen(_vm.print.video_url),\"exitFullscreen\":_vm.exitFullscreen,\"download\":() => _vm.downloadFile(_vm.print.video_url, `${_vm.print.id}.mp4`)}})],1)])])],1):_vm._e()],1)],1)],1):_c('div',{staticClass:\"card-container\"},[_c('p',{staticClass:\"text-secondary mt-3\"},[_vm._v(_vm._s(_vm.$t(\"Time-Lapse video unavailable because\"))+\":\")]),_c('ul',[_c('li',{staticClass:\"text-secondary mt-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"The {brandName} server is still processing the time-lapse;\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',{staticClass:\"text-secondary mt-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Or, the print time was shorter than the threshold. You can change the threshold in {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":`/printers/${_vm.print.printer.id}/`}},[_vm._v(_vm._s(_vm.$t(\"the printer settings\"))+\".\")])]},proxy:true}])})],1)])])])])])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"obico-gauge-container\"},[_c('span',{style:({ color: _vm.titleColor }),attrs:{\"id\":\"title\"}},[_vm._v(_vm._s(_vm.titleText))]),_c('div',{staticClass:\"obico-gauge\"},[_c('radial-gauge',{attrs:{\"value\":_vm.value,\"options\":_vm.computedOptions}})],1),_c('hr')])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"obico-gauge-container\">\n    <span id=\"title\" :style=\"{ color: titleColor }\">{{ titleText }}</span>\n    <div class=\"obico-gauge\">\n      <radial-gauge :value=\"value\" :options=\"computedOptions\"></radial-gauge>\n    </div>\n    <hr />\n  </div>\n</template>\n\n<script>\nimport RadialGauge from 'vue2-canvas-gauges/src/RadialGauge'\nimport { Themes } from '@static/js/color-scheme'\nimport { currentThemeValue } from '@src/lib/color-scheme-controller'\n\nexport default {\n  name: 'FailureDetectionGauge',\n  components: {\n    RadialGauge,\n  },\n  props: {\n    normalizedP: {\n      type: Number,\n      required: true,\n    },\n\n    isWatching: {\n      type: Boolean,\n      default: true,\n    },\n\n    options: {\n      // https://canvas-gauges.com/documentation/user-guide/configuration\n      type: Object,\n      default: null,\n    },\n  },\n\n  computed: {\n    computedOptions() {\n      if (this.options !== null) {\n        return this.options\n      }\n\n      const inactiveColor = {\n        highlight1: currentThemeValue() === Themes.Light ? '#929292' : '#8395a7',\n        highlight2: currentThemeValue() === Themes.Light ? '#b7b7b7' : '#a8bacc',\n        highlight3: currentThemeValue() === Themes.Light ? '#7b7b7b' : '#6c7e90',\n        needle: currentThemeValue() === Themes.Light ? '#2d3e4f' : '#ffffff',\n      }\n\n      return {\n        valueDec: 0,\n        valueInt: 0,\n        width: 240,\n        height: 240,\n        units: false,\n        box: false,\n        minValue: 0,\n        maxValue: 100,\n        majorTicks: ['', '', '', ''],\n        minorTicks: 4,\n        highlights: [\n          { from: 0, to: 33, color: this.isWatching ? '#5cb85c' : inactiveColor.highlight1 },\n          { from: 33, to: 67, color: this.isWatching ? '#f0ad4e' : inactiveColor.highlight2 },\n          { from: 67, to: 100, color: this.isWatching ? '#d9534f' : inactiveColor.highlight3 },\n        ],\n        colorPlate: 'rgba(255,255,255,.0)',\n        colorTitle: '#5cb85c',\n        colorStrokeTicks: '#EBEBEB',\n        colorNeedleEnd: this.isWatching ? 'rgba(255, 160, 122, .9)' : inactiveColor.needle,\n        colorNeedle: this.isWatching ? 'rgba(240, 128, 128, 1)' : inactiveColor.needle,\n        colorNeedleShadowUp: this.isWatching ? 'rgba(2,255,255,0.2)' : inactiveColor.needle,\n        valueBox: false,\n        animationRule: 'bounce',\n        animationDuration: 500,\n        animatedValue: true,\n        startAngle: 90,\n        ticksAngle: 180,\n        borders: false,\n      }\n    },\n    value() {\n      return this.normalizedP * 100\n    },\n    titleText() {\n      if (!this.isWatching) {\n        return `${this.$i18next.t('Not Watching')}`\n      }\n      switch (this.level()) {\n        case 0:\n          return `${this.$i18next.t('Looking Good')}`\n        case 1:\n          return `${this.$i18next.t('Fishy...')}`\n        case 2:\n          return `${this.$i18next.t('Failing!')}`\n        default:\n          return `${this.$i18next.t(\"Looking Good\")}`\n      }\n    },\n    titleColor() {\n      if (!this.isWatching) {\n        return 'var(--color-text-secondary)'\n      }\n      switch (this.level()) {\n        case 0:\n          return '#5cb85c'\n        case 1:\n          return '#f0ad4e'\n        case 2:\n          return '#d9534f'\n        default:\n          return '#5cb85c'\n      }\n    },\n  },\n\n  methods: {\n    level() {\n      if (this.value > 66) {\n        return 2\n      } else if (this.value > 33) {\n        return 1\n      } else {\n        return 0\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n#title\n  position: absolute\n  left: 0px\n  text-align: center\n  width: 100%\n  top: 50%\n\n.obico-gauge-container\n  position: relative\n  padding: 0 16px\n  .obico-gauge\n    text-align: center\n    padding: 8px\n    margin-bottom: -150px\n    pointer-events: none\n  hr\n    background-color: #EBEBEB\n    height: 1px\n    margin-top: 15px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionGauge.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionGauge.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FailureDetectionGauge.vue?vue&type=template&id=1f5952c0&scoped=true&\"\nimport script from \"./FailureDetectionGauge.vue?vue&type=script&lang=js&\"\nexport * from \"./FailureDetectionGauge.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FailureDetectionGauge.vue?vue&type=style&index=0&id=1f5952c0&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1f5952c0\",\n  null\n  \n)\n\nexport default component.exports","'use strict'\nimport assign from 'lodash/assign'\nimport Vue from 'vue'\nimport ifvisible from 'ifvisible'\nimport pako from 'pako'\nimport { toArrayBuffer } from '@src/lib/utils'\nimport { clearPrinterTransientState } from '@src/lib/printer-transient-state'\nimport i18n from '@src/i18n/i18n.js'\n\n// PrinterCommManager is a singleton: https://www.sitepoint.com/javascript-design-patterns-singleton/\nclass PrinterCommManager {\n  constructor() {\n    if (!PrinterCommManager.instance) {\n      this.printerCommMap = new Map()\n      PrinterCommManager.instance = this\n    }\n    return PrinterCommManager.instance\n  }\n\n  setPrinterComm(printerId, printerComm) {\n    this.printerCommMap.set(printerId, printerComm)\n  }\n\n  getPrinterComm(printerId) {\n    return this.printerCommMap.get(printerId)\n  }\n\n  getOrCreatePrinterComm(...props) {\n    const printerId = String(props[0]) // assuming same args as for PrinterComm function\n    if (!this.getPrinterComm(printerId)) {\n      this.setPrinterComm(printerId, PrinterComm(...props))\n    }\n    return this.getPrinterComm(printerId)\n  }\n\n  closeConnection(printerId) {\n    const printerComm = this.getPrinterComm(printerId)\n    if (printerComm) {\n      printerComm.closeServerWebSocket()\n      printerComm.webrtcConnections.forEach((webrtc) => {\n        if (webrtc) webrtc.close();\n      });\n      this.printerCommMap.delete(printerId)\n    }\n  }\n\n  closeAllConnections() {\n    this.printerCommMap.forEach((_, token) => this.closeConnection(token))\n  }\n}\n\nexport const printerCommManager = new PrinterCommManager()\nObject.freeze(printerCommManager)\n\nexport default function PrinterComm(printerId, wsUri, callbacks) {\n  const self = { printerId, wsUri, ...callbacks }\n\n  self.ws = null\n  self.webrtcConnections = new Map(); // key: webcamName. Null if it's data channel-only WebRTC\n  self.passthruQueue = new Map()\n\n  ifvisible.on('blur', function () {\n    self.closeWebSocket()\n  })\n\n  ifvisible.on('focus', function () {\n    self.connect()\n  })\n\n  self.onPassThruReceived = function (msg) {\n    const refId = msg.ref\n    if (refId && self.passthruQueue.get(refId)) {\n      const callback = self.passthruQueue.get(refId)\n      self.passthruQueue.delete(refId)\n      callback(msg.error, msg.ret)\n    } else if ('terminal_feed' in msg) {\n      self.onTerminalFeedReceived && self.onTerminalFeedReceived(msg.terminal_feed)\n    } else if ('printer_event' in msg) {\n      const printerEvent = msg.printer_event\n      Vue.swal.Toast.fire({\n        icon: printerEvent.event_class.toLowerCase(),\n        title: printerEvent.event_title,\n        html: printerEvent.event_text,\n      }).then((result) => {\n        if (result.isDismissed && result.dismiss === 'close') {\n          // SWAL returns 'close' as the reason when user clicks on the toast\n          window.location.href = '/printer_events/'\n        }\n      })\n    }\n  }\n\n  self.connect = function (onOpenCallback = null) {\n    if (self.ws && self.ws.readyState === WebSocket.OPEN) {\n      onOpenCallback && onOpenCallback()\n      return\n    }\n\n    self.ws = new WebSocket(\n      window.location.protocol.replace('http', 'ws') + '//' + window.location.host + self.wsUri\n    )\n    self.ws.onmessage = function (e) {\n      let msg = {}\n      try {\n        msg = JSON.parse(e.data)\n      } catch (error) {\n        console.log(e.data)\n        throw error\n      }\n      if ('passthru' in msg) {\n        self.onPassThruReceived(msg.passthru)\n      } else {\n        self.onPrinterUpdateReceived && self.onPrinterUpdateReceived(msg)\n      }\n    }\n\n    if (onOpenCallback) {\n      self.ws.onopen = onOpenCallback\n    }\n\n    self.ensureWebsocketClosed()\n    setTimeout(function () {\n      self.heartbeat()\n    }, 30 * 1000)\n  }\n\n  self.setWebRTCConnection = function(webcamName, webrtc) {\n    if (self.webrtcConnections.has(webcamName)) {\n      console.log(`WARNING: Existing WebRTC connection for ${webcamName} in printerComm. Closing it.`);\n      self.webrtcConnections.get(webcamName).close();\n    }\n\n    self.webrtcConnections.set(webcamName, webrtc);\n\n    function parseJsonData(jsonData) {\n      let msg = {}\n      try {\n        msg = JSON.parse(jsonData)\n      } catch (error) {\n        // Any garbage sent to the Janus UDP port will be forwarded here.\n        return\n      }\n\n      if (msg && 'ref' in msg && 'ret' in msg) {\n        self.onPassThruReceived(msg)\n        return\n      }\n\n      self.onStatusReceived && self.onStatusReceived(msg)\n    }\n\n\n    const callbacksFuncs = {\n      onDestroy: () => {\n        if (self.webrtcConnections.get(webcamName) === webrtc) {  // only remove if it's the same object\n          self.webrtcConnections.delete(webcamName);\n        }\n      },\n    };\n\n    if (webcamName === null) { // data channel-only WebRTC\n      callbacksFuncs.onData = function (maybeBin) {\n        if (typeof maybeBin === 'string' || maybeBin instanceof String) {\n          parseJsonData(maybeBin)\n        } else {\n          toArrayBuffer(maybeBin, (arrayBuffer) => {\n            parseJsonData(pako.ungzip(new Uint8Array(arrayBuffer), { to: 'string' }))\n          })\n        }\n      }\n    }\n\n    self.webrtcConnections.get(webcamName).setCallbacks(callbacksFuncs);\n  };\n\n  self.passThruToPrinter = function (msg, callback) {\n    if (self.canSend()) {\n      var refId = Math.random().toString()\n      assign(msg, { ref: refId })\n      if (callback) {\n        self.passthruQueue.set(refId, callback)\n        setTimeout(function () {\n          if (self.passthruQueue.has(refId)) {\n            clearPrinterTransientState(self.printerId)\n            Vue.swal.Toast.fire({\n              icon: 'error',\n              title: `${i18n.t('Failed to contact printer. Is it powered on and connected to Internet?')}`,\n            })\n          }\n        }, 60 * 1000)\n      }\n\n      const dataChannelWebrtc = self.webrtcConnections.get(null); // key == null -> data channel-only WebRTC\n      if (dataChannelWebrtc) {\n        dataChannelWebrtc.sendData(JSON.stringify(msg))\n      }\n\n      self.ws.send(JSON.stringify({ passthru: msg }))\n    } else {\n      if (callback) {\n        clearPrinterTransientState(self.printerId)\n        callback('Message not passed through. No suitable WebSocket.')\n      }\n    }\n  }\n\n  // Helper methods\n\n  self.ensureWebsocketClosed = function () {\n    self.ws.onclose = function (ev) {\n      if (self.ws === ev.target) {\n        self.ws = null\n      }\n    }\n    self.ws.onerror = function () {\n      if (self.ws) {\n        self.ws.close()\n      }\n    }\n  }\n\n  self.closeWebSocket = function () {\n    if (self.ws) {\n      self.ws.close()\n    }\n  }\n\n  // Heartbeat to maintain the presence of connection\n  // Adapted from https://stackoverflow.com/questions/50876766/how-to-implement-ping-pong-request-for-websocket-connection-alive-in-javascript\n\n  self.heartbeat = function () {\n    if (!self.canSend()) {\n      return\n    }\n    self.ws.send(JSON.stringify({}))\n    setTimeout(function () {\n      self.heartbeat()\n    }, 30 * 1000)\n  }\n\n  self.canSend = function () {\n    return self.ws && self.ws.readyState === 1\n  }\n\n  return self\n}\n","import { toMomentOrNull } from '@src/lib/normalizers'\nimport filesize from 'filesize'\nimport _ from 'lodash'\n\nexport function listPrinterLocalGCodesOctoPrint(printerComm, path, searchKeyword) {\n  const listRecoursively = (fileObj) => {\n    const fileList = []\n    for (const item of Object.values(fileObj)) {\n      if (item.children) {\n        fileList.push(...listRecoursively(item.children))\n      } else {\n        fileList.push(item)\n      }\n    }\n    return fileList\n  }\n\n  return new Promise((resolve, reject) => {\n    let kwargs\n    if (searchKeyword) {\n      // In OctoPrint we can do global search for better user experience. Hence path is ignored\n      kwargs = { filter: String(searchKeyword), recursive: true }\n    } else {\n      kwargs = { path: path, recursive: false, level: 1 } // Return 1 level children so that we can do item count\n    }\n\n    printerComm.passThruToPrinter(\n      {\n        func: 'list_files',\n        target: '_file_manager',\n        kwargs,\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        }\n\n        let folders = []\n        let files = []\n\n        if (!ret?.local || !Object.keys(ret.local).length) {\n          resolve()\n          return\n        }\n\n        // ObicoUpload is used to cache Obico Cloud files and should be hidden from the users\n        delete ret.local.ObicoUpload\n\n        const items = searchKeyword ? listRecoursively(ret.local) : Object.values(ret.local)\n        for (const item of items) {\n          if (item.type === 'folder') {\n            folders.push({\n              id: item.path,\n              path: item.path,\n              name: item.display,\n              numItems: Object.keys(item.children).length,\n            })\n          } else {\n            files.push({\n              ...item,\n              id: item.path,\n              filename: item.name,\n              num_bytes: item.size,\n              filesize: filesize(item.size),\n              created_at: toMomentOrNull(new Date(item.date * 1000)),\n              getBigThumbnailUrl: () => null,\n              getSmallThumbnailUrl: () => null,\n            })\n          }\n        }\n        resolve({ folders, files })\n      }\n    )\n  })\n}\n\nexport function listPrinterLocalGCodesMoonraker(printerComm, path, searchKeyword) {\n  return new Promise((resolve, reject) => {\n    const pathPrefix = path == null ? '' : `${path}/`\n    printerComm.passThruToPrinter(\n      {\n        target: 'moonraker_api',\n        func: 'server/files/directory',\n        kwargs: {\n          path: `gcodes/${path ? path : ''}`,\n          extended: true,\n        },\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        }\n        // subdirs should be ignored when user is searching\n        const dirsInServerFormat = searchKeyword\n          ? []\n          : _.map(\n              _.filter(\n                _.get(ret, 'dirs', []),\n                (d) => !d.dirname.startsWith('.') && !d.dirname.startsWith('Obico_Upload')\n              ),\n              (d) => {\n                const path = `${pathPrefix}${d.dirname}`\n                return {\n                  name: d.dirname,\n                  id: path,\n                  path,\n                  created_at: toMomentOrNull(new Date(d.modified * 1000)),\n                  children: [], // To signify this is a folder, not a file\n                }\n              }\n            )\n\n        const filesInServerFormat = _.map(\n          _.filter(\n            _.get(ret, 'files', []),\n            (f) =>\n              !f.filename.startsWith('.') &&\n              (!searchKeyword || f.filename.toLowerCase().includes(searchKeyword.toLowerCase()))\n          ),\n          (f) => {\n            return {\n              ...f,\n              num_bytes: f.size,\n              filesize: filesize(f.size),\n              created_at: toMomentOrNull(new Date(f.modified * 1000)),\n              path: `${pathPrefix}${f.filename}`,\n              getBigThumbnailUrl: () => null,\n              getSmallThumbnailUrl: () => null,\n            }\n          }\n        )\n        resolve({ folders: dirsInServerFormat, files: filesInServerFormat })\n      }\n    )\n  })\n}\n\nexport function printPrinterLocalGCodeOctoPrint(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    const path = gcode.path\n    printerComm.passThruToPrinter(\n      {\n        func: 'select_file',\n        target: '_printer',\n        args: [`${path}`, null],\n        kwargs: { printAfterSelect: 'true' },\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport function printPrinterLocalGCodeMoonraker(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    const path = gcode.path\n    printerComm.passThruToPrinter(\n      {\n        target: 'moonraker_api',\n        func: 'printer/print/start',\n        kwargs: {\n          verb: 'post',\n          filename: path,\n        },\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport function repeatPrinterLocalGCode(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        target: 'file_operations',\n        func: 'start_printer_local_print',\n        args: [gcode],\n      },\n      (err, ret) => {\n        if (err || ret?.error) {\n          reject(err || ret?.error)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport function getMoonrakerWebcams(printerComm) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        func: `server/webcams/list`,\n        target: 'moonraker_api',\n      },\n      (err, ret) => {\n        if (err || ret?.error) {\n          reject(err || ret?.error)\n        } else {\n          resolve(ret?.webcams)\n        }\n      }\n    )\n  })\n}\n\nexport function requestSnapshot(printerComm, url) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        func: `web_snapshot_request`,\n        target: 'jpeg_poster',\n        args: [url],\n      },\n      (err, ret) => {\n        if (err || ret?.error) {\n          reject(err || ret?.error)\n        } else {\n          resolve(ret.pic)\n        }\n      }\n    )\n  })\n}\n","import Vue from 'vue'\nimport axios from 'axios'\nimport get from 'lodash/get'\nimport { clearPrinterTransientState } from '@src/lib/printer-transient-state'\n\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport {\n  printPrinterLocalGCodeOctoPrint,\n  printPrinterLocalGCodeMoonraker,\n} from '@src/lib/printer-local-comm'\nimport urls from '@config/server-urls'\nimport { repeatPrinterLocalGCode } from '../../lib/printer-local-comm'\nimport i18n from \"@src/i18n/i18n.js\"\n\nexport const confirmPrint = (gcode, printer) => {\n  return new Promise((resolve, reject) => {\n    Vue.swal\n      .fire({\n        html: `<h5 style=\"text-align: center; line-height: 1.5;\">${i18n.t(\"Print\")} \"${gcode.filename}\" on <b>${printer.name}</b>?</h5>`,\n        imageUrl: gcode.getBigThumbnailUrl && gcode.getBigThumbnailUrl(),\n        showCancelButton: true,\n        confirmButtonText: `${i18n.t('Print!')}`,\n        cancelButtonText: `${i18n.t('Cancel')}`,\n        reverseButtons: true,\n      })\n      .then((result) => {\n        if (result.value) {\n          resolve()\n        }\n      })\n  })\n}\n\nexport function printCloudGCode(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        func: 'download',\n        target: 'file_downloader',\n        args: [\n          {\n            id: gcode.id,\n            url: gcode.url,\n            filename: gcode.filename,\n            safe_filename: gcode.safe_filename,\n          },\n        ],\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport const sendToPrint = (args) => {\n  const { printer, gcode, isCloud, Swal, onCommandSent, onPrinterStatusChanged } = args\n\n  const printerId = printer.id\n  const isAgentMoonraker = printer.isAgentMoonraker()\n\n  const printerComm = printerCommManager.getOrCreatePrinterComm(\n    printerId,\n    urls.printerWebSocket(printerId)\n  )\n\n  printerComm.connect(() => {\n    const printGCode = isCloud\n      ? printCloudGCode\n      : !gcode.path\n      ? repeatPrinterLocalGCode\n      : isAgentMoonraker\n      ? printPrinterLocalGCodeMoonraker\n      : printPrinterLocalGCodeOctoPrint\n\n    printer.setTransientState(isCloud ? 'G-Code Downloading' : 'Starting')\n    printGCode(printerComm, gcode).catch((err) => {\n      clearPrinterTransientState(printerId)\n      Swal.Toast.fire({\n        icon: 'error',\n        title: err,\n      })\n    })\n  })\n\n  onCommandSent && onCommandSent()\n\n  const checkPrinterStatus = async () => {\n    let printer\n    try {\n      printer = await axios.get(urls.printer(printerId))\n      printer = printer.data\n    } catch (e) {\n      console.error(e)\n      return\n    }\n\n    if (\n      get(printer, 'status.state.text') === 'Operational' ||\n      get(printer, 'status.state.text') === 'G-Code Downloading' ||\n      get(printer, 'status.state.text') === 'Downloading G-Code' // Backward compatibility with OctoPrint-Obico 2.3.7 - 2.3.9\n    ) {\n      setTimeout(checkPrinterStatus, 1000)\n    } else {\n      onPrinterStatusChanged && onPrinterStatusChanged()\n    }\n  }\n\n  checkPrinterStatus()\n}\n\nconst REDIRECT_TIMER = 3000\nexport const showRedirectModal = (Swal, onClose, printerId) => {\n  let timerInterval\n  Swal.Prompt.fire({\n    html: `\n      <div class=\"text-center\">\n        <h5 class=\"py-3\">\n          ${i18n.t(\"You'll be redirected to printers page in\")} <strong>${Math.round(\n            REDIRECT_TIMER / 1000\n          )}</strong> ${i18n.t(\"seconds\")}\n        </h5>\n      </div>\n    `,\n    timer: REDIRECT_TIMER,\n    showConfirmButton: true,\n    showCancelButton: true,\n    confirmButtonText: 'Redirect now',\n    onOpen: () => {\n      timerInterval = setInterval(() => {\n        const htmlContainer = Swal.getHtmlContainer()\n        const timerElement = htmlContainer?.querySelector('strong')\n        if (!htmlContainer || !timerElement) return\n        timerElement.textContent = (Swal.getTimerLeft() / 1000).toFixed(0)\n      }, 1000)\n    },\n    onClose: () => {\n      clearInterval(timerInterval)\n      timerInterval = null\n    },\n  }).then((result) => {\n    if (result.isConfirmed || result.dismiss === 'timer') {\n      window.location.assign(`/printers/${printerId}/control/`)\n    } else {\n      onClose && onClose()\n    }\n  })\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-container file\"},[_c('div',{staticClass:\"file-header\",class:{\n      'mb-4': _vm.showDetails && _vm.fileDetailsToShow.length > 0,\n      compact: _vm.compactView,\n    }},[(_vm.showThumbnail)?_c('div',[(_vm.bigThumbnailUrl)?_c('div',{staticClass:\"thumbnail\"},[_c('img',{attrs:{\"src\":_vm.bigThumbnailUrl}})]):_c('div',{staticClass:\"thumbnail-placeholder\"},[_c('span',{staticClass:\"help\"},[_c('help-widget',{attrs:{\"id\":\"thumbnail-setup-guide\",\"highlight\":false,\"show-close-button\":false}})],1),_c('svg',[_c('use',{attrs:{\"href\":\"#svg-no-photo\"}})])])]):_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-file-code\"})]),_c('div',{staticClass:\"info truncated-wrapper\"},[_c('div',{staticClass:\"title truncated\",attrs:{\"title\":_vm.file.filename}},[_vm._v(\" \"+_vm._s(_vm.file.filename)+\" \")]),(_vm.file.filesize || _vm.file.deleted)?_c('div',{staticClass:\"subtitle text-secondary truncated-wrapper\"},[(_vm.file.deleted)?_c('div',{staticClass:\"truncated\"},[_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.$t(\"Deleted\")))])]):_c('div',{staticClass:\"truncated\"},[_c('span',[_vm._v(_vm._s(_vm.file.filesize))])])]):_vm._e()]),(_vm.showOpenButton && _vm.file.id)?_c('div',{staticClass:\"action\"},[_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":_vm.openButtonVariant,\"href\":`/g_code_files/cloud/${_vm.file.id}/`}},[_vm._v(\" \"+_vm._s(_vm.openButtonText)+\" \")])],1):_vm._e()]),(_vm.showDetails)?[_vm._l((_vm.fileDetailsToShow.slice(0, _vm.numberOfVisibleLines)),function(item){return _c('div',{key:item.name},[_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[(item.faIcon)?_c('i',{class:item.faIcon}):(item.svgIcon)?_c('svg',{attrs:{\"width\":\"16\",\"height\":\"16\"}},[_c('use',{attrs:{\"href\":`#${item.svgIcon}`}})]):_vm._e()]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(item.title))])]),_c('div',{staticClass:\"value\"},[_c('span',{domProps:{\"innerHTML\":_vm._s(item.value)}})])])])}),(_vm.shouldShowDataNotice && _vm.fileDetailsToShow.length <= _vm.numberOfVisibleLines)?_c('muted-alert',{staticClass:\"mt-2 mb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\"))+\" \")]):_vm._e(),(_vm.fileDetailsToShow.length > _vm.numberOfVisibleLines)?_c('collapsable-details',[_vm._l((_vm.fileDetailsToShow.slice(_vm.numberOfVisibleLines)),function(item){return _c('div',{key:item.name},[_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[(item.faIcon)?_c('i',{class:item.faIcon}):(item.svgIcon)?_c('svg',{attrs:{\"width\":\"16\",\"height\":\"16\"}},[_c('use',{attrs:{\"href\":`#${item.svgIcon}`}})]):_vm._e()]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(item.title))])]),_c('div',{staticClass:\"value\"},[_c('span',{domProps:{\"innerHTML\":_vm._s(item.value)}})])])])}),(_vm.shouldShowDataNotice && _vm.fileDetailsToShow.length > _vm.numberOfVisibleLines)?_c('muted-alert',{staticClass:\"mt-2 mb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\"))+\" \")]):_vm._e()],2):_vm._e()]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('b-collapse',{model:{value:(_vm.expanded),callback:function ($$v) {_vm.expanded=$$v},expression:\"expanded\"}},[_vm._t(\"default\")],2),_c('button',{staticClass:\"collapse-toggle\",class:_vm.expanded ? 'opened' : 'closed',on:{\"click\":function($event){_vm.expanded = !_vm.expanded}}},[(_vm.expanded)?_c('span',[_vm._v(_vm._s(_vm.$t(\"Show less\")))]):_c('span',[_vm._v(_vm._s(_vm.$t(\"Show more\")))]),_c('font-awesome-icon',{class:{ rotated: _vm.expanded },attrs:{\"icon\":['fas', 'chevron-down']}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <!-- Content -->\n    <b-collapse v-model=\"expanded\">\n      <slot></slot>\n    </b-collapse>\n\n    <!-- Toggle -->\n    <button\n      class=\"collapse-toggle\"\n      :class=\"expanded ? 'opened' : 'closed'\"\n      @click=\"expanded = !expanded\"\n    >\n      <span v-if=\"expanded\">{{ $t(\"Show less\") }}</span>\n      <span v-else>{{ $t(\"Show more\") }}</span>\n      <font-awesome-icon :icon=\"['fas', 'chevron-down']\" :class=\"{ rotated: expanded }\" />\n    </button>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'CollapsableDetails',\n\n  data() {\n    return {\n      expanded: false,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.collapse-toggle\n  width: 100%\n  font-weight: bold\n  display: flex\n  align-items: center\n  justify-content: center\n  gap: .5rem\n  background: none\n  border: none\n  color: var(--color-text-primary)\n  margin-top: .5rem\n  svg\n    transition: all .3s ease-in-out\n    &.rotated\n      transform: rotate(180deg)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CollapsableDetails.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CollapsableDetails.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CollapsableDetails.vue?vue&type=template&id=48fdd412&scoped=true&\"\nimport script from \"./CollapsableDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./CollapsableDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CollapsableDetails.vue?vue&type=style&index=0&id=48fdd412&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"48fdd412\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"card-container file\">\n    <div\n      class=\"file-header\"\n      :class=\"{\n        'mb-4': showDetails && fileDetailsToShow.length > 0,\n        compact: compactView,\n      }\"\n    >\n      <div v-if=\"showThumbnail\">\n        <div v-if=\"bigThumbnailUrl\" class=\"thumbnail\">\n          <img :src=\"bigThumbnailUrl\" />\n        </div>\n        <div v-else class=\"thumbnail-placeholder\">\n          <span class=\"help\">\n            <help-widget id=\"thumbnail-setup-guide\" :highlight=\"false\" :show-close-button=\"false\" />\n          </span>\n          <svg>\n            <use href=\"#svg-no-photo\" />\n          </svg>\n        </div>\n      </div>\n      <div v-else class=\"icon\">\n        <i class=\"fas fa-file-code\"></i>\n      </div>\n      <div class=\"info truncated-wrapper\">\n        <div class=\"title truncated\" :title=\"file.filename\">\n          {{ file.filename }}\n        </div>\n        <div v-if=\"file.filesize || file.deleted\" class=\"subtitle text-secondary truncated-wrapper\">\n          <div v-if=\"file.deleted\" class=\"truncated\">\n            <span class=\"text-danger\">{{$t(\"Deleted\")}}</span>\n          </div>\n          <div v-else class=\"truncated\">\n            <span>{{ file.filesize }}</span>\n          </div>\n        </div>\n      </div>\n      <div v-if=\"showOpenButton && file.id\" class=\"action\">\n        <b-button\n          :variant=\"openButtonVariant\"\n          class=\"custom-button\"\n          :href=\"`/g_code_files/cloud/${file.id}/`\"\n        >\n          {{ openButtonText }}\n        </b-button>\n      </div>\n    </div>\n    <template v-if=\"showDetails\">\n      <!-- First visible lines -->\n      <div v-for=\"item in fileDetailsToShow.slice(0, numberOfVisibleLines)\" :key=\"item.name\">\n        <div class=\"line\">\n          <div class=\"label\">\n            <div class=\"icon\">\n              <i v-if=\"item.faIcon\" :class=\"item.faIcon\"></i>\n              <svg v-else-if=\"item.svgIcon\" width=\"16\" height=\"16\">\n                <use :href=\"`#${item.svgIcon}`\" />\n              </svg>\n            </div>\n            <div class=\"title\">{{ item.title }}</div>\n          </div>\n          <div class=\"value\">\n            <!-- eslint-disable-next-line vue/no-v-html -->\n            <span v-html=\"item.value\"></span>\n          </div>\n        </div>\n      </div>\n      <muted-alert\n        v-if=\"shouldShowDataNotice && fileDetailsToShow.length <= numberOfVisibleLines\"\n        class=\"mt-2 mb-1\"\n      >\n        {{$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\")}}\n      </muted-alert>\n\n      <!-- Hidden lines -->\n      <collapsable-details v-if=\"fileDetailsToShow.length > numberOfVisibleLines\">\n        <div v-for=\"item in fileDetailsToShow.slice(numberOfVisibleLines)\" :key=\"item.name\">\n          <div class=\"line\">\n            <div class=\"label\">\n              <div class=\"icon\">\n                <i v-if=\"item.faIcon\" :class=\"item.faIcon\"></i>\n                <svg v-else-if=\"item.svgIcon\" width=\"16\" height=\"16\">\n                  <use :href=\"`#${item.svgIcon}`\" />\n                </svg>\n              </div>\n              <div class=\"title\">{{ item.title }}</div>\n            </div>\n            <div class=\"value\">\n              <!-- eslint-disable-next-line vue/no-v-html -->\n              <span v-html=\"item.value\"></span>\n            </div>\n          </div>\n        </div>\n        <muted-alert\n          v-if=\"shouldShowDataNotice && fileDetailsToShow.length > numberOfVisibleLines\"\n          class=\"mt-2 mb-1\"\n        >\n          {{$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\")}}\n        </muted-alert>\n      </collapsable-details>\n    </template>\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport { gcodeMetadata } from '@src/components/g-codes/gcode-metadata'\nimport CollapsableDetails from '@src/components/CollapsableDetails.vue'\n\nexport default {\n  name: 'GCodeDetails',\n\n  components: {\n    MutedAlert,\n    HelpWidget,\n    CollapsableDetails,\n  },\n\n  props: {\n    file: {\n      type: Object,\n      required: true,\n    },\n    showPrintStats: {\n      type: Boolean,\n      default: false,\n    },\n    showDetails: {\n      type: Boolean,\n      default: true,\n    },\n    showOpenButton: {\n      type: Boolean,\n      default: false,\n    },\n    compactView: {\n      type: Boolean,\n      default: true,\n    },\n    openButtonVariant: {\n      type: String,\n      default: 'outline-secondary',\n    },\n    openButtonText: {\n      type: String,\n      default: 'Open File',\n    },\n  },\n\n  data() {\n    return {\n      numberOfVisibleLines: 3,\n    }\n  },\n\n  computed: {\n    bigThumbnailUrl() {\n      return this.file.getBigThumbnailUrl && this.file.getBigThumbnailUrl()\n    },\n    showThumbnail() {\n      return !this.compactView || this.bigThumbnailUrl\n    },\n    fileDetailsToShow() {\n      let result = []\n      if (!this.file.deleted && this.file.metadata) {\n        result = gcodeMetadata\n          .filter((item) => this.file.metadata[item.name])\n          .map((item) => {\n            return {\n              ...item,\n              value: item.formatter(this.file.metadata[item.name]),\n            }\n          })\n      }\n      if (this.showPrintStats) {\n        result.unshift({\n          name: 'total_prints',\n          faIcon: 'fas fa-hashtag',\n          title: `${this.$i18next.t('Total prints')}`,\n          value: `\n            ${this.file.totalPrints || 0}\n            (<span class=\"text-success\">${this.file.successPrints || 0}</span> /\n            <span class=\"text-danger\">${this.file.failedPrints || 0}</span>)\n          `,\n        })\n      }\n      if (this.file.created_at) {\n        result.unshift({\n          name: 'created_at',\n          faIcon: 'fas fa-calendar-alt',\n          title: `${this.$i18next.t('Uploaded')}`,\n          value: this.file.created_at.fromNow(),\n        })\n      }\n      return result\n    },\n    shouldShowDataNotice() {\n      return (\n        !this.file.analysis &&\n        Object.keys(this.file.metadata || {}).length !== 0 &&\n        !this.file.deleted\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.file\n  display: flex\n  flex-direction: column\n\n.file-header\n  display: flex\n  align-items: center\n  gap: 1rem\n  .info\n    flex: 1\n  .icon\n    flex: 0 0 2rem\n    text-align: center\n    *\n      font-size: 2rem\n  .thumbnail, .thumbnail-placeholder\n    width: 100px\n    height: 100px\n    border-radius: var(--border-radius-md)\n    background-color: var(--color-surface-primary)\n    display: flex\n    align-items: center\n    justify-content: center\n    overflow: hidden\n    img\n      height: 100%\n      width: auto\n      border-radius: 8px\n  .title\n    font-weight: bold\n    font-size: 1.25rem\n  .thumbnail-placeholder\n    position: relative\n    overflow: visible\n    svg\n      width: 3rem\n      height: 3rem\n      color: var(--color-background)\n    .help\n      position: absolute\n      top: 4px\n      right: 8px\n\n  &.compact\n    gap: .7rem\n    .thumbnail\n      width: 52px\n      height: 52px\n    .title\n      font-size: 1rem\n\n.line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  border-top: 1px solid var(--color-divider-muted)\n  gap: .5rem\n\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      opacity: .5\n      width: 1rem\n      text-align: center\n\n  .value\n    font-weight: bold\n    text-align: right\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeDetails.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeDetails.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeDetails.vue?vue&type=template&id=cccd6f4e&scoped=true&\"\nimport script from \"./GCodeDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeDetails.vue?vue&type=style&index=0&id=cccd6f4e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"cccd6f4e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('b-row',[_c('h4',{staticClass:\"mb-4 report-title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Report\")))])]),_c('b-row',[_c('b-col',{attrs:{\"lg\":\"7\"}},[_c('div',{staticClass:\"file-block mb-3\"},[_c('div',{staticClass:\"file-header compact\",class:{compact: _vm.compactView}},[(_vm.showIconThumbnail)?_c('div',[(_vm.bigThumbnailUrl)?_c('div',{staticClass:\"thumbnail\"},[_c('img',{attrs:{\"src\":_vm.bigThumbnailUrl}})]):_c('div',{staticClass:\"thumbnail-placeholder\"},[_c('span',{staticClass:\"help\"},[_c('help-widget',{attrs:{\"id\":\"thumbnail-setup-guide\",\"highlight\":false,\"show-close-button\":false}})],1),_c('svg',[_c('use',{attrs:{\"href\":\"#svg-no-photo\"}})])])]):_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-file-code\"})]),_c('div',{staticClass:\"info truncated-wrapper\"},[_c('div',{staticClass:\"truncated\",attrs:{\"title\":_vm.file.filename}},[_vm._v(\" \"+_vm._s(_vm.file.filename)+\" \")]),(_vm.file.filesize || _vm.file.deleted)?_c('div',{staticClass:\"subtitle text-secondary truncated-wrapper\"},[(_vm.file.deleted)?_c('div',{staticClass:\"truncated\"},[_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.$t(\"Deleted\")))])]):_c('div',{staticClass:\"truncated\"},[_c('span',[_vm._v(_vm._s(_vm.file.filesize)+\", \"+_vm._s(_vm.$t(\"uploaded\"))+\" \"+_vm._s(_vm.fileUploadedTime))])])]):_vm._e()]),_c('div',{staticClass:\"button\"},[(_vm.showOpenButton && _vm.file.id)?_c('b-button',{attrs:{\"href\":`/g_code_files/cloud/${_vm.file.id}/`}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Open File\"))+\" \")]):_vm._e()],1)]),_c('div',{staticClass:\"first-layer-report-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',[_vm._v(_vm._s(_vm.$t(\"First Layer Grade\")))])]),_c('div',{staticClass:\"value\"},[_c('div',{class:_vm.gradeResult.gradeAccent},[_vm._v(\" \"+_vm._s(_vm.gradeResult.gradeTitle || ' ')+\" \")])])]),_c('div',{staticClass:\"first-layer-report-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',[_vm._v(_vm._s(_vm.$t(\"First Layer Print Time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.firstLayerPrintTime))])])]),_c('div',{staticClass:\"notes-block mb-3\"},[_c('b-row',[_c('span',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Notes\")))])]),_c('hr'),_c('b-row',[_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"You're first layer score is\"))+\": \"),_c('span',{staticClass:\"font-bold\",class:_vm.gradeResult.gradeAccent},[_vm._v(_vm._s(_vm.gradeResult.grade))]),_c('br'),_vm._v(\" \"+_vm._s(_vm.gradeResult.gradeRemarks)+\" \")])])]),(!_vm.isGradeA)?_c('hr'):_vm._e(),_c('b-row',[(!_vm.isGradeA)?_c('div',{staticClass:\"info\"},[_c('p',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Grade {localizedDom} usually means one of the following`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('span',{class:_vm.gradeResult.gradeAccent},[_vm._v(_vm._s(_vm.gradeResult.grade))])]},proxy:true}],null,false,3047815858)})],1),_c('ul',_vm._l((_vm.gradeResult.gradeSuggestion),function(suggestion,index){return _c('li',{key:index,domProps:{\"innerHTML\":_vm._s(suggestion)}})}),0)]):_vm._e()])],1)]),_c('b-col',{staticClass:\"heatmap-column\",attrs:{\"lg\":\"5\"}},[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-tabs',{attrs:{\"pills\":\"\",\"card\":\"\"}},[_c('b-tab',{attrs:{\"title\":_vm.$t('AI Time-Lapse')}},[_c('b-card-text',[_c('div',{staticClass:\"first-layer-modal-video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.firstLayerInspection.tagged_video_url,\"poster-url\":_vm.aiTimeLapsePosterImageUrl,\"fluid\":false,\"fullscreen-btn\":false,\"download-btn\":true,\"default-full-screen-toggle\":true},on:{\"download\":() => _vm.downloadFile(_vm.firstLayerInspection.tagged_video_url, `${_vm.print.id}_tagged_video_inspection.mp4`)}})],1)])],1),_c('b-tab',{attrs:{\"title\":_vm.$t('Original Time-Lapse')}},[_c('b-card-text',[_c('div',{staticClass:\"first-layer-modal-video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.firstLayerInspection.video_url,\"poster-url\":_vm.firstLayerInspection.images.length ? _vm.firstLayerInspection.images[0].image_url : null,\"fluid\":false,\"fullscreen-btn\":false,\"download-btn\":true,\"default-full-screen-toggle\":true},on:{\"download\":() => _vm.downloadFile(_vm.firstLayerInspection.video_url, `${_vm.print.id}_video_inspection.mp4`)}})],1)])],1)],1)],1)],1)],1),_c('b-row',{staticClass:\"buttons-row\"},[_c('b-col',{attrs:{\"cols\":\"12\",\"lg\":\"7\"}},[_c('a',{staticClass:\"feedback-button\",attrs:{\"href\":`/first_layer_inspection_images/?print_id=${_vm.print.id}`}},[_vm._v(_vm._s(_vm.$t(\"Give Feedback About This Report\")))])])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"p-2\">\n      <b-row>\n        <h4 class=\"mb-4 report-title\">{{ $t(\"First Layer Report\") }}</h4>\n      </b-row>\n      <b-row>\n        <b-col lg=\"7\">\n          <!-- File Block Start -->\n          <div class=\"file-block mb-3\">\n            <!-- File Block 1st row -->\n            <div\n              class=\"file-header compact\"\n              :class=\"{compact: compactView}\"\n            >\n              <div v-if=\"showIconThumbnail\">\n                <div v-if=\"bigThumbnailUrl\" class=\"thumbnail\">\n                  <img :src=\"bigThumbnailUrl\" />\n                </div>\n                <div v-else class=\"thumbnail-placeholder\">\n                  <span class=\"help\">\n                    <help-widget id=\"thumbnail-setup-guide\" :highlight=\"false\" :show-close-button=\"false\" />\n                  </span>\n                  <svg>\n                    <use href=\"#svg-no-photo\" />\n                  </svg>\n                </div>\n              </div>\n              <div v-else class=\"icon\">\n                <i class=\"fas fa-file-code\"></i>\n              </div>\n              <div class=\"info truncated-wrapper\">\n                <div class=\"truncated\" :title=\"file.filename\">\n                  {{ file.filename }}\n                </div>\n                <div v-if=\"file.filesize || file.deleted\" class=\"subtitle text-secondary truncated-wrapper\">\n                  <div v-if=\"file.deleted\" class=\"truncated\">\n                    <span class=\"text-danger\">{{ $t(\"Deleted\") }}</span>\n                  </div>\n                  <div v-else class=\"truncated\">\n                    <span>{{ file.filesize }}, {{$t(\"uploaded\")}} {{ fileUploadedTime }}</span>\n                  </div>\n                </div>\n              </div>\n              <div class=\"button\">\n                  <b-button\n                    :href=\"`/g_code_files/cloud/${file.id}/`\"\n                    v-if=\"showOpenButton && file.id\"\n                  >\n                    {{$t(\"Open File\")}}\n                  </b-button>\n                </div>\n            </div>\n            <!-- File Block 2nd row -->\n            <div class=\"first-layer-report-info-line\">\n              <div class=\"label\">\n                <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                <div>{{ $t(\"First Layer Grade\") }}</div>\n              </div>\n              <div class=\"value\">\n                <div :class=\"gradeResult.gradeAccent\">\n                  {{ gradeResult.gradeTitle || '&nbsp;' }}\n                </div>\n              </div>\n            </div>\n            <!-- File Block 3rd row -->\n            <div class=\"first-layer-report-info-line\">\n              <div class=\"label\">\n                <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                <div>{{ $t(\"First Layer Print Time\") }}</div>\n              </div>\n              <div class=\"value\">{{ firstLayerPrintTime }}</div>\n            </div>\n          </div>\n\n          <!-- File Block End -->\n          <!-- Notes Block Start -->\n          <div class=\"notes-block mb-3\">\n            <!-- Notes Block 1st row -->\n            <b-row>\n              <span class=\"title\">{{ $t(\"First Layer Notes\") }}</span>\n            </b-row>\n            <hr />\n            <!-- File Block 2nd row -->\n            <b-row>\n              <div class=\"description\">\n                <p>\n                  {{ $t(\"You're first layer score is\") }}:\n                   <span class=\"font-bold\" :class=\"gradeResult.gradeAccent\">{{ gradeResult.grade }}</span><br>\n                  {{ gradeResult.gradeRemarks }}\n                </p>\n              </div>\n            </b-row>\n            <hr v-if=\"!isGradeA\" />\n            <!-- File Block 3rd row -->\n            <b-row>\n              <div v-if=\"!isGradeA\" class=\"info\">\n                <p>\n                  <i18next :translation=\"$t(`Grade {localizedDom} usually means one of the following`)\">\n                    <template #localizedDom>\n                      <span :class=\"gradeResult.gradeAccent\">{{gradeResult.grade}}</span>\n                    </template>\n                  </i18next>\n                </p>\n                <ul>\n                  <li v-for=\"(suggestion, index) in gradeResult.gradeSuggestion\" :key=\"index\" v-html=\"suggestion\"></li>\n                </ul>\n              </div>\n            </b-row>\n          </div>\n        </b-col>\n        <!-- Map Section -->\n        <b-col lg=\"5\" class=\"heatmap-column\">\n          <b-card no-body>\n            <b-tabs pills card>\n              <b-tab :title=\"$t('AI Time-Lapse')\">\n                <b-card-text>\n                  <div class=\"first-layer-modal-video-wrapper\">\n                    <video-box\n                      :video-url=\"firstLayerInspection.tagged_video_url\"\n                      :poster-url=\"aiTimeLapsePosterImageUrl\"\n                      :fluid=\"false\"\n                      :fullscreen-btn=\"false\"\n                      :download-btn=\"true\"\n                      :default-full-screen-toggle=\"true\"\n                      @download=\"\n                        () => downloadFile(firstLayerInspection.tagged_video_url, `${print.id}_tagged_video_inspection.mp4`)\n                      \"\n                    />\n                  </div>\n                </b-card-text>\n              </b-tab>\n              <b-tab :title=\"$t('Original Time-Lapse')\">\n                <b-card-text>\n                  <div class=\"first-layer-modal-video-wrapper\">\n                    <video-box\n                      :video-url=\"firstLayerInspection.video_url\"\n                      :poster-url=\"firstLayerInspection.images.length ? firstLayerInspection.images[0].image_url : null\"\n                      :fluid=\"false\"\n                      :fullscreen-btn=\"false\"\n                      :download-btn=\"true\"\n                      :default-full-screen-toggle=\"true\"\n                      @download=\"\n                        () => downloadFile(firstLayerInspection.video_url, `${print.id}_video_inspection.mp4`)\n                      \"\n                    />\n                  </div>\n                </b-card-text>\n              </b-tab>\n            </b-tabs>\n          </b-card>\n          \n        </b-col>\n      </b-row>\n      <b-row class=\"buttons-row\">\n        <!-- Notes Block End -->\n        <b-col cols=\"12\" lg=\"7\">\n            <a :href=\"`/first_layer_inspection_images/?print_id=${print.id}`\" class=\"feedback-button\">{{ $t(\"Give Feedback About This Report\") }}</a\n            >\n        </b-col>\n      </b-row>\n    </div>\n</template>\n\n<script>\nimport VueSlickCarousel from 'vue-slick-carousel'\nimport 'vue-slick-carousel/dist/vue-slick-carousel.css'\nimport 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport PageLayout from '@src/components/PageLayout'\nimport VideoBox from '@src/components/VideoBox'\nimport { downloadFile } from '@src/lib/utils'\n\nexport default {\n  name: 'FirstLayerReportModal',\n  components: {\n    VueSlickCarousel,\n    PageLayout,\n    VideoBox\n  },\n\n  data: function () {\n    return {\n      showCarouselAnimation: true,\n      first_layer_info: {},\n      carouselItems: [],\n      settings: {\n        dots: true,\n        infinite: true,\n        speed: 500,\n        slidesToShow: 1,\n        slidesToScroll: 1,\n        adaptiveHeight: true,\n        initialSlide: 0,\n      },\n      activeTab: 0,\n      carouselKey: 0,\n      activeThumbnail: null,\n      thumbnailStyle: {\n        width: '150px',\n        height: '150px',\n        position: 'absolute',\n        zIndex: '1070',\n      },\n    }\n  },\n  props: {\n    firstLayerInspection: {\n      type: Object,\n      required: true,\n    },\n    firstLayerPrintTime: {\n      type: String,\n      required: true\n    },\n    gradeResult: {\n      type: Object,\n      required: true,\n    },\n    print: {\n      type: Object,\n      required: true,\n    },\n    showOpenButton: {\n      type: Boolean,\n      default: false,\n    },\n    compactView: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  computed: {\n    aiTimeLapsePosterImageUrl() {\n      if (this.firstLayerInspection.poster_url) {\n        return this.firstLayerInspection.poster_url\n      }\n      return this.firstLayerInspection.images?.length ? this.firstLayerInspection.images[0].image_url : null\n    },\n    file() {\n      return this.print.g_code_file || { filename: this.print.filename }\n    },\n    isGradeA() {\n      return this.gradeResult.grade === 'A'\n    },\n    showIconThumbnail() {\n      return !this.compactView || this.bigThumbnailUrl\n    },\n    bigThumbnailUrl() {\n      return this.file.getBigThumbnailUrl && this.file.getBigThumbnailUrl()\n    },\n    fileUploadedTime() {\n      return this.file.created_at.fromNow()\n    },\n  },\n  watch: {\n    firstLayerInfo: {\n      handler: function (value) {\n        if (value) {\n          this.prepareFirstLayerInfo()\n        }\n      },\n      immediate: true,\n    },\n  },\n  methods: {\n    downloadFile,\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.buttons-row\n  @media (max-width: 991px)\n    margin-top: 2em\n.heatmap-column\n  display: flex\n  flex-direction: column\n  align-items: center\n  .card\n    background-color: var(--color-background)\n    border-radius: var(--border-radius-lg)\n.file-header\n  display: flex\n  align-items: center\n  gap: 1rem\n  padding-bottom: 5px\n  .info\n    flex: 1\n  .icon\n    flex: 0 0 2rem\n    text-align: center\n    *\n      font-size: 2rem\n.font-bold\n  font-weight: bold\n.first-layer-report-info-line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  gap: .5rem\n  border-top: 1px solid var(--color-divider-muted)\n  &:first-of-type\n    border-top: none\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      opacity: .5\n      width: 1rem\n      text-align: center\n  .value\n    font-weight: bold\n\n.report-title\n  padding-left: 15px\n\n.feedback-button\n  border: 1px solid var(--color-primary)\n  display: block\n  text-align: center\n  border-radius: 17px\n  padding: 8px\n  color: var(--color-primary)\n  background-color: transparent\n  &:hover\n    background-color: var(--color-hover)\nhr\n  width: 100%\n  margin-top: 7px\n  margin-bottom: 7px\n.notes-block\n  background-color: var(--color-background)\n  padding: 1.5em\n  border-radius: var(--border-radius-lg)\n\n  display: flex\n  flex-direction: column\n  .title\n    padding: 0 1em\n  .description\n    padding: 0 1em\n    font-size: 0.9em\n    p\n      margin: 0\n  .info\n    padding: 0 1em\n    font-size: 0.9em\n    p\n      margin: 0\n    ul\n      margin: 0 -15px\n      li\n        font-size: 0.9em\n\n\n.file-block\n  background-color: var(--color-background)\n  padding: 1.5em\n  border-radius: var(--border-radius-lg)\n  display: flex\n  flex-direction: column\n  .title\n    width:100%\n    display: flex\n    padding: 0 1em\n    font-size: 1.125rem\n    color: var(--color-text-primary)\n    font-weight: medium\n    span\n      margin-left: .5em\n    .icon\n      flex: 1\n      display: flex\n      align-items: center\n      i\n        font-size: 2em\n    .info\n      flex: 15\n      font-size: 1rem\n      grid-column: span 1\n      .file-size\n        color: var(--color-divider)\n    .button\n      display: flex\n      align-items: center\n      justify-content: flex-end\n  @media (max-width: 768px)\n    grid-template-columns: 8% 60% 32%\n  .first-layer-grade\n    width:100%\n    display: flex\n    justify-content: space-between\n    align-items: center\n    padding: 0 1em\n    .icon\n      flex: 1\n      display: flex\n      align-items: center\n      justify-content: center\n    .name\n      flex: 15\n      @media (max-width: 768px)\n        flex: 11\n    .status\n      display: flex\n      justify-content: flex-end\n  .first-layer-print-time\n    width:100%\n    display: flex\n    justify-content: space-between\n    padding: 0 1em\n    grid-template-columns: 3% 67% 30%\n    .icon\n      flex: 1\n      display: flex\n      align-items: center\n      justify-content: center\n\n    .name\n      flex: 18\n      @media (max-width: 768px)\n        flex: 15\n    .status\n      display: flex\n      justify-content: flex-end\n\n  &.bar-chart\n    height: auto\n    .chart-wrapper\n      height: 210px\n  @media (max-width: 768px)\n    padding: 1.25em 1.5em\n\n\n.dark-icon\n  color: var(--color-divider)\n\n\n$border-color: #dee2e6\n.card-map\n  border-radius: var(--border-radius-lg)\n  background: white\n  @media (min-width: 991px)\n    max-width: 490px\n  .card-body\n    padding: 10%\n    \n.border-right\n  border-right: 1px solid $border-color\n\n.transparent-button\n  background-color: transparent\n  border-color: #007bff\n  color: #007bff\n  &:hover\n    background-color: rgba(#007bff, 0.1)\n\n\n\n\n@media (max-width: 768px)\n  .file-block-title\n    grid-template-columns: 7% 65% 28%\n\n  @media (max-width: 1198px)\n    .file-block-title\n      grid-template-columns: 7% 65% 28%\n\n.is-fullscreen\n  position: fixed\n  top: 0\n  left: 0\n  bottom: 0\n  right: 0\n  z-index: 9999\n  background-color: var(--color-background)\n  display: flex\n  flex: 1\n  order: 1\n  ::v-deep .video-js\n    height: 100vh !important\n</style>\n\n<style>\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n.carousel-active-tab {\n  border: none !important;\n  background-color: var(--color-background) !important;\n}\n.carousel-tab {\n  &:hover {\n    background-color: var(--color-hover);\n  }\n}\ndiv#carousal-modal {\n  animation: swal2-show .3s !important;\n  transition: none !important;\n}\n.modal-dialog.modal-lg {\n  transition: none !important\n}\ndiv#carousal-modal___BV_modal_outer_ {\n  z-index: 1100 !important;\n}\n\nbutton.btn.feedback-button.btn-secondary {\n  border: 1px solid var(--color-primary) !important\n}\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FirstLayerReportModal.vue?vue&type=template&id=21ff5370&scoped=true&\"\nimport script from \"./FirstLayerReportModal.vue?vue&type=script&lang=js&\"\nexport * from \"./FirstLayerReportModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FirstLayerReportModal.vue?vue&type=style&index=0&id=21ff5370&prod&lang=sass&scoped=true&\"\nimport style1 from \"./FirstLayerReportModal.vue?vue&type=style&index=1&id=21ff5370&prod&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"21ff5370\",\n  null\n  \n)\n\nexport default component.exports","export function calculateGrade(score) {\n  if (score >= 80) {\n    return {\n      grade: 'A',\n      gradeTitle: 'A - Flawless First Layer',\n      gradeAccent: 'text-success',\n      gradeRemarks: \"You have got a perfect first layer! Way to go!\",\n      gradeSuggestion: [],\n    }\n  } else if (score >= 60) {\n    return {\n      grade: 'B',\n      gradeTitle: 'B - Barely a Blemish, Bravo!',\n      gradeAccent: 'text-success',\n      gradeRemarks: \"You’re first layer is almost perfect! The risk of the first layer to cause  a failure later is VERY LOW.\",\n      gradeSuggestion: [\n        \"Minor under-extrusion.\",\n        \"Minor over-extrusion.\",\n        \"Suboptimal z-offset setting that causes the material to not bond perfectly.\",\n        \"Uneven print bed coupled with suboptimal auto-bed-leveling.\",\n        \"Other problems that cause the first layer to have defects.\"\n      ],\n    }\n  } else if (score >= 40) {\n    return {\n      grade: 'C',\n      gradeTitle: 'C - Okay First Layer',\n      gradeAccent: 'text-warning',\n      gradeRemarks: \"The risk for the first layer to cause your print to fail later is LOW. However, if you want a perfect bottom surface finish and structural strength, you can stop the print, perfect your first layer, and restart the print.\",\n      gradeSuggestion: [\n        \"Under-extrusion.\",\n        \"Over-extrusion.\",\n        \"Suboptimal z-offset setting that causes the material to not bond perfectly.\",\n        \"Contaminated print bed that causes the material in some areas to slightly bubble or wrap.\",\n        \"Uneven print bed coupled with suboptimal auto-bed-leveling.\",\n        \"Other problems that cause the first layer to have defects.\"\n      ],\n    }\n  } else if (score >= 20) {\n    return {\n      grade: 'D',\n      gradeTitle: 'D - Definitely Needs Tuning',\n      gradeAccent: 'text-danger',\n      gradeRemarks: \"It looks like your printer has run into some trouble on the first layer. The risk for the first layer to cause your print to failure later is MEDIUM. Although these first layer issues probably won't cause the print to fail later, you should consider fixing them and restarting the print, especially if you want to have a good bottom surface finish and structural strength.\",\n      gradeSuggestion: [\n        \"Significant under-extrusion.\",\n        \"Uneven print bed coupled with suboptimal auto-bed-leveling.\",\n        \"Contaminated print bed that causes the material in some areas to bubble or wrap.\",\n        \"Other problems that cause the first layer to show serious defects.\"\n      ],\n    }\n  } else {\n    return {\n      grade: 'F',\n      gradeTitle: 'F - First Layer Fail',\n      gradeAccent: 'text-danger',\n      gradeRemarks: \"It looks like your printer has run into some trouble on the first layer. The risk for the first layer to cause your print to failure later is HIGH. I recommend you stop the print now and fix the problem.\",\n      gradeSuggestion: [\n        \"Serious bed-leveling problems that cause material to detach from the print bed.\",\n        \"Wrong/suboptimal z-offset setting.\",\n        \"Serious bubbling or wrapping.\",\n        \"Other problems that will probably cause the print to fail later in the process.\"\n      ]\n    }\n  }\n}","<template>\n  <page-layout>\n    <template #content>\n      <loading-placeholder v-if=\"isLoading\" />\n      <b-container v-else fluid>\n        <b-row>\n          <b-col lg=\"5\">\n            <div class=\"print-info\">\n              <!-- Print details -->\n              <div class=\"card-container print-details\">\n                <div v-if=\"currentIndex || currentIndex === 0\" class=\"navigation-container\">\n                  <b-button\n                    variant=\"outline-secondary\"\n                    :disabled=\"!prevPrint\"\n                    @click.prevent=\"switchToPrint(prevPrint)\"\n                  >\n                    <i class=\"fas fa-chevron-left\"></i>&nbsp;&nbsp;{{ PrevPrintButtonTitle }}\n                  </b-button>\n                  <div class=\"summary truncated-wrapper\">\n                    <div class=\"date truncated\">\n                      {{ print.started_at.format(absoluteDateFormat) }}\n                    </div>\n                  </div>\n                  <b-button\n                    variant=\"outline-secondary\"\n                    :disabled=\"!nextPrint\"\n                    @click.prevent=\"switchToPrint(nextPrint)\"\n                  >\n                    {{ NextPrintButtonTitle }}&nbsp;&nbsp;<i class=\"fas fa-chevron-right\"></i>\n                  </b-button>\n                </div>\n                <div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                      <div class=\"title\">{{ $t(\"Status\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      <div class=\"print-status-color\" :class=\"print.status.key\">\n                        {{ print.status.title }}\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"Start time\") }}</div>\n                    </div>\n                    <div class=\"value\">{{ print.started_at.format(absoluteDateFormat) }}</div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"End time\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ print.ended_at ? print.ended_at.format(absoluteDateFormat) : '-' }}\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"Duration\") }}</div>\n                    </div>\n                    <div class=\"value\">{{ print.duration || '-' }}</div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-ruler-horizontal\"></i></div>\n                      <div class=\"title\">{{ $t(\"Filament used\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ print.filament_used ? humanizedFilamentUsage(print.filament_used) : '-' }}\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <!-- GCode details -->\n              <g-code-details\n                :file=\"print.g_code_file || { filename: print.filename }\"\n                :show-open-button=\"canOpenFile\"\n              />\n              <!-- Printer -->\n              <div v-if=\"print.printer\" class=\"card-container printer\">\n                <div class=\"icon\">\n                  <svg width=\"1em\" height=\"1em\" style=\"margin-bottom: 5px\">\n                    <use href=\"#svg-3d-printer\" />\n                  </svg>\n                </div>\n                <div class=\"info truncated-wrapper\">\n                  <div class=\"title truncated\" :title=\"print.printer.name\">\n                    {{ print.printer.name }}\n                  </div>\n                  <div\n                    class=\"subtitle truncated\"\n                    :class=\"[\n                      printer\n                        ? printer.isPrintable() && !printer.inTransientState()\n                          ? 'text-success'\n                          : 'text-warning'\n                        : 'text-danger',\n                    ]\"\n                  >\n                    {{ printer ? printer.printabilityText() : 'Deleted' }}\n                  </div>\n                </div>\n                <div\n                  v-if=\"\n                    printer &&\n                    print.g_code_file &&\n                    !print.g_code_file.deleted &&\n                    print.g_code_file.url\n                  \"\n                  class=\"action\"\n                >\n                  <button\n                    class=\"btn btn-primary\"\n                    :disabled=\"!printer.isPrintable() || printer.inTransientState()\"\n                    @click=\"onRepeatPrintClicked\"\n                  >\n                    <b-spinner v-if=\"isSending\" class=\"mr-2\" small />\n                    <span>{{ $t(\"Reprint\") }}</span>\n                  </button>\n                </div>\n              </div>\n              <div v-else=\"print.printer\" class=\"card-container printer\">\n                <p>Unknown Printer</p>\n              </div>\n\n            </div>\n          </b-col>\n          <b-col lg=\"7\">\n            <div class=\"print-info\">\n              <!-- First Layer Report Card -->\n              <div v-if=\"firstLayerInspection.id\" class=\"card-container\">\n                <b-row class=\"m-0\">\n                  <b-col cols=\"12\" sm=\"6\" md=\"6\" lg=\"12\" xl=\"6\"   class=\"first-layer-info-column\">\n                    <div>\n                      <b-row class=\"mb-4\">\n                        <span class=\"ml-3\">{{ $t(\"First Layer Report\") }}</span>\n                      </b-row>\n                      <div class=\"first-layer-info-line\">\n                        <div class=\"label\">\n                          <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                          <div class=\"title\">{{ $t(\"First Layer Grade\") }}</div>\n                        </div>\n                        <div class=\"value\">\n                          <div class=\"print-status-color\" :class=\"gradeResult.gradeAccent\">\n                            {{ gradeResult.gradeTitle || '&nbsp;' }}\n                          </div>\n                        </div>\n                      </div>\n                      <div class=\"first-layer-info-line\">\n                        <div class=\"label\">\n                          <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                          <div class=\"title\">{{ $t(\"First Layer Print Time\") }}</div>\n                        </div>\n                        <div class=\"value\">{{ firstLayerPrintTime }}</div>\n                      </div>\n                    </div>\n                    <b-row class=\"m-0\">\n                      <b-button class=\"open-detailed-report-button\" @click=\"onOpenDetailedReport\"\n                        >{{ $t(\"Open Detailed Report\") }}</b-button\n                      >\n                    </b-row>\n                  </b-col>\n                  <b-col cols=\"12\" sm=\"6\" md=\"6\" lg=\"12\" xl=\"6\" class=\"first-layer-report-block-video-container\">\n                    <div class=\"first-layer-video-wrapper\" :class=\"{\n                              'is-fullscreen original':\n                                !!fullscreenUrl && fullscreenUrl === firstLayerInspection.tagged_video_url,\n                            }\">\n                      <video-box\n                        :video-url=\"firstLayerInspection.tagged_video_url\"\n                        :poster-url=\"aiTimeLapsePosterImageUrl\"\n                        :fluid=\"false\"\n                        :fullscreen-btn=\"fullscreenUrl === null\"\n                        :exit-fullscreen-btn=\"fullscreenUrl !== null\"\n                        :download-btn=\"true\"\n                        @fullscreen=\"() => enterFullscreen(firstLayerInspection.tagged_video_url)\"\n                        @exitFullscreen=\"exitFullscreen\"\n                        @download=\"\n                          () => downloadFile(firstLayerInspection.tagged_video_url, `${print.id}_tagged_video_inspection.mp4`)\n                        \"\n                      />\n                    </div>\n                  </b-col>\n                </b-row>\n              </div>\n\n              <div class=\"time-lapse\">\n                <div v-if=\"print.video_archived_at\" class=\"card-container\">\n                  <h2 class=\"title\">{{ $t(\"Time-Lapse video deleted\") }}</h2>\n                  <p>\n                    {{ $t(\"Time-lapse videos older than 6-months are deleted from the {brandName} app server as they are rarely needed and cost significant amount to store in the cloud.\",{brandName:$syndicateText.brandName}) }}\n                  </p>\n                  <p>\n                    <i18next :translation=\"$t(`If you are a Pro subscriber and you don't want your time-lapse videos to be deleted, please {localizedDom}`)\">\n                      <template #localizedDom>\n                        <a href=\"mailto:support@obico.io?subject=Please%20keep%20my%20timelapse%20videos\">{{$t(\"contact us\")}}</a>\n                      </template>\n                    </i18next>\n                    .\n                  </p>\n                </div>\n                <div v-else-if=\"print.video_url || print.tagged_video_url\">\n                  <b-card no-body>\n                    <b-tabs pills card>\n                      <b-tab title=\"Detective Time-Lapse\" :disabled=\"!canShowDetectiveView\">\n                        <b-card-text>\n                          <div\n                            v-if=\"print.tagged_video_url\"\n                            :class=\"{\n                              'is-fullscreen':\n                                !!fullscreenUrl && fullscreenUrl === print.tagged_video_url,\n                            }\"\n                          >\n                            <div class=\"video-wrapper\">\n                              <video-box\n                                :video-url=\"print.tagged_video_url\"\n                                :poster-url=\"print.poster_url\"\n                                :fluid=\"false\"\n                                :fullscreen-btn=\"fullscreenUrl === null\"\n                                :exit-fullscreen-btn=\"fullscreenUrl !== null\"\n                                :download-btn=\"true\"\n                                @timeupdate=\"onTimeUpdate\"\n                                @fullscreen=\"() => enterFullscreen(print.tagged_video_url)\"\n                                @exitFullscreen=\"exitFullscreen\"\n                                @download=\"\n                                  () => downloadFile(print.tagged_video_url, `${print.id}_tagged.mp4`)\n                                \"\n                              />\n                            </div>\n                            <div class=\"detective-footer\">\n                              <failure-detection-gauge\n                                v-if=\"print.prediction_json_url\"\n                                :normalized-p=\"normalizedP\"\n                              />\n                              <div class=\"feedback-section\">\n                                <div\n                                  class=\"lead\"\n                                  :class=\"[print.alerted_at ? 'text-danger' : 'text-success']\"\n                                >\n                                  {{ print.alerted_at ? 'Failure detected' : 'No failure detected' }}\n                                </div>\n                                <div class=\"py-2\">\n                                  {{$t(\"Did we get it right?\")}}\n                                  <b-button\n                                    :variant=\"thumbedUp ? 'primary' : 'outline'\"\n                                    class=\"mx-2 btn-sm\"\n                                    @click=\"onThumbUpClick\"\n                                  >\n                                    <b-spinner\n                                      v-if=\"inflightAlertOverwrite\"\n                                      type=\"grow\"\n                                      small\n                                    ></b-spinner>\n                                    <i v-else class=\"fas fa-thumbs-up\"></i>\n                                  </b-button>\n                                  <b-button\n                                    :variant=\"thumbedDown ? 'primary' : 'outline'\"\n                                    class=\"mx-2 btn-sm\"\n                                    @click=\"onThumbDownClick\"\n                                  >\n                                    <b-spinner\n                                      v-if=\"inflightAlertOverwrite\"\n                                      type=\"grow\"\n                                      small\n                                    ></b-spinner>\n                                    <i v-else class=\"fas fa-thumbs-down\"></i>\n                                  </b-button>\n                                </div>\n                                <transition name=\"bounce\">\n                                  <div v-if=\"print.printShotFeedbackEligible\" class=\"pt-2\">\n                                    <b-button\n                                      variant=\"outline-primary\"\n                                      size=\"sm\"\n                                      :href=\"`/prints/shot-feedback/${print.id}/`\"\n                                    >\n                                      <i\n                                        v-if=\"!print.need_print_shot_feedback\"\n                                        class=\"fas fa-check mr-2\"\n                                      ></i>\n                                      {{$t(\"FOCUSED FEEDBACK\")}}\n                                    </b-button>\n                                  </div>\n                                </transition>\n\n                                <div class=\"about-feedback\">\n                                  <small v-if=\"print.printShotFeedbackEligible\">\n                                    <span v-if=\"!print.need_print_shot_feedback\">\n                                      {{$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\")}}\n                                    </span>\n                                    <span v-else>\n                                      {{$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\")}}\n                                      <a\n                                        :href=\"getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback')\"\n                                        target=\"_blank\"\n                                      >\n                                        {{$t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\")}}\n                                      </a>\n                                    </span>\n                                  </small>\n                                  <small v-else>\n                                    {{$t(\"Every time you give us feedback,\")}}\n                                    <a\n                                      :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                                      target=\"_blank\"\n                                    >\n                                      {{$t(\"you help us get better at detecting failures\")}}\n                                    </a>\n                                  </small>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div v-else>\n                            <detective-working class=\"detective-placeholder\" />\n                          </div>\n                        </b-card-text>\n                      </b-tab>\n                      <b-tab\n                        v-if=\"print.video_url\"\n                        :active=\"!print.tagged_video_url\"\n                        title=\"Original Time-Lapse\"\n                      >\n                        <b-card-text>\n                          <div\n                            :class=\"{\n                              'is-fullscreen original':\n                                !!fullscreenUrl && fullscreenUrl === print.video_url,\n                            }\"\n                          >\n                            <div class=\"video-wrapper\">\n                              <video-box\n                                :video-url=\"print.video_url\"\n                                :poster-url=\"print.poster_url\"\n                                :fluid=\"false\"\n                                :fullscreen-btn=\"fullscreenUrl === null\"\n                                :exit-fullscreen-btn=\"fullscreenUrl !== null\"\n                                :download-btn=\"true\"\n                                @timeupdate=\"onTimeUpdate\"\n                                @fullscreen=\"() => enterFullscreen(print.video_url)\"\n                                @exitFullscreen=\"exitFullscreen\"\n                                @download=\"() => downloadFile(print.video_url, `${print.id}.mp4`)\"\n                              />\n                            </div>\n                          </div>\n                        </b-card-text>\n                      </b-tab>\n                    </b-tabs>\n                  </b-card>\n                </div>\n                <div v-else class=\"card-container\">\n                  <p class=\"text-secondary mt-3\">{{ $t(\"Time-Lapse video unavailable because\") }}:</p>\n                  <ul>\n                    <li class=\"text-secondary mt-3\">\n                      {{ $t(\"The {brandName} server is still processing the time-lapse;\",{brandName:$syndicateText.brandName}) }}\n                    </li>\n                    <li class=\"text-secondary mt-3\">\n                      <i18next :translation=\"$t(`Or, the print time was shorter than the threshold. You can change the threshold in {localizedDom}`)\">\n                        <template #localizedDom>\n                          <a :href=\"`/printers/${print.printer.id}/`\">{{$t(\"the printer settings\")}}.</a>\n                        </template>\n                      </i18next>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport { humanizedDuration } from '@src/lib/formatters'\nimport axios from 'axios'\nimport moment from 'moment'\nimport { getNormalizedP, downloadFile } from '@src/lib/utils'\nimport urls from '@config/server-urls'\nimport { getLocalPref } from '@src/lib/pref'\nimport { humanizedFilamentUsage } from '@src/lib/formatters'\nimport { user, settings } from '@src/lib/page-context'\nimport { normalizedPrint, PrintStatus, normalizedPrinter, toMomentOrNull } from '@src/lib/normalizers'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport VideoBox from '@src/components/VideoBox'\nimport DetectiveWorking from '@src/components/DetectiveWorking'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport { sendToPrint, showRedirectModal, confirmPrint } from '@src/components/g-codes/sendToPrint'\nimport { restoreFilterValues, getFilterParams } from '@src/components/FilteringDropdown'\nimport { restoreSortingValue } from '@src/components/SortingDropdown'\nimport {\n  FilterOptions,\n  FilterLocalStoragePrefix,\n  SortingLocalStoragePrefix,\n  SortingOptions,\n} from '@src/views/PrintHistoryPage'\nimport GCodeDetails from '@src/components/GCodeDetails.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport FirstLayerReportModal from '@src/components/prints/FirstLayerReportModal.vue'\nimport { calculateGrade } from '../services/gradeCalculator';\n\nexport default {\n  name: 'PrintPage',\n\n  components: {\n    PageLayout,\n    VideoBox,\n    DetectiveWorking,\n    FailureDetectionGauge,\n    GCodeDetails,\n  },\n\n  props: {\n    printId: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      image: '',\n      gradeResult: {},\n      firstLayerInspection: {},\n      isFirstLayerReportModalOpen: false,\n      PrintStatus,\n      absoluteDateFormat: 'MMM D, YYYY h:mm a',\n      print: null,\n      predictions: [],\n      printer: null,\n      isLoading: true,\n      currentPosition: 0,\n      inflightAlertOverwrite: null,\n      fullscreenUrl: null,\n      user: null,\n      currentPrint: null,\n\n      // Pagination\n      prevPrint: null,\n      nextPrint: null,\n      // Sorting for pagination\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n      // Filtering for pagination\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n\n      printerStateCheckInterval: null,\n      firstLayerPrintTime: '-'\n    }\n  },\n\n  computed: {\n    aiTimeLapsePosterImageUrl() {\n      if (this.firstLayerInspection.poster_url) {\n        return this.firstLayerInspection.poster_url\n      }\n      return this.firstLayerInspection.images?.length ? this.firstLayerInspection.images[0].image_url : null\n    },\n    canOpenFile() {\n      return this.print.g_code_file &&\n            !this.print.g_code_file.resident_printer &&\n            !this.print.g_code_file.deleted\n    },\n    PrevPrintButtonTitle() {\n      return this.sortingValue.direction.key === 'asc' ? `${this.$i18next.t('Older')}` : `${this.$i18next.t('Newer')}`\n    },\n    NextPrintButtonTitle() {\n      return this.sortingValue.direction.key === 'asc' ? `${this.$i18next.t('Newer')}` : `${this.$i18next.t('Older')}`\n    },\n    fileName() {\n      return this.print.g_code_file === null ? this.print.filename : this.print.g_code_file.filename\n    },\n    currentPrintId() {\n      return this.currentPrint?.id || this.printId\n    },\n    currentIndex() {\n      if (this.currentPrint) {\n        return this.currentPrint.index\n      }\n\n      const urlParams = new URLSearchParams(window.location.search)\n      let indexParam = urlParams.get('index')\n      if (!indexParam) {\n        return\n      }\n\n      return parseInt(indexParam)\n    },\n\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, false)\n    },\n\n    canShowDetectiveView() {\n      if (this.print.prediction_json_url !== null && this.print.tagged_video_url !== null) {\n        return true\n      }\n      // Time-lapses that was uploaded within the past 24 hours are presumably still be processed\n      if (this.print.uploaded_at && moment().diff(this.print.uploaded_at, 'hours') < 24) {\n        return true\n      }\n      return false\n    },\n\n    thumbedUp() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'NOT_FAILED')\n    },\n\n    thumbedDown() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'FAILED')\n    },\n    isSending() {\n      const printerState = this.printer?.calculatedState()\n      return printerState && ['G-Code Downloading', 'Starting'].includes(printerState)\n    },\n  },\n\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n\n    this.user = user()\n    this.fetchData()\n    this.fetchSiblingPrints()\n  },\n\n  mounted() {\n    const exitFullscreen = this.exitFullscreen\n    document.addEventListener('keydown', (event) => {\n      if (event.key === 'Escape') {\n        exitFullscreen()\n      }\n    })\n  },\n\n  unmounted() {\n    clearInterval(this.printerStateCheckInterval)\n  },\n\n  methods: {\n    downloadFile,\n    humanizedFilamentUsage,\n    async fetchData(clearPreviousData = true) {\n      if (clearPreviousData) {\n        this.print = null\n        this.predictions = []\n        this.printer = null\n      }\n\n      this.isLoading = true\n      try {\n        const printResponse = await axios.get(urls.print(this.currentPrintId))\n        this.print = normalizedPrint(printResponse.data)\n\n        this.prepareFirstLayerReport(printResponse.data.firstlayerinspection_set.length ? printResponse.data.firstlayerinspection_set[0] : {})\n\n        if (this.print.prediction_json_url) {\n          axios.get(this.print.prediction_json_url).then((response) => {\n            this.predictions = response.data\n          })\n        }\n\n        axios\n          .get(urls.printer(this.print.printer.id), { params: { with_archived: true } })\n          .then((response) => {\n            this.printer = normalizedPrinter(response.data)\n\n            this.printerComm = printerCommManager.getOrCreatePrinterComm(\n              this.printer.id,\n              urls.printerWebSocket(this.printer.id),\n              {\n                onPrinterUpdateReceived: (data) => {\n                  this.printer = normalizedPrinter(data, this.printer)\n                },\n              }\n            )\n            this.printerComm.connect()\n          })\n          .catch((error) => {\n            // Printer could be old and deleted from account (404 error)\n            this.printer = null\n            if (error?.response?.status !== 404) {\n              this.errorDialog(error, `${this.$i18next.t('Failed to fetch printer information')}`)\n            }\n          })\n          .finally(() => {\n            this.isLoading = false\n          })\n      } catch (error) {\n        console.log(error)\n        this.isLoading = false\n      }\n    },\n    prepareFirstLayerReport(firstLayerInspectionData) {\n      this.firstLayerInspection = firstLayerInspectionData;\n      if (firstLayerInspectionData.id) {\n        this.gradeResult = calculateGrade(firstLayerInspectionData.score);\n        const createdAt = toMomentOrNull(this.firstLayerInspection.created_at)\n        const duration = moment.duration(createdAt.diff(this.print.started_at))\n        this.firstLayerPrintTime = humanizedDuration(duration.asSeconds())\n      }\n    },\n    switchToPrint(print) {\n      this.currentPrint = print\n      const newUrl = `/prints/${print.id}/?index=${print.index}`\n      window.history.replaceState({}, '', newUrl)\n      this.fetchData()\n      this.fetchSiblingPrints()\n    },\n    fetchSiblingPrints() {\n      if (!this.currentIndex && this.currentIndex !== 0) {\n        return\n      }\n\n      const prevExists = this.currentIndex > 0\n      const start = prevExists ? this.currentIndex - 1 : 0\n      const limit = prevExists ? 3 : 2\n\n      axios\n        .get(urls.prints(), {\n          params: {\n            start,\n            limit,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              (filterOptionKey, filterValueKey) => {\n                if (filterOptionKey === 'timePeriod') {\n                  return this.filterOptions[filterOptionKey].buildQueryParam(\n                    filterValueKey,\n                    getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`) || null,\n                    getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`) || null,\n                    this.user\n                  )\n                }\n              }\n            ),\n            sorting: `${this.sortingValue.sorting.key}_${this.sortingValue.direction.key}`,\n          },\n        })\n        .then((response) => {\n          const data = response.data\n          let prev\n          let next\n          if (prevExists) {\n            if (data.length === 3 && data[1].id === this.currentPrintId) {\n              // prev and next exist\n              prev = data[0]\n              next = data[2]\n            } else if (data.length === 2 && data[1].id === this.currentPrintId) {\n              // only prev exists\n              prev = data[0]\n            } else {\n              // no prev or next\n              return\n            }\n          } else {\n            if (data.length === 2 && data[0].id === this.currentPrintId) {\n              // only next exists\n              next = data[1]\n            } else {\n              // no prev or next\n              return\n            }\n          }\n\n          this.prevPrint = prev ? { id: prev.id, index: this.currentIndex - 1 } : null\n          this.nextPrint = next ? { id: next.id, index: this.currentIndex + 1 } : null\n        })\n        .catch((error) => {\n          this.errorDialog(error)\n        })\n    },\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n    onThumbUpClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'FAILED' : 'NOT_FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n    onThumbDownClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'NOT_FAILED' : 'FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n    alertOverwrite(value) {\n      axios\n        .patch(urls.print(this.print.id), {\n          alert_overwrite: value,\n        })\n        .then((response) => {\n          this.inflightAlertOverwrite = null\n          this.fetchData(false)\n        })\n    },\n    onRepeatPrintClicked() {\n      confirmPrint(this.print.g_code_file, this.printer).then(() => {\n        sendToPrint({\n          printer: this.printer,\n          gcode: this.print.g_code_file,\n          isCloud: this.print.g_code_file?.resident_printer === null,\n          Swal: this.$swal,\n          onPrinterStatusChanged: () => {\n            showRedirectModal(this.$swal, () => this.fetchData(), this.printer.id)\n          },\n        })\n      })\n    },\n    enterFullscreen(url) {\n      this.fullscreenUrl = url\n    },\n    exitFullscreen() {\n      this.fullscreenUrl = null\n    },\n    onOpenDetailedReport() {\n      this.$swal.openModalWithComponent(\n        FirstLayerReportModal,\n        {\n          printer: this.printer,\n          firstLayerInspection: this.firstLayerInspection,\n          firstLayerPrintTime: this.firstLayerPrintTime,\n          gradeResult: this.gradeResult,\n          print: this.print,\n          showOpenButton: this.canOpenFile\n        },\n        {\n          showCloseButton: true,\n          showConfirmButton: false,\n          width: '75em'\n        }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.fade-enter-active, .fade-leave-active\n  transition: opacity 0.5s\n.fade-enter, .fade-leave-to\n  opacity: 0\n.first-layer-info-column\n  display: flex\n  flex-direction: column\n  justify-content: space-between\n  height: 240px\n  padding: 0\n  @media (max-width: 576px)\n    height: auto\n    gap: 1em\n  @media (max-width: 1198px) and (min-width: 991px)\n    height: auto\n    gap: 1em\n.open-detailed-report-button\n  width: 100%\n\n.first-layer-report-block-video-container\n  display: flex\n  justify-content: flex-end\n  padding-right: 0\n  @media (max-width: 576px)\n    padding: 0\n    margin-top: 1em\n    justify-content: center\n  @media (max-width: 577px) and (max-width: 767px)\n    padding: 0 0 0 5px\n    justify-content: center\n  @media (max-width: 1198px) and (min-width: 991px)\n    margin-top: 1em\n    padding: 0\n    justify-content: center\n.heatmap-image-container\n  border-radius: var(--border-radius-lg)\n  background: white\n  padding: 32px\n  @media (max-width: 576px)\n    height: 393px\n    width: 100%\n    margin-top: 1.4em\n  @media (max-width: 991px) and (min-width: 577px)\n    width: 15em\n  @media (max-width: 1198px) and (min-width: 992px)\n    height: 393px\n    width: 100%\n    margin-top: 0.5em\n  @media (min-width: 1199px)\n    width: 15em\n\n.heatmap-image\n  border: 1px solid #cac8c8\n  height: 176px\n\n  @media (max-width: 576px)\n    height: 330px\n    width: 100%\n  @media (max-width: 1198px) and (min-width: 991px)\n    height: 100%\n    width: 100%\n\n.first-layer-print-time\n  width:100%\n  display: flex\n  justify-content: space-between\n  padding: 0 1em\n  grid-template-columns: 3% 67% 30%\n  .icon\n    flex: 1\n    display: flex\n    align-items: center\n    justify-content: center\n    opacity: 0.5\n  .name\n    flex: 12\n    @media (max-width: 768px)\n      flex: 15\n  .status\n    display: flex\n    justify-content: flex-end\n.first-layer-grade\n  width:100%\n  display: flex\n  justify-content: space-between\n  align-items: center\n  padding: 0 1em\n  .icon\n    flex: 1\n    display: flex\n    align-items: center\n    justify-content: center\n    opacity: 0.5\n  .name\n    flex: 7\n    @media (max-width: 768px)\n      flex: 11\n  .status\n    display: flex\n    justify-content: flex-end\n\n.print-info\n  display: flex\n  flex-direction: column\n  gap: var(--gap-between-blocks)\n\n.print-details\n  overflow: hidden\n  display: flex\n  flex-direction: column\n  gap: 10px\n  .navigation-container\n    display: flex\n    justify-content: space-between\n    align-items: center\n    gap: 1rem\n    margin: -1.5em\n    margin-bottom: .5em\n    padding: 1em 1.5em\n    background-color: var(--color-surface-primary)\n    .btn\n      flex-shrink: 0\n    .summary\n      text-align: center\n      @media (max-width: 576px)\n        display: none\n  .info-line\n    display: flex\n    align-items: center\n    justify-content: space-between\n    margin-bottm: 6px\n    padding: 6px 0\n    gap: .5rem\n    border-top: 1px solid var(--color-divider-muted)\n    &:first-of-type\n      border-top: none\n    .label\n      display: flex\n      align-items: center\n      flex: 1\n      gap: .5rem\n      line-height: 1.1\n      .icon\n        opacity: .5\n        width: 1rem\n        text-align: center\n    .value\n      font-weight: bold\n\n.first-layer-info-line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  gap: .5rem\n  border-top: 1px solid var(--color-divider-muted)\n  &:first-of-type\n    border-top: none\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      opacity: .5\n      width: 1rem\n      text-align: center\n  .value\n    font-weight: bold\n\n.printer\n  display: flex\n  align-items: center\n  gap: .7rem\n  margin-bottom: var(--gap-between-blocks)\n  .title\n    font-weight: bold\n  .info\n    flex: 1\n  .icon\n    flex: 0 0 2rem\n    text-align: center\n    *\n      font-size: 2rem\n\n.time-lapse\n  .title\n    font-size: 1.5rem\n    font-weight: normal\n    margin-bottom: 1rem\n  ::v-deep\n    .card\n      border-radius: var(--border-radius-lg)\n      border: none\n      background-color: var(--color-surface-secondary)\n    .nav-pills .nav-link\n      border-radius: var(--border-radius-sm)\n    .nav-pills .nav-link.active\n      background-color: var(--color-surface-primary)\n    .card-header\n      border-bottom: 1px solid var(--color-divider-muted)\n\n.video-wrapper\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n\n  ::v-deep .video-js\n    height: 500px !important\n\n  ::v-deep video:focus-visible\n    outline: none !important\n    box-shadow: none !important\n    border: none !important\n\n.detective-footer\n  margin-top: 30px\n\n.feedback-section\n  margin-top: 30px\n  text-align: center\n\n.about-feedback\n  max-width: 600px\n  display: inline-block\n  margin-top: 30px\n\n.detective-placeholder\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n\n.first-layer-video-wrapper.is-fullscreen\n  flex: 1\n  order: 1\n  ::v-deep .video-js\n    height: 100vh !important\n\n.is-fullscreen\n  position: fixed\n  top: 0\n  left: 0\n  bottom: 0\n  right: 0\n  z-index: 9999\n  background-color: var(--color-background)\n  padding: 1rem\n  display: flex\n\n  .video-wrapper\n    flex: 1\n    order: 1\n    ::v-deep .video-js\n      height: calc(100vh - 2rem) !important\n\n  .detective-footer\n    flex: 0 0 200px\n    padding: 0 1rem\n    display: flex\n    flex-direction: column\n    justify-content: center\n    position: relative\n\n  @media (max-width: 996px)\n    flex-direction: column\n\n    .video-wrapper\n      order: 0\n      flex: 0 0 400px\n      ::v-deep .video-js\n        height: 400px !important\n\n    .detective-footer\n      flex: 1\n      .feedback-section\n        display: none\n\n  &.original\n    padding: 0\n\n    .video-wrapper\n      flex: 1 !important\n      border-radius: 0\n      ::v-deep .video-js\n        height: 100vh !important\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintPage.vue?vue&type=template&id=3b8e9439&scoped=true&\"\nimport script from \"./PrintPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintPage.vue?vue&type=style&index=0&id=3b8e9439&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3b8e9439\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[(_vm.isEnt)?_c('a',{staticClass:\"btn shadow-none action-btn icon-btn hours-btn\",style:({ marginRight: `${String(_vm.dhBadgeNum).length * 0.25}rem` }),attrs:{\"href\":\"/user_preferences/dh/\",\"title\":_vm.dhBadgeNum + ' ' + _vm.$t('AI Detection Hours')}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-hour-glass\"}})]),_c('span',{staticClass:\"badge badge-light\",attrs:{\"id\":\"user-credits\"}},[_vm._v(_vm._s(_vm.dhBadgeNum))]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"AI Detection Hours\")))])]):_vm._e(),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"title\":\"Sort By\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-sort-amount-down\"})]},proxy:true}])},[_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":\"Filter\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('filtering-dropdown',{attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":_vm.mobileMenuOptions},scopedSlots:_vm._u([{key:\"sorting\",fn:function(){return [_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})]},proxy:true},{key:\"filtering\",fn:function(){return [_c('filtering-dropdown',{attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})]},proxy:true}])})],1)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('active-filter-notice',{attrs:{\"filter-values\":_vm.filterValues},on:{\"onShowAllClicked\":_vm.resetFilters}}),_c('b-container',{staticClass:\"printer-list-page\"},[(_vm.loading)?_c('b-row',[_c('b-col',{staticClass:\"text-center\"},[_c('b-spinner',{staticClass:\"my-5\",attrs:{\"label\":\"Loading...\"}})],1)],1):_vm._e(),(_vm.visiblePrinters.length)?_c('b-row',{staticClass:\"printer-cards justify-content-center\"},_vm._l((_vm.visiblePrinters),function(printer){return _c('printer-card',{key:printer.id,staticClass:\"printer-card-wrapper\",attrs:{\"printer\":printer,\"is-pro-account\":_vm.user.is_pro},on:{\"PrinterUpdated\":_vm.onPrinterUpdated}})}),1):_vm._e(),(!_vm.loading)?_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6\",attrs:{\"id\":\"new-printer\"}},[_c('div',{staticClass:\"new-printer-container\"},[_c('a',{attrs:{\"href\":\"/printers/wizard/\"}},[_c('svg',{staticClass:\"icon\"},[_c('use',{attrs:{\"href\":\"#svg-add-printer\"}})]),_c('div',[_vm._v(_vm._s(_vm.$t(\"Link New Printer\")))])])])])]):_vm._e(),(!_vm.loading)?_c('b-row',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.shouldShowArchiveWarning),expression:\"shouldShowArchiveWarning\"}],staticClass:\"bottom-messages\"},[_c('b-col',[_c('div',{staticClass:\"alert alert-warning alert-dismissible fade show mb-3\",attrs:{\"role\":\"alert\"}},[_c('div',{staticClass:\"warning\"},[_c('div',[_vm._v(\" \"+_vm._s(_vm.archivedPrinterNum)+\" \"+_vm._s(_vm._f(\"pluralize\")('printer',_vm.archivedPrinterNum))+\" \"+_vm._s(_vm.$t(\"have been archived.\"))+\" \")]),_c('div',[_c('a',{staticClass:\"warning-action\",attrs:{\"href\":\"/ent/printers/archived/\"}},[_vm._v(_vm._s(_vm.$t(\"Show Archived Printers\")))]),_c('a',{staticClass:\"warning-action\",on:{\"click\":_vm.handleNeverShowAgain}},[_vm._v(_vm._s(_vm.$t(\"Never Show Again\")))])])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"data-dismiss\":\"alert\",\"aria-label\":\"Close\"}},[_c('span',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"×\")])])])])],1):_vm._e()],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-sm-12 col-lg-6 printer-card\",attrs:{\"id\":_vm.printer.id}},[_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-header\"},[_c('div',{staticClass:\"title-box\"},[_c('div',{staticClass:\"printer-name\"},[_vm._v(\" \"+_vm._s(_vm.printer.name)+\" \")]),(_vm.hasCurrentPrintFilename)?_c('div',{staticClass:\"secondary-title print-filename\"},[_vm._v(\" \"+_vm._s(_vm.printer.current_print.filename)+\" \")]):_c('div',{staticClass:\"secondary-title\",class:_vm.statusClass},[_vm._v(_vm._s(_vm.statusText))])]),_c('div',{staticClass:\"d-flex ml-2\"},[_c('b-button',{staticClass:\"px-4 mr-2\",attrs:{\"variant\":\"outline-secondary\",\"href\":`/printers/${_vm.printer.id}/control/`}},[_vm._v(_vm._s(_vm.$t(\"Open\"))+\" \"+_vm._s(_vm.$t(\"Details\"))+\" \")]),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('b-dropdown-item',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onSharePrinter()}}},[_c('i',{staticClass:\"fas fa-share-alt fa-lg\"}),_vm._v(_vm._s(_vm.$t(\"Share\"))+\" \")]),_c('b-dropdown-item',{attrs:{\"href\":_vm.octoPrintTunnelUrl()}},[_c('svg',{staticClass:\"menu-icon\"},[_c('use',{attrs:{\"href\":\"#svg-tunnel\"}})]),_vm._v(\" \"+_vm._s(_vm.printer.agentDisplayName())+\" \"+_vm._s(_vm.$t(\"Tunnel\"))+\" \")]),_c('div',{staticClass:\"dropdown-divider\"}),_c('b-dropdown-item',{attrs:{\"href\":_vm.settingsUrl()}},[_c('i',{staticClass:\"fas fa-wrench fa-lg\"}),_vm._v(_vm._s(_vm.$t(\"Configure\"))+\" \")])],1)],1)]),_c('div',{staticClass:\"px-0 py-0 content d-inline-block\",staticStyle:{\"width\":\"100%\"}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"webrtc\":_vm.webrtc,\"autoplay\":_vm.isProAccount,\"webcam\":_vm.webcam}})],1)]),(_vm.printer.alertUnacknowledged())?_c('div',{staticClass:\"failure-alert card-body bg-warning px-2 py-1\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle align-middle\"}),_c('span',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.$t(\"Failure Detected!\")))]),_c('button',{staticClass:\"btn btn-outline-primary btn-sm float-right\",attrs:{\"id\":\"not-a-failure\",\"type\":\"button\"},on:{\"click\":function($event){return _vm.onNotAFailureClicked($event, false)}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Not a failure?\"))+\" \")])]):_vm._e(),_c('div',{staticClass:\"card-body gauge-container\",class:{ overlay: !_vm.isWatching }},[(!_vm.isWatching)?_c('div',{staticClass:\"overlay-top text-center\",staticStyle:{\"left\":\"0\",\"width\":\"100%\",\"top\":\"50%\",\"margin-top\":\"-55px\"}},[_c('H1',[_c('i',{staticClass:\"far fa-eye-slash\"})]),_c('h5',{staticClass:\"text-warning\"},[_vm._v(_vm._s(_vm.$t(\"Failure Detection is Off\")))]),(_vm.printer.not_watching_reason)?_c('small',[_vm._v(_vm._s(_vm.printer.not_watching_reason)+\". \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/detective-not-watching/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Learn more. \"))),_vm._m(0)])]):_vm._e(),_c('div')],1):_vm._e(),_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.printer.normalized_p,\"is-watching\":_vm.isWatching}}),_c('hr')],1),_c('print-job-control-widget',{attrs:{\"inside-card\":true,\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm},on:{\"notAFailureClicked\":_vm.onNotAFailureClicked,\"sendPrinterAction\":_vm.sendPrinterAction}}),_c('div',{staticClass:\"info-section settings\"},[_c('button',{staticClass:\"info-section-toggle btn btn-sm no-corner mx-2\",class:{ pressed: _vm.section_toggles.settings },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.onSettingsToggleClicked()}}},[_c('i',{staticClass:\"fas fa-cog fa-lg\"})]),_c('button',{staticClass:\"info-section-toggle btn btn-sm no-corner mx-2\",class:{ pressed: _vm.section_toggles.time },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.onTimeToggleClicked()}}},[_c('i',{staticClass:\"fas fa-clock fa-lg\"})]),_c('button',{staticClass:\"info-section-toggle btn btn-sm no-corner mx-2\",class:{ pressed: _vm.section_toggles.statusTemp },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.onStatusTempToggleClicked()}}},[_c('i',{staticClass:\"fas fa-thermometer-half fa-lg\"})])]),_c('div',{staticClass:\"info-section\",staticStyle:{\"height\":\"0.3rem\"}}),_c('div',[_c('div',{staticClass:\"info-section container\"},[(_vm.section_toggles.settings)?_c('div',{attrs:{\"id\":\"panel-settings\"}},[_c('div',{staticClass:\"pt-2 pb-3\"},[_c('div',{staticClass:\"row justify-content-center px-3\"},[_c('div',{staticClass:\"col-12 setting-item\"},[_c('label',{staticClass:\"toggle-label\",attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}},[_c('i18next',{attrs:{\"translation\":_vm.$t('Enable AI failure detection {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [(!_vm.watchForFailures)?_c('div',{staticClass:\"text-muted font-weight-light font-size-sm\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI failure detection is disabled. You are on your own\"))+\".\")]):_vm._e()]},proxy:true}],null,false,2325561323)})],1),_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'watching_enabled-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"watching_enabled\"},domProps:{\"checked\":_vm.watchForFailures},on:{\"click\":_vm.onWatchForFailuresToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}})])])]),_c('div',{staticClass:\"row justify-content-center px-3\"},[_c('div',{staticClass:\"col-12 setting-item\"},[_c('label',{staticClass:\"toggle-label\",attrs:{\"for\":'pause-toggle-' + _vm.printer.id}},[_c('i18next',{attrs:{\"translation\":_vm.$t('Pause on detected failures {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [(!_vm.pauseOnFailure)?_c('div',{staticClass:\"text-muted font-weight-light font-size-sm\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You will still be alerted via notifications\")))]):_vm._e()]},proxy:true}],null,false,4050608119)})],1),_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'pause-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"pause_on_failure\"},domProps:{\"checked\":_vm.pauseOnFailure},on:{\"click\":_vm.onPauseOnFailureToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'pause-toggle-' + _vm.printer.id}})])])])])]):_vm._e(),(_vm.section_toggles.time)?_c('div',{attrs:{\"id\":\"print-time\"}},[_c('div',{staticClass:\"py-2\"},[_c('div',{staticClass:\"row text-muted\"},[_c('small',{staticClass:\"col-5 offset-2\"},[_vm._v(_vm._s(_vm.$t(\" Remaining \")))]),_c('small',{staticClass:\"col-5\"},[_vm._v(_vm._s(_vm.$t(\" Total \")))])]),_c('div',{staticClass:\"row\"},[_vm._m(1),_c('duration-block',_vm._b({staticClass:\"col-5 numbers\",attrs:{\"id\":\"print-time-remaining\"}},'duration-block',_vm.timeRemaining,false)),_c('duration-block',_vm._b({staticClass:\"col-5 numbers\",attrs:{\"id\":\"print-time-total\"}},'duration-block',_vm.timeTotal,false)),_c('div',{staticClass:\"col-12\"},[_c('div',{staticClass:\"progress\",staticStyle:{\"height\":\"2px\"}},[_c('div',{staticClass:\"progress-bar\",class:{\n                      'progress-bar-striped': _vm.progressPct < 100,\n                      'progress-bar-animated': _vm.progressPct < 100,\n                    },style:(`width: ${_vm.progressPct}%;`),attrs:{\"id\":\"print-progress\",\"role\":\"progressbar\",\"aria-valuenow\":\"0\",\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}})])])],1)])]):_vm._e(),(_vm.section_toggles.statusTemp && _vm.tempProps.show)?_c('status-temp',_vm._b({attrs:{\"id\":\"status_temp_block\"},on:{\"TempEditClicked\":_vm.onTempEditClicked}},'status-temp',_vm.tempProps,false)):_vm._e()],1)])],1)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-2 text-muted\"},[_c('i',{staticClass:\"fas fa-clock\"})])\n}]\n\nexport { render, staticRenderFns }","/*\n  The MIT License (MIT)\n\n  Copyright (c) 2016 Meetecho\n\n  Permission is hereby granted, free of charge, to any person obtaining\n  a copy of this software and associated documentation files (the \"Software\"),\n  to deal in the Software without restriction, including without limitation\n  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n  and/or sell copies of the Software, and to permit persons to whom the\n  Software is furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/* eslint-disable no-global-assign, no-redeclare, no-unused-vars, no-empty, no-inner-declarations */\n\nimport adapter from 'webrtc-adapter'\n\n// List of sessions\nJanus.sessions = {}\n\nJanus.isExtensionEnabled = function() {\n  if(navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {\n    // No need for the extension, getDisplayMedia is supported\n    return true\n  }\n  if(window.navigator.userAgent.match('Chrome')) {\n    var chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10)\n    var maxver = 33\n    if(window.navigator.userAgent.match('Linux'))\n      maxver = 35 // \"known\" crash in chrome 34 and 35 on linux\n    if(chromever >= 26 && chromever <= maxver) {\n      // Older versions of Chrome don't support this extension-based approach, so lie\n      return true\n    }\n    return Janus.extension.isInstalled()\n  } else {\n    // Firefox and others, no need for the extension (but this doesn't mean it will work)\n    return true\n  }\n}\n\nvar defaultExtension = {\n  // Screensharing Chrome Extension ID\n  extensionId: 'hapfgfdkleiggjjpfpenajgdnfckjpaj',\n  isInstalled: function() { return document.querySelector('#janus-extension-installed') !== null },\n  getScreen: function (callback) {\n    var pending = window.setTimeout(function () {\n      var error = new Error('NavigatorUserMediaError')\n      error.name = 'The required Chrome extension is not installed: click <a href=\"#\">here</a> to install it. (NOTE: this will need you to refresh the page)'\n      return callback(error)\n    }, 1000)\n    this.cache[pending] = callback\n    window.postMessage({ type: 'janusGetScreen', id: pending }, '*')\n  },\n  init: function () {\n    var cache = {}\n    this.cache = cache\n    // Wait for events from the Chrome Extension\n    window.addEventListener('message', function (event) {\n      if(event.origin != window.location.origin)\n        return\n      if(event.data.type == 'janusGotScreen' && cache[event.data.id]) {\n        var callback = cache[event.data.id]\n        delete cache[event.data.id]\n\n        if (event.data.sourceId === '') {\n          // user canceled\n          var error = new Error('NavigatorUserMediaError')\n          error.name = 'You cancelled the request for permission, giving up...'\n          callback(error)\n        } else {\n          callback(null, event.data.sourceId)\n        }\n      } else if (event.data.type == 'janusGetScreenPending') {\n        console.log('clearing ', event.data.id)\n        window.clearTimeout(event.data.id)\n      }\n    })\n  }\n}\n\nJanus.useDefaultDependencies = function (deps) {\n  var f = (deps && deps.fetch) || fetch\n  var p = (deps && deps.Promise) || Promise\n  var socketCls = (deps && deps.WebSocket) || WebSocket\n\n  return {\n    newWebSocket: function(server, proto) { return new socketCls(server, proto) },\n    extension: (deps && deps.extension) || defaultExtension,\n    isArray: function(arr) { return Array.isArray(arr) },\n    webRTCAdapter: (deps && deps.adapter) || adapter,\n    httpAPICall: function(url, options) {\n      var fetchOptions = {\n        method: options.verb,\n        headers: {\n          'Accept': 'application/json, text/plain, */*'\n        },\n        cache: 'no-cache'\n      }\n      if(options.verb === 'POST') {\n        fetchOptions.headers['Content-Type'] = 'application/json'\n      }\n      if(options.withCredentials !== undefined) {\n        fetchOptions.credentials = options.withCredentials === true ? 'include' : (options.withCredentials ? options.withCredentials : 'omit')\n      }\n      if(options.body) {\n        fetchOptions.body = JSON.stringify(options.body)\n      }\n\n      var fetching = f(url, fetchOptions).catch(function(error) {\n        return p.reject({message: 'Probably a network error, is the server down?', error: error})\n      })\n\n      /*\n       * fetch() does not natively support timeouts.\n       * Work around this by starting a timeout manually, and racing it agains the fetch() to see which thing resolves first.\n       */\n\n      if(options.timeout) {\n        var timeout = new p(function(resolve, reject) {\n          var timerId = setTimeout(function() {\n            clearTimeout(timerId)\n            return reject({message: 'Request timed out', timeout: options.timeout})\n          }, options.timeout)\n        })\n        fetching = p.race([fetching, timeout])\n      }\n\n      fetching.then(function(response) {\n        if(response.ok) {\n          if(typeof(options.success) === typeof(Janus.noop)) {\n            return response.json().then(function(parsed) {\n              try {\n                options.success(parsed)\n              } catch(error) {\n                Janus.error('Unhandled httpAPICall success callback error', error)\n              }\n            }, function(error) {\n              return p.reject({message: 'Failed to parse response body', error: error, response: response})\n            })\n          }\n        }\n        else {\n          return p.reject({message: 'API call failed', response: response})\n        }\n      }).catch(function(error) {\n        if(typeof(options.error) === typeof(Janus.noop)) {\n          options.error(error.message || '<< internal error >>', error)\n        }\n      })\n\n      return fetching\n    }\n  }\n}\n\nJanus.useOldDependencies = function (deps) {\n  var jq = (deps && deps.jQuery) || jQuery // eslint-disable-line no-undef\n  var socketCls = (deps && deps.WebSocket) || WebSocket\n  return {\n    newWebSocket: function(server, proto) { return new socketCls(server, proto) },\n    isArray: function(arr) { return jq.isArray(arr) },\n    extension: (deps && deps.extension) || defaultExtension,\n    webRTCAdapter: (deps && deps.adapter) || adapter,\n    httpAPICall: function(url, options) {\n      var payload = options.body !== undefined ? {\n        contentType: 'application/json',\n        data: JSON.stringify(options.body)\n      } : {}\n      var credentials = options.withCredentials !== undefined ? {xhrFields: {withCredentials: options.withCredentials}} : {}\n\n      return jq.ajax(jq.extend(payload, credentials, {\n        url: url,\n        type: options.verb,\n        cache: false,\n        dataType: 'json',\n        async: options.async,\n        timeout: options.timeout,\n        success: function(result) {\n          if(typeof(options.success) === typeof(Janus.noop)) {\n            options.success(result)\n          }\n        },\n        error: function(xhr, status, err) {\n          if(typeof(options.error) === typeof(Janus.noop)) {\n            options.error(status, err)\n          }\n        }\n      }))\n    }\n  }\n}\n\nJanus.noop = function() {}\n\nJanus.dataChanDefaultLabel = 'JanusDataChannel'\n\n// Note: in the future we may want to change this, e.g., as was\n// attempted in https://github.com/meetecho/janus-gateway/issues/1670\nJanus.endOfCandidates = null\n\n// Stop all tracks from a given stream\nJanus.stopAllTracks = function(stream) {\n  try {\n    // Try a MediaStreamTrack.stop() for each track\n    var tracks = stream.getTracks()\n    for(var mst of tracks) {\n      Janus.log(mst)\n      if(mst) {\n        mst.stop()\n      }\n    }\n  } catch(e) {\n    // Do nothing if this fails\n  }\n}\n\n// Initialization\nJanus.init = function(options) {\n  options = options || {}\n  options.callback = (typeof options.callback == 'function') ? options.callback : Janus.noop\n  if(Janus.initDone) {\n    // Already initialized\n    options.callback()\n  } else {\n    if(typeof console == 'undefined' || typeof console.log == 'undefined') {\n      console = { log: function() {} }\n    }\n    // Console logging (all debugging disabled by default)\n    Janus.trace = Janus.noop\n    Janus.debug = Janus.noop\n    Janus.vdebug = Janus.noop\n    Janus.log = Janus.noop\n    Janus.warn = Janus.noop\n    Janus.error = Janus.noop\n    if(options.debug === true || options.debug === 'all') {\n      // Enable all debugging levels\n      Janus.trace = console.trace.bind(console)\n      Janus.debug = console.debug.bind(console)\n      Janus.vdebug = console.debug.bind(console)\n      Janus.log = console.log.bind(console)\n      Janus.warn = console.warn.bind(console)\n      Janus.error = console.error.bind(console)\n    } else if(Array.isArray(options.debug)) {\n      for(var d of options.debug) {\n        switch(d) {\n        case 'trace':\n          Janus.trace = console.trace.bind(console)\n          break\n        case 'debug':\n          Janus.debug = console.debug.bind(console)\n          break\n        case 'vdebug':\n          Janus.vdebug = console.debug.bind(console)\n          break\n        case 'log':\n          Janus.log = console.log.bind(console)\n          break\n        case 'warn':\n          Janus.warn = console.warn.bind(console)\n          break\n        case 'error':\n          Janus.error = console.error.bind(console)\n          break\n        default:\n          console.error('Unknown debugging option \\'' + d + '\\' (supported: \\'trace\\', \\'debug\\', \\'vdebug\\', \\'log\\', warn\\', \\'error\\')')\n          break\n        }\n      }\n    }\n    Janus.log('Initializing library')\n\n    var usedDependencies = options.dependencies || Janus.useDefaultDependencies()\n    Janus.isArray = usedDependencies.isArray\n    Janus.webRTCAdapter = usedDependencies.webRTCAdapter\n    Janus.httpAPICall = usedDependencies.httpAPICall\n    Janus.newWebSocket = usedDependencies.newWebSocket\n    Janus.extension = usedDependencies.extension\n    Janus.extension.init()\n\n    // Helper method to enumerate devices\n    Janus.listDevices = function(callback, config) {\n      callback = (typeof callback == 'function') ? callback : Janus.noop\n      if (config == null) config = { audio: true, video: true }\n      if(Janus.isGetUserMediaAvailable()) {\n        navigator.mediaDevices.getUserMedia(config)\n          .then(function(stream) {\n            navigator.mediaDevices.enumerateDevices().then(function(devices) {\n              Janus.debug(devices)\n              callback(devices)\n              // Get rid of the now useless stream\n              Janus.stopAllTracks(stream)\n            })\n          })\n          .catch(function(err) {\n            Janus.error(err)\n            callback([])\n          })\n      } else {\n        Janus.warn('navigator.mediaDevices unavailable')\n        callback([])\n      }\n    }\n    // Helper methods to attach/reattach a stream to a video element (previously part of adapter.js)\n    Janus.attachMediaStream = function(element, stream) {\n      try {\n        element.srcObject = stream\n      } catch (e) {\n        try {\n          element.src = URL.createObjectURL(stream)\n        } catch (e) {\n          Janus.error('Error attaching stream to element')\n        }\n      }\n    }\n    Janus.reattachMediaStream = function(to, from) {\n      try {\n        to.srcObject = from.srcObject\n      } catch (e) {\n        try {\n          to.src = from.src\n        } catch (e) {\n          Janus.error('Error reattaching stream to element')\n        }\n      }\n    }\n    // Detect tab close: make sure we don't loose existing onbeforeunload handlers\n    // (note: for iOS we need to subscribe to a different event, 'pagehide', see\n    // https://gist.github.com/thehunmonkgroup/6bee8941a49b86be31a787fe8f4b8cfe)\n    var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0\n    var eventName = iOS ? 'pagehide' : 'beforeunload'\n    var oldOBF = window['on' + eventName]\n    window.addEventListener(eventName, function(event) {\n      Janus.log('Closing window')\n      for(var s in Janus.sessions) {\n        if(Janus.sessions[s] && Janus.sessions[s].destroyOnUnload) {\n          Janus.log('Destroying session ' + s)\n          Janus.sessions[s].destroy({unload: true, notifyDestroyed: false})\n        }\n      }\n      if(oldOBF && typeof oldOBF == 'function') {\n        oldOBF()\n      }\n    })\n    // If this is a Safari Technology Preview, check if VP8 is supported\n    Janus.safariVp8 = false\n    if(Janus.webRTCAdapter.browserDetails.browser === 'safari' &&\n        Janus.webRTCAdapter.browserDetails.version >= 605) {\n      // Let's see if RTCRtpSender.getCapabilities() is there\n      if(RTCRtpSender && RTCRtpSender.getCapabilities && RTCRtpSender.getCapabilities('video') &&\n          RTCRtpSender.getCapabilities('video').codecs && RTCRtpSender.getCapabilities('video').codecs.length) {\n        for(var codec of RTCRtpSender.getCapabilities('video').codecs) {\n          if(codec && codec.mimeType && codec.mimeType.toLowerCase() === 'video/vp8') {\n            Janus.safariVp8 = true\n            break\n          }\n        }\n        if(Janus.safariVp8) {\n          Janus.log('This version of Safari supports VP8')\n        } else {\n          Janus.warn('This version of Safari does NOT support VP8: if you\\'re using a Technology Preview, ' +\n            'try enabling the \\'WebRTC VP8 codec\\' setting in the \\'Experimental Features\\' Develop menu')\n        }\n      } else {\n        // We do it in a very ugly way, as there's no alternative...\n        // We create a PeerConnection to see if VP8 is in an offer\n        var testpc = new RTCPeerConnection({})\n        testpc.createOffer({offerToReceiveVideo: true}).then(function(offer) {\n          Janus.safariVp8 = offer.sdp.indexOf('VP8') !== -1\n          if(Janus.safariVp8) {\n            Janus.log('This version of Safari supports VP8')\n          } else {\n            Janus.warn('This version of Safari does NOT support VP8: if you\\'re using a Technology Preview, ' +\n              'try enabling the \\'WebRTC VP8 codec\\' setting in the \\'Experimental Features\\' Develop menu')\n          }\n          testpc.close()\n          testpc = null\n        })\n      }\n    }\n    // Check if this browser supports Unified Plan and transceivers\n    // Based on https://codepen.io/anon/pen/ZqLwWV?editors=0010\n    Janus.unifiedPlan = false\n    if(Janus.webRTCAdapter.browserDetails.browser === 'firefox' &&\n        Janus.webRTCAdapter.browserDetails.version >= 59) {\n      // Firefox definitely does, starting from version 59\n      Janus.unifiedPlan = true\n    } else if(Janus.webRTCAdapter.browserDetails.browser === 'chrome' &&\n        Janus.webRTCAdapter.browserDetails.version >= 72) {\n      // Chrome does, but it's only usable from version 72 on\n      Janus.unifiedPlan = true\n    } else if(!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) { // eslint-disable-line no-undef\n      // Safari supports addTransceiver() but not Unified Plan when\n      // currentDirection is not defined (see codepen above).\n      Janus.unifiedPlan = false\n    } else {\n      // Check if addTransceiver() throws an exception\n      var tempPc = new RTCPeerConnection()\n      try {\n        tempPc.addTransceiver('audio')\n        Janus.unifiedPlan = true\n      } catch (e) {}\n      tempPc.close()\n    }\n    Janus.initDone = true\n    options.callback()\n  }\n}\n\n// Helper method to check whether WebRTC is supported by this browser\nJanus.isWebrtcSupported = function() {\n  return !!window.RTCPeerConnection\n}\n// Helper method to check whether devices can be accessed by this browser (e.g., not possible via plain HTTP)\nJanus.isGetUserMediaAvailable = function() {\n  return navigator.mediaDevices && navigator.mediaDevices.getUserMedia\n}\n\n// Helper method to create random identifiers (e.g., transaction)\nJanus.randomString = function(len) {\n  var charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n  var randomString = ''\n  for (var i = 0; i < len; i++) {\n    var randomPoz = Math.floor(Math.random() * charSet.length)\n    randomString += charSet.substring(randomPoz,randomPoz+1)\n  }\n  return randomString\n}\n\nfunction Janus(gatewayCallbacks) {\n  gatewayCallbacks = gatewayCallbacks || {}\n  gatewayCallbacks.success = (typeof gatewayCallbacks.success == 'function') ? gatewayCallbacks.success : Janus.noop\n  gatewayCallbacks.error = (typeof gatewayCallbacks.error == 'function') ? gatewayCallbacks.error : Janus.noop\n  gatewayCallbacks.wsopened = (typeof gatewayCallbacks.wsopened == 'function') ? gatewayCallbacks.wsopened : Janus.noop\n  gatewayCallbacks.destroyed = (typeof gatewayCallbacks.destroyed == 'function') ? gatewayCallbacks.destroyed : Janus.noop\n  if(!Janus.initDone) {\n    gatewayCallbacks.error('Library not initialized')\n    return {}\n  }\n  if(!Janus.isWebrtcSupported()) {\n    gatewayCallbacks.error('WebRTC not supported by this browser')\n    return {}\n  }\n  Janus.log('Library initialized: ' + Janus.initDone)\n  if(!gatewayCallbacks.server) {\n    gatewayCallbacks.error('Invalid server url')\n    return {}\n  }\n  var websockets = false\n  var ws = null\n  var wsHandlers = {}\n  var wsKeepaliveTimeoutId = null\n  var servers = null\n  var serversIndex = 0\n  var server = gatewayCallbacks.server\n  if(Janus.isArray(server)) {\n    Janus.log('Multiple servers provided (' + server.length + '), will use the first that works')\n    server = null\n    servers = gatewayCallbacks.server\n    Janus.debug(servers)\n  } else {\n    if(server.indexOf('ws') === 0) {\n      websockets = true\n      Janus.log('Using WebSockets to contact Janus: ' + server)\n    } else {\n      websockets = false\n      Janus.log('Using REST API to contact Janus: ' + server)\n    }\n  }\n  var iceServers = gatewayCallbacks.iceServers || [{urls: 'stun:stun.l.google.com:19302'}]\n  var iceTransportPolicy = gatewayCallbacks.iceTransportPolicy\n  var bundlePolicy = gatewayCallbacks.bundlePolicy\n  // Whether IPv6 candidates should be gathered\n  var ipv6Support = (gatewayCallbacks.ipv6 === true)\n  // Whether we should enable the withCredentials flag for XHR requests\n  var withCredentials = false\n  if(gatewayCallbacks.withCredentials !== undefined && gatewayCallbacks.withCredentials !== null)\n    withCredentials = gatewayCallbacks.withCredentials === true\n  // Optional max events\n  var maxev = 10\n  if(gatewayCallbacks.max_poll_events !== undefined && gatewayCallbacks.max_poll_events !== null)\n    maxev = gatewayCallbacks.max_poll_events\n  if(maxev < 1)\n    maxev = 1\n  // Token to use (only if the token based authentication mechanism is enabled)\n  var token = null\n  if(gatewayCallbacks.token !== undefined && gatewayCallbacks.token !== null)\n    token = gatewayCallbacks.token\n  // API secret to use (only if the shared API secret is enabled)\n  var apisecret = null\n  if(gatewayCallbacks.apisecret !== undefined && gatewayCallbacks.apisecret !== null)\n    apisecret = gatewayCallbacks.apisecret\n  // Whether we should destroy this session when onbeforeunload is called\n  this.destroyOnUnload = true\n  if(gatewayCallbacks.destroyOnUnload !== undefined && gatewayCallbacks.destroyOnUnload !== null)\n    this.destroyOnUnload = (gatewayCallbacks.destroyOnUnload === true)\n  // Some timeout-related values\n  var keepAlivePeriod = 25000\n  if(gatewayCallbacks.keepAlivePeriod !== undefined && gatewayCallbacks.keepAlivePeriod !== null)\n    keepAlivePeriod = gatewayCallbacks.keepAlivePeriod\n  if(isNaN(keepAlivePeriod))\n    keepAlivePeriod = 25000\n  var longPollTimeout = 60000\n  if(gatewayCallbacks.longPollTimeout !== undefined && gatewayCallbacks.longPollTimeout !== null)\n    longPollTimeout = gatewayCallbacks.longPollTimeout\n  if(isNaN(longPollTimeout))\n    longPollTimeout = 60000\n\n  // overrides for default maxBitrate values for simulcasting\n  function getMaxBitrates(simulcastMaxBitrates) {\n    var maxBitrates = {\n      high: 900000,\n      medium: 300000,\n      low: 100000,\n    }\n\n    if (simulcastMaxBitrates !== undefined && simulcastMaxBitrates !== null) {\n      if (simulcastMaxBitrates.high)\n        maxBitrates.high = simulcastMaxBitrates.high\n      if (simulcastMaxBitrates.medium)\n        maxBitrates.medium = simulcastMaxBitrates.medium\n      if (simulcastMaxBitrates.low)\n        maxBitrates.low = simulcastMaxBitrates.low\n    }\n\n    return maxBitrates\n  }\n\n  var connected = false\n  var sessionId = null\n  var pluginHandles = {}\n  var that = this\n  var retries = 0\n  var transactions = {}\n  createSession(gatewayCallbacks)\n\n  // Public methods\n  this.getServer = function() { return server }\n  this.isConnected = function() { return connected }\n  this.reconnect = function(callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks['reconnect'] = true\n    createSession(callbacks)\n  }\n  this.getSessionId = function() { return sessionId }\n  this.getInfo = function(callbacks) { getInfo(callbacks) }\n  this.destroy = function(callbacks) { destroySession(callbacks) }\n  this.attach = function(callbacks) { createHandle(callbacks) }\n\n  function eventHandler() {\n    if(sessionId == null)\n      return\n    Janus.debug('Long poll...')\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      return\n    }\n    var longpoll = server + '/' + sessionId + '?rid=' + new Date().getTime()\n    if(maxev)\n      longpoll = longpoll + '&maxev=' + maxev\n    if(token)\n      longpoll = longpoll + '&token=' + encodeURIComponent(token)\n    if(apisecret)\n      longpoll = longpoll + '&apisecret=' + encodeURIComponent(apisecret)\n    Janus.httpAPICall(longpoll, {\n      verb: 'GET',\n      withCredentials: withCredentials,\n      success: handleEvent,\n      timeout: longPollTimeout,\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown)\n        retries++\n        if(retries > 3) {\n          // Did we just lose the server? :-(\n          connected = false\n          gatewayCallbacks.error('Lost connection to the server (is it down?)')\n          return\n        }\n        eventHandler()\n      }\n    })\n  }\n\n  // Private event handler: this will trigger plugin callbacks, if set\n  function handleEvent(json, skipTimeout) {\n    retries = 0\n    if(!websockets && sessionId !== undefined && sessionId !== null && skipTimeout !== true)\n      eventHandler()\n    if(!websockets && Janus.isArray(json)) {\n      // We got an array: it means we passed a maxev > 1, iterate on all objects\n      for(var i=0; i<json.length; i++) {\n        handleEvent(json[i], true)\n      }\n      return\n    }\n\n    if (json.session_id && json.session_id !== sessionId) {\n      return\n    }\n\n    if(json['janus'] === 'keepalive') {\n      // Nothing happened\n      Janus.vdebug('Got a keepalive on session ' + sessionId)\n      return\n    } else if(json['janus'] === 'server_info') {\n      // Just info on the Janus instance\n      Janus.debug('Got info on the Janus instance')\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess)\n          reportSuccess(json)\n        delete transactions[transaction]\n      }\n      return\n    } else if(json['janus'] === 'ack') {\n      // Just an ack, we can probably ignore\n      Janus.debug('Got an ack on session ' + sessionId)\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess)\n          reportSuccess(json)\n        delete transactions[transaction]\n      }\n      return\n    } else if(json['janus'] === 'success') {\n      // Success!\n      Janus.debug('Got a success on session ' + sessionId)\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess)\n          reportSuccess(json)\n        delete transactions[transaction]\n      }\n      return\n    } else if(json['janus'] === 'trickle') {\n      // We got a trickle candidate from Janus\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      var candidate = json['candidate']\n      Janus.debug('Got a trickled candidate on session ' + sessionId)\n      Janus.debug(candidate)\n      var config = pluginHandle.webrtcStuff\n      if(config.pc && config.remoteSdp) {\n        // Add candidate right now\n        Janus.debug('Adding remote candidate:', candidate)\n        if(!candidate || candidate.completed === true) {\n          // end-of-candidates\n          config.pc.addIceCandidate(Janus.endOfCandidates)\n        } else {\n          // New candidate\n          config.pc.addIceCandidate(candidate)\n        }\n      } else {\n        // We didn't do setRemoteDescription (trickle got here before the offer?)\n        Janus.debug('We didn\\'t do setRemoteDescription (trickle got here before the offer?), caching candidate')\n        if(!config.candidates)\n          config.candidates = []\n        config.candidates.push(candidate)\n        Janus.debug(config.candidates)\n      }\n    } else if(json['janus'] === 'webrtcup') {\n      // The PeerConnection with the server is up! Notify this\n      Janus.debug('Got a webrtcup event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.webrtcState(true)\n      return\n    } else if(json['janus'] === 'hangup') {\n      // A plugin asked the core to hangup a PeerConnection on one of our handles\n      Janus.debug('Got a hangup event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.webrtcState(false, json['reason'])\n      pluginHandle.hangup()\n    } else if(json['janus'] === 'detached') {\n      // A plugin asked the core to detach one of our handles\n      Janus.debug('Got a detached event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        // Don't warn here because destroyHandle causes this situation.\n        return\n      }\n\n      // copied from our prev custom release, possibly a bug fix, maybe no longer necessary.\n      pluginHandle.detached = true\n\n      pluginHandle.ondetached()\n      pluginHandle.detach()\n    } else if(json['janus'] === 'media') {\n      // Media started/stopped flowing\n      Janus.debug('Got a media event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.mediaState(json['type'], json['receiving'])\n    } else if(json['janus'] === 'slowlink') {\n      Janus.debug('Got a slowlink event on session ' + sessionId)\n      Janus.debug(json)\n      // Trouble uplink or downlink\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.slowLink(json['uplink'], json['lost'])\n    } else if(json['janus'] === 'error') {\n      // Oops, something wrong happened\n      Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess) {\n          reportSuccess(json)\n        }\n        delete transactions[transaction]\n      }\n\n      if (json.error.code === 458) {\n        if (websockets) {\n          ws.close(3505, 'No such session')\n        }\n      }\n\n      return\n    } else if(json['janus'] === 'event') {\n      Janus.debug('Got a plugin event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var plugindata = json['plugindata']\n      if(!plugindata) {\n        Janus.warn('Missing plugindata...')\n        return\n      }\n      Janus.debug('  -- Event is coming from ' + sender + ' (' + plugindata['plugin'] + ')')\n      var data = plugindata['data']\n      Janus.debug(data)\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.warn('This handle is not attached to this session')\n        return\n      }\n      var jsep = json['jsep']\n      if(jsep) {\n        Janus.debug('Handling SDP as well...')\n        Janus.debug(jsep)\n      }\n      var callback = pluginHandle.onmessage\n      if(callback) {\n        Janus.debug('Notifying application...')\n        // Send to callback specified when attaching plugin handle\n        callback(data, jsep)\n      } else {\n        // Send to generic callback (?)\n        Janus.debug('No provided notification callback')\n      }\n    } else if(json['janus'] === 'timeout') {\n      Janus.error('Timeout on session ' + sessionId)\n      Janus.debug(json)\n      if (websockets) {\n        ws.close(3504, 'Gateway timeout')\n      }\n      return\n    } else {\n      Janus.warn('Unknown message/event  \\'' + json['janus'] + '\\' on session ' + sessionId)\n      Janus.debug(json)\n    }\n  }\n\n  // Private helper to send keep-alive messages on WebSockets\n  function keepAlive() {\n    if(!server || !websockets || !connected)\n      return\n    wsKeepaliveTimeoutId = setTimeout(keepAlive, keepAlivePeriod)\n    var request = { 'janus': 'keepalive', 'session_id': sessionId, 'transaction': Janus.randomString(12) }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    ws.send(JSON.stringify(request))\n  }\n\n  // Private method to create a session\n  function createSession(callbacks) {\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'create', 'transaction': transaction }\n    if(callbacks['reconnect']) {\n      // We're reconnecting, claim the session\n      connected = false\n      request['janus'] = 'claim'\n      request['session_id'] = sessionId\n      // If we were using websockets, ignore the old connection\n      if(ws) {\n        ws.onopen = null\n        ws.onerror = null\n        ws.onclose = null\n        if(wsKeepaliveTimeoutId) {\n          clearTimeout(wsKeepaliveTimeoutId)\n          wsKeepaliveTimeoutId = null\n        }\n      }\n    }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(!server && Janus.isArray(servers)) {\n      // We still need to find a working server from the list we were given\n      server = servers[serversIndex]\n      if(server.indexOf('ws') === 0) {\n        websockets = true\n        Janus.log('Server #' + (serversIndex+1) + ': trying WebSockets to contact Janus (' + server + ')')\n      } else {\n        websockets = false\n        Janus.log('Server #' + (serversIndex+1) + ': trying REST API to contact Janus (' + server + ')')\n      }\n    }\n    if(websockets) {\n      ws = Janus.newWebSocket(server, 'janus-protocol')\n      wsHandlers = {\n        'error': function() {\n          Janus.error('Error connecting to the Janus WebSockets server... ' + server)\n          if (Janus.isArray(servers) && !callbacks['reconnect']) {\n            serversIndex++\n            if (serversIndex === servers.length) {\n              // We tried all the servers the user gave us and they all failed\n              callbacks.error('Error connecting to any of the provided Janus servers: Is the server down?')\n              return\n            }\n            // Let's try the next server\n            server = null\n            setTimeout(function() {\n              createSession(callbacks)\n            }, 200)\n            return\n          }\n          callbacks.error('Error connecting to the Janus WebSockets server: Is the server down?')\n        },\n\n        'open': function() {\n          callbacks.wsopened()\n\n          // We need to be notified about the success\n          transactions[transaction] = function(json) {\n            Janus.debug(json)\n            if (json['janus'] !== 'success') {\n              Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n              callbacks.error(json['error'].reason)\n              return\n            }\n            wsKeepaliveTimeoutId = setTimeout(keepAlive, keepAlivePeriod)\n            connected = true\n            sessionId = json['session_id'] ? json['session_id'] : json.data['id']\n            if(callbacks['reconnect']) {\n              Janus.log('Claimed session: ' + sessionId)\n            } else {\n              Janus.log('Created session: ' + sessionId)\n            }\n            Janus.sessions[sessionId] = that\n            callbacks.success()\n          }\n          ws.send(JSON.stringify(request))\n        },\n\n        'message': function(event) {\n          handleEvent(JSON.parse(event.data))\n        },\n\n        'close': function() {\n          if (!server || !connected) {\n            return\n          }\n          connected = false\n          // FIXME What if this is called when the page is closed?\n          gatewayCallbacks.error('Lost connection to the server (is it down?)')\n        }\n      }\n\n      for(var eventName in wsHandlers) {\n        ws.addEventListener(eventName, wsHandlers[eventName])\n      }\n\n      return\n    }\n    Janus.httpAPICall(server, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          callbacks.error(json['error'].reason)\n          return\n        }\n        connected = true\n        sessionId = json['session_id'] ? json['session_id'] : json.data['id']\n        if(callbacks['reconnect']) {\n          Janus.log('Claimed session: ' + sessionId)\n        } else {\n          Janus.log('Created session: ' + sessionId)\n        }\n        Janus.sessions[sessionId] = that\n        eventHandler()\n        callbacks.success()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        if(Janus.isArray(servers) && !callbacks['reconnect']) {\n          serversIndex++\n          if(serversIndex === servers.length) {\n            // We tried all the servers the user gave us and they all failed\n            callbacks.error('Error connecting to any of the provided Janus servers: Is the server down?')\n            return\n          }\n          // Let's try the next server\n          server = null\n          setTimeout(function() { createSession(callbacks) }, 200)\n          return\n        }\n        if(errorThrown === '')\n          callbacks.error(textStatus + ': Is the server down?')\n        else\n          callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to get info on the server\n  function getInfo(callbacks) {\n    callbacks = callbacks || {}\n    // FIXME This method triggers a success even when we fail\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    Janus.log('Getting info on Janus instance')\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    // We just need to send an \"info\" request\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'info', 'transaction': transaction }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(websockets) {\n      transactions[transaction] = function(json) {\n        Janus.log('Server info:')\n        Janus.debug(json)\n        if(json['janus'] !== 'server_info') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        callbacks.success(json)\n      }\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.log('Server info:')\n        Janus.debug(json)\n        if(json['janus'] !== 'server_info') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        callbacks.success(json)\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        if(errorThrown === '')\n          callbacks.error(textStatus + ': Is the server down?')\n        else\n          callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to destroy a session\n  function destroySession(callbacks) {\n    callbacks = callbacks || {}\n    // FIXME This method triggers a success even when we fail\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var unload = (callbacks.unload === true)\n    var notifyDestroyed = true\n    if(callbacks.notifyDestroyed !== undefined && callbacks.notifyDestroyed !== null)\n      notifyDestroyed = (callbacks.notifyDestroyed === true)\n    var cleanupHandles = (callbacks.cleanupHandles === true)\n    Janus.log('Destroying session ' + sessionId + ' (unload=' + unload + ')')\n    if(!sessionId) {\n      Janus.warn('No session to destroy')\n      callbacks.success()\n      if(notifyDestroyed)\n        gatewayCallbacks.destroyed()\n      return\n    }\n    if(cleanupHandles) {\n      for(var handleId in pluginHandles)\n        destroyHandle(handleId, { noRequest: true })\n    }\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      sessionId = null\n      callbacks.success()\n      return\n    }\n    // No need to destroy all handles first, Janus will do that itself\n    var request = { 'janus': 'destroy', 'transaction': Janus.randomString(12) }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(unload) {\n      // We're unloading the page: use sendBeacon for HTTP instead,\n      // or just close the WebSocket connection if we're using that\n      if(websockets) {\n        ws.onclose = null\n        ws.close()\n        ws = null\n      } else {\n        navigator.sendBeacon(server + '/' + sessionId, JSON.stringify(request))\n      }\n      Janus.log('Destroyed session:')\n      sessionId = null\n      connected = false\n      callbacks.success()\n      if(notifyDestroyed)\n        gatewayCallbacks.destroyed()\n      return\n    }\n    if(websockets) {\n      request['session_id'] = sessionId\n\n      var unbindWebSocket = function() {\n        for(var eventName in wsHandlers) {\n          ws.removeEventListener(eventName, wsHandlers[eventName])\n        }\n        ws.removeEventListener('message', onUnbindMessage)\n        ws.removeEventListener('error', onUnbindError)\n        if(wsKeepaliveTimeoutId) {\n          clearTimeout(wsKeepaliveTimeoutId)\n        }\n        ws.close()\n      }\n\n      var onUnbindMessage = function(event){\n        var data = JSON.parse(event.data)\n        if(data.session_id == request.session_id && data.transaction == request.transaction) {\n          unbindWebSocket()\n          callbacks.success()\n          if(notifyDestroyed)\n            gatewayCallbacks.destroyed()\n        }\n      }\n      var onUnbindError = function(event) {\n        unbindWebSocket()\n        callbacks.error('Failed to destroy the server: Is the server down?')\n        if(notifyDestroyed)\n          gatewayCallbacks.destroyed()\n      }\n\n      ws.addEventListener('message', onUnbindMessage)\n      ws.addEventListener('error', onUnbindError)\n\n      if (ws.readyState === 1) {\n        ws.send(JSON.stringify(request))\n      } else {\n        onUnbindError()\n      }\n\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.log('Destroyed session:')\n        Janus.debug(json)\n        sessionId = null\n        connected = false\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        callbacks.success()\n        if(notifyDestroyed)\n          gatewayCallbacks.destroyed()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        // Reset everything anyway\n        sessionId = null\n        connected = false\n        callbacks.success()\n        if(notifyDestroyed)\n          gatewayCallbacks.destroyed()\n      }\n    })\n  }\n\n  // Private method to create a plugin handle\n  function createHandle(callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks.consentDialog = (typeof callbacks.consentDialog == 'function') ? callbacks.consentDialog : Janus.noop\n    callbacks.iceState = (typeof callbacks.iceState == 'function') ? callbacks.iceState : Janus.noop\n    callbacks.mediaState = (typeof callbacks.mediaState == 'function') ? callbacks.mediaState : Janus.noop\n    callbacks.webrtcState = (typeof callbacks.webrtcState == 'function') ? callbacks.webrtcState : Janus.noop\n    callbacks.slowLink = (typeof callbacks.slowLink == 'function') ? callbacks.slowLink : Janus.noop\n    callbacks.onmessage = (typeof callbacks.onmessage == 'function') ? callbacks.onmessage : Janus.noop\n    callbacks.onlocalstream = (typeof callbacks.onlocalstream == 'function') ? callbacks.onlocalstream : Janus.noop\n    callbacks.onremotestream = (typeof callbacks.onremotestream == 'function') ? callbacks.onremotestream : Janus.noop\n    callbacks.ondata = (typeof callbacks.ondata == 'function') ? callbacks.ondata : Janus.noop\n    callbacks.ondataopen = (typeof callbacks.ondataopen == 'function') ? callbacks.ondataopen : Janus.noop\n    callbacks.oncleanup = (typeof callbacks.oncleanup == 'function') ? callbacks.oncleanup : Janus.noop\n    callbacks.ondetached = (typeof callbacks.ondetached == 'function') ? callbacks.ondetached : Janus.noop\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    var plugin = callbacks.plugin\n    if(!plugin) {\n      Janus.error('Invalid plugin')\n      callbacks.error('Invalid plugin')\n      return\n    }\n    var opaqueId = callbacks.opaqueId\n    var handleToken = callbacks.token ? callbacks.token : token\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'attach', 'plugin': plugin, 'opaque_id': opaqueId, 'transaction': transaction }\n    if(handleToken)\n      request['token'] = handleToken\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(websockets) {\n      transactions[transaction] = function(json) {\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          callbacks.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason)\n          return\n        }\n        var handleId = json.data['id']\n        Janus.log('Created handle: ' + handleId)\n        var pluginHandle =\n          {\n            session : that,\n            plugin : plugin,\n            id : handleId,\n            token : handleToken,\n            detached : false,\n            webrtcStuff : {\n              started : false,\n              myStream : null,\n              streamExternal : false,\n              remoteStream : null,\n              mySdp : null,\n              mediaConstraints : null,\n              pc : null,\n              dataChannel : {},\n              dtmfSender : null,\n              trickle : true,\n              iceDone : false,\n              volume : {\n                value : null,\n                timer : null\n              },\n              bitrate : {\n                value : null,\n                bsnow : null,\n                bsbefore : null,\n                tsnow : null,\n                tsbefore : null,\n                timer : null\n              }\n            },\n            getId : function() { return handleId },\n            getPlugin : function() { return plugin },\n            getVolume : function() { return getVolume(handleId, true) },\n            getRemoteVolume : function() { return getVolume(handleId, true) },\n            getLocalVolume : function() { return getVolume(handleId, false) },\n            isAudioMuted : function() { return isMuted(handleId, false) },\n            muteAudio : function() { return mute(handleId, false, true) },\n            unmuteAudio : function() { return mute(handleId, false, false) },\n            isVideoMuted : function() { return isMuted(handleId, true) },\n            muteVideo : function() { return mute(handleId, true, true) },\n            unmuteVideo : function() { return mute(handleId, true, false) },\n            getBitrate : function() { return getBitrate(handleId) },\n            send : function(callbacks) { sendMessage(handleId, callbacks) },\n            data : function(callbacks) { sendData(handleId, callbacks) },\n            dtmf : function(callbacks) { sendDtmf(handleId, callbacks) },\n            consentDialog : callbacks.consentDialog,\n            iceState : callbacks.iceState,\n            mediaState : callbacks.mediaState,\n            webrtcState : callbacks.webrtcState,\n            slowLink : callbacks.slowLink,\n            onmessage : callbacks.onmessage,\n            createOffer : function(callbacks) { prepareWebrtc(handleId, true, callbacks) },\n            createAnswer : function(callbacks) { prepareWebrtc(handleId, false, callbacks) },\n            handleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks) },\n            onlocalstream : callbacks.onlocalstream,\n            onremotestream : callbacks.onremotestream,\n            ontrackmuted : callbacks.ontrackmuted,\n            ontrackunmuted : callbacks.ontrackunmuted,\n            ondata : callbacks.ondata,\n            ondataopen : callbacks.ondataopen,\n            oncleanup : callbacks.oncleanup,\n            ondetached : callbacks.ondetached,\n            hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true) },\n            detach : function(callbacks) { destroyHandle(handleId, callbacks) }\n          }\n        pluginHandles[handleId] = pluginHandle\n        callbacks.success(pluginHandle)\n      }\n      request['session_id'] = sessionId\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          callbacks.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason)\n          return\n        }\n        var handleId = json.data['id']\n        Janus.log('Created handle: ' + handleId)\n        var pluginHandle =\n          {\n            session : that,\n            plugin : plugin,\n            id : handleId,\n            token : handleToken,\n            detached : false,\n            webrtcStuff : {\n              started : false,\n              myStream : null,\n              streamExternal : false,\n              remoteStream : null,\n              mySdp : null,\n              mediaConstraints : null,\n              pc : null,\n              dataChannel : {},\n              dtmfSender : null,\n              trickle : true,\n              iceDone : false,\n              volume : {\n                value : null,\n                timer : null\n              },\n              bitrate : {\n                value : null,\n                bsnow : null,\n                bsbefore : null,\n                tsnow : null,\n                tsbefore : null,\n                timer : null\n              }\n            },\n            getId : function() { return handleId },\n            getPlugin : function() { return plugin },\n            getVolume : function() { return getVolume(handleId, true) },\n            getRemoteVolume : function() { return getVolume(handleId, true) },\n            getLocalVolume : function() { return getVolume(handleId, false) },\n            isAudioMuted : function() { return isMuted(handleId, false) },\n            muteAudio : function() { return mute(handleId, false, true) },\n            unmuteAudio : function() { return mute(handleId, false, false) },\n            isVideoMuted : function() { return isMuted(handleId, true) },\n            muteVideo : function() { return mute(handleId, true, true) },\n            unmuteVideo : function() { return mute(handleId, true, false) },\n            getBitrate : function() { return getBitrate(handleId) },\n            send : function(callbacks) { sendMessage(handleId, callbacks) },\n            data : function(callbacks) { sendData(handleId, callbacks) },\n            dtmf : function(callbacks) { sendDtmf(handleId, callbacks) },\n            consentDialog : callbacks.consentDialog,\n            iceState : callbacks.iceState,\n            mediaState : callbacks.mediaState,\n            webrtcState : callbacks.webrtcState,\n            slowLink : callbacks.slowLink,\n            onmessage : callbacks.onmessage,\n            createOffer : function(callbacks) { prepareWebrtc(handleId, true, callbacks) },\n            createAnswer : function(callbacks) { prepareWebrtc(handleId, false, callbacks) },\n            handleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks) },\n            onlocalstream : callbacks.onlocalstream,\n            onremotestream : callbacks.onremotestream,\n            ontrackmuted : callbacks.ontrackmuted,\n            ontrackunmuted : callbacks.ontrackunmuted,\n            ondata : callbacks.ondata,\n            ondataopen : callbacks.ondataopen,\n            oncleanup : callbacks.oncleanup,\n            ondetached : callbacks.ondetached,\n            hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true) },\n            detach : function(callbacks) { destroyHandle(handleId, callbacks) }\n          }\n        pluginHandles[handleId] = pluginHandle\n        callbacks.success(pluginHandle)\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        if(errorThrown === '')\n          callbacks.error(textStatus + ': Is the server down?')\n        else\n          callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to send a message\n  function sendMessage(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var message = callbacks.message\n    var jsep = callbacks.jsep\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'message', 'body': message, 'transaction': transaction }\n    if(pluginHandle.token)\n      request['token'] = pluginHandle.token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(jsep) {\n      request.jsep = {\n        type: jsep.type,\n        sdp: jsep.sdp\n      }\n      if(jsep.e2ee)\n        request.jsep.e2ee = true\n      if(jsep.rid_order === 'hml' || jsep.rid_order === 'lmh')\n        request.jsep.rid_order = jsep.rid_order\n    }\n    Janus.debug('Sending message to plugin (handle=' + handleId + '):')\n    Janus.debug(request)\n    if(websockets) {\n      request['session_id'] = sessionId\n      request['handle_id'] = handleId\n      transactions[transaction] = function(json) {\n        Janus.debug('Message sent!')\n        Janus.debug(json)\n        if(json['janus'] === 'success') {\n          // We got a success, must have been a synchronous transaction\n          var plugindata = json['plugindata']\n          if(!plugindata) {\n            Janus.warn('Request succeeded, but missing plugindata...')\n            callbacks.success()\n            return\n          }\n          Janus.log('Synchronous transaction successful (' + plugindata['plugin'] + ')')\n          var data = plugindata['data']\n          Janus.debug(data)\n          callbacks.success(data)\n          return\n        } else if(json['janus'] !== 'ack') {\n          // Not a success and not an ack, must be an error\n          if(json['error']) {\n            Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n            callbacks.error(json['error'].code + ' ' + json['error'].reason)\n          } else {\n            Janus.error('Unknown error') // FIXME\n            callbacks.error('Unknown error')\n          }\n          return\n        }\n        // If we got here, the plugin decided to handle the request asynchronously\n        callbacks.success()\n      }\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.debug('Message sent!')\n        Janus.debug(json)\n        if(json['janus'] === 'success') {\n          // We got a success, must have been a synchronous transaction\n          var plugindata = json['plugindata']\n          if(!plugindata) {\n            Janus.warn('Request succeeded, but missing plugindata...')\n            callbacks.success()\n            return\n          }\n          Janus.log('Synchronous transaction successful (' + plugindata['plugin'] + ')')\n          var data = plugindata['data']\n          Janus.debug(data)\n          callbacks.success(data)\n          return\n        } else if(json['janus'] !== 'ack') {\n          // Not a success and not an ack, must be an error\n          if(json['error']) {\n            Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n            callbacks.error(json['error'].code + ' ' + json['error'].reason)\n          } else {\n            Janus.error('Unknown error') // FIXME\n            callbacks.error('Unknown error')\n          }\n          return\n        }\n        // If we got here, the plugin decided to handle the request asynchronously\n        callbacks.success()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to send a trickle candidate\n  function sendTrickleCandidate(handleId, candidate) {\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      return\n    }\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return\n    }\n    var request = { 'janus': 'trickle', 'candidate': candidate, 'transaction': Janus.randomString(12) }\n    if(pluginHandle.token)\n      request['token'] = pluginHandle.token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    Janus.vdebug('Sending trickle candidate (handle=' + handleId + '):')\n    Janus.vdebug(request)\n    if(websockets) {\n      request['session_id'] = sessionId\n      request['handle_id'] = handleId\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.vdebug('Candidate sent!')\n        Janus.vdebug(json)\n        if(json['janus'] !== 'ack') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          return\n        }\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n      }\n    })\n  }\n\n  // Private method to create a data channel\n  function createDataChannel(handleId, dclabel, dcprotocol, incoming, pendingData) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc) {\n      Janus.warn('Invalid PeerConnection')\n      return\n    }\n    var onDataChannelMessage = function(event) {\n      var label = event.target.label\n      pluginHandle.ondata(event.data, label)\n    }\n    var onDataChannelStateChange = function(event) {\n      Janus.log('Received state change on data channel:', event)\n      var label = event.target.label\n      var protocol = event.target.protocol\n      var dcState = config.dataChannel[label] ? config.dataChannel[label].readyState : 'null'\n      Janus.log('State change on <' + label + '> data channel: ' + dcState)\n      if(dcState === 'open') {\n        // Any pending messages to send?\n        if(config.dataChannel[label].pending && config.dataChannel[label].pending.length > 0) {\n          Janus.log('Sending pending messages on <' + label + '>:', config.dataChannel[label].pending.length)\n          for(var data of config.dataChannel[label].pending) {\n            Janus.log('Sending data on data channel <' + label + '>')\n            Janus.debug(data)\n            config.dataChannel[label].send(data)\n          }\n          config.dataChannel[label].pending = []\n        }\n        // Notify the open data channel\n        pluginHandle.ondataopen(label, protocol)\n      }\n    }\n    var onDataChannelError = function(error) {\n      Janus.error('Got error on data channel:', error)\n      // TODO\n    }\n    if(!incoming) {\n      // FIXME Add options (ordered, maxRetransmits, etc.)\n      var dcoptions = { ordered: true }\n      if(dcprotocol)\n        dcoptions.protocol = dcprotocol\n      config.dataChannel[dclabel] = config.pc.createDataChannel(dclabel, dcoptions)\n    } else {\n      // The channel was created by Janus\n      config.dataChannel[dclabel] = incoming\n    }\n    config.dataChannel[dclabel].onmessage = onDataChannelMessage\n    config.dataChannel[dclabel].onopen = onDataChannelStateChange\n    config.dataChannel[dclabel].onclose = onDataChannelStateChange\n    config.dataChannel[dclabel].onerror = onDataChannelError\n    config.dataChannel[dclabel].pending = []\n    if(pendingData)\n      config.dataChannel[dclabel].pending.push(pendingData)\n  }\n\n  // Private method to send a data channel message\n  function sendData(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    var data = callbacks.text || callbacks.data\n    if(!data) {\n      Janus.warn('Invalid data')\n      callbacks.error('Invalid data')\n      return\n    }\n    var label = callbacks.label ? callbacks.label : Janus.dataChanDefaultLabel\n    if(!config.dataChannel[label]) {\n      // Create new data channel and wait for it to open\n      createDataChannel(handleId, label, callbacks.protocol, false, data, callbacks.protocol)\n      callbacks.success()\n      return\n    }\n    if(config.dataChannel[label].readyState !== 'open') {\n      config.dataChannel[label].pending.push(data)\n      callbacks.success()\n      return\n    }\n    Janus.log('Sending data on data channel <' + label + '>')\n    Janus.debug(data)\n    config.dataChannel[label].send(data)\n    callbacks.success()\n  }\n\n  // Private method to send a DTMF tone\n  function sendDtmf(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.dtmfSender) {\n      // Create the DTMF sender the proper way, if possible\n      if(config.pc) {\n        var senders = config.pc.getSenders()\n        var audioSender = senders.find(function(sender) {\n          return sender.track && sender.track.kind === 'audio'\n        })\n        if(!audioSender) {\n          Janus.warn('Invalid DTMF configuration (no audio track)')\n          callbacks.error('Invalid DTMF configuration (no audio track)')\n          return\n        }\n        config.dtmfSender = audioSender.dtmf\n        if(config.dtmfSender) {\n          Janus.log('Created DTMF Sender')\n          config.dtmfSender.ontonechange = function(tone) { Janus.debug('Sent DTMF tone: ' + tone.tone) }\n        }\n      }\n      if(!config.dtmfSender) {\n        Janus.warn('Invalid DTMF configuration')\n        callbacks.error('Invalid DTMF configuration')\n        return\n      }\n    }\n    var dtmf = callbacks.dtmf\n    if(!dtmf) {\n      Janus.warn('Invalid DTMF parameters')\n      callbacks.error('Invalid DTMF parameters')\n      return\n    }\n    var tones = dtmf.tones\n    if(!tones) {\n      Janus.warn('Invalid DTMF string')\n      callbacks.error('Invalid DTMF string')\n      return\n    }\n    var duration = (typeof dtmf.duration === 'number') ? dtmf.duration : 500 // We choose 500ms as the default duration for a tone\n    var gap = (typeof dtmf.gap === 'number') ? dtmf.gap : 50 // We choose 50ms as the default gap between tones\n    Janus.debug('Sending DTMF string ' + tones + ' (duration ' + duration + 'ms, gap ' + gap + 'ms)')\n    config.dtmfSender.insertDTMF(tones, duration, gap)\n    callbacks.success()\n  }\n\n  // Private method to destroy a plugin handle\n  function destroyHandle(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var noRequest = (callbacks.noRequest === true)\n    Janus.log('Destroying handle ' + handleId + ' (only-locally=' + noRequest + ')')\n    cleanupWebrtc(handleId)\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || pluginHandle.detached) {\n      // Plugin was already detached by Janus, calling detach again will return a handle not found error, so just exit here\n      delete pluginHandles[handleId]\n      callbacks.success()\n      return\n    }\n    pluginHandle.detached = true\n    if(noRequest) {\n      // We're only removing the handle locally\n      delete pluginHandles[handleId]\n      callbacks.success()\n      return\n    }\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    var request = { 'janus': 'detach', 'transaction': Janus.randomString(12) }\n    if(pluginHandle.token)\n      request['token'] = pluginHandle.token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(websockets) {\n      request['session_id'] = sessionId\n      request['handle_id'] = handleId\n      ws.send(JSON.stringify(request))\n      delete pluginHandles[handleId]\n      callbacks.success()\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.log('Destroyed handle:')\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        delete pluginHandles[handleId]\n        callbacks.success()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        // We cleanup anyway\n        delete pluginHandles[handleId]\n        callbacks.success()\n      }\n    })\n  }\n\n  // WebRTC stuff\n  function streamsDone(handleId, jsep, media, callbacks, stream) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      // Close all tracks if the given stream has been created internally\n      if(!callbacks.stream) {\n        Janus.stopAllTracks(stream)\n      }\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    Janus.debug('streamsDone:', stream)\n    if(stream) {\n      Janus.debug('  -- Audio tracks:', stream.getAudioTracks())\n      Janus.debug('  -- Video tracks:', stream.getVideoTracks())\n    }\n    // We're now capturing the new stream: check if we're updating or if it's a new thing\n    var addTracks = false\n    if(!config.myStream || !media.update || (config.streamExternal && !media.replaceAudio && !media.replaceVideo)) {\n      config.myStream = stream\n      addTracks = true\n    } else {\n      // We only need to update the existing stream\n      if(((!media.update && isAudioSendEnabled(media)) || (media.update && (media.addAudio || media.replaceAudio))) &&\n          stream.getAudioTracks() && stream.getAudioTracks().length) {\n        config.myStream.addTrack(stream.getAudioTracks()[0])\n        if(Janus.unifiedPlan) {\n          // Use Transceivers\n          Janus.log((media.replaceAudio ? 'Replacing' : 'Adding') + ' audio track:', stream.getAudioTracks()[0])\n          var audioTransceiver = null\n          var transceivers = config.pc.getTransceivers()\n          if(transceivers && transceivers.length > 0) {\n            for(var t of transceivers) {\n              if((t.sender && t.sender.track && t.sender.track.kind === 'audio') ||\n                  (t.receiver && t.receiver.track && t.receiver.track.kind === 'audio')) {\n                audioTransceiver = t\n                break\n              }\n            }\n          }\n          if(audioTransceiver && audioTransceiver.sender) {\n            audioTransceiver.sender.replaceTrack(stream.getAudioTracks()[0])\n          } else {\n            config.pc.addTrack(stream.getAudioTracks()[0], stream)\n          }\n        } else {\n          Janus.log((media.replaceAudio ? 'Replacing' : 'Adding') + ' audio track:', stream.getAudioTracks()[0])\n          config.pc.addTrack(stream.getAudioTracks()[0], stream)\n        }\n      }\n      if(((!media.update && isVideoSendEnabled(media)) || (media.update && (media.addVideo || media.replaceVideo))) &&\n          stream.getVideoTracks() && stream.getVideoTracks().length) {\n        config.myStream.addTrack(stream.getVideoTracks()[0])\n        if(Janus.unifiedPlan) {\n          // Use Transceivers\n          Janus.log((media.replaceVideo ? 'Replacing' : 'Adding') + ' video track:', stream.getVideoTracks()[0])\n          var videoTransceiver = null\n          var transceivers = config.pc.getTransceivers()\n          if(transceivers && transceivers.length > 0) {\n            for(var t of transceivers) {\n              if((t.sender && t.sender.track && t.sender.track.kind === 'video') ||\n                  (t.receiver && t.receiver.track && t.receiver.track.kind === 'video')) {\n                videoTransceiver = t\n                break\n              }\n            }\n          }\n          if(videoTransceiver && videoTransceiver.sender) {\n            videoTransceiver.sender.replaceTrack(stream.getVideoTracks()[0])\n          } else {\n            config.pc.addTrack(stream.getVideoTracks()[0], stream)\n          }\n        } else {\n          Janus.log((media.replaceVideo ? 'Replacing' : 'Adding') + ' video track:', stream.getVideoTracks()[0])\n          config.pc.addTrack(stream.getVideoTracks()[0], stream)\n        }\n      }\n    }\n    // If we still need to create a PeerConnection, let's do that\n    if(!config.pc) {\n      var pc_config = {'iceServers': iceServers, 'iceTransportPolicy': iceTransportPolicy, 'bundlePolicy': bundlePolicy}\n      if(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n        // For Chrome versions before 72, we force a plan-b semantic, and unified-plan otherwise\n        pc_config['sdpSemantics'] = (Janus.webRTCAdapter.browserDetails.version < 72) ? 'plan-b' : 'unified-plan'\n      }\n      var pc_constraints = {\n        'optional': [{'DtlsSrtpKeyAgreement': true}]\n      }\n      if(ipv6Support) {\n        pc_constraints.optional.push({'googIPv6':true})\n      }\n      // Any custom constraint to add?\n      if(callbacks.rtcConstraints && typeof callbacks.rtcConstraints === 'object') {\n        Janus.debug('Adding custom PeerConnection constraints:', callbacks.rtcConstraints)\n        for(var i in callbacks.rtcConstraints) {\n          pc_constraints.optional.push(callbacks.rtcConstraints[i])\n        }\n      }\n      if(Janus.webRTCAdapter.browserDetails.browser === 'edge') {\n        // This is Edge, enable BUNDLE explicitly\n        pc_config.bundlePolicy = 'max-bundle'\n      }\n      // Check if a sender or receiver transform has been provided\n      if(RTCRtpSender && (RTCRtpSender.prototype.createEncodedStreams ||\n          (RTCRtpSender.prototype.createEncodedAudioStreams &&\n          RTCRtpSender.prototype.createEncodedVideoStreams)) &&\n          (callbacks.senderTransforms || callbacks.receiverTransforms)) {\n        config.senderTransforms = callbacks.senderTransforms\n        config.receiverTransforms = callbacks.receiverTransforms\n        pc_config['forceEncodedAudioInsertableStreams'] = true\n        pc_config['forceEncodedVideoInsertableStreams'] = true\n        pc_config['encodedInsertableStreams'] = true\n      }\n      Janus.log('Creating PeerConnection')\n      Janus.debug(pc_constraints)\n      config.pc = new RTCPeerConnection(pc_config, pc_constraints)\n      Janus.debug(config.pc)\n      if(config.pc.getStats) { // FIXME\n        config.volume = {}\n      }\n      Janus.log('Preparing local SDP and gathering candidates (trickle=' + config.trickle + ')')\n      config.pc.oniceconnectionstatechange = function(e) {\n        if(config.pc)\n          pluginHandle.iceState(config.pc.iceConnectionState)\n      }\n      config.pc.onicecandidate = function(event) {\n        if (!event.candidate ||\n            (Janus.webRTCAdapter.browserDetails.browser === 'edge' && event.candidate.candidate.indexOf('endOfCandidates') > 0)) {\n          Janus.log('End of candidates.')\n          config.iceDone = true\n          if(config.trickle === true) {\n            // Notify end of candidates\n            sendTrickleCandidate(handleId, {'completed': true})\n          } else {\n            // No trickle, time to send the complete SDP (including all candidates)\n            sendSDP(handleId, callbacks)\n          }\n        } else {\n          // JSON.stringify doesn't work on some WebRTC objects anymore\n          // See https://code.google.com/p/chromium/issues/detail?id=467366\n          var candidate = {\n            'candidate': event.candidate.candidate,\n            'sdpMid': event.candidate.sdpMid,\n            'sdpMLineIndex': event.candidate.sdpMLineIndex\n          }\n          if(config.trickle === true) {\n            // Send candidate\n            sendTrickleCandidate(handleId, candidate)\n          }\n        }\n      }\n      config.pc.ontrack = function(event) {\n        Janus.log('Handling Remote Track')\n        Janus.debug(event)\n        if(!event.streams)\n          return\n        config.remoteStream = event.streams[0]\n        pluginHandle.onremotestream(config.remoteStream)\n        if(event.track.onended)\n          return\n        if(config.receiverTransforms) {\n          var receiverStreams = null\n          if(RTCRtpSender.prototype.createEncodedStreams) {\n            receiverStreams = event.receiver.createEncodedStreams()\n          } else if(RTCRtpSender.prototype.createAudioEncodedStreams || RTCRtpSender.prototype.createEncodedVideoStreams) {\n            if(event.track.kind === 'audio' && config.receiverTransforms['audio']) {\n              receiverStreams = event.receiver.createEncodedAudioStreams()\n            } else if(event.track.kind === 'video' && config.receiverTransforms['video']) {\n              receiverStreams = event.receiver.createEncodedVideoStreams()\n            }\n          }\n          if(receiverStreams) {\n            console.log(receiverStreams)\n            if(receiverStreams.readableStream && receiverStreams.writableStream) {\n              receiverStreams.readableStream\n                .pipeThrough(config.receiverTransforms[event.track.kind])\n                .pipeTo(receiverStreams.writableStream)\n            } else if(receiverStreams.readable && receiverStreams.writable) {\n              receiverStreams.readable\n                .pipeThrough(config.receiverTransforms[event.track.kind])\n                .pipeTo(receiverStreams.writable)\n            }\n          }\n        }\n        var trackMutedTimeoutId = null\n        Janus.log('Adding onended callback to track:', event.track)\n        event.track.onended = function(ev) {\n          Janus.log('Remote track removed:', ev)\n          if(config.remoteStream) {\n            clearTimeout(trackMutedTimeoutId)\n            config.remoteStream.removeTrack(ev.target)\n            pluginHandle.onremotestream(config.remoteStream)\n          }\n        }\n        event.track.onmute = function(ev) {\n          Janus.log('Remote track muted:', ev)\n          if(config.remoteStream && trackMutedTimeoutId == null) {\n            trackMutedTimeoutId = setTimeout(function() {\n              Janus.log('Removing remote track')\n              if (config.remoteStream) {\n                config.remoteStream.removeTrack(ev.target)\n                pluginHandle.onremotestream(config.remoteStream)\n                pluginHandle.ontrackmuted()\n              }\n              trackMutedTimeoutId = null\n            // Chrome seems to raise mute events only at multiples of 834ms;\n            // we set the timeout to three times this value (rounded to 840ms)\n            }, 3 * 840)\n          }\n        }\n        event.track.onunmute = function(ev) {\n          Janus.log('Remote track flowing again:', ev)\n          if(trackMutedTimeoutId != null) {\n            clearTimeout(trackMutedTimeoutId)\n            trackMutedTimeoutId = null\n          } else {\n            try {\n              config.remoteStream.addTrack(ev.target)\n              pluginHandle.onremotestream(config.remoteStream)\n              pluginHandle.ontrackunmuted()\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        }\n      }\n    }\n    if(addTracks && stream) {\n      Janus.log('Adding local stream')\n      var simulcast2 = (callbacks.simulcast2 === true)\n      stream.getTracks().forEach(function(track) {\n        Janus.log('Adding local track:', track)\n        var sender = null\n        if(!simulcast2 || track.kind === 'audio') {\n          sender = config.pc.addTrack(track, stream)\n        } else {\n          Janus.log('Enabling rid-based simulcasting:', track)\n          var maxBitrates = getMaxBitrates(callbacks.simulcastMaxBitrates)\n          var tr = config.pc.addTransceiver(track, {\n            direction: 'sendrecv',\n            streams: [stream],\n            sendEncodings: callbacks.sendEncodings || [\n              { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n              { rid: 'm', active: true, maxBitrate: maxBitrates.medium, scaleResolutionDownBy: 2 },\n              { rid: 'l', active: true, maxBitrate: maxBitrates.low, scaleResolutionDownBy: 4 }\n            ]\n          })\n          if(tr)\n            sender = tr.sender\n        }\n        // Check if insertable streams are involved\n        if(sender && config.senderTransforms) {\n          var senderStreams = null\n          if(RTCRtpSender.prototype.createEncodedStreams) {\n            senderStreams = sender.createEncodedStreams()\n          } else if(RTCRtpSender.prototype.createAudioEncodedStreams || RTCRtpSender.prototype.createEncodedVideoStreams) {\n            if(sender.track.kind === 'audio' && config.senderTransforms['audio']) {\n              senderStreams = sender.createEncodedAudioStreams()\n            } else if(sender.track.kind === 'video' && config.senderTransforms['video']) {\n              senderStreams = sender.createEncodedVideoStreams()\n            }\n          }\n          if(senderStreams) {\n            console.log(senderStreams)\n            if(senderStreams.readableStream && senderStreams.writableStream) {\n              senderStreams.readableStream\n                .pipeThrough(config.senderTransforms[sender.track.kind])\n                .pipeTo(senderStreams.writableStream)\n            } else if(senderStreams.readable && senderStreams.writable) {\n              senderStreams.readable\n                .pipeThrough(config.senderTransforms[sender.track.kind])\n                .pipeTo(senderStreams.writable)\n            }\n          }\n        }\n      })\n    }\n    // Any data channel to create?\n    if(isDataEnabled(media) && !config.dataChannel[Janus.dataChanDefaultLabel]) {\n      Janus.log('Creating default data channel')\n      createDataChannel(handleId, Janus.dataChanDefaultLabel, null, false)\n      config.pc.ondatachannel = function(event) {\n        Janus.log('Data channel created by Janus:', event)\n        createDataChannel(handleId, event.channel.label, event.channel.protocol, event.channel)\n      }\n    }\n    // If there's a new local stream, let's notify the application\n    if(config.myStream) {\n      pluginHandle.onlocalstream(config.myStream)\n    }\n    // Create offer/answer now\n    if(!jsep) {\n      createOffer(handleId, media, callbacks)\n    } else {\n      // some firefox vs 420029 fix here, copied from our prev custom release\n      var oldsdp = jsep['sdp']\n      var pattern = /420029/gi\n      var newsdp = oldsdp.replace(pattern,'42e01f')\n      Janus.log(newsdp)\n      jsep['sdp'] = newsdp\n      config.pc.setRemoteDescription(jsep)\n        .then(function() {\n          Janus.log('Remote description accepted!')\n          config.remoteSdp = jsep.sdp\n          // Any trickle candidate we cached?\n          if(config.candidates && config.candidates.length > 0) {\n            for(var i = 0; i< config.candidates.length; i++) {\n              var candidate = config.candidates[i]\n              Janus.debug('Adding remote candidate:', candidate)\n              if(!candidate || candidate.completed === true) {\n                // end-of-candidates\n                config.pc.addIceCandidate(Janus.endOfCandidates)\n              } else {\n                // New candidate\n                config.pc.addIceCandidate(candidate)\n              }\n            }\n            config.candidates = []\n          }\n          // Create the answer now\n          createAnswer(handleId, media, callbacks)\n        }, callbacks.error)\n    }\n  }\n\n  function prepareWebrtc(handleId, offer, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : webrtcError\n    var jsep = callbacks.jsep\n    if(offer && jsep) {\n      Janus.error('Provided a JSEP to a createOffer')\n      callbacks.error('Provided a JSEP to a createOffer')\n      return\n    } else if(!offer && (!jsep || !jsep.type || !jsep.sdp)) {\n      Janus.error('A valid JSEP is required for createAnswer')\n      callbacks.error('A valid JSEP is required for createAnswer')\n      return\n    }\n    /* Check that callbacks.media is a (not null) Object */\n    callbacks.media = (typeof callbacks.media === 'object' && callbacks.media) ? callbacks.media : { audio: true, video: true }\n    var media = callbacks.media\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    config.trickle = isTrickleEnabled(callbacks.trickle)\n    // Are we updating a session?\n    if(!config.pc) {\n      // Nope, new PeerConnection\n      media.update = false\n      media.keepAudio = false\n      media.keepVideo = false\n    } else {\n      Janus.log('Updating existing media session')\n      media.update = true\n      // Check if there's anything to add/remove/replace, or if we\n      // can go directly to preparing the new SDP offer or answer\n      if(callbacks.stream) {\n        // External stream: is this the same as the one we were using before?\n        if(callbacks.stream !== config.myStream) {\n          Janus.log('Renegotiation involves a new external stream')\n        }\n      } else {\n        // Check if there are changes on audio\n        if(media.addAudio) {\n          media.keepAudio = false\n          media.replaceAudio = false\n          media.removeAudio = false\n          media.audioSend = true\n          if(config.myStream && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n            Janus.error('Can\\'t add audio stream, there already is one')\n            callbacks.error('Can\\'t add audio stream, there already is one')\n            return\n          }\n        } else if(media.removeAudio) {\n          media.keepAudio = false\n          media.replaceAudio = false\n          media.addAudio = false\n          media.audioSend = false\n        } else if(media.replaceAudio) {\n          media.keepAudio = false\n          media.addAudio = false\n          media.removeAudio = false\n          media.audioSend = true\n        }\n        if(!config.myStream) {\n          // No media stream: if we were asked to replace, it's actually an \"add\"\n          if(media.replaceAudio) {\n            media.keepAudio = false\n            media.replaceAudio = false\n            media.addAudio = true\n            media.audioSend = true\n          }\n          if(isAudioSendEnabled(media)) {\n            media.keepAudio = false\n            media.addAudio = true\n          }\n        } else {\n          if(!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n            // No audio track: if we were asked to replace, it's actually an \"add\"\n            if(media.replaceAudio) {\n              media.keepAudio = false\n              media.replaceAudio = false\n              media.addAudio = true\n              media.audioSend = true\n            }\n            if(isAudioSendEnabled(media)) {\n              media.keepAudio = false\n              media.addAudio = true\n            }\n          } else {\n            // We have an audio track: should we keep it as it is?\n            if(isAudioSendEnabled(media) &&\n                !media.removeAudio && !media.replaceAudio) {\n              media.keepAudio = true\n            }\n          }\n        }\n        // Check if there are changes on video\n        if(media.addVideo) {\n          media.keepVideo = false\n          media.replaceVideo = false\n          media.removeVideo = false\n          media.videoSend = true\n          if(config.myStream && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n            Janus.error('Can\\'t add video stream, there already is one')\n            callbacks.error('Can\\'t add video stream, there already is one')\n            return\n          }\n        } else if(media.removeVideo) {\n          media.keepVideo = false\n          media.replaceVideo = false\n          media.addVideo = false\n          media.videoSend = false\n        } else if(media.replaceVideo) {\n          media.keepVideo = false\n          media.addVideo = false\n          media.removeVideo = false\n          media.videoSend = true\n        }\n        if(!config.myStream) {\n          // No media stream: if we were asked to replace, it's actually an \"add\"\n          if(media.replaceVideo) {\n            media.keepVideo = false\n            media.replaceVideo = false\n            media.addVideo = true\n            media.videoSend = true\n          }\n          if(isVideoSendEnabled(media)) {\n            media.keepVideo = false\n            media.addVideo = true\n          }\n        } else {\n          if(!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n            // No video track: if we were asked to replace, it's actually an \"add\"\n            if(media.replaceVideo) {\n              media.keepVideo = false\n              media.replaceVideo = false\n              media.addVideo = true\n              media.videoSend = true\n            }\n            if(isVideoSendEnabled(media)) {\n              media.keepVideo = false\n              media.addVideo = true\n            }\n          } else {\n            // We have a video track: should we keep it as it is?\n            if(isVideoSendEnabled(media) && !media.removeVideo && !media.replaceVideo) {\n              media.keepVideo = true\n            }\n          }\n        }\n        // Data channels can only be added\n        if(media.addData) {\n          media.data = true\n        }\n      }\n      // If we're updating and keeping all tracks, let's skip the getUserMedia part\n      if((isAudioSendEnabled(media) && media.keepAudio) &&\n          (isVideoSendEnabled(media) && media.keepVideo)) {\n        pluginHandle.consentDialog(false)\n        streamsDone(handleId, jsep, media, callbacks, config.myStream)\n        return\n      }\n    }\n    // If we're updating, check if we need to remove/replace one of the tracks\n    if(media.update && (!config.streamExternal || (config.streamExternal && (media.replaceAudio || media.replaceVideo)))) {\n      if(media.removeAudio || media.replaceAudio) {\n        if(config.myStream && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n          var at = config.myStream.getAudioTracks()[0]\n          Janus.log('Removing audio track:', at)\n          config.myStream.removeTrack(at)\n          try {\n            at.stop()\n          } catch(e) {}\n        }\n        if(config.pc.getSenders() && config.pc.getSenders().length) {\n          var ra = true\n          if(media.replaceAudio && Janus.unifiedPlan) {\n            // We can use replaceTrack\n            ra = false\n          }\n          if(ra) {\n            for(var asnd of config.pc.getSenders()) {\n              if(asnd && asnd.track && asnd.track.kind === 'audio') {\n                Janus.log('Removing audio sender:', asnd)\n                config.pc.removeTrack(asnd)\n              }\n            }\n          }\n        }\n      }\n      if(media.removeVideo || media.replaceVideo) {\n        if(config.myStream && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n          var vt = config.myStream.getVideoTracks()[0]\n          Janus.log('Removing video track:', vt)\n          config.myStream.removeTrack(vt)\n          try {\n            vt.stop()\n          } catch(e) {}\n        }\n        if(config.pc.getSenders() && config.pc.getSenders().length) {\n          var rv = true\n          if(media.replaceVideo && Janus.unifiedPlan) {\n            // We can use replaceTrack\n            rv = false\n          }\n          if(rv) {\n            for(var vsnd of config.pc.getSenders()) {\n              if(vsnd && vsnd.track && vsnd.track.kind === 'video') {\n                Janus.log('Removing video sender:', vsnd)\n                config.pc.removeTrack(vsnd)\n              }\n            }\n          }\n        }\n      }\n    }\n    // Was a MediaStream object passed, or do we need to take care of that?\n    if(callbacks.stream) {\n      var stream = callbacks.stream\n      Janus.log('MediaStream provided by the application')\n      Janus.debug(stream)\n      // If this is an update, let's check if we need to release the previous stream\n      if(media.update && config.myStream && config.myStream !== callbacks.stream && !config.streamExternal && !media.replaceAudio && !media.replaceVideo) {\n        // We're replacing a stream we captured ourselves with an external one\n        Janus.stopAllTracks(config.myStream)\n        config.myStream = null\n      }\n      // Skip the getUserMedia part\n      config.streamExternal = true\n      pluginHandle.consentDialog(false)\n      streamsDone(handleId, jsep, media, callbacks, stream)\n      return\n    }\n    if(isAudioSendEnabled(media) || isVideoSendEnabled(media)) {\n      if(!Janus.isGetUserMediaAvailable()) {\n        callbacks.error('getUserMedia not available')\n        return\n      }\n      var constraints = { mandatory: {}, optional: []}\n      pluginHandle.consentDialog(true)\n      var audioSupport = isAudioSendEnabled(media)\n      if(audioSupport && media && typeof media.audio === 'object')\n        audioSupport = media.audio\n      var videoSupport = isVideoSendEnabled(media)\n      if(videoSupport && media) {\n        var simulcast = (callbacks.simulcast === true)\n        var simulcast2 = (callbacks.simulcast2 === true)\n        if((simulcast || simulcast2) && !jsep && !media.video)\n          media.video = 'hires'\n        if(media.video && media.video != 'screen' && media.video != 'window') {\n          if(typeof media.video === 'object') {\n            videoSupport = media.video\n          } else {\n            var width = 0\n            var height = 0, maxHeight = 0\n            if(media.video === 'lowres') {\n              // Small resolution, 4:3\n              height = 240\n              maxHeight = 240\n              width = 320\n            } else if(media.video === 'lowres-16:9') {\n              // Small resolution, 16:9\n              height = 180\n              maxHeight = 180\n              width = 320\n            } else if(media.video === 'hires' || media.video === 'hires-16:9' || media.video === 'hdres') {\n              // High(HD) resolution is only 16:9\n              height = 720\n              maxHeight = 720\n              width = 1280\n            } else if(media.video === 'fhdres') {\n              // Full HD resolution is only 16:9\n              height = 1080\n              maxHeight = 1080\n              width = 1920\n            } else if(media.video === '4kres') {\n              // 4K resolution is only 16:9\n              height = 2160\n              maxHeight = 2160\n              width = 3840\n            } else if(media.video === 'stdres') {\n              // Normal resolution, 4:3\n              height = 480\n              maxHeight = 480\n              width = 640\n            } else if(media.video === 'stdres-16:9') {\n              // Normal resolution, 16:9\n              height = 360\n              maxHeight = 360\n              width = 640\n            } else {\n              Janus.log('Default video setting is stdres 4:3')\n              height = 480\n              maxHeight = 480\n              width = 640\n            }\n            Janus.log('Adding media constraint:', media.video)\n            videoSupport = {\n              'height': {'ideal': height},\n              'width': {'ideal': width}\n            }\n            Janus.log('Adding video constraint:', videoSupport)\n          }\n        } else if(media.video === 'screen' || media.video === 'window') {\n          if(navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {\n            // The new experimental getDisplayMedia API is available, let's use that\n            // https://groups.google.com/forum/#!topic/discuss-webrtc/Uf0SrR4uxzk\n            // https://webrtchacks.com/chrome-screensharing-getdisplaymedia/\n            constraints.video = {}\n            if(media.screenshareFrameRate) {\n              constraints.video.frameRate = media.screenshareFrameRate\n            }\n            if(media.screenshareHeight) {\n              constraints.video.height = media.screenshareHeight\n            }\n            if(media.screenshareWidth) {\n              constraints.video.width = media.screenshareWidth\n            }\n            constraints.audio = media.captureDesktopAudio\n            navigator.mediaDevices.getDisplayMedia(constraints)\n              .then(function(stream) {\n                pluginHandle.consentDialog(false)\n                if(isAudioSendEnabled(media) && !media.keepAudio) {\n                  navigator.mediaDevices.getUserMedia({ audio: true, video: false })\n                    .then(function (audioStream) {\n                      stream.addTrack(audioStream.getAudioTracks()[0])\n                      streamsDone(handleId, jsep, media, callbacks, stream)\n                    })\n                } else {\n                  streamsDone(handleId, jsep, media, callbacks, stream)\n                }\n              }, function (error) {\n                pluginHandle.consentDialog(false)\n                callbacks.error(error)\n              })\n            return\n          }\n          // We're going to try and use the extension for Chrome 34+, the old approach\n          // for older versions of Chrome, or the experimental support in Firefox 33+\n          function callbackUserMedia (error, stream) {\n            pluginHandle.consentDialog(false)\n            if(error) {\n              callbacks.error(error)\n            } else {\n              streamsDone(handleId, jsep, media, callbacks, stream)\n            }\n          }\n          function getScreenMedia(constraints, gsmCallback, useAudio) {\n            Janus.log('Adding media constraint (screen capture)')\n            Janus.debug(constraints)\n            navigator.mediaDevices.getUserMedia(constraints)\n              .then(function(stream) {\n                if(useAudio) {\n                  navigator.mediaDevices.getUserMedia({ audio: true, video: false })\n                    .then(function (audioStream) {\n                      stream.addTrack(audioStream.getAudioTracks()[0])\n                      gsmCallback(null, stream)\n                    })\n                } else {\n                  gsmCallback(null, stream)\n                }\n              })\n              .catch(function(error) { pluginHandle.consentDialog(false); gsmCallback(error) })\n          }\n          if(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n            var chromever = Janus.webRTCAdapter.browserDetails.version\n            var maxver = 33\n            if(window.navigator.userAgent.match('Linux'))\n              maxver = 35 // \"known\" crash in chrome 34 and 35 on linux\n            if(chromever >= 26 && chromever <= maxver) {\n              // Chrome 26->33 requires some awkward chrome://flags manipulation\n              constraints = {\n                video: {\n                  mandatory: {\n                    googLeakyBucket: true,\n                    maxWidth: window.screen.width,\n                    maxHeight: window.screen.height,\n                    minFrameRate: media.screenshareFrameRate,\n                    maxFrameRate: media.screenshareFrameRate,\n                    chromeMediaSource: 'screen'\n                  }\n                },\n                audio: isAudioSendEnabled(media) && !media.keepAudio\n              }\n              getScreenMedia(constraints, callbackUserMedia)\n            } else {\n              // Chrome 34+ requires an extension\n              Janus.extension.getScreen(function (error, sourceId) {\n                if (error) {\n                  pluginHandle.consentDialog(false)\n                  return callbacks.error(error)\n                }\n                constraints = {\n                  audio: false,\n                  video: {\n                    mandatory: {\n                      chromeMediaSource: 'desktop',\n                      maxWidth: window.screen.width,\n                      maxHeight: window.screen.height,\n                      minFrameRate: media.screenshareFrameRate,\n                      maxFrameRate: media.screenshareFrameRate,\n                    },\n                    optional: [\n                      {googLeakyBucket: true},\n                      {googTemporalLayeredScreencast: true}\n                    ]\n                  }\n                }\n                constraints.video.mandatory.chromeMediaSourceId = sourceId\n                getScreenMedia(constraints, callbackUserMedia,\n                  isAudioSendEnabled(media) && !media.keepAudio)\n              })\n            }\n          } else if(Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n            if(Janus.webRTCAdapter.browserDetails.version >= 33) {\n              // Firefox 33+ has experimental support for screen sharing\n              constraints = {\n                video: {\n                  mozMediaSource: media.video,\n                  mediaSource: media.video\n                },\n                audio: isAudioSendEnabled(media) && !media.keepAudio\n              }\n              getScreenMedia(constraints, function (err, stream) {\n                callbackUserMedia(err, stream)\n                // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810\n                if (!err) {\n                  var lastTime = stream.currentTime\n                  var polly = window.setInterval(function () {\n                    if(!stream)\n                      window.clearInterval(polly)\n                    if(stream.currentTime == lastTime) {\n                      window.clearInterval(polly)\n                      if(stream.onended) {\n                        stream.onended()\n                      }\n                    }\n                    lastTime = stream.currentTime\n                  }, 500)\n                }\n              })\n            } else {\n              var error = new Error('NavigatorUserMediaError')\n              error.name = 'Your version of Firefox does not support screen sharing, please install Firefox 33 (or more recent versions)'\n              pluginHandle.consentDialog(false)\n              callbacks.error(error)\n              return\n            }\n          }\n          return\n        }\n      }\n      // If we got here, we're not screensharing\n      if(!media || media.video !== 'screen') {\n        // Check whether all media sources are actually available or not\n        navigator.mediaDevices.enumerateDevices().then(function(devices) {\n          var audioExist = devices.some(function(device) {\n              return device.kind === 'audioinput'\n            }),\n            videoExist = isScreenSendEnabled(media) || devices.some(function(device) {\n              return device.kind === 'videoinput'\n            })\n\n          // Check whether a missing device is really a problem\n          var audioSend = isAudioSendEnabled(media)\n          var videoSend = isVideoSendEnabled(media)\n          var needAudioDevice = isAudioSendRequired(media)\n          var needVideoDevice = isVideoSendRequired(media)\n          if(audioSend || videoSend || needAudioDevice || needVideoDevice) {\n            // We need to send either audio or video\n            var haveAudioDevice = audioSend ? audioExist : false\n            var haveVideoDevice = videoSend ? videoExist : false\n            if(!haveAudioDevice && !haveVideoDevice) {\n              // FIXME Should we really give up, or just assume recvonly for both?\n              pluginHandle.consentDialog(false)\n              callbacks.error('No capture device found')\n              return false\n            } else if(!haveAudioDevice && needAudioDevice) {\n              pluginHandle.consentDialog(false)\n              callbacks.error('Audio capture is required, but no capture device found')\n              return false\n            } else if(!haveVideoDevice && needVideoDevice) {\n              pluginHandle.consentDialog(false)\n              callbacks.error('Video capture is required, but no capture device found')\n              return false\n            }\n          }\n\n          var gumConstraints = {\n            audio: (audioExist && !media.keepAudio) ? audioSupport : false,\n            video: (videoExist && !media.keepVideo) ? videoSupport : false\n          }\n          Janus.debug('getUserMedia constraints', gumConstraints)\n          if (!gumConstraints.audio && !gumConstraints.video) {\n            pluginHandle.consentDialog(false)\n            streamsDone(handleId, jsep, media, callbacks, stream)\n          } else {\n            navigator.mediaDevices.getUserMedia(gumConstraints)\n              .then(function(stream) {\n                pluginHandle.consentDialog(false)\n                streamsDone(handleId, jsep, media, callbacks, stream)\n              }).catch(function(error) {\n                pluginHandle.consentDialog(false)\n                callbacks.error({code: error.code, name: error.name, message: error.message})\n              })\n          }\n        })\n          .catch(function(error) {\n            pluginHandle.consentDialog(false)\n            callbacks.error(error)\n          })\n      }\n    } else {\n      // No need to do a getUserMedia, create offer/answer right away\n      streamsDone(handleId, jsep, media, callbacks)\n    }\n  }\n\n  function prepareWebrtcPeer(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : webrtcError\n    callbacks.customizeSdp = (typeof callbacks.customizeSdp == 'function') ? callbacks.customizeSdp : Janus.noop\n    var jsep = callbacks.jsep\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(jsep) {\n      if(!config.pc) {\n        Janus.warn('Wait, no PeerConnection?? if this is an answer, use createAnswer and not handleRemoteJsep')\n        callbacks.error('No PeerConnection: if this is an answer, use createAnswer and not handleRemoteJsep')\n        return\n      }\n      callbacks.customizeSdp(jsep)\n      config.pc.setRemoteDescription(jsep)\n        .then(function() {\n          Janus.log('Remote description accepted!')\n          config.remoteSdp = jsep.sdp\n          // Any trickle candidate we cached?\n          if(config.candidates && config.candidates.length > 0) {\n            for(var i = 0; i< config.candidates.length; i++) {\n              var candidate = config.candidates[i]\n              Janus.debug('Adding remote candidate:', candidate)\n              if(!candidate || candidate.completed === true) {\n                // end-of-candidates\n                config.pc.addIceCandidate(Janus.endOfCandidates)\n              } else {\n                // New candidate\n                config.pc.addIceCandidate(candidate)\n              }\n            }\n            config.candidates = []\n          }\n          // Done\n          callbacks.success()\n        }, callbacks.error)\n    } else {\n      callbacks.error('Invalid JSEP')\n    }\n  }\n\n  function createOffer(handleId, media, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks.customizeSdp = (typeof callbacks.customizeSdp == 'function') ? callbacks.customizeSdp : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    var simulcast = (callbacks.simulcast === true)\n    if(!simulcast) {\n      Janus.log('Creating offer (iceDone=' + config.iceDone + ')')\n    } else {\n      Janus.log('Creating offer (iceDone=' + config.iceDone + ', simulcast=' + simulcast + ')')\n    }\n    // https://code.google.com/p/webrtc/issues/detail?id=3508\n    var mediaConstraints = {}\n    if(Janus.unifiedPlan) {\n      // We can use Transceivers\n      var audioTransceiver = null, videoTransceiver = null\n      var transceivers = config.pc.getTransceivers()\n      if(transceivers && transceivers.length > 0) {\n        for(var t of transceivers) {\n          if((t.sender && t.sender.track && t.sender.track.kind === 'audio') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'audio')) {\n            if(!audioTransceiver) {\n              audioTransceiver = t\n            }\n            continue\n          }\n          if((t.sender && t.sender.track && t.sender.track.kind === 'video') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'video')) {\n            if(!videoTransceiver) {\n              videoTransceiver = t\n            }\n            continue\n          }\n        }\n      }\n      // Handle audio (and related changes, if any)\n      var audioSend = isAudioSendEnabled(media)\n      var audioRecv = isAudioRecvEnabled(media)\n      if(!audioSend && !audioRecv) {\n        // Audio disabled: have we removed it?\n        if(media.removeAudio && audioTransceiver) {\n          if (audioTransceiver.setDirection) {\n            audioTransceiver.setDirection('inactive')\n          } else {\n            audioTransceiver.direction = 'inactive'\n          }\n          Janus.log('Setting audio transceiver to inactive:', audioTransceiver)\n        }\n      } else {\n        // Take care of audio m-line\n        if(audioSend && audioRecv) {\n          if(audioTransceiver) {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendrecv')\n            } else {\n              audioTransceiver.direction = 'sendrecv'\n            }\n            Janus.log('Setting audio transceiver to sendrecv:', audioTransceiver)\n          }\n        } else if(audioSend && !audioRecv) {\n          if(audioTransceiver) {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly')\n            } else {\n              audioTransceiver.direction = 'sendonly'\n            }\n            Janus.log('Setting audio transceiver to sendonly:', audioTransceiver)\n          }\n        } else if(!audioSend && audioRecv) {\n          if(audioTransceiver) {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('recvonly')\n            } else {\n              audioTransceiver.direction = 'recvonly'\n            }\n            Janus.log('Setting audio transceiver to recvonly:', audioTransceiver)\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            audioTransceiver = config.pc.addTransceiver('audio', { direction: 'recvonly' })\n            Janus.log('Adding recvonly audio transceiver:', audioTransceiver)\n          }\n        }\n      }\n      // Handle video (and related changes, if any)\n      var videoSend = isVideoSendEnabled(media)\n      var videoRecv = isVideoRecvEnabled(media)\n      if(!videoSend && !videoRecv) {\n        // Video disabled: have we removed it?\n        if(media.removeVideo && videoTransceiver) {\n          if (videoTransceiver.setDirection) {\n            videoTransceiver.setDirection('inactive')\n          } else {\n            videoTransceiver.direction = 'inactive'\n          }\n          Janus.log('Setting video transceiver to inactive:', videoTransceiver)\n        }\n      } else {\n        // Take care of video m-line\n        if(videoSend && videoRecv) {\n          if(videoTransceiver) {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('sendrecv')\n            } else {\n              videoTransceiver.direction = 'sendrecv'\n            }\n            Janus.log('Setting video transceiver to sendrecv:', videoTransceiver)\n          }\n        } else if(videoSend && !videoRecv) {\n          if(videoTransceiver) {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('sendonly')\n            } else {\n              videoTransceiver.direction = 'sendonly'\n            }\n            Janus.log('Setting video transceiver to sendonly:', videoTransceiver)\n          }\n        } else if(!videoSend && videoRecv) {\n          if(videoTransceiver) {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('recvonly')\n            } else {\n              videoTransceiver.direction = 'recvonly'\n            }\n            Janus.log('Setting video transceiver to recvonly:', videoTransceiver)\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            videoTransceiver = config.pc.addTransceiver('video', { direction: 'recvonly' })\n            Janus.log('Adding recvonly video transceiver:', videoTransceiver)\n          }\n        }\n      }\n    } else {\n      mediaConstraints['offerToReceiveAudio'] = isAudioRecvEnabled(media)\n      mediaConstraints['offerToReceiveVideo'] = isVideoRecvEnabled(media)\n    }\n    var iceRestart = (callbacks.iceRestart === true)\n    if(iceRestart) {\n      mediaConstraints['iceRestart'] = true\n    }\n    Janus.debug(mediaConstraints)\n    // Check if this is Firefox and we've been asked to do simulcasting\n    var sendVideo = isVideoSendEnabled(media)\n    if(sendVideo && simulcast && Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n      // FIXME Based on https://gist.github.com/voluntas/088bc3cc62094730647b\n      Janus.log('Enabling Simulcasting for Firefox (RID)')\n      var sender = config.pc.getSenders().find(function(s) {return s.track && s.track.kind === 'video'})\n      if(sender) {\n        var parameters = sender.getParameters()\n        if(!parameters) {\n          parameters = {}\n        }\n        var maxBitrates = getMaxBitrates(callbacks.simulcastMaxBitrates)\n        parameters.encodings = callbacks.sendEncodings || [\n          { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n          { rid: 'm', active: true, maxBitrate: maxBitrates.medium, scaleResolutionDownBy: 2 },\n          { rid: 'l', active: true, maxBitrate: maxBitrates.low, scaleResolutionDownBy: 4 }\n        ]\n        sender.setParameters(parameters)\n      }\n    }\n    config.pc.createOffer(mediaConstraints)\n      .then(function(offer) {\n        Janus.debug(offer)\n        // JSON.stringify doesn't work on some WebRTC objects anymore\n        // See https://code.google.com/p/chromium/issues/detail?id=467366\n        var jsep = {\n          'type': offer.type,\n          'sdp': offer.sdp\n        }\n        callbacks.customizeSdp(jsep)\n        offer.sdp = jsep.sdp\n        Janus.log('Setting local description')\n        if(sendVideo && simulcast) {\n          // This SDP munging only works with Chrome (Safari STP may support it too)\n          if(Janus.webRTCAdapter.browserDetails.browser === 'chrome' ||\n              Janus.webRTCAdapter.browserDetails.browser === 'safari') {\n            Janus.log('Enabling Simulcasting for Chrome (SDP munging)')\n            offer.sdp = mungeSdpForSimulcasting(offer.sdp)\n          } else if(Janus.webRTCAdapter.browserDetails.browser !== 'firefox') {\n            Janus.warn('simulcast=true, but this is not Chrome nor Firefox, ignoring')\n          }\n        }\n        config.mySdp = {\n          type: 'offer',\n          sdp: offer.sdp\n        }\n        config.pc.setLocalDescription(offer)\n          .catch(callbacks.error)\n        config.mediaConstraints = mediaConstraints\n        if(!config.iceDone && !config.trickle) {\n          // Don't do anything until we have all candidates\n          Janus.log('Waiting for all candidates...')\n          return\n        }\n        // If transforms are present, notify Janus that the media is end-to-end encrypted\n        if(config.senderTransforms || config.receiverTransforms) {\n          offer['e2ee'] = true\n        }\n        callbacks.success(offer)\n      }, callbacks.error)\n  }\n\n  function createAnswer(handleId, media, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks.customizeSdp = (typeof callbacks.customizeSdp == 'function') ? callbacks.customizeSdp : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    var simulcast = (callbacks.simulcast === true)\n    if(!simulcast) {\n      Janus.log('Creating answer (iceDone=' + config.iceDone + ')')\n    } else {\n      Janus.log('Creating answer (iceDone=' + config.iceDone + ', simulcast=' + simulcast + ')')\n    }\n    var mediaConstraints = null\n    if(Janus.unifiedPlan) {\n      // We can use Transceivers\n      mediaConstraints = {}\n      var audioTransceiver = null, videoTransceiver = null\n      var transceivers = config.pc.getTransceivers()\n      if(transceivers && transceivers.length > 0) {\n        for(var t of transceivers) {\n          if((t.sender && t.sender.track && t.sender.track.kind === 'audio') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'audio')) {\n            if(!audioTransceiver)\n              audioTransceiver = t\n            continue\n          }\n          if((t.sender && t.sender.track && t.sender.track.kind === 'video') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'video')) {\n            if(!videoTransceiver)\n              videoTransceiver = t\n            continue\n          }\n        }\n      }\n      // Handle audio (and related changes, if any)\n      var audioSend = isAudioSendEnabled(media)\n      var audioRecv = isAudioRecvEnabled(media)\n      if(!audioSend && !audioRecv) {\n        // Audio disabled: have we removed it?\n        if(media.removeAudio && audioTransceiver) {\n          try {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive')\n            } else {\n              audioTransceiver.direction = 'inactive'\n            }\n            Janus.log('Setting audio transceiver to inactive:', audioTransceiver)\n          } catch(e) {\n            Janus.error(e)\n          }\n        }\n      } else {\n        // Take care of audio m-line\n        if(audioSend && audioRecv) {\n          if(audioTransceiver) {\n            try {\n              if (audioTransceiver.setDirection) {\n                audioTransceiver.setDirection('sendrecv')\n              } else {\n                audioTransceiver.direction = 'sendrecv'\n              }\n              Janus.log('Setting audio transceiver to sendrecv:', audioTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        } else if(audioSend && !audioRecv) {\n          try {\n            if(audioTransceiver) {\n              if (audioTransceiver.setDirection) {\n                audioTransceiver.setDirection('sendonly')\n              } else {\n                audioTransceiver.direction = 'sendonly'\n              }\n              Janus.log('Setting audio transceiver to sendonly:', audioTransceiver)\n            }\n          } catch(e) {\n            Janus.error(e)\n          }\n        } else if(!audioSend && audioRecv) {\n          if(audioTransceiver) {\n            try {\n              if (audioTransceiver.setDirection) {\n                audioTransceiver.setDirection('recvonly')\n              } else {\n                audioTransceiver.direction = 'recvonly'\n              }\n              Janus.log('Setting audio transceiver to recvonly:', audioTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            audioTransceiver = config.pc.addTransceiver('audio', { direction: 'recvonly' })\n            Janus.log('Adding recvonly audio transceiver:', audioTransceiver)\n          }\n        }\n      }\n      // Handle video (and related changes, if any)\n      var videoSend = isVideoSendEnabled(media)\n      var videoRecv = isVideoRecvEnabled(media)\n      if(!videoSend && !videoRecv) {\n        // Video disabled: have we removed it?\n        if(media.removeVideo && videoTransceiver) {\n          try {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('inactive')\n            } else {\n              videoTransceiver.direction = 'inactive'\n            }\n            Janus.log('Setting video transceiver to inactive:', videoTransceiver)\n          } catch(e) {\n            Janus.error(e)\n          }\n        }\n      } else {\n        // Take care of video m-line\n        if(videoSend && videoRecv) {\n          if(videoTransceiver) {\n            try {\n              if (videoTransceiver.setDirection) {\n                videoTransceiver.setDirection('sendrecv')\n              } else {\n                videoTransceiver.direction = 'sendrecv'\n              }\n              Janus.log('Setting video transceiver to sendrecv:', videoTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        } else if(videoSend && !videoRecv) {\n          if(videoTransceiver) {\n            try {\n              if (videoTransceiver.setDirection) {\n                videoTransceiver.setDirection('sendonly')\n              } else {\n                videoTransceiver.direction = 'sendonly'\n              }\n              Janus.log('Setting video transceiver to sendonly:', videoTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        } else if(!videoSend && videoRecv) {\n          if(videoTransceiver) {\n            try {\n              if (videoTransceiver.setDirection) {\n                videoTransceiver.setDirection('recvonly')\n              } else {\n                videoTransceiver.direction = 'recvonly'\n              }\n              Janus.log('Setting video transceiver to recvonly:', videoTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            videoTransceiver = config.pc.addTransceiver('video', { direction: 'recvonly' })\n            Janus.log('Adding recvonly video transceiver:', videoTransceiver)\n          }\n        }\n      }\n    } else {\n      if(Janus.webRTCAdapter.browserDetails.browser === 'firefox' || Janus.webRTCAdapter.browserDetails.browser === 'edge') {\n        mediaConstraints = {\n          offerToReceiveAudio: isAudioRecvEnabled(media),\n          offerToReceiveVideo: isVideoRecvEnabled(media)\n        }\n      } else {\n        mediaConstraints = {\n          mandatory: {\n            OfferToReceiveAudio: isAudioRecvEnabled(media),\n            OfferToReceiveVideo: isVideoRecvEnabled(media)\n          }\n        }\n      }\n    }\n    Janus.debug(mediaConstraints)\n    // Check if this is Firefox and we've been asked to do simulcasting\n    var sendVideo = isVideoSendEnabled(media)\n    if(sendVideo && simulcast && Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n      // FIXME Based on https://gist.github.com/voluntas/088bc3cc62094730647b\n      Janus.log('Enabling Simulcasting for Firefox (RID)')\n      var sender = config.pc.getSenders()[1]\n      Janus.log(sender)\n      var parameters = sender.getParameters()\n      Janus.log(parameters)\n\n      var maxBitrates = getMaxBitrates(callbacks.simulcastMaxBitrates)\n      sender.setParameters({encodings: callbacks.sendEncodings || [\n        { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n        { rid: 'm', active: true, maxBitrate: maxBitrates.medium, scaleResolutionDownBy: 2},\n        { rid: 'l', active: true, maxBitrate: maxBitrates.low, scaleResolutionDownBy: 4}\n      ]})\n    }\n    config.pc.createAnswer(mediaConstraints)\n      .then(function(answer) {\n        Janus.debug(answer)\n        // JSON.stringify doesn't work on some WebRTC objects anymore\n        // See https://code.google.com/p/chromium/issues/detail?id=467366\n        var jsep = {\n          'type': answer.type,\n          'sdp': answer.sdp\n        }\n        callbacks.customizeSdp(jsep)\n        answer.sdp = jsep.sdp\n        Janus.log('Setting local description')\n        if(sendVideo && simulcast) {\n          // This SDP munging only works with Chrome\n          if(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n            // FIXME Apparently trying to simulcast when answering breaks video in Chrome...\n            //~ Janus.log(\"Enabling Simulcasting for Chrome (SDP munging)\");\n            //~ answer.sdp = mungeSdpForSimulcasting(answer.sdp);\n            Janus.warn('simulcast=true, but this is an answer, and video breaks in Chrome if we enable it')\n          } else if(Janus.webRTCAdapter.browserDetails.browser !== 'firefox') {\n            Janus.warn('simulcast=true, but this is not Chrome nor Firefox, ignoring')\n          }\n        }\n        config.mySdp = {\n          type: 'answer',\n          sdp: answer.sdp\n        }\n        config.pc.setLocalDescription(answer)\n          .catch(callbacks.error)\n        config.mediaConstraints = mediaConstraints\n        if(!config.iceDone && !config.trickle) {\n          // Don't do anything until we have all candidates\n          Janus.log('Waiting for all candidates...')\n          return\n        }\n        // If transforms are present, notify Janus that the media is end-to-end encrypted\n        if(config.senderTransforms || config.receiverTransforms) {\n          answer['e2ee'] = true\n        }\n        callbacks.success(answer)\n      }, callbacks.error)\n  }\n\n  function sendSDP(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle, not sending anything')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    Janus.log('Sending offer/answer SDP...')\n    if(!config.mySdp) {\n      Janus.warn('Local SDP instance is invalid, not sending anything...')\n      return\n    }\n    config.mySdp = {\n      'type': config.pc.localDescription.type,\n      'sdp': config.pc.localDescription.sdp\n    }\n    if(config.trickle === false)\n      config.mySdp['trickle'] = false\n    Janus.debug(callbacks)\n    config.sdpSent = true\n    callbacks.success(config.mySdp)\n  }\n\n  function getVolume(handleId, remote) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return 0\n    }\n    var stream = remote ? 'remote' : 'local'\n    var config = pluginHandle.webrtcStuff\n    if(!config.volume[stream])\n      config.volume[stream] = { value: 0 }\n    // Start getting the volume, if audioLevel in getStats is supported (apparently\n    // they're only available in Chrome/Safari right now: https://webrtc-stats.callstats.io/)\n    if(config.pc.getStats && (Janus.webRTCAdapter.browserDetails.browser === 'chrome' ||\n        Janus.webRTCAdapter.browserDetails.browser === 'safari')) {\n      if(remote && !config.remoteStream) {\n        Janus.warn('Remote stream unavailable')\n        return 0\n      } else if(!remote && !config.myStream) {\n        Janus.warn('Local stream unavailable')\n        return 0\n      }\n      if(!config.volume[stream].timer) {\n        Janus.log('Starting ' + stream + ' volume monitor')\n        config.volume[stream].timer = setInterval(function() {\n          config.pc.getStats()\n            .then(function(stats) {\n              stats.forEach(function (res) {\n                if(!res || res.kind !== 'audio')\n                  return\n                if((remote && !res.remoteSource) || (!remote && res.type !== 'media-source'))\n                  return\n                config.volume[stream].value = (res.audioLevel ? res.audioLevel : 0)\n              })\n            })\n        }, 200)\n        return 0 // We don't have a volume to return yet\n      }\n      return config.volume[stream].value\n    } else {\n      // audioInputLevel and audioOutputLevel seem only available in Chrome? audioLevel\n      // seems to be available on Chrome and Firefox, but they don't seem to work\n      Janus.warn('Getting the ' + stream + ' volume unsupported by browser')\n      return 0\n    }\n  }\n\n  function isMuted(handleId, video) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return true\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc) {\n      Janus.warn('Invalid PeerConnection')\n      return true\n    }\n    if(!config.myStream) {\n      Janus.warn('Invalid local MediaStream')\n      return true\n    }\n    if(video) {\n      // Check video track\n      if(!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n        Janus.warn('No video track')\n        return true\n      }\n      return !config.myStream.getVideoTracks()[0].enabled\n    } else {\n      // Check audio track\n      if(!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n        Janus.warn('No audio track')\n        return true\n      }\n      return !config.myStream.getAudioTracks()[0].enabled\n    }\n  }\n\n  function mute(handleId, video, mute) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return false\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc) {\n      Janus.warn('Invalid PeerConnection')\n      return false\n    }\n    if(!config.myStream) {\n      Janus.warn('Invalid local MediaStream')\n      return false\n    }\n    if(video) {\n      // Mute/unmute video track\n      if(!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n        Janus.warn('No video track')\n        return false\n      }\n      config.myStream.getVideoTracks()[0].enabled = !mute\n      return true\n    } else {\n      // Mute/unmute audio track\n      if(!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n        Janus.warn('No audio track')\n        return false\n      }\n      config.myStream.getAudioTracks()[0].enabled = !mute\n      return true\n    }\n  }\n\n  function getBitrate(handleId) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return 'Invalid handle'\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc)\n      return 'Invalid PeerConnection'\n    // Start getting the bitrate, if getStats is supported\n    if(config.pc.getStats) {\n      if(!config.bitrate.timer) {\n        Janus.log('Starting bitrate timer (via getStats)')\n        config.bitrate.timer = setInterval(function() {\n          config.pc.getStats()\n            .then(function(stats) {\n              stats.forEach(function (res) {\n                if(!res)\n                  return\n                var inStats = false\n                // Check if these are statistics on incoming media\n                if((res.mediaType === 'video' || res.id.toLowerCase().indexOf('video') > -1) &&\n                    res.type === 'inbound-rtp' && res.id.indexOf('rtcp') < 0) {\n                  // New stats\n                  inStats = true\n                } else if(res.type == 'ssrc' && res.bytesReceived &&\n                    (res.googCodecName === 'VP8' || res.googCodecName === '')) {\n                  // Older Chromer versions\n                  inStats = true\n                }\n                // Parse stats now\n                if(inStats) {\n                  config.bitrate.fps = res.framesPerSecond\n                  config.bitrate.bsnow = res.bytesReceived\n                  config.bitrate.tsnow = res.timestamp\n                  if(config.bitrate.bsbefore === null || config.bitrate.tsbefore === null) {\n                    // Skip this round\n                    config.bitrate.bsbefore = config.bitrate.bsnow\n                    config.bitrate.tsbefore = config.bitrate.tsnow\n                  } else {\n                    // Calculate bitrate\n                    var timePassed = config.bitrate.tsnow - config.bitrate.tsbefore\n                    if(Janus.webRTCAdapter.browserDetails.browser === 'safari')\n                      timePassed = timePassed/1000 // Apparently the timestamp is in microseconds, in Safari\n                    var bitRate = Math.round((config.bitrate.bsnow - config.bitrate.bsbefore) * 8 / timePassed)\n                    if(Janus.webRTCAdapter.browserDetails.browser === 'safari')\n                      bitRate = parseInt(bitRate/1000)\n                    config.bitrate.value = bitRate + ' kbps'\n                    //~ Janus.log(\"Estimated bitrate is \" + config.bitrate.value);\n                    config.bitrate.bsbefore = config.bitrate.bsnow\n                    config.bitrate.tsbefore = config.bitrate.tsnow\n                  }\n                }\n              })\n            })\n        }, 1000)\n      }\n      return config.bitrate\n    } else {\n      Janus.warn('Getting the video bitrate unsupported by browser')\n      return 'Feature unsupported by browser'\n    }\n  }\n\n  function webrtcError(error) {\n    Janus.error('WebRTC error:', error)\n  }\n\n  function cleanupWebrtc(handleId, hangupRequest) {\n    Janus.log('Cleaning WebRTC stuff')\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle) {\n      // Nothing to clean\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(config) {\n      if(hangupRequest === true) {\n        // Send a hangup request (we don't really care about the response)\n        var request = { 'janus': 'hangup', 'transaction': Janus.randomString(12) }\n        if(pluginHandle.token)\n          request['token'] = pluginHandle.token\n        if(apisecret)\n          request['apisecret'] = apisecret\n        Janus.debug('Sending hangup request (handle=' + handleId + '):')\n        Janus.debug(request)\n        if(websockets) {\n          request['session_id'] = sessionId\n          request['handle_id'] = handleId\n          ws.send(JSON.stringify(request))\n        } else {\n          Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n            verb: 'POST',\n            withCredentials: withCredentials,\n            body: request\n          })\n        }\n      }\n      // Cleanup stack\n      config.remoteStream = null\n      if(config.volume) {\n        if(config.volume['local'] && config.volume['local'].timer)\n          clearInterval(config.volume['local'].timer)\n        if(config.volume['remote'] && config.volume['remote'].timer)\n          clearInterval(config.volume['remote'].timer)\n      }\n      config.volume = {}\n      if(config.bitrate.timer)\n        clearInterval(config.bitrate.timer)\n      config.bitrate.timer = null\n      config.bitrate.bsnow = null\n      config.bitrate.bsbefore = null\n      config.bitrate.tsnow = null\n      config.bitrate.tsbefore = null\n      config.bitrate.value = null\n      if(!config.streamExternal && config.myStream) {\n        Janus.log('Stopping local stream tracks')\n        Janus.stopAllTracks(config.myStream)\n      }\n      config.streamExternal = false\n      config.myStream = null\n      // Close PeerConnection\n      try {\n        config.pc.close()\n      } catch(e) {\n        // Do nothing\n      }\n      config.pc = null\n      config.candidates = null\n      config.mySdp = null\n      config.remoteSdp = null\n      config.iceDone = false\n      config.dataChannel = {}\n      config.dtmfSender = null\n      config.senderTransforms = null\n      config.receiverTransforms = null\n    }\n    pluginHandle.oncleanup()\n  }\n\n  // Helper method to munge an SDP to enable simulcasting (Chrome only)\n  function mungeSdpForSimulcasting(sdp) {\n    // Let's munge the SDP to add the attributes for enabling simulcasting\n    // (based on https://gist.github.com/ggarber/a19b4c33510028b9c657)\n    var lines = sdp.split('\\r\\n')\n    var video = false\n    var ssrc = [ -1 ], ssrc_fid = [ -1 ]\n    var cname = null, msid = null, mslabel = null, label = null\n    var insertAt = -1\n    for(var i=0; i<lines.length; i++) {\n      var mline = lines[i].match(/m=(\\w+) */)\n      if(mline) {\n        var medium = mline[1]\n        if(medium === 'video') {\n          // New video m-line: make sure it's the first one\n          if(ssrc[0] < 0) {\n            video = true\n          } else {\n            // We're done, let's add the new attributes here\n            insertAt = i\n            break\n          }\n        } else {\n          // New non-video m-line: do we have what we were looking for?\n          if(ssrc[0] > -1) {\n            // We're done, let's add the new attributes here\n            insertAt = i\n            break\n          }\n        }\n        continue\n      }\n      if(!video)\n        continue\n      var sim = lines[i].match(/a=ssrc-group:SIM (\\d+) (\\d+) (\\d+)/)\n      if(sim) {\n        Janus.warn('The SDP already contains a SIM attribute, munging will be skipped')\n        return sdp\n      }\n      var fid = lines[i].match(/a=ssrc-group:FID (\\d+) (\\d+)/)\n      if(fid) {\n        ssrc[0] = fid[1]\n        ssrc_fid[0] = fid[2]\n        lines.splice(i, 1); i--\n        continue\n      }\n      if(ssrc[0]) {\n        var match = lines[i].match('a=ssrc:' + ssrc[0] + ' cname:(.+)')\n        if(match) {\n          cname = match[1]\n        }\n        match = lines[i].match('a=ssrc:' + ssrc[0] + ' msid:(.+)')\n        if(match) {\n          msid = match[1]\n        }\n        match = lines[i].match('a=ssrc:' + ssrc[0] + ' mslabel:(.+)')\n        if(match) {\n          mslabel = match[1]\n        }\n        match = lines[i].match('a=ssrc:' + ssrc[0] + ' label:(.+)')\n        if(match) {\n          label = match[1]\n        }\n        if(lines[i].indexOf('a=ssrc:' + ssrc_fid[0]) === 0) {\n          lines.splice(i, 1); i--\n          continue\n        }\n        if(lines[i].indexOf('a=ssrc:' + ssrc[0]) === 0) {\n          lines.splice(i, 1); i--\n          continue\n        }\n      }\n      if(lines[i].length == 0) {\n        lines.splice(i, 1); i--\n        continue\n      }\n    }\n    if(ssrc[0] < 0) {\n      // Couldn't find a FID attribute, let's just take the first video SSRC we find\n      insertAt = -1\n      video = false\n      for(var i=0; i<lines.length; i++) {\n        var mline = lines[i].match(/m=(\\w+) */)\n        if(mline) {\n          var medium = mline[1]\n          if(medium === 'video') {\n            // New video m-line: make sure it's the first one\n            if(ssrc[0] < 0) {\n              video = true\n            } else {\n              // We're done, let's add the new attributes here\n              insertAt = i\n              break\n            }\n          } else {\n            // New non-video m-line: do we have what we were looking for?\n            if(ssrc[0] > -1) {\n              // We're done, let's add the new attributes here\n              insertAt = i\n              break\n            }\n          }\n          continue\n        }\n        if(!video)\n          continue\n        if(ssrc[0] < 0) {\n          var value = lines[i].match(/a=ssrc:(\\d+)/)\n          if(value) {\n            ssrc[0] = value[1]\n            lines.splice(i, 1); i--\n            continue\n          }\n        } else {\n          var match = lines[i].match('a=ssrc:' + ssrc[0] + ' cname:(.+)')\n          if(match) {\n            cname = match[1]\n          }\n          match = lines[i].match('a=ssrc:' + ssrc[0] + ' msid:(.+)')\n          if(match) {\n            msid = match[1]\n          }\n          match = lines[i].match('a=ssrc:' + ssrc[0] + ' mslabel:(.+)')\n          if(match) {\n            mslabel = match[1]\n          }\n          match = lines[i].match('a=ssrc:' + ssrc[0] + ' label:(.+)')\n          if(match) {\n            label = match[1]\n          }\n          if(lines[i].indexOf('a=ssrc:' + ssrc_fid[0]) === 0) {\n            lines.splice(i, 1); i--\n            continue\n          }\n          if(lines[i].indexOf('a=ssrc:' + ssrc[0]) === 0) {\n            lines.splice(i, 1); i--\n            continue\n          }\n        }\n        if(lines[i].length === 0) {\n          lines.splice(i, 1); i--\n          continue\n        }\n      }\n    }\n    if(ssrc[0] < 0) {\n      // Still nothing, let's just return the SDP we were asked to munge\n      Janus.warn('Couldn\\'t find the video SSRC, simulcasting NOT enabled')\n      return sdp\n    }\n    if(insertAt < 0) {\n      // Append at the end\n      insertAt = lines.length\n    }\n    // Generate a couple of SSRCs (for retransmissions too)\n    // Note: should we check if there are conflicts, here?\n    ssrc[1] = Math.floor(Math.random()*0xFFFFFFFF)\n    ssrc[2] = Math.floor(Math.random()*0xFFFFFFFF)\n    ssrc_fid[1] = Math.floor(Math.random()*0xFFFFFFFF)\n    ssrc_fid[2] = Math.floor(Math.random()*0xFFFFFFFF)\n    // Add attributes to the SDP\n    for(var i=0; i<ssrc.length; i++) {\n      if(cname) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' cname:' + cname)\n        insertAt++\n      }\n      if(msid) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' msid:' + msid)\n        insertAt++\n      }\n      if(mslabel) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' mslabel:' + mslabel)\n        insertAt++\n      }\n      if(label) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' label:' + label)\n        insertAt++\n      }\n      // Add the same info for the retransmission SSRC\n      if(cname) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' cname:' + cname)\n        insertAt++\n      }\n      if(msid) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' msid:' + msid)\n        insertAt++\n      }\n      if(mslabel) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' mslabel:' + mslabel)\n        insertAt++\n      }\n      if(label) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' label:' + label)\n        insertAt++\n      }\n    }\n    lines.splice(insertAt, 0, 'a=ssrc-group:FID ' + ssrc[2] + ' ' + ssrc_fid[2])\n    lines.splice(insertAt, 0, 'a=ssrc-group:FID ' + ssrc[1] + ' ' + ssrc_fid[1])\n    lines.splice(insertAt, 0, 'a=ssrc-group:FID ' + ssrc[0] + ' ' + ssrc_fid[0])\n    lines.splice(insertAt, 0, 'a=ssrc-group:SIM ' + ssrc[0] + ' ' + ssrc[1] + ' ' + ssrc[2])\n    sdp = lines.join('\\r\\n')\n    if(!sdp.endsWith('\\r\\n'))\n      sdp += '\\r\\n'\n    return sdp\n  }\n\n  // Helper methods to parse a media object\n  function isAudioSendEnabled(media) {\n    Janus.debug('isAudioSendEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.audio === false)\n      return false // Generic audio has precedence\n    if(media.audioSend === undefined || media.audioSend === null)\n      return true // Default\n    return (media.audioSend === true)\n  }\n\n  function isAudioSendRequired(media) {\n    Janus.debug('isAudioSendRequired:', media)\n    if(!media)\n      return false // Default\n    if(media.audio === false || media.audioSend === false)\n      return false // If we're not asking to capture audio, it's not required\n    if(media.failIfNoAudio === undefined || media.failIfNoAudio === null)\n      return false // Default\n    return (media.failIfNoAudio === true)\n  }\n\n  function isAudioRecvEnabled(media) {\n    Janus.debug('isAudioRecvEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.audio === false)\n      return false // Generic audio has precedence\n    if(media.audioRecv === undefined || media.audioRecv === null)\n      return true // Default\n    return (media.audioRecv === true)\n  }\n\n  function isVideoSendEnabled(media) {\n    Janus.debug('isVideoSendEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.video === false)\n      return false // Generic video has precedence\n    if(media.videoSend === undefined || media.videoSend === null)\n      return true // Default\n    return (media.videoSend === true)\n  }\n\n  function isVideoSendRequired(media) {\n    Janus.debug('isVideoSendRequired:', media)\n    if(!media)\n      return false // Default\n    if(media.video === false || media.videoSend === false)\n      return false // If we're not asking to capture video, it's not required\n    if(media.failIfNoVideo === undefined || media.failIfNoVideo === null)\n      return false // Default\n    return (media.failIfNoVideo === true)\n  }\n\n  function isVideoRecvEnabled(media) {\n    Janus.debug('isVideoRecvEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.video === false)\n      return false // Generic video has precedence\n    if(media.videoRecv === undefined || media.videoRecv === null)\n      return true // Default\n    return (media.videoRecv === true)\n  }\n\n  function isScreenSendEnabled(media) {\n    Janus.debug('isScreenSendEnabled:', media)\n    if (!media)\n      return false\n    if (typeof media.video !== 'object' || typeof media.video.mandatory !== 'object')\n      return false\n    var constraints = media.video.mandatory\n    if (constraints.chromeMediaSource)\n      return constraints.chromeMediaSource === 'desktop' || constraints.chromeMediaSource === 'screen'\n    else if (constraints.mozMediaSource)\n      return constraints.mozMediaSource === 'window' || constraints.mozMediaSource === 'screen'\n    else if (constraints.mediaSource)\n      return constraints.mediaSource === 'window' || constraints.mediaSource === 'screen'\n    return false\n  }\n\n  function isDataEnabled(media) {\n    Janus.debug('isDataEnabled:', media)\n    if(Janus.webRTCAdapter.browserDetails.browser === 'edge') {\n      Janus.warn('Edge doesn\\'t support data channels yet')\n      return false\n    }\n    if(media === undefined || media === null)\n      return false // Default\n    return (media.data === true)\n  }\n\n  function isTrickleEnabled(trickle) {\n    Janus.debug('isTrickleEnabled:', trickle)\n    return (trickle === false) ? false : true\n  }\n}\n\nexport default Janus\n","import get from 'lodash/get'\nimport find from 'lodash/find'\n\nimport Janus from '@src/lib/janus'\nimport { syndicate } from '@src/lib/page-context'\n\nlet printerWebRTCUrl = (printerId) => `/ws/janus/${printerId}/`\nlet printerSharedWebRTCUrl = (token) => `/ws/share_token/janus/${token}/`\n\nfunction iceServers(authToken) {\n  const turnServer = syndicate()?.turn_server\n  const servers = [\n    {\n      urls: ['stun:stun.l.google.com:19302'],\n    }\n  ]\n\n  if (turnServer) {\n    servers.push(\n      {\n        urls: `turn:${turnServer}:80?transport=udp`,\n        credential: authToken,\n        username: authToken,\n      },\n      {\n        urls: `turn:${turnServer}:80?transport=tcp`,\n        credential: authToken,\n        username: authToken,\n      }\n    );\n  }\n\n  return servers\n}\n\nexport default function WebRTCConnection(streamMode, streamIdToTest) {\n  let h264Webrtc, mjpegWebrtc\n  if (streamMode === undefined && streamIdToTest === undefined) {\n    // The agent is an old version that doesn't support dynamic streaming\n    h264Webrtc = H264WebRTCConnection([0, 1])\n    mjpegWebrtc = MJpegWebRTCConnection([2])\n  } else if (streamMode.includes('h264')) {\n    h264Webrtc = H264WebRTCConnection([streamIdToTest])\n  } else if (streamMode.includes('mjpeg')) {\n    mjpegWebrtc = MJpegWebRTCConnection([streamIdToTest])\n  }\n\n  let self = {\n    callbacks: {},\n    initialized: false,\n    h264WebRTCConn: h264Webrtc,\n    mjpegWebRTCConn: mjpegWebrtc,\n\n    openForShareToken(shareToken) {\n      self.connect(printerSharedWebRTCUrl(shareToken), shareToken)\n    },\n\n    openForPrinter(printerId, authToken) {\n      self.connect(printerWebRTCUrl(printerId), authToken)\n    },\n    connect(wsUri, token) {\n      self.initialized = true\n      if (self.h264WebRTCConn) self.h264WebRTCConn.connect(wsUri, token)\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.connect(wsUri, token)\n    },\n    disconnect() {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.janus.destroy()\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.janus.destroy()\n    },\n    stopStream() {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.stopStream()\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.stopStream()\n    },\n    sendData(data) {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.sendData(data) // Data channel in the default stream is used to pass data from client to agent\n    },\n    startStream() {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.startStream()\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.startStream()\n    },\n    setCallbacks(callbacks) {\n        if (self.h264WebRTCConn) self.h264WebRTCConn.setCallbacks(callbacks)\n        if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.setCallbacks(callbacks)\n    },\n  }\n  return self\n}\n\nfunction MJpegWebRTCConnection(streamIdsToTest) {\n  let baseConnection = BaseWebRTCConnection(streamIdsToTest);\n\n  baseConnection.infoSuccessCallback = function (result, pluginHandle) {\n    let stream = get(result, 'info')\n    if (stream) {\n      baseConnection.streamId = stream.id\n      baseConnection.streaming = pluginHandle\n\n      const mjpegStreamExisting =\n        get(stream, 'data') || // Janus 0.x format\n        find(get(stream, 'media', []), { type: 'data' }) // Janus 1.x format\n\n      if (mjpegStreamExisting && baseConnection.callbacks.onStreamAvailable) {\n        baseConnection.callbacks.onStreamAvailable(baseConnection)\n      }\n    } else {\n      baseConnection.janus.destroy()\n    }\n  };\n\n  baseConnection.onRawData = function (rawData) {\n    if ('onMJpegData' in baseConnection.callbacks) {\n      baseConnection.callbacks.onMJpegData(rawData)\n    }\n  };\n\n  baseConnection.startStream = function () {\n    if (!baseConnection.channelOpen()) {\n      return\n    }\n    const body = { request: 'watch', offer_video: false, id: parseInt(baseConnection.streamId) }\n    baseConnection.streaming?.send({ message: body })\n  };\n  return baseConnection;\n}\n\nfunction H264WebRTCConnection(streamIdsToTest) {\n  let baseConnection = BaseWebRTCConnection(streamIdsToTest);\n\n  baseConnection.infoSuccessCallback = function (result, pluginHandle) {\n    let stream = get(result, 'info')\n    if (stream) {\n      baseConnection.streamId = stream.id\n      baseConnection.streaming = pluginHandle\n\n      const videoStreamExisting =\n        get(stream, 'video') || // Janus 0.x format\n        find(get(stream, 'media', []), { type: 'video' }) // Janus 1.x format\n\n      if (videoStreamExisting && baseConnection.callbacks.onStreamAvailable) {\n        baseConnection.callbacks.onStreamAvailable(baseConnection)\n      }\n    }\n  };\n  baseConnection.onRawData = function (rawData) {\n    if ('onData' in baseConnection.callbacks) {\n      baseConnection.callbacks.onData(rawData)\n    }\n  };\n\n  baseConnection.startStream = function () {\n    if (!baseConnection.channelOpen()) {\n      return\n    }\n    const body = { request: 'watch', offer_video: true, id: parseInt(baseConnection.streamId) }\n    baseConnection.streaming?.send({ message: body })\n\n    baseConnection.clearBitrateInterval()\n    baseConnection.bitrateInterval = setInterval(function () {\n      if (baseConnection.streaming) {\n        const bitrate = baseConnection.streaming.getBitrate()\n        if (bitrate && bitrate.value) {\n          baseConnection.callbacks.onBitrateUpdated(baseConnection.streaming.getBitrate())\n        } else {\n          baseConnection.callbacks.onBitrateUpdated({ value: null })\n        }\n      } else {\n        baseConnection.callbacks.onBitrateUpdated({ value: null })\n      }\n    }, 5000)\n  };\n  return baseConnection;\n}\n\nexport function DataChannelOnlyWebRTCConnection(streamIdsToTest) {\n\n  let baseConnection = BaseWebRTCConnection(streamIdsToTest); // webcamName is null for data channel-only WebRTC\n\n  baseConnection.openForPrinter = function (printerId, authToken) {\n    baseConnection.connect(printerWebRTCUrl(printerId), authToken)\n  };\n\n  baseConnection.infoSuccessCallback = function (result, pluginHandle) {\n    let stream = get(result, 'info')\n    if (stream) {\n      baseConnection.streamId = stream.id\n      baseConnection.streaming = pluginHandle\n\n      const dataStreamExisting =\n        get(stream, 'data') || // Janus 0.x format\n        find(get(stream, 'media', []), { type: 'data' }) // Janus 1.x format\n\n      if (dataStreamExisting) {\n        baseConnection.startStream();\n      } else {\n        baseConnection.close();\n      }\n    }\n  };\n\n  baseConnection.onRawData = function (rawData) {\n    baseConnection.callbacks.onData(rawData);\n  };\n\n  return baseConnection;\n}\n\nfunction BaseWebRTCConnection(streamIdsToTest) {\n  let self = {\n    callbacks: {},\n    streamId: undefined,\n    streaming: undefined,\n    bitrateInterval: null,\n\n    setCallbacks(callbacks) {\n      self.callbacks = {...self.callbacks, ...callbacks};\n    },\n\n    connect(wsUri, token) {\n      Janus.init({\n        debug: 'all',\n        callback: () => {\n          if (!Janus.isWebrtcSupported()) {\n            return\n          }\n          self.connectJanusWebSocket(wsUri, token)\n        },\n      })\n    },\n\n    connectJanusWebSocket(wsUri, token) {\n      self.janus = new Janus({\n        server:\n          window.location.protocol.replace('http', 'ws') + '//' + window.location.host + wsUri,\n        iceServers: iceServers(token),\n        ipv6: true,\n        success: () => {\n          self.janus.attach({\n            plugin: 'janus.plugin.streaming',\n            opaqueId: 'streamingtest-' + Janus.randomString(12),\n            success: function (pluginHandle) {\n              streamIdsToTest.forEach((streamIdToTest) => {\n                const body = { request: 'info', id: streamIdToTest }\n                Janus.debug('Sending message (' + JSON.stringify(body) + ')')\n                pluginHandle.send({\n                  message: body,\n                  success: function(result) { self.infoSuccessCallback(result, pluginHandle) },\n                })\n              })\n            },\n            error: function (error) {\n              Janus.error('  -- Error attaching plugin... ', error)\n              self.janus.destroy()\n            },\n            onmessage: function (msg, jsep) {\n              self.onMessage(msg, jsep)\n            },\n            onremotestream: function (stream) {\n              Janus.debug(' ::: Got a remote stream :::')\n              Janus.debug(stream)\n              if ('onRemoteStream' in self.callbacks) {\n                self.callbacks.onRemoteStream(stream)\n              }\n            },\n            ontrackmuted: function () {\n              if ('onTrackMuted' in self.callbacks) {\n                self.callbacks.onTrackMuted()\n              }\n            },\n            ontrackunmuted: function () {\n              if ('onTrackUnmuted' in self.callbacks) {\n                self.callbacks.onTrackUnmuted()\n              }\n            },\n            slowLink: function (uplink, lost) {\n              if ('onSlowLink' in self.callbacks) {\n                self.callbacks.onSlowLink(lost)\n              }\n            },\n            ondataopen: function () {},\n            ondata: self.onRawData,\n            oncleanup: function () {\n              if ('onDefaultStreamCleanup' in self.callbacks) {\n                self.callbacks.onDefaultStreamCleanup()\n              }\n            },\n          })\n        },\n        error(e) {\n          Janus.error('  -- Error -- ', e)\n          self.janus.destroy()\n        },\n        destroyed() {\n          self.streaming = undefined\n          self.streamId = undefined\n          self.clearBitrateInterval()\n        },\n      })\n    },\n    onMessage(msg, jsep) {\n      let self = this\n      Janus.debug(' ::: Got a message :::')\n      Janus.debug(msg)\n      let result = msg['result']\n      if (result !== null && result !== undefined) {\n        if (result['status'] !== undefined && result['status'] !== null) {\n          var status = result['status']\n          if (status === 'starting') console.log('Starting')\n          else if (status === 'started') console.log('Started')\n          else if (status === 'stopped') {\n            self.stopStream()\n          }\n        }\n      } else if (msg['error'] !== undefined && msg['error'] !== null) {\n        Janus.error(msg)\n        self.stopStream()\n        return\n      }\n      if (jsep !== undefined && jsep !== null) {\n        // Offer from the plugin, let's answer\n        self.streaming?.createAnswer({\n          jsep: jsep,\n          // We want recvonly audio/video and, if negotiated, datachannels\n          media: { audioSend: false, videoSend: false, data: true },\n          success: function (jsep) {\n            Janus.debug('Got SDP!')\n            Janus.debug(jsep)\n            var body = { request: 'start' }\n            self.streaming?.send({ message: body, jsep: jsep })\n          },\n          error: function (error) {\n            Janus.error('WebRTC error:', error)\n          },\n        })\n      }\n    },\n    channelOpen() {\n      return !(self.streamId === undefined || self.streaming === undefined)\n    },\n    startStream() {\n      if (!self.channelOpen()) {\n        return\n      }\n      const body = { request: 'watch', offer_video: false, id: parseInt(self.streamId) }\n      self.streaming?.send({ message: body })\n    },\n    stopStream() {\n      self.clearBitrateInterval()\n      if (!self.channelOpen()) {\n        return\n      }\n      const body = { request: 'stop' }\n      self.streaming?.send({ message: body })\n      self.streaming?.hangup()\n    },\n    sendData(data) {\n      if (self.channelOpen()) {\n        self.streaming?.data({ text: data, success: () => {} })\n      }\n    },\n    clearBitrateInterval() {\n      if (self.bitrateInterval) {\n        clearInterval(self.bitrateInterval)\n        self.bitrateInterval = null\n        self.callbacks.onBitrateUpdated({ value: null })\n      }\n    },\n  }\n\n  return self\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.slowLinkLoss > 50),expression:\"slowLinkLoss > 50\"}],ref:\"slowLinkWrapper\",staticClass:\"slow-link-wrapper\",on:{\"click\":_vm.slowLinkClicked,\"mouseenter\":function($event){_vm.fixSlowLinkTextWidth()\n      _vm.slowLinkShowing = true\n      _vm.slowLinkHiding = false},\"mouseleave\":function($event){_vm.fixSlowLinkTextWidth()\n      _vm.slowLinkShowing = false\n      _vm.slowLinkHiding = true}}},[_vm._m(0),_c('div',{ref:\"slowLinkText\",staticClass:\"text\",class:{\n        'show-and-hide': !_vm.slowLinkShowing && !_vm.slowLinkHiding,\n        showing: _vm.slowLinkShowing && !_vm.slowLinkHiding,\n        hiding: !_vm.slowLinkShowing && _vm.slowLinkHiding,\n      }},[_vm._v(\" \"+_vm._s(_vm.$t(\"Video frames dropped\"))+\" \")])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.trackMuted),expression:\"trackMuted\"}],staticClass:\"muted-status-wrapper\"},[_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Buffering...\")))]),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.showMutedStatusDescription($event)}}},[_vm._v(_vm._s(_vm.$t(\"Why is it stuck?\")))])]),(\n      _vm.isVideoAvailable && !_vm.autoplay && (_vm.isBasicStreamingReadyToPlay || _vm.isBasicStreamingFrozen)\n    )?_c('b-button',{staticClass:\"centered-element p-0\",attrs:{\"disabled\":_vm.isBasicStreamingFrozen},on:{\"click\":_vm.onPlayBtnClicked}},[(_vm.isBasicStreamingReadyToPlay)?_c('i',{staticClass:\"fas fa-play ml-1\"}):_vm._e(),(_vm.isBasicStreamingFrozen)?_c('span',{staticClass:\"medium\"},[_vm._v(_vm._s(_vm.remainingSecondsUntilNextCycle)+\"s\")]):_vm._e()]):_vm._e(),(_vm.trackMuted || _vm.videoLoading)?_c('b-spinner',{staticClass:\"centered-element\",attrs:{\"label\":\"Buffering...\"}}):_vm._e(),(_vm.taggedSrc && !_vm.showMJpeg && !_vm.showVideo)?_c('div',{staticClass:\"streaming-info overlay-info small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Real-time stream unavailable, showing last captured image\"))+\" \")]):_vm._e(),(_vm.isVideoAvailable)?_c('div',[((!_vm.autoplay && _vm.isBasicStreamingInProgress) || _vm.currentBitrate)?_c('div',{staticClass:\"streaming-info overlay-info small\",class:{ clickable: _vm.isBasicStreamingInProgress },on:{\"click\":_vm.onInfoClicked}},[(_vm.isBasicStreamingInProgress)?_c('div',{staticClass:\"text-success\"},[_vm._v(\" \"+_vm._s(_vm.remainingSecondsCurrentVideoCycle)+\" \")]):_vm._e(),(_vm.currentBitrate)?_c('div',[_vm._v(_vm._s(_vm.currentBitrate))]):_vm._e()]):_vm._e(),(!_vm.autoplay && (_vm.isBasicStreamingReadyToPlay || _vm.isBasicStreamingFrozen))?_c('div',{staticClass:\"streaming-guide overlay-info\",on:{\"click\":_vm.onInfoClicked}},[(_vm.isBasicStreamingReadyToPlay)?_c('div',{staticClass:\"message\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Webcam streams up to 5 FPS for Free\"))+\" \")]):_vm._e(),(_vm.isBasicStreamingFrozen)?_c('div',{staticClass:\"message text-warning\"},[_vm._v(\" \"+_vm._s(_vm.remainingSecondsUntilNextCycle)+\"s left in the cooldown period \")]):_vm._e(),_c('a',{staticClass:\"learn-more\",attrs:{\"href\":\"#\"}},[_vm._v(_vm._s(_vm.$t(\"Learn more...\")))])]):_vm._e()]):_vm._e(),_c('div',{staticClass:\"image-container\"},[_c('img',{staticClass:\"webcamImage\",style:(_vm.webcamStyle),attrs:{\"src\":require('@static/img/print-padded.png')}}),(_vm.taggedSrc)?_c('img',{staticClass:\"webcamImage stackedImage\",style:(_vm.webcamStyle),attrs:{\"src\":_vm.taggedSrc,\"alt\":_vm.printer.name + ' current image'}}):_vm._e(),_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showMJpeg),expression:\"showMJpeg\"}],staticClass:\"webcamImage stackedImage\",style:(_vm.webcamStyle),attrs:{\"src\":_vm.mjpgSrc}}),_c('video',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showVideo),expression:\"showVideo\"}],ref:\"video\",staticClass:\"webcamImage stackedImage\",style:(_vm.webcamStyle),attrs:{\"poster\":_vm.taggedSrc,\"autoplay\":\"\",\"muted\":\"\",\"playsinline\":\"\"},domProps:{\"muted\":true},on:{\"loadstart\":function($event){return _vm.onLoadStart()},\"canplay\":function($event){return _vm.onCanPlay()}}})]),_c('div',{staticClass:\"extra-controls\"},[(_vm.showVideo || _vm.showVideo || _vm.taggedSrc)?_c('div',{staticClass:\"video-control-btn\",on:{\"click\":_vm.onRotateRightClicked}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-rotate-right\"}})],1):_vm._e()])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"icon bg-warning\"},[_c('i',{staticClass:\"fas fa-exclamation\"})])\n}]\n\nexport { render, staticRenderFns }","import { isLocalStorageSupported } from '@static/js/utils'\n\nexport default function ViewingThrottle(printerId, countDownCallback) {\n  const localStorageItemId = `tsNextVideoCycle-${printerId}`\n  let self = {\n    countDownTimer: null,\n  }\n\n  self.startOrResumeVideoCycle = function () {\n    if (!self.countDownTimer) {\n      self.countDownTimer = setInterval(() => self.countDown(), 1000)\n    }\n  }\n\n  self.resumeVideoCycle = function () {\n    if (remainingSeconds < 60 && !self.countDownTimer) {\n      self.countDownTimer = setInterval(() => self.countDown(), 1000)\n    }\n  }\n\n  self.countDown = function () {\n    self.updateRemainingSeconds(remainingSeconds - 1)\n\n    if (isLocalStorageSupported()) {\n      localStorage.setItem(localStorageItemId, new Date().getTime() / 1000 + remainingSeconds)\n    }\n\n    if (remainingSeconds < 0) {\n      self.updateRemainingSeconds(60)\n      clearInterval(this.countDownTimer)\n      this.countDownTimer = null\n    }\n  }\n\n  self.updateRemainingSeconds = function (newValue) {\n    remainingSeconds = newValue\n    const remainingViewableSeconds = remainingSeconds - 30\n    const remainingSecondsUntilNextCycle = remainingSeconds > 30 ? -1 : remainingSeconds\n    countDownCallback(remainingViewableSeconds, remainingSecondsUntilNextCycle)\n  }\n\n  let remainingSeconds\n  if (isLocalStorageSupported()) {\n    const tsNextVideoCycle = parseFloat(localStorage.getItem(localStorageItemId))\n    const now = new Date().getTime() / 1000\n    if (!tsNextVideoCycle || now > tsNextVideoCycle) {\n      self.updateRemainingSeconds(60)\n    } else {\n      self.updateRemainingSeconds(Math.round(tsNextVideoCycle - now))\n    }\n  } else {\n    self.updateRemainingSeconds(60)\n  }\n\n  return self\n}\n","<template>\n  <div>\n    <div\n      v-show=\"slowLinkLoss > 50\"\n      ref=\"slowLinkWrapper\"\n      class=\"slow-link-wrapper\"\n      @click=\"slowLinkClicked\"\n      @mouseenter=\"\n        fixSlowLinkTextWidth()\n        slowLinkShowing = true\n        slowLinkHiding = false\n      \"\n      @mouseleave=\"\n        fixSlowLinkTextWidth()\n        slowLinkShowing = false\n        slowLinkHiding = true\n      \"\n    >\n      <div class=\"icon bg-warning\">\n        <i class=\"fas fa-exclamation\"></i>\n      </div>\n      <div\n        ref=\"slowLinkText\"\n        class=\"text\"\n        :class=\"{\n          'show-and-hide': !slowLinkShowing && !slowLinkHiding,\n          showing: slowLinkShowing && !slowLinkHiding,\n          hiding: !slowLinkShowing && slowLinkHiding,\n        }\"\n      >\n        {{$t(\"Video frames dropped\")}}\n      </div>\n    </div>\n    <div v-show=\"trackMuted\" class=\"muted-status-wrapper\">\n      <div class=\"text\">{{ $t(\"Buffering...\") }}</div>\n      <a href=\"#\" @click=\"showMutedStatusDescription($event)\">{{ $t(\"Why is it stuck?\") }}</a>\n    </div>\n    <b-button\n      v-if=\"\n        isVideoAvailable && !autoplay && (isBasicStreamingReadyToPlay || isBasicStreamingFrozen)\n      \"\n      class=\"centered-element p-0\"\n      :disabled=\"isBasicStreamingFrozen\"\n      @click=\"onPlayBtnClicked\"\n    >\n      <i v-if=\"isBasicStreamingReadyToPlay\" class=\"fas fa-play ml-1\"></i>\n      <span v-if=\"isBasicStreamingFrozen\" class=\"medium\"\n        >{{ remainingSecondsUntilNextCycle }}s</span\n      >\n    </b-button>\n    <b-spinner\n      v-if=\"trackMuted || videoLoading\"\n      class=\"centered-element\"\n      label=\"Buffering...\"\n    ></b-spinner>\n    <div v-if=\"taggedSrc && !showMJpeg && !showVideo\" class=\"streaming-info overlay-info small\">\n      {{$t(\"Real-time stream unavailable, showing last captured image\")}}\n    </div>\n    <div v-if=\"isVideoAvailable\">\n      <!-- show countdown and bitrate while streaming -->\n      <div\n        v-if=\"(!autoplay && isBasicStreamingInProgress) || currentBitrate\"\n        class=\"streaming-info overlay-info small\"\n        :class=\"{ clickable: isBasicStreamingInProgress }\"\n        @click=\"onInfoClicked\"\n      >\n        <div v-if=\"isBasicStreamingInProgress\" class=\"text-success\">\n          {{ remainingSecondsCurrentVideoCycle }}\n        </div>\n        <div v-if=\"currentBitrate\">{{ currentBitrate }}</div>\n      </div>\n      <!-- show full-width info message -->\n      <div\n        v-if=\"!autoplay && (isBasicStreamingReadyToPlay || isBasicStreamingFrozen)\"\n        class=\"streaming-guide overlay-info\"\n        @click=\"onInfoClicked\"\n      >\n        <div v-if=\"isBasicStreamingReadyToPlay\" class=\"message\">\n          {{$t(\"Webcam streams up to 5 FPS for Free\")}}\n        </div>\n        <div v-if=\"isBasicStreamingFrozen\" class=\"message text-warning\">\n          {{ remainingSecondsUntilNextCycle }}s left in the cooldown period\n        </div>\n        <a href=\"#\" class=\"learn-more\">{{ $t(\"Learn more...\") }}</a>\n      </div>\n    </div>\n    <div class=\"image-container\">\n      <img\n        class=\"webcamImage\"\n        :style=\"webcamStyle\"\n        :src=\"require('@static/img/print-padded.png')\"\n      />\n      <img\n        v-if=\"taggedSrc\"\n        class=\"webcamImage stackedImage\"\n        :style=\"webcamStyle\"\n        :src=\"taggedSrc\"\n        :alt=\"printer.name + ' current image'\"\n      />\n      <img\n        :src=\"mjpgSrc\"\n        v-show=\"showMJpeg\"\n        class=\"webcamImage stackedImage\"\n        :style=\"webcamStyle\"\n      />\n      <video\n        v-show=\"showVideo\"\n        ref=\"video\"\n        class=\"webcamImage stackedImage\"\n        :style=\"webcamStyle\"\n        :poster=\"taggedSrc\"\n        autoplay\n        muted\n        playsinline\n        @loadstart=\"onLoadStart()\"\n        @canplay=\"onCanPlay()\"\n      >\n      </video>\n    </div>\n\n    <div class=\"extra-controls\">\n      <div\n        v-if=\"showVideo || showVideo || taggedSrc\"\n        class=\"video-control-btn\"\n        @click=\"onRotateRightClicked\"\n      >\n        <font-awesome-icon icon=\"fa-solid fa-rotate-right\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport get from 'lodash/get'\nimport ifvisible from 'ifvisible'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport Janus from '@src/lib/janus'\nimport { toArrayBuffer } from '@src/lib/utils'\nimport ViewingThrottle from '@src/lib/viewing-throttle'\n\nfunction MJpegStreamDecoder(onFrame) {\n  const self = {\n    onFrame,\n    contentLength: NaN,\n    imageBuffer: '',\n    bytesRead: 0,\n    originalJpgLength: 0,\n  }\n\n  self.onMJpegChunk = function (maybeBin) {\n    toArrayBuffer(maybeBin, (arrayBuffer) => {\n      const value = new TextDecoder('utf-8').decode(new Uint8Array(arrayBuffer))\n      if (self.contentLength) {\n        self.imageBuffer += value\n        self.bytesRead += value.length\n\n        if (self.bytesRead >= self.contentLength) {\n          const jpg = self.imageBuffer\n          const jpgLength = self.originalJpgLength\n          self.contentLength = NaN\n          self.imageBuffer = ''\n          self.bytesRead = 0\n          self.originalJpgLength = 0\n          self.onFrame(jpg, jpgLength)\n        }\n      } else {\n        if (value.slice(0, 2) == '\\r\\n' && value.slice(value.length - 2) == '\\r\\n') {\n          // if (isEqual(value.slice(0, 2), crlf) && isEqual(value.slice(value.byteLength-2), crlf) ) {\n          // const lengthHeaders = (new TextDecoder(\"utf-8\")).decode( value.slice(2, value.byteLength - 2) ).split(':');\n          const lengthHeaders = value.slice(2, value.length - 2).split(':')\n          self.contentLength = parseInt(lengthHeaders[0])\n          self.originalJpgLength = parseInt(lengthHeaders[1])\n        }\n      }\n    })\n  }\n\n  return self\n}\n\nexport default {\n  name: 'StreamingBox',\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    webrtc: {\n      type: Object,\n      default: null,\n    },\n    webcam: {\n      type: Object,\n      default: null,\n    },\n    halfHeight: {\n      type: Boolean,\n      default: false,\n    },\n    autoplay: {\n      type: Boolean,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      stickyStreamingSrc: null,\n      isVideoAvailable: false,\n      isVideoVisible: false,\n      remainingSecondsCurrentVideoCycle: 30,\n      remainingSecondsUntilNextCycle: -1,\n      currentBitrate: null,\n      slowLinkLoss: 0,\n      slowLinkShowing: false, // show on mousenter\n      slowLinkHiding: false, // hide on moseleave\n      trackMuted: false,\n      videoLoading: false,\n      mjpgSrc: null,\n      localStorageRotationKey: `${this.printer.id}_${this.webcam?.stream_id || 0}`,\n      customRotationDeg: 0,\n    }\n  },\n\n  computed: {\n    showVideo() {\n      return this.isVideoVisible && this.stickyStreamingSrc !== 'IMAGE'\n    },\n    showMJpeg() {\n      return this.mjpgSrc && this.stickyStreamingSrc !== 'IMAGE'\n    },\n    videoRotationDeg() {\n      const rotation = +(this.webcam?.rotation || 0) + this.customRotationDeg\n      return rotation % 360\n    },\n    webcamVideoHeight() {\n      switch (this.printer.settings.ratio169) {\n        case true:\n          return 540\n        case false:\n          return 720\n        default:\n          return 720\n      }\n    },\n    taggedSrc() {\n      if (!this.webcam || this.webcam?.is_primary_camera) {\n        return  get(this.printer, 'pic.img_url', null)\n      }\n      return null\n    },\n\n    // streaming timeline\n    isBasicStreamingInProgress() {\n      return (\n        this.remainingSecondsCurrentVideoCycle > 0 && this.remainingSecondsCurrentVideoCycle < 30\n      )\n    },\n    isBasicStreamingReadyToPlay() {\n      return (\n        !this.isVideoVisible &&\n        !this.trackMuted &&\n        !this.videoLoading &&\n        (this.remainingSecondsCurrentVideoCycle == 30 || this.remainingSecondsUntilNextCycle == 0)\n      )\n    },\n    isBasicStreamingFrozen() {\n      return this.remainingSecondsUntilNextCycle > 0 && !this.isVideoVisible\n    },\n    basicStreamingInWebrtc() {\n      return this.printer.isAgentVersionGte('2.1.0', '0.3.0')\n    },\n    webcamStyle() {\n      const maxHeight = window.innerHeight / (this.halfHeight ? 2 : 1) - 75\n      const output = {\n          transform: this.generateTransform(\n              this.webcam?.flipH ?? false,\n              this.webcam?.flipV ?? false,\n              this.videoRotationDeg ?? 0\n          ),\n          aspectRatio: 16 / 9,\n          maxHeight: maxHeight + 'px',\n          maxWidth: 'auto',\n      }\n\n      if (this.webcam?.streamRatio) {\n          const [width, height] = this.webcam.streamRatio.split(':').map(Number)\n          output.aspectRatio = width / height\n          output.maxWidth = (window.innerHeight - 155) * output.aspectRatio + 'px'\n      }\n\n      if (this.webcam?.streamRatio && [90, 270].includes(this.videoRotationDeg)) {\n          if (output.transform === 'none') output.transform = ''\n          const scale = 1 / output.aspectRatio\n          output.transform += ' rotate(' + this.videoRotationDeg + 'deg) scale(' + scale + ')'\n      }\n\n      return output\n    },\n  },\n  watch: {\n    webrtc: {\n      handler: 'initWebRTC',\n    },\n  },\n  created() {\n    this.customRotationDeg = getLocalPref('webcamRotationDeg', 0, this.localStorageRotationKey)\n    this.mjpegStreamDecoder = new MJpegStreamDecoder((jpg, l) => {\n      this.mjpgSrc = `data:image/jpg;base64,${jpg}`\n      this.onCanPlay()\n    })\n    if (!this.autoplay) {\n      this.videoLimit = ViewingThrottle(this.printer.id, this.countDownCallback)\n    }\n    this.initWebRTC()\n    ifvisible.on('blur', () => {\n      if (this.webrtc) {\n        this.webrtc.stopStream()\n      }\n    })\n    ifvisible.on('focus', () => {\n      if (this.webrtc && this.autoplay) {\n        this.webrtc.startStream()\n      }\n    })\n  },\n\n  methods: {\n    initWebRTC() {\n      if (this.webrtc) {\n        this.webrtc.setCallbacks({\n          onStreamAvailable: this.onStreamAvailable,\n          onRemoteStream: this.onWebRTCRemoteStream,\n          onDefaultStreamCleanup: () => (this.isVideoVisible = false),\n          onSlowLink: this.onSlowLink,\n          onTrackMuted: () => (this.trackMuted = true),\n          onTrackUnmuted: () => (this.trackMuted = false),\n          onBitrateUpdated: (bitrate) => {\n            this.currentBitrate = bitrate.value\n          },\n          onMJpegData: this.mjpegStreamDecoder.onMJpegChunk,\n        })\n      }\n    },\n    onRotateRightClicked() {\n      this.customRotationDeg = this.customRotationDeg + 90;\n      setLocalPref('webcamRotationDeg', this.customRotationDeg % 360, this.localStorageRotationKey)\n      this.$emit('onRotateRightClicked', this.customRotationDeg);\n    },\n    onCanPlay() {\n      this.videoLoading = false\n      if (!this.autoplay) {\n        this.videoLimit.startOrResumeVideoCycle()\n      }\n    },\n    onLoadStart() {\n      this.videoLoading = true\n    },\n    onStreamAvailable(webrtcConn) {\n      if (this.autoplay) {\n        webrtcConn.startStream()\n      } else {\n        if (!this.basicStreamingInWebrtc) {\n          return\n        }\n        if (!this.autoplay && this.isBasicStreamingInProgress) {\n          webrtcConn.startStream()\n        }\n        this.videoLimit.resumeVideoCycle()\n      }\n      this.isVideoAvailable = true\n    },\n    onWebRTCRemoteStream(stream) {\n      Janus.attachMediaStream(this.$refs.video, stream)\n\n      const videoTracks = stream.getVideoTracks()\n      if (videoTracks === null || videoTracks === undefined || videoTracks.length === 0) {\n        // No remote video\n        this.isVideoVisible = false\n      } else {\n        this.isVideoVisible = true\n      }\n    },\n\n    /** Free user streaming **/\n\n    countDownCallback(remainingSecondsCurrentVideoCycle, remainingSecondsUntilNextCycle) {\n      if (this.remainingSecondsCurrentVideoCycle > 0 && remainingSecondsCurrentVideoCycle <= 0) {\n        this.webrtc.stopStream()\n      }\n      this.remainingSecondsCurrentVideoCycle = remainingSecondsCurrentVideoCycle\n      this.remainingSecondsUntilNextCycle = remainingSecondsUntilNextCycle\n    },\n\n    onInfoClicked() {\n  if (this.autoplay) {\n    return;\n  }\n  this.$swal.Prompt.fire({\n    title: `${this.$i18next.t(`Upgrade for Better Streaming`)}`,\n    html: `\n      <p>${this.$i18next.t(\"Because you are now on the\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/upgrade-to-pro/?source=basic_streaming')}\">${this.$i18next.t(\"{brandName} Cloud Free plan\",{brandName:this.$syndicateText.brandName})}</a>:</p>\n      <ul>\n        <li>${this.$i18next.t(\"Streaming is limited to 5 FPS (frames per second).\")}</li>\n        <li>${this.$i18next.t(\"After 30 seconds of streaming there is a 30-second cooldown before you can resume streaming.\")}</li>\n      </ul>\n      <p>${this.$i18next.t(\"Support the {brandName} project by\",{brandName:this.$syndicateText.brandName})} <a href=\"${this.getAppUrl('/ent_pub/pricing/?source=basic_streaming')}\">${this.$i18next.t(\"upgrading to the Pro plan for little more than 1 Starbucks a month.\")}</a></p> ${this.$i18next.t(\"The Pro plan offers many perks, including the\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/webcam-streaming-for-human-eyes/?source=basic_streaming')}\">${this.$i18next.t(\"Premium Streaming\")}</a>:</p>\n      <ul>\n        <li>${this.$i18next.t(\"Smooth 25 FPS.\")}</li>\n        <li>${this.$i18next.t(\"Unlimited streaming with no cooldowns.\")}</li>\n      </ul>\n    `,\n    showCloseButton: true,\n      });\n    },\n\n    /** End of free user streaming **/\n\n    /** Video warning handling */\n\n    onPlayBtnClicked() {\n      this.webrtc.startStream()\n    },\n\n    fixSlowLinkTextWidth() {\n      const width = window.getComputedStyle(this.$refs.slowLinkText).width\n      this.$refs.slowLinkText.style.width = width\n    },\n\n    onSlowLink(loss) {\n      this.slowLinkLoss += loss\n    },\n\n    slowLinkClicked() {\n      this.slowLinkShowing = false;\n      this.slowLinkHiding = false;\n      this.slowLinkLoss = 0;\n\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Video frames dropped')}`,\n        html: `\n          <p>${this.$i18next.t(\"The video frames are getting dropped because there is most likely a bandwidth bottleneck along the route they travel from your Raspberry Pi to your computer. The bottleneck can be anywhere, but in most cases,\")} <Text bold>${this.$i18next.t(\"it is either your computer's internet connection, or your Raspberry Pi's\")}</Text>.</p>\n          <p>${this.$i18next.t(\"Make sure your computer is connected to the same network as your Pi. If you still see this warning, you need to trouble-shoot your computer's Wi-Fi connection, probably by moving closer to the Wi-Fi router.\")}</p>\n          <p>${this.$i18next.t(\"If the webcam stream is smooth when your computer is on the same Wi-Fi network as your Pi, the bottleneck is likely with the upload speed of your internet connection. You need to run a speed test to make sure you have high-enough upload speed, as well as\")} <b>${this.$i18next.t(\"low latency (ping)\")}</b>.</p>\n          <p>${this.$i18next.t(\"Check out\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/webcam-feed-is-laggy/')}\">${this.$i18next.t(\"the step-by-step trouble-shooting guide.\")}</a></p>\n        `,\n        showCloseButton: true,\n      });\n    },\n\n    showMutedStatusDescription(event) {\n      event.preventDefault()\n\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Webcam stream buffering')}`,\n        html: `\n          <p>${this.$i18next.t(\"When you see the messaging about webcam stream is 'buffering' occasionally, you can just reload the page. If this message repeatedly appears, it may indicate one of the problems\")}:</p>\n          <p class=\"lead\">${this.$i18next.t(\"1. A constricted video stream on your Raspberry Pi. The most common reasons are\")}:</p>\n          <ul>\n            <li>${this.$i18next.t(\"Camera resolution is set too high.\")}</li>\n            <li>${this.$i18next.t(\"Camera framerate is set too high.\")}</li>\n            <li>${this.$i18next.t(\"The upload speed of your Raspberry Pi is too low.\")}</li>\n          </ul>\n          <p class=\"lead\">${this.$i18next.t(\"2. The internet connection of your computer or phone is not fast enough.\")}</p>\n          <p class=\"lead\">${this.$i18next.t(\"3. Your webcam is not properly connected to your Raspberry Pi.\")}</p>\n          <br>\n          <p>${this.$i18next.t(\"Check\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/webcam-feed-is-laggy')}\">${this.$i18next.t(\"this step-by-step troubleshooting guide\")}</a>.</p>\n        `,\n        showCloseButton: true,\n      })\n    },\n    generateTransform(flip_horizontal, flip_vertical, rotation) {\n        let transforms = ''\n        if (flip_horizontal) transforms += ' scaleX(-1)'\n        if (flip_vertical) transforms += ' scaleY(-1)'\n        \n        // Apply rotation for all degrees, not just 180\n        if (rotation && rotation !== 0) {\n            transforms += ` rotate(${rotation}deg)`\n        }\n\n        // return transform when exist\n        if (transforms.trimStart().length) return transforms.trimStart()\n\n        // return none as fallback\n        return 'none'\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.image-container\n  position: relative\n  width: 100%\n  height: 100%\n\n.webcamImage\n  width: 100%\n  height: 100%\n  object-fit: contain\n\n.stackedImage\n  position: absolute\n  top: 0\n  left: 0\n\n.centered-element\n  position: absolute\n  width: 3rem\n  height: 3rem\n  top: calc(50% - 1.5rem)\n  left: calc(50% - 1.5rem)\n  z-index: 99\n\n.overlay-info\n  position: absolute\n  right: 0\n  top: 0\n  z-index: 99\n  background-color: rgb(0 0 0 / .5)\n  padding: 4px 8px\n\n.streaming-info\n  text-align: right\n  &.clickable\n    cursor: pointer\n\n.streaming-guide\n  left: 0\n  display: flex\n  justify-content: space-between\n  cursor: pointer\n\n  @media (max-width: 576px)\n    font-size: .8rem\n\n  &:hover .learn-more\n    color: var(--color-primary-hover)\n\n.slow-link-wrapper\n  $height: 24px\n  position: absolute\n  height: $height\n  z-index: 10\n  background-color: rgb(0 0 0 / .2)\n  border-radius: $height\n  top: 10px\n  left: 10px\n  padding-left: $height\n  line-height: $height\n  font-size: 14px\n  width: auto\n\n  &:hover\n    cursor: pointer\n\n  .text\n    width: 0\n    height: $height\n    overflow: hidden\n    text-align: center\n    opacity: 0\n\n    &.show-and-hide\n      animation-name: showAndHideText\n      animation-duration: 3s\n\n    &.showing\n      animation-name: showText\n      animation-duration: .4s\n      animation-fill-mode: forwards\n\n    &.hiding\n      animation-name: hideText\n      animation-duration: .4s\n      animation-fill-mode: forwards\n\n    $widthFull: 160px\n    $paddingRightFull: 10px\n\n    @keyframes showText\n      from\n        opacity: 0\n      99%\n        width: $widthFull\n        padding-right: $paddingRightFull\n        opacity: 0\n      to\n        width: $widthFull\n        padding-right: $paddingRightFull\n        opacity: 1\n\n    @keyframes hideText\n      from\n        opacity: 1\n      1%\n        opacity: 0\n      to\n        width: 0\n        padding-right: 0\n        opacity: 0\n\n    @keyframes showAndHideText\n      0%\n        width: 0\n        opacity: 0\n      19%\n        width: $widthFull\n        padding-right: $paddingRightFull\n        opacity: 0\n      20%\n        opacity: 1\n      80%\n        opacity: 1\n        width: $widthFull\n        padding-right: $paddingRightFull\n      81%\n        opacity: 0\n      100%\n        width: 0\n        padding-right: 0\n        opacity: 0\n\n  .icon\n    width: 20px\n    height: 20px\n    border-radius: 10px\n    position: absolute\n    top: 2px\n    left: 2px\n    font-size: 12px\n    line-height: 20px\n    text-align: center\n    color: var(--color-on-warning)\n\n.muted-status-wrapper\n  position: absolute\n  width: 100%\n  z-index: 10\n  bottom: 0\n  left: 0\n  background-color: var(--color-overlay)\n  text-align: center\n  padding: 10px 0\n\n.poster-placeholder\n  $size: 100px\n  color: rgb(255 255 255 / .2)\n  width: $size\n  height: $size\n  position: absolute\n  left: calc(50% - $size / 2)\n  top: calc(50% - $size / 2)\n\n.extra-controls\n  position: absolute\n  display: flex\n  flex-direction: row\n  right: 0\n  bottom: 0\n  padding: .5rem\n  .video-control-btn\n    width: 2rem\n    height: 2rem\n    margin: 0.1rem\n    border-radius: 999px\n    background-color: var(--color-overlay)\n    color: var(--color-text-secondary)\n    display: flex\n    align-items: center\n    justify-content: center\n    &:hover\n      color: var(--color-text-primary)\n      cursor: pointer\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StreamingBox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StreamingBox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StreamingBox.vue?vue&type=template&id=0986fe8b&scoped=true&\"\nimport script from \"./StreamingBox.vue?vue&type=script&lang=js&\"\nexport * from \"./StreamingBox.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StreamingBox.vue?vue&type=style&index=0&id=0986fe8b&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0986fe8b\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.valid && !_vm.printing)?_c('span',[_vm._v(\"-\")]):_vm._e(),(!_vm.valid && _vm.printing)?_c('b-spinner',{attrs:{\"small\":\"\",\"type\":\"grow\",\"label\":\"Calculating...\"}}):_vm._e(),(_vm.valid && _vm.showHours)?_c('span',[_vm._v(\" \"+_vm._s(_vm.hours)),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"h\")])]):_vm._e(),(_vm.valid && _vm.showMinutes)?_c('span',[_vm._v(\" \"+_vm._s(_vm.minutes)),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"m\")])]):_vm._e(),(_vm.valid && _vm.showSeconds)?_c('span',[_vm._v(\" \"+_vm._s(_vm.seconds)),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"s\")])]):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <span v-if=\"!valid && !printing\">-</span>\n    <b-spinner v-if=\"!valid && printing\" small type=\"grow\" label=\"Calculating...\"></b-spinner>\n    <span v-if=\"valid && showHours\"\n      >&nbsp;{{ hours }}<span class=\"text-subscript text-muted\">h</span></span\n    >\n    <span v-if=\"valid && showMinutes\"\n      >&nbsp;{{ minutes }}<span class=\"text-subscript text-muted\">m</span></span\n    >\n    <span v-if=\"valid && showSeconds\"\n      >&nbsp;{{ seconds }}<span class=\"text-subscript text-muted\">s</span></span\n    >\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'DurationBlock',\n  props: {\n    valid: {\n      type: Boolean,\n      required: true,\n    },\n    printing: {\n      type: Boolean,\n      required: true,\n    },\n    hours: {\n      type: Number,\n      default() {\n        return 0\n      },\n    },\n    showHours: {\n      type: Boolean,\n      default() {\n        return false\n      },\n    },\n    minutes: {\n      type: Number,\n      default() {\n        return 0\n      },\n    },\n    showMinutes: {\n      type: Boolean,\n      default() {\n        return false\n      },\n    },\n    seconds: {\n      type: Number,\n      default() {\n        return 0\n      },\n    },\n    showSeconds: {\n      type: Boolean,\n      default() {\n        return false\n      },\n    },\n  },\n}\n</script>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DurationBlock.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DurationBlock.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DurationBlock.vue?vue&type=template&id=c6842bbe&\"\nimport script from \"./DurationBlock.vue?vue&type=script&lang=js&\"\nexport * from \"./DurationBlock.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper\"},_vm._l((_vm.temperatures),function(item,key){return _c('temperature-item',{key:key,attrs:{\"temp-key\":key,\"temp-item\":item,\"is-plugin-version-sufficient\":_vm.isPluginVersionSufficient},on:{\"TempEditClicked\":function($event){return _vm.onEditClicked(key, item)}}})}),1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"temp-item\",class:{ editable: _vm.editable },on:{\"click\":function($event){return _vm.onEditClicked(_vm.tempKey, _vm.tempItem)}}},[_c('div',{staticClass:\"icon\"},[(_vm.heaterIcon)?_c('svg',[_c('use',{attrs:{\"href\":_vm.heaterIcon}})]):_c('i',{staticClass:\"fas fa-thermometer-empty\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.temperatureDisplayName(_vm.tempKey)))]),_c('div',{staticClass:\"value-wrapper\"},[_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(parseFloat(_vm.tempItem.actual).toFixed(1))+\" °C\")]),(_vm.editable)?_c('div',{staticClass:\"target\"},[_vm._v(\"/ \"+_vm._s(Math.round(_vm.tempItem.target))+\" °C\")]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"temp-item\" :class=\"{ editable }\" @click=\"onEditClicked(tempKey, tempItem)\">\n    <div class=\"icon\">\n      <svg v-if=\"heaterIcon\">\n        <use :href=\"heaterIcon\" />\n      </svg>\n      <i v-else class=\"fas fa-thermometer-empty\"></i>\n    </div>\n    <div class=\"title\">{{ temperatureDisplayName(tempKey) }}</div>\n    <div class=\"value-wrapper\">\n      <div class=\"value\">{{ parseFloat(tempItem.actual).toFixed(1) }} °C</div>\n      <div v-if=\"editable\" class=\"target\">/ {{ Math.round(tempItem.target) }} °C</div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { temperatureDisplayName } from '@src/lib/utils'\n\nexport default {\n  name: 'TemperatureItem',\n\n  props: {\n    tempItem: {\n      type: Object,\n      required: true,\n    },\n    tempKey: {\n      type: String,\n      required: true,\n    },\n    isPluginVersionSufficient: {\n      type: Boolean,\n      required: true,\n    },\n  },\n\n  computed: {\n    heaterIcon() {\n      const key = this.tempKey.toLowerCase()\n      if (key.includes('bed')) {\n        return '#bed-temp'\n      } else if (key.includes('tool') || key.includes('extruder')) {\n        return '#extruder'\n      }\n      return null\n    },\n    editable() {\n      return this.isPluginVersionSufficient && this.tempItem.target !== null\n    },\n  },\n\n  methods: {\n    onEditClicked(key, item) {\n      if (this.editable) {\n        this.$emit('TempEditClicked', key, item)\n      }\n    },\n    temperatureDisplayName,\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.temp-item\n  display: flex\n  width: 100%\n  background-color: var(--color-background)\n  padding: .8125rem\n  border-radius: var(--border-radius-md)\n  gap: 1rem\n  align-items: center\n  &.editable\n    cursor: pointer\n.icon\n  width: 36px\n  height: 36px\n  display: flex\n  align-items: center\n  justify-content: center\n  background-color: var(--color-primary)\n  color: var(--color-on-primary)\n  border-radius: var(--border-radius-sm)\n  svg\n    width: 20px\n    height: 20px\n    color: var(--color-on-primary)\n\n.value-wrapper\n  margin-left: auto\n  display: flex\n  gap: .375rem\n.value\n  font-weight: bold\n.target\n  color: var(--color-text-secondary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TemperatureItem.vue?vue&type=template&id=22dafde6&scoped=true&\"\nimport script from \"./TemperatureItem.vue?vue&type=script&lang=js&\"\nexport * from \"./TemperatureItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemperatureItem.vue?vue&type=style&index=0&id=22dafde6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"22dafde6\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"wrapper\">\n    <temperature-item\n      v-for=\"(item, key) in temperatures\"\n      :key=\"key\"\n      :temp-key=\"key\"\n      :temp-item=\"item\"\n      :is-plugin-version-sufficient=\"isPluginVersionSufficient\"\n      @TempEditClicked=\"onEditClicked(key, item)\"\n    />\n  </div>\n</template>\n\n<script>\nimport TemperatureItem from '@src/components/printers/TemperatureItem.vue'\n\nexport default {\n  name: 'StatusTemp',\n  components: {\n    TemperatureItem,\n  },\n\n  props: {\n    temperatures: {\n      type: Object,\n      required: true,\n    },\n    isPluginVersionSufficient: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  methods: {\n    onEditClicked(key, item) {\n      if (this.isPluginVersionSufficient && item.target !== null) {\n        this.$emit('TempEditClicked', key, item)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n  padding: 1rem 0 1rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusTemp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusTemp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StatusTemp.vue?vue&type=template&id=395dc948&scoped=true&\"\nimport script from \"./StatusTemp.vue?vue&type=script&lang=js&\"\nexport * from \"./StatusTemp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StatusTemp.vue?vue&type=style&index=0&id=395dc948&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"395dc948\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"text-center\"},[(_vm.value > 0)?_c('h1',{staticClass:\"target-temp-degree\"},[_vm._v(\" \"+_vm._s(_vm.value)+\" \"),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"°C\")])]):_vm._e(),(_vm.value < 1)?_c('h1',{staticClass:\"target-temp-degree\"},[_vm._v(_vm._s(_vm.$t(\"OFF\")))]):_vm._e()]),_c('br'),_c('div',{staticClass:\"mb-5\"},[_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Presets\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"id_preset\"},on:{\"change\":_vm.onPresetChanged},model:{value:(_vm.preset),callback:function ($$v) {_vm.preset=$$v},expression:\"preset\"}},_vm._l((_vm.allPresets),function(pre){return _c('b-form-select-option',{key:pre.name,attrs:{\"value\":parseInt(pre.value)}},[_vm._v(\" \"+_vm._s(pre.title)+\" \")])}),1)],1),_c('br'),_c('h5',[_vm._v(_vm._s(_vm.$t(\"Manual\"))+\":\")]),_c('div',[_c('slider-input',{attrs:{\"min\":0,\"max\":_vm.maxTemp,\"step\":1},on:{\"change\":_vm.onSliderChanged},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}}),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"id\":\"target-temp\",\"type\":\"hidden\"},domProps:{\"value\":(_vm.value)},on:{\"input\":function($event){if($event.target.composing)return;_vm.value=$event.target.value}}})],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"slidecontainer\"},[_c('input',{staticClass:\"slider\",attrs:{\"type\":\"range\",\"min\":_vm.min,\"max\":_vm.max,\"step\":_vm.step},domProps:{\"value\":_vm.value},on:{\"change\":function($event){_vm.$emit('change', Number($event.target.value))},\"input\":function($event){_vm.$emit('input', Number($event.target.value))}}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"slidecontainer\">\n    <input\n      type=\"range\"\n      :min=\"min\"\n      :max=\"max\"\n      :step=\"step\"\n      :value=\"value\"\n      class=\"slider\"\n      @change=\"$emit('change', Number($event.target.value))\"\n      @input=\"$emit('input', Number($event.target.value))\"\n    />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SliderInput',\n\n  props: {\n    value: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 100,\n    },\n    min: {\n      type: Number,\n      default: 0,\n    },\n    step: {\n      type: Number,\n      default: 1,\n    },\n  },\n\n  computed: {},\n  methods: {},\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.slidecontainer\n  width: 100%\n\n.slider\n  -webkit-appearance: none\n  appearance: none\n  width: 100%\n  height: 5px\n  background: var(--color-input-background)\n  outline: none\n  border: none\n\n// The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */\n.slider::-webkit-slider-thumb\n  -webkit-appearance: none\n  appearance: none\n  width: 25px\n  height: 25px\n  border-radius: 50%\n  background: var(--color-text-primary)\n  cursor: pointer\n  border: none\n\n.slider::-moz-range-thumb\n  width: 25px\n  height: 25px\n  border-radius: 50%\n  background: var(--color-text-primary)\n  cursor: pointer\n  border: none\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SliderInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SliderInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SliderInput.vue?vue&type=template&id=abb68ee6&scoped=true&\"\nimport script from \"./SliderInput.vue?vue&type=script&lang=js&\"\nexport * from \"./SliderInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SliderInput.vue?vue&type=style&index=0&id=abb68ee6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"abb68ee6\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <div class=\"text-center\">\n      <h1 v-if=\"value > 0\" class=\"target-temp-degree\">\n        {{ value }} <span class=\"text-subscript text-muted\">°C</span>\n      </h1>\n      <h1 v-if=\"value < 1\" class=\"target-temp-degree\">{{ $t(\"OFF\") }}</h1>\n    </div>\n    <br />\n    <div class=\"mb-5\">\n      <div>\n        <h5>{{ $t(\"Presets\") }}:</h5>\n      </div>\n      <div>\n        <b-form-select\n          id=\"id_preset\"\n          v-model=\"preset\"\n          class=\"form-control\"\n          @change=\"onPresetChanged\"\n        >\n          <b-form-select-option\n            v-for=\"pre in allPresets\"\n            :key=\"pre.name\"\n            :value=\"parseInt(pre.value)\"\n          >\n            {{ pre.title }}\n          </b-form-select-option>\n        </b-form-select>\n      </div>\n      <br />\n      <h5>{{ $t(\"Manual\") }}:</h5>\n      <div>\n        <slider-input\n          v-model=\"value\"\n          :min=\"0\"\n          :max=\"maxTemp\"\n          :step=\"1\"\n          @change=\"onSliderChanged\"\n        ></slider-input>\n        <input id=\"target-temp\" v-model=\"value\" type=\"hidden\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SliderInput from '@src/components/SliderInput.vue'\n\nexport default {\n  name: 'TempTargetEditor',\n  components: {\n    SliderInput,\n  },\n  props: {\n    presets: {\n      type: Array,\n      required: true,\n    },\n    maxTemp: {\n      type: Number,\n      required: true,\n    },\n    curTarget: {\n      type: Number,\n      required: true,\n    },\n  },\n  data() {\n    let curPreset = this.presets.find((pre) => pre.target == this.curTarget) || {\n      target: this.curTarget != 0 ? -1 : 0,\n    }\n    return { value: this.curTarget, preset: curPreset.target }\n  },\n  computed: {\n    allPresets() {\n      let presets = []\n      presets.push({ value: -1, title: 'Manual', name: 'manual' })\n      presets.push({ value: 0, title: 'OFF', name: 'off' })\n      this.presets.forEach((pre) => {\n        if (pre.target) {\n          presets.push({\n            value: pre.target,\n            name: pre.name,\n            title: `${pre.name} (${pre.target}°C)`,\n          })\n        }\n      })\n      return presets\n    },\n  },\n  methods: {\n    onPresetChanged() {\n      if (this.preset > -1) {\n        this.value = this.preset\n      }\n    },\n    onSliderChanged() {\n      if (this.value == 0) {\n        this.preset = 0\n      } else {\n        this.preset = -1\n      }\n    },\n  },\n}\n</script>\n<style></style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempTargetEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempTargetEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TempTargetEditor.vue?vue&type=template&id=b65b4a0c&\"\nimport script from \"./TempTargetEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./TempTargetEditor.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('h2',{staticClass:\"text-center\"},[_vm._v(_vm._s(_vm.$t(\"Printer Feed Sharing\")))]),_c('hr'),(!_vm.isProAccount)?_c('div',[_c('h5',{staticClass:\"mb-5\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Wait! You need to {localizedDom} to enable Printer feed.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"upgrade to the Pro plan\")))])]},proxy:true}],null,false,3414343479)})],1),_c('p',[_vm._v(_vm._s(_vm.$t(\"Printer feed sharing is a Pro feature.\")))]),_c('p',[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro#why-cant-the-detective-just-work-for-free-people-love-free-you-know')}},[_vm._v(\" \"+_vm._s(_vm.$t('Running the {brandName} app incurs non-trivial amount of costs',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_vm._v(\". \"+_vm._s(_vm.$t('With little more than 1 Starbucks per month, you can upgrade to a Pro account and help us run the {brandName} app smoothly.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Check out Pro pricing >>>\")))])])]):_c('div',[_c('div',{staticClass:\"py-3\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'sharing_enabled-toggle-' + _vm.printer.id,\"type\":\"checkbox\"},domProps:{\"checked\":_vm.sharedResource},on:{\"click\":_vm.onSharingToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'sharing_enabled-toggle-' + _vm.printer.id}},[_vm._v(_vm._s(_vm.$t(\"Share live feed for printer \"))+\"\\\"\"),_c('b',[_vm._v(_vm._s(_vm.printer.name))]),_vm._v(\"\\\"\")])]),_c('div',{staticClass:\"form-group\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.sharedLink),expression:\"sharedLink\"}]},[_c('div',{staticClass:\"input-group mt-4 mb-2\"},[_c('input',{ref:\"sharedLink\",staticClass:\"form-control shared-link-text\",attrs:{\"id\":\"secret-token-input\",\"type\":\"text\",\"aria-label\":\"Secret token\",\"readonly\":\"\"},domProps:{\"value\":_vm.sharedLink}}),_c('div',{staticClass:\"input-group-append\"},[_c('div',{staticClass:\"copy-button\",attrs:{\"id\":\"copy-link\",\"data-clipboard-target\":\"#secret-token-input\",\"aria-label\":\"Copy secure link to clipboard\"},on:{\"click\":_vm.copyToClipboard}},[_c('i',{staticClass:\"fas fa-clipboard\"})]),_c('b-tooltip',{attrs:{\"show\":_vm.copyStatus,\"target\":\"copy-link\",\"triggers\":\"click\",\"placement\":\"bottom\"},on:{\"update:show\":function($event){_vm.copyStatus=$event}}},[_vm._v(_vm._s(_vm.copyMessage))])],1)]),_c('div',{staticClass:\"my-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Click the clipboard icon above to copy the secure shareable link to your clipboard.\"))+\" \")]),_c('div',{staticClass:\"my-1\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`You can test the shareable link by right-clicking {localizedDom} and select 'Open Link in Incognito Window'.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.sharedLink}},[_vm._v(_vm._s(_vm.$t(\"here\")))])]},proxy:true}])})],1),_c('br'),_c('em',{staticClass:\"text-muted\"},[_c('small',[_c('div',[_vm._v(_vm._s(_vm.$t(\"Notes\"))+\":\")]),_c('ul',[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t('Send the secure link to anyone you want to share your printer feed with. They do NOT need the {brandName} account to see your printer feed.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Anyone with this shareable link will be able to see your printer feed.\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/printer-feed-sharing/')}},[_vm._v(_vm._s(_vm.$t(\"Learn more about what they can see.\")))])])])])])])]),_c('br')])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <h2 class=\"text-center\">{{ $t(\"Printer Feed Sharing\") }}</h2>\n    <hr />\n    <div v-if=\"!isProAccount\">\n      <h5 class=\"mb-5\">\n        <i18next :translation=\"$t('Wait! You need to {localizedDom} to enable Printer feed.')\">\n          <template #localizedDom>\n            <a href=\"/ent_pub/pricing/\">{{$t(\"upgrade to the Pro plan\")}}</a>\n          </template>\n        </i18next>\n\n      </h5>\n      <p>{{ $t(\"Printer feed sharing is a Pro feature.\") }}</p>\n      <p>\n        <a  :href=\"getDocUrl('/user-guides/upgrade-to-pro#why-cant-the-detective-just-work-for-free-people-love-free-you-know')\">\n          {{ $t('Running the {brandName} app incurs non-trivial amount of costs',{brandName:$syndicateText.brandName}) }}\n          </a>.\n          {{ $t('With little more than 1 Starbucks per month, you can upgrade to a Pro account and help us run the {brandName} app smoothly.',{brandName:$syndicateText.brandName}) }}\n\n      </p>\n      <p><a href=\"/ent_pub/pricing/\">{{ $t(\"Check out Pro pricing >>>\") }}</a></p>\n    </div>\n    <div v-else>\n      <div class=\"py-3\">\n        <div class=\"custom-control custom-switch\">\n          <input\n            :id=\"'sharing_enabled-toggle-' + printer.id\"\n            type=\"checkbox\"\n            class=\"custom-control-input update-printer\"\n            :checked=\"sharedResource\"\n            @click=\"onSharingToggled\"\n          />\n          <label\n            class=\"custom-control-label\"\n            :for=\"'sharing_enabled-toggle-' + printer.id\"\n            style=\"font-size: 1rem\"\n            >{{ $t(\"Share live feed for printer \") }}\"<b>{{ printer.name }}</b\n            >\"</label\n          >\n        </div>\n        <div class=\"form-group\">\n          <div v-show=\"sharedLink\">\n            <div class=\"input-group mt-4 mb-2\">\n              <input\n                id=\"secret-token-input\"\n                ref=\"sharedLink\"\n                type=\"text\"\n                class=\"form-control shared-link-text\"\n                aria-label=\"Secret token\"\n                readonly\n                :value=\"sharedLink\"\n              />\n              <div class=\"input-group-append\">\n                <div\n                  id=\"copy-link\"\n                  class=\"copy-button\"\n                  data-clipboard-target=\"#secret-token-input\"\n                  aria-label=\"Copy secure link to clipboard\"\n                  @click=\"copyToClipboard\"\n                >\n                  <i class=\"fas fa-clipboard\"></i>\n                </div>\n                <b-tooltip\n                  :show.sync=\"copyStatus\"\n                  target=\"copy-link\"\n                  triggers=\"click\"\n                  placement=\"bottom\"\n                  >{{ copyMessage }}</b-tooltip\n                >\n              </div>\n            </div>\n            <div class=\"my-1\">\n              {{$t(\"Click the clipboard icon above to copy the secure shareable link to your clipboard.\")}}\n            </div>\n            <div class=\"my-1\">\n              <i18next :translation=\"$t(`You can test the shareable link by right-clicking {localizedDom} and select 'Open Link in Incognito Window'.`)\">\n                <template #localizedDom>\n                  <a :href=\"sharedLink\">{{$t(\"here\")}}</a>\n                </template>\n              </i18next>\n\n            </div>\n            <br />\n            <em class=\"text-muted\">\n              <small>\n                <div>{{ $t(\"Notes\") }}:</div>\n                <ul>\n                  <li>\n                    {{ $t('Send the secure link to anyone you want to share your printer feed with. They do NOT need the {brandName} account to see your printer feed.',{brandName:$syndicateText.brandName}) }}\n\n                  </li>\n                  <li>\n                    {{$t(\"Anyone with this shareable link will be able to see your printer feed.\")}}\n                    <a :href=\"getDocUrl('/user-guides/printer-feed-sharing/')\"\n                      >{{ $t(\"Learn more about what they can see.\") }}</a\n                    >\n                  </li>\n                </ul>\n              </small>\n            </em>\n          </div>\n        </div>\n        <br />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\n\nexport default {\n  props: {\n    isProAccount: {\n      type: Boolean,\n      default: false,\n    },\n    printer: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      share: false,\n      sharedResource: null,\n      copyStatus: false,\n      copyMessage: '',\n    }\n  },\n\n  computed: {\n    sharedLink() {\n      if (this.sharedResource) {\n        const url = window.location\n        return `${url.protocol}//${url.host}/printers/share_token/${this.sharedResource.share_token}/`\n      }\n\n      return ''\n    },\n  },\n\n  created() {\n    this.fetchSharedResources()\n  },\n\n  methods: {\n    fetchSharedResources() {\n      return axios.get(urls.sharedResources({ printer_id: this.printer.id })).then((response) => {\n        if (response.data.length > 0) {\n          this.sharedResource = response.data[0]\n        }\n      })\n    },\n    postSharedResources() {\n      return axios.post(urls.sharedResources({ printer_id: this.printer.id })).then((response) => {\n        if (response.data.length > 0) {\n          this.sharedResource = response.data[0]\n        }\n      })\n    },\n    deleteSharedResources() {\n      return axios.delete(urls.sharedResource(this.sharedResource.id)).then(() => {\n        this.sharedResource = null\n      })\n    },\n    onSharingToggled() {\n      if (this.sharedResource) {\n        this.deleteSharedResources()\n      } else {\n        this.postSharedResources()\n      }\n    },\n    // Copy share link to clipboard\n    copyToClipboard() {\n      this.copyStatus = true\n\n      this.$refs.sharedLink.focus()\n      this.$refs.sharedLink.select()\n      try {\n        document.execCommand('copy')\n        this.copyMessage = 'Copied!'\n      } catch (err) {\n        console.error('Fallback: Oops, unable to copy', err)\n        this.copyMessage = 'Failed!'\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\nhr\n  background-color: var(--color-divider)\n\n.shared-link-text\n  color: var(--text-primary) !important\n  height: 40px\n  border-color: var(--color-divider)\n  background-color: var(--color-input-background) !important\n\n.copy-button\n  color: var(--color-primary)\n  border: 2px solid var(--color-primary)\n  border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0\n  background-color: transparent\n  display: inline-flex\n  align-items: center\n  justify-content: center\n  padding: 0 .75rem\n  font-size: 1rem\n  line-height: 1.5\n\n  &:hover\n    background-color: var(--color-primary)\n    color: var(--color-on-primary)\n    cursor: pointer\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharePrinter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharePrinter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SharePrinter.vue?vue&type=template&id=29e8b0b6&scoped=true&\"\nimport script from \"./SharePrinter.vue?vue&type=script&lang=js&\"\nexport * from \"./SharePrinter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SharePrinter.vue?vue&type=style&index=0&id=29e8b0b6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29e8b0b6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{attrs:{\"inside-card\":_vm.insideCard},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Print Job Control\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[(!_vm.printer.isOffline() && _vm.printer.hasError())?_c('div',{staticClass:\"error-container\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.printer.agentDisplayName())+\" \"+_vm._s(_vm.$t('Error')))]),_c('p',{staticClass:\"text\"},[_vm._v(\" \"+_vm._s(_vm.printer.status.state.error)+\" \")])]):_vm._e(),(_vm.printer.inUserInteractionRequired())?_c('div',{staticClass:\"warning-container\"},[_c('p',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Filament Change or User Interaction Required\")))])]):_vm._e(),(_vm.printer.inTransientState())?[_c('b-spinner',{attrs:{\"label\":\"Processing...\"}}),_c('p',[_vm._v(_vm._s(_vm.printer.calculatedState())+\"...\")])]:[(!_vm.printer.isOffline() && !_vm.printer.isDisconnected() && _vm.printer.isActive())?[_c('p',[(!_vm.printer.isPaused())?_c('span',[_vm._v(_vm._s(_vm.$t(\"Printer is Currently Printing\")))]):_c('span',[_vm._v(_vm._s(_vm.$t(\"Print is Paused\")))])]),_c('div',{staticClass:\"buttons\"},[(!_vm.printer.isPaused())?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"warning\"},on:{\"click\":function($event){return _vm.onPauseToggled($event)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-pause\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Pause\"))+\" \")],1):_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"success\"},on:{\"click\":function($event){return _vm.onPauseToggled($event)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-play\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Resume\"))+\" \")],1),_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"danger\"},on:{\"click\":_vm.onCancelClicked}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-xmark\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Cancel\"))+\" \")],1)],1)]:_vm._e(),(!_vm.printer.isOffline() && !_vm.printer.isDisconnected() && !_vm.printer.isActive())?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Open G-Code File to Start Printing\")))]),_c('div',{staticClass:\"buttons\"},[_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-primary\"},on:{\"click\":_vm.openObicoFiles}},[_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})]),_vm._v(\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"Files\"))+\" \")]),(_vm.printer.isAgentMoonraker())?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":_vm.openPrinterFiles}},[_vm._v(\"   \"),_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-klipper-logo\"}})]),_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-fluidd-logo\"}})]),_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-mainsail-logo\"}})]),_vm._v(\"   \")]):_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":_vm.openPrinterFiles}},[_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-octoprint-logo\"}})]),_vm._v(\" OctoPrint \")])],1)]:_vm._e()],(!_vm.printer.isOffline() && _vm.printer.isDisconnected())?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Printer Not Connected at the Serial Port\")))]),_c('div',{staticClass:\"buttons\"},[(!_vm.printer.isAgentMoonraker())?_c('b-button',{attrs:{\"variant\":\"outline-primary\",\"disabled\":_vm.connecting},on:{\"click\":_vm.onConnectClicked}},[(_vm.connecting)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_c('i',{staticClass:\"fab fa-usb\"}),_vm._v(\" \"+_vm._s(_vm.connecting ? _vm.$t('Contacting OctoPrint') : _vm.$t('Connect'))+\" \")],1):_vm._e()],1)]:(_vm.printer.isOffline())?[_c('i',{staticClass:\"fas fa-exclamation-triangle big-icon warning\"}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"{brandName} Plugin is Offline.\",{brandName:_vm.$syndicateText.brandName}))+\" \"),_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/troubleshoot-server-connection-issues/')}},[_vm._v(_vm._s(_vm.$t(\"Why?\")))])])]:_vm._e(),(_vm.printer)?_c('b-modal',{attrs:{\"id\":_vm.modalId,\"size\":\"lg\"},on:{\"hidden\":_vm.resetGcodesModal}},[(_vm.selectedGcodeId)?_c('g-code-file-page',{attrs:{\"is-popup\":true,\"target-printer-id\":_vm.printer.id,\"route-params\":{\n            fileId: _vm.selectedGcodeId,\n            printerId: _vm.printerFiles ? _vm.printer.id : null,\n          },\"on-close\":() => _vm.$bvModal.hide(_vm.modalId)},on:{\"goBack\":() => {\n              _vm.selectedGcodeId = null\n              _vm.scrollToTop()\n            }}}):_c('g-code-folders-page',{attrs:{\"is-popup\":true,\"target-printer\":_vm.printer,\"route-params\":{\n            printerId: _vm.printerFiles ? _vm.printer.id : null,\n            parentFolder: null,\n          },\"on-close\":() => _vm.$bvModal.hide(_vm.modalId),\"saved-path\":_vm.savedPath,\"scroll-container-id\":_vm.modalId},on:{\"openFile\":(fileId, printerId, path) => {\n              _vm.selectedGcodeId = fileId\n              _vm.savedPath = path\n              _vm.scrollToTop()\n            }}})],1):_vm._e()],2)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"widget\",class:{ insideCard: _vm.insideCard }},[_c('div',{staticClass:\"widget-title\"},[_vm._t(\"title\")],2),_c('div',{staticClass:\"widget-content\"},[_vm._t(\"content\")],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"widget\" :class=\"{ insideCard }\">\n    <div class=\"widget-title\">\n      <slot name=\"title\"></slot>\n    </div>\n    <div class=\"widget-content\">\n      <slot name=\"content\"></slot>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'WidgetTemplate',\n\n  props: {\n    insideCard: {\n      type: Boolean,\n      default: false,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.widget\n  position: relative\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  margin-bottom: 15px\n  &:last-of-type\n    margin-bottom: 0\n  .widget-title\n    padding: 6px 12px\n    font-size: 14px\n    color: var(--color-text-secondary)\n  .widget-content\n    padding: 1.5rem 2rem 1rem\n    @media (max-width: 510px)\n      padding: 1rem 1rem 0.5rem\n\n  &.insideCard\n    margin-bottom: 0\n    border-radius: 0\n    border-bottom: 1px solid var(--color-divider)\n    .widget-title\n      display: none\n    .widget-content\n      padding-bottom: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./WidgetTemplate.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./WidgetTemplate.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WidgetTemplate.vue?vue&type=template&id=00f2b5bc&scoped=true&\"\nimport script from \"./WidgetTemplate.vue?vue&type=script&lang=js&\"\nexport * from \"./WidgetTemplate.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WidgetTemplate.vue?vue&type=style&index=0&id=00f2b5bc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"00f2b5bc\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{attrs:{\"is-popup\":_vm.isPopup},scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [(_vm.isPopup && _vm.parentFolder !== null)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":\"Go Back\"},on:{\"click\":function($event){$event.preventDefault();return _vm.goBack.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"})]):_vm._e(),(!_vm.isPopup && _vm.isCloud)?_c('div',{staticClass:\"actions-with-selected-desktop\"},[_c('b-form-group',{staticClass:\"m-0\"},[_c('b-form-checkbox',{attrs:{\"checked\":_vm.allSelected,\"size\":\"md\"},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSelectAll.apply(null, arguments)}}})],1),_c('div',[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.selectedItemsCount),expression:\"!selectedItemsCount\"}],staticClass:\"label\",on:{\"click\":_vm.toggleSelectAll}},[_vm._v(_vm._s(_vm.$t(\"Select all\")))]),_c('b-dropdown',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.selectedItemsCount),expression:\"selectedItemsCount\"}],attrs:{\"toggle-class\":\"btn btn-sm actions-with-selected-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.selectedItemsCount)+\" item\"+_vm._s(_vm.selectedItemsCount === 1 ? '' : 's')+\" \"+_vm._s(_vm.$t(\"selected\"))+\" \")]},proxy:true}],null,false,4258773973)},[_c('b-dropdown-item',[_c('div',{on:{\"click\":_vm.moveSelectedItems}},[_c('i',{staticClass:\"fas fa-arrows-alt\"}),_vm._v(_vm._s(_vm.$t(\"Move\")))])]),_c('b-dropdown-item',[_c('div',{staticClass:\"text-danger\",on:{\"click\":_vm.deleteSelectedItems}},[_c('i',{staticClass:\"far fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t(\"Delete\"))+\" \")])])],1)],1)],1):_vm._e(),_c('search-input',{staticClass:\"search-input mr-3\",on:{\"input\":_vm.updateSearch}})]},proxy:true},{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[(_vm.isCloud)?_c('a',{staticClass:\"btn shadow-none icon-btn d-none d-md-inline\",attrs:{\"href\":\"#\",\"title\":\"Create folder\"},on:{\"click\":function($event){$event.preventDefault();return _vm.createFolder.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-folder-plus\"})]):_vm._e(),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-server\"})]},proxy:true}])},[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"STORAGE\")))]),_c('b-dropdown-item',{on:{\"click\":_vm.switchToCloudStorage}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.isCloud ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"Cloud\")))])])])]),_vm._l((_vm.printers),function(printer){return _c('b-dropdown-item',{key:printer.id,on:{\"click\":() => _vm.switchToPrinterStorage(printer)}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.selectedPrinterId === printer.id ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(printer.name))]),_c('div',{staticClass:\"subtitle\",class:[_vm.isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']},[_vm._v(\" \"+_vm._s(_vm.printerBrowsabilityText(printer))+\" \")])])])])})],2),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"title\":\"Sort By\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-sort-amount-down\"})]},proxy:true}])},[_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":_vm.mobileMenuOptions},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked},scopedSlots:_vm._u([{key:\"sorting\",fn:function(){return [_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})]},proxy:true},{key:\"storage\",fn:function(){return [_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"STORAGE\")))]),_c('b-dropdown-item',{on:{\"click\":() => {\n                  _vm.switchToCloudStorage()\n                  _vm.$refs.cascadedDropdown.resetMenuExpanded()\n                }}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.isCloud ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"Cloud\")))])])])]),_vm._l((_vm.printers),function(printer){return _c('b-dropdown-item',{key:printer.id,on:{\"click\":() => {\n                  _vm.switchToPrinterStorage(printer)\n                  _vm.$refs.cascadedDropdown.resetMenuExpanded()\n                }}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.selectedPrinterId === printer.id ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(printer.name))]),_c('div',{staticClass:\"subtitle\",class:[_vm.isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']},[_vm._v(\" \"+_vm._s(_vm.printerBrowsabilityText(printer))+\" \")])])])])})]},proxy:true}])})],1),(_vm.onClose)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":\"Close\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onClose.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-times text-danger\"})]):_vm._e()],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[(_vm.isCloud)?_c('vue-dropzone',{ref:\"gcodesDropzone\",staticClass:\"upload-box\",attrs:{\"id\":\"dropzone\",\"options\":_vm.dropzoneOptions,\"use-custom-slot\":true},on:{\"vdropzone-queue-complete\":_vm.gcodeUploadSuccess,\"vdropzone-error\":_vm.gcodeUploadError,\"vdropzone-sending\":_vm.addParentFolderParam}},[_c('div',{staticClass:\"dz-message needsclick\"},[_c('i',{staticClass:\"fas fa-upload fa-2x\"}),_vm._v(\" \"),_c('br'),_c('div',[_vm._v(_vm._s(_vm.$t(\"G-Code file (*.gcode, *.gco, or *.g) only.\")))]),_c('div',[_vm._v(_vm._s(_vm.$t('Up to {maxFilesize} MB each file, {maxTotalFilesize} GB total.',{maxFilesize: _vm.maxFilesize,maxTotalFilesize: _vm.maxTotalFilesize})))])])]):_vm._e(),(!_vm.isCloud && _vm.isAgentMoonraker && _vm.searchStateIsActive)?_c('div',{staticClass:\"notice-block\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('p',{staticClass:\"message\"},[_vm._v(_vm._s(_vm.$t(\"Search in Klipper printers works only for current directory\")))])]):_vm._e(),_c('g-code-file-structure',{ref:\"gCodeFileStructure\",attrs:{\"is-cloud\":_vm.isCloud,\"is-popup\":_vm.isPopup,\"search-state-is-active\":_vm.searchStateIsActive,\"search-in-progress\":_vm.searchInProgress,\"folders\":_vm.folders,\"files\":_vm.files,\"target-printer\":_vm.targetPrinter,\"nothing-found\":_vm.nothingFound,\"loading\":_vm.loading,\"scroll-container-id\":_vm.scrollContainerId,\"no-more-folders\":_vm.noMoreFolders,\"no-more-files\":_vm.noMoreFiles,\"local-files-loading\":_vm.localFilesLoading},on:{\"openFolder\":_vm.openFolder,\"openFile\":_vm.openFile,\"renameItem\":_vm.renameItem,\"moveItem\":_vm.moveItem,\"deleteItem\":_vm.deleteItem,\"print\":_vm.onPrintClicked,\"fetchMore\":_vm.fetchFilesAndFolders,\"selectFiles\":_vm.onSelectFiles,\"selectFolders\":_vm.onSelectFolders}})],1)],1)],1),_c('rename-modal',{ref:\"renameModal\",attrs:{\"item\":_vm.activeItem,\"pre-confirm\":_vm.verifyItemRename},on:{\"renamed\":_vm.onItemRenamed}}),_c('move-modal',{ref:\"moveModal\",attrs:{\"item\":_vm.activeItem,\"items\":_vm.activeItems,\"item-parent-folder-id\":_vm.parentFolder,\"target-printer\":_vm.targetPrinter,\"scroll-container-id\":_vm.scrollContainerId,\"sorting-value\":_vm.sortingValue},on:{\"moved\":_vm.onItemMoved}}),_c('delete-confirmation-modal',{ref:\"deleteConfirmationModal\",attrs:{\"item\":_vm.activeItem},on:{\"deleted\":_vm.onItemDeleted}}),_c('new-folder-modal',{ref:\"newFolderModal\",attrs:{\"pre-confirm\":_vm.verifyNewFolder,\"parent-folder-id\":_vm.parentFolder},on:{\"created\":_vm.onFolderCreated}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"search-wrapper\"},[_vm._m(0),_c('input',{staticClass:\"dark\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('Search')},domProps:{\"value\":_vm.value},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)},\"focus\":function($event){return _vm.$emit('focus')},\"blur\":function($event){return _vm.$emit('blur')}}})])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"search-icon\"},[_c('i',{staticClass:\"fas fa-search\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"search-wrapper\">\n    <div class=\"search-icon\">\n      <i class=\"fas fa-search\"></i>\n    </div>\n    <input\n      type=\"text\"\n      class=\"dark\"\n      :placeholder=\"$t('Search')\"\n      :value=\"value\"\n      @input=\"$emit('input', $event.target.value)\"\n      @focus=\"$emit('focus')\"\n      @blur=\"$emit('blur')\"\n    />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SearchInput',\n\n  props: {\n    value: {\n      type: String,\n      default: '',\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.search-wrapper\n  position: relative\n\n  .search-icon\n    height: 100%\n    display: flex\n    flex-direction: column\n    justify-content: center\n    position: absolute\n    top: 0\n    left: .5em\n    opacity: .8\n\n  input\n    padding: .2em .5em .2em 2em\n    width: 100%\n    height: 100%\n    font-size: 16px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SearchInput.vue?vue&type=template&id=76904468&scoped=true&\"\nimport script from \"./SearchInput.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchInput.vue?vue&type=style&index=0&id=76904468&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"76904468\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-new-folder\",\"title\":_vm.$t('Enter new folder name'),\"ok-title\":_vm.$t('Create'),\"cancel-title\":_vm.$t('Cancel'),\"ok-disabled\":!_vm.newFolderName.length,\"centered\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal,\"shown\":_vm.focusInput}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"my-2\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newFolderName),expression:\"newFolderName\"}],ref:\"input\",staticClass:\"input-lg\",attrs:{\"type\":\"text\",\"name\":\"name\",\"placeholder\":_vm.$t('Folder name'),\"required\":\"required\"},domProps:{\"value\":(_vm.newFolderName)},on:{\"input\":function($event){if($event.target.composing)return;_vm.newFolderName=$event.target.value}}}),(_vm.errorMessage)?_c('b-alert',{staticClass:\"mt-3\",attrs:{\"variant\":\"danger\",\"show\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.errorMessage)+\" \")]):_vm._e()],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-modal\n    id=\"b-modal-new-folder\"\n    :title=\"$t('Enter new folder name')\"\n    :ok-title=\"$t('Create')\"\n    :cancel-title=\"$t('Cancel')\"\n    :ok-disabled=\"!newFolderName.length\"\n    centered\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n    @shown=\"focusInput\"\n  >\n    <form @submit.prevent=\"handleSubmit\">\n      <div class=\"my-2\">\n        <input\n          ref=\"input\"\n          v-model=\"newFolderName\"\n          type=\"text\"\n          name=\"name\"\n          :placeholder=\"$t('Folder name')\"\n          class=\"input-lg\"\n          required=\"required\"\n        />\n        <b-alert v-if=\"errorMessage\" variant=\"danger\" class=\"mt-3\" show>\n          {{ errorMessage }}\n        </b-alert>\n      </div>\n    </form>\n  </b-modal>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\n\nexport default {\n  name: 'NewFolderModal',\n\n  props: {\n    preConfirm: {\n      type: Function,\n      default: null,\n    },\n    parentFolderId: {\n      type: String,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      newFolderName: '',\n      errorMessage: '',\n      isOpen: false,\n    }\n  },\n\n  methods: {\n    show() {\n      this.isOpen = true\n      this.$bvModal.show('b-modal-new-folder')\n    },\n    focusInput() {\n      this.$refs.input.select()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.newFolderName = ''\n      this.errorMessage = ''\n    },\n    handleOk(bvModalEvent) {\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      if (!this.newFolderName) {\n        return\n      }\n\n      if (this.preConfirm) {\n        const result = this.preConfirm(this.newFolderName)\n        if (result !== true) {\n          this.errorMessage = result\n          return\n        }\n      }\n\n      try {\n        const newFolder = await axios.post(urls.gcodeFolders(), {\n          name: this.newFolderName,\n          parent_folder: this.parentFolderId,\n        })\n\n        this.$emit('created', newFolder.data.id)\n        this.$bvModal.hide('b-modal-new-folder')\n      } catch (e) {\n        console.log(e)\n        return\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-lg\n  height: 3rem\n  padding: .5rem 1rem\n  width: 100%\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewFolderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewFolderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NewFolderModal.vue?vue&type=template&id=6d629910&scoped=true&\"\nimport script from \"./NewFolderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./NewFolderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewFolderModal.vue?vue&type=style&index=0&id=6d629910&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6d629910\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-rename\",\"title\":_vm.$t('Enter new name'),\"ok-title\":_vm.$t('Rename'),\"cancel-title\":_vm.$t('Cancel'),\"centered\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal,\"shown\":_vm.focusInput}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"my-2\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newItemName),expression:\"newItemName\"}],ref:\"input\",staticClass:\"input-lg\",attrs:{\"type\":\"text\",\"name\":\"name\",\"placeholder\":_vm.$t('New name'),\"required\":\"required\"},domProps:{\"value\":(_vm.newItemName)},on:{\"input\":function($event){if($event.target.composing)return;_vm.newItemName=$event.target.value}}}),(_vm.errorMessage)?_c('b-alert',{staticClass:\"mt-3\",attrs:{\"variant\":\"danger\",\"show\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.errorMessage)+\" \")]):_vm._e()],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-modal\n    id=\"b-modal-rename\"\n    :title=\"$t('Enter new name')\"\n    :ok-title=\"$t('Rename')\"\n    :cancel-title=\"$t('Cancel')\"\n    centered\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n    @shown=\"focusInput\"\n  >\n    <form @submit.prevent=\"handleSubmit\">\n      <div class=\"my-2\">\n        <input\n          ref=\"input\"\n          v-model=\"newItemName\"\n          type=\"text\"\n          name=\"name\"\n          :placeholder=\"$t('New name')\"\n          class=\"input-lg\"\n          required=\"required\"\n        />\n        <b-alert v-if=\"errorMessage\" variant=\"danger\" class=\"mt-3\" show>\n          {{ errorMessage }}\n        </b-alert>\n      </div>\n    </form>\n  </b-modal>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\n\nexport default {\n  name: 'RenameModal',\n\n  components: {},\n\n  props: {\n    item: {\n      type: Object,\n      default: null,\n    },\n    preConfirm: {\n      type: Function,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      newItemName: '',\n      errorMessage: '',\n      isOpen: false,\n    }\n  },\n\n  computed: {\n    itemType() {\n      return this.item.filename ? 'file' : 'folder'\n    },\n    fullName() {\n      if (this.itemType === 'file') {\n        return `${this.newItemName}.${this.fileExt}`\n      } else {\n        return this.newItemName\n      }\n    },\n    fileExt() {\n      if (this.itemType === 'folder') return null\n      return this.item.filename.split('.').at(-1)\n    },\n    nameWithoutExt() {\n      if (this.itemType === 'folder') {\n        return this.item.name\n      } else {\n        const filename = this.item.filename\n        return filename.slice(0, filename.length - this.fileExt.length - 1)\n      }\n    },\n    newNameWithExt() {\n      if (this.itemType === 'folder') {\n        return this.newItemName\n      } else {\n        return `${this.newItemName}.${this.fileExt}`\n      }\n    },\n  },\n\n  methods: {\n    show() {\n      this.isOpen = true\n\n      this.$nextTick(() => {\n        if (!this.item) {\n          this.isOpen = false\n          return\n        }\n        this.newItemName = this.nameWithoutExt\n        this.$bvModal.show('b-modal-rename')\n      })\n    },\n    focusInput() {\n      this.$refs.input.select()\n    },\n    close() {\n      this.$bvModal.hide('b-modal-rename')\n      this.resetModal()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.newItemName = ''\n      this.errorMessage = ''\n    },\n    handleOk(bvModalEvent) {\n      if (this.newNameWithExt === (this.item.filename || this.item.name)) {\n        this.close()\n        return\n      }\n\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      const id = this.item.id\n\n      if (!this.newItemName) {\n        return\n      }\n\n      if (this.newNameWithExt === (this.item.filename || this.item.name)) {\n        this.close()\n        return\n      }\n\n      if (this.preConfirm) {\n        const result = this.preConfirm(this.newNameWithExt)\n        if (result !== true) {\n          this.errorMessage = result\n          return\n        }\n      }\n\n      try {\n        const url = this.itemType === 'file' ? urls.gcodeFile(id) : urls.gcodeFolder(id)\n        await axios.patch(\n          url,\n          `${this.itemType === 'file' ? 'filename' : 'name'}=${this.newNameWithExt}`\n        )\n      } catch (e) {\n        this.errorMessage = `${this.$i18next.t('Server error')}`\n        console.log(e)\n        return\n      }\n\n      this.$emit('renamed', this.newNameWithExt)\n      this.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-lg\n  height: 3rem\n  padding: .5rem 1rem\n  width: 100%\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./RenameModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./RenameModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RenameModal.vue?vue&type=template&id=1c69e3a5&scoped=true&\"\nimport script from \"./RenameModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RenameModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RenameModal.vue?vue&type=style&index=0&id=1c69e3a5&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1c69e3a5\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-move\",\"title\":_vm.$t('Move item'),\"ok-title\":_vm.$t('Place Here'),\"cancel-title\":_vm.$t('Cancel'),\"ok-disabled\":_vm.isSameDir || _vm.patchLoading,\"scrollable\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal},scopedSlots:_vm._u([{key:\"modal-title\",fn:function(){return [_c('div',{staticClass:\"title\"},[(_vm.parentFolder !== null)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Go Back')},on:{\"click\":function($event){$event.preventDefault();return _vm.goBack.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"})]):_vm._e(),_c('h5',{staticClass:\"modal-title\"},[_vm._v(_vm._s(_vm.$t(\"Move item\")))])])]},proxy:true}])},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('g-code-file-structure',{attrs:{\"folders\":_vm.folders,\"files\":_vm.files,\"target-printer\":_vm.targetPrinter,\"loading\":_vm.loading,\"scroll-container-id\":\"b-modal-move___BV_modal_body_\",\"no-more-folders\":_vm.noMoreFolders,\"no-more-files\":true,\"is-move-modal\":true,\"disabled-items\":_vm.disabledItems},on:{\"openFolder\":_vm.openFolder,\"fetchMore\":_vm.fetchFilesAndFolders}})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"gcodes-wrapper\",class:{ 'is-move-modal': _vm.isMoveModal }},[(!_vm.isMoveModal)?_c('div',{staticClass:\"header-panel\",class:{ 'without-action-buttons': !_vm.isCloud && !_vm.targetPrinter }},[_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Name\")))]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t('Size')))]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Created\")))]),(_vm.isCloud)?_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Last Printed\")))]):_vm._e()]):_vm._e(),_c('div',{staticClass:\"gcode-items-wrapper\"},[_c('div',_vm._l(([..._vm.folders, ..._vm.files]),function(item,key){return _c('file-structure-item',{directives:[{name:\"show\",rawName:\"v-show\",value:(\n          (_vm.isFolder(item) && !_vm.searchStateIsActive) || (!_vm.isFolder(item) && !_vm.searchInProgress)\n        ),expression:\"\\n          (isFolder(item) && !searchStateIsActive) || (!isFolder(item) && !searchInProgress)\\n        \"}],key:`${_vm.isFolder(item) ? 'folder' : 'file'}_${key}`,attrs:{\"item\":item,\"is-cloud\":_vm.isCloud,\"target-printer\":_vm.targetPrinter,\"is-move-modal\":_vm.isMoveModal,\"disabled\":_vm.isFolder(item)\n            ? _vm.disabledItems.folders.includes(item.id)\n            : _vm.disabledItems.files.includes(item.id),\"selectable\":!_vm.isMoveModal && _vm.isCloud && !_vm.isPopup,\"selected\":_vm.isFolder(item) ? _vm.selectedFolders.has(item.id) : _vm.selectedFiles.has(item.id)},on:{\"click\":function($event){_vm.isFolder(item) ? _vm.$emit('openFolder', item) : _vm.$emit('openFile', item)},\"renameItem\":function($event){return _vm.$emit('renameItem', item)},\"moveItem\":function($event){return _vm.$emit('moveItem', item)},\"deleteItem\":function($event){return _vm.$emit('deleteItem', item)},\"print\":function($event){return _vm.$emit('print', item)},\"selectedChanged\":_vm.onSelectedChanged}})}),1),(_vm.isCloud)?_c('mugen-scroll',{staticClass:\"text-center\",attrs:{\"v-show\":!_vm.isFolderEmpty,\"handler\":() => _vm.$emit('fetchMore'),\"should-handle\":!_vm.loading,\"scroll-container\":_vm.scrollContainerId}},[(!_vm.noMoreFolders || !_vm.noMoreFiles || _vm.searchInProgress)?_c('div',{staticClass:\"py-5\"},[_c('b-spinner',{attrs:{\"label\":_vm.$t('Loading...')}})],1):_vm._e()]):_vm._e(),(!_vm.isCloud && (_vm.localFilesLoading || _vm.searchInProgress))?_c('div',{staticClass:\"text-center py-5\"},[_c('b-spinner',{attrs:{\"label\":_vm.$t('Loading...')}})],1):_c('div',[(_vm.isFolderEmpty)?_c('div',{staticClass:\"placeholder text-secondary\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Nothing here yet\")))])]):(_vm.nothingFound)?_c('div',{staticClass:\"placeholder text-secondary\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Nothing found\")))])]):_vm._e()])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"item\",class:{ disabled: _vm.isDisabled, 'move-modal': _vm.isMoveModal },on:{\"click\":() => !_vm.isDisabled && _vm.$emit('click')}},[(_vm.selectable)?_c('div',{staticClass:\"checkbox-wrapper\",class:{ isSelected: _vm.isSelected }},[_c('b-form-checkbox',{attrs:{\"size\":\"md\",\"checked\":_vm.isSelected},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.isSelected = !_vm.isSelected}}})],1):_vm._e(),_c('div',{staticClass:\"item-info\"},[_c('div',{staticClass:\"filename\"},[_c('div',{staticClass:\"thumbnail-wrapper\",class:{ folder: _vm.isFolder }},[(!_vm.isFolder && _vm.item.getSmallThumbnailUrl())?_c('div',{staticClass:\"thumbnail\"},[_c('img',{attrs:{\"src\":_vm.item.getSmallThumbnailUrl()}})]):_c('div',{staticClass:\"placeholder\"},[(_vm.isFolder)?_c('i',{staticClass:\"fas fa-folder\"}):_c('i',{staticClass:\"fas fa-file-code\"})])]),_c('span',{staticClass:\"truncated\"},[_vm._v(_vm._s(_vm.isFolder ? _vm.item.name : _vm.item.filename))])]),_c('div',{staticClass:\"size\"},[(!_vm.isFolder)?_c('span',[_vm._v(_vm._s(_vm.item.filesize))]):_vm._e(),(_vm.isFolder)?_c('span',[_vm._v(_vm._s(_vm.item.numItems)+\" item(s)\")]):_vm._e()]),(!_vm.isMoveModal)?_c('div',{staticClass:\"created\"},[_vm._v(\" \"+_vm._s(_vm.item.created_at ? _vm.item.created_at.fromNow() : '-')+\" \")]):_vm._e(),(!_vm.isMoveModal)?[(!_vm.isFolder && _vm.isCloud)?_c('div',{staticClass:\"last-printed\"},[(!_vm.item.print_set)?_c('span',[_vm._v(\"-\")]):(!_vm.item.print_set.length)?_c('span',[_vm._v(_vm._s(_vm.$t('No prints yet')))]):(_vm.item.last_print)?_c('span',[_vm._v(_vm._s(_vm.item.last_print.ended_at ? _vm.item.last_print.ended_at.fromNow() : _vm.$t('Printing...')))]):_vm._e(),(_vm.item.last_print && _vm.item.last_print.ended_at)?_c('div',{staticClass:\"circle-indicator\",class:{\n            cancelled: _vm.item.last_print.cancelled_at,\n            finished: _vm.item.last_print.finished_at,\n          }}):_vm._e()]):_vm._e(),(_vm.isFolder && _vm.isCloud)?_c('div',{staticClass:\"d-none d-md-block\"}):_vm._e()]:_vm._e()],2),(!_vm.isMoveModal && ((!_vm.isFolder && (_vm.isCloud || _vm.targetPrinter)) || (_vm.isFolder && _vm.isCloud)))?_c('div',[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn py-0\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}],null,false,3452768261)},[(!_vm.isFolder && _vm.targetPrinter)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('print', _vm.item)}}},[_c('span',{staticClass:\"text-primary\"},[_c('i',{staticClass:\"fas fa-play-circle\"}),_vm._v(_vm._s(_vm.$t(\"Print on\"))+\" \"+_vm._s(_vm.targetPrinter.name)+\" \")])]):_vm._e(),(_vm.isCloud)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('renameItem', _vm.item)}}},[_c('i',{staticClass:\"fas fa-edit\"}),_vm._v(_vm._s(_vm.$t('Rename'))+\" \")]):_vm._e(),(_vm.isCloud)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('moveItem', _vm.item)}}},[_c('i',{staticClass:\"fas fa-arrows-alt\"}),_vm._v(_vm._s(_vm.$t('Move'))+\" \")]):_vm._e(),(_vm.isCloud)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('deleteItem', _vm.item)}}},[_c('span',{staticClass:\"text-danger\"},[_c('i',{staticClass:\"fas fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t('Delete'))+\" \")])]):_vm._e()],1)],1):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    class=\"item\"\n    :class=\"{ disabled: isDisabled, 'move-modal': isMoveModal }\"\n    @click=\"() => !isDisabled && $emit('click')\"\n  >\n    <div v-if=\"selectable\" class=\"checkbox-wrapper\" :class=\"{ isSelected }\">\n      <b-form-checkbox\n        size=\"md\"\n        :checked=\"isSelected\"\n        @click.native.capture.stop.prevent=\"isSelected = !isSelected\"\n      ></b-form-checkbox>\n    </div>\n    <div class=\"item-info\">\n      <div class=\"filename\">\n        <div class=\"thumbnail-wrapper\" :class=\"{ folder: isFolder }\">\n          <div v-if=\"!isFolder && item.getSmallThumbnailUrl()\" class=\"thumbnail\">\n            <img :src=\"item.getSmallThumbnailUrl()\" />\n          </div>\n          <div v-else class=\"placeholder\">\n            <i v-if=\"isFolder\" class=\"fas fa-folder\"></i>\n            <i v-else class=\"fas fa-file-code\"></i>\n          </div>\n        </div>\n        <span class=\"truncated\">{{ isFolder ? item.name : item.filename }}</span>\n      </div>\n\n      <div class=\"size\">\n        <span v-if=\"!isFolder\">{{ item.filesize }}</span>\n        <span v-if=\"isFolder\">{{ item.numItems }} item(s)</span>\n      </div>\n      <div v-if=\"!isMoveModal\" class=\"created\">\n        {{ item.created_at ? item.created_at.fromNow() : '-' }}\n      </div>\n      <template v-if=\"!isMoveModal\">\n        <div v-if=\"!isFolder && isCloud\" class=\"last-printed\">\n          <span v-if=\"!item.print_set\">-</span>\n          <span v-else-if=\"!item.print_set.length\">{{$t('No prints yet')}}</span>\n          <span v-else-if=\"item.last_print\">{{\n            item.last_print.ended_at ? item.last_print.ended_at.fromNow() : $t('Printing...')\n          }}</span>\n          <div\n            v-if=\"item.last_print && item.last_print.ended_at\"\n            class=\"circle-indicator\"\n            :class=\"{\n              cancelled: item.last_print.cancelled_at,\n              finished: item.last_print.finished_at,\n            }\"\n          ></div>\n        </div>\n        <div v-if=\"isFolder && isCloud\" class=\"d-none d-md-block\"></div>\n      </template>\n    </div>\n    <div\n      v-if=\"!isMoveModal && ((!isFolder && (isCloud || targetPrinter)) || (isFolder && isCloud))\"\n    >\n      <b-dropdown right no-caret toggle-class=\"icon-btn py-0\">\n        <template #button-content>\n          <i class=\"fas fa-ellipsis-v\"></i>\n        </template>\n        <b-dropdown-item v-if=\"!isFolder && targetPrinter\" @click.stop=\"$emit('print', item)\">\n          <span class=\"text-primary\">\n            <i class=\"fas fa-play-circle\"></i>{{$t(\"Print on\")}} {{ targetPrinter.name }}\n          </span>\n        </b-dropdown-item>\n        <b-dropdown-item v-if=\"isCloud\" @click.stop=\"$emit('renameItem', item)\">\n          <i class=\"fas fa-edit\"></i>{{$t('Rename')}}\n        </b-dropdown-item>\n        <b-dropdown-item v-if=\"isCloud\" @click.stop=\"$emit('moveItem', item)\">\n          <i class=\"fas fa-arrows-alt\"></i>{{$t('Move')}}\n        </b-dropdown-item>\n        <b-dropdown-item v-if=\"isCloud\" @click.stop=\"$emit('deleteItem', item)\">\n          <span class=\"text-danger\"> <i class=\"fas fa-trash-alt\"></i>{{$t('Delete')}} </span>\n        </b-dropdown-item>\n      </b-dropdown>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'FileStructureItem',\n\n  props: {\n    item: {\n      type: Object,\n      required: true,\n    },\n    isCloud: {\n      type: Boolean,\n      default: true,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    isMoveModal: {\n      type: Boolean,\n      default: false,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n    selectable: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data: function () {\n    return {\n      isSelected: this.selected,\n    }\n  },\n\n  computed: {\n    isFolder() {\n      return !this.item.filename\n    },\n    isDisabled() {\n      return (this.isMoveModal && !this.isFolder) || this.disabled\n    },\n  },\n\n  watch: {\n    isSelected(newValue) {\n      this.$emit('selectedChanged', this.item, newValue)\n    },\n    selected(newValue) {\n      this.isSelected = newValue\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.item\n  display: flex\n  align-items: center\n  padding: .6em 1em\n  border-bottom: 1px solid var(--color-divider-muted)\n  &:last-child\n    border-bottom: none\n  &:hover\n    cursor: pointer\n    background-color: var(--color-hover)\n  &.disabled\n    opacity: .5\n    &:hover\n      cursor: default\n      background-color: transparent\n  &.move-modal\n    .item-info\n      .size\n        text-align: right\n\n  .item-info\n    display: flex\n    width: 100%\n    overflow: hidden\n    flex: 1\n    font-size: 0.875rem\n    color: var(--color-text-secondary)\n    & > div\n      flex: 1\n      margin-left: 30px\n      &:first-child\n        font-size: 1rem\n        color: var(--color-text-primary)\n        margin-left: 0\n\n    .thumbnail-wrapper\n      flex: 0 0 32px\n      display: inline-flex\n      height: 32px\n      border-radius: var(--border-radius-xs)\n      background-color: var(--color-surface-primary)\n      overflow: hidden\n      align-items: center\n      justify-content: center\n      .thumbnail\n        width: 100%\n        height: 100%\n        img\n          height: 100%\n          width: auto\n      &.folder\n        background: none\n        font-size: 1.25em\n\n    .filename\n      display: flex\n      align-items: center\n      gap: .5rem\n      text-overflow: ellipsis\n      overflow: hidden\n      white-space: nowrap\n      width: 100%\n      flex: 3\n\n  .remove-button\n    width: 30px\n    height: 30px\n    text-align: center\n    line-height: 30px\n    border-radius: 50%\n    transition: background-color .2s ease-out\n    &:hover\n      background-color: var(--color-danger)\n      color: var(--color-on-primary)\n      cursor: pointer\n\n  @media (max-width: 768px)\n    &\n      margin: 0 -16px\n\n    .item-info\n      flex-direction: column\n      align-items: flex-start\n      & > div\n        margin-left: 0\n\n      .size::before\n        content: \"Size: \"\n      .uploaded::before\n        content: \"Uploaded: \"\n      .created::before\n        content: \"Created: \"\n      .last-printed::before\n        content: \"Last print: \"\n\n.circle-indicator\n  --size: 6px\n  width: var(--size)\n  height: var(--size)\n  border-radius: var(--size)\n  display: inline-block\n  margin-left: 5px\n  position: relative\n  bottom: 1px\n  background: var(--color-text-secondary)\n  &.cancelled\n    background: var(--color-danger)\n  &.finished\n    background: var(--color-success)\n\n.checkbox-wrapper\n  display: flex\n  align-items: flex-start\n  justify-content: flex-end\n  margin-left: -.5rem\n  margin-right: .5rem\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n    border-color: var(--color-divider)\n  &.isSelected\n    ::v-deep .custom-checkbox .custom-control-label::before\n      border-color: #00C4B4\n  @media (max-width: 576px)\n    display: none\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FileStructureItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FileStructureItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FileStructureItem.vue?vue&type=template&id=56a42b8e&scoped=true&\"\nimport script from \"./FileStructureItem.vue?vue&type=script&lang=js&\"\nexport * from \"./FileStructureItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FileStructureItem.vue?vue&type=style&index=0&id=56a42b8e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"56a42b8e\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"gcodes-wrapper\" :class=\"{ 'is-move-modal': isMoveModal }\">\n    <div\n      v-if=\"!isMoveModal\"\n      class=\"header-panel\"\n      :class=\"{ 'without-action-buttons': !isCloud && !targetPrinter }\"\n    >\n      <div class=\"text\">{{$t(\"Name\")}}</div>\n      <div class=\"text\">{{$t('Size')}}</div>\n      <div class=\"text\">{{$t(\"Created\")}}</div>\n      <div v-if=\"isCloud\" class=\"text\">{{$t(\"Last Printed\")}}</div>\n    </div>\n\n    <div class=\"gcode-items-wrapper\">\n      <div>\n        <file-structure-item\n          v-for=\"(item, key) in [...folders, ...files]\"\n          v-show=\"\n            (isFolder(item) && !searchStateIsActive) || (!isFolder(item) && !searchInProgress)\n          \"\n          :key=\"`${isFolder(item) ? 'folder' : 'file'}_${key}`\"\n          :item=\"item\"\n          :is-cloud=\"isCloud\"\n          :target-printer=\"targetPrinter\"\n          :is-move-modal=\"isMoveModal\"\n          :disabled=\"\n            isFolder(item)\n              ? disabledItems.folders.includes(item.id)\n              : disabledItems.files.includes(item.id)\n          \"\n          :selectable=\"!isMoveModal && isCloud && !isPopup\"\n          :selected=\"isFolder(item) ? selectedFolders.has(item.id) : selectedFiles.has(item.id)\"\n          @click=\"isFolder(item) ? $emit('openFolder', item) : $emit('openFile', item)\"\n          @renameItem=\"$emit('renameItem', item)\"\n          @moveItem=\"$emit('moveItem', item)\"\n          @deleteItem=\"$emit('deleteItem', item)\"\n          @print=\"$emit('print', item)\"\n          @selectedChanged=\"onSelectedChanged\"\n        />\n      </div>\n\n      <mugen-scroll\n        v-if=\"isCloud\"\n        :v-show=\"!isFolderEmpty\"\n        :handler=\"() => $emit('fetchMore')\"\n        :should-handle=\"!loading\"\n        class=\"text-center\"\n        :scroll-container=\"scrollContainerId\"\n      >\n        <div v-if=\"!noMoreFolders || !noMoreFiles || searchInProgress\" class=\"py-5\">\n          <b-spinner :label=\"$t('Loading...')\" />\n        </div>\n      </mugen-scroll>\n\n      <div v-if=\"!isCloud && (localFilesLoading || searchInProgress)\" class=\"text-center py-5\">\n        <b-spinner :label=\"$t('Loading...')\" />\n      </div>\n      <div v-else>\n        <!-- Placeholders -->\n        <div v-if=\"isFolderEmpty\" class=\"placeholder text-secondary\">\n          <span>{{ $t(\"Nothing here yet\") }}</span>\n        </div>\n        <div v-else-if=\"nothingFound\" class=\"placeholder text-secondary\">\n          <span>{{ $t(\"Nothing found\") }}</span>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport MugenScroll from 'vue-mugen-scroll'\nimport FileStructureItem from '@src/components/g-codes/FileStructureItem.vue'\n\nexport default {\n  name: 'GCodeFileStructure',\n\n  components: {\n    MugenScroll,\n    FileStructureItem,\n  },\n\n  props: {\n    folders: {\n      type: Array,\n      default: () => [],\n    },\n    files: {\n      type: Array,\n      default: () => [],\n    },\n    noMoreFolders: {\n      type: Boolean,\n      default: false,\n    },\n    noMoreFiles: {\n      type: Boolean,\n      default: false,\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n    localFilesLoading: {\n      type: Boolean,\n      default: false,\n    },\n    isCloud: {\n      type: Boolean,\n      default: true,\n    },\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    searchStateIsActive: {\n      type: Boolean,\n      default: false,\n    },\n    searchInProgress: {\n      type: Boolean,\n      default: false,\n    },\n    nothingFound: {\n      type: Boolean,\n      default: false,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    scrollContainerId: {\n      type: String,\n      default: null,\n    },\n    isMoveModal: {\n      type: Boolean,\n      default: false,\n    },\n    disabledItems: {\n      type: Object,\n      default: () => ({\n        folders: [],\n        files: [],\n      }),\n    },\n  },\n\n  data: function () {\n    return {\n      selectedFiles: new Set(),\n      selectedFolders: new Set(),\n    }\n  },\n\n  computed: {\n    isFolderEmpty() {\n      return (\n        !this.searchStateIsActive && !this.loading && !this.files.length && !this.folders.length\n      )\n    },\n  },\n\n  methods: {\n    onSelectedChanged(item, selected) {\n      const selectedItemsCopy = this.isFolder(item)\n        ? new Set(this.selectedFolders)\n        : new Set(this.selectedFiles)\n\n      if (selected) {\n        selectedItemsCopy.add(item.id)\n      } else {\n        selectedItemsCopy.delete(item.id)\n      }\n\n      if (this.isFolder(item)) {\n        this.selectedFolders = selectedItemsCopy\n        this.$emit('selectFolders', this.selectedFolders)\n      } else {\n        this.selectedFiles = selectedItemsCopy\n        this.$emit('selectFiles', this.selectedFiles)\n      }\n    },\n    isFolder(item) {\n      return !item.filename\n    },\n    selectAll() {\n      this.selectedFolders = new Set(this.folders.map((f) => f.id))\n      this.selectedFiles = new Set(this.files.map((f) => f.id))\n      this.$emit('selectFolders', this.selectedFolders)\n      this.$emit('selectFiles', this.selectedFiles)\n    },\n    unselectAll() {\n      this.selectedFolders = new Set()\n      this.selectedFiles = new Set()\n      this.$emit('selectFolders', this.selectedFolders)\n      this.$emit('selectFiles', this.selectedFiles)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.gcodes-wrapper\n  background-color: var(--color-surface-secondary)\n  padding: 1em 2em\n  border-radius: var(--border-radius-lg)\n  &.is-move-modal\n    padding: 0\n    border-radius: 0\n\n.header-panel\n  display: flex\n  padding: 1em calc(1em + 30px) 1em 1em\n  border-bottom: 1px solid var(--color-divider)\n  font-weight: bold\n  &.without-action-buttons\n    padding-right: 1em\n\n  & > div\n    flex: 1\n    display: flex\n    justify-content: space-between\n    margin-left: 30px\n    align-items: center\n    font-size: 1rem\n\n    &:first-child\n      margin-left: 0\n      flex: 3\n\n  @media (max-width: 768px)\n    &\n      display: none\n\n.placeholder\n  margin: 5rem 0\n  text-align: center\n  &.text-secondary *\n    color: var(--color-text-secondary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFileStructure.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFileStructure.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeFileStructure.vue?vue&type=template&id=f3289a68&scoped=true&\"\nimport script from \"./GCodeFileStructure.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeFileStructure.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeFileStructure.vue?vue&type=style&index=0&id=f3289a68&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"f3289a68\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <b-modal\n    id=\"b-modal-move\"\n    :title=\"$t('Move item')\"\n    :ok-title=\"$t('Place Here')\"\n    :cancel-title=\"$t('Cancel')\"\n    :ok-disabled=\"isSameDir || patchLoading\"\n    scrollable\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n  >\n    <template #modal-title>\n      <div class=\"title\">\n        <a\n          v-if=\"parentFolder !== null\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-inline\"\n          :title=\"$t('Go Back')\"\n          @click.prevent=\"goBack\"\n        >\n          <i class=\"fas fa-chevron-left\"></i>\n        </a>\n        <h5 class=\"modal-title\">{{ $t(\"Move item\") }}</h5>\n      </div>\n    </template>\n    <form @submit.prevent=\"handleSubmit\">\n      <g-code-file-structure\n        :folders=\"folders\"\n        :files=\"files\"\n        :target-printer=\"targetPrinter\"\n        :loading=\"loading\"\n        scroll-container-id=\"b-modal-move___BV_modal_body_\"\n        :no-more-folders=\"noMoreFolders\"\n        :no-more-files=\"true\"\n        :is-move-modal=\"true\"\n        :disabled-items=\"disabledItems\"\n        @openFolder=\"openFolder\"\n        @fetchMore=\"fetchFilesAndFolders\"\n      />\n    </form>\n  </b-modal>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport GCodeFileStructure from '@src/components/g-codes/GCodeFileStructure.vue'\nimport { normalizedGcodeFolder } from '@src/lib/normalizers'\n\nconst PAGE_SIZE = 24\n\nexport default {\n  name: 'MoveModal',\n\n  components: {\n    GCodeFileStructure,\n  },\n\n  props: {\n    item: {\n      type: Object,\n      default: null,\n    },\n    items: {\n      type: Object,\n      default: null,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    scrollContainerId: {\n      type: String,\n      default: null,\n    },\n    sortingValue: {\n      type: Object,\n      required: true,\n    },\n    itemParentFolderId: {\n      type: String,\n      default: '',\n    },\n  },\n\n  data() {\n    return {\n      path: [],\n      isOpen: false,\n      loading: false,\n      patchLoading: false,\n      folders: [],\n      files: [],\n      noMoreFolders: false,\n      currentFoldersPage: 1,\n      currentFilesPage: 1,\n    }\n  },\n\n  computed: {\n    disabledItems() {\n      const items = {\n        files: [],\n        folders: [],\n      }\n\n      if (this.item && this.itemType === 'file') {\n        items.files = [this.item.id]\n      } else if (this.item && this.itemType === 'folder') {\n        items.folders = [this.item.id]\n      } else if (this.items) {\n        items.files = this.items.files\n        items.folders = this.items.folders\n      }\n\n      return items\n    },\n    itemType() {\n      return this.item ? (this.item.filename ? 'file' : 'folder') : null\n    },\n    parentFolder() {\n      return this.path && this.path.length > 0 ? this.path.at(-1) : null\n    },\n    isSameDir() {\n      if (this.parentFolder === null && !this.itemParentFolderId) {\n        return true\n      } else if (parseInt(this.itemParentFolderId) === this.parentFolder) {\n        return true\n      }\n      return false\n    },\n  },\n\n  methods: {\n    goBack() {\n      this.path.pop()\n      this.fetchFilesAndFolders(true)\n    },\n    openFolder(folder) {\n      this.path.push(folder.id)\n      this.fetchFilesAndFolders(true)\n    },\n    resetFiles() {\n      this.folders = []\n      this.files = []\n      this.noMoreFolders = false\n      this.currentFoldersPage = 1\n      this.currentFilesPage = 1\n    },\n    async fetchFilesAndFolders(reset = false) {\n      if (this.loading) {\n        return\n      }\n\n      if (reset) {\n        this.resetFiles()\n      }\n\n      if (this.noMoreFolders) {\n        return\n      }\n\n      this.loading = true\n      let folders = []\n\n      if (!this.noMoreFolders) {\n        try {\n          const params = {\n            parent_folder: this.parentFolder || 'null',\n            page: this.currentFoldersPage,\n            page_size: PAGE_SIZE,\n          }\n          if (this.sortingValue.sorting.folderKey) {\n            params.sorting = `${this.sortingValue.sorting.folderKey}_${this.sortingValue.direction.key}`\n          }\n          let response = await axios.get(urls.gcodeFolders(), { params })\n          response = response.data\n          this.noMoreFolders = response?.next === null\n          folders = response?.results || []\n        } catch (error) {\n          this.loading = false\n          this.errorDialog(error)\n        }\n\n        this.folders.push(...folders.map((data) => normalizedGcodeFolder(data)))\n        this.currentFoldersPage += 1\n      }\n\n      this.loading = false\n    },\n\n    show() {\n      this.isOpen = true\n      this.fetchFilesAndFolders()\n\n      this.$nextTick(() => {\n        if (!this.item && !this.items) {\n          this.isOpen = false\n          return\n        }\n        this.$bvModal.show('b-modal-move')\n      })\n    },\n    close() {\n      this.$bvModal.hide('b-modal-move')\n      this.resetModal()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.path = []\n      this.resetFiles()\n    },\n    handleOk(bvModalEvent) {\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      this.patchLoading = true\n      const parentFolder = this.parentFolder || ''\n\n      try {\n        if (this.item) {\n          const id = this.item.id\n          const url = this.itemType === 'file' ? urls.gcodeFile(id) : urls.gcodeFolder(id)\n          await axios.patch(url, `parent_folder=${parentFolder}`)\n        } else if (this.items) {\n          if (this.items.folders.length)\n            await axios.post(urls.gcodeFolderBulkMove(), {\n              folder_ids: this.items.folders,\n              parent_folder: parentFolder,\n            })\n          if (this.items.files.length)\n            await axios.post(urls.gcodeFileBulkMove(), {\n              file_ids: this.items.files,\n              parent_folder: parentFolder,\n            })\n        }\n      } catch (error) {\n        this.errorDialog(error, `${this.$i18next.t('Failed to move item(s)')}`)\n      }\n\n      this.patchLoading = false\n      this.$emit('moved')\n      this.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.title\n  display: flex\n  align-items: center\n  .icon-btn\n    padding-top: 0\n    padding-bottom: 0\n    padding-left: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MoveModal.vue?vue&type=template&id=ef0f185e&scoped=true&\"\nimport script from \"./MoveModal.vue?vue&type=script&lang=js&\"\nexport * from \"./MoveModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MoveModal.vue?vue&type=style&index=0&id=ef0f185e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"ef0f185e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div></div>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\n\nexport default {\n  name: 'RenameModal',\n\n  props: {\n    item: {\n      type: Object,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      isOpen: false,\n    }\n  },\n\n  created() {},\n\n  mounted() {},\n\n  methods: {\n    show() {\n      this.isOpen = true\n      this.$bvModal\n        .msgBoxConfirm(`${this.$i18next.t('Are you sure?')}`, {\n          id: 'b-modal-confirm-delete',\n          centered: true,\n          okTitle: `${this.$i18next.t('Delete')}`,\n          okVariant: 'danger',\n          size: 'sm',\n          autoFocusButton: 'ok',\n        })\n        .then(async (value) => {\n          this.isOpen = false\n          if (!value) return\n\n          try {\n            const url = this.item.filename\n              ? urls.gcodeFile(this.item.id)\n              : urls.gcodeFolder(this.item.id)\n            await axios.delete(url)\n          } catch (e) {\n            console.log(e)\n            return\n          }\n\n          this.$emit('deleted')\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Failed to delete item')}`)\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\">\n#b-modal-confirm-delete\n  .modal-body\n    font-size: 1.125rem\n    text-align: center\n  .modal-footer\n    justify-content: center\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DeleteConfirmationModal.vue?vue&type=template&id=1c764133&\"\nimport script from \"./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"\nexport * from \"./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DeleteConfirmationModal.vue?vue&type=style&index=0&id=1c764133&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import i18n from '@src/i18n/i18n.js'\n\nconst MAX_USER_MESSAGE_LENGTH = 500\nconst MAX_SENTRY_MESSAGE_LENGTH = 1000\n\nconst isObject = (value) => value && typeof value === 'object' && !Array.isArray(value)\n\nconst truncate = (value, maxLength = MAX_USER_MESSAGE_LENGTH) => {\n  if (typeof value !== 'string') {\n    return value\n  }\n\n  return value.length > maxLength ? `${value.slice(0, maxLength)}...` : value\n}\n\nconst normalizeWhitespace = (value) => value.replace(/\\s+/g, ' ').trim()\n\nconst looksLikeHtml = (value) =>\n  typeof value === 'string' &&\n  /<!doctype html|<html[\\s>]|<head[\\s>]|<body[\\s>]|<title[\\s>]|<\\/[a-z][^>]*>/i.test(value)\n\nconst decodeHtmlEntities = (value) => {\n  if (typeof document !== 'undefined') {\n    const textarea = document.createElement('textarea')\n    textarea.innerHTML = value\n    return textarea.value\n  }\n\n  return value\n    .replace(/&nbsp;/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n}\n\nconst stripHtml = (value) => {\n  if (typeof value !== 'string') {\n    return value\n  }\n\n  return normalizeWhitespace(decodeHtmlEntities(value.replace(/<[^>]*>/g, ' ')))\n}\n\nconst extractHtmlTitle = (value) => {\n  if (typeof value !== 'string') {\n    return null\n  }\n\n  const title = value.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)?.[1]\n  return title ? stripHtml(title) : null\n}\n\nconst getHeader = (xhr, name) => {\n  if (!xhr || typeof xhr.getResponseHeader !== 'function') {\n    return null\n  }\n\n  try {\n    return xhr.getResponseHeader(name)\n  } catch (_error) {\n    return null\n  }\n}\n\nconst getResponseText = (xhr) => {\n  if (!xhr) {\n    return null\n  }\n\n  if (typeof xhr.responseText === 'string') {\n    return xhr.responseText\n  }\n\n  if (typeof xhr.response === 'string') {\n    return xhr.response\n  }\n\n  return null\n}\n\nconst getStatus = (xhr) => {\n  if (!xhr || typeof xhr.status !== 'number') {\n    return null\n  }\n\n  return xhr.status\n}\n\nconst parseJson = (value) => {\n  if (typeof value !== 'string' || !value.trim()) {\n    return null\n  }\n\n  try {\n    return JSON.parse(value)\n  } catch (_error) {\n    return null\n  }\n}\n\nconst safeString = (value) => {\n  if (typeof value === 'string') {\n    return value\n  }\n\n  if (typeof value === 'number' || typeof value === 'boolean') {\n    return String(value)\n  }\n\n  return null\n}\n\nconst flattenApiErrors = (value) => {\n  const directValue = safeString(value)\n  if (directValue) {\n    return [directValue]\n  }\n\n  if (Array.isArray(value)) {\n    return value.flatMap((item) => flattenApiErrors(item))\n  }\n\n  if (isObject(value)) {\n    if (value.error) {\n      return flattenApiErrors(value.error)\n    }\n    if (value.detail) {\n      return flattenApiErrors(value.detail)\n    }\n\n    return Object.values(value).flatMap((item) => flattenApiErrors(item))\n  }\n\n  return []\n}\n\nconst sanitizeUserMessage = (value) => {\n  if (!value || typeof value !== 'string') {\n    return null\n  }\n\n  const message = looksLikeHtml(value) ? stripHtml(value) : normalizeWhitespace(value)\n  return message ? truncate(message) : null\n}\n\nconst userMessageFromApiBody = (body) => {\n  const errors = flattenApiErrors(body)\n    .map((error) => sanitizeUserMessage(error))\n    .filter(Boolean)\n\n  return errors.length ? errors.join(' ') : null\n}\n\nconst defaultUploadErrorMessage = () => i18n.t('Upload failed. Please try again.')\n\nconst fallbackMessageForStatus = (status, defaultMessage) => {\n  if (status === 0) {\n    return i18n.t(\n      'Upload failed because the connection was interrupted. Please check your network and try again.'\n    )\n  }\n\n  if (status === 413) {\n    return i18n.t('Upload failed because the file is larger than the upload limit.')\n  }\n\n  if (status >= 500) {\n    return i18n.t(\n      'Upload failed because the server temporarily could not complete the request. Please try again later.'\n    )\n  }\n\n  return defaultMessage || defaultUploadErrorMessage()\n}\n\nexport const normalizeDropzoneUploadError = (file, message, xhr, options = {}) => {\n  const defaultMessage = options.defaultMessage || defaultUploadErrorMessage()\n  const status = getStatus(xhr)\n  const responseText = getResponseText(xhr)\n  const contentType = getHeader(xhr, 'content-type') || getHeader(xhr, 'Content-Type')\n  const jsonBody = parseJson(responseText)\n  const htmlResponse =\n    looksLikeHtml(responseText) || (contentType && /html/i.test(contentType))\n\n  let userMessage = null\n  if (jsonBody) {\n    userMessage = userMessageFromApiBody(jsonBody)\n  } else if (isObject(message)) {\n    userMessage = userMessageFromApiBody(message)\n  } else if (!htmlResponse) {\n    userMessage = sanitizeUserMessage(safeString(message) || responseText)\n  }\n\n  if (!userMessage) {\n    userMessage = fallbackMessageForStatus(status, defaultMessage)\n  }\n\n  if (!jsonBody && (status === 0 || status === 413 || status >= 500)) {\n    userMessage = fallbackMessageForStatus(status, defaultMessage)\n  }\n\n  return {\n    userMessage,\n    status,\n    contentType,\n    isHtmlResponse: !!htmlResponse,\n    responseTitle: extractHtmlTitle(responseText),\n    responseSnippet: truncate(stripHtml(responseText || ''), MAX_SENTRY_MESSAGE_LENGTH),\n    dropzoneMessage: truncate(\n      sanitizeUserMessage(safeString(message)) || '',\n      MAX_SENTRY_MESSAGE_LENGTH\n    ),\n    fileName: file?.name || null,\n    fileSize: typeof file?.size === 'number' ? file.size : null,\n  }\n}\n\nexport const getDropzoneUploadErrorMessage = (file, message, xhr, options = {}) =>\n  normalizeDropzoneUploadError(file, message, xhr, options).userMessage\n","<template>\n  <page-layout :is-popup=\"isPopup\">\n    <!-- Tob bar -->\n    <template #topBarLeft>\n      <a\n        v-if=\"isPopup && parentFolder !== null\"\n        href=\"#\"\n        class=\"btn shadow-none icon-btn d-inline\"\n        title=\"Go Back\"\n        @click.prevent=\"goBack\"\n      >\n        <i class=\"fas fa-chevron-left\"></i>\n      </a>\n      <div v-if=\"!isPopup && isCloud\" class=\"actions-with-selected-desktop\">\n        <b-form-group class=\"m-0\">\n          <b-form-checkbox\n            :checked=\"allSelected\"\n            size=\"md\"\n            @click.native.capture.stop.prevent=\"toggleSelectAll\"\n          ></b-form-checkbox>\n        </b-form-group>\n        <div>\n          <span v-show=\"!selectedItemsCount\" class=\"label\" @click=\"toggleSelectAll\"\n            >{{ $t(\"Select all\") }}</span\n          >\n          <b-dropdown\n            v-show=\"selectedItemsCount\"\n            toggle-class=\"btn btn-sm actions-with-selected-btn\"\n          >\n            <template #button-content>\n              {{ selectedItemsCount }} item{{ selectedItemsCount === 1 ? '' : 's' }}\n              {{$t(\"selected\")}}\n            </template>\n            <b-dropdown-item>\n              <div @click=\"moveSelectedItems\"><i class=\"fas fa-arrows-alt\"></i>{{ $t(\"Move\") }}</div>\n            </b-dropdown-item>\n            <b-dropdown-item>\n              <div class=\"text-danger\" @click=\"deleteSelectedItems\">\n                <i class=\"far fa-trash-alt\"></i>{{$t(\"Delete\")}}\n              </div>\n            </b-dropdown-item>\n          </b-dropdown>\n        </div>\n      </div>\n\n      <search-input class=\"search-input mr-3\" @input=\"updateSearch\"></search-input>\n    </template>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Create folder -->\n        <a\n          v-if=\"isCloud\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-none d-md-inline\"\n          title=\"Create folder\"\n          @click.prevent=\"createFolder\"\n        >\n          <i class=\"fas fa-folder-plus\"></i>\n        </a>\n        <!-- Select storage -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-server\"></i>\n          </template>\n          <b-dropdown-text class=\"small text-secondary\">{{ $t(\"STORAGE\") }}</b-dropdown-text>\n          <b-dropdown-item @click=\"switchToCloudStorage\">\n            <div class=\"dropdown-text-group\">\n              <i\n                class=\"fas fa-check text-primary\"\n                :style=\"{ visibility: isCloud ? 'visible' : 'hidden' }\"\n              ></i>\n              <div class=\"text\">\n                <div class=\"title\">{{ $syndicateText.brandName }} {{$t(\"Cloud\")}}</div>\n              </div>\n            </div>\n          </b-dropdown-item>\n          <b-dropdown-item\n            v-for=\"printer in printers\"\n            :key=\"printer.id\"\n            @click=\"() => switchToPrinterStorage(printer)\"\n          >\n            <div class=\"dropdown-text-group\">\n              <i\n                class=\"fas fa-check text-primary\"\n                :style=\"{ visibility: selectedPrinterId === printer.id ? 'visible' : 'hidden' }\"\n              ></i>\n              <div class=\"text\">\n                <div class=\"title\">{{ printer.name }}</div>\n                <div\n                  class=\"subtitle\"\n                  :class=\"[isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']\"\n                >\n                  {{ printerBrowsabilityText(printer) }}\n                </div>\n              </div>\n            </div>\n          </b-dropdown-item>\n        </b-dropdown>\n        <!-- Sorting -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\" title=\"Sort By\">\n          <template #button-content>\n            <i class=\"fas fa-sort-amount-down\"></i>\n          </template>\n          <sorting-dropdown\n            :local-storage-prefix=\"sortingLocalStoragePrefix\"\n            :sorting-options=\"sortingOptions\"\n            :sorting-value=\"sortingValue\"\n            @onSortingUpdated=\"onSortingUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"mobileMenuOptions\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          >\n            <template #sorting>\n              <sorting-dropdown\n                :local-storage-prefix=\"sortingLocalStoragePrefix\"\n                :sorting-options=\"sortingOptions\"\n                :sorting-value=\"sortingValue\"\n                @onSortingUpdated=\"onSortingUpdated\"\n              />\n            </template>\n            <template #storage>\n              <b-dropdown-text class=\"small text-secondary\">{{ $t(\"STORAGE\") }}</b-dropdown-text>\n              <b-dropdown-item\n                @click=\"\n                  () => {\n                    switchToCloudStorage()\n                    $refs.cascadedDropdown.resetMenuExpanded()\n                  }\n                \"\n              >\n                <div class=\"dropdown-text-group\">\n                  <i\n                    class=\"fas fa-check text-primary\"\n                    :style=\"{ visibility: isCloud ? 'visible' : 'hidden' }\"\n                  ></i>\n                  <div class=\"text\">\n                    <div class=\"title\">{{ $syndicateText.brandName }} {{$t(\"Cloud\")}}</div>\n                  </div>\n                </div>\n              </b-dropdown-item>\n              <b-dropdown-item\n                v-for=\"printer in printers\"\n                :key=\"printer.id\"\n                @click=\"\n                  () => {\n                    switchToPrinterStorage(printer)\n                    $refs.cascadedDropdown.resetMenuExpanded()\n                  }\n                \"\n              >\n                <div class=\"dropdown-text-group\">\n                  <i\n                    class=\"fas fa-check text-primary\"\n                    :style=\"{ visibility: selectedPrinterId === printer.id ? 'visible' : 'hidden' }\"\n                  ></i>\n                  <div class=\"text\">\n                    <div class=\"title\">{{ printer.name }}</div>\n                    <div\n                      class=\"subtitle\"\n                      :class=\"[isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']\"\n                    >\n                      {{ printerBrowsabilityText(printer) }}\n                    </div>\n                  </div>\n                </div>\n              </b-dropdown-item>\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n\n        <a\n          v-if=\"onClose\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-inline\"\n          title=\"Close\"\n          @click.prevent=\"onClose\"\n        >\n          <i class=\"fas fa-times text-danger\"></i>\n        </a>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <vue-dropzone\n              v-if=\"isCloud\"\n              id=\"dropzone\"\n              ref=\"gcodesDropzone\"\n              class=\"upload-box\"\n              :options=\"dropzoneOptions\"\n              :use-custom-slot=\"true\"\n              @vdropzone-queue-complete=\"gcodeUploadSuccess\"\n              @vdropzone-error=\"gcodeUploadError\"\n              @vdropzone-sending=\"addParentFolderParam\"\n            >\n              <div class=\"dz-message needsclick\">\n                <i class=\"fas fa-upload fa-2x\"></i> <br />\n                <div>{{ $t(\"G-Code file (*.gcode, *.gco, or *.g) only.\") }}</div>\n                <div>{{ $t('Up to {maxFilesize} MB each file, {maxTotalFilesize} GB total.',{maxFilesize,maxTotalFilesize}) }}</div>\n              </div>\n            </vue-dropzone>\n\n            <div v-if=\"!isCloud && isAgentMoonraker && searchStateIsActive\" class=\"notice-block\">\n              <div class=\"icon\">\n                <i class=\"fas fa-info\"></i>\n              </div>\n              <p class=\"message\">{{ $t(\"Search in Klipper printers works only for current directory\") }}</p>\n            </div>\n\n            <g-code-file-structure\n              ref=\"gCodeFileStructure\"\n              :is-cloud=\"isCloud\"\n              :is-popup=\"isPopup\"\n              :search-state-is-active=\"searchStateIsActive\"\n              :search-in-progress=\"searchInProgress\"\n              :folders=\"folders\"\n              :files=\"files\"\n              :target-printer=\"targetPrinter\"\n              :nothing-found=\"nothingFound\"\n              :loading=\"loading\"\n              :scroll-container-id=\"scrollContainerId\"\n              :no-more-folders=\"noMoreFolders\"\n              :no-more-files=\"noMoreFiles\"\n              :local-files-loading=\"localFilesLoading\"\n              @openFolder=\"openFolder\"\n              @openFile=\"openFile\"\n              @renameItem=\"renameItem\"\n              @moveItem=\"moveItem\"\n              @deleteItem=\"deleteItem\"\n              @print=\"onPrintClicked\"\n              @fetchMore=\"fetchFilesAndFolders\"\n              @selectFiles=\"onSelectFiles\"\n              @selectFolders=\"onSelectFolders\"\n            />\n          </b-col>\n        </b-row>\n      </b-container>\n      <rename-modal\n        ref=\"renameModal\"\n        :item=\"activeItem\"\n        :pre-confirm=\"verifyItemRename\"\n        @renamed=\"onItemRenamed\"\n      />\n      <move-modal\n        ref=\"moveModal\"\n        :item=\"activeItem\"\n        :items=\"activeItems\"\n        :item-parent-folder-id=\"parentFolder\"\n        :target-printer=\"targetPrinter\"\n        :scroll-container-id=\"scrollContainerId\"\n        :sorting-value=\"sortingValue\"\n        @moved=\"onItemMoved\"\n      />\n      <delete-confirmation-modal\n        ref=\"deleteConfirmationModal\"\n        :item=\"activeItem\"\n        @deleted=\"onItemDeleted\"\n      />\n      <new-folder-modal\n        ref=\"newFolderModal\"\n        :pre-confirm=\"verifyNewFolder\"\n        :parent-folder-id=\"parentFolder\"\n        @created=\"onFolderCreated\"\n      />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport vue2Dropzone from 'vue2-dropzone'\nimport 'vue2-dropzone/dist/vue2Dropzone.min.css'\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport {\n  normalizedGcode,\n  normalizedGcodeFolder,\n  normalizedPrinter,\n  PrintStatus,\n} from '@src/lib/normalizers'\nimport { user } from '@src/lib/page-context'\nimport SearchInput from '@src/components/SearchInput.vue'\nimport { getCsrfFromDocument } from '@src/lib/utils'\nimport NewFolderModal from '@src/components/g-codes/NewFolderModal.vue'\nimport RenameModal from '@src/components/g-codes/RenameModal.vue'\nimport MoveModal from '@src/components/g-codes/MoveModal.vue'\nimport DeleteConfirmationModal from '@src/components/g-codes/DeleteConfirmationModal.vue'\nimport { sendToPrint, confirmPrint } from '@src/components/g-codes/sendToPrint'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport {\n  listPrinterLocalGCodesOctoPrint,\n  listPrinterLocalGCodesMoonraker,\n} from '@src/lib/printer-local-comm'\nimport GCodeFileStructure from '@src/components/g-codes/GCodeFileStructure.vue'\nimport SortingDropdown, { restoreSortingValue } from '@src/components/SortingDropdown'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport i18n from '@src/i18n/i18n.js'\nimport { getDropzoneUploadErrorMessage } from '@src/lib/dropzone-upload-error'\n\n// Waiting time (ms) before asking server for search results\nconst SEARCH_API_CALL_DELAY = 1000\n\nconst PAGE_SIZE = 24\n\nconst SortingLocalStoragePrefix = 'gcodesSorting'\nconst SortingOptions = {\n  options: [\n    { title: `${i18n.t('Name')}`, key: 'filename', folderKey: 'name' },\n    { title: `${i18n.t('Size')}`, key: 'num_bytes' },\n    { title: `${i18n.t('Created')}`, key: 'created_at', folderKey: 'created_at' },\n  ],\n  default: { sorting: 'created_at', direction: 'desc' },\n}\n\nexport default {\n  name: 'GCodeFoldersPage',\n\n  components: {\n    PageLayout,\n    SearchInput,\n    vueDropzone: vue2Dropzone,\n    GCodeFileStructure,\n    RenameModal,\n    MoveModal,\n    DeleteConfirmationModal,\n    NewFolderModal,\n    SortingDropdown,\n    CascadedDropdown,\n  },\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    onClose: {\n      type: Function,\n      default: null,\n    },\n    scrollContainerId: {\n      type: String,\n      default: null,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    savedPath: {\n      type: Array,\n      default: () => [],\n    },\n    routeParams: {\n      type: Object,\n      default: () => {\n        return {\n          printerId: null,\n          parentFolder: null,\n        }\n      },\n    },\n  },\n\n  data() {\n    return {\n      PrintStatus,\n      csrf: null,\n      user: null,\n      loading: false,\n      parentFolder: null,\n      path: [],\n      files: [],\n      folders: [],\n      noMoreFolders: false,\n      noMoreFiles: false,\n      currentFoldersPage: 1,\n      currentFilesPage: 1,\n\n      // Sorting\n      sortingLocalStoragePrefix: SortingLocalStoragePrefix,\n      sortingOptions: SortingOptions,\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n\n      searchQuery: null,\n      searchStateIsActive: false,\n      searchTimeoutId: null,\n\n      activeItem: null,\n      activeItems: null,\n\n      // local storage:\n      printers: [],\n      selectedPrinterId: undefined,\n      selectedPrinterComm: undefined,\n      localFilesLoading: false,\n\n      selectedFolders: new Set(),\n      selectedFiles: new Set(),\n    }\n  },\n\n  computed: {\n    selectedItemsCount() {\n      return this.selectedFiles.size + this.selectedFolders.size\n    },\n    allSelected() {\n      const itemsCount = this.files.length + this.folders.length\n      return this.selectedItemsCount === itemsCount && itemsCount !== 0\n    },\n    mobileMenuOptions() {\n      const options = [\n        {\n          key: 'storage',\n          icon: 'fas fa-server',\n          title: `${this.$i18next.t(`File storage`)}`,\n          expandable: true,\n        },\n        {\n          key: 'sorting',\n          icon: 'fas fa-sort-amount-down',\n          title: `${this.$i18next.t(`Sort`)}`,\n          expandable: true,\n        },\n      ]\n\n      if (this.isCloud) {\n        options.unshift({\n          key: 'createFolder',\n          icon: 'fas fa-folder-plus',\n          title: `${this.$i18next.t('Create folder')}`,\n          callback: true,\n        })\n      }\n\n      return options\n    },\n    isAgentMoonraker() {\n      const selectedPrinter = this.printers.find((p) => p.id === this.selectedPrinterId)\n      return !selectedPrinter || selectedPrinter.isAgentMoonraker()\n    },\n    isCloud() {\n      return !this.selectedPrinterId\n    },\n    nothingFound() {\n      return this.searchStateIsActive && !this.searchTimeoutId && !this.files.length\n    },\n    searchInProgress() {\n      return this.searchStateIsActive && !!this.searchTimeoutId\n    },\n    maxFilesize() {\n      return this.user.is_pro ? 500 : 50 // MB\n    },\n    maxTotalFilesize() {\n      return this.user.is_pro ? 50 : 1 // GB\n    },\n    dropzoneOptions() {\n      return {\n        withCredentials: true,\n        maxFilesize: this.maxFilesize,\n        timeout: 60 * 60 * 1000, // For large files\n        acceptedFiles: '.g,.gcode,.gco',\n        url: urls.gcodeFiles(),\n        headers: { 'X-CSRFToken': this.csrf },\n      }\n    },\n  },\n\n  async created() {\n    this.csrf = getCsrfFromDocument()\n    this.user = user()\n\n    if (this.savedPath && this.savedPath.length >= 1) {\n      this.parentFolder = this.savedPath.at(-1)\n      this.path = this.savedPath.slice(0, this.savedPath.length - 1)\n    } else {\n      this.parentFolder = this.getRouteParam('parentFolder') || null\n    }\n\n    this.selectedPrinterId = Number(this.getRouteParam('printerId')) || null\n\n    if (!this.isPopup) {\n      this.$watch(\n        () => this.$route.params,\n        (toParams, previousParams) => {\n          this.parentFolder = toParams.parentFolder || null\n          this.selectedPrinterId = Number(this.getRouteParam('printerId')) || null\n          this.fetchFilesAndFolders(true)\n        }\n      )\n    }\n\n    await this.fetchPrinters()\n    this.fetchFilesAndFolders(true)\n  },\n\n  methods: {\n    isPrinterBrowsable(printer) {\n      return !(printer.isOffline() || !printer.isAgentVersionGte('2.3.0', '1.2.0'))\n    },\n    printerBrowsabilityText(printer) {\n      return this.isPrinterBrowsable(printer)\n        ? `${this.$i18next.t('Available to browse files')}`\n        : `${this.$i18next.t('Unable to browse files')}`\n    },\n    toggleSelectAll() {\n      if (this.allSelected) {\n        this.$refs.gCodeFileStructure.unselectAll()\n      } else {\n        this.$refs.gCodeFileStructure.selectAll()\n      }\n    },\n    onSelectFiles(items) {\n      this.selectedFiles = items\n    },\n    onSelectFolders(items) {\n      this.selectedFolders = items\n    },\n    moveSelectedItems() {\n      this.activeItems = {\n        files: Array.from(this.selectedFiles),\n        folders: Array.from(this.selectedFolders),\n      }\n      this.$refs.moveModal.show()\n    },\n    deleteSelectedItems() {\n      const selectedFolderIds = Array.from(this.selectedFolders)\n      const selectedFileIds = Array.from(this.selectedFiles)\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t('Delete {name} item(s)? This action can not be undone.',{name:selectedFolderIds.length + selectedFileIds.length})}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then(async (userAction) => {\n        if (userAction.isConfirmed) {\n          try {\n            if (selectedFolderIds.length)\n              await axios.post(urls.gcodeFolderBulkDelete(), { folder_ids: selectedFolderIds })\n            if (selectedFileIds.length)\n              await axios.post(urls.gcodeFileBulkDelete(), { file_ids: selectedFileIds })\n          } catch (err) {\n            this.errorDialog(err, `${this.$i18next.t('Failed to delete files and folders')}`)\n          } finally {\n            this.fetchFilesAndFolders(true)\n          }\n        }\n      })\n    },\n    switchToCloudStorage() {\n      this.parentFolder = null\n      this.path = []\n      this.selectedPrinterId = null\n      this.selectedPrinterComm = null\n      if (this.isPopup) {\n        this.fetchFilesAndFolders(true)\n      } else {\n        if (this.$route.path !== '/g_code_folders/cloud/') {\n          this.$router.replace(`/g_code_folders/cloud/`)\n        }\n      }\n    },\n    switchToPrinterStorage(printer) {\n      if (!this.isPrinterBrowsable(printer)) {\n        this.$swal.Reject.fire({\n          title: `${this.$i18next.t(`{name} isn't available for browsing files for one of the following reasons`,{name:printer.name})}:`,\n          html: `<ul style=\"text-align: left\">\n            <li>${this.$i18next.t('{name} is powered off or not connected to the Internet',{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t('Printer is not connected to {name}',{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t(\"{brandName} for {name} plugin is outdated (you need version {version} or later)\",{brandName:this.$syndicateText.brandName,name:printer.agentDisplayName(),version:printer.browsabilityMinPluginVersion()})}</li>\n          </ul>`,\n        })\n        return\n      }\n\n      this.parentFolder = null\n      this.path = []\n      this.selectedPrinterId = printer.id\n      this.selectedPrinterComm = null\n      if (this.isPopup) {\n        this.fetchFilesAndFolders(true)\n      } else {\n        if (Number(this.getRouteParam('printerId')) !== printer.id) {\n          this.$router.replace(`/g_code_folders/local/${printer.id}/`)\n        }\n      }\n    },\n    getRouteParam(name) {\n      return this.isPopup ? this.routeParams[name] : this.$route.params[name]\n    },\n    goBack() {\n      if (!this.path.length) {\n        return\n      }\n      this.parentFolder = this.path.pop()\n      this.fetchFilesAndFolders(true)\n    },\n    resetFiles() {\n      this.folders = []\n      this.files = []\n      this.$refs.gCodeFileStructure.unselectAll()\n      this.noMoreFolders = false\n      this.noMoreFiles = false\n      this.currentFoldersPage = 1\n      this.currentFilesPage = 1\n    },\n    async fetchPrinters() {\n      let printers\n      try {\n        printers = await axios.get(urls.printers())\n        printers = printers.data\n      } catch (e) {\n        console.error(e)\n      }\n      if (!printers) {\n        return\n      }\n      printers = printers.map((p) => normalizedPrinter(p))\n      // bring browsable printers at the top of the list\n      printers = printers.sort(\n        (a, b) => Number(this.isPrinterBrowsable(b)) - Number(this.isPrinterBrowsable(a))\n      )\n      this.printers = this.targetPrinter\n        ? printers.filter((p) => p.id === this.targetPrinter.id)\n        : printers\n    },\n    async fetchLocalFiles() {\n      if (!this.selectedPrinterComm) {\n        return\n      }\n      this.localFilesLoading = true\n      const listPrinterLocalGCodes = this.isAgentMoonraker\n        ? listPrinterLocalGCodesMoonraker\n        : listPrinterLocalGCodesOctoPrint\n\n      listPrinterLocalGCodes(\n        this.selectedPrinterComm,\n        this.parentFolder ? decodeURIComponent(this.parentFolder) : null,\n        this.searchQuery\n      ).then((result) => {\n        this.localFilesLoading = false\n        if (result) {\n          const { folders, files } = result\n          this.folders = this.sortLocalItems(folders)\n          this.files = this.sortLocalItems(files)\n        }\n      })\n    },\n    async fetchFilesAndFolders(reset = false, printLastUploadedFile = false) {\n      if (this.loading) {\n        return\n      }\n\n      if (reset) {\n        this.resetFiles()\n      }\n\n      // need to fetch local printer files\n      if (this.selectedPrinterId) {\n        if (!this.printers.find((p) => p.id === this.selectedPrinterId)) {\n          this.$swal.Reject.fire({\n            title: `${this.$i18next.t('Error')}`,\n            text: `${this.$i18next.t(`Printer not found or unavailable`)}`,\n          }).then(() => {\n            if (this.isPopup && this.onClose) {\n              this.onClose()\n            } else {\n              window.location.assign(`/g_code_folders/cloud/`)\n            }\n          })\n        }\n\n        this.localFilesLoading = true\n\n        if (!this.selectedPrinterComm) {\n          this.selectedPrinterComm = printerCommManager.getOrCreatePrinterComm(\n            this.selectedPrinterId,\n            urls.printerWebSocket(this.selectedPrinterId)\n          )\n          this.selectedPrinterComm.connect(this.fetchLocalFiles)\n        } else {\n          this.fetchLocalFiles()\n        }\n        return\n      }\n\n      if (this.searchQuery) {\n        this.noMoreFolders = true\n      }\n\n      if (this.noMoreFolders && this.noMoreFiles) {\n        return\n      }\n\n      this.loading = true\n      let folders = []\n      let files = []\n\n      if (!this.noMoreFolders) {\n        try {\n          const params = {\n            parent_folder: this.parentFolder || 'null',\n            page: this.currentFoldersPage,\n            page_size: PAGE_SIZE,\n          }\n          if (this.sortingValue.sorting.folderKey) {\n            params.sorting = `${this.sortingValue.sorting.folderKey}_${this.sortingValue.direction.key}`\n          }\n          let response = await axios.get(urls.gcodeFolders(), { params })\n          response = response.data\n          this.noMoreFolders = response?.next === null\n          folders = response?.results || []\n        } catch (error) {\n          this.loading = false\n          this.errorDialog(error)\n        }\n\n        this.currentFoldersPage += 1\n      }\n\n      if (!this.noMoreFiles && folders.length < PAGE_SIZE) {\n        try {\n          let response = await axios.get(urls.gcodeFiles(), {\n            // If cache is enabled, after renaming item on gcode page\n            // and going back to files - gcode will have old name\n            headers: {\n              'Cache-Control': 'no-cache',\n            },\n            params: {\n              // search is always global and we don't send parent_folder param at all in this case\n              // if `parentFolder` is null, it means we are in root folder (server needs '' or 'null')\n              parent_folder: this.searchQuery ? undefined : this.parentFolder || 'null',\n              page: this.currentFilesPage,\n              page_size: PAGE_SIZE,\n              sorting: `${this.sortingValue.sorting.key}_${this.sortingValue.direction.key}`,\n              q: this.searchQuery,\n            },\n          })\n          response = response.data\n          this.noMoreFiles = response?.next === null\n          files = response?.results || []\n        } catch (error) {\n          this.loading = false\n          this.errorDialog(error)\n        }\n\n        this.currentFilesPage += 1\n\n        if (printLastUploadedFile) {\n          try {\n            let response = await axios.get(urls.gcodeFiles(), {\n              params: {\n                parent_folder: this.parentFolder || 'null',\n                page_size: 1,\n                sorting: `created_at_desc`,\n              },\n            })\n            response = response.data\n            if (response?.results && response.results[0]) {\n              this.onPrintClicked(response.results[0])\n            }\n          } catch (error) {\n            this.loading = false\n            this.errorDialog(error)\n          }\n        }\n      }\n\n      this.folders.push(...folders.map((data) => normalizedGcodeFolder(data)))\n      this.files.push(...files.map((data) => normalizedGcode(data)))\n      this.loading = false\n    },\n    updateSearch(search) {\n      clearTimeout(this.searchTimeoutId)\n      this.searchTimeoutId = null\n\n      this.searchStateIsActive = !!search\n      if (!this.searchStateIsActive) {\n        this.searchQuery = null\n        this.fetchFilesAndFolders(true)\n        return\n      }\n\n      this.searchTimeoutId = setTimeout(async () => {\n        this.searchQuery = search\n        this.fetchFilesAndFolders(true)\n        this.searchTimeoutId = null\n      }, SEARCH_API_CALL_DELAY)\n    },\n    addParentFolderParam(file, xhr, formData) {\n      formData.append('filename', file.name)\n      if (this.parentFolder !== null) {\n        formData.append('parent_folder', this.parentFolder)\n      }\n    },\n    gcodeUploadSuccess() {\n      const printAfterUpload =\n        this.targetPrinter &&\n        this.$refs.gcodesDropzone.getAcceptedFiles().length === 1 &&\n        this.$refs.gcodesDropzone.getRejectedFiles().length === 0\n\n      this.$refs.gcodesDropzone.removeAllFiles()\n      this.files = []\n      this.fetchFilesAndFolders(true, printAfterUpload)\n    },\n    gcodeUploadError(file, message, xhr) {\n      this.$swal.Reject.fire({\n        text: getDropzoneUploadErrorMessage(file, message, xhr),\n      })\n    },\n    renameItem(item) {\n      this.activeItem = item\n      this.$refs.renameModal.show()\n    },\n    verifyItemRename(newName) {\n      if (!this.activeItem.filename && this.folders.find((item) => item.name === newName)) {\n        return `${this.$i18next.t('Folder with this name already exists')}`\n      }\n      return true\n    },\n    onItemRenamed(newName) {\n      if (!this.activeItem) {\n        return\n      }\n      const targetArr = this.activeItem.filename ? this.files : this.folders\n      for (let i in targetArr) {\n        if (targetArr[i].id !== this.activeItem.id) {\n          continue\n        } else if (this.activeItem.filename) {\n          this.files[i].filename = newName\n          break\n        } else {\n          this.folders[i].name = newName\n          break\n        }\n      }\n      this.activeItem = null\n    },\n    moveItem(item) {\n      this.activeItem = item\n      this.$refs.moveModal.show()\n    },\n    onItemMoved() {\n      if (!this.activeItem && !this.activeItems) {\n        return\n      }\n      this.activeItem = null\n      this.activeItems = null\n      this.fetchFilesAndFolders(true)\n    },\n    deleteItem(item) {\n      this.activeItem = item\n      this.$refs.deleteConfirmationModal.show()\n    },\n    onItemDeleted() {\n      if (!this.activeItem) {\n        return\n      }\n      const targetArr = this.activeItem.filename ? this.files : this.folders\n      for (let i in targetArr) {\n        if (targetArr[i].id !== this.activeItem.id) {\n          continue\n        } else if (this.activeItem.filename) {\n          this.files.splice(i, 1)\n          break\n        } else {\n          this.folders.splice(i, 1)\n          break\n        }\n      }\n      this.activeItem = null\n    },\n    createFolder() {\n      this.$refs.newFolderModal.show()\n    },\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'createFolder') {\n        this.createFolder()\n      }\n    },\n    verifyNewFolder(newFolderName) {\n      if (this.folders.find((item) => item.name === newFolderName)) {\n        return `${this.$i18next.t('Folder with this name already exists')}`\n      }\n      return true\n    },\n    onFolderCreated(newFolderId) {\n      // this.openFolder({id: newFolderId})\n      this.fetchFilesAndFolders(true)\n    },\n    openFolder(folder) {\n      if (!this.isPopup) {\n        if (this.selectedPrinterId) {\n          this.$router.push(\n            `/g_code_folders/local/${this.selectedPrinterId}/${encodeURIComponent(folder.path)}/`\n          )\n        } else {\n          this.$router.push(`/g_code_folders/cloud/${folder.id}/`)\n        }\n      } else {\n        this.path.push(this.parentFolder)\n        this.parentFolder = String(folder.id)\n        this.fetchFilesAndFolders(true)\n      }\n    },\n    openFile(file) {\n      if (!this.isPopup) {\n        if (this.selectedPrinterId) {\n          window.location.assign(\n            `/g_code_files/local/${this.selectedPrinterId}/${encodeURIComponent(file.path)}/`\n          )\n        } else {\n          window.location.assign(`/g_code_files/cloud/${file.id}/`)\n        }\n      } else {\n        this.$emit(\n          'openFile',\n          this.selectedPrinterId ? encodeURIComponent(file.path) : file.id,\n          this.selectedPrinterId,\n          [...this.path, this.parentFolder]\n        )\n      }\n    },\n    onPrintClicked(gcode) {\n      confirmPrint(gcode, this.targetPrinter).then(() => {\n        sendToPrint({\n          printer: this.targetPrinter,\n          gcode: gcode,\n          isCloud: this.isCloud,\n          Swal: this.$swal,\n          onCommandSent: () => {\n            if (this.isPopup) {\n              this.$bvModal.hide('b-modal-gcodes' + this.targetPrinter.id)\n            }\n          },\n        })\n      })\n    },\n\n    // Sorting\n    // Printer-local (moonraker/octoprint) listings arrive unsorted from the\n    // printer, unlike the cloud listing which sorts server-side via API\n    // params. Apply the selected sorting client-side so the dropdown works\n    // for printer-side file lists too.\n    sortLocalItems(items) {\n      const sorting = this.sortingValue.sorting\n      const direction =\n        this.sortingValue.direction && this.sortingValue.direction.key === 'asc' ? 1 : -1\n      const keys = [sorting.key, sorting.folderKey].filter(Boolean)\n      const compareValues = (av, bv) => {\n        if (typeof av === 'string' && typeof bv === 'string') {\n          // sort names case-insensitively; plain string comparison would group\n          // all upper-case names before all lower-case ones\n          return av.localeCompare(bv, undefined, { sensitivity: 'base' })\n        }\n        if (av === bv) {\n          return 0\n        }\n        return av > bv ? 1 : -1\n      }\n      return [...items].sort((a, b) => {\n        for (const key of keys) {\n          const av = a[key]\n          const bv = b[key]\n          if (av === undefined || bv === undefined) {\n            continue\n          }\n          const cmp = compareValues(av, bv)\n          if (cmp !== 0) {\n            return cmp * direction\n          }\n        }\n        const an = a.filename || a.name || ''\n        const bn = b.filename || b.name || ''\n        return compareValues(an, bn)\n      })\n    },\n    onSortingUpdated(sortingValue) {\n      this.sortingValue = sortingValue\n      this.fetchFilesAndFolders(true)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.upload-box\n  margin-bottom: var(--gap-between-blocks) !important\n\n.search-input\n  height: 30px\n  input\n    background-color: var(--color-surface-secondary)\n    border: var(--color-surface-secondary)\n\n.notice-block\n  border: 1px solid var(--color-divider)\n  border-radius: var(--border-radius-md)\n  display: flex\n  align-items: center\n  padding: 1rem 1.5rem\n  margin-bottom: var(--gap-between-blocks)\n\n  .message\n    margin: 0\n    margin-left: 1rem\n\n.actions-with-selected-desktop\n  display: flex\n  align-items: center\n  margin-right: 1rem\n  .label\n    cursor: pointer\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n  @media (max-width: 576px)\n    display: none\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFoldersPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFoldersPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeFoldersPage.vue?vue&type=template&id=3469c70e&scoped=true&\"\nimport script from \"./GCodeFoldersPage.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeFoldersPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeFoldersPage.vue?vue&type=style&index=0&id=3469c70e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3469c70e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{attrs:{\"is-popup\":_vm.isPopup},scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [(_vm.isPopup)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Go Back')},on:{\"click\":function($event){$event.preventDefault();return _vm.goBack.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"})]):_vm._e()]},proxy:true},{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[(_vm.canDownloadGcode)?_c('a',{staticClass:\"btn shadow-none icon-btn action-btn\",attrs:{\"title\":_vm.$t('Download file')},on:{\"click\":function($event){$event.preventDefault();return _vm.downloadGcode.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-download\"})]):_vm._e(),(_vm.isCloud)?_c('a',{staticClass:\"btn shadow-none icon-btn action-btn\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Rename file')},on:{\"click\":function($event){$event.preventDefault();return _vm.renameFile.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-edit\"})]):_vm._e(),(_vm.isCloud)?_c('a',{staticClass:\"text-danger btn shadow-none icon-btn action-btn\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Delete file')},on:{\"click\":function($event){$event.preventDefault();return _vm.deleteFile.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-trash-alt\"})]):_vm._e(),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":_vm.dropdownMenuOptions},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked}})],1),(_vm.onClose)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":\"Close\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onClose.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-times text-danger\"})]):_vm._e()],1)]},proxy:true},{key:\"content\",fn:function(){return [(_vm.loading || _vm.gcodeNotFound)?_c('b-container',[_c('b-row',[_c('b-col',{staticClass:\"text-center mt-5\"},[(_vm.gcodeNotFound)?_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t(\"This G-Code file doesn't exists\")))])]):_c('div',[_c('b-spinner')],1)])],1)],1):_c('b-container',{attrs:{\"fluid\":\"\"}},[_c('b-row',[_c('b-col',{attrs:{\"lg\":_vm.isPopup ? 12 : 5}},[_c('b-alert',{attrs:{\"show\":_vm.isDeleted,\"variant\":\"warning warning-block\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"This file is deleted and unavailable for print\"))+\" \")]),_c('g-code-details',{attrs:{\"file\":_vm.gcode,\"show-print-stats\":true,\"compact-view\":false}}),(_vm.isCloud)?_c('jusprin-feedback',{staticClass:\"card-container jusprin-feedback\",attrs:{\"g-code-file-id\":_vm.gcode.id}}):_vm._e(),(!_vm.isDeleted)?_c('available-printers',{staticClass:\"card-container available-printers\",class:{ 'full-width': _vm.isPopup },attrs:{\"is-popup\":_vm.isPopup,\"target-printer-id\":_vm.targetPrinterId || _vm.selectedPrinterId,\"gcode\":_vm.gcode,\"is-cloud\":_vm.isCloud},on:{\"refresh\":_vm.onRefresh}}):_vm._e()],1),_c('b-col',{attrs:{\"lg\":_vm.isPopup ? 12 : 7}},[_c('div',{staticClass:\"print-history\",class:{ 'full-width': _vm.isPopup || _vm.isDeleted }},[_c('h2',{staticClass:\"section-title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"Print History\")))]),(_vm.gcode.print_set.length)?_c('div',_vm._l((_vm.gcode.print_set),function(print){return _c('print-history-item',{key:`print_${print.id}`,staticClass:\"print-item\",attrs:{\"print\":print}})}),1):_c('div',[_c('div',{staticClass:\"card-container p-4 justify-content-center text-secondary\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"This file doesn't have any prints yet\"))+\" \")])])])])],1)],1),_c('rename-modal',{ref:\"renameModal\",attrs:{\"item\":_vm.gcode},on:{\"renamed\":_vm.onItemRenamed}}),_c('delete-confirmation-modal',{ref:\"deleteConfirmationModal\",attrs:{\"item\":_vm.gcode},on:{\"deleted\":_vm.onItemDeleted}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.printersLoading || !_vm.gcode)?_c('div',{staticClass:\"my-5 text-center\"},[_c('b-spinner')],1):_c('div',{staticClass:\"text-center\"},[(!_vm.targetPrinterId)?_c('div',{staticClass:\"mb-3\"},[_vm._l((_vm.printers),function(printer){return _c('div',{key:`printer_${printer.id}`,staticClass:\"printer-item\",class:{ active: _vm.selectedPrinter && printer.id === _vm.selectedPrinter.id },on:{\"click\":function($event){return _vm.selectPrinter(printer)}}},[_c('div',{staticClass:\"selected-indicator\"}),_c('div',{staticClass:\"printer-name truncated\",attrs:{\"title\":printer.name}},[_vm._v(_vm._s(printer.name))]),_c('div',{staticClass:\"printer-status\",class:[printer.isPrintable() ? 'text-success' : 'text-warning']},[_vm._v(\" \"+_vm._s(printer.printabilityText())+\" \")])])}),(!_vm.printersLoading && !_vm.printers.length)?_c('p',{staticClass:\"text-center text-secondary mt-3 mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"No available printers\"))+\" \")]):_vm._e()],2):_vm._e(),_c('button',{staticClass:\"btn btn-primary d-inline-flex align-items-center justify-content-center\",attrs:{\"disabled\":!_vm.selectedPrinter || _vm.isSending || !_vm.selectedPrinter.isPrintable()},on:{\"click\":_vm.onPrintClicked}},[(_vm.isSending)?_c('b-spinner',{staticClass:\"mr-1\",attrs:{\"small\":\"\"}}):_vm._e(),(_vm.selectedPrinter)?_c('div',{staticClass:\"truncated\"},[_vm._v(_vm._s(_vm.$t('Print on'))+\" \"+_vm._s(_vm.selectedPrinter.name))]):_c('div',{staticClass:\"truncated\"},[_vm._v(_vm._s(_vm.$t(\"Print\")))])],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div v-if=\"printersLoading || !gcode\" class=\"my-5 text-center\">\n      <b-spinner />\n    </div>\n    <div v-else class=\"text-center\">\n      <div v-if=\"!targetPrinterId\" class=\"mb-3\">\n        <div\n          v-for=\"printer in printers\"\n          :key=\"`printer_${printer.id}`\"\n          class=\"printer-item\"\n          :class=\"{ active: selectedPrinter && printer.id === selectedPrinter.id }\"\n          @click=\"selectPrinter(printer)\"\n        >\n          <div class=\"selected-indicator\"></div>\n          <div class=\"printer-name truncated\" :title=\"printer.name\">{{ printer.name }}</div>\n          <div\n            class=\"printer-status\"\n            :class=\"[printer.isPrintable() ? 'text-success' : 'text-warning']\"\n          >\n            {{ printer.printabilityText() }}\n          </div>\n        </div>\n\n        <p v-if=\"!printersLoading && !printers.length\" class=\"text-center text-secondary mt-3 mb-3\">\n          {{$t(\"No available printers\")}}\n        </p>\n      </div>\n\n      <button\n        class=\"btn btn-primary d-inline-flex align-items-center justify-content-center\"\n        :disabled=\"!selectedPrinter || isSending || !selectedPrinter.isPrintable()\"\n        @click=\"onPrintClicked\"\n      >\n        <b-spinner v-if=\"isSending\" small class=\"mr-1\" />\n        <div v-if=\"selectedPrinter\" class=\"truncated\">{{$t('Print on')}} {{ selectedPrinter.name }}</div>\n        <div v-else class=\"truncated\">{{ $t(\"Print\") }}</div>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { sendToPrint, showRedirectModal, confirmPrint } from './sendToPrint'\nimport { printerCommManager } from '@src/lib/printer-comm'\n\nexport default {\n  name: 'AvailablePrinters',\n\n  components: {},\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    targetPrinterId: {\n      type: Number,\n      required: false,\n      default: null,\n    },\n    gcode: {\n      type: Object,\n      default: null,\n    },\n    isCloud: {\n      type: Boolean,\n      default: true,\n    },\n  },\n\n  data() {\n    return {\n      printers: [],\n      selectedPrinter: null,\n      printersLoading: true,\n      printerStateCheckInterval: null,\n      printerComms: {},\n    }\n  },\n\n  computed: {\n    isSending() {\n      return this.printers.some(\n        (p) => p.calculatedState() === 'Starting' || p.calculatedState() === 'G-Code Downloading'\n      )\n    },\n  },\n\n  created() {\n    this.fetchPrinters()\n  },\n\n  methods: {\n    async fetchPrinters() {\n      this.printersLoading = true\n\n      const resp = await axios.get(urls.printers())\n      if (!resp?.data) {\n        this.printersLoading = false\n        return\n      }\n\n      const printers = resp?.data.map((p) => normalizedPrinter(p))\n      if (this.targetPrinterId) {\n        const selectedPrinter = printers.find((p) => p.id === this.targetPrinterId)\n        this.printers = [selectedPrinter]\n        if (selectedPrinter.isPrintable()) {\n          this.selectedPrinter = selectedPrinter\n        }\n      } else {\n        this.printers = printers\n        this.selectedPrinter = printers.find((p) => p.isPrintable()) || null\n      }\n\n      for (const printer of this.printers) {\n        this.printerComms[printer.id] = printerCommManager.getOrCreatePrinterComm(\n          printer.id,\n          urls.printerWebSocket(printer.id),\n          {\n            onPrinterUpdateReceived: (data) => {\n              const index = this.printers.findIndex((p) => p.id === printer.id)\n              this.$set(this.printers, index, normalizedPrinter(data, this.printers[index]))\n            },\n          }\n        )\n        this.printerComms[printer.id].connect()\n      }\n\n      this.printersLoading = false\n    },\n    selectPrinter(printer) {\n      if (!printer.isPrintable()) {\n        this.$swal.Reject.fire({\n          title: `${this.$i18next.t(`{name} isn't ready for print for one of the following reasons`,{name:printer.name})}:`,\n          html: `<ul style=\"text-align: left\">\n            <li>${this.$i18next.t(`{name} is powered off or not connected to the Internet`,{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t(\"Printer is not connected to {name}\",{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t(\"Printer is currently busy\")}</li>\n          </ul>`,\n        })\n        return\n      }\n\n      this.selectedPrinter = printer\n    },\n    onPrintClicked() {\n      if (!this.selectedPrinter?.id) return\n\n      confirmPrint(this.gcode, this.selectedPrinter).then(() => {\n        sendToPrint({\n          printer: this.selectedPrinter,\n          gcode: this.gcode,\n          isCloud: this.isCloud,\n          Swal: this.$swal,\n          onCommandSent: () => {\n            if (this.isPopup) {\n              this.$bvModal.hide('b-modal-gcodes' + this.selectedPrinter.id)\n            }\n          },\n          onPrinterStatusChanged: () => {\n            if (!this.isPopup) {\n              showRedirectModal(this.$swal, () => this.$emit('refresh'), this.selectedPrinter.id)\n            }\n\n            this.fetchPrinters()\n          },\n        })\n      })\n      return\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-item\n  display: flex\n  align-items: center\n  text-align: left\n  border-radius: var(--border-radius-sm)\n  border: 1px solid var(--color-divider)\n  margin-bottom: 0.5rem\n  padding: 0.75rem\n  &:hover\n    background-color: var(--color-hover)\n    cursor: pointer\n\n.selected-indicator\n  --size: 0.875rem\n  width: var(--size)\n  height: var(--size)\n  border-radius: var(--size)\n  border: 1px solid var(--color-text-secondary)\n  margin-right: 0.5rem\n\n.printer-item.active\n  background-color: var(--color-hover)\n  .selected-indicator\n    border-color: var(--color-text-primary)\n    border-width: 3px\n\n.printer-name\n  flex: 1\n\n.printer-status\n  font-size: 0.875rem\n  margin-left: 0.5rem\n\n.btn\n  max-width: 100%\n</style>\n\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AvailablePrinters.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AvailablePrinters.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AvailablePrinters.vue?vue&type=template&id=40347b7f&scoped=true&\"\nimport script from \"./AvailablePrinters.vue?vue&type=script&lang=js&\"\nexport * from \"./AvailablePrinters.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AvailablePrinters.vue?vue&type=style&index=0&id=40347b7f&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"40347b7f\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.chat)?_c('div',{staticClass:\"jusprin-feedback\"},[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('div',[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'wand-magic-sparkles']}})],1),_c('div',{staticClass:\"ml-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('Sliced with Obico AI Assistant.'))+\" \"),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":_vm.showChatHistory}},[_vm._v(\" \"+_vm._s(_vm.$t('View the chat history.'))+\" \")])])]),_c('div',{staticClass:\"feedback-question py-4\"},[_c('div',{staticClass:\"d-flex align-items-center justify-content-between\"},[_c('div',{staticClass:\"question-text d-flex align-items-center\"},[_vm._v(_vm._s(_vm.$t('Was AI Assistant helpful?')))]),_c('div',{staticClass:\"icon-buttons d-flex align-items-center\"},[_c('i',{staticClass:\"fas fa-thumbs-up feedback-icon\",class:{ 'selected': _vm.userFeedback === 'positive' },on:{\"click\":function($event){return _vm.submitFeedback('positive')}}}),_c('i',{staticClass:\"fas fa-thumbs-down feedback-icon\",class:{ 'selected':  _vm.userFeedback === 'negative' },on:{\"click\":function($event){return _vm.submitFeedback('negative')}}})])])]),_c('transition',{attrs:{\"name\":\"fade\"}},[(_vm.showTextFeedback)?_c('div',{staticClass:\"text-feedback mt-3\"},[_c('div',{staticClass:\"form-group\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.textFeedback),expression:\"textFeedback\"}],staticClass:\"form-control\",attrs:{\"rows\":\"3\",\"maxlength\":\"1000\",\"placeholder\":_vm.$t('Tell us more')},domProps:{\"value\":(_vm.textFeedback)},on:{\"input\":function($event){if($event.target.composing)return;_vm.textFeedback=$event.target.value}}})]),_c('div',{staticClass:\"text-right\"},[_c('button',{staticClass:\"btn btn-primary\",on:{\"click\":_vm.submitFeedbackText}},[_vm._v(\" \"+_vm._s(_vm.$t('Send'))+\" \")])])]):_vm._e()])],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"chat-container\"},[_c('div',{staticClass:\"chat-messages\"},_vm._l((_vm.messages),function(message,index){return _c('div',{key:index,staticClass:\"message\",class:message.role},[(message.role === 'assistant')?_c('div',{staticClass:\"assistant-avatar\"},[_c('i',{staticClass:\"fas fa-robot\"})]):_vm._e(),_c('div',{staticClass:\"message-content\"},[_c('VueMarkdown',{key:message.content},[_vm._v(_vm._s(message.content))]),(Object.keys(_vm.changedParams(message)).length > 0)?_c('div',{staticClass:\"pt-2\"},[_c('div',[_vm._v(_vm._s(_vm.$t('I have changed the following parameters:')))]),_vm._l((_vm.changedParams(message)),function(value,key){return _c('div',{key:key},[_vm._v(\" - \"+_vm._s(key)+\": \"+_vm._s(value)+\" \")])})],2):_vm._e()],1)])}),0)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"chat-container\">\n    <div class=\"chat-messages\">\n      <div v-for=\"(message, index) in messages\" :key=\"index\" class=\"message\" :class=\"message.role\">\n        <div v-if=\"message.role === 'assistant'\" class=\"assistant-avatar\">\n          <i class=\"fas fa-robot\"></i>\n        </div>\n        <div class=\"message-content\">\n          <VueMarkdown :key=\"message.content\">{{ message.content }}</VueMarkdown>\n          <div v-if=\"Object.keys(changedParams(message)).length > 0\" class=\"pt-2\">\n            <div>{{ $t('I have changed the following parameters:') }}</div>\n            <div v-for=\"(value, key) in changedParams(message)\" :key=\"key\">\n              - {{ key }}: {{ value }}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport VueMarkdown from 'vue-markdown'\n\nexport default {\n  name: 'JusPrinChatHistory',\n  components: {\n    VueMarkdown,\n  },\n  props: {\n    messages: {\n      type: Array,\n      required: true\n    }\n  },\n  methods: {\n    changedParams(message) {\n      return {\n        ...(message.slicing_profiles?.filament_overrides?.[0] ?? {}),\n        ...message.slicing_profiles?.print_process_overrides ?? {},\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.chat-container\n  display: flex\n  flex-direction: column\n  height: 100%\n  overflow-y: auto\n\n.chat-messages\n  flex-grow: 1\n  overflow-y: auto\n  padding: 1rem 0.5rem\n  display: flex\n  flex-direction: column\n\n.message\n  max-width: 80%\n  margin-bottom: 1.5rem\n  padding: 0.5rem\n  border-radius: 18px\n  line-height: 1.4\n  position: relative\n  color: black\n\n  &.user\n    align-self: flex-end\n    background-color: #dcf8c6\n\n  &.assistant\n    align-self: flex-start\n    background-color: #fff\n    display: flex\n    align-items: flex-start\n\n.assistant-avatar\n  width: 30px\n  height: 30px\n  background-color: #8e44ad\n  border-radius: 50%\n  display: flex\n  align-items: center\n  justify-content: center\n  margin-right: 8px\n  flex-shrink: 0\n\n  i\n    color: white\n\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinChatHistory.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinChatHistory.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JusprinChatHistory.vue?vue&type=template&id=108f673a&scoped=true&\"\nimport script from \"./JusprinChatHistory.vue?vue&type=script&lang=js&\"\nexport * from \"./JusprinChatHistory.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JusprinChatHistory.vue?vue&type=style&index=0&id=108f673a&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"108f673a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"chat\" class=\"jusprin-feedback\">\n    <div class=\"d-flex align-items-center\">\n      <div>\n        <font-awesome-icon :icon=\"['fas', 'wand-magic-sparkles']\" />\n      </div>\n      <div class=\"ml-2\">\n        {{ $t('Sliced with Obico AI Assistant.') }}\n        <a href=\"#\" @click=\"showChatHistory\"> {{ $t('View the chat history.') }} </a>\n      </div>\n    </div>\n    <div class=\"feedback-question py-4\">\n      <div class=\"d-flex align-items-center justify-content-between\">\n        <div class=\"question-text d-flex align-items-center\">{{ $t('Was AI Assistant helpful?') }}</div>\n        <div class=\"icon-buttons d-flex align-items-center\">\n          <i\n            class=\"fas fa-thumbs-up feedback-icon\"\n            :class=\"{ 'selected': userFeedback === 'positive' }\"\n            @click=\"submitFeedback('positive')\"\n          ></i>\n          <i\n            class=\"fas fa-thumbs-down feedback-icon\"\n            :class=\"{ 'selected':  userFeedback === 'negative' }\"\n            @click=\"submitFeedback('negative')\"\n          ></i>\n        </div>\n      </div>\n    </div>\n    <transition name=\"fade\">\n      <div v-if=\"showTextFeedback\" class=\"text-feedback mt-3\">\n        <div class=\"form-group\">\n            <textarea\n              v-model=\"textFeedback\"\n              class=\"form-control\"\n              rows=\"3\"\n              maxlength=\"1000\"\n              :placeholder=\"$t('Tell us more')\"\n            ></textarea>\n        </div>\n        <div class=\"text-right\">\n          <button @click=\"submitFeedbackText\" class=\"btn btn-primary\">\n            {{ $t('Send') }}\n          </button>\n        </div>\n      </div>\n    </transition>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport JusPrinChatHistory from './JusprinChatHistory.vue'\n\nexport default {\n  name: 'JusPrintFeedback',\n\n  props: {\n    gCodeFileId: {\n      type: Number,\n      required: true\n    }\n  },\n\n  data() {\n    return {\n      showTextFeedback: false,\n      textFeedback: '',\n      userFeedback: null,\n      chat: null,\n    }\n  },\n\n  created() {\n    this.fetchChat()\n  },\n\n  computed: {\n    thumbsUp() {\n      return this.chat?.user_feedback === 'positive'\n    },\n    thumbsDown() {\n      return this.chat?.user_feedback === 'negative'\n    },\n  },\n  methods: {\n    async fetchChat() {\n      if (!urls.jusprinChats) {\n        return  // No JusPrin chat API endpoint on the server\n      }\n      try {\n        const response = await axios.get(urls.jusprinChats(), {\n          params: { g_code_file_id: this.gCodeFileId }\n        })\n        this.chat = response.data[0]\n        this.userFeedback = this.chat?.user_feedback\n      } catch (error) {\n        this.chat = null\n        console.log('fetchChat error', error)\n      }\n    },\n\n    async submitFeedback(feedback) {\n      this.userFeedback = feedback\n      // Show text feedback input after submitting initial feedback\n      this.showTextFeedback = true\n\n      axios.patch(urls.jusprinChats(this.chat.id), {\n        user_feedback: feedback\n      })\n    },\n\n    submitFeedbackText() {\n      this.showTextFeedback = false\n      axios.patch(urls.jusprinChats(this.chat.id), {\n        user_feedback_text: this.textFeedback\n      })\n    },\n    showChatHistory() {\n      this.$swal\n        .openModalWithComponent(\n          JusPrinChatHistory,\n          {\n            messages: JSON.parse(this.chat?.messages)\n          },\n          {\n            title: this.$t('Chat History'),  // Use this.$t instead of just $t\n            showConfirmButton: false,\n          }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.jusprin-feedback\n  svg\n    width: 1.5em\n    height: 1.5em\n    color: gold\n\n.feedback-question\n  display: flex\n  flex-direction: column\n  align-items: center\n\n  .question-text\n    font-size: 1.2rem\n    margin-right: 20px\n\n  .icon-buttons\n    display: flex\n    justify-content: center\n    gap: 30px\n\n    .feedback-icon\n      font-size: 1.3rem\n      cursor: pointer\n      transition: color 0.3s ease\n\n      &:hover\n        opacity: .8\n\n      &.selected\n        color: var(--color-primary)\n\n.text-feedback\n  margin: 0 auto\n\n  .form-group\n    text-align: left\n\n  textarea\n    resize: vertical\n\n  .text-right\n    text-align: right\n\n\n.fade-enter-active, .fade-leave-active\n  transition: opacity 0.5s\n\n.fade-enter, .fade-leave-to\n  opacity: 0\n</style>\n\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinFeedback.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinFeedback.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JusprinFeedback.vue?vue&type=template&id=e9689bf8&scoped=true&\"\nimport script from \"./JusprinFeedback.vue?vue&type=script&lang=js&\"\nexport * from \"./JusprinFeedback.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JusprinFeedback.vue?vue&type=style&index=0&id=e9689bf8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e9689bf8\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout :is-popup=\"isPopup\">\n    <!-- Tob bar -->\n    <template #topBarLeft>\n      <a\n        v-if=\"isPopup\"\n        href=\"#\"\n        class=\"btn shadow-none icon-btn d-inline\"\n        :title=\"$t('Go Back')\"\n        @click.prevent=\"goBack\"\n      >\n        <i class=\"fas fa-chevron-left\"></i>\n      </a>\n    </template>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <a\n          v-if=\"canDownloadGcode\"\n          @click.prevent=\"downloadGcode\"\n          class=\"btn shadow-none icon-btn action-btn\"\n          :title=\"$t('Download file')\"\n        >\n          <i class=\"fas fa-download\"></i>\n        </a>\n        <!-- Rename -->\n        <a\n          v-if=\"isCloud\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn action-btn\"\n          :title=\"$t('Rename file')\"\n          @click.prevent=\"renameFile\"\n        >\n          <i class=\"fas fa-edit\"></i>\n        </a>\n        <!-- Delete -->\n        <a\n          v-if=\"isCloud\"\n          href=\"#\"\n          class=\"text-danger btn shadow-none icon-btn action-btn\"\n          :title=\"$t('Delete file')\"\n          @click.prevent=\"deleteFile\"\n        >\n          <i class=\"fas fa-trash-alt\"></i>\n        </a>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"dropdownMenuOptions\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          />\n        </b-dropdown>\n\n        <a\n          v-if=\"onClose\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-inline\"\n          title=\"Close\"\n          @click.prevent=\"onClose\"\n        >\n          <i class=\"fas fa-times text-danger\"></i>\n        </a>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <b-container v-if=\"loading || gcodeNotFound\">\n        <b-row>\n          <b-col class=\"text-center mt-5\">\n            <div v-if=\"gcodeNotFound\">\n              <p>{{ $t(\"This G-Code file doesn't exists\") }}</p>\n            </div>\n            <div v-else>\n              <b-spinner />\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n      <b-container v-else fluid>\n        <b-row>\n          <b-col :lg=\"isPopup ? 12 : 5\">\n            <b-alert :show=\"isDeleted\" variant=\"warning warning-block\">\n              {{$t(\"This file is deleted and unavailable for print\")}}\n            </b-alert>\n\n            <!-- File details -->\n            <g-code-details :file=\"gcode\" :show-print-stats=\"true\" :compact-view=\"false\" />\n            <jusprin-feedback v-if=\"isCloud\" class=\"card-container jusprin-feedback\" :g-code-file-id=\"gcode.id\" />\n            <!-- Available printers -->\n            <available-printers\n              v-if=\"!isDeleted\"\n              class=\"card-container available-printers\"\n              :class=\"{ 'full-width': isPopup }\"\n              :is-popup=\"isPopup\"\n              :target-printer-id=\"targetPrinterId || selectedPrinterId\"\n              :gcode=\"gcode\"\n              :is-cloud=\"isCloud\"\n              @refresh=\"onRefresh\"\n            />\n          </b-col>\n          <b-col :lg=\"isPopup ? 12 : 7\">\n            <!-- Print history -->\n            <div class=\"print-history\" :class=\"{ 'full-width': isPopup || isDeleted }\">\n              <h2 class=\"section-title mb-3\">{{ $t(\"Print History\") }}</h2>\n              <div v-if=\"gcode.print_set.length\">\n                <print-history-item\n                  v-for=\"print of gcode.print_set\"\n                  :key=\"`print_${print.id}`\"\n                  :print=\"print\"\n                  class=\"print-item\"\n                ></print-history-item>\n              </div>\n              <div v-else>\n                <div class=\"card-container p-4 justify-content-center text-secondary\">\n                  {{$t(\"This file doesn't have any prints yet\")}}\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n      <rename-modal ref=\"renameModal\" :item=\"gcode\" @renamed=\"onItemRenamed\" />\n      <delete-confirmation-modal\n        ref=\"deleteConfirmationModal\"\n        :item=\"gcode\"\n        @deleted=\"onItemDeleted\"\n      />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport filter from 'lodash/filter'\nimport get from 'lodash/get'\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { normalizedGcode, normalizedPrinter } from '@src/lib/normalizers'\nimport RenameModal from '@src/components/g-codes/RenameModal.vue'\nimport DeleteConfirmationModal from '@src/components/g-codes/DeleteConfirmationModal.vue'\nimport availablePrinters from '@src/components/g-codes/AvailablePrinters.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport {\n  listPrinterLocalGCodesMoonraker,\n  listPrinterLocalGCodesOctoPrint,\n} from '@src/lib/printer-local-comm'\nimport PrintHistoryItem from '@src/components/prints/PrintHistoryItem.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport GCodeDetails from '@src/components/GCodeDetails.vue'\nimport JusprinFeedback from '@src/components/g-codes/JusprinFeedback.vue'\n\nexport default {\n  name: 'GCodeFilePage',\n\n  components: {\n    PageLayout,\n    RenameModal,\n    DeleteConfirmationModal,\n    availablePrinters,\n    PrintHistoryItem,\n    CascadedDropdown,\n    GCodeDetails,\n    JusprinFeedback,\n  },\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    targetPrinterId: {\n      type: Number,\n      default: null,\n    },\n    onClose: {\n      type: Function,\n      default: null,\n    },\n    routeParams: {\n      type: Object,\n      default: () => {\n        return {\n          fileId: null,\n          printerId: null,\n        }\n      },\n    },\n  },\n\n  data() {\n    return {\n      gcode: null,\n      printer: null,\n      loading: true,\n      gcodeNotFound: false,\n    }\n  },\n\n  computed: {\n    isCloud() {\n      return !this.selectedPrinterId\n    },\n    isDeleted() {\n      return !!this.gcode?.deleted\n    },\n    dropdownMenuOptions() {\n      const menuOptions = [\n        {\n          key: 'renameFile',\n          icon: 'fas fa-edit',\n          title: this.$i18next.t(`Rename file`),\n          callback: true,\n        },\n        {\n          key: 'deleteFile',\n          icon: 'fas fa-trash-alt',\n          customMenuOptionClass: 'text-danger',\n          title: this.$i18next.t(`Delete file`),\n          callback: true,\n        },\n      ]\n\n      if (this.canDownloadGcode) {\n        menuOptions.unshift({\n          key: 'downloadGcode',\n          icon: 'fas fa-download',\n          title: this.$i18next.t(`Download file`),\n          callback: true,\n        })\n      }\n\n      return menuOptions\n    },\n    canDownloadGcode() {\n      return this.gcode?.url && this.gcode?.safe_filename\n    },\n  },\n\n  async created() {\n    this.selectedPrinterId = Number(this.getRouteParam('printerId')) || null\n    if (this.selectedPrinterId) {\n      await this.fetchPrinter()\n    }\n    this.gcodeId = this.getRouteParam('fileId')\n    this.fetchGcode()\n  },\n\n  methods: {\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'renameFile') {\n        this.renameFile()\n      } else if (menuOptionKey === 'deleteFile') {\n        this.deleteFile()\n      } else if (menuOptionKey === 'downloadGcode') {\n        this.downloadGcode()\n      }\n    },\n    getRouteParam(name) {\n      return this.isPopup ? this.routeParams[name] : this.$route.params[name]\n    },\n    goBack() {\n      this.$emit('goBack')\n    },\n    async fetchPrinter() {\n      return axios\n        .get(urls.printer(this.selectedPrinterId))\n        .then((response) => {\n          this.printer = normalizedPrinter(response.data)\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Host printer for this gcode not found')}`)\n        })\n    },\n    async fetchLocalFile() {\n      if (!this.printerComm) {\n        return\n      }\n      this.loading = true\n\n      const decodedPath = decodeURIComponent(this.gcodeId)\n      const filename = decodedPath.split('/').at(-1)\n      const dir_path =\n        filename === decodedPath\n          ? ''\n          : decodedPath.slice(0, decodedPath.length - filename.length - 1)\n\n      const getPrinterLocalGCode = this.printer.isAgentMoonraker()\n        ? listPrinterLocalGCodesMoonraker\n        : listPrinterLocalGCodesOctoPrint\n\n      getPrinterLocalGCode(this.printerComm, dir_path, null)\n        .then((result) => {\n          return { files: filter(get(result, 'files', []), (f) => f.filename == filename) }\n        })\n        .then(async (result) => {\n          this.loading = false\n          if (result?.files?.length === 0) {\n            this.gcodeNotFound = true\n            return\n          }\n\n          const file = result?.files[0]\n          this.gcode = {\n            ...normalizedGcode(file),\n            print_set: [],\n          }\n          if (file.path && file.hash && this.getRouteParam('printerId')) {\n            const safeFilename = file.path.replace(/^.*[\\\\/]/, '')\n            try {\n              let response = await axios.get(urls.gcodeFiles(), {\n                params: {\n                  resident_printer: this.getRouteParam('printerId'),\n                  safe_filename: safeFilename,\n                  agent_signature: `md5:${file.hash}`,\n                },\n              })\n              const gcodeFileOnServer = get(response, 'data.results[0]')\n              if (gcodeFileOnServer) {\n                const cloudCopy = normalizedGcode(gcodeFileOnServer)\n                this.gcode.print_set = cloudCopy.print_set\n              }\n            } catch (e) {\n              console.error(e)\n            }\n          }\n        })\n        .catch((err) => {\n          this.gcodeNotFound = true\n        })\n    },\n    async fetchGcode() {\n      if (this.selectedPrinterId) {\n        this.printerComm = printerCommManager.getOrCreatePrinterComm(\n          this.selectedPrinterId,\n          urls.printerWebSocket(this.selectedPrinterId)\n        )\n        this.printerComm.connect(this.fetchLocalFile)\n        return\n      }\n\n      this.loading = true\n      const fileId = this.getRouteParam('fileId')\n      let file\n\n      try {\n        file = await axios.get(urls.gcodeFile(fileId))\n      } catch (e) {\n        this.loading = false\n        console.error(e)\n      }\n\n      if (!file?.data) {\n        this.loading = false\n        this.gcodeNotFound = true\n        return\n      }\n\n      file = file?.data\n      this.gcode = normalizedGcode(file)\n      this.loading = false\n    },\n    renameFile() {\n      this.$refs.renameModal.show()\n    },\n    onItemRenamed(newName) {\n      this.gcode.filename = newName\n    },\n    deleteFile() {\n      this.$refs.deleteConfirmationModal.show()\n    },\n    onItemDeleted() {\n      if (!this.isPopup) {\n        window.location.replace('/g_code_folders/cloud/')\n      } else {\n        this.$emit('goBack')\n      }\n    },\n    onRefresh() {\n      this.$router.go()\n    },\n    async downloadGcode() {\n      const fileUrl = this.gcode.url\n\n      const response = await fetch(fileUrl);\n      const blob = await response.blob();\n\n      const link = document.createElement('a');\n      link.href = URL.createObjectURL(blob);\n      link.download = this.gcode.safe_filename\n\n      document.body.appendChild(link);\n\n      link.click();\n\n      URL.revokeObjectURL(link.href);\n      document.body.removeChild(link);\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.warning-block\n  margin-bottom: var(--gap-between-blocks)\n\n.available-printers,\n.jusprin-feedback\n  margin-top: var(--gap-between-blocks)\n  &.full-width\n    margin-top: 15px\n\n.print-history\n  &.full-width\n    margin-top: 30px\n  @media (max-width: 991px)\n    margin-top: 30px\n\n.file-name\n  font-size: 1.25rem\n  margin-bottom: 1rem\n  border-bottom: 1px solid var(--color-divider)\n  padding-bottom: 1rem\n\n.file-info-line\n  display: flex\n  justify-content: space-between\n  margin-bottom: 0.5rem\n\n  i\n    margin-right: 0.375rem\n\n  .value\n    font-weight: 700\n\n.section-title\n  font-size: 1.25rem\n  margin-bottom: 0.5rem\n\n.print-item\n  margin-bottom: 10px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFilePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFilePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeFilePage.vue?vue&type=template&id=5e958c35&scoped=true&\"\nimport script from \"./GCodeFilePage.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeFilePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeFilePage.vue?vue&type=style&index=0&id=5e958c35&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5e958c35\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Serial Port\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"connect-port\"},model:{value:(_vm.selectedPort),callback:function ($$v) {_vm.selectedPort=$$v},expression:\"selectedPort\"}},_vm._l((_vm.connectionOptions.ports),function(port){return _c('b-form-select-option',{key:port,attrs:{\"value\":port}},[_vm._v(\" \"+_vm._s(port)+\" \")])}),1)],1),_c('br'),_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Baudrate\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"connect-baudrate\"},model:{value:(_vm.selectedBaudrate),callback:function ($$v) {_vm.selectedBaudrate=$$v},expression:\"selectedBaudrate\"}},[_c('b-form-select-option',{attrs:{\"value\":\"\"}},[_vm._v(_vm._s(_vm.$t(\"Auto\")))]),_vm._l((_vm.connectionOptions.baudrates),function(baudrate){return _c('b-form-select-option',{key:baudrate,attrs:{\"value\":baudrate}},[_vm._v(\" \"+_vm._s(baudrate)+\" \")])})],2)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div>\n      <h5>{{ $t(\"Serial Port\") }}:</h5>\n    </div>\n    <div>\n      <b-form-select id=\"connect-port\" v-model=\"selectedPort\" class=\"form-control\">\n        <b-form-select-option v-for=\"port in connectionOptions.ports\" :key=\"port\" :value=\"port\">\n          {{ port }}\n        </b-form-select-option>\n      </b-form-select>\n    </div>\n    <br />\n    <div>\n      <h5>{{ $t(\"Baudrate\") }}:</h5>\n    </div>\n    <div>\n      <b-form-select id=\"connect-baudrate\" v-model=\"selectedBaudrate\" class=\"form-control\">\n        <b-form-select-option value=\"\">{{ $t(\"Auto\") }}</b-form-select-option>\n        <b-form-select-option\n          v-for=\"baudrate in connectionOptions.baudrates\"\n          :key=\"baudrate\"\n          :value=\"baudrate\"\n        >\n          {{ baudrate }}\n        </b-form-select-option>\n      </b-form-select>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'ConnectPrinter',\n  props: {\n    connectionOptions: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      selectedPort: this.connectionOptions.ports[0],\n      selectedBaudrate: '',\n    }\n  },\n}\n</script>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ConnectPrinter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ConnectPrinter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConnectPrinter.vue?vue&type=template&id=babeaa02&\"\nimport script from \"./ConnectPrinter.vue?vue&type=script&lang=js&\"\nexport * from \"./ConnectPrinter.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <widget-template :inside-card=\"insideCard\">\n    <template #title>{{ $t(\"Print Job Control\") }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div v-if=\"!printer.isOffline() && printer.hasError()\" class=\"error-container\">\n          <div class=\"title\">{{ printer.agentDisplayName() }} {{$t('Error')}}</div>\n          <p class=\"text\">\n            {{ printer.status.state.error }}\n          </p>\n        </div>\n\n        <div v-if=\"printer.inUserInteractionRequired()\" class=\"warning-container\">\n          <p class=\"text\">{{ $t(\"Filament Change or User Interaction Required\") }}</p>\n        </div>\n\n        <template v-if=\"printer.inTransientState()\">\n          <b-spinner label=\"Processing...\"></b-spinner>\n          <p>{{ printer.calculatedState() }}...</p>\n        </template>\n\n        <template v-else>\n          <template v-if=\"!printer.isOffline() && !printer.isDisconnected() && printer.isActive()\">\n            <p>\n              <span v-if=\"!printer.isPaused()\">{{ $t(\"Printer is Currently Printing\") }}</span>\n              <span v-else>{{ $t(\"Print is Paused\") }}</span>\n            </p>\n            <div class=\"buttons\">\n              <b-button\n                v-if=\"!printer.isPaused()\"\n                variant=\"warning\"\n                class=\"custom-button\"\n                @click=\"onPauseToggled($event)\"\n              >\n                <font-awesome-icon icon=\"fa-solid fa-circle-pause\" />\n                {{$t(\"Pause\")}}\n              </b-button>\n              <b-button\n                v-else\n                variant=\"success\"\n                class=\"custom-button\"\n                @click=\"onPauseToggled($event)\"\n              >\n                <font-awesome-icon icon=\"fa-solid fa-circle-play\" />\n                {{$t(\"Resume\")}}\n              </b-button>\n              <b-button variant=\"danger\" class=\"custom-button\" @click=\"onCancelClicked\">\n                <font-awesome-icon icon=\"fa-solid fa-circle-xmark\" />\n                {{$t(\"Cancel\")}}\n              </b-button>\n            </div>\n          </template>\n\n          <template v-if=\"!printer.isOffline() && !printer.isDisconnected() && !printer.isActive()\">\n            <p>{{ $t(\"Open G-Code File to Start Printing\") }}</p>\n            <div class=\"buttons\">\n              <b-button variant=\"outline-primary\" class=\"custom-button\" @click=\"openObicoFiles\">\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n                {{ $syndicateText.brandName }} {{$t(\"Files\")}}\n              </b-button>\n              <b-button\n                v-if=\"printer.isAgentMoonraker()\"\n                variant=\"outline-secondary\"\n                class=\"custom-button\"\n                @click=\"openPrinterFiles\"\n              >\n                &nbsp;\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-klipper-logo\" />\n                </svg>\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-fluidd-logo\" />\n                </svg>\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-mainsail-logo\" />\n                </svg>\n                &nbsp;\n              </b-button>\n              <b-button\n                v-else\n                variant=\"outline-secondary\"\n                class=\"custom-button\"\n                @click=\"openPrinterFiles\"\n              >\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-octoprint-logo\" />\n                </svg>\n                OctoPrint\n              </b-button>\n            </div>\n          </template>\n        </template>\n\n        <template v-if=\"!printer.isOffline() && printer.isDisconnected()\">\n          <p>{{ $t(\"Printer Not Connected at the Serial Port\") }}</p>\n          <div class=\"buttons\">\n            <b-button\n              v-if=\"!printer.isAgentMoonraker()\"\n              variant=\"outline-primary\"\n              :disabled=\"connecting\"\n              @click=\"onConnectClicked\"\n            >\n              <b-spinner v-if=\"connecting\" small></b-spinner>\n              <i v-else class=\"fab fa-usb\"></i>\n              {{ connecting ? $t('Contacting OctoPrint') : $t('Connect') }}\n            </b-button>\n          </div>\n        </template>\n\n        <template v-else-if=\"printer.isOffline()\">\n          <i class=\"fas fa-exclamation-triangle big-icon warning\"></i>\n          <p>\n            {{$t(\"{brandName} Plugin is Offline.\",{brandName:$syndicateText.brandName})}}\n            <a\n              target=\"_blank\"\n              :href=\"getDocUrl('/user-guides/troubleshoot-server-connection-issues/')\"\n              >{{ $t(\"Why?\") }}</a\n            >\n          </p>\n        </template>\n\n        <b-modal v-if=\"printer\" :id=\"modalId\" size=\"lg\" @hidden=\"resetGcodesModal\">\n          <g-code-file-page\n            v-if=\"selectedGcodeId\"\n            :is-popup=\"true\"\n            :target-printer-id=\"printer.id\"\n            :route-params=\"{\n              fileId: selectedGcodeId,\n              printerId: printerFiles ? printer.id : null,\n            }\"\n            :on-close=\"() => $bvModal.hide(modalId)\"\n            @goBack=\"\n              () => {\n                selectedGcodeId = null\n                scrollToTop()\n              }\n            \"\n          />\n          <g-code-folders-page\n            v-else\n            :is-popup=\"true\"\n            :target-printer=\"printer\"\n            :route-params=\"{\n              printerId: printerFiles ? printer.id : null,\n              parentFolder: null,\n            }\"\n            :on-close=\"() => $bvModal.hide(modalId)\"\n            :saved-path=\"savedPath\"\n            :scroll-container-id=\"modalId\"\n            @openFile=\"\n              (fileId, printerId, path) => {\n                selectedGcodeId = fileId\n                savedPath = path\n                scrollToTop()\n              }\n            \"\n          />\n        </b-modal>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport GCodeFoldersPage from '@src/views/GCodeFoldersPage.vue'\nimport GCodeFilePage from '@src/views/GCodeFilePage.vue'\nimport ConnectPrinter from '@src/components/printers/ConnectPrinter.vue'\n\nconst PAUSE_PRINT = '/pause_print/'\nconst RESUME_PRINT = '/resume_print/'\nconst CANCEL_PRINT = '/cancel_print/'\n\nexport default {\n  name: 'PrintJobControlWidget',\n\n  components: {\n    WidgetTemplate,\n    GCodeFoldersPage,\n    GCodeFilePage,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n    insideCard: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data() {\n    return {\n      connectBtnClicked: false,\n      selectedGcodeId: null,\n      savedPath: [null],\n      printerFiles: false,\n    }\n  },\n\n  computed: {\n    connecting() {\n      return this.connectBtnClicked && this.printer.isDisconnected()\n    },\n    modalId() {\n      return 'b-modal-gcodes' + this.printer.id\n    },\n  },\n\n  methods: {\n    openObicoFiles() {\n      this.openFiles(false)\n    },\n    openPrinterFiles() {\n      this.openFiles(true)\n    },\n    openFiles(printerFiles) {\n      // savedPath holds folder ids for Obico files but printer-local paths for printer files,\n      // so a path saved in one mode must never be restored in the other.\n      if (printerFiles !== this.printerFiles) {\n        this.savedPath = [null]\n      }\n      this.printerFiles = printerFiles\n      this.$bvModal.show(this.modalId)\n    },\n    scrollToTop() {\n      document.querySelector('#' + this.modalId).scrollTo(0, 0)\n    },\n    resetGcodesModal() {\n      this.selectedGcodeId = null\n    },\n    onConnectClicked() {\n      this.printerComm.passThruToPrinter(\n        { func: 'get_connection_options', target: '_printer' },\n        (err, connectionOptions) => {\n          if (err) {\n            this.$swal.Toast.fire({\n              icon: 'error',\n              title: err,\n            })\n          } else {\n            if (connectionOptions.ports.length < 1) {\n              this.$swal.Toast.fire({\n                icon: 'error',\n                title: `${this.$i18next.t('Uh-Oh. No printer is found on the serial port.')}`,\n              })\n            } else {\n              this.$swal\n                .openModalWithComponent(\n                  ConnectPrinter,\n                  {\n                    connectionOptions: connectionOptions,\n                  },\n                  {\n                    confirmButtonText: 'Connect',\n                    showCancelButton: true,\n                    preConfirm: () => {\n                      return {\n                        port: document.getElementById('connect-port').value,\n                        baudrate: document.getElementById('connect-baudrate').value,\n                      }\n                    },\n                  }\n                )\n                .then((result) => {\n                  if (result.value) {\n                    let args = [result.value.port, result.value.baudrate]\n                    this.printerComm.passThruToPrinter({\n                      func: 'connect',\n                      target: '_printer',\n                      args: args,\n                    })\n                  }\n                })\n            }\n          }\n        }\n      )\n\n      this.connectBtnClicked = true\n      setTimeout(() => {\n        this.connectBtnClicked = false\n      }, 10 * 1000)\n    },\n    onPauseToggled(ev) {\n      if (this.printer.isPaused()) {\n        if (this.printer.alertUnacknowledged()) {\n          this.$emit('notAFailureClicked', ev, true)\n        } else {\n          this.$emit('sendPrinterAction', this.printer.id, RESUME_PRINT)\n          this.printer.setTransientState('Resuming')\n        }\n      } else {\n        this.$swal.Confirm.fire({\n          html: `If you haven't changed the default configuration, the heaters will be turned off, and the print head will be z-lifted. The reversed will be performed before the print is resumed. <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/detection-print-job-settings#when-print-is-paused')}\">Learn more. <small><i class=\"fas fa-external-link-alt\"></i></small></a>`,\n        }).then((result) => {\n          if (result.value) {\n            this.$emit('sendPrinterAction', this.printer.id, PAUSE_PRINT)\n            this.printer.setTransientState('Pausing')\n          }\n        })\n      }\n    },\n    onCancelClicked() {\n      this.$swal.Confirm.fire({\n        text: `${this.$i18next.t('Once cancelled, the print can no longer be resumed.')}`,\n      }).then((result) => {\n        if (result.value) {\n          this.$emit('sendPrinterAction', this.printer.id, CANCEL_PRINT)\n          this.printer.setTransientState('Cancelling')\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  justify-content: center\n  padding-bottom: 2rem\n  gap: 1rem\n  @media (max-width: 480px)\n    height: auto\n\n.error-container, .warning-container\n  width: 100%\n  background-color: var(--color-danger)\n  color: var(--color-on-danger)\n  padding: 1rem\n  border-radius: var(--border-radius-sm)\n  text-align: center\n  font-weight: normal\n  margin-bottom: 1rem\n  .title\n    font-size: 1rem\n    font-weight: bold\n    margin-bottom: .5rem\n  p\n    font-size: 1rem\n    font-weight: normal\n  &.warning-container\n    background-color: var(--color-warning)\n    color: var(--color-on-warning)\n\np\n  margin: 0\n  font-size: 1.125rem\n  text-align: center\n\n.buttons\n  display: flex\n  align-items: center\n  justify-content: center\n  gap: 1rem\n  margin-top: .5rem\n  flex-wrap: wrap\n\n.big-icon\n  font-size: 2rem\n  &.warning\n    color: var(--color-warning)\n  &.danger\n    color: var(--color-danger)\n\n.custom-svg-icon\n  height: 1.125rem\n  width: 1.125rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintJobControlWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintJobControlWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintJobControlWidget.vue?vue&type=template&id=6af168b5&scoped=true&\"\nimport script from \"./PrintJobControlWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintJobControlWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintJobControlWidget.vue?vue&type=style&index=0&id=6af168b5&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6af168b5\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div :id=\"printer.id\" class=\"col-sm-12 col-lg-6 printer-card\">\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"title-box\">\n          <div class=\"printer-name\">\n            {{ printer.name }}\n          </div>\n          <div v-if=\"hasCurrentPrintFilename\" class=\"secondary-title print-filename\">\n            {{ printer.current_print.filename }}\n          </div>\n          <div v-else class=\"secondary-title\" :class=\"statusClass\">{{ statusText }}</div>\n        </div>\n        <div class=\"d-flex ml-2\">\n          <b-button\n            variant=\"outline-secondary\"\n            :href=\"`/printers/${printer.id}/control/`\"\n            class=\"px-4 mr-2\"\n            >{{$t(\"Open\")}}&nbsp;{{$t(\"Details\")}}\n          </b-button>\n          <b-dropdown right no-caret toggle-class=\"icon-btn\">\n            <template #button-content>\n              <i class=\"fas fa-ellipsis-v\"></i>\n            </template>\n            <b-dropdown-item href=\"#\" @click.prevent=\"onSharePrinter()\">\n              <i class=\"fas fa-share-alt fa-lg\"></i>{{$t(\"Share\")}}\n            </b-dropdown-item>\n            <b-dropdown-item :href=\"octoPrintTunnelUrl()\">\n              <svg class=\"menu-icon\">\n                <use href=\"#svg-tunnel\" />\n              </svg>\n              {{ printer.agentDisplayName() }} {{$t(\"Tunnel\")}}\n            </b-dropdown-item>\n            <div class=\"dropdown-divider\"></div>\n            <b-dropdown-item :href=\"settingsUrl()\">\n              <i class=\"fas fa-wrench fa-lg\"></i>{{$t(\"Configure\")}}\n            </b-dropdown-item>\n          </b-dropdown>\n        </div>\n      </div>\n      <div class=\"px-0 py-0 content d-inline-block\" style=\"width: 100%;\">\n        <div class=\"d-flex justify-content-center webcamBackground\">\n        <streaming-box :printer=\"printer\" :webrtc=\"webrtc\" :autoplay=\"isProAccount\" :webcam=\"webcam\" />\n        </div>\n      </div>\n      <div\n        v-if=\"printer.alertUnacknowledged()\"\n        class=\"failure-alert card-body bg-warning px-2 py-1\"\n      >\n        <i class=\"fas fa-exclamation-triangle align-middle\"></i>\n        <span class=\"align-middle\">{{ $t(\"Failure Detected!\") }}</span>\n        <button\n          id=\"not-a-failure\"\n          type=\"button\"\n          class=\"btn btn-outline-primary btn-sm float-right\"\n          @click=\"onNotAFailureClicked($event, false)\"\n        >\n          {{$t(\"Not a failure?\")}}\n        </button>\n      </div>\n\n      <div class=\"card-body gauge-container\" :class=\"{ overlay: !isWatching }\">\n        <div\n          v-if=\"!isWatching\"\n          class=\"overlay-top text-center\"\n          style=\"left: 0; width: 100%; top: 50%; margin-top: -55px\"\n        >\n          <H1><i class=\"far fa-eye-slash\"></i></H1>\n          <h5 class=\"text-warning\">{{ $t(\"Failure Detection is Off\") }}</h5>\n          <small v-if=\"printer.not_watching_reason\"\n            >{{ printer.not_watching_reason }}.\n            <a :href=\"getDocUrl('/user-guides/detective-not-watching/')\" target=\"_blank\"\n              >{{ $t(\"Learn more. \") }}<small><i class=\"fas fa-external-link-alt\"></i></small></a\n          ></small>\n          <div></div>\n        </div>\n        <failure-detection-gauge :normalized-p=\"printer.normalized_p\" :is-watching=\"isWatching\" />\n        <hr />\n      </div>\n      <print-job-control-widget\n        :inside-card=\"true\"\n        :printer=\"printer\"\n        :printer-comm=\"printerComm\"\n        @notAFailureClicked=\"onNotAFailureClicked\"\n        @sendPrinterAction=\"sendPrinterAction\"\n      />\n      <div class=\"info-section settings\">\n        <button\n          type=\"button\"\n          class=\"info-section-toggle btn btn-sm no-corner mx-2\"\n          :class=\"{ pressed: section_toggles.settings }\"\n          @click=\"onSettingsToggleClicked()\"\n        >\n          <i class=\"fas fa-cog fa-lg\"></i>\n        </button>\n        <button\n          type=\"button\"\n          class=\"info-section-toggle btn btn-sm no-corner mx-2\"\n          :class=\"{ pressed: section_toggles.time }\"\n          @click=\"onTimeToggleClicked()\"\n        >\n          <i class=\"fas fa-clock fa-lg\"></i>\n        </button>\n        <button\n          type=\"button\"\n          class=\"info-section-toggle btn btn-sm no-corner mx-2\"\n          :class=\"{ pressed: section_toggles.statusTemp }\"\n          @click=\"onStatusTempToggleClicked()\"\n        >\n          <i class=\"fas fa-thermometer-half fa-lg\"></i>\n        </button>\n      </div>\n      <div class=\"info-section\" style=\"height: 0.3rem\"></div>\n      <div>\n        <div class=\"info-section container\">\n          <div v-if=\"section_toggles.settings\" id=\"panel-settings\">\n            <div class=\"pt-2 pb-3\">\n              <div class=\"row justify-content-center px-3\">\n                <div class=\"col-12 setting-item\">\n                  <label class=\"toggle-label\" :for=\"'watching_enabled-toggle-' + printer.id\"\n                    >\n                    <i18next :translation=\"$t('Enable AI failure detection {localizedDom}')\">\n                      <template #localizedDom>\n                        <div v-if=\"!watchForFailures\" class=\"text-muted font-weight-light font-size-sm\"> {{$t(\"AI failure detection is disabled. You are on your own\")}}.</div>\n                      </template>\n                    </i18next>\n\n                  </label>\n                  <div class=\"custom-control custom-switch\">\n                    <input\n                      :id=\"'watching_enabled-toggle-' + printer.id\"\n                      type=\"checkbox\"\n                      name=\"watching_enabled\"\n                      class=\"custom-control-input update-printer\"\n                      :checked=\"watchForFailures\"\n                      @click=\"onWatchForFailuresToggled\"\n                    />\n                    <label\n                      class=\"custom-control-label\"\n                      :for=\"'watching_enabled-toggle-' + printer.id\"\n                      style=\"font-size: 1rem\"\n                    ></label>\n                  </div>\n                </div>\n              </div>\n              <div class=\"row justify-content-center px-3\">\n                <div class=\"col-12 setting-item\">\n                  <label class=\"toggle-label\" :for=\"'pause-toggle-' + printer.id\">\n                    <i18next :translation=\"$t('Pause on detected failures {localizedDom}')\">\n                      <template #localizedDom>\n                        <div v-if=\"!pauseOnFailure\" class=\"text-muted font-weight-light font-size-sm\"> {{$t(\"You will still be alerted via notifications\")}}</div>\n                      </template>\n                    </i18next>\n                  </label>\n                  <div class=\"custom-control custom-switch\">\n                    <input\n                      :id=\"'pause-toggle-' + printer.id\"\n                      type=\"checkbox\"\n                      name=\"pause_on_failure\"\n                      class=\"custom-control-input update-printer\"\n                      :checked=\"pauseOnFailure\"\n                      @click=\"onPauseOnFailureToggled\"\n                    />\n                    <label\n                      class=\"custom-control-label\"\n                      :for=\"'pause-toggle-' + printer.id\"\n                      style=\"font-size: 1rem\"\n                    >\n                    </label>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div v-if=\"section_toggles.time\" id=\"print-time\">\n            <div class=\"py-2\">\n              <div class=\"row text-muted\">\n                <small class=\"col-5 offset-2\">{{ $t(\" Remaining \") }}</small>\n                <small class=\"col-5\">{{ $t(\" Total \") }}</small>\n              </div>\n              <div class=\"row\">\n                <div class=\"col-2 text-muted\">\n                  <i class=\"fas fa-clock\"></i>\n                </div>\n                <duration-block\n                  id=\"print-time-remaining\"\n                  class=\"col-5 numbers\"\n                  v-bind=\"timeRemaining\"\n                ></duration-block>\n                <duration-block\n                  id=\"print-time-total\"\n                  class=\"col-5 numbers\"\n                  v-bind=\"timeTotal\"\n                ></duration-block>\n                <div class=\"col-12\">\n                  <div class=\"progress\" style=\"height: 2px\">\n                    <div\n                      id=\"print-progress\"\n                      class=\"progress-bar\"\n                      :class=\"{\n                        'progress-bar-striped': progressPct < 100,\n                        'progress-bar-animated': progressPct < 100,\n                      }\"\n                      role=\"progressbar\"\n                      aria-valuenow=\"0\"\n                      aria-valuemin=\"0\"\n                      aria-valuemax=\"100\"\n                      :style=\"`width: ${progressPct}%;`\"\n                    ></div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <status-temp\n            v-if=\"section_toggles.statusTemp && tempProps.show\"\n            id=\"status_temp_block\"\n            v-bind=\"tempProps\"\n            @TempEditClicked=\"onTempEditClicked\"\n          ></status-temp>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport get from 'lodash/get'\nimport moment from 'moment'\nimport axios from 'axios'\n\nimport urls from '@config/server-urls'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport { temperatureDisplayName } from '@src/lib/utils'\nimport WebRTCConnection from '@src/lib/webrtc'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport StreamingBox from '@src/components/StreamingBox'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport DurationBlock from './DurationBlock.vue'\nimport StatusTemp from './StatusTemp.vue'\nimport TempTargetEditor from './TempTargetEditor.vue'\nimport SharePrinter from './SharePrinter.vue'\nimport PrintJobControlWidget from '@src/components/printer-control/PrintJobControlWidget.vue'\n\nconst RESUME_PRINT = '/resume_print/'\nconst MUTE_CURRENT_PRINT = '/mute_current_print/?mute_alert=true'\nconst ACK_ALERT_NOT_FAILED = '/acknowledge_alert/?alert_overwrite=NOT_FAILED'\n\nconst Show = true\nconst Hide = false\n\nconst LocalPrefNames = {\n  Settings: 'panel-settings',\n  Time: 'print-time',\n  StatusTemp: 'status_temp_block',\n}\n\nexport default {\n  name: 'PrinterCard',\n\n  components: {\n    StreamingBox,\n    FailureDetectionGauge,\n    DurationBlock,\n    StatusTemp,\n    PrintJobControlWidget,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    isProAccount: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      section_toggles: {\n        settings: getLocalPref(LocalPrefNames.Settings + String(this.printer.id), Show),\n        time: getLocalPref(LocalPrefNames.Time + String(this.printer.id), Hide),\n        statusTemp: getLocalPref(LocalPrefNames.StatusTemp + String(this.printer.id), Show),\n      },\n      webrtc: null,\n      webcam: null,\n    }\n  },\n  computed: {\n    isWatching() {\n      return !this.printer.not_watching_reason\n    },\n    timeRemaining() {\n      return this.toDuration(this.secondsLeft, this.printer.isActive())\n    },\n    timeTotal() {\n      let secs = null\n      if (this.secondsPrinted && this.secondsLeft) {\n        secs = this.secondsPrinted + this.secondsLeft\n      }\n      return this.toDuration(secs, this.printer.isActive())\n    },\n    secondsLeft() {\n      return get(this.printer, 'status.progress.printTimeLeft')\n    },\n    secondsPrinted() {\n      return get(this.printer, 'status.progress.printTime')\n    },\n    watchForFailures() {\n      return this.printer.watching_enabled\n    },\n    pauseOnFailure() {\n      return this.printer.action_on_failure == 'PAUSE'\n    },\n    hasCurrentPrintFilename() {\n      if (this.printer.current_print && this.printer.current_print.filename) {\n        return true\n      }\n      return false\n    },\n    actionsProps() {\n      return {\n        printer: this.printer,\n      }\n    },\n    progressPct() {\n      return get(this.printer, 'status.progress.completion') || 0 // get(this.printer, 'status.progress.completion') may return null\n    },\n    tempProps() {\n      // If temp_profiles is missing, it's a plugin version too old to change temps\n      let isPluginVersionSufficient = get(this.printer, 'settings.temp_profiles') != undefined\n      const temperatures = {}\n      for (const [key, value] of Object.entries(get(this.printer, 'status.temperatures', {}))) {\n        if (Boolean(value.actual) && !isNaN(value.actual)) {\n          // Take out NaN, 0, null. Apparently printers like Prusa throws random temperatures here.\n          temperatures[key] = value\n        }\n      }\n      return {\n        temperatures: temperatures,\n        show: Object.keys(temperatures).length > 0,\n        isPluginVersionSufficient,\n      }\n    },\n    statusText() {\n      return this.printer.calculatedState() || 'Offline'\n    },\n    statusClass() {\n      if (this.printer.hasError()) {\n        return 'text-danger'\n      }\n      if (\n        this.printer.isOffline() ||\n        this.printer.isDisconnected() ||\n        this.printer.inTransientState()\n      ) {\n        return 'text-warning'\n      }\n      return 'text-success'\n    },\n  },\n  created() {\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.printer.id,\n      urls.printerWebSocket(this.printer.id),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.$emit('PrinterUpdated', this.updatedPrinter(data))\n\n          if (!this.webrtc && (data?.settings?.webcams || []).length > 0) {\n            const webcams = data.settings?.webcams\n            this.webcam = webcams?.find(webcam => webcam.is_primary_camera === true);\n            if (this.webcam) {\n              this.webrtc = WebRTCConnection(this.webcam.stream_mode, this.webcam.stream_id)\n              this.webrtc.openForPrinter(this.printer.id, this.printer.auth_token)\n              this.printerComm.setWebRTCConnection(this.webcam.name, this.webrtc)\n            }\n          }\n        },\n        onStatusReceived: (printerStatus) => {\n          // Backward compatibility: octoprint_data is for OctoPrint-Obico 2.1.2 or earlier, or moonraker-obico 0.5.1 or earlier\n          const status = printerStatus.status || printerStatus.octoprint_data\n          this.$emit('PrinterUpdated', this.updatedPrinter({ status }))\n        },\n      }\n    )\n    this.printerComm.connect()\n  },\n\n  methods: {\n    updatedPrinter(newData) {\n      return normalizedPrinter(newData, this.printer)\n    },\n    settingsUrl() {\n      return `/printers/${this.printer.id}/`\n    },\n    octoPrintTunnelUrl() {\n      return `/tunnels/${this.printer.id}/`\n    },\n    onSettingsToggleClicked() {\n      this.section_toggles.settings = !this.section_toggles.settings\n      setLocalPref(LocalPrefNames.Settings + String(this.printer.id), this.section_toggles.settings)\n    },\n    onTimeToggleClicked() {\n      this.section_toggles.time = !this.section_toggles.time\n      setLocalPref(LocalPrefNames.Time + String(this.printer.id), this.section_toggles.time)\n    },\n    onStatusTempToggleClicked() {\n      this.section_toggles.statusTemp = !this.section_toggles.statusTemp\n      setLocalPref(\n        LocalPrefNames.StatusTemp + String(this.printer.id),\n        this.section_toggles.statusTemp\n      )\n    },\n    onNotAFailureClicked(ev, resumePrint) {\n      this.$swal.Confirm.fire({\n        title: `${this.$i18next.t('Noted!')}`,\n        html: `<p>${this.$i18next.t(\"Do you want to mute failure detection on for this print?\")}</p><small>${this.$i18next.t(\"If you select 'Mute', failure detection will be turned off for this print, but will be automatically turned on for your next print.\")}</small>`,\n        confirmButtonText: `${this.$i18next.t('Mute')}`,\n        cancelButtonText: `${this.$i18next.t('Cancel')}`,\n      }).then((result) => {\n        if (result.isConfirmed) {\n          // Hack: So that 2 APIs are not called at the same time\n          setTimeout(() => {\n            this.sendPrinterAction(this.printer.id, MUTE_CURRENT_PRINT)\n          }, 1000)\n        }\n        if (resumePrint) {\n          this.printer.setTransientState('Resuming')\n          this.sendPrinterAction(this.printer.id, RESUME_PRINT)\n        } else {\n          this.sendPrinterAction(this.printer.id, ACK_ALERT_NOT_FAILED)\n        }\n      })\n\n      ev.preventDefault()\n    },\n    onWatchForFailuresToggled() {\n      // FIXME: fix on printer page update (when better desktop experience will be introduced)\n      // eslint-disable-next-line vue/no-mutating-props\n      this.printer.watching_enabled = !this.printer.watching_enabled\n      this.updatePrinter(this.printer)\n    },\n    onPauseOnFailureToggled() {\n      // FIXME: fix on printer page update (when better desktop experience will be introduced)\n      // eslint-disable-next-line vue/no-mutating-props\n      this.printer.action_on_failure = this.printer.action_on_failure == 'PAUSE' ? 'NONE' : 'PAUSE'\n      this.updatePrinter(this.printer)\n    },\n\n    onTempEditClicked(key, item) {\n      let tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n      let presets\n      let maxTemp = 350\n\n      if (key.search(/bed|chamber/) > -1) {\n        maxTemp = 140\n      }\n      if (key.search(/tool/) > -1) {\n        // OctoPrint uses 'extruder' for toolx heaters\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v['extruder'] }\n        })\n      } else {\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v[key] }\n        })\n      }\n\n      this.$swal\n        .openModalWithComponent(\n          TempTargetEditor,\n          {\n            presets: presets,\n            maxTemp: maxTemp,\n            curTarget: item.target,\n          },\n          {\n            title: 'Set ' + temperatureDisplayName(key) + ' Temperature',\n            confirmButtonText: 'Confirm',\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                target: parseInt(document.getElementById('target-temp').value),\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value) {\n            let targetTemp = result.value.target\n            this.printerComm.passThruToPrinter({\n              func: 'set_temperature',\n              target: '_printer',\n              args: [key, targetTemp],\n            })\n          }\n        })\n    },\n\n    updatePrinter(printer) {\n      return axios\n        .patch(urls.printer(printer.id), {\n          watching_enabled: printer.watching_enabled,\n          action_on_failure: printer.action_on_failure,\n        })\n        .then((response) => {\n          if (response.data.succeeded) {\n            this.$emit('PrinterUpdated', normalizedPrinter(response.data.printer, this.printer))\n          } else {\n            throw response\n          }\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Failed to update printer')}`)\n        })\n    },\n\n    sendPrinterAction(printerId, path) {\n      axios.post(urls.printerAction(printerId, path))\n    },\n\n    shouldVideoBeFull(printer) {\n      let hasImage = get(printer, 'pic.img_url')\n      let shouldBeThumb = printer.alertUnacknowledged() && hasImage\n      return !shouldBeThumb\n    },\n\n    toDuration(seconds, isActive) {\n      if (seconds == null || seconds == 0) {\n        return {\n          valid: false,\n          printing: Boolean(isActive),\n        }\n      } else {\n        var d = moment.duration(seconds, 'seconds')\n        var h = Math.floor(d.asHours())\n        var m = d.minutes()\n        var s = d.seconds()\n        return {\n          valid: true,\n          printing: Boolean(isActive),\n          hours: h,\n          showHours: h > 0,\n          minutes: m,\n          showMinutes: h > 0 || m > 0,\n          seconds: s,\n          showSeconds: h == 0 && m == 0,\n        }\n      }\n    },\n\n    onSharePrinter() {\n      this.$swal.openModalWithComponent(\n        SharePrinter,\n        {\n          isProAccount: this.isProAccount,\n          printer: this.printer,\n        },\n        {\n          confirmButtonText: 'Close',\n        }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.webcamBackground\n    position: relative\n    background: #000\n\n.card\n  border-radius: var(--border-radius-lg)\n  overflow: hidden\n\n  .setting-item\n    border-bottom: none !important\n\n.menu-icon\n  width: 20px\n  height: 20px\n  margin-right: 6px\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterCard.vue?vue&type=template&id=44dc68ea&scoped=true&\"\nimport script from \"./PrinterCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterCard.vue?vue&type=style&index=0&id=44dc68ea&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"44dc68ea\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Detection Hours -->\n        <a\n          v-if=\"isEnt\"\n          href=\"/user_preferences/dh/\"\n          class=\"btn shadow-none action-btn icon-btn hours-btn\"\n          :style=\"{ marginRight: `${String(dhBadgeNum).length * 0.25}rem` }\"\n          :title=\"dhBadgeNum + ' ' + $t('AI Detection Hours')\"\n        >\n          <svg class=\"custom-svg-icon\">\n            <use href=\"#svg-hour-glass\"></use>\n          </svg>\n          <span id=\"user-credits\" class=\"badge badge-light\">{{ dhBadgeNum }}</span>\n          <span class=\"sr-only\">{{ $t(\"AI Detection Hours\") }}</span>\n        </a>\n        <!-- Sorting -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\" title=\"Sort By\">\n          <template #button-content>\n            <i class=\"fas fa-sort-amount-down\"></i>\n          </template>\n          <sorting-dropdown\n            :local-storage-prefix=\"sortingLocalStoragePrefix\"\n            :sorting-options=\"sortingOptions\"\n            :sorting-value=\"sortingValue\"\n            @onSortingUpdated=\"onSortingUpdated\"\n          />\n        </b-dropdown>\n        <!-- Filtering -->\n        <b-dropdown\n          right\n          no-caret\n          toggle-class=\"action-btn icon-btn\"\n          menu-class=\"scrollable\"\n          title=\"Filter\"\n        >\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <filtering-dropdown\n            :local-storage-prefix=\"filterLocalStoragePrefix\"\n            :filter-options=\"filterOptions\"\n            :filter-values=\"filterValues\"\n            @onFilterUpdated=\"onFilterUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown ref=\"cascadedDropdown\" :menu-options=\"mobileMenuOptions\">\n            <template #sorting>\n              <sorting-dropdown\n                :local-storage-prefix=\"sortingLocalStoragePrefix\"\n                :sorting-options=\"sortingOptions\"\n                :sorting-value=\"sortingValue\"\n                @onSortingUpdated=\"onSortingUpdated\"\n              />\n            </template>\n            <template #filtering>\n              <filtering-dropdown\n                :local-storage-prefix=\"filterLocalStoragePrefix\"\n                :filter-options=\"filterOptions\"\n                :filter-values=\"filterValues\"\n                @onFilterUpdated=\"onFilterUpdated\"\n              />\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <active-filter-notice :filter-values=\"filterValues\" @onShowAllClicked=\"resetFilters\" />\n\n      <!-- Printers list -->\n      <b-container class=\"printer-list-page\">\n        <b-row v-if=\"loading\">\n          <b-col class=\"text-center\">\n            <b-spinner class=\"my-5\" label=\"Loading...\"></b-spinner>\n          </b-col>\n        </b-row>\n        <b-row v-if=\"visiblePrinters.length\" class=\"printer-cards justify-content-center\">\n          <printer-card\n            v-for=\"printer in visiblePrinters\"\n            :key=\"printer.id\"\n            :printer=\"printer\"\n            :is-pro-account=\"user.is_pro\"\n            class=\"printer-card-wrapper\"\n            @PrinterUpdated=\"onPrinterUpdated\"\n          ></printer-card>\n        </b-row>\n        <div v-if=\"!loading\" class=\"row justify-content-center\">\n          <div id=\"new-printer\" class=\"col-sm-12 col-lg-6\">\n            <div class=\"new-printer-container\">\n              <a href=\"/printers/wizard/\">\n                <svg class=\"icon\">\n                  <use href=\"#svg-add-printer\"></use>\n                </svg>\n                <div>{{ $t(\"Link New Printer\") }}</div>\n              </a>\n            </div>\n          </div>\n        </div>\n        <b-row v-if=\"!loading\" v-show=\"shouldShowArchiveWarning\" class=\"bottom-messages\">\n          <b-col>\n            <div class=\"alert alert-warning alert-dismissible fade show mb-3\" role=\"alert\">\n              <div class=\"warning\">\n                <div>\n                  {{ archivedPrinterNum }} {{ 'printer' | pluralize(archivedPrinterNum) }} {{ $t(\"have been archived.\") }}\n                </div>\n                <div>\n                  <a href=\"/ent/printers/archived/\" class=\"warning-action\"\n                    >{{ $t(\"Show Archived Printers\") }}</a\n                  >\n                  <a class=\"warning-action\" @click=\"handleNeverShowAgain\">{{ $t(\"Never Show Again\") }}</a>\n                </div>\n              </div>\n              <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">\n                <span aria-hidden=\"true\">&times;</span>\n              </button>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport sortBy from 'lodash/sortBy'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport urls from '@config/server-urls'\nimport PrinterCard from '@src/components/printers/PrinterCard.vue'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport SortingDropdown, { restoreSortingValue } from '@src/components/SortingDropdown'\nimport FilteringDropdown, { restoreFilterValues } from '@src/components/FilteringDropdown'\nimport { user, settings } from '@src/lib/page-context'\nimport ActiveFilterNotice from '@src/components/ActiveFilterNotice'\nimport i18n from '@src/i18n/i18n.js'\n\nconst SortingLocalStoragePrefix = 'printersSorting'\nconst SortingOptions = {\n  options: [\n    { title: `${i18n.t('Name')}`, key: 'name' },\n    { title: `${i18n.t('Created at')}`, key: 'created_at' },\n  ],\n  default: { sorting: 'created_at', direction: 'desc' },\n}\n\nconst FilterLocalStoragePrefix = 'printersFiltering'\nconst FilterOptions = {\n  status: {\n    title: `${i18n.t('Print Status')}`,\n    queryParam: 'status',\n    values: [\n      { key: 'none', title: `${i18n.t('All Printers')}` },\n      { key: 'online', title: `${i18n.t('Online Printers')}` },\n      { key: 'active', title: `${i18n.t('Active Printers')}` },\n    ],\n    default: 'none',\n  },\n}\n\nexport default {\n  name: 'PrinterListPage',\n\n  components: {\n    PrinterCard,\n    PageLayout,\n    CascadedDropdown,\n    SortingDropdown,\n    FilteringDropdown,\n    ActiveFilterNotice,\n  },\n\n  data: function () {\n    return {\n      user: null,\n      printers: [],\n      loading: true,\n      isEnt: false,\n      archivedPrinterNum: 0,\n      shouldShowArchiveWarning: false,\n\n      // Sorting\n      sortingLocalStoragePrefix: SortingLocalStoragePrefix,\n      sortingOptions: SortingOptions,\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n\n      // Filtering\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n    }\n  },\n\n  computed: {\n    dhBadgeNum() {\n      if (this.user && this.user.is_dh_unlimited) {\n        return '\\u221E'\n      } else {\n        return Math.round(this.user.dh_balance)\n      }\n    },\n    mobileMenuOptions() {\n      const options = [\n        {\n          key: 'sorting',\n          icon: 'fas fa-sort-amount-down',\n          title: `${this.$i18next.t(`Sort`)}`,\n          expandable: true,\n        },\n        {\n          key: 'filtering',\n          icon: 'fas fa-filter',\n          title: `${this.$i18next.t(`Filter`)}`,\n          expandable: true,\n        },\n      ]\n\n      if (this.isEnt) {\n        options.unshift({\n          key: 'dh',\n          svgIcon: 'svg-hour-glass',\n          title: `${this.$i18next.t(`{name} AI Detection Hours`,{name:this.dhBadgeNum})}`,\n          href: '/user_preferences/dh/',\n        })\n      }\n\n      return options\n    },\n\n    visiblePrinters() {\n      let printers = this.printers\n      switch (this.filterValues.status) {\n        case 'online':\n          printers = printers.filter((p) => !p.isDisconnected())\n          break\n        case 'active':\n          printers = printers.filter((p) => p.isActive())\n          break\n        case 'none':\n          break\n      }\n\n      if (this.sortingValue.sorting.key === 'created_at') {\n        printers = sortBy(printers, (p) => p.createdAt())\n      } else if (this.sortingValue.sorting.key === 'name') {\n        printers = sortBy(printers, (p) => p.name)\n      }\n\n      if (this.sortingValue.direction.key === 'desc') {\n        printers.reverse()\n      }\n\n      return printers\n    },\n    hiddenPrinterCount() {\n      return this.printers.length - this.visiblePrinters.length\n    },\n  },\n\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.user = user()\n    this.fetchPrinters()\n  },\n\n  methods: {\n    fetchPrinters() {\n      this.loading = true\n      return axios\n        .get(urls.printers(), {\n          params: {\n            with_archived: true,\n          },\n        })\n        .then((response) => {\n          const printers = response.data\n          if (\n            getLocalPref('single-printer-redirect-enabled', true) &&\n            printers.length == 1 &&\n            !printers[0].archived_at\n          ) {\n            window.location.href = `/printers/${printers[0].id}/control/`\n            return\n          }\n\n          this.loading = false\n          response.data.forEach((p) => {\n            if (p.archived_at) {\n              this.archivedPrinterNum += 1\n            } else {\n              this.insertPrinter(normalizedPrinter(p))\n            }\n          })\n          this.shouldShowArchiveWarningFunc()\n        })\n    },\n    insertPrinter(printer) {\n      this.printers.push(printer)\n    },\n    onPrinterUpdated(printer) {\n      let index = this.printers.findIndex((p) => p.id == printer.id)\n      if (index < 0) {\n        // FIXME any alert here?\n        return\n      }\n\n      this.$set(this.printers, index, printer)\n    },\n    resetGcodesModal() {\n      this.selectedGcodeId = null\n      this.targetPrinter = null\n    },\n\n    // Sorting\n    onSortingUpdated(sortingValue) {\n      this.sortingValue = sortingValue\n    },\n\n    // Filtering\n    onFilterUpdated(filterOptionKey, filterOptionValue) {\n      this.filterValues[filterOptionKey] = filterOptionValue\n    },\n    resetFilters() {\n      for (const key of Object.keys(this.filterValues)) {\n        this.filterValues[key] = 'none'\n        setLocalPref(`${FilterLocalStoragePrefix}-${key}`, 'none')\n      }\n    },\n    handleNeverShowAgain() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        html: `<p style=\"text-align: center\">${this.$i18next.t(\"You can always view your archived printers in by navigating to the General tab within Preferences.\")}</p>`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          localStorage.setItem('shouldNeverShowArchived', JSON.stringify(true))\n          this.shouldShowArchiveWarning = false\n        }\n      })\n    },\n    shouldShowArchiveWarningFunc() {\n      const shouldNeverShow = localStorage.getItem('shouldNeverShowArchived')\n      if (JSON.parse(shouldNeverShow) === true) {\n        this.shouldShowArchiveWarning = false\n      } else {\n        this.shouldShowArchiveWarning = this.archivedPrinterNum > 0\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-list-page\n  .consider-upgrade\n    margin-bottom: var(--gap-between-blocks)\n\n  .printer-cards\n     margin-top: calc(var(--gap-between-blocks) * -1)\n\n  .printer-card-wrapper\n    margin-top: var(--gap-between-blocks)\n\n  .bottom-messages\n    margin-top: var(--gap-between-blocks)\n\n  .warning\n    display: flex\n    flex-direction: row\n    flex-wrap: wrap\n    justify-content: space-between\n    align-items: center\n\n    .warning-action\n      padding: 0.25em 0\n      margin-left: auto\n      margin: 0px 5px 0px 5px\n      cursor: pointer\n\n.btn.hours-btn\n  position: relative\n  color: var(--color-text-primary)\n\n  .badge\n    position: absolute\n    left: 18px\n    top: 4px\n    border-radius: var(--border-radius-sm)\n    background-color: var(--color-primary)\n    height: auto\n    font-size: .625rem\n\n.custom-svg-icon\n  height: 1.3rem\n  width: 1.3rem\n\n::v-deep .dropdown-item .clickable-area\n  margin: -0.25rem -1.5rem\n  padding: 0.25rem 1.5rem\n</style>\n\n<style lang=\"sass\">\ndiv[id^=b-modal-gcodes]\n  .modal-header\n    display: none\n  .modal-body\n    padding: 0\n  .modal-footer\n    display: none\n\n#new-printer\n  min-height: 25em\n  .new-printer-container\n    display: flex\n    flex-flow: column\n    align-items: center\n    justify-content: center\n    margin-top: 6em\n    a\n      text-align: center\n      border: thin dashed\n      color: var(--color-primary)\n      border-color: var(--color-primary)\n      padding: 4em 3em\n      border-radius: var(--border-radius-lg)\n      &:hover\n        text-decoration: none\n        background-color: var(--color-hover)\n    .icon\n      width: 2rem\n      height: 2rem\n      margin-bottom: 1rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterListPage.vue?vue&type=template&id=7f862148&scoped=true&\"\nimport script from \"./PrinterListPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterListPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterListPage.vue?vue&type=style&index=0&id=7f862148&prod&lang=sass&scoped=true&\"\nimport style1 from \"./PrinterListPage.vue?vue&type=style&index=1&id=7f862148&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7f862148\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('nav-bar',{attrs:{\"view-name\":\"printer_shared\"}}),_c('div',{staticClass:\"row justify-content-center\"},[(_vm.loading)?_c('b-spinner',{staticClass:\"mt-5\",attrs:{\"label\":\"Loading...\"}}):_vm._e(),(_vm.printer)?_c('div',{staticClass:\"col-sm-12 col-lg-6 printer-card\"},[_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-header\"},[_c('div',[_vm._v(_vm._s(_vm.printer.name))])]),(_vm.webcams.length || _vm.printer?.pic?.img_url)?_c('b-card-text',{staticClass:\"px-0 py-0 content d-inline-block\",staticStyle:{\"width\":\"100%\"}},[_c('b-row',[_c('b-col',{staticClass:\"pb-0\",staticStyle:{\"position\":\"relative\"}},[_c('b-container',{staticClass:\"p-0\",attrs:{\"fluid\":\"\"}},[_c('b-row',{attrs:{\"no-gutters\":\"\"}},[(_vm.webcams.length === 0 && _vm.printer?.pic?.img_url)?_c('b-col',{key:_vm.printer?.pic?.img_url,attrs:{\"cols\":12}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"autoplay\":true,\"stickyStreamingSrc\":'IMAGE'}})],1)]):_vm._e(),_vm._l((_vm.webcams),function(webcam,index){return _c('b-col',{key:index,attrs:{\"cols\":_vm.webcams.length > 1 ? 6 : 12}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"webrtc\":_vm.printerComm.webrtcConnections.get(webcam.name),\"autoplay\":true,\"webcam\":webcam}})],1)])})],2)],1)],1)],1)],1):_vm._e()],1),_c('div',{staticClass:\"p-3 p-md-5\"},[_c('p',{staticClass:\"text-center\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You are viewing an awesome 3D print your friend shared specifically with you on\"))+\" \")]),_c('a',{attrs:{\"href\":\"https://www.obico.io/\"}},[_c('svg',{staticClass:\"logo-img\",attrs:{\"width\":\"100%\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-full\"}})])]),_c('hr'),_c('br'),_c('br'),_c('p',{staticClass:\"text-center\"},[_vm._v(\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"lets you monitor and control your printer from anywhere, on your phone.\"))+\" \")]),_c('a',{staticClass:\"btn btn-block btn-primary\",attrs:{\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t(\"Sign up for a free {brandName} account\",{brandName:_vm.$syndicateText.brandName})))])])]):_vm._e()],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.inMobileWebView)?_c('b-navbar',{class:{\n      'navbar-dark': _vm.theme === _vm.themes.Dark,\n      'navbar-light': _vm.theme === _vm.themes.Light,\n    },attrs:{\"toggleable\":\"xl\"}},[_c('b-container',{staticClass:\"p-0\"},[_c('b-navbar-brand',{attrs:{\"href\":\"/\"}},[_c('SyndicateAwareSVG',{attrs:{\"href\":\"#svg-logo-compact\",\"width\":\"100\",\"height\":\"30\"}})],1),_c('b-navbar-toggle',{attrs:{\"target\":\"navbar-toggle-collapse\"}},[_c('span',{staticClass:\"navbar-toggler-icon\"})]),_c('b-collapse',{attrs:{\"id\":\"navbar-toggle-collapse\",\"is-nav\":\"\"},model:{value:(_vm.showMainMenu),callback:function ($$v) {_vm.showMainMenu=$$v},expression:\"showMainMenu\"}},[_c('b-navbar-nav',[(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('printers') },attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t(\"Printers\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('print_history') },attrs:{\"href\":\"/print_history/\"}},[_vm._v(_vm._s(_vm.$t(\"Print History\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('g_code_folders') },attrs:{\"href\":\"/g_code_folders/cloud/\"}},[_vm._v(_vm._s(_vm.$t(\"G-Codes\")))]):_vm._e(),(_vm.isEnt && !_vm.user)?_c('b-nav-item',{staticClass:\"glowing\",class:{ active: _vm.viewName === 'publictimelapse_list' },attrs:{\"href\":\"/ent_pub/publictimelapses/\"}},[_vm._v(_vm._s(_vm.$t(\"Spaghetti Gallery\")))]):_vm._e(),(_vm.isEnt)?_c('b-nav-item',{class:{ active: _vm.viewName === 'pricing' },attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Pricing\")))]):_vm._e(),_c('b-nav-item',{attrs:{\"href\":\"https://www.obico.io/help/\"}},[_vm._v(_vm._s(_vm.$t(\"Help\")))]),_c('b-nav-item',{attrs:{\"href\":\"https://obico.io/discord\"}},[_vm._v(_vm._s(_vm.$t(\"Community\")))])],1),_c('b-navbar-nav',{staticClass:\"ml-auto\"},[(!_vm.user)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/login/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN IN\")))]):_vm._e(),(!_vm.user && _vm.allowSignUp)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN UP\")))]):_vm._e(),(_vm.user)?_c('b-nav-item-dropdown',{ref:\"accountDropdown\",attrs:{\"right\":\"\",\"toggle-class\":\"user-menu\",\"text\":_vm.user.first_name || _vm.user.email}},[_c('b-dropdown-item',{attrs:{\"href\":\"/user_preferences/\"}},[_c('i',{staticClass:\"fas fa-cog mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Preferences\"))+\" \")]),_c('b-dropdown-divider'),_c('b-dropdown-item',{attrs:{\"href\":\"/accounts/logout/\"}},[_c('i',{staticClass:\"fas fa-sign-out-alt mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Log out\"))+\" \")])],1):_vm._e()],1)],1)],1)],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <b-navbar\n      v-if=\"!inMobileWebView\"\n      toggleable=\"xl\"\n      :class=\"{\n        'navbar-dark': theme === themes.Dark,\n        'navbar-light': theme === themes.Light,\n      }\"\n    >\n      <b-container class=\"p-0\">\n        <b-navbar-brand href=\"/\">\n          <SyndicateAwareSVG href=\"#svg-logo-compact\" width=\"100\" height=\"30\" />\n        </b-navbar-brand>\n\n        <b-navbar-toggle target=\"navbar-toggle-collapse\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </b-navbar-toggle>\n\n        <b-collapse id=\"navbar-toggle-collapse\" v-model=\"showMainMenu\" is-nav>\n          <b-navbar-nav>\n            <b-nav-item\n              v-if=\"user\"\n              href=\"/printers/\"\n              :class=\"{ active: viewName.includes('printers') }\"\n              >{{ $t(\"Printers\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"/print_history/\"\n              :class=\"{ active: viewName.includes('print_history') }\"\n              >{{ $t(\"Print History\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"/g_code_folders/cloud/\"\n              :class=\"{ active: viewName.includes('g_code_folders') }\"\n              >{{ $t(\"G-Codes\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"isEnt && !user\"\n              href=\"/ent_pub/publictimelapses/\"\n              :class=\"{ active: viewName === 'publictimelapse_list' }\"\n              class=\"glowing\"\n              >{{ $t(\"Spaghetti Gallery\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"isEnt\"\n              href=\"/ent_pub/pricing/\"\n              :class=\"{ active: viewName === 'pricing' }\"\n              >{{ $t(\"Pricing\") }}</b-nav-item\n            >\n            <b-nav-item href=\"https://www.obico.io/help/\">{{ $t(\"Help\") }}</b-nav-item>\n            <b-nav-item href=\"https://obico.io/discord\">{{ $t(\"Community\") }}</b-nav-item>\n          </b-navbar-nav>\n\n          <b-navbar-nav class=\"ml-auto\">\n            <b-nav-item v-if=\"!user\" href=\"/accounts/login/\">{{ $t(\"SIGN IN\") }}</b-nav-item>\n            <b-nav-item v-if=\"!user && allowSignUp\" href=\"/accounts/signup/\">{{ $t(\"SIGN UP\") }}</b-nav-item>\n            <b-nav-item-dropdown\n              v-if=\"user\"\n              ref=\"accountDropdown\"\n              right\n              toggle-class=\"user-menu\"\n              :text=\"user.first_name || user.email\"\n            >\n              <b-dropdown-item href=\"/user_preferences/\">\n                <i class=\"fas fa-cog mr-2\"></i>{{$t(\"Preferences\")}}\n              </b-dropdown-item>\n              <b-dropdown-divider></b-dropdown-divider>\n              <b-dropdown-item href=\"/accounts/logout/\">\n                <i class=\"fas fa-sign-out-alt mr-2\"></i>{{$t(\"Log out\")}}\n              </b-dropdown-item>\n            </b-nav-item-dropdown>\n          </b-navbar-nav>\n        </b-collapse>\n      </b-container>\n    </b-navbar>\n  </div>\n</template>\n\n<script>\nimport { inMobileWebView, user, settings } from '@src/lib/page-context'\nimport { Themes } from '@static/js/color-scheme'\nimport { currentThemeValue } from '@src/lib/color-scheme-controller'\n\nexport default {\n  name: 'NavBar',\n\n  components: {},\n\n  props: {\n    viewName: {\n      default() {\n        return ''\n      },\n      type: String,\n    },\n  },\n\n  data() {\n    return {\n      user: null,\n      allowSignUp: false,\n      isEnt: false,\n      themes: Themes,\n      showMainMenu: false,\n    }\n  },\n\n  computed: {\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n\n    theme() {\n      return currentThemeValue()\n    },\n  },\n\n  created() {\n    const { ACCOUNT_ALLOW_SIGN_UP, IS_ENT } = settings()\n    this.allowSignUp = !!ACCOUNT_ALLOW_SIGN_UP\n    this.isEnt = !!IS_ENT\n    this.user = user()\n  },\n\n  methods: {\n    hideDropdowns() {\n      this.showMainMenu = false\n\n      // Check account dropdown (preferences and logout)\n      const accountDropdown = this.$refs.accountDropdown\n      if (accountDropdown) {\n        accountDropdown.hide()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n::v-deep .navbar\n  padding: 0.5rem 1rem\n\n  a.navbar-brand\n    margin-top: -3px\n\n  .navbar-toggler\n    color: var(--color-text-primary)\n\n  .nav-item\n    text-transform: uppercase\n\n  .user-menu\n    text-transform: none\n\n  .badge-btn\n    position: relative\n    height: 1.8rem\n    margin-right: 1.5em\n\n    img\n      height: 1.3rem\n\n    .badge\n      position: absolute\n      left: 22px\n      top: 1px\n      height: 18px\n      border-radius: 4px\n      transition: transform 0.2s\n\n      /* Animation */\n      &:hover\n        transform: scale(1.3)\n\n  @media (min-width: 1200px)\n    padding: 0rem 1rem\n\n    .nav-item\n      padding: 0.5rem 0.24rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NavBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NavBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NavBar.vue?vue&type=template&id=649a7c88&scoped=true&\"\nimport script from \"./NavBar.vue?vue&type=script&lang=js&\"\nexport * from \"./NavBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NavBar.vue?vue&type=style&index=0&id=649a7c88&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"649a7c88\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <nav-bar view-name=\"printer_shared\"></nav-bar>\n\n    <div class=\"row justify-content-center\">\n      <b-spinner v-if=\"loading\" class=\"mt-5\" label=\"Loading...\"></b-spinner>\n      <div v-if=\"printer\" class=\"col-sm-12 col-lg-6 printer-card\">\n        <div class=\"card\">\n          <div class=\"card-header\">\n            <div>{{ printer.name }}</div>\n          </div>\n\n        <b-card-text v-if=\"webcams.length || printer?.pic?.img_url\" class=\"px-0 py-0 content d-inline-block\" style=\"width: 100%;\">\n            <b-row>\n                <b-col class=\"pb-0\" style=\"position: relative\">\n                  <b-container fluid class=\"p-0\">\n                    <b-row no-gutters>\n                      <b-col v-if=\"webcams.length === 0 && printer?.pic?.img_url\" :key=\"printer?.pic?.img_url\" :cols=\"12\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :autoplay=\"true\"\n                            :stickyStreamingSrc=\"'IMAGE'\"\n                          />\n                        </div>\n                      </b-col>\n                      <b-col v-for=\"(webcam, index) in webcams\" :key=\"index\" :cols=\"webcams.length > 1 ? 6 : 12\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :webrtc=\"printerComm.webrtcConnections.get(webcam.name)\"\n                            :autoplay=\"true\"\n                            :webcam=\"webcam\"\n                          />\n                        </div>\n                      </b-col>\n                    </b-row>\n                  </b-container>\n              </b-col>\n            </b-row>\n        </b-card-text>\n          </div>\n          <div class=\"p-3 p-md-5\">\n            <p class=\"text-center\">\n              {{$t(\"You are viewing an awesome 3D print your friend shared specifically with you on\")}}\n            </p>\n            <a href=\"https://www.obico.io/\">\n              <svg width=\"100%\" class=\"logo-img\">\n                <use href=\"#svg-logo-full\" />\n              </svg>\n            </a>\n            <hr />\n            <br /><br />\n            <p class=\"text-center\">\n              {{ $syndicateText.brandName }} {{$t(\"lets you monitor and control your printer from anywhere, on your phone.\")}}\n            </p>\n            <a class=\"btn btn-block btn-primary\" href=\"/accounts/signup/\"\n              >{{ $t(\"Sign up for a free {brandName} account\",{brandName:$syndicateText.brandName}) }}</a\n            >\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport split from 'lodash/split'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport urls from '@config/server-urls'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport WebRTCConnection from '@src/lib/webrtc'\nimport StreamingBox from '@src/components/StreamingBox'\nimport NavBar from '@src/components/NavBar.vue'\nexport default {\n  name: 'SharedPrinterPage',\n  components: {\n    StreamingBox,\n    NavBar,\n  },\n  data: function () {\n    return {\n      printer: null,\n      shareToken: null,\n      videoAvailable: {},\n      loading: true,\n      webcams: [],\n      isWebrtcOpened: false,\n    }\n  },\n  created() {\n    this.shareToken = split(window.location.pathname, '/').slice(-2, -1).pop()\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.shareToken,\n      urls.printerSharedWebSocket(this.shareToken),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.printer = normalizedPrinter(data, this.printer)\n          this.loading = false\n          if ((this.printer?.settings?.webcams || []).length > 0) {\n            const webcamsDeepCopy = JSON.parse(JSON.stringify(this.printer?.settings?.webcams)) // Probably a good idea to deep copy as we will change the objects and keep them around\n            for (const webcam of webcamsDeepCopy) {\n              if (this.printerComm.webrtcConnections.has(webcam.name)) {\n                  continue;\n              }\n              this.webcams.push(webcam)\n              const webrtc = WebRTCConnection(webcam.stream_mode, webcam.stream_id)\n              this.printerComm.setWebRTCConnection(webcam.name, webrtc);\n              // Has to be called after this.webcams.push(webcam) otherwise the callbacks won't be established properly.\n              webrtc.openForShareToken(this.shareToken)\n            }\n          }\n       },\n      }\n    )\n    this.printerComm.connect()\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.webcamBackground\n    position: relative\n    background: #000\n\n#printer-list-page\n  margin-top: 1.5rem\n.printer-card\n  margin-bottom: 1.25rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharedPrinterPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharedPrinterPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SharedPrinterPage.vue?vue&type=template&id=36e7a07b&scoped=true&\"\nimport script from \"./SharedPrinterPage.vue?vue&type=script&lang=js&\"\nexport * from \"./SharedPrinterPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SharedPrinterPage.vue?vue&type=style&index=0&id=36e7a07b&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"36e7a07b\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',{attrs:{\"lg\":\"8\"}},[(!_vm.printer)?_c('loading-placeholder'):_c('div',{staticClass:\"surface with-loading-animation full-on-mobile\"},[_c('section',{staticClass:\"settings\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Settings\")))]),_c('div',{staticClass:\"form-group mb-4 mt-4\"},[_c('div',{staticClass:\"form-label text-muted mb-2\"},[_vm._v(_vm._s(_vm.$t(\"Give your shiny new printer a name\")))]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.name,\"saving\":_vm.saving.name}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.name),expression:\"printer.name\"}],staticClass:\"form-control field_required\",attrs:{\"id\":\"id_name\",\"type\":\"text\",\"name\":\"name\",\"maxlength\":\"200\",\"placeholder\":\"\",\"required\":\"required\"},domProps:{\"value\":(_vm.printer.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.printer, \"name\", $event.target.value)}}})])],1),_c('div',{staticClass:\"failure-notification\"},[_c('div',{staticClass:\"form-group mt-4 mb-4\"},[_c('div',{staticClass:\"form-label text-muted\"},[_vm._v(_vm._s(_vm.$t(\"When a potential failure is detected\"))+\":\")]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.action_on_failure_NONE,\"saving\":_vm.saving.action_on_failure_NONE}},[_c('div',{staticClass:\"custom-control custom-radio mt-1 radio\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.action_on_failure),expression:\"printer.action_on_failure\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":\"id_action_on_failure_0\",\"type\":\"radio\",\"name\":\"action_on_failure\",\"value\":\"NONE\"},domProps:{\"checked\":_vm._q(_vm.printer.action_on_failure,\"NONE\")},on:{\"change\":[function($event){return _vm.$set(_vm.printer, \"action_on_failure\", \"NONE\")},function($event){return _vm.updateSetting('action_on_failure')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_action_on_failure_0\"}},[_vm._v(_vm._s(_vm.$t(\"Just notify me\")))])])]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.action_on_failure_PAUSE,\"saving\":_vm.saving.action_on_failure_PAUSE}},[_c('div',{staticClass:\"custom-control custom-radio mt-1 radio\",attrs:{\"id\":\"action_on_failure_PAUSE\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.action_on_failure),expression:\"printer.action_on_failure\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":\"id_action_on_failure_1\",\"type\":\"radio\",\"name\":\"action_on_failure\",\"value\":\"PAUSE\"},domProps:{\"checked\":_vm._q(_vm.printer.action_on_failure,\"PAUSE\")},on:{\"change\":[function($event){return _vm.$set(_vm.printer, \"action_on_failure\", \"PAUSE\")},function($event){return _vm.updateSetting('action_on_failure')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_action_on_failure_1\"}},[_vm._v(_vm._s(_vm.$t(\"Pause the printer and notify me\")))])])])],1)])]),_c('section',{staticClass:\"mt-5\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Failure Detection\")))]),_c('div',{staticClass:\"card-body p-0 pt-3\"},[_c('p',{staticClass:\"text-warning\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"If you are not sure about the settings below, leave the default values to minimize surprises.\"))+\" \")]),_c('div',{staticClass:\"form-group mt-4\"},[_c('div',{staticClass:\"form-label text-muted\"},[_vm._v(_vm._s(_vm.$t(\"When print is paused,\")))]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.tools_off_on_pause,\"saving\":_vm.saving.tools_off_on_pause}},[_c('div',{staticClass:\"custom-control custom-checkbox mt-2 checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.tools_off_on_pause),expression:\"printer.tools_off_on_pause\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"id_tools_off_on_pause\",\"type\":\"checkbox\",\"name\":\"tools_off_on_pause\"},domProps:{\"checked\":Array.isArray(_vm.printer.tools_off_on_pause)?_vm._i(_vm.printer.tools_off_on_pause,null)>-1:(_vm.printer.tools_off_on_pause)},on:{\"change\":[function($event){var $$a=_vm.printer.tools_off_on_pause,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.printer, \"tools_off_on_pause\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.printer, \"tools_off_on_pause\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.printer, \"tools_off_on_pause\", $$c)}},function($event){return _vm.updateSetting('tools_off_on_pause')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_tools_off_on_pause\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Turn off hotend heater(s)\"))+\" \")])])]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.bed_off_on_pause,\"saving\":_vm.saving.bed_off_on_pause}},[_c('div',{staticClass:\"custom-control custom-checkbox mt-2 checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.bed_off_on_pause),expression:\"printer.bed_off_on_pause\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"id_bed_off_on_pause\",\"type\":\"checkbox\",\"name\":\"bed_off_on_pause\"},domProps:{\"checked\":Array.isArray(_vm.printer.bed_off_on_pause)?_vm._i(_vm.printer.bed_off_on_pause,null)>-1:(_vm.printer.bed_off_on_pause)},on:{\"change\":[function($event){var $$a=_vm.printer.bed_off_on_pause,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.printer, \"bed_off_on_pause\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.printer, \"bed_off_on_pause\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.printer, \"bed_off_on_pause\", $$c)}},function($event){return _vm.updateSetting('bed_off_on_pause')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_bed_off_on_pause\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Turn off bed heater\"))+\" \")])])]),_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.retract_on_pause,\"saving\":_vm.saving.retract_on_pause}},[_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.retractFilamentByEnabled),expression:\"retractFilamentByEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"retract-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.retractFilamentByEnabled)?_vm._i(_vm.retractFilamentByEnabled,null)>-1:(_vm.retractFilamentByEnabled)},on:{\"change\":function($event){var $$a=_vm.retractFilamentByEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.retractFilamentByEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.retractFilamentByEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.retractFilamentByEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"retract-checkbox\"}},[_vm._v(_vm._s(_vm.$t(\"Retract filament by\")))])]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":0.5,\"disable\":!_vm.retractFilamentByEnabled},model:{value:(_vm.retractOnPause),callback:function ($$v) {_vm.retractOnPause=$$v},expression:\"retractOnPause\"}})],1)]),_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.lift_z_on_pause,\"saving\":_vm.saving.lift_z_on_pause}},[_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.liftExtruderByEnabled),expression:\"liftExtruderByEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"lift-z-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.liftExtruderByEnabled)?_vm._i(_vm.liftExtruderByEnabled,null)>-1:(_vm.liftExtruderByEnabled)},on:{\"change\":function($event){var $$a=_vm.liftExtruderByEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.liftExtruderByEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.liftExtruderByEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.liftExtruderByEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"lift-z-checkbox\"}},[_vm._v(_vm._s(_vm.$t(\"Lift extruder along Z axis by\")))])]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":0.5,\"disable\":!_vm.liftExtruderByEnabled},model:{value:(_vm.liftExtruderBy),callback:function ($$v) {_vm.liftExtruderBy=$$v},expression:\"liftExtruderBy\"}})],1)])],1),_c('div',{staticClass:\"form-group sensitivity my-4\"},[_c('div',{staticClass:\"form-label text-muted\"},[_vm._v(_vm._s(_vm.$t(\"AI failure detection sensitivity\")))]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.detective_sensitivity,\"saving\":_vm.saving.detective_sensitivity}},[_c('div',{staticClass:\"my-2 sensitivity-slider\"},[_c('vue-slider',{attrs:{\"lazy\":true,\"min\":0.8,\"max\":1.2,\"interval\":0.05,\"tooltip-formatter\":_vm.sensitivityTooltipFormatter},model:{value:(_vm.detectiveSensitivity),callback:function ($$v) {_vm.detectiveSensitivity=$$v},expression:\"detectiveSensitivity\"}})],1)]),(_vm.sensitivityTooltipFormatter(_vm.printer.detective_sensitivity) === 'Low')?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Low - I don't want a lot of false alarms. Only alert me when you are absolutely sure.\"))+\" \")]):(\n                      _vm.sensitivityTooltipFormatter(_vm.printer.detective_sensitivity) === 'Medium'\n                    )?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Medium - A few false alarms won't bother me. But some well-disguised spaghetti will be missed.\"))+\" \")]):_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"High - Hit me with all the false alarms. I want to catch as many failures as possible.\"))+\" \")])],1)])]),_c('section',{staticClass:\"mt-5\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Time-lapse\")))]),(!(_vm.timelapseOnFinishEnabled && _vm.timelapseOnCancelEnabled))?_c('p',{staticClass:\"text-warning\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_c('i18next',{attrs:{\"translation\":_vm.$t(`Focused Feedback won't be available when time-lapse recording is turned off. You won't be able to {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"help us get better while earning AI Detection Hours for yourself\")))])]},proxy:true}],null,false,2529399454)})],1):_vm._e(),_c('div',{staticClass:\"form-group mt-4\"},[_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.min_timelapse_secs_on_finish,\"saving\":_vm.saving.min_timelapse_secs_on_finish}},[_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.timelapseOnFinishEnabled),expression:\"timelapseOnFinishEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"timelapseOnFinishEnabled\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.timelapseOnFinishEnabled)?_vm._i(_vm.timelapseOnFinishEnabled,null)>-1:(_vm.timelapseOnFinishEnabled)},on:{\"change\":function($event){var $$a=_vm.timelapseOnFinishEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.timelapseOnFinishEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.timelapseOnFinishEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.timelapseOnFinishEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"timelapseOnFinishEnabled\"}},[_vm._v(_vm._s(_vm.$t(\"Record time-lapse when a print finishes successfully.\")))])])]),(_vm.timelapseOnFinishEnabled)?_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Skip if the print is finished in less than\"))+\" \")]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":5,\"unit\":\"minutes\"},model:{value:(_vm.minTimelapseMinutesOnFinish),callback:function ($$v) {_vm.minTimelapseMinutesOnFinish=$$v},expression:\"minTimelapseMinutesOnFinish\"}})],1):_vm._e()]),_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.min_timelapse_secs_on_cancel,\"saving\":_vm.saving.min_timelapse_secs_on_cancel}},[_c('div',{staticClass:\"form-inline mt-3 mb-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.timelapseOnCancelEnabled),expression:\"timelapseOnCancelEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"timelapseOnCancelEnabled\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.timelapseOnCancelEnabled)?_vm._i(_vm.timelapseOnCancelEnabled,null)>-1:(_vm.timelapseOnCancelEnabled)},on:{\"change\":function($event){var $$a=_vm.timelapseOnCancelEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.timelapseOnCancelEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.timelapseOnCancelEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.timelapseOnCancelEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"timelapseOnCancelEnabled\"}},[_vm._v(_vm._s(_vm.$t(\"Record time-lapse when a print is cancelled.\")))])])]),(_vm.timelapseOnCancelEnabled)?_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Skip if the print is cancelled in less than\"))+\" \")]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":5,\"unit\":\"minutes\"},model:{value:(_vm.minTimelapseMinutesOnCancel),callback:function ($$v) {_vm.minTimelapseMinutesOnCancel=$$v},expression:\"minTimelapseMinutesOnCancel\"}})],1):_vm._e()])],1)]),_c('section',{staticClass:\"danger mt-5\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Danger Zone\")))]),_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-outline-secondary\",attrs:{\"href\":_vm.printerWizardUrl}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Re-Link Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted mt-1\"},[_c('small',[_c('i18next',{attrs:{\"translation\":_vm.$t(`If your printer is always showing as 'offline', and you have gone through {localizedDom}, you can try to re-link printer as the last resort.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/troubleshoot-server-connection-issues/')}},[_vm._v(_vm._s(_vm.$t(\"all the trouble-shooting steps\")))])]},proxy:true}])})],1)])]),(_vm.isEnt)?_c('div',{staticClass:\"mt-4\"},[_c('button',{staticClass:\"btn btn-outline-warning\",on:{\"click\":_vm.archivePrinter}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Archive Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted mt-1\"},[_c('small',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Archived printers are not counted toward your subscription plan. You won't see them in the app either. Go to {localizedDom} to find all archived printers and/or un-archive them.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/ent/printers/archived/\"}},[_vm._v(_vm._s(_vm.$t(\"this page\")))])]},proxy:true}],null,false,2102701858)})],1)])]):_vm._e(),_c('div',{staticClass:\"mt-4\"},[_c('button',{staticClass:\"btn btn-outline-danger\",on:{\"click\":_vm.deletePrinter}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Delete Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted mt-1\"},[_c('small',[_vm._v(_vm._s(_vm.$t(\"Bye-bye printer.\")))])])])])])],1)],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group input-group-sm input-wrapper\"},[_c('div',{staticClass:\"input-group-prepend\"},[_c('button',{staticClass:\"btn btn-outline-secondary control-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.disable},on:{\"click\":function($event){_vm.inputValue = _vm.inputValue > 0 ? Math.round((_vm.inputValue - _vm.step) * 10) / 10 : 0\n        _vm.$emit('input', _vm.inputValue)}}},[_vm._v(\" ↓ \")])]),_c('input',{staticClass:\"form-control text-center field_required\",style:({ opacity: _vm.disable ? 0.3 : 1 }),attrs:{\"type\":\"text\",\"disabled\":\"\",\"aria-describedby\":\"basic-addon1\"},domProps:{\"value\":_vm.inputValue + ' ' + _vm.unit}}),_c('div',{staticClass:\"input-group-append\"},[_c('button',{staticClass:\"btn btn-outline-secondary control-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.disable},on:{\"click\":function($event){_vm.inputValue = Math.round((_vm.inputValue + _vm.step) * 10) / 10\n        _vm.$emit('input', _vm.inputValue)}}},[_vm._v(\" ↑ \")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"input-group input-group-sm input-wrapper\">\n    <div class=\"input-group-prepend\">\n      <button\n        class=\"btn btn-outline-secondary control-button\"\n        type=\"button\"\n        :disabled=\"disable\"\n        @click=\"\n          inputValue = inputValue > 0 ? Math.round((inputValue - step) * 10) / 10 : 0\n          $emit('input', inputValue)\n        \"\n      >\n        ↓\n      </button>\n    </div>\n    <input\n      type=\"text\"\n      class=\"form-control text-center field_required\"\n      disabled\n      aria-describedby=\"basic-addon1\"\n      :value=\"inputValue + ' ' + unit\"\n      :style=\"{ opacity: disable ? 0.3 : 1 }\"\n    />\n    <div class=\"input-group-append\">\n      <button\n        class=\"btn btn-outline-secondary control-button\"\n        type=\"button\"\n        :disabled=\"disable\"\n        @click=\"\n          inputValue = Math.round((inputValue + step) * 10) / 10\n          $emit('input', inputValue)\n        \"\n      >\n        ↑\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'NumberInput',\n\n  props: {\n    value: {\n      type: Number,\n      default: 0,\n    },\n    step: {\n      type: Number,\n      default: 0.5,\n    },\n    disable: {\n      type: Boolean,\n      default: false,\n    },\n    unit: {\n      type: String,\n      default: 'mm',\n    },\n  },\n\n  data() {\n    return {\n      inputValue: this.value,\n    }\n  },\n\n  watch: {\n    value(newValue) {\n      this.inputValue = newValue\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-group.input-wrapper\n  border-radius: var(--border-radius-sm)\n  overflow: hidden\n  border: 1px solid var(--color-divider)\n\n  .control-button\n    border: none\n\n  .btn-outline-secondary\n    background-color: var(--color-input-background)\n\n    &:hover, &:focus, &:active\n      color: var(--color-text-primary)\n      background-color: var(--color-input-background)\n      opacity: .8\n      outline: none\n      box-shadow: none !important\n      border: none\n\n\n  input.form-control\n    background-color: var(--color-input-background)\n    color: var(--color-text-primary)\n    width: 6rem\n    border: none\n    border-left: 2px solid var(--color-divider)\n    border-right: 2px solid var(--color-divider)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NumberInput.vue?vue&type=template&id=0f88dca4&scoped=true&\"\nimport script from \"./NumberInput.vue?vue&type=script&lang=js&\"\nexport * from \"./NumberInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NumberInput.vue?vue&type=style&index=0&id=0f88dca4&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0f88dca4\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row class=\"justify-content-center\">\n          <b-col lg=\"8\">\n            <loading-placeholder v-if=\"!printer\" />\n            <div v-else class=\"surface with-loading-animation full-on-mobile\">\n              <section class=\"settings\">\n                <h2 class=\"section-title\">{{ $t(\"Settings\") }}</h2>\n                <div class=\"form-group mb-4 mt-4\">\n                  <div class=\"form-label text-muted mb-2\">{{ $t(\"Give your shiny new printer a name\") }}</div>\n                  <saving-animation :errors=\"errorMessages.name\" :saving=\"saving.name\">\n                    <input\n                      id=\"id_name\"\n                      v-model=\"printer.name\"\n                      type=\"text\"\n                      name=\"name\"\n                      maxlength=\"200\"\n                      placeholder=\"\"\n                      class=\"form-control field_required\"\n                      required=\"required\"\n                    />\n                  </saving-animation>\n                </div>\n                <!-- Potential failure section -->\n                <div class=\"failure-notification\">\n                  <div class=\"form-group mt-4 mb-4\">\n                    <div class=\"form-label text-muted\">{{ $t(\"When a potential failure is detected\") }}:</div>\n                    <saving-animation\n                      :errors=\"errorMessages.action_on_failure_NONE\"\n                      :saving=\"saving.action_on_failure_NONE\"\n                    >\n                      <div class=\"custom-control custom-radio mt-1 radio\">\n                        <input\n                          id=\"id_action_on_failure_0\"\n                          v-model=\"printer.action_on_failure\"\n                          type=\"radio\"\n                          name=\"action_on_failure\"\n                          class=\"custom-control-input field_required\"\n                          value=\"NONE\"\n                          @change=\"updateSetting('action_on_failure')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_action_on_failure_0\"\n                          >{{ $t(\"Just notify me\") }}</label\n                        >\n                      </div>\n                    </saving-animation>\n                    <saving-animation\n                      :errors=\"errorMessages.action_on_failure_PAUSE\"\n                      :saving=\"saving.action_on_failure_PAUSE\"\n                    >\n                      <div\n                        id=\"action_on_failure_PAUSE\"\n                        class=\"custom-control custom-radio mt-1 radio\"\n                      >\n                        <input\n                          id=\"id_action_on_failure_1\"\n                          v-model=\"printer.action_on_failure\"\n                          type=\"radio\"\n                          name=\"action_on_failure\"\n                          class=\"custom-control-input field_required\"\n                          value=\"PAUSE\"\n                          @change=\"updateSetting('action_on_failure')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_action_on_failure_1\"\n                          >{{ $t(\"Pause the printer and notify me\") }}</label\n                        >\n                      </div>\n                    </saving-animation>\n                  </div>\n                </div>\n              </section>\n              <section class=\"mt-5\">\n                <h2 class=\"section-title\">{{ $t(\"Failure Detection\") }}</h2>\n                <div class=\"card-body p-0 pt-3\">\n                  <p class=\"text-warning\">\n                    <i class=\"fas fa-exclamation-triangle\"></i>\n                    {{$t(\"If you are not sure about the settings below, leave the default values to minimize surprises.\")}}\n                  </p>\n\n                  <!-- Advanced settngs: when printer is paused -->\n                  <div class=\"form-group mt-4\">\n                    <div class=\"form-label text-muted\">{{ $t(\"When print is paused,\") }}</div>\n                    <saving-animation\n                      :errors=\"errorMessages.tools_off_on_pause\"\n                      :saving=\"saving.tools_off_on_pause\"\n                    >\n                      <div class=\"custom-control custom-checkbox mt-2 checkbox\">\n                        <input\n                          id=\"id_tools_off_on_pause\"\n                          v-model=\"printer.tools_off_on_pause\"\n                          type=\"checkbox\"\n                          name=\"tools_off_on_pause\"\n                          class=\"custom-control-input\"\n                          @change=\"updateSetting('tools_off_on_pause')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_tools_off_on_pause\">\n                          {{$t(\"Turn off hotend heater(s)\")}}\n                        </label>\n                      </div>\n                    </saving-animation>\n                    <saving-animation\n                      :errors=\"errorMessages.bed_off_on_pause\"\n                      :saving=\"saving.bed_off_on_pause\"\n                    >\n                      <div class=\"custom-control custom-checkbox mt-2 checkbox\">\n                        <input\n                          id=\"id_bed_off_on_pause\"\n                          v-model=\"printer.bed_off_on_pause\"\n                          type=\"checkbox\"\n                          name=\"bed_off_on_pause\"\n                          class=\"custom-control-input\"\n                          @change=\"updateSetting('bed_off_on_pause')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_bed_off_on_pause\">\n                          {{$t(\"Turn off bed heater\")}}\n                        </label>\n                      </div>\n                    </saving-animation>\n\n                    <saving-animation\n                      :errors=\"errorMessages.retract_on_pause\"\n                      :saving=\"saving.retract_on_pause\"\n                      class=\"mobile-full-width\"\n                    >\n                      <div class=\"form-inline my-1 checkbox-with-input\">\n                        <div class=\"custom-control custom-checkbox\">\n                          <input\n                            id=\"retract-checkbox\"\n                            v-model=\"retractFilamentByEnabled\"\n                            type=\"checkbox\"\n                            class=\"custom-control-input\"\n                          />\n                          <label class=\"custom-control-label\" for=\"retract-checkbox\"\n                            >{{ $t(\"Retract filament by\") }}</label\n                          >\n                        </div>\n                        <number-input\n                          v-model=\"retractOnPause\"\n                          :step=\"0.5\"\n                          :disable=\"!retractFilamentByEnabled\"\n                          class=\"wrappable-field\"\n                        ></number-input>\n                      </div>\n                    </saving-animation>\n\n                    <saving-animation\n                      :errors=\"errorMessages.lift_z_on_pause\"\n                      :saving=\"saving.lift_z_on_pause\"\n                      class=\"mobile-full-width\"\n                    >\n                      <div class=\"form-inline my-1 checkbox-with-input\">\n                        <div class=\"custom-control custom-checkbox\">\n                          <input\n                            id=\"lift-z-checkbox\"\n                            v-model=\"liftExtruderByEnabled\"\n                            type=\"checkbox\"\n                            class=\"custom-control-input\"\n                          />\n                          <label class=\"custom-control-label\" for=\"lift-z-checkbox\"\n                            >{{ $t(\"Lift extruder along Z axis by\") }}</label\n                          >\n                        </div>\n                        <number-input\n                          v-model=\"liftExtruderBy\"\n                          :step=\"0.5\"\n                          :disable=\"!liftExtruderByEnabled\"\n                          class=\"wrappable-field\"\n                        ></number-input>\n                      </div>\n                    </saving-animation>\n                  </div>\n\n                  <!-- Advanced settngs: sensitivity slider -->\n                  <div class=\"form-group sensitivity my-4\">\n                    <div class=\"form-label text-muted\">{{ $t(\"AI failure detection sensitivity\") }}</div>\n                    <saving-animation\n                      :errors=\"errorMessages.detective_sensitivity\"\n                      :saving=\"saving.detective_sensitivity\"\n                    >\n                      <div class=\"my-2 sensitivity-slider\">\n                        <vue-slider\n                          v-model=\"detectiveSensitivity\"\n                          :lazy=\"true\"\n                          :min=\"0.8\"\n                          :max=\"1.2\"\n                          :interval=\"0.05\"\n                          :tooltip-formatter=\"sensitivityTooltipFormatter\"\n                        />\n                      </div>\n                    </saving-animation>\n                    <div\n                      v-if=\"sensitivityTooltipFormatter(printer.detective_sensitivity) === 'Low'\"\n                    >\n                      {{$t(\"Low - I don't want a lot of false alarms. Only alert me when you are absolutely sure.\")}}\n                    </div>\n                    <div\n                      v-else-if=\"\n                        sensitivityTooltipFormatter(printer.detective_sensitivity) === 'Medium'\n                      \"\n                    >\n                      {{$t(\"Medium - A few false alarms won't bother me. But some well-disguised spaghetti will be missed.\")}}\n                    </div>\n                    <div v-else>\n                      {{$t(\"High - Hit me with all the false alarms. I want to catch as many failures as possible.\")}}\n                    </div>\n                  </div>\n                </div>\n              </section>\n              <section class=\"mt-5\">\n                <h2 class=\"section-title\">{{ $t(\"Time-lapse\") }}</h2>\n                <p\n                  v-if=\"!(timelapseOnFinishEnabled && timelapseOnCancelEnabled)\"\n                  class=\"text-warning\"\n                >\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  <i18next :translation=\"$t(`Focused Feedback won't be available when time-lapse recording is turned off. You won't be able to {localizedDom}`)\">\n                    <template #localizedDom>\n                      <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\">{{$t(\"help us get better while earning AI Detection Hours for yourself\")}}</a>\n                    </template>\n                  </i18next>\n\n                </p>\n                <div class=\"form-group mt-4\">\n                  <saving-animation\n                    :errors=\"errorMessages.min_timelapse_secs_on_finish\"\n                    :saving=\"saving.min_timelapse_secs_on_finish\"\n                    class=\"mobile-full-width\"\n                  >\n                    <div class=\"form-inline my-1 checkbox-with-input\">\n                      <div class=\"custom-control custom-checkbox\">\n                        <input\n                          id=\"timelapseOnFinishEnabled\"\n                          v-model=\"timelapseOnFinishEnabled\"\n                          type=\"checkbox\"\n                          class=\"custom-control-input\"\n                        />\n                        <label class=\"custom-control-label\" for=\"timelapseOnFinishEnabled\"\n                          >{{ $t(\"Record time-lapse when a print finishes successfully.\") }}</label\n                        >\n                      </div>\n                    </div>\n                    <div\n                      v-if=\"timelapseOnFinishEnabled\"\n                      class=\"form-inline my-1 checkbox-with-input\"\n                    >\n                      <div class=\"custom-control custom-checkbox\">\n                        {{$t(\"Skip if the print is finished in less than\")}}\n                      </div>\n                      <number-input\n                        v-model=\"minTimelapseMinutesOnFinish\"\n                        :step=\"5\"\n                        unit=\"minutes\"\n                        class=\"wrappable-field\"\n                      ></number-input>\n                    </div>\n                  </saving-animation>\n                  <saving-animation\n                    :errors=\"errorMessages.min_timelapse_secs_on_cancel\"\n                    :saving=\"saving.min_timelapse_secs_on_cancel\"\n                    class=\"mobile-full-width\"\n                  >\n                    <div class=\"form-inline mt-3 mb-1 checkbox-with-input\">\n                      <div class=\"custom-control custom-checkbox\">\n                        <input\n                          id=\"timelapseOnCancelEnabled\"\n                          v-model=\"timelapseOnCancelEnabled\"\n                          type=\"checkbox\"\n                          class=\"custom-control-input\"\n                        />\n                        <label class=\"custom-control-label\" for=\"timelapseOnCancelEnabled\"\n                          >{{ $t(\"Record time-lapse when a print is cancelled.\") }}</label\n                        >\n                      </div>\n                    </div>\n                    <div\n                      v-if=\"timelapseOnCancelEnabled\"\n                      class=\"form-inline my-1 checkbox-with-input\"\n                    >\n                      <div class=\"custom-control custom-checkbox\">\n                        {{$t(\"Skip if the print is cancelled in less than\")}}\n                      </div>\n                      <number-input\n                        v-model=\"minTimelapseMinutesOnCancel\"\n                        :step=\"5\"\n                        unit=\"minutes\"\n                        class=\"wrappable-field\"\n                      ></number-input>\n                    </div>\n                  </saving-animation>\n                </div>\n              </section>\n              <section class=\"danger mt-5\">\n                <h2 class=\"section-title\">{{ $t(\"Danger Zone\") }}</h2>\n                <div class=\"mt-4\">\n                  <a class=\"btn btn-outline-secondary\" :href=\"printerWizardUrl\">\n                    {{$t(\"Re-Link Printer\")}}\n                  </a>\n                  <div class=\"text-muted mt-1\">\n                    <small>\n                      <i18next :translation=\"$t(`If your printer is always showing as 'offline', and you have gone through {localizedDom}, you can try to re-link printer as the last resort.`)\">\n                        <template #localizedDom>\n                          <a :href=\"getDocUrl('/user-guides/troubleshoot-server-connection-issues/')\">{{$t(\"all the trouble-shooting steps\")}}</a>\n                        </template>\n                      </i18next>\n                    </small>\n                  </div>\n                </div>\n                <div v-if=\"isEnt\" class=\"mt-4\">\n                  <button class=\"btn btn-outline-warning\" @click=\"archivePrinter\">\n                    {{$t(\"Archive Printer\")}}\n                  </button>\n                  <div class=\"text-muted mt-1\">\n                    <small>\n                      <i18next :translation=\"$t(`Archived printers are not counted toward your subscription plan. You won't see them in the app either. Go to {localizedDom} to find all archived printers and/or un-archive them.`)\">\n                        <template #localizedDom>\n                          <a href=\"/ent/printers/archived/\">{{ $t(\"this page\") }}</a>\n                        </template>\n                      </i18next>\n                      </small>\n                  </div>\n                </div>\n                <div class=\"mt-4\">\n                  <button class=\"btn btn-outline-danger\" @click=\"deletePrinter\">\n                    {{$t(\"Delete Printer\")}}\n                  </button>\n                  <div class=\"text-muted mt-1\">\n                    <small>{{ $t(\"Bye-bye printer.\") }}</small>\n                  </div>\n                </div>\n              </section>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n\n      <!-- <div class=\"row justify-content-center\">\n        <div class=\"col-sm-11 col-md-10 col-lg-8\">\n\n\n        </div>\n      </div> -->\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport split from 'lodash/split'\nimport VueSlider from 'vue-slider-component'\n\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport urls from '@config/server-urls'\nimport SavingAnimation from '@src/components/SavingAnimation.vue'\nimport NumberInput from '@src/components/NumberInput.vue'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { settings } from '@src/lib/page-context'\n\nexport default {\n  components: {\n    SavingAnimation,\n    NumberInput,\n    PageLayout,\n    VueSlider,\n  },\n\n  data() {\n    return {\n      isEnt: false,\n      printer: null,\n      printerId: '',\n      saving: {},\n      errorMessages: {},\n      delayedSubmit: {\n        // Make pause before sending new value to API\n        name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        retract_on_pause: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        lift_z_on_pause: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        min_timelapse_secs_on_finish: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        min_timelapse_secs_on_cancel: {\n          delay: 1000,\n          timeoutId: null,\n        },\n      },\n    }\n  },\n\n  computed: {\n    retractFilamentByEnabled: {\n      get() {\n        return this.printer.retract_on_pause > 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.retract_on_pause = 6.5 // Default retraction value\n        } else {\n          this.printer.retract_on_pause = 0\n        }\n      },\n    },\n    retractOnPause: {\n      get() {\n        return this.printer ? this.printer.retract_on_pause : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.retract_on_pause = newValue\n        }\n      },\n    },\n    liftExtruderByEnabled: {\n      get() {\n        return this.printer.lift_z_on_pause > 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.lift_z_on_pause = 2.5 // Default z-lift value\n        } else {\n          this.printer.lift_z_on_pause = 0\n        }\n      },\n    },\n    liftExtruderBy: {\n      get() {\n        return this.printer ? this.printer.lift_z_on_pause : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.lift_z_on_pause = newValue\n        }\n      },\n    },\n    timelapseOnFinishEnabled: {\n      get() {\n        return this.printer.min_timelapse_secs_on_finish >= 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.min_timelapse_secs_on_finish = 600\n        } else {\n          this.printer.min_timelapse_secs_on_finish = -1\n        }\n      },\n    },\n    minTimelapseMinutesOnFinish: {\n      get() {\n        return this.printer ? this.printer.min_timelapse_secs_on_finish / 60 : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.min_timelapse_secs_on_finish = newValue * 60\n        }\n      },\n    },\n    timelapseOnCancelEnabled: {\n      get() {\n        return this.printer.min_timelapse_secs_on_cancel >= 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.min_timelapse_secs_on_cancel = 300\n        } else {\n          this.printer.min_timelapse_secs_on_cancel = -1\n        }\n      },\n    },\n    minTimelapseMinutesOnCancel: {\n      get() {\n        return this.printer ? this.printer.min_timelapse_secs_on_cancel / 60 : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.min_timelapse_secs_on_cancel = newValue * 60\n        }\n      },\n    },\n    printerWizardUrl() {\n      return urls.printerWizard(this.printer.id)\n    },\n    printerName: {\n      get: function () {\n        return this.printer ? this.printer.name : undefined\n      },\n      set: function (newValue) {\n        this.printer.name = newValue\n      },\n    },\n    detectiveSensitivity: {\n      get() {\n        return this.printer.detective_sensitivity\n      },\n      set(newValue) {\n        this.printer.detective_sensitivity = newValue\n        this.updateSetting('detective_sensitivity')\n      },\n    },\n  },\n\n  // Watch these properties so that updates can be triggered at key-press, instead of losing focus\n  // To watch deep properties in an object: https://stackoverflow.com/questions/42133894/vue-js-how-to-properly-watch-for-nested-data\n  watch: {\n    printerName: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.updateSetting('name')\n      }\n    },\n    retractOnPause: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.changeRetractOnPause(newValue)\n      }\n    },\n    liftExtruderBy: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.changeLiftExtruderBy(newValue)\n      }\n    },\n    minTimelapseMinutesOnFinish: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.updateSetting('min_timelapse_secs_on_finish')\n      }\n    },\n    minTimelapseMinutesOnCancel: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.updateSetting('min_timelapse_secs_on_cancel')\n      }\n    },\n  },\n\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.printerId = split(window.location.pathname, '/').slice(-2, -1).pop()\n    this.fetchPrinter()\n  },\n\n  methods: {\n    /**\n     * Get actual printer settings\n     */\n    fetchPrinter() {\n      return axios\n        .get(urls.printer(this.printerId))\n        .then((response) => {\n          this.printer = normalizedPrinter(response.data, this.printer)\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Printer not found')}`)\n        })\n    },\n\n    /**\n     * Update printer settings\n     * @param {String} propName\n     * @param {any} propValue\n     * @param {String} settingsItem\n     */\n    patchPrinter(propName, propValue) {\n      const inputElem = this.getSettingsItemInput(propName, propValue)\n      this.setSavingStatus(inputElem, true)\n\n      // Make request to API\n      return axios\n        .patch(urls.printer(this.printerId), {\n          [propName]: propValue,\n        })\n        .catch((err) => {\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            if (err.response.data.non_field_errors) {\n              this.errorAlert(err.response.data.non_field_errors)\n            } else {\n              for (const error in err.response.data) {\n                this.errorMessages[inputElem] = err.response.data[error]\n              }\n            }\n          } else {\n            this.errorAlert()\n          }\n        })\n        .then(() => {\n          this.setSavingStatus(inputElem, false)\n        })\n    },\n\n    /**\n     * Show error alert if can not save settings\n     */\n    errorAlert() {\n      this.$swal.Toast.fire({\n        icon: 'error',\n        html: `<div>${this.$i18next.t(\"Can not update printer settings.\")}</div><div>${this.$i18next.t(\"Get help from\")} <a href=\"https://obico.io/discord\">${this.$i18next.t(\"the {brandName} general support forum\",{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"or\")} <a href=\"https://obico.io/discord\">${this.$i18next.t(\"{brandName} for klipper support forum\",{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"if this error persists.\")}</div>`,\n      })\n    },\n\n    /**\n     * Update particular settings item\n     * @param {String} settingsItem\n     */\n    updateSetting(settingsItem) {\n      if (settingsItem in this.delayedSubmit) {\n        const delayInfo = this.delayedSubmit[settingsItem]\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n        this.delayedSubmit[settingsItem]['timeoutId'] = setTimeout(() => {\n          this.patchPrinter(settingsItem, this.printer[settingsItem])\n        }, delayInfo['delay'])\n        return\n      }\n\n      this.patchPrinter(settingsItem, this.printer[settingsItem])\n    },\n\n    sensitivityTooltipFormatter: function (value) {\n      if (value < 0.95) {\n        return 'Low'\n      }\n      if (value > 1.05) {\n        return 'High'\n      }\n      return 'Medium'\n    },\n\n    deletePrinter(printer) {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t(`Delete {name} printer? This action can not be undone.`,{name:this.printer.name})}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.delete(urls.printer(this.printerId) + '?with_archived=true').then(() => {\n            window.location.href = `/printers/`\n          })\n        }\n      })\n    },\n\n    archivePrinter() {\n      this.$swal.Confirm.fire().then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.post(urls.printerAction(this.printerId, '/archive/')).then(() => {\n            this.$swal.Prompt.fire({\n              title: `${this.$i18next.t('Printer archived')}`,\n              html: `<p>${this.$i18next.t(\"{name} is archived.\",{name:this.printer.name})}</p><p>${this.$i18next.t(\"You can find it on\")} <a href=\"/ent/printers/archived/\">${this.$i18next.t(\"this page\")}</a> ${this.$i18next.t(\"and un-archive it\")}.</p>`,\n              confirmButtonText: `${this.$i18next.t('Go to the printer page')}`,\n            }).then(() => {\n              window.location.href = '/printers/'\n            })\n          })\n        }\n      })\n    },\n\n    /**\n     * Return input element by given name\n     * @param {String} settingsItem\n     * @returns {Object, null}\n     */\n    getSettingsItemInput: function (settingsItem, value = '') {\n      switch (settingsItem) {\n        case 'action_on_failure':\n          return `${settingsItem}_${value}`\n        default:\n          return `${settingsItem}`\n      }\n    },\n\n    /**\n     * Interlayer for saving status control to be able to set same saving status\n     * for 2 or more different inputs grouped to one block\n     * @param {String} propName\n     * @param {String} status\n     */\n    setSavingStatus(propName, status) {\n      if (status) {\n        delete this.errorMessages[propName]\n      }\n      this.$set(this.saving, propName, status)\n    },\n\n    changeRetractOnPause(value) {\n      this.printer.retract_on_pause = value\n      this.updateSetting('retract_on_pause')\n    },\n\n    changeLiftExtruderBy(value) {\n      this.printer.lift_z_on_pause = value\n      this.updateSetting('lift_z_on_pause')\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n@import 'vue-slider-component/lib/theme/default.scss'\n\n.card\n  overflow: visible !important\n\n.custom-control-label\n  font-size: 16px\n\n@media (max-width: 768px)\n  .mobile-full-width\n    width: 100%\n    margin-top: .25em\n    margin-bottom: .4em\n\n.section-title\n  padding-bottom: 10px\n  border-bottom: 1px solid var(--color-text-primary)\n\n.form-label\n  font-size: 18px\n\nsection.danger\n  .section-title\n    color: var(--color-danger)\n    border-color: var(--color-danger)\n\n.form-inline\n  .wrappable-field\n    margin-left: 1.5rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterSettingsPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterSettingsPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterSettingsPage.vue?vue&type=template&id=5dd13e88&scoped=true&\"\nimport script from \"./PrinterSettingsPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterSettingsPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterSettingsPage.vue?vue&type=style&index=0&id=5dd13e88&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5dd13e88\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[_c('div',{staticClass:\"row\"},[_c('h3',{staticClass:\"col-sm-12 text-center p-3 wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Link Printer\")))])]),_c('b-row',{staticClass:\"center mt-3 mb-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('PrinterProgress',{attrs:{\"step\":2}})],1)]),_c('b-row',{staticClass:\"center py-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('loading',{attrs:{\"active\":_vm.chosenDeviceId != null,\"can-cancel\":false}}),(_vm.discoveryEnabled)?_c('div',{staticClass:\"discover\"},[_c('div',{staticClass:\"discover-body\"},[(!_vm.canStartLinking)?_c('div',{staticStyle:{\"text-align\":\"center\"}},[_c('div',{staticClass:\"spinner-border big\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"})]),_c('div',{staticClass:\"lead\"},[_vm._v(_vm._s(_vm.$t(\"Scanning...\")))])]):_c('div',[_c('div',{staticClass:\"lead my-3\"},[_c('div',{staticClass:\"spinner-border\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"})]),_c('span',{staticClass:\"sr-only\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Scanning..., {name} printer(s) found on your local network:\",{name:_vm.discoveredPrinters.length}))+\" \")]),_vm._l((_vm.discoveredPrinters),function(discoveredPrinter){return _c('discovered-printer',{key:discoveredPrinter.device_id,attrs:{\"discovered-printer\":discoveredPrinter},on:{\"auto-link-printer\":_vm.autoLinkPrinter}})})],2),(_vm.discoveryCount >= 2)?_c('div',{staticClass:\"text-muted pt-4\"},[_c('div',[_vm._v(_vm._s(_vm.$t(\"To link your printer, please make sure:\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"The printer is powered on. If you are using an external SBC such as a Raspberry Pi, make sure it's powered on as well.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"The printer or SBC is connected to the same local network as your phone/computer.\"))+\" \")]),(_vm.targetOctoPrint)?_c('li',[_vm._v(_vm._s(_vm.$t(\"{brandName} for OctoPrint is 1.8.0 or above.\",{brandName:_vm.$syndicateText.brandName})))]):_vm._e()])]):_vm._e(),_c('div',{staticClass:\"d-flex flex-column align-items-center\"},[_c('div',{staticClass:\"mt-5 mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(`Can’t find the printer you want to link? Switch to Manual Linking instead.`))+\" \")]),_c('button',{staticClass:\"btn btn-outline-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.discoveryEnabled = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Switch to Manual Linking\"))+\" \")])])])]):(_vm.useLegacyVerificationCode)?_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row justify-content-center pb-3\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8 d-flex flex-column align-items-center\"},[_c('input',{ref:\"code\",staticClass:\"code-btn\",attrs:{\"disabled\":\"\"},domProps:{\"value\":`${_vm.verificationCode && _vm.verificationCode.code}`}}),_c('small',{staticClass:\"mx-auto py-1\",class:{ 'text-muted': !_vm.copied }},[_vm._v(_vm._s(_vm.copied ? _vm.$t('Code copied to system clipboard') : _vm.$t('Ctrl-C/Cmd-C to copy the code')))]),_c('div',{staticClass:\"mx-auto pt-1 pb-4\"},[_c('span',{staticClass:\"text-muted\"},[_vm._v(_vm._s(_vm.$t(\"Code will expire in \")))]),_vm._v(_vm._s(_vm.timeToExpire)+\" \")]),_c('div',{staticClass:\"lead\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Enter the {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',[_vm._v(_vm._s(_vm.$t(\"6-digit verification code\")))])]},proxy:true}])})],1)])]),_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8 img-container\"},[(_vm.targetOctoPrint)?_c('img',{staticClass:\"screenshot\",attrs:{\"src\":require('@static/img/octoprint-plugin-guide/plugin_verification_code.png')},on:{\"click\":function($event){return _vm.zoomIn($event)}}}):_vm._e(),(_vm.targetKlipper)?_c('img',{staticClass:\"screenshot\",attrs:{\"src\":require('@static/img/octoprint-plugin-guide/moonraker_verification_code.png')},on:{\"click\":function($event){return _vm.zoomIn($event)}}}):_vm._e(),_c('div',{staticClass:\"helper mx-auto py-2\"},[_c('a',{staticClass:\"link font-weight-bold\",on:{\"click\":_vm.showVerificationCodeHelpModal}},[_vm._v(_vm._s(_vm.$t(\"Can't find the page to enter the 6-digit code?\")))])])])])]):_c('div',{staticClass:\"container pt-5\"},[_c('div',{staticClass:\"row justify-content-center pb-1\"},[_c('div',{staticClass:\"col-sm-12 col-md-8 col-lg-6 d-flex flex-column align-items-center\"},[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.oneTimePasscode),expression:\"oneTimePasscode\"}],staticClass:\"form-control code-btn\",attrs:{\"type\":\"text\",\"aria-label\":\"One-time Passcode\",\"disabled\":_vm.oneTimePasscodeStatus === 'inprogress'},domProps:{\"value\":(_vm.oneTimePasscode)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.oneTimePasscode=$event.target.value},_vm.oneTimePasscodeChanged]}}),(_vm.oneTimePasscodeStatus === 'inprogress')?_c('div',{staticClass:\"spinner-border text-primary ml-2\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Loading...\")])]):_vm._e()])])]),_c('div',{staticClass:\"row justify-content-center pb-3\"},[(_vm.oneTimePasscodeStatus === 'failed')?_c('div',{staticClass:\"text-danger col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Invalid code. Is it expired?\"))+\" \")]):_c('div',{staticClass:\"col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Enter the One-time Passcode\"))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_c('muted-alert',{staticClass:\"muted-alert wizard-secondary-text-font text-secondary\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`If you using Obico for OctoPrint older than 2.5.0, or Obico for Klipper older than 1.6.0, switch to {localizedDom}.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",on:{\"click\":function($event){_vm.useLegacyVerificationCode = true}}},[_vm._v(_vm._s(_vm.$t(\"6-digit verification code\")))])]},proxy:true}])})],1)],1)])],1)]),(!_vm.discoveryEnabled && !_vm.useLegacyVerificationCode)?_c('b-row',{staticClass:\"mt-3 mb-5\"},[_c('div',{staticClass:\"col-md-4 p-4 method-block\"},[_c('h4',{staticClass:\"text-center font-weight-bold wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Touch Screen\")))]),_c('div',{staticClass:\"image-block\"},[_c('img',{staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":require(\"@static/img/printer-wizard/klipperScreenMenu.png\"),\"alt\":\"\"}})]),_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Check to see if your printer already has Obico installed your printer screen.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Navigate to the settings menu on the LCD screen of your printer.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Find the “Link Obico” menu item and tap it to open the connection screen.\")))])])]),_c('div',{staticClass:\"col-md-4 p-4 method-block\"},[_c('h4',{staticClass:\"text-center font-weight-bold wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"LCD Screen \")))]),_c('div',{staticClass:\"image-block\"},[_c('img',{staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":require(\"@static/img/printer-wizard/lcdScreenLarge.png\"),\"alt\":\"\"}})]),_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Check to see if your printer already has Obico Easy Link installed on the LCD menu.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Navigate to the settings menu on the LCD screen of your printer.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Find the “Link Obico” menu item.\")))])])]),_c('div',{staticClass:\"col-md-4 p-4 method-block\"},[_c('h4',{staticClass:\"text-center font-weight-bold wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Install Via SSH\")))]),_c('div',{staticClass:\"image-block\"},[_c('img',{staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":require(\"@static/img/printer-wizard/commandLinePrompt.png\"),\"alt\":\"\"}})]),_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t(\"If you can't find Obico Easy Link, you will need to SSH to your printer to install Obico. You will need to find a guide that works for your printer.\")))])]),_c('div',[_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/klipper-setup/')}},[_vm._v(_vm._s(_vm.$t(\"Show me how\")))])])])]):_vm._e(),_c('div',{staticClass:\"d-flex justify-content-between align-items-center button-wrap\"},[_c('div',{staticClass:\"back\",on:{\"click\":function($event){return _vm.$router.back()}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"Back\")))])])]),_c('div',{staticClass:\"text-center mt-5 wizard-default-font\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Need help? Check out the {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.targetKlipper? _vm.getDocUrl('/user-guides/klipper-setup/'):_vm.getDocUrl('/user-guides/octoprint-plugin-setup/')}},[_vm._v(_vm._s(_vm.$t(\"step-by-step set up guide\"))+\".\")])]},proxy:true}])})],1)],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const onPrinterLinked = () => {\n  if (window.posthog) {\n    window.posthog.capture('PrinterAdded (Web)')\n  }\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"discovered-printers mt-4\"},[_c('div',{staticClass:\"flex-grow-0 pt-1 mr-2\"},[(_vm.discoveredPrinter.agent.toLowerCase().includes('octoprint'))?_c('img',{staticClass:\"logo-img\",attrs:{\"src\":require('@static/img/octoprint_logo.png')}}):(_vm.discoveredPrinter.agent.toLowerCase().includes('klipper'))?_c('img',{staticClass:\"logo-img\",attrs:{\"src\":require('@static/img/klipper_logo.jpg')}}):_c('img',{staticClass:\"logo-img\",attrs:{\"src\":require('@static/img/raspberry_pi.png')}})]),_c('div',{staticClass:\"row flex-grow-1 ml-1 link-action\"},[_c('div',{staticClass:\"col-sm-12 col-md-10 pb-2\"},[(_vm.discoveredPrinter.rpi_model)?_c('div',[_vm._v(\" \"+_vm._s(_vm.discoveredPrinter.rpi_model)+\" \")]):_vm._e(),(_vm.discoveredPrinter.machine_type)?_c('div',[_vm._v(\" \"+_vm._s(_vm.discoveredPrinter.machine_type)+\" \")]):_vm._e(),(_vm.discoveredPrinter.agent)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Platform\"))+\": \"+_vm._s(_vm.discoveredPrinter.agent)+\" \")]):_vm._e(),(_vm.discoveredPrinter.host_or_ip)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"IP address\"))+\": \"+_vm._s(_vm.discoveredPrinter.host_or_ip)+\" \")]):_vm._e(),(_vm.discoveredPrinter.hostname)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Hostname\"))+\": \"+_vm._s(_vm.discoveredPrinter.hostname)+\" \")]):_vm._e(),(_vm.discoveredPrinter.octopi_version)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"OctoPi\"))+\": \"+_vm._s(_vm.discoveredPrinter.octopi_version)+\" \")]):_vm._e(),(!_vm.discoveredPrinter.octopi_version && _vm.discoveredPrinter.os)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"OS\"))+\": \"+_vm._s(_vm.discoveredPrinter.os)+\" \")]):_vm._e()]),_c('div',{staticClass:\"col-sm-12 col-md-2 center px-3\"},[_c('button',{staticClass:\"btn btn-block btn-primary\",on:{\"click\":function($event){return _vm.$emit('auto-link-printer', { ..._vm.discoveredPrinter })}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Link\"))+\" \")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"discovered-printers mt-4\">\n    <div class=\"flex-grow-0 pt-1 mr-2\">\n      <img v-if=\"discoveredPrinter.agent.toLowerCase().includes('octoprint')\" class=\"logo-img\" :src=\"require('@static/img/octoprint_logo.png')\" />\n      <img v-else-if=\"discoveredPrinter.agent.toLowerCase().includes('klipper')\" class=\"logo-img\" :src=\"require('@static/img/klipper_logo.jpg')\" />\n      <img\n        v-else\n        class=\"logo-img\"\n        :src=\"require('@static/img/raspberry_pi.png')\"\n      />\n    </div>\n    <div class=\"row flex-grow-1 ml-1 link-action\">\n      <div class=\"col-sm-12 col-md-10 pb-2\">\n        <div v-if=\"discoveredPrinter.rpi_model\">\n          {{ discoveredPrinter.rpi_model }}\n        </div>\n        <div v-if=\"discoveredPrinter.machine_type\">\n          {{ discoveredPrinter.machine_type }}\n        </div>\n        <div v-if=\"discoveredPrinter.agent\" class=\"text-muted small\">\n          {{$t(\"Platform\")}}: {{ discoveredPrinter.agent }}\n        </div>\n        <div v-if=\"discoveredPrinter.host_or_ip\" class=\"text-muted small\">\n          {{$t(\"IP address\")}}: {{ discoveredPrinter.host_or_ip }}\n        </div>\n        <div v-if=\"discoveredPrinter.hostname\" class=\"text-muted small\">\n          {{$t(\"Hostname\")}}: {{ discoveredPrinter.hostname }}\n        </div>\n        <div v-if=\"discoveredPrinter.octopi_version\" class=\"text-muted small\">\n          {{$t(\"OctoPi\")}}: {{ discoveredPrinter.octopi_version }}\n        </div>\n        <div\n          v-if=\"!discoveredPrinter.octopi_version && discoveredPrinter.os\"\n          class=\"text-muted small\"\n        >\n          {{$t(\"OS\")}}: {{ discoveredPrinter.os }}\n        </div>\n      </div>\n      <div class=\"col-sm-12 col-md-2 center px-3\">\n        <button\n          class=\"btn btn-block btn-primary\"\n          @click=\"$emit('auto-link-printer', { ...discoveredPrinter })\"\n        >\n          {{$t(\"Link\")}}\n        </button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'DiscoveredPrinter',\n  props: {\n    discoveredPrinter: {\n      type: Object,\n      required: true,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\">\n.discovered-printers\n  display: flex\n  flex-direction: columns\n\n  .logo-img\n    height: 3.5rem\n\n  .link-action\n    border-left: solid thin\n\n.center\n  display: flex\n  justify-content: center\n  align-items: center\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DiscoveredPrinter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DiscoveredPrinter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DiscoveredPrinter.vue?vue&type=template&id=9def43e8&\"\nimport script from \"./DiscoveredPrinter.vue?vue&type=script&lang=js&\"\nexport * from \"./DiscoveredPrinter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DiscoveredPrinter.vue?vue&type=style&index=0&id=9def43e8&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-2\"},[_c('div',{staticClass:\"title-pic\"},[_c('img',{staticClass:\"pic-item\",attrs:{\"src\":require('@static/img/webpage-multiple.svg')}}),_vm._m(0),_c('img',{staticClass:\"pic-item\",attrs:{\"src\":require('@static/img/printer.png')}})]),_c('div',{staticClass:\"my-4\"},[_c('p',[_vm._v(_vm._s(_vm.$t(\"The {brandName} app needs to make sure you have access to selected printer.\",{brandName:_vm.$syndicateText.brandName})))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"When you press 'Link Now' button below, a new browser window will pop up to finish a handshake with this printer.\"))+\" \")])]),_c('div',[_c('div',{staticClass:\"row my-2\"},[_c('div',{staticClass:\"col-sm-6\"},[_c('button',{staticClass:\"btn btn-block btn-primary mt-2\",attrs:{\"disabled\":_vm.linking},on:{\"click\":_vm.autoLinkPrinter}},[(_vm.linking)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_vm._e(),_vm._v(_vm._s(_vm.$t(\"Link Now\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})],1)]),_c('div',{staticClass:\"col-sm-6\"},[_c('button',{staticClass:\"btn btn-block btn-secondary mt-2\",on:{\"click\":_vm.cancel}},[_vm._v(_vm._s(_vm.$t(\"Cancel\")))])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pic-item\"},[_c('i',{staticClass:\"fas fa-ellipsis-h fa-2x\"}),_c('i',{staticClass:\"fas fa-ellipsis-h fa-2x\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"px-2\">\n    <div class=\"title-pic\">\n      <img class=\"pic-item\" :src=\"require('@static/img/webpage-multiple.svg')\" />\n      <div class=\"pic-item\">\n        <i class=\"fas fa-ellipsis-h fa-2x\"></i>\n        <i class=\"fas fa-ellipsis-h fa-2x\"></i>\n      </div>\n      <img class=\"pic-item\" :src=\"require('@static/img/printer.png')\" />\n    </div>\n    <div class=\"my-4\">\n      <p>{{$t(\"The {brandName} app needs to make sure you have access to selected printer.\",{brandName:$syndicateText.brandName})}}</p>\n      <p>\n        {{$t(\"When you press 'Link Now' button below, a new browser window will pop up to finish a handshake with this printer.\")}}\n      </p>\n    </div>\n    <div>\n      <div class=\"row my-2\">\n        <div class=\"col-sm-6\">\n          <button\n            class=\"btn btn-block btn-primary mt-2\"\n            :disabled=\"linking\"\n            @click=\"autoLinkPrinter\"\n          >\n            <b-spinner v-if=\"linking\" small></b-spinner>{{$t(\"Link Now\")}}&nbsp;<i\n              class=\"fas fa-external-link-alt\"\n            ></i>\n          </button>\n        </div>\n        <div class=\"col-sm-6\">\n          <button class=\"btn btn-block btn-secondary mt-2\" @click=\"cancel\">{{ $t(\"Cancel\") }}</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'AutoLinkPopup',\n  props: {\n    discoveredPrinter: {\n      type: Object,\n      required: true,\n    },\n    switchToManualLinking: {\n      type: Function,\n      required: true,\n    },\n    secretObtained: {\n      type: Function,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      linking: false,\n    }\n  },\n\n  mounted() {\n    window.addEventListener('message', this.gotWindowMessage)\n  },\n\n  beforeDestroy() {\n    window.removeEventListener('message', this.gotWindowMessage)\n  },\n\n  methods: {\n    autoLinkPrinter() {\n      this.linking = true\n      this.gotSecret = null\n\n      this.obicoDiscoveryPopup = window.open(\n        this.destUrl(),\n        '_blank',\n        'toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=500,height=100'\n      )\n\n      if (!this.obicoDiscoveryPopup) {\n        this.cancel()\n        this.$swal.Prompt.fire({\n          icon: 'error',\n          title: `${this.$i18next.t('Oops!')}`,\n          html: `<p>${this.$i18next.t(\"Handshake failed because the pop-up was blcoked.\")}</p><p>${this.$i18next.t(\"Please unblock the pop-up in your browser and try it again.\")}</p>`,\n          confirmButtonText: `${this.$i18next.t('Okay!')}`,\n          showCancelButton: true,\n          cancelButtonText: `${this.$i18next.t('Switch to Manual Setup')}`,\n        }).then((result) => {\n          if (result.isDismissed && result.dismiss === 'cancel') {\n            this.switchToManualLinking()\n          }\n        })\n        return\n      }\n\n      setTimeout(() => {\n        this.closeDiscoveryPopup()\n\n        if (!this.gotSecret) {\n          this.cancel()\n          this.$swal.Prompt.fire({\n            icon: 'error',\n            title: `${this.$i18next.t('Handshake failed!')}`,\n            html: `<p>${this.$i18next.t(\"Please make sure\")}:</p>\n              <ul>\n                <li>${this.$i18next.t(\"The OctoPrint you want to link is at {host}:{port}, and it's connected to the same local network as your computer/phone.\",{host:this.discoveredPrinter.host_or_ip,port:this.discoveredPrinter.port})}</li>\n                <li>${this.$i18next.t(\"The version of plugin is 1.8.0 or above.\")}</li>\n              </ul>`,\n            confirmButtonText: `${this.$i18next.t('Okay!')}`,\n            showCancelButton: true,\n            cancelButtonText: `${this.$i18next.t('Switch to Manual Setup')}`,\n          }).then((result) => {\n            if (result.isDismissed && result.dismiss === 'cancel') {\n              this.switchToManualLinking()\n            }\n          })\n        }\n      }, 5000)\n    },\n\n    destUrl() {\n      const pluginName = this.discoveredPrinter.agent ? 'obico' : 'thespaghettidetective'\n      return `http://${this.discoveredPrinter.host_or_ip}:${\n        this.discoveredPrinter.port || '80'\n      }/plugin/${pluginName}/grab-discovery-secret?device_id=${this.discoveredPrinter.device_id}`\n    },\n\n    switchToManual() {\n      this.cancel()\n      this.switchToManualLinking()\n    },\n\n    closeDiscoveryPopup() {\n      if (this.obicoDiscoveryPopup) {\n        this.obicoDiscoveryPopup.close()\n        this.obicoDiscoveryPopup = null\n      }\n    },\n\n    gotWindowMessage(ev) {\n      const data = { ...(ev?.data || {}) }\n      if (this.gotSecret || !this.discoveredPrinter.device_id || !data.device_secret) {\n        console.log('Ignored message', ev)\n        return\n      }\n\n      this.gotSecret = data\n      this.secretObtained(this.discoveredPrinter.device_id, data.device_secret)\n      this.cancel()\n    },\n\n    cancel() {\n      this.closeDiscoveryPopup()\n      this.$swal.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n\n.title-pic\n  display: flex\n  margin: 1.5rem 0\n  justify-content: center\n\n  .pic-item\n    height: 3rem\n    margin: 0 0.5rem\n\n  img\n    filter: grayscale(100%)\n  i\n    color: #888888\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkPopup.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkPopup.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AutoLinkPopup.vue?vue&type=template&id=76d88bae&scoped=true&\"\nimport script from \"./AutoLinkPopup.vue?vue&type=script&lang=js&\"\nexport * from \"./AutoLinkPopup.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AutoLinkPopup.vue?vue&type=style&index=0&id=76d88bae&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"76d88bae\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"printer-progress\"},[_c('div',{staticClass:\"circle\",class:{active:_vm.step===0, done:_vm.step>0}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-check\"}}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Device Selection\"))+\" \")])],1),_c('div',{staticClass:\"line\",class:{active:_vm.step>=1}}),_c('div',{staticClass:\"circle\",class:{active:_vm.step===1, done:_vm.step>1}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'check']}}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Install Obico\"))+\" \")])],1),_c('div',{staticClass:\"line\",class:{active:_vm.step===2}}),_c('div',{staticClass:\"circle\",class:{active:_vm.step===2,done:_vm.step===3}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'check']}}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Link Printer\"))+\" \")])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class='printer-progress'>\n      <div class=\"circle\" :class=\"{active:step===0, done:step>0}\">\n        <font-awesome-icon icon=\"fa-check\" />\n        <p>\n          {{ $t(\"Device Selection\") }}\n        </p>\n      </div>\n      <div class=\"line\" :class=\"{active:step>=1}\"></div>\n      <div class=\"circle\" :class=\"{active:step===1, done:step>1}\">\n        <font-awesome-icon :icon=\"['fas', 'check']\" />\n        <p>\n          {{ $t(\"Install Obico\") }}\n        </p></div>\n      <div class=\"line\" :class=\"{active:step===2}\"></div>\n      <div class=\"circle\" :class=\"{active:step===2,done:step===3}\">\n        <font-awesome-icon :icon=\"['fas', 'check']\" />\n        <p>\n          {{ $t(\"Link Printer\") }}\n        </p></div>\n    </div>\n</template>\n<script>\nexport default {\n    components:{},\n    props:{\n      step:{\n        default:0,\n        type:Number\n      }\n    },\n    data(){\n        return {\n        };\n    },\n    computed:{},\n    created(){},\n    mounted(){},\n    watch:{},\n    methods:{},\n};\n</script>\n<style scoped lang='scss'>\n.printer-progress{\n  display:flex;\n  align-items:center;\n  justify-content: space-between;\n  width:100%;\n  padding:0 30px;\n  .circle{\n    background-color: #fff;\n    border:1px solid #c6c6c6;\n    width:20px;\n    height:20px;\n    border-radius:15px;\n    position:relative;\n    display:flex;\n    justify-content: center;\n    align-items: center;\n    &.active{\n      border-color:var(--color-primary);\n      &:after{\n        position:absolute;\n        content:'';\n        width:4px;\n        height:4px;\n        border-radius:2px;\n        background-color: var(--color-primary);\n\n      }\n    }\n    &.done{\n      background-color:  var(--color-primary);\n      border-color:var(--color-primary);\n      svg{\n        color:#2D3E4F\n      }\n    }\n    p{\n      position:absolute;\n      bottom:-50px;\n      white-space: nowrap;\n    }\n  }\n  .line{\n    flex:1;\n    height:2px;\n    background-color: #fff;\n    &.active{\n      background-color:  var(--color-primary);\n    }\n  }\n\n}\n</style>\n\n\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterProgress.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterProgress.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterProgress.vue?vue&type=template&id=b4e920a0&scoped=true&\"\nimport script from \"./PrinterProgress.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterProgress.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterProgress.vue?vue&type=style&index=0&id=b4e920a0&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b4e920a0\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <div class=\"row\">\n                <h3 class=\"col-sm-12 text-center p-3 wizard-page-title-font\">{{ $t(\"Link Printer\") }}</h3>\n              </div>\n              <b-row class=\"center mt-3 mb-5\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <PrinterProgress :step=\"2\"></PrinterProgress>\n                </div>\n              </b-row>\n\n              <b-row class=\"center py-5\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <loading :active=\"chosenDeviceId != null\" :can-cancel=\"false\"> </loading>\n                  <div v-if=\"discoveryEnabled\" class=\"discover\">\n                    <div class=\"discover-body\">\n                      <div v-if=\"!canStartLinking\" style=\"text-align: center\">\n                        <div class=\"spinner-border big\" role=\"status\">\n                          <span class=\"sr-only\"></span>\n                        </div>\n                        <div class=\"lead\">{{ $t(\"Scanning...\") }}</div>\n                      </div>\n                      <div v-else>\n                        <div class=\"lead my-3\">\n                          <div class=\"spinner-border\" role=\"status\">\n                            <span class=\"sr-only\"></span>\n                          </div>\n                          <span class=\"sr-only\"></span>\n                          {{ $t(\"Scanning..., {name} printer(s) found on your local network:\",{name:discoveredPrinters.length}) }}\n                        </div>\n                        <discovered-printer\n                          v-for=\"discoveredPrinter in discoveredPrinters\"\n                          :key=\"discoveredPrinter.device_id\"\n                          :discovered-printer=\"discoveredPrinter\"\n                          @auto-link-printer=\"autoLinkPrinter\"\n                        />\n                      </div>\n                      <div v-if=\"discoveryCount >= 2\" class=\"text-muted pt-4\">\n                        <div>{{$t(\"To link your printer, please make sure:\")}}</div>\n                        <ul>\n                          <li>{{ $t(\"The printer is powered on. If you are using an external SBC such as a Raspberry Pi, make sure it's powered on as well.\") }}</li>\n                          <li>\n                            {{$t(\"The printer or SBC is connected to the same local network as your phone/computer.\")}}\n                          </li>\n                          <li v-if=\"targetOctoPrint\">{{ $t(\"{brandName} for OctoPrint is 1.8.0 or above.\",{brandName:$syndicateText.brandName}) }}</li>\n                        </ul>\n                      </div>\n                      <div class=\"d-flex flex-column align-items-center\">\n                        <div class=\"mt-5 mb-3\">\n                        {{ $t(`Can’t find the printer you want to link? Switch to Manual Linking instead.`) }}\n                        </div>\n                        <button\n                          class=\"btn btn-outline-secondary\"\n                          type=\"button\"\n                          @click=\"discoveryEnabled = false\"\n                        >\n                          {{ $t(\"Switch to Manual Linking\") }}\n                        </button>\n                      </div>\n                    </div>\n                  </div>\n                  <div v-else-if=\"useLegacyVerificationCode\" class=\"container\">\n                    <div class=\"row justify-content-center pb-3\">\n                      <div class=\"col-sm-12 col-lg-8 d-flex flex-column align-items-center\">\n                        <input\n                          ref=\"code\"\n                          disabled\n                          class=\"code-btn\"\n                          :value=\"`${verificationCode && verificationCode.code}`\"\n                        />\n                        <small class=\"mx-auto py-1\" :class=\"{ 'text-muted': !copied }\">{{\n                          copied\n                            ? $t('Code copied to system clipboard')\n                            : $t('Ctrl-C/Cmd-C to copy the code')\n                        }}</small>\n                        <div class=\"mx-auto pt-1 pb-4\">\n                          <span class=\"text-muted\">{{ $t(\"Code will expire in \") }}</span\n                          >{{ timeToExpire }}\n                        </div>\n                        <div class=\"lead\">\n                          <i18next :translation=\"$t(`Enter the {localizedDom}`)\">\n                            <template #localizedDom>\n                              <strong>{{$t(\"6-digit verification code\")}}</strong>\n                            </template>\n                          </i18next>\n                        </div>\n                      </div>\n                    </div>\n                    <div class=\"row justify-content-center\">\n                      <div class=\"col-sm-12 col-lg-8 img-container\">\n                        <img\n                          v-if=\"targetOctoPrint\"\n                          class=\"screenshot\"\n                          :src=\"\n                            require('@static/img/octoprint-plugin-guide/plugin_verification_code.png')\n                          \"\n                          @click=\"zoomIn($event)\"\n                        />\n                        <img\n                          v-if=\"targetKlipper\"\n                          class=\"screenshot\"\n                          :src=\"\n                            require('@static/img/octoprint-plugin-guide/moonraker_verification_code.png')\n                          \"\n                          @click=\"zoomIn($event)\"\n                        />\n                        <div class=\"helper mx-auto py-2\">\n                          <a\n                            class=\"link font-weight-bold\"\n                            @click=\"showVerificationCodeHelpModal\"\n                            >{{ $t(\"Can't find the page to enter the 6-digit code?\") }}</a\n                          >\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <div v-else class=\"container pt-5\">\n                    <div class=\"row justify-content-center pb-1\">\n                      <div class=\"col-sm-12 col-md-8 col-lg-6 d-flex flex-column align-items-center\">\n                        <div class=\"d-flex align-items-center\">\n                          <input\n                            type=\"text\"\n                            class=\"form-control code-btn\"\n                            aria-label=\"One-time Passcode\"\n                            v-model=\"oneTimePasscode\"\n                            :disabled=\"oneTimePasscodeStatus === 'inprogress'\"\n                            @input=\"oneTimePasscodeChanged\"\n                          />\n                          <div class=\"spinner-border text-primary ml-2\" role=\"status\" v-if=\"oneTimePasscodeStatus === 'inprogress'\">\n                            <span class=\"sr-only\">Loading...</span>\n                          </div>\n                        </div>\n                      </div>\n                    </div>\n                    <div class=\"row justify-content-center pb-3\">\n                      <div v-if=\"oneTimePasscodeStatus === 'failed'\" class=\"text-danger col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\">\n                        {{$t(\"Invalid code. Is it expired?\")}}\n                      </div>\n                      <div v-else class=\"col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\">\n                        {{$t(\"Enter the One-time Passcode\")}}\n                      </div>\n                    </div>\n                    <div class=\"mt-4\">\n                      <muted-alert class=\"muted-alert wizard-secondary-text-font text-secondary\">\n                        <i18next class=\"\" :translation=\"$t(`If you using Obico for OctoPrint older than 2.5.0, or Obico for Klipper older than 1.6.0, switch to {localizedDom}.`)\">\n                          <template #localizedDom>\n                            <a class=\"link\" @click=\"useLegacyVerificationCode = true\">{{$t(\"6-digit verification code\")}}</a>\n                          </template>\n                        </i18next>\n                      </muted-alert>\n                    </div>\n                  </div>\n                </div>\n              </b-row>\n              <b-row v-if=\"!discoveryEnabled && !useLegacyVerificationCode\" class=\"mt-3 mb-5\">\n                <div class=\"col-md-4 p-4 method-block\">\n                    <h4 class=\"text-center font-weight-bold wizard-page-title-font\">{{ $t(\"Touch Screen\") }}</h4>\n                    <div class=\"image-block\">\n                      <img src=\"@static/img/printer-wizard/klipperScreenMenu.png\" style=\"max-width: 80%;\" alt=\"\">\n                    </div>\n                    <ol>\n                      <li>{{ $t(\"Check to see if your printer already has Obico installed your printer screen.\") }}</li>\n                      <li>{{ $t(\"Navigate to the settings menu on the LCD screen of your printer.\") }}</li>\n                      <li>{{ $t(\"Find the “Link Obico” menu item and tap it to open the connection screen.\") }}</li>\n                    </ol>\n                </div>\n                <div class=\"col-md-4 p-4 method-block\">\n                    <h4 class=\"text-center font-weight-bold wizard-page-title-font\">{{ $t(\"LCD Screen \") }}</h4>\n                    <div class=\"image-block\">\n                      <img src=\"@static/img/printer-wizard/lcdScreenLarge.png\" style=\"max-width: 80%;\" alt=\"\">\n                    </div>\n                    <ol>\n                      <li>{{ $t(\"Check to see if your printer already has Obico Easy Link installed on the LCD menu.\") }}</li>\n                      <li>{{ $t(\"Navigate to the settings menu on the LCD screen of your printer.\") }}</li>\n                      <li>{{ $t(\"Find the “Link Obico” menu item.\") }}</li>\n                    </ol>\n                </div>\n                <div class=\"col-md-4 p-4 method-block\">\n                    <h4 class=\"text-center font-weight-bold wizard-page-title-font\">{{ $t(\"Install Via SSH\") }}</h4>\n                    <div class=\"image-block\">\n                      <img src=\"@static/img/printer-wizard/commandLinePrompt.png\" style=\"max-width: 80%;\" alt=\"\">\n                    </div>\n                    <ol>\n                      <li>{{ $t(\"If you can't find Obico Easy Link, you will need to SSH to your printer to install Obico. You will need to find a guide that works for your printer.\") }}</li>\n                    </ol>\n                    <div>\n                      <a target=\"_blank\" :href=\"getDocUrl('/user-guides/klipper-setup/')\">{{ $t(\"Show me how\") }}</a>\n                    </div>\n                </div>\n              </b-row>\n              <div class=\"d-flex justify-content-between align-items-center button-wrap\">\n                <div class=\"back\" @click=\"$router.back()\">\n                  <i class=\"fas fa-chevron-left\"></i>\n                  <span> {{ $t(\"Back\") }}</span>\n                </div>\n              </div>\n              <div class=\"text-center mt-5 wizard-default-font\">\n                <i18next :translation=\"$t(`Need help? Check out the {localizedDom}`)\">\n                  <template #localizedDom>\n                    <a target=\"_blank\" :href=\"targetKlipper? getDocUrl('/user-guides/klipper-setup/'):getDocUrl('/user-guides/octoprint-plugin-setup/')\">{{$t(\"step-by-step set up guide\")}}.</a>\n                  </template>\n                </i18next>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport urls from '@config/server-urls'\nimport { onPrinterLinked } from '@config/event-handler'\n// TODO: this should be configured as global. But for some reason it doesn't work.\nimport Loading from 'vue-loading-overlay'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport sortBy from 'lodash/sortBy'\nimport theme from '@src/styles/main.sass'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport DiscoveredPrinter from '@src/components/printers/wizard/DiscoveredPrinter.vue'\nimport AutoLinkPopup from '@src/components/printers/wizard/AutoLinkPopup.vue'\nimport PrinterProgress from '../../components/printers/wizard/PrinterProgress.vue';\n\nexport default {\n  components: {\n    Loading,\n    PageLayout,\n    DiscoveredPrinter,\n    PrinterProgress,\n    MutedAlert,\n  },\n  data() {\n    return {\n      theme: theme,\n      verificationCode: null,\n      verifiedPrinter: null,\n      copied: false,\n      oneTimePasscode: '',\n      oneTimePasscodeStatus: null,\n      useLegacyVerificationCode: false, // To simplify the flow, this can only change from false -> true.\n      discoveryEnabled: true,\n      discoveryCount: 0,\n      discoveredPrinters: [],\n      chosenDeviceId: null,\n      gotSecret: null,\n      obicoDiscoveryPopup: null,\n      apiCallIntervalId: null,\n    }\n  },\n  computed: {\n    printerIdToLink() {\n      return this.$route.query.printerId;\n    },\n    title() {\n      return this.printerIdToLink ? 'Re-Link Printer' : 'Link Printer'\n    },\n    expiryMoment() {\n      if (this.verificationCode) {\n        return moment(this.verificationCode.expired_at)\n      } else {\n        return null\n      }\n    },\n    timeToExpire() {\n      if (this.expiryMoment) {\n        return moment.duration(this.expiryMoment.diff(moment())).humanize()\n      } else {\n        return '-'\n      }\n    },\n    canStartLinking() {\n      return this.verificationCode?.code && this.discoveredPrinters?.length > 0\n    },\n    targetOctoPrint() {\n      return this.$route.params.targetPlatform === 'octoprint'\n    },\n    targetKlipper() {\n      return this.$route.params.targetPlatform.startsWith('klipper-');\n    },\n  },\n  created() {\n    if (this.targetOctoPrint) {\n      this.useLegacyVerificationCode = true\n    }\n    this.getVerificationCode()\n    this.discoverPrinter()\n  },\n  methods: {\n    oneTimePasscodeChanged() {\n      this.oneTimePasscode = this.oneTimePasscode.toLowerCase();\n\n      // Call API when input reaches 5 characters\n      if (this.oneTimePasscode.length === 5) {\n        this.oneTimePasscodeStatus = 'inprogress'\n        axios\n          .post(urls.oneTimePasscodes(), {\n            one_time_passcode: this.oneTimePasscode,\n            verification_code: this.verificationCode.code,\n          })\n          .then((resp) => {\n            if (resp.status !== 200) {\n              this.oneTimePasscodeStatus = 'failed'\n            }\n          })\n          .catch((error) => {\n            this.oneTimePasscodeStatus = 'failed'\n          })\n      }\n    },\n    verificationCodeUrl() {\n      const baseUrl = urls.verificationCode()\n      if (!this.verificationCode) {\n        // Never retrieved veification code. Get one.\n        if (this.printerIdToLink) {\n          return `${baseUrl}?printer_id=${this.printerIdToLink}`\n        } else {\n          return baseUrl\n        }\n      }\n      if (this.verificationCode.verified_at) {\n        // Code is verified successfully, keep on polling to get update on the printer name if any\n        return `${baseUrl}${this.verificationCode.id}/`\n      }\n      if (moment().isBefore(this.expiryMoment)) {\n        // Not verified, and not expired\n        return `${baseUrl}${this.verificationCode.id}/`\n      }\n      // Not verified, but expired.\n      return baseUrl\n    },\n    callVerificationCodeApi() {\n      axios.get(this.verificationCodeUrl()).then((resp) => {\n        if (resp.data) {\n          this.verificationCode = resp.data\n          if (this.verificationCode.verified_at) {\n            this.verifiedPrinter = resp.data.printer\n            if (onPrinterLinked) {\n              onPrinterLinked()\n            }\n            this.$router.push({\n              path: `/printers/wizard/success/${this.verifiedPrinter.id}/`,\n              query: {\n                ...this.$route.query,\n              }\n            })\n            .catch((error) => {}) // There are NavigationDuplicated errors. Suspect it's because the setInterval is not super clean and occasionally results in multiple calls to this.\n          }\n        }\n      })\n    },\n    getVerificationCode() {\n      this.callVerificationCodeApi()\n      this.apiCallIntervalId = setInterval(() => {\n        if (this.verifiedPrinter) {\n          clearInterval(this.apiCallIntervalId)\n        } else {\n          this.callVerificationCodeApi()\n        }\n      }, 5000)\n    },\n    showVerificationCodeHelpModal() {\n      let html = `<p>${this.$i18next.t(\"The 6-digit code needs to be entered in the Obico plugin in OctoPrint. There are a few reasons why you can't find this page:\",{brandName:this.$syndicateText.brandName})}</p>\n        <p><ul>\n        <li style=\"margin: 10px 0;\">${this.$i18next.t(\"You don't have the plugin installed or you haven't restarted OctoPrint after installation. Click\")} <a href=\"/printers/wizard/\">here</a> ${this.$i18next.t(\"to walk through the process again.\")}</li>\n        <li style=\"margin: 10px 0;\">${this.$i18next.t(\"The installed plugin is on a version earlier than 1.5.0. You need to upgrade the plugin to\")} <b>1.5.0</b> ${this.$i18next.t(\"or later.\")}</li>\n        <li style=\"margin: 10px 0;\">${this.$i18next.t(\"Still no dice? Check out the step-by-step\")} <a target=\"_blank\" href=${this.getDocUrl('/user-guides/octoprint-plugin-setup/')}\">${this.$i18next.t(\"set up guide\")}</a>.</li>\n        </ul></p>`\n\n      if (!this.targetOctoPrint) {\n        html = `<p>${this.$i18next.t(\"The 6-digit code needs to be entered to the Obico for Klipper installation script.\")}</p>\n        <p>${this.$i18next.t(\"Check\")} <a target=\"_blank\" href=${this.getDocUrl('/user-guides/klipper-setup/')}> ${this.$i18next.t(\"this set up guide\")}</a> ${this.$i18next.t(\"for detailed instructions.\")}</p>`\n      }\n\n      this.$swal.fire({\n        title: `${this.$i18next.t(\"Can't find the page to enter the 6-digit code?\")}`,\n        html,\n        customClass: {\n          container: 'dark-backdrop',\n        },\n      })\n    },\n    zoomIn(event) {\n      event.target.classList.toggle('zoomedIn')\n    },\n    callPrinterDiscoveryApi() {\n      if (!this.discoveryEnabled) {\n        return\n      }\n      this.discoveryCount += 1\n      axios.get(urls.printerDiscovery()).then((resp) => {\n        this.discoveredPrinters = sortBy(resp.data, (p) => p.device_id)\n      })\n    },\n    discoverPrinter() {\n      if (!this.discoveryEnabled || this.verifiedPrinter) {\n        return\n      }\n      this.callPrinterDiscoveryApi()\n      setTimeout(() => {\n        this.discoverPrinter()\n      }, 5000)\n    },\n    autoLinkPrinter(discoveredPrinter) {\n      this.$swal.openModalWithComponent(\n        AutoLinkPopup,\n        {\n          discoveredPrinter,\n          switchToManualLinking: () => (this.discoveryEnabled = false),\n          secretObtained: (chosenDeviceId, secret) => this.secretObtained(chosenDeviceId, secret),\n        },\n        {\n          title: 'Browser Pop-up',\n          showConfirmButton: false,\n          allowOutsideClick: false,\n        }\n      )\n    },\n    secretObtained(chosenDeviceId, secret) {\n      this.chosenDeviceId = chosenDeviceId\n      axios.post(urls.printerDiscovery(), {\n        code: this.verificationCode.code,\n        device_id: this.chosenDeviceId,\n        device_secret: secret,\n      })\n      // Declare failure if nothing is linked after 20s\n      setTimeout(() => {\n        if (this.chosenDeviceId && !this.verifiedPrinter) {\n          this.chosenDeviceId = null\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: 'Something went wrong. Switched to using 6-digit code to link OctoPrint.',\n          })\n          this.discoveryEnabled = false\n        }\n        this.chosenDeviceId = null\n      }, 20000)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn-back\n  color: var(--color-text-primary)\n  min-width: auto\n.header-img\n  width: 1em\n  height: 1em\n  margin-right: 12px\n  margin-bottom: 8px\n.img-container\n  padding: 1rem\n  text-align: center\nimg\n  max-height: 30vh\n.spacer\n width: 200px\n.code-btn\n  border-radius: var(--border-radius-sm)\n  text-align: center\n  width: 21rem\n  height: 60px\n  background-color: var(--color-input-background)\n  color: var(--color-text-primary)\n  font-size: 2rem\n  font-weight: 500\n  letter-spacing: 0.5em\n  border: none\n.helper\n  text-align: center\n  padding: 0 36px\nli\n  margin: 2px -35px\n.screenshot\n  max-width: 100%\n  transition: transform .3s\n  &:hover\n    cursor: pointer\n  &.zoomedIn\n    transform: scale(2)\n    position: relative\n    z-index: 9\n\npre\n  color: var(--color-text-secondary)\n  font-size: 0.9em\n</style>\n\n<style lang=\"sass\">\n// Unscoped styles to style plugin elements\n// TODO merge 2 style blocks\n\n// Step label (not active)\n.success-checkmark\n  width: 6rem\n  height: 6rem\n  margin-bottom: 1.5rem\n.printer-name-input\n  position: relative\n  .edit-icon\n    height: 100%\n    display: flex\n    flex-direction: column\n    justify-content: center\n    position: absolute\n    top: 0\n    left: 1em\n    opacity: .5\n  input\n    padding: .4em 2.4em\n    width: 100%\n    font-size: 20px\n    text-align: center\n.discover\n  .discover-body\n    min-height: 25rem\n    display: flex\n    flex-direction: column\n    justify-content: center\n    .spinner-border\n      width: 1.2em\n      height: 1.2em\n      margin-right: 0.2em\n      &.big\n        width: 5rem\n        height: 5rem\n        margin-bottom: 0.8rem\n  li\n    margin: initial\n.method-block\n  display: flex\n  flex-direction: column\n  align-items: center\n  .image-block\n    display: flex\n    justify-content: center\n.button-wrap\n  margin-top:80px\n  .back\n    cursor: pointer\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterLinkingPage.vue?vue&type=template&id=7e0a0f74&scoped=true&\"\nimport script from \"./PrinterLinkingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterLinkingPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterLinkingPage.vue?vue&type=style&index=0&id=7e0a0f74&prod&lang=sass&scoped=true&\"\nimport style1 from \"./PrinterLinkingPage.vue?vue&type=style&index=1&id=7e0a0f74&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7e0a0f74\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[(_vm.printerIdToLink)?_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('div',{staticClass:\"text-warning\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Warning: Re-Linking OctoPrint should be your last resort to solve issues. Please make sure you have exhausted all options on {localizedDom}.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://www.obico.io/help/\"}},[_vm._v(_vm._s(_vm.$t(\"{brandName}'s help website\",{brandName:_vm.$syndicateText.brandName})))])]},proxy:true}],null,false,3291268443)})],1)])]):_vm._e(),_c('div',{staticClass:\"row\"},[_c('h1',{staticClass:\"col-sm-12 text-center p-3 wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Device Selection\")))])]),_c('b-row',{staticClass:\"center mt-3 mb-5 pb-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('PrinterProgress',{attrs:{\"step\":0}})],1)]),(_vm.devicesWithObicoPreInstalled.length > 0)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 py-4\"},[_c('h4',{staticClass:\"py-3\"},[_vm._v(_vm._s(_vm.$t(\"Devices with Obico Pre-installed\")))]),_c('div',{staticClass:\"printer-list\"},_vm._l((_vm.devicesWithObicoPreInstalled),function(item){return _c('div',{key:item.id,staticClass:\"printer-item\",on:{\"click\":function($event){return _vm.targetPlatformClicked('klipper-obico-enabled',item)}}},[_c('div',{staticClass:\"img-wrap clickable\"},[_c('img',{attrs:{\"src\":item.image_url,\"alt\":\"\"}})]),_c('div',{staticClass:\"item-label\"},[_vm._v(_vm._s(item.brand))]),_c('h5',{staticClass:\"item-label\"},[_c('b',[_vm._v(_vm._s(item.model))])])])}),0)])]):_vm._e(),_c('div',{staticClass:\"wizard-card-list py-4\"},[_c('div',{staticClass:\"wizard-card-horizontal\",on:{\"click\":function($event){return _vm.targetPlatformClicked('klipper-preinstalled')}}},[_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":require('@static/img/klipper_logo.jpg')}})]),_c('div',{staticClass:\"text-wrap\"},[_c('h3',{staticClass:\"wizard-default-font\"},[_vm._v(_vm._s(_vm.$t(\"Pre-Installed Klipper Printer\")))]),_c('h4',{staticClass:\"wizard-secondary-text-font text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Creality K1, Sonic Pad, Sovol SV07, Kingroon KLP1, Elegoo Neptune 4, etc...\")))])])]),_c('div',{staticClass:\"wizard-card-horizontal\",on:{\"click\":function($event){return _vm.targetPlatformClicked('klipper-generic')}}},[_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":require('@static/img/klipper_logo.jpg')}}),_c('div',{staticClass:\"img-tip\"},[_c('img',{attrs:{\"src\":require('@static/img/mainsail_logo.png')}}),_c('img',{attrs:{\"src\":require('@static/img/fluidd_logo.png')}})])]),_c('div',{staticClass:\"text-wrap\"},[_c('h3',{staticClass:\"wizard-default-font\"},[_vm._v(_vm._s(_vm.$t(\"Generic Klipper - Self Installed\")))]),_c('h4',{staticClass:\"wizard-secondary-text-font text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"If you installed Klipper yourself on a Raspberry Pi or other linux device. E.g., Voron, RatRig\")))])])]),_c('div',{staticClass:\"wizard-card-horizontal\",on:{\"click\":function($event){return _vm.targetPlatformClicked('octoprint')}}},[_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":require('@static/img/octoprint_logo.png')}})]),_c('div',{staticClass:\"text-wrap\"},[_c('h3',{staticClass:\"wizard-default-font\"},[_vm._v(\"OctoPrint\")]),_c('h4',{staticClass:\"wizard-secondary-text-font text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Including OctoPrint for Klipper such as OctoKlipper.\")))])])])])],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <b-row v-if=\"printerIdToLink\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <div class=\"text-warning\">\n                    <i18next :translation=\"$t(`Warning: Re-Linking OctoPrint should be your last resort to solve issues. Please make sure you have exhausted all options on {localizedDom}.`)\">\n                      <template #localizedDom>\n                        <a href=\"https://www.obico.io/help/\">{{$t(\"{brandName}'s help website\",{brandName:$syndicateText.brandName})}}</a>\n                      </template>\n                    </i18next>\n                  </div>\n                </div>\n              </b-row>\n              <div class=\"row\">\n                <h1 class=\"col-sm-12 text-center p-3 wizard-page-title-font\">{{ $t(\"Device Selection\") }}</h1>\n              </div>\n              <b-row class=\"center mt-3 mb-5 pb-5\">\n                <div class=\"col-sm-12 col-lg-8\"><PrinterProgress :step=\"0\"></PrinterProgress></div>\n              </b-row>\n              <div v-if=\"devicesWithObicoPreInstalled.length > 0\" class=\"row\">\n                <div class=\"col-sm-12 col-lg-6 py-4\">\n                  <h4 class=\"py-3\">{{ $t(\"Devices with Obico Pre-installed\") }}</h4>\n                  <div class=\"printer-list\">\n                    <div v-for=\"item in devicesWithObicoPreInstalled\" :key=\"item.id\" @click=\"targetPlatformClicked('klipper-obico-enabled',item)\" class=\"printer-item\">\n                      <div class=\"img-wrap clickable\">\n                        <img :src=\"item.image_url\" alt=\"\">\n                      </div>\n                      <div class=\"item-label\">{{ item.brand }}</div>\n                      <h5 class=\"item-label\"><b>{{ item.model }}</b></h5>\n                    </div>\n                  </div>\n\n                </div>\n              </div>\n              <div class=\"wizard-card-list py-4\">\n                <div class=\"wizard-card-horizontal\" @click=\"targetPlatformClicked('klipper-preinstalled')\">\n                    <div class=\"img-wrap\">\n                      <img :src=\"require('@static/img/klipper_logo.jpg')\" />\n                    </div>\n                    <div class=\"text-wrap\">\n                      <h3 class=\"wizard-default-font\">{{ $t(\"Pre-Installed Klipper Printer\") }}</h3>\n                      <h4 class=\"wizard-secondary-text-font text-secondary\">{{ $t(\"Creality K1, Sonic Pad, Sovol SV07, Kingroon KLP1, Elegoo Neptune 4, etc...\") }}</h4>\n                    </div>\n                  </div>\n                  <div class=\"wizard-card-horizontal\" @click=\"targetPlatformClicked('klipper-generic')\">\n                    <div class=\"img-wrap\">\n                      <img :src=\"require('@static/img/klipper_logo.jpg')\" />\n                      <div class=\"img-tip\">\n                        <img :src=\"require('@static/img/mainsail_logo.png')\" />\n                        <img :src=\"require('@static/img/fluidd_logo.png')\" />\n                      </div>\n                    </div>\n                    <div class=\"text-wrap\">\n                      <h3 class=\"wizard-default-font\">{{ $t(\"Generic Klipper - Self Installed\") }}</h3>\n                      <h4 class=\"wizard-secondary-text-font text-secondary\">{{ $t(\"If you installed Klipper yourself on a Raspberry Pi or other linux device. E.g., Voron, RatRig\") }}</h4>\n                    </div>\n                  </div>\n                  <div class=\"wizard-card-horizontal\" @click=\"targetPlatformClicked('octoprint')\">\n                    <div class=\"img-wrap\">\n                      <img :src=\"require('@static/img/octoprint_logo.png')\" />\n                    </div>\n\n                    <div class=\"text-wrap\">\n                      <h3 class=\"wizard-default-font\">OctoPrint</h3>\n                      <h4 class=\"wizard-secondary-text-font text-secondary\">{{ $t(\"Including OctoPrint for Klipper such as OctoKlipper.\") }}</h4>\n                    </div>\n                  </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport PrinterProgress from '../../components/printers/wizard/PrinterProgress.vue';\nexport default {\n  components: {\n    PageLayout,\n    PrinterProgress\n  },\n  data() {\n    return {\n      devicesWithObicoPreInstalled: [],\n    }\n  },\n  computed: {\n    printerIdToLink() {\n      return this.$route.query.printerId;\n    },\n  },\n  async created() {\n    const response = await fetch(`https://storage.googleapis.com/public-versioned/devices_with_obico_preinstalled.json?ts=${Date.now()}`);\n    this.devicesWithObicoPreInstalled = await response.json();\n  },\n  methods: {\n    targetPlatformClicked(platform,printerItem) {\n      this.$router.push({\n        path: `/printers/wizard/guide/${platform}/`,\n        query: {\n          ...this.$route.query,\n          printerItem:printerItem?JSON.stringify(printerItem):undefined\n        }\n      });\n    },\n  },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n\n.clickable {\n  &:hover{\n    cursor: pointer;\n  }\n}\n.form-container{\n\n  .printer-list{\n    display:flex;\n    gap:20px;\n    .printer-item{\n      .img-wrap{\n        padding:20px;\n        background:#485B71;\n        border-radius:6px;\n        img{\n          width:100px;\n          height:auto;\n        }\n      }\n      .item-label{\n        margin-top:3px;\n        text-align:center;\n      }\n    }\n  }\n}\n\n\n.wizard-card-list{\n  margin-top:40px;\n\n  .wizard-card-horizontal{\n    margin-top:20px;\n    display:flex;\n    align-items:center;\n    gap:30px;\n    background-color: var(--color-surface-primary);\n    border-radius: var(--border-radius-md);\n    padding:20px;\n    cursor: pointer;\n\n  .img-wrap{\n    img{\n      width: 5em;\n    }\n    .img-tip{\n      display:flex;\n      justify-content:space-between;\n      img{\n        width:2em;\n      }\n    }\n  }\n  .text-wrap{\n    h5{\n      margin-top:10px;\n      color:#AAACB0;\n      font-size:16px;\n    }\n  }\n}\n}\n\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TargetPlatformSelectionPage.vue?vue&type=template&id=7924844c&scoped=true&\"\nimport script from \"./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"\nexport * from \"./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TargetPlatformSelectionPage.vue?vue&type=style&index=0&id=7924844c&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7924844c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[_c('div',{staticClass:\"row\"},[_c('h1',{staticClass:\"col-sm-12 text-center p-3 wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Install Obico\")))])]),_c('b-row',{staticClass:\"center mt-3 mb-5 pb-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('PrinterProgress',{attrs:{\"step\":1}})],1)]),_c('div',[(_vm.targetKlipperPreInstall)?_c('div',{staticClass:\"klipper-pre-install-wrap\"},[_c('img',{attrs:{\"src\":require(\"@static/img/printer-wizard/commandLinePrompt.png\"),\"alt\":\"\"}}),_c('div',{staticClass:\"text-wrap\"},[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Install Obico for Klipper\")))]),_c('ol',{staticClass:\"secondary-font\"},[_c('li',[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/klipper-setup/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Find the Guide for Your Printer to install Obico for Klipper.\")))])]),_c('li',[_vm._v(_vm._s(_vm.$t('SSH to your device.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Enter the installation commands.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Alternatively, you can use KIAUH to install Obico.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Upon \"Scanning the networking...\", come back here and click \"Next\".')))])])])]):_vm._e(),(_vm.targetOctoPrint)?_c('div',{staticClass:\"kilpper-pre-install-wrap\"},[_c('img',{staticClass:\"octoprint-image\",attrs:{\"src\":require(\"@static/img/octoprint-plugin-guide/install_plugin.png\"),\"alt\":\"\"}}),_c('div',{staticClass:\"text-wrap\"},[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Install Obico for OctoPrint\")))]),_c('ol',{staticClass:\"secondary-font\"},[_c('li',[_vm._v(_vm._s(_vm.$t(\"Open OctoPrint in another browser tab.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Select\"))+\" \"),_c('em',[_vm._v(\"\\\"\"+_vm._s(_vm.$t(\"OctoPrint settings menu → Plugin Manager → Get More...\"))+\"\\\"\")]),_vm._v(\". \")]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Enter '{brandName}' to locate the plugin. Click\", { brandName: _vm.$syndicateText.brandName }))+\" \"),_c('em',[_vm._v(\"\\\"\"+_vm._s(_vm.$t(\"Install\"))+\"\\\"\")]),_vm._v(\".\")]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Restart OctoPrint when prompted.\")))])])])]):_vm._e()]),(_vm.targetKlipperGeneric)?_c('div',{staticClass:\"kilpper-pre-install-wrap\"},[_c('img',{attrs:{\"src\":require(\"@static/img/klipper_logo.jpg\"),\"alt\":\"\"}}),_c('div',{staticClass:\"text-wrap\"},[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Install Obico for Klipper\")))]),_c('ol',{staticClass:\"secondary-font\"},[_c('li',[_vm._v(_vm._s(_vm.$t(\"SSH to the Raspberry Pi (or other SBC) your Klipper runs on.\")))]),_c('li',[_c('div',[_vm._v(_vm._s(_vm.$t(\"Run:\")))]),_c('pre',{staticClass:\"mt-2\"},[_vm._v(\"    cd ~\\n    git clone https://github.com/TheSpaghettiDetective/moonraker-obico.git\\n    cd moonraker-obico\\n    ./install.sh\\n                      \")])]),_c('li',[_vm._v(_vm._s(_vm.$t('Alternatively, you can use KIAUH to install Obico.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Upon \"Scanning the networking...\", come back here and click \"Next\".')))])])])]):_vm._e(),(_vm.printerItem)?_c('div',{staticClass:\"printer-item\"},[_c('div',{staticClass:\"printer-left\"},[_c('h5',[_vm._v(_vm._s(_vm.printerItem.brand +\" \" + _vm.printerItem.model))]),_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":_vm.printerItem.image_url,\"alt\":\"\"}})])]),_c('div',{staticClass:\"line\"}),_c('div',{staticClass:\"printer-right\"},[_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t('1. Unbox and assemble the 3D printer following the manufacturers instructions')))]),_c('li',[_vm._v(_vm._s(_vm.$t('2. Power on the 3D printer and make sure it is connected to WiFi.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('3. Tap “Next” when you are ready.')))])])])]):_vm._e(),_c('div',{staticClass:\"d-flex justify-content-between align-items-center button-wrap\"},[_c('div',{staticClass:\"back\",on:{\"click\":function($event){return _vm.$router.back()}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"Back\")))])]),_c('b-button',{attrs:{\"variant\":\"primary\"},on:{\"click\":_vm.goForward}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Next\"))+\" \")])],1),_c('div',{staticClass:\"text-center mt-5 wizard-default-font\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Need help? Check out the {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.targetKlipper? _vm.getDocUrl('/user-guides/klipper-setup/'):_vm.getDocUrl('/user-guides/octoprint-plugin-setup/')}},[_vm._v(_vm._s(_vm.$t(\"step-by-step set up guide\"))+\".\")])]},proxy:true}])})],1)],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <div class=\"row\">\n                <h1 class=\"col-sm-12 text-center p-3 wizard-page-title-font\">{{ $t(\"Install Obico\") }}</h1>\n              </div>\n              <b-row class=\"center mt-3 mb-5 pb-5\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <PrinterProgress :step=\"1\"></PrinterProgress>\n                </div>\n              </b-row>\n              <div>\n                <div v-if=\"targetKlipperPreInstall\" class=\"klipper-pre-install-wrap\">\n                  <img src=\"@static/img/printer-wizard/commandLinePrompt.png\" alt=\"\">\n                  <div class=\"text-wrap\">\n                    <h3>{{ $t(\"Install Obico for Klipper\") }}</h3>\n                    <ol class=\"secondary-font\">\n                      <li><a :href=\"getDocUrl('/user-guides/klipper-setup/')\" target=\"_blank\">{{ $t(\"Find the Guide for Your Printer to install Obico for Klipper.\") }}</a></li>\n                      <li>{{ $t('SSH to your device.') }}</li>\n                      <li>{{ $t('Enter the installation commands.') }}</li>\n                      <li>{{ $t('Alternatively, you can use KIAUH to install Obico.') }}</li>\n                      <li>{{ $t('Upon \"Scanning the networking...\", come back here and click \"Next\".') }}</li>\n                    </ol>\n                  </div>\n                </div>\n                <div v-if=\"targetOctoPrint\"  class=\"kilpper-pre-install-wrap\">\n                  <img class=\"octoprint-image\" src=\"@static/img/octoprint-plugin-guide/install_plugin.png\" alt=\"\">\n                  <div class=\"text-wrap\">\n                    <h3>{{ $t(\"Install Obico for OctoPrint\") }}</h3>\n                    <ol class=\"secondary-font\">\n                        <li>{{ $t(\"Open OctoPrint in another browser tab.\") }}</li>\n                        <li>\n                          {{ $t(\"Select\") }}\n                          <em>\"{{ $t(\"OctoPrint settings menu → Plugin Manager → Get More...\") }}\"</em>.\n                        </li>\n                        <li>{{ $t(\"Enter '{brandName}' to locate the plugin. Click\", { brandName: $syndicateText.brandName }) }}\n                          <em>\"{{ $t(\"Install\") }}\"</em>.</li>\n                        <li>{{ $t(\"Restart OctoPrint when prompted.\") }}</li>\n                      </ol>\n                    </div>\n                  </div>\n                </div>\n                <div v-if=\"targetKlipperGeneric\"  class=\"kilpper-pre-install-wrap\">\n                  <img src=\"@static/img/klipper_logo.jpg\" alt=\"\">\n                  <div class=\"text-wrap\">\n                    <h3>{{ $t(\"Install Obico for Klipper\") }}</h3>\n                    <ol class=\"secondary-font\">\n                        <li>{{ $t(\"SSH to the Raspberry Pi (or other SBC) your Klipper runs on.\") }}</li>\n                        <li>\n                          <div>{{ $t(\"Run:\") }}</div>\n                          <pre class=\"mt-2\">\n      cd ~\n      git clone https://github.com/TheSpaghettiDetective/moonraker-obico.git\n      cd moonraker-obico\n      ./install.sh\n                        </pre>\n                        </li>\n                      <li>{{ $t('Alternatively, you can use KIAUH to install Obico.') }}</li>\n                      <li>{{ $t('Upon \"Scanning the networking...\", come back here and click \"Next\".') }}</li>\n                    </ol>\n                  </div>\n                </div>\n                <div v-if=\"printerItem\" class=\"printer-item\">\n                  <div class=\"printer-left\">\n                    <h5>{{ printerItem.brand +\" \" +  printerItem.model }}</h5>\n                    <div class=\"img-wrap\">\n                      <img :src=\"printerItem.image_url\" alt=\"\">\n                    </div>\n\n                  </div>\n                  <div class=\"line\"></div>\n                  <div class=\"printer-right\">\n                    <ol>\n                      <li>{{ $t('1. Unbox and assemble the 3D printer following the manufacturers instructions') }}</li>\n                      <li>{{ $t('2. Power on the 3D printer and make sure it is connected to WiFi.') }}</li>\n                      <li>{{ $t('3. Tap “Next” when you are ready.') }}</li>\n                    </ol>\n\n                  </div>\n                </div>\n                <div class=\"d-flex justify-content-between align-items-center button-wrap\">\n                  <div class=\"back\" @click=\"$router.back()\">\n                    <i class=\"fas fa-chevron-left\"></i>\n                    <span> {{ $t(\"Back\") }}</span>\n                  </div>\n                    <b-button variant=\"primary\" @click=\"goForward\">\n                      {{ $t(\"Next\") }}\n                    </b-button>\n                </div>\n                <div class=\"text-center mt-5 wizard-default-font\">\n                  <i18next :translation=\"$t(`Need help? Check out the {localizedDom}`)\">\n                    <template #localizedDom>\n                      <a target=\"_blank\" :href=\"targetKlipper? getDocUrl('/user-guides/klipper-setup/'):getDocUrl('/user-guides/octoprint-plugin-setup/')\">{{$t(\"step-by-step set up guide\")}}.</a>\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport PrinterProgress from '../../components/printers/wizard/PrinterProgress.vue';\nexport default {\n  components: {\n    PageLayout,\n    PrinterProgress\n  },\n  computed: {\n    printerItem(){\n      if(this.$route.query.printerItem){\n        return JSON.parse(this.$route.query.printerItem)\n      }\n      return\n    },\n    targetOctoPrint() {\n      return this.$route.params.targetPlatform === 'octoprint'\n    },\n    targetKlipperPreInstall() {\n      return this.$route.params.targetPlatform === 'klipper-preinstalled'\n    },\n    targetKlipperGeneric() {\n      return this.$route.params.targetPlatform === 'klipper-generic'\n    },\n    targetKlipper() {\n      return this.$route.params.targetPlatform.startsWith('klipper-');\n    },\n  },\n  methods: {\n    goForward() {\n      this.$router.push({\n        path: `/printers/wizard/link/${this.$route.params.targetPlatform}/`,\n        query: {\n          ...this.$route.query,\n        }\n      });\n    },\n  },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.octoprint-image {\n  width: 100%; \n  margin-bottom: 1em;\n}\n.form-container {\n  .klipper-pre-install-wrap {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n\n    img {\n      width: 150px;\n    }\n\n    .text-wrap {\n      width: 70%;\n      margin-top:20px;\n      h4 {\n        color: #EBEBEB;\n        font-size: 22px;\n        line-height:34px;\n        margin-top: 1em;\n        font-weight: 600;\n      }\n      ol{\n        padding-left:15px;\n        margin-top:8px;\n        li{\n          margin-top:10px;\n        }\n      }\n      .find-printer-link {\n        color: var(--color-primary);\n        i {\n          transform: rotate(45deg);\n        }\n        a {\n          margin-right: 4px;\n          font-weight: 600;\n          text-decoration: underline;\n        }\n      }\n    }\n  }\n  .octo-wrap{\n    img{\n      width:100%;\n    }\n  }\n  .klipper-wrap{\n    color:#EBEBEB;\n    font-size:20px;\n  }\n  .printer-item{\n    display:flex;\n    justify-content: space-between;\n    align-items:center;\n    gap:40px;\n\n    .printer-left{\n      flex:1;\n      display:flex;\n      flex-direction: column;\n      align-items:center;\n\n      .img-wrap{\n        margin-top:20px;\n        background-color: var(--color-surface-primary);\n        border-radius:var(--border-radius-lg);\n        padding:20px;\n        img{\n          width:300px;\n        }\n      }\n    }\n    .line{\n      align-self: stretch;\n      width:1px;\n      background-color: #fff;\n\n    }\n    .printer-right{\n      flex:1;\n      p{\n        margin-bottom:30px;\n        font-size:20px;\n      }\n    }\n  }\n  .button-wrap{\n    margin-top:80px;\n    .back{\n      cursor: pointer;\n    }\n  }\n\n}\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ObicoInstallationGuidePage.vue?vue&type=template&id=3e025757&scoped=true&\"\nimport script from \"./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"\nexport * from \"./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ObicoInstallationGuidePage.vue?vue&type=style&index=0&id=3e025757&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3e025757\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-sm-12 p-4\"},[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[(_vm.verifiedPrinter)?_c('div',{staticClass:\"text-center py-5\"},[_c('svg',{staticClass:\"success-checkmark\"},[_c('use',{attrs:{\"href\":\"#svg-success-checkmark\"}})]),_c('h3',{staticClass:\"pb-4\"},[_vm._v(_vm._s(_vm.$t(\"Successfully linked to your account!\")))]),_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"},[_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.printer_name,\"saving\":_vm.saving.printer_name}},[_c('div',{staticClass:\"printer-name-input\"},[_c('div',{staticClass:\"edit-icon\"},[_c('i',{staticClass:\"fas fa-pen\"})]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.verifiedPrinter.name),expression:\"verifiedPrinter.name\"}],staticClass:\"dark\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('Printer name')},domProps:{\"value\":(_vm.verifiedPrinter.name)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.$set(_vm.verifiedPrinter, \"name\", $event.target.value)},_vm.updatePrinterName]}})])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Give your printer a shiny name.\"))+\" \")])])],1),_c('br'),_c('br'),_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"},[(_vm.redirectToTunnelCreation)?_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.redirectToTunnelCreation}},[_vm._v(_vm._s(_vm.$t(\"Authorize App Access\")))])]):_c('div',[_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t(\"Go Check Out Printer Feed!\")))])]),_c('div',{staticClass:\"mt-5\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-block mx-auto\",attrs:{\"href\":\"/user_preferences/notification_twilio/\"}},[_vm._v(_vm._s(_vm.$t(\"Add Phone Number\")))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Receive text (SMS) in case of print failures.\"))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-block mx-auto\",attrs:{\"href\":_vm.editPrinterUrl}},[_vm._v(_vm._s(_vm.$t(\"Change Printer Settings\")))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You can always change it later.\"))+\" \")])])])])]):_vm._e()])])])])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"col-sm-12 p-4\">\n\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <div v-if=\"verifiedPrinter\" class=\"text-center py-5\">\n                <svg class=\"success-checkmark\">\n                  <use href=\"#svg-success-checkmark\" />\n                </svg>\n                <h3 class=\"pb-4\">{{ $t(\"Successfully linked to your account!\") }}</h3>\n                <div\n                  class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"\n                >\n                  <saving-animation\n                    :errors=\"errorMessages.printer_name\"\n                    :saving=\"saving.printer_name\"\n                  >\n                    <div class=\"printer-name-input\">\n                      <div class=\"edit-icon\">\n                        <i class=\"fas fa-pen\"></i>\n                      </div>\n                      <input\n                        v-model=\"verifiedPrinter.name\"\n                        type=\"text\"\n                        class=\"dark\"\n                        :placeholder=\"$t('Printer name')\"\n                        @input=\"updatePrinterName\"\n                      />\n                    </div>\n                  </saving-animation>\n                  <div>\n                    <div class=\"text-muted mx-auto text-center font-weight-light\">\n                      {{$t(\"Give your printer a shiny name.\")}}\n                    </div>\n                  </div>\n                </div>\n                <br /><br />\n                <div\n                  class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"\n                >\n                  <div v-if=\"redirectToTunnelCreation\" class=\"mt-4\">\n                    <a\n                      :href=\"redirectToTunnelCreation\"\n                      class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                      >{{ $t(\"Authorize App Access\") }}</a\n                    >\n                  </div>\n                  <div v-else>\n                    <div class=\"mt-4\">\n                      <a href=\"/printers/\" class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                        >{{ $t(\"Go Check Out Printer Feed!\") }}</a\n                      >\n                    </div>\n                    <div class=\"mt-5\">\n                      <a\n                        href=\"/user_preferences/notification_twilio/\"\n                        class=\"btn btn-outline-secondary btn-block mx-auto\"\n                        >{{ $t(\"Add Phone Number\") }}</a\n                      >\n                    </div>\n                    <div>\n                      <div class=\"text-muted mx-auto text-center font-weight-light\">\n                        {{$t(\"Receive text (SMS) in case of print failures.\")}}\n                      </div>\n                    </div>\n                    <div class=\"mt-4\">\n                      <a :href=\"editPrinterUrl\" class=\"btn btn-outline-secondary btn-block mx-auto\"\n                        >{{ $t(\"Change Printer Settings\") }}</a\n                      >\n                    </div>\n                    <div>\n                      <div class=\"text-muted mx-auto text-center font-weight-light\">\n                        {{$t(\"You can always change it later.\")}}\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\n\nimport PageLayout from '@src/components/PageLayout.vue'\nimport SavingAnimation from '@src/components/SavingAnimation.vue'\nimport urls from '@config/server-urls'\n\nexport default {\n  components: {\n    PageLayout,\n    SavingAnimation,\n  },\n  data() {\n    return {\n      verifiedPrinter: null,\n      saving: {},\n      errorMessages: {},\n      delayedSubmit: {\n        // Make pause before sending new value to API\n        printer_name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n      },\n    }\n  },\n  computed: {\n    redirectToTunnelCreation() {\n      return new URLSearchParams(window.location.search).get('redirectToTunnelCreation')\n    },\n    editPrinterUrl() {\n      return `/printers/${this.verifiedPrinter.id}/`\n    },\n\n\n  },\n  created() {\n    this.fetchPrinter()\n  },\n  methods: {\n    async fetchPrinter() {\n      const response = await axios.get(urls.printer(this.$route.params.printerId))\n      this.verifiedPrinter = response.data\n    },\n    setSavingStatus(propName, status) {\n      if (status) {\n        delete this.errorMessages[propName]\n      }\n      this.$set(this.saving, propName, status)\n    },\n    updatePrinterName() {\n      if ('name' in this.verifiedPrinter && this.verifiedPrinter.name) {\n        const delayInfo = this.delayedSubmit['printer_name']\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n        this.delayedSubmit['printer_name']['timeoutId'] = setTimeout(() => {\n          this.setSavingStatus('printer_name', true)\n          // Make request to API\n          return axios\n            .patch(urls.printer(this.verifiedPrinter.id), {\n              name: this.verifiedPrinter.name,\n            })\n            .then(() => {\n              this.setSavingStatus('printer_name', false)\n            })\n            .catch((error) => {\n              this.errorDialog(error, 'Failed to update printer name')\n            })\n        }, delayInfo['delay'])\n        return\n      } else {\n        const delayInfo = this.delayedSubmit['printer_name']\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AddPrinterSuccessPage.vue?vue&type=template&id=86b2242c&scoped=true&\"\nimport script from \"./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"\nexport * from \"./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"86b2242c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"printer-name truncated\"},[_vm._v(\" \"+_vm._s(_vm.printer ? _vm.printer.name : '')+\" \")])]},proxy:true},{key:\"topBarRight\",fn:function(){return [(_vm.printer)?_c('div',{staticClass:\"action-panel\"},[_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":\"#\",\"title\":\"Share\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onSharePrinter()}}},[_c('i',{staticClass:\"fas fa-share-alt fa-lg\"}),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"Share\")))])]),_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/tunnels/${_vm.printer.id}/`,\"title\":\"OctoPrint Tunnel\"}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-tunnel\"}})]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"OctoPrint Tunnel\")))])]),_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/printers/${_vm.printer.id}/`,\"title\":\"Configure\"}},[_c('i',{staticClass:\"fas fa-wrench\"}),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"Configure\")))])]),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}],null,false,3452768261)},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'share',\n              icon: 'fas fa-share-alt fa-lg',\n              title: _vm.$t('Share'),\n              callback: true,\n            },\n            {\n              key: 'tunnel',\n              svgIcon: 'svg-tunnel',\n              title: _vm.$t('OctoPrint Tunnel'),\n              href: `/tunnels/${_vm.printer.id}/`,\n            },\n            {\n              key: 'settings',\n              icon: 'fas fa-wrench',\n              title: _vm.$t('Configure'),\n              href: `/printers/${_vm.printer.id}/`,\n            },\n          ]},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked}})],1)],1):_vm._e()]},proxy:true},{key:\"content\",fn:function(){return [(!_vm.printer)?_c('loading-placeholder'):_c('div',{staticClass:\"page-container\",attrs:{\"fluid\":\"\"}},[_c('div',{staticClass:\"widgets-container\"},[_vm._l((_vm.widgets),function(widget){return [(_vm.isWidgetVisible(widget))?_c(widget.component,{key:widget.id,tag:\"component\",attrs:{\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm,\"print\":_vm.lastPrint},on:{\"sendPrinterAction\":_vm.onSendPrinterAction,\"notAFailureClicked\":_vm.onNotAFailureClicked,\"updateSettings\":_vm.onUpdateSettings}}):_vm._e()]}),_c('div',{staticClass:\"extra-actions\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Additional Actions\")))]),_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":_vm.onReorderClicked}},[_c('i',{staticClass:\"fas fa-arrows-alt-v\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Reorder\"))+\" & \"+_vm._s(_vm.$t(\"Hide\"))+\" \")]),_c('div',{staticClass:\"text-muted extra-actions-explanation\"},[_c('small',[_vm._v(_vm._s(_vm.$t(\"Customize this page for each of your printers by reodering or hiding cards above.\")))])]),_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-primary\",\"href\":\"/printers/wizard/\"}},[_c('i',{staticClass:\"fas fa-plus\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Add Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted extra-actions-explanation\"},[_c('small',[_vm._v(_vm._s(_vm.$t(\"Link another printer to {brandName}.\",{brandName:_vm.$syndicateText.brandName})))])])],1)],2),_c('div',{staticClass:\"stream-container\"},[_c('div',{staticClass:\"header-container\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('Webcam')))]),_c('div',{staticClass:\"d-flex align-items-center\"},[(_vm.webcams.length > 1)?_c('b-dropdown',{staticClass:\"webcam-dropdown\",attrs:{\"block\":\"\",\"size\":\"sm\",\"variant\":\"link\",\"toggle-class\":\"text-decoration-none\",\"no-caret\":\"\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fa fa-camera\",attrs:{\"aria-hidden\":\"true\"}}),_vm._v(\" \"+_vm._s(!!_vm.selectedWebcam ? (_vm.selectedWebcam.name || 'Primary') : 'All')+\" \"),_c('i',{staticClass:\"fa fa-chevron-down\",attrs:{\"aria-hidden\":\"true\"}})]},proxy:true}],null,false,255726031)},[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"WEBCAM SELECTION\")))]),_vm._l((_vm.webcams),function(webcam,index){return _c('b-dropdown-item',{key:index,attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.chooseWebcam(index, webcam.stream_id)}}},[_vm._v(_vm._s(webcam.name || 'Primary'))])}),_c('b-dropdown-item',{on:{\"click\":function($event){return _vm.chooseWebcam('all')}}},[_vm._v(_vm._s(_vm.$t('All')))])],2):_c('div',{staticClass:\"mr-3\"},[_c('i',{staticClass:\"fa fa-camera\",attrs:{\"aria-hidden\":\"true\"}}),_vm._v(\" \"+_vm._s(_vm.webcams.length ? _vm.webcams[0].name || 'Primary' : '')+\" \")])],1)]),(_vm.webcams.length || _vm.printer?.pic?.img_url)?_c('b-card-text',{staticClass:\"px-0 py-0 content d-inline-block\",staticStyle:{\"width\":\"100%\"}},[_c('b-row',[_c('b-col',{staticClass:\"pb-0\",staticStyle:{\"position\":\"relative\"}},[_c('b-container',{staticClass:\"p-0\",attrs:{\"fluid\":\"\"}},[_c('b-row',{staticStyle:{\"flex-direction\":\"column\",\"align-items\":\"center\"},attrs:{\"no-gutters\":\"\"}},[(_vm.webcams.length === 0 && _vm.printer?.pic?.img_url)?_c('b-col',{key:_vm.printer?.pic?.img_url,attrs:{\"cols\":12}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"autoplay\":true,\"stickyStreamingSrc\":'IMAGE'}})],1)]):_vm._e(),_vm._l((_vm.webcams),function(webcam,index){return _c('b-col',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isWebcamSelected(webcam)),expression:\"isWebcamSelected(webcam)\"}],key:index},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"webrtc\":_vm.printerComm.webrtcConnections.get(webcam.name),\"autoplay\":_vm.user.is_pro,\"webcam\":webcam,\"halfHeight\":_vm.webcams.length > 1 && !_vm.selectedWebcam},on:{\"onRotateRightClicked\":(deg) => _vm.handleRotateRightClicked(deg, webcam.stream_id)}})],1)])})],2)],1)],1)],1)],1):_vm._e()],1)])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.isPrinting ? _vm.$t('Print Progress') : _vm.$t('Last Print')))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[(_vm.print)?[_c('div',{staticClass:\"header\"},[_c('g-code-details',{staticClass:\"g-code-details\",attrs:{\"file\":_vm.print.g_code_file || { filename: _vm.print.filename },\"show-open-button\":_vm.print.g_code_file &&\n              !_vm.print.g_code_file.resident_printer &&\n              !_vm.print.g_code_file.deleted,\"show-details\":false}})],1),_c('div',{staticClass:\"content\"},[_c('div',{staticClass:\"details\"},[(!_vm.isPrinting)?[_c('div',{staticClass:\"info-line no-border\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Status\")))])]),_c('div',{staticClass:\"value\"},[(!_vm.print.status.isActive)?_c('div',{staticClass:\"print-status-color\",class:_vm.print.status.key},[_vm._v(\" \"+_vm._s(_vm.print.status.title)+\" \")]):_c('b-spinner',{attrs:{\"small\":\"\"}})],1)]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Started\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.print.started_at.format('MMM D, YYYY h:mm a')))])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Duration\")))])]),(!_vm.print.status.isActive)?_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.duration || '-')+\" \")]):_c('b-spinner',{attrs:{\"small\":\"\"}})],1)]:[(_vm.isPrinting)?_c('div',{staticClass:\"progress-container\"},[_c('div',{staticClass:\"progress-bar-wrapper\"},[_c('div',{staticClass:\"progress-bar-inner\",style:(`width: ${_vm.printProgressPercentage}%`)})]),_c('div',{staticClass:\"percentage-progress\"},[_vm._v(_vm._s(_vm.printProgressPercentage)+\"%\")])]):_vm._e(),_c('div',{staticClass:\"info-line no-border\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Status\")))])]),_c('div',{staticClass:\"value\",class:'text-' + _vm.printer.calculatedStateColor()},[_vm._v(\" \"+_vm._s(_vm.printer.calculatedState())+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'layer-group']}})],1),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Layer\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.layerProgress)+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-stopwatch\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Remaining\")))])]),_c('div',{staticClass:\"value\"},[(_vm.secondsLeft)?_c('span',[_vm._v(_vm._s(_vm.humanizedDuration(_vm.secondsLeft)))]):_c('span',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Calculating...\")))])])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-flag-checkered\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Finishing at\")))])]),_c('div',{staticClass:\"value\"},[(_vm.finishingAt)?_c('span',[_vm._v(_vm._s(_vm.finishingAt))]):_c('span',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Calculating...\")))])])]),_c('collapsable-details',[_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Started\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.started_at.format(_vm.DATE_TIME_FORMAT))+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-stopwatch\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Elapsed\")))])]),_c('div',{staticClass:\"value\"},[(_vm.timeElapsed)?_c('span',[_vm._v(_vm._s(_vm.timeElapsed))]):_c('b-spinner',{attrs:{\"small\":\"\"}})],1)]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'ruler-vertical']}})],1),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Z-height\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.mmProgress)+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-stopwatch\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total time\")))])]),(_vm.timeTotal)?_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.timeTotal)+\" \")]):_c('span',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Calculating...\")))])]),(_vm.print.filament_used)?_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'ruler-vertical']}})],1),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total filament\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.humanizedFilamentUsage(_vm.print.filament_used))+\" \")])]):_vm._e()])]],2),(!_vm.isPrinting)?_c('div',{staticClass:\"actions\"},[_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\",\"href\":`/prints/${_vm.print.id}`}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Open Print\"))+\" \")]),(_vm.file.url)?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"secondary\",\"disabled\":_vm.isPrintStarting},on:{\"click\":_vm.onRepeatClicked}},[(_vm.isPrintStarting)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-redo\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Reprint\"))+\" \")],1):_vm._e()],1):_vm._e()])]:[_c('p',{staticClass:\"empty-state-text\"},[_vm._v(_vm._s(_vm.$t(\"No prints found\")))])]],2)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>{{ isPrinting ? $t('Print Progress') : $t('Last Print') }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <template v-if=\"print\">\n          <div class=\"header\">\n            <g-code-details\n              :file=\"print.g_code_file || { filename: print.filename }\"\n              :show-open-button=\"\n                print.g_code_file &&\n                !print.g_code_file.resident_printer &&\n                !print.g_code_file.deleted\n              \"\n              :show-details=\"false\"\n              class=\"g-code-details\"\n            />\n          </div>\n\n          <div class=\"content\">\n            <div class=\"details\">\n              <!-- Last Print -->\n              <template v-if=\"!isPrinting\">\n                <div class=\"info-line no-border\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                    <div class=\"title\">{{ $t(\"Status\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    <div\n                      v-if=\"!print.status.isActive\"\n                      class=\"print-status-color\"\n                      :class=\"print.status.key\"\n                    >\n                      {{ print.status.title }}\n                    </div>\n                    <!-- Show loader if printer not marked as ended yet -->\n                    <b-spinner v-else small></b-spinner>\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                    <div class=\"title\">{{ $t(\"Started\") }}</div>\n                  </div>\n                  <div class=\"value\">{{ print.started_at.format('MMM D, YYYY h:mm a') }}</div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-clock\"></i></div>\n                    <div class=\"title\">{{ $t(\"Duration\") }}</div>\n                  </div>\n                  <div v-if=\"!print.status.isActive\" class=\"value\">\n                    {{ print.duration || '-' }}\n                  </div>\n                  <!-- Show loader if printer not marked as ended yet -->\n                  <b-spinner v-else small></b-spinner>\n                </div>\n              </template>\n\n              <!-- Print Progress -->\n              <template v-else>\n                <div v-if=\"isPrinting\" class=\"progress-container\">\n                  <div class=\"progress-bar-wrapper\">\n                    <div\n                      class=\"progress-bar-inner\"\n                      :style=\"`width: ${printProgressPercentage}%`\"\n                    ></div>\n                  </div>\n                  <div class=\"percentage-progress\">{{ printProgressPercentage }}%</div>\n                </div>\n\n                <div class=\"info-line no-border\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                    <div class=\"title\">{{ $t(\"Status\") }}</div>\n                  </div>\n                  <div class=\"value\" :class=\"'text-' + printer.calculatedStateColor()\">\n                    {{ printer.calculatedState() }}\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\">\n                      <font-awesome-icon :icon=\"['fas', 'layer-group']\" />\n                    </div>\n                    <div class=\"title\">{{ $t(\"Layer\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    {{ layerProgress }}\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\">\n                      <i class=\"fas fa-stopwatch\"></i>\n                    </div>\n                    <div class=\"title\">{{ $t(\"Remaining\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    <span v-if=\"secondsLeft\">{{ humanizedDuration(secondsLeft) }}</span>\n                    <span v-else class=\"text-secondary\">{{ $t(\"Calculating...\") }}</span>\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-flag-checkered\"></i></div>\n                    <div class=\"title\">{{ $t(\"Finishing at\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    <span v-if=\"finishingAt\">{{ finishingAt }}</span>\n                    <span v-else class=\"text-secondary\">{{ $t(\"Calculating...\") }}</span>\n                  </div>\n                </div>\n                <collapsable-details>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"Started\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ print.started_at.format(DATE_TIME_FORMAT) }}\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-stopwatch\"></i></div>\n                      <div class=\"title\">{{ $t(\"Elapsed\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      <span v-if=\"timeElapsed\">{{ timeElapsed }}</span>\n                      <b-spinner v-else small></b-spinner>\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\">\n                        <font-awesome-icon :icon=\"['fas', 'ruler-vertical']\" />\n                      </div>\n                      <div class=\"title\">{{ $t(\"Z-height\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ mmProgress }}\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\">\n                        <i class=\"fas fa-stopwatch\"></i>\n                      </div>\n                      <div class=\"title\">{{ $t(\"Total time\") }}</div>\n                    </div>\n                    <div v-if=\"timeTotal\" class=\"value\">\n                      {{ timeTotal }}\n                    </div>\n                    <span v-else class=\"text-secondary\">{{ $t(\"Calculating...\") }}</span>\n                  </div>\n                  <div class=\"info-line\" v-if=\"print.filament_used\">\n                    <div class=\"label\">\n                      <div class=\"icon\">\n                        <font-awesome-icon :icon=\"['fas', 'ruler-vertical']\" />\n                      </div>\n                      <div class=\"title\">{{ $t(\"Total filament\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ humanizedFilamentUsage(print.filament_used) }}\n                    </div>\n                  </div>\n                </collapsable-details>\n              </template>\n            </div>\n\n            <div v-if=\"!isPrinting\" class=\"actions\">\n              <b-button\n                variant=\"outline-secondary\"\n                class=\"custom-button\"\n                :href=\"`/prints/${print.id}`\"\n              >\n                {{$t(\"Open Print\")}}\n              </b-button>\n              <b-button\n                v-if=\"file.url\"\n                variant=\"secondary\"\n                class=\"custom-button\"\n                :disabled=\"isPrintStarting\"\n                @click=\"onRepeatClicked\"\n              >\n                <b-spinner v-if=\"isPrintStarting\" small></b-spinner>\n                <i v-else class=\"fas fa-redo\"></i>\n                {{$t(\"Reprint\")}}\n              </b-button>\n            </div>\n          </div>\n        </template>\n        <template v-else>\n          <p class=\"empty-state-text\">{{ $t(\"No prints found\") }}</p>\n        </template>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport moment from 'moment'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport GCodeDetails from '@src/components/GCodeDetails.vue'\nimport { humanizedDuration, timeFromNow, humanizedFilamentUsage } from '@src/lib/formatters'\nimport { sendToPrint, confirmPrint } from '@src/components/g-codes/sendToPrint'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport CollapsableDetails from '@src/components/CollapsableDetails.vue'\n\nconst DATE_TIME_FORMAT = 'MMM D, h:mm a'\n\nexport default {\n  name: 'PrintProgressWidget',\n\n  components: {\n    WidgetTemplate,\n    GCodeDetails,\n    CollapsableDetails,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    print: {\n      type: Object,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      DATE_TIME_FORMAT,\n      timeElapsed: null,\n      finishingAt: null,\n      startedAt: null,\n      printProgressPercentage: 0,\n      extraVisible: false,\n    }\n  },\n\n  computed: {\n    file() {\n      return this.print?.g_code_file || {}\n    },\n    isPrinting() {\n      return this.printer.isActive() && this.printer.progressCompletion() < 100\n    },\n    isPrintStarting() {\n      return this.printer.inTransientState()\n    },\n    mmProgress() {\n      let progressInMillimeters\n\n      const progressMillimeters = this.printer.status?.currentZ\n      const totalMillimeters = this.printer.status?.file_metadata?.analysis?.printingArea?.maxZ\n\n      if ((progressMillimeters || progressMillimeters == 0) && totalMillimeters) {\n        progressInMillimeters = `${progressMillimeters.toFixed(2)}/${totalMillimeters.toFixed(\n          2\n        )} mm`\n      }\n\n      return progressInMillimeters || '--/--'\n    },\n    layerProgress() {\n      let progressInLayers\n\n      const progressLayers = this.printer.status?.currentLayerHeight\n      const totalLayers = this.printer.status?.file_metadata?.obico?.totalLayerCount\n      if ((progressLayers || progressLayers == 0) && totalLayers) {\n        progressInLayers = `${Math.round(progressLayers)}/${Math.round(totalLayers)}`\n      }\n\n      return progressInLayers || '--/--'\n    },\n    timeTotal() {\n      let secs = null\n      if (this.secondsPrinted && this.secondsLeft) {\n        secs = this.secondsPrinted + this.secondsLeft\n        return humanizedDuration(secs)\n      }\n      return null\n    },\n    secondsPrinted() {\n      return this.printer?.status?.progress?.printTime ?? null\n    },\n    secondsLeft() {\n      return this.printer?.status?.progress?.printTimeLeft ?? null\n    },\n  },\n\n  watch: {\n    printer: {\n      handler: function (newValue, oldValue) {\n        if (this.isPrinting) {\n          this.updatePrintProgress()\n        }\n      },\n      deep: true,\n    },\n  },\n\n  mounted() {\n    if (this.isPrinting) {\n      this.updatePrintProgress()\n    }\n  },\n\n  unmounted() {\n    clearInterval(this.printerStateCheckInterval)\n  },\n\n  methods: {\n    humanizedDuration,\n    humanizedFilamentUsage,\n    toggleZHeightProgressType() {\n      this.preferZHeightProgressInLayers = !this.preferZHeightProgressInLayers\n      setLocalPref('preferZHeightProgressInLayers', this.preferZHeightProgressInLayers)\n    },\n    updatePrintProgress() {\n      if (!this.isPrinting) return\n      if (!this.print) return\n\n      // Time elapsed\n      const elapsed = moment.duration(moment().diff(this.print.started_at))\n      this.timeElapsed = this.print.status.isActive ? humanizedDuration(elapsed.asSeconds()) : null\n\n      this.finishingAt =\n        typeof this.secondsLeft === 'number'\n          ? timeFromNow(this.secondsLeft, DATE_TIME_FORMAT)\n          : null\n\n      // Progress bar\n      this.printProgressPercentage = Math.round(this.printer.progressCompletion())\n      this.printProgressMillimeters = Math.round(this.printer.status?.currentZ || 0)\n      this.printMillimetersTotal = Math.round(\n        this.printer.status?.file_metadata?.analysis?.printingArea?.maxZ || 0\n      )\n    },\n\n    onRepeatClicked() {\n      if (this.isPrinting) return\n\n      if (!this.print) {\n        console.error(\"Can't repeat last print: no last print\")\n        return\n      }\n      if (this.print.g_code_file.deleted) {\n        console.error(\"Can't repeat last print: G-Code deleted\")\n        return\n      }\n      if (!this.print.g_code_file.url) {\n        // Usually OctoPrint/Klipper files\n        console.error(\"Can't repeat last print: no G-Code file in storage\")\n        return\n      }\n\n      confirmPrint(this.print.g_code_file, this.printer).then(() => {\n        sendToPrint({\n          printer: this.printer,\n          gcode: this.print.g_code_file,\n          isCloud: this.print.g_code_file?.resident_printer === null,\n          Swal: this.$swal,\n        })\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  padding-bottom: 1rem\n\n.header\n  margin-bottom: 1rem\n\n.info-line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  gap: .5rem\n  border-top: 1px solid var(--color-divider-muted)\n  &.no-border\n    border-top: none\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      width: 1rem\n      text-align: center\n  .value\n    font-weight: bold\n\n.g-code-details\n  padding: 0\n  width: 100%\n\n.actions\n  margin-top: 1rem\n  display: flex\n  justify-content: center\n  gap: 1rem\n\n.progress-container\n  font-weight: bold\n  margin-bottom: 1rem\n  display: flex\n  gap: 1rem\n  align-items: center\n  .progress-bar-wrapper\n    height: 12px\n    flex: 1\n    border-radius: 999px\n    background-color: var(--color-background)\n    position: relative\n    top: 1px\n    overflow: hidden\n  .progress-bar-inner\n    height: 100%\n    // border-radius: 999px\n    background-color: var(--color-primary)\n.empty-state-text\n  text-align: center\n  font-size: 1.125rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintProgressWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintProgressWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintProgressWidget.vue?vue&type=template&id=5b7d73ac&scoped=true&\"\nimport script from \"./PrintProgressWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintProgressWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintProgressWidget.vue?vue&type=style&index=0&id=5b7d73ac&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5b7d73ac\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Failure Detection\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[(_vm.isEnt)?_c('div',{staticClass:\"dh-balance-wrapper\"},[_c('a',{staticClass:\"btn shadow-none action-btn icon-btn hours-btn\",style:({ marginRight: `${String(_vm.dhBadgeNum).length * 0.25}rem` }),attrs:{\"href\":\"/user_preferences/dh/\",\"title\":_vm.dhBadgeNum + ' '+_vm.$t('AI Detection Hours')}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-hour-glass\"}})]),_c('span',{staticClass:\"badge badge-light\",attrs:{\"id\":\"user-credits\"}},[_vm._v(_vm._s(_vm.dhBadgeNum))]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"AI Detection Hours\")))])])]):_vm._e(),_c('div',{staticClass:\"header\"},[_c('div',{staticClass:\"gauge-wrapper\"},[_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.printer.normalized_p,\"is-watching\":_vm.isWatching}})],1),(_vm.printer.not_watching_reason)?_c('div',{staticClass:\"overlay-info\"},[_c('muted-alert',{staticClass:\"muted-alert\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Not watching\"))+\" (\"+_vm._s(_vm.printer.not_watching_reason)+\"). \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/detective-not-watching/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Learn all possible reasons\"))+\" \"),_c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])])])])],1):_vm._e()]),_c('div',{staticClass:\"controls\"},[_c('div',{staticClass:\"line\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Enable AI failure detection\"))+\" \"),(!_vm.enableFailureDetection)?_c('div',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI failure detection is disabled. You are on your own.\"))+\" \")]):_vm._e()]),_c('div',{staticClass:\"switch\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'watching_enabled-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"watching_enabled\"},domProps:{\"checked\":_vm.enableFailureDetection},on:{\"click\":_vm.onFailureDetectionToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}})])])]),_c('div',{staticClass:\"line\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":'pause_on_failure-toggle-' + _vm.printer.id}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Pause on detected failures\"))+\" \"),(!_vm.pauseOnFailure)?_c('div',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You will still be alerted via notifications.\"))+\" \")]):_vm._e()]),_c('div',{staticClass:\"switch\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'pause_on_failure-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"pause_on_failure\"},domProps:{\"checked\":_vm.pauseOnFailure},on:{\"click\":_vm.onPauseOnFailureToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'pause_on_failure-toggle-' + _vm.printer.id}})])])])]),(_vm.printer.alertUnacknowledged())?_c('div',{staticClass:\"failure-detected-message\"},[_c('div',{staticClass:\"warning-message\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Failure Detected!\"))+\" \")]),_c('b-button',{attrs:{\"variant\":\"outline-warning custom-button\"},on:{\"click\":function($event){return _vm.onNotAFailureClicked($event)}}},[_vm._v(_vm._s(_vm.$t(\"Not a Failure?\")))])],1):_vm._e()])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>{{ $t(\"Failure Detection\") }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div v-if=\"isEnt\" class=\"dh-balance-wrapper\">\n          <a\n            href=\"/user_preferences/dh/\"\n            class=\"btn shadow-none action-btn icon-btn hours-btn\"\n            :style=\"{ marginRight: `${String(dhBadgeNum).length * 0.25}rem` }\"\n            :title=\"dhBadgeNum + ' '+$t('AI Detection Hours')\"\n          >\n            <svg class=\"custom-svg-icon\">\n              <use href=\"#svg-hour-glass\"></use>\n            </svg>\n            <span id=\"user-credits\" class=\"badge badge-light\">{{ dhBadgeNum }}</span>\n            <span class=\"sr-only\">{{ $t(\"AI Detection Hours\") }}</span>\n          </a>\n        </div>\n        <div class=\"header\">\n          <div class=\"gauge-wrapper\">\n            <failure-detection-gauge\n              :normalized-p=\"printer.normalized_p\"\n              :is-watching=\"isWatching\"\n            />\n          </div>\n          <div v-if=\"printer.not_watching_reason\" class=\"overlay-info\">\n            <muted-alert class=\"muted-alert\">\n              <span\n                >{{$t(\"Not watching\")}} ({{ printer.not_watching_reason }}).\n                <a\n                  :href=\"getDocUrl('/user-guides/detective-not-watching/')\"\n                  target=\"_blank\"\n                  >{{$t(\"Learn all possible reasons\")}}\n                  <small><i class=\"fas fa-external-link-alt\"></i></small></a\n              ></span>\n            </muted-alert>\n          </div>\n        </div>\n        <div class=\"controls\">\n          <div class=\"line\">\n            <label class=\"label\" :for=\"'watching_enabled-toggle-' + printer.id\">\n              {{$t(\"Enable AI failure detection\")}}\n              <div v-if=\"!enableFailureDetection\" class=\"text-muted\">\n                {{$t(\"AI failure detection is disabled. You are on your own.\")}}\n              </div>\n            </label>\n            <div class=\"switch\">\n              <div class=\"custom-control custom-switch\">\n                <input\n                  :id=\"'watching_enabled-toggle-' + printer.id\"\n                  type=\"checkbox\"\n                  name=\"watching_enabled\"\n                  class=\"custom-control-input update-printer\"\n                  :checked=\"enableFailureDetection\"\n                  @click=\"onFailureDetectionToggled\"\n                />\n                <label\n                  class=\"custom-control-label\"\n                  :for=\"'watching_enabled-toggle-' + printer.id\"\n                  style=\"font-size: 1rem\"\n                ></label>\n              </div>\n            </div>\n          </div>\n          <div class=\"line\">\n            <label class=\"label\" :for=\"'pause_on_failure-toggle-' + printer.id\">\n              {{ $t(\"Pause on detected failures\") }}\n              <div v-if=\"!pauseOnFailure\" class=\"text-muted\">\n                {{$t(\"You will still be alerted via notifications.\")}}\n              </div>\n            </label>\n            <div class=\"switch\">\n              <div class=\"custom-control custom-switch\">\n                <input\n                  :id=\"'pause_on_failure-toggle-' + printer.id\"\n                  type=\"checkbox\"\n                  name=\"pause_on_failure\"\n                  class=\"custom-control-input update-printer\"\n                  :checked=\"pauseOnFailure\"\n                  @click=\"onPauseOnFailureToggled\"\n                />\n                <label\n                  class=\"custom-control-label\"\n                  :for=\"'pause_on_failure-toggle-' + printer.id\"\n                  style=\"font-size: 1rem\"\n                ></label>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"printer.alertUnacknowledged()\" class=\"failure-detected-message\">\n          <div class=\"warning-message\">\n            <i class=\"fas fa-exclamation-triangle\"></i>\n            {{$t(\"Failure Detected!\")}}\n          </div>\n          <b-button variant=\"outline-warning custom-button\" @click=\"onNotAFailureClicked($event)\"\n            >{{ $t(\"Not a Failure?\") }}</b-button\n          >\n        </div>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport { user, settings } from '@src/lib/page-context'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport MutedAlert from '@src/components/MutedAlert.vue'\n\nexport default {\n  name: 'FailureDetectionWidget',\n\n  components: {\n    WidgetTemplate,\n    FailureDetectionGauge,\n    MutedAlert,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      user: null,\n      enableFailureDetection: false,\n      pauseOnFailure: false,\n      isEnt: false,\n    }\n  },\n\n  computed: {\n    dhBadgeNum() {\n      if (this.user && this.user.is_dh_unlimited) {\n        return 'Unlimited'\n      } else {\n        return Math.round(this.user.dh_balance)\n      }\n    },\n    isWatching() {\n      return !this.printer.not_watching_reason\n    },\n    notWatchingExplanation() {\n      if (this.isWatching) return ''\n      let reason = this.printer.not_watching_reason\n      return `${reason}`\n    },\n  },\n\n  created() {\n    this.user = user()\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.enableFailureDetection = this.printer.watching_enabled\n    this.pauseOnFailure = this.printer.action_on_failure === 'PAUSE'\n  },\n\n  methods: {\n    onFailureDetectionToggled() {\n      this.enableFailureDetection = !this.enableFailureDetection\n      this.$emit('updateSettings', {\n        settingName: 'watching_enabled',\n        settingValue: this.enableFailureDetection,\n      })\n    },\n    onPauseOnFailureToggled() {\n      this.pauseOnFailure = !this.pauseOnFailure\n      this.$emit('updateSettings', {\n        settingName: 'action_on_failure',\n        settingValue: this.pauseOnFailure ? 'PAUSE' : 'NONE',\n      })\n    },\n    onNotAFailureClicked(event) {\n      this.$emit('notAFailureClicked', event, false)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  padding-bottom: 1rem\n\n.header\n  position: relative\n  display: flex\n  justify-content: center\n  align-items: center\n  @media (max-width: 510px)\n    flex-direction: column\n\n  .overlay-info\n    position: absolute\n    left: 0\n    bottom: 0\n    right: 0\n    top: 0\n    display: flex\n    align-items: center\n    justify-content: center\n    .muted-alert\n      position: relative\n      z-index: 2\n    &::before\n      content: ''\n      position: absolute\n      left: 0\n      bottom: 0\n      right: 0\n      top: 0\n      background: var(--color-surface-secondary)\n      z-index: 1\n      opacity: 0.97\n\n.controls\n  margin-top: 1rem\n  .line\n    display: flex\n    justify-content: space-between\n    align-items: center\n    padding: 0.5rem 0\n    border-bottom: 1px solid var(--color-divider-muted)\n    &:last-of-type\n      border-bottom: none\n    .label\n      margin-bottom: 0\n      font-size: 1rem\n      .text-muted\n        font-size: 0.875rem\n\n.failure-detected-message\n  margin-top: 1rem\n  display: flex\n  gap: 1.5rem\n  align-items: center\n  @media (max-width: 510px)\n    flex-direction: column\n    gap: 0.75rem\n  .warning-message\n    background-color: var(--color-warning)\n    color: var(--color-on-warning)\n    padding: 0.625rem 1rem\n    border-radius: var(--border-radius-sm)\n    flex: 1\n    text-align: center\n    font-weight: bold\n    font-size: normal\n    i\n      margin-right: 0.25rem\n\n.dh-balance-wrapper\n  position: absolute\n  top: 8px\n  right: 12px\n.btn.hours-btn\n  padding-left: 0\n  padding-right: 0\n  width: 36px\n  position: relative\n  color: var(--color-text-primary)\n  .badge\n    position: absolute\n    left: 18px\n    top: 4px\n    border-radius: var(--border-radius-sm)\n    background-color: var(--color-primary)\n    height: auto\n    font-size: .625rem\n.custom-svg-icon\n  height: 1.3rem\n  width: 1.3rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FailureDetectionWidget.vue?vue&type=template&id=b62a7098&scoped=true&\"\nimport script from \"./FailureDetectionWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./FailureDetectionWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FailureDetectionWidget.vue?vue&type=style&index=0&id=b62a7098&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b62a7098\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Temperature Controls\")))]},proxy:true},{key:\"content\",fn:function(){return [_vm._t(\"content\",function(){return [_c('div',{staticClass:\"wrapper\"},[(_vm.show)?[_vm._l((_vm.temperatures),function(item,key){return _c('temperature-item',{key:key,attrs:{\"temp-key\":key,\"temp-item\":item,\"is-plugin-version-sufficient\":_vm.isPluginVersionSufficient},on:{\"TempEditClicked\":function($event){return _vm.onEditClicked(key, item)}}})}),(_vm.isPluginVersionSufficient)?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-primary\"},on:{\"click\":_vm.onTemperaturePresetsClicked}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Temperature Presets\"))+\" \")]):_vm._e()]:[_c('div',{staticClass:\"text-center mt-4\"},[_c('b-spinner'),_c('p',{staticClass:\"mt-2\"},[_vm._v(_vm._s(_vm.$t(\"Loading temperature...\")))])],1)]],2)]})]},proxy:true}],null,true)})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Presets\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"id_preset\"},model:{value:(_vm.currentPreset),callback:function ($$v) {_vm.currentPreset=$$v},expression:\"currentPreset\"}},_vm._l((_vm.allPresets),function(pre){return _c('b-form-select-option',{key:pre.name,attrs:{\"value\":pre.name}},[_vm._v(\" \"+_vm._s(pre.name)+\" \")])}),1)],1),_c('muted-alert',{staticClass:\"mt-4 mb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t('Temperature presets can be edited or added in {agentName} settings.',{agentName: _vm.agentName}))+\" \")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.currentPreset),expression:\"currentPreset\"}],attrs:{\"id\":\"selected-preset\",\"type\":\"hidden\"},domProps:{\"value\":(_vm.currentPreset)},on:{\"input\":function($event){if($event.target.composing)return;_vm.currentPreset=$event.target.value}}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div>\n      <h5>{{ $t(\"Presets\") }}:</h5>\n    </div>\n    <div>\n      <b-form-select id=\"id_preset\" v-model=\"currentPreset\" class=\"form-control\">\n        <b-form-select-option v-for=\"pre in allPresets\" :key=\"pre.name\" :value=\"pre.name\">\n          {{ pre.name }}\n        </b-form-select-option>\n      </b-form-select>\n    </div>\n\n    <muted-alert class=\"mt-4 mb-1\">\n      {{ $t('Temperature presets can be edited or added in {agentName} settings.',{agentName}) }}\n      \n    </muted-alert>\n\n    <input id=\"selected-preset\" v-model=\"currentPreset\" type=\"hidden\" />\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\n\nexport default {\n  name: 'TempPresets',\n\n  components: {\n    MutedAlert,\n  },\n\n  props: {\n    presets: {\n      type: Array,\n      required: true,\n    },\n    printer: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      currentPreset: null,\n    }\n  },\n\n  computed: {\n    allPresets() {\n      let presets = [...this.presets]\n      presets.push({ value: 0, name: 'OFF' })\n      return presets\n    },\n    agentName() {\n      return this.printer.agentDisplayName()\n    },\n  },\n\n  mounted() {\n    this.currentPreset = this.allPresets[0].name\n  },\n\n  methods: {},\n}\n</script>\n<style></style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempPresets.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempPresets.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TempPresets.vue?vue&type=template&id=be0e3f46&\"\nimport script from \"./TempPresets.vue?vue&type=script&lang=js&\"\nexport * from \"./TempPresets.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <widget-template>\n    <template #title>{{ $t(\"Temperature Controls\") }}</template>\n    <template #content>\n      <slot name=\"content\">\n        <div class=\"wrapper\">\n          <template v-if=\"show\">\n            <temperature-item\n              v-for=\"(item, key) in temperatures\"\n              :key=\"key\"\n              :temp-key=\"key\"\n              :temp-item=\"item\"\n              :is-plugin-version-sufficient=\"isPluginVersionSufficient\"\n              @TempEditClicked=\"onEditClicked(key, item)\"\n            />\n            <b-button\n              v-if=\"isPluginVersionSufficient\"\n              variant=\"outline-primary\"\n              class=\"custom-button\"\n              @click=\"onTemperaturePresetsClicked\"\n            >\n              {{$t(\"Temperature Presets\")}}\n            </b-button>\n          </template>\n          <template v-else>\n            <div class=\"text-center mt-4\">\n              <b-spinner></b-spinner>\n              <p class=\"mt-2\">{{ $t(\"Loading temperature...\") }}</p>\n            </div>\n          </template>\n        </div>\n      </slot>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport TempTargetEditor from '@src/components/printers/TempTargetEditor.vue'\nimport TempPresets from '@src/components/printers/TempPresets.vue'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport get from 'lodash/get'\nimport { temperatureDisplayName } from '@src/lib/utils'\nimport TemperatureItem from '@src/components/printers/TemperatureItem.vue'\n\nexport default {\n  name: 'TemperatureWidget',\n\n  components: {\n    WidgetTemplate,\n    TemperatureItem,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  computed: {\n    temperatures() {\n      const temperatures = {}\n      for (const [key, value] of Object.entries(get(this.printer, 'status.temperatures', {}))) {\n        if (Boolean(value.actual) && !isNaN(value.actual)) {\n          // Take out NaN, 0, null. Apparently printers like Prusa throws random temperatures here.\n          temperatures[key] = value\n        }\n      }\n      return temperatures\n    },\n    isPluginVersionSufficient() {\n      // If temp_profiles is missing, it's a plugin version too old to change temps\n      return get(this.printer, 'settings.temp_profiles') != undefined\n    },\n    show() {\n      return Object.keys(this.temperatures).length > 0\n    },\n  },\n\n  methods: {\n    temperatureDisplayName,\n    onEditClicked(key, item) {\n      if (!this.isPluginVersionSufficient || item.target === null) {\n        return\n      }\n\n      let tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n      let presets\n      let maxTemp = 350\n\n      if (key.search(/bed|chamber/) > -1) {\n        maxTemp = 140\n      }\n      if (key.search(/tool/) > -1) {\n        // OctoPrint uses 'extruder' for toolx heaters\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v['extruder'] }\n        })\n      } else {\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v[key] }\n        })\n      }\n\n      this.$swal\n        .openModalWithComponent(\n          TempTargetEditor,\n          {\n            presets: presets,\n            maxTemp: maxTemp,\n            curTarget: item.target,\n          },\n          {\n            title: 'Set ' + temperatureDisplayName(key) + ' Temperature',\n            confirmButtonText: 'Confirm',\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                target: parseInt(document.getElementById('target-temp').value),\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value) {\n            let targetTemp = result.value.target\n            this.handleSetTemp(key, targetTemp)\n          }\n        })\n    },\n    onTemperaturePresetsClicked() {\n      let tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n\n      this.$swal\n        .openModalWithComponent(\n          TempPresets,\n          {\n            presets: tempProfiles,\n            printer: this.printer,\n          },\n          {\n            title: `${this.$i18next.t('Temperature Presets')}`,\n            confirmButtonText: 'Apply',\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                preset: document.getElementById('selected-preset').value,\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value?.preset) {\n            this.applyTempPreset(result.value.preset)\n          }\n        })\n    },\n    applyTempPreset(preset) {\n      const tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n      let profile = tempProfiles.find((p) => p.name === preset)\n\n      const presetObj = {}\n\n      if (!profile) {\n        if (preset === 'OFF') {\n          presetObj.bed = 0\n          presetObj.extruder = 0\n          presetObj.chamber = 0\n        } else {\n          return\n        }\n      } else {\n        Object.entries(profile).forEach((p) => {\n          const presetName = p[0]\n          if (presetName.toLowerCase().includes('bed')) {\n            presetObj.bed = p[1]\n          } else if (\n            presetName.toLowerCase().includes('tool') ||\n            presetName.toLowerCase().includes('extruder')\n          ) {\n            presetObj.extruder = p[1]\n          } else if (presetName.toLowerCase().includes('chamber')) {\n            presetObj.chamber = p[1]\n          }\n        })\n      }\n\n      const temperatures = get(this.printer, 'status.temperatures', [])\n      Object.entries(temperatures).forEach((t) => {\n        const toolName = t[0]\n        if (toolName.toLowerCase().includes('bed')) {\n          this.handleSetTemp(toolName, presetObj.bed)\n        } else if (\n          toolName.toLowerCase().includes('tool') ||\n          toolName.toLowerCase().includes('extruder')\n        ) {\n          this.handleSetTemp(toolName, presetObj.extruder)\n        } else if (toolName.toLowerCase().includes('chamber') && presetObj.chamber) {\n          this.handleSetTemp(toolName, presetObj.chamber)\n        }\n      })\n    },\n    handleSetTemp(name, temp) {\n      this.printerComm.passThruToPrinter({\n        func: 'set_temperature',\n        target: '_printer',\n        args: [name, temp],\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n  padding-bottom: 1rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TemperatureWidget.vue?vue&type=template&id=85ef39ce&scoped=true&\"\nimport script from \"./TemperatureWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./TemperatureWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemperatureWidget.vue?vue&type=style&index=0&id=85ef39ce&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"85ef39ce\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [(_vm.activeMenu)?_c('div',{staticClass:\"nav-btn\",on:{\"click\":function($event){_vm.activeMenu = null}}},[_c('i',{staticClass:\"fas fa-arrow-left\"}),_vm._v(\"  \"+_vm._s(_vm.$t(\"Back\"))+\" \")]):_c('span',[_vm._v(_vm._s(_vm.$t(\"Printer Controls\")))])]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.activeMenu),expression:\"!activeMenu\"}],staticClass:\"home-menu\"},[_c('button',{staticClass:\"menu-button\",attrs:{\"disabled\":_vm.printer.isActive()},on:{\"click\":function($event){_vm.activeMenu = 'move-head'}}},[_c('svg',{staticClass:\"icon move-xy\"},[_c('use',{attrs:{\"href\":\"#svg-move-xy\"}})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Move Head\")))])]),_c('button',{staticClass:\"menu-button\",attrs:{\"disabled\":_vm.printer.isActive()},on:{\"click\":function($event){_vm.activeMenu = 'extrude'}}},[_c('svg',{staticClass:\"icon extruder\"},[_c('use',{attrs:{\"href\":\"#extruder\"}})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Extrude\")))])]),(_vm.printer.isAgentMoonraker())?_c('button',{staticClass:\"menu-button\",on:{\"click\":function($event){_vm.activeMenu = 'baby-step-z'}}},[_c('svg',{staticClass:\"icon move-z\"},[_c('use',{attrs:{\"href\":\"#svg-move-z\"}})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Baby Step Z\")))])]):_vm._e(),(!_vm.hideTunePrinter)?_c('button',{staticClass:\"menu-button\",on:{\"click\":function($event){_vm.activeMenu = 'tune-printer'}}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'gear']}}),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Tune Printer\")))])],1):_vm._e()]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'move-head'),expression:\"activeMenu === 'move-head'\"}],staticClass:\"control-panel move-head\"},[_c('div',{staticClass:\"main\"},[_c('div',{staticClass:\"toggles\"},_vm._l((_vm.xyzJogDistance.options),function(option){return _c('div',{key:'xyz-' + option,staticClass:\"pill\",class:{ active: option === _vm.xyzJogDistance.value },on:{\"click\":function($event){_vm.xyzJogDistance.value = option}}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0),_c('div',{staticClass:\"xy-move\"},[_c('div',{staticClass:\"left\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.x, _vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-left\"})]),_c('div',{staticClass:\"right\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.x, _vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-right\"})]),_c('div',{staticClass:\"up\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.y, _vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('div',{staticClass:\"down\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.y, _vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-down\"})]),_c('div',{staticClass:\"home\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.xy, _vm.directions.home)}}},[_c('i',{staticClass:\"fas fa-home\"})])]),_c('div',{staticClass:\"z-move\"},[_c('div',{staticClass:\"up\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.z, _vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('div',{staticClass:\"down\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.z, _vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-down\"})]),_c('div',{staticClass:\"home\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.z, _vm.directions.home)}}},[_c('i',{staticClass:\"fas fa-home\"})])])]),_c('div',{staticClass:\"additional\"},[_c('div',{staticClass:\"control-btn\",on:{\"click\":_vm.homeAll}},[_c('i',{staticClass:\"fas fa-home\"}),_vm._v(_vm._s(_vm.$t(\" Home All\")))]),_c('div',{staticClass:\"control-btn\",on:{\"click\":_vm.disableSteppers}},[_c('i',{staticClass:\"fas fa-power-off\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Disable Steppers\"))+\" \")])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'extrude'),expression:\"activeMenu === 'extrude'\"}],staticClass:\"control-panel extrude\"},[_c('div',{staticClass:\"main\"},[(_vm.showExtrudeControl)?[_c('div',{staticClass:\"toggles\"},_vm._l((_vm.extrudeJogDistance.options),function(option){return _c('div',{key:'xyz-' + option,staticClass:\"pill\",class:{ active: option === _vm.extrudeJogDistance.value },on:{\"click\":function($event){_vm.extrudeJogDistance.value = option}}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0),_c('div',{staticClass:\"main-buttons\"},[_c('div',{staticClass:\"control-btn\",on:{\"click\":function($event){return _vm.handleFilament(_vm.filamentDirections.retract)}}},[_c('i',{staticClass:\"fas fa-minus\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Retract\"))+\" \")]),_c('div',{staticClass:\"control-btn\",on:{\"click\":function($event){return _vm.handleFilament(_vm.filamentDirections.extrude)}}},[_c('i',{staticClass:\"fas fa-plus\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Extrude\"))+\" \")])])]:[_c('div',{staticClass:\"text-center mt-4\"},[_c('b-spinner'),_c('p',{staticClass:\"mt-2\"},[_vm._v(_vm._s(_vm.$t(\"Loading tools...\")))])],1)]],2),(_vm.showToolsSelector)?_c('div',{staticClass:\"additional\"},[_c('b-form-select',{staticClass:\"form-control tool-select\",model:{value:(_vm.activeTool),callback:function ($$v) {_vm.activeTool=$$v},expression:\"activeTool\"}},_vm._l((_vm.tools),function(item,key){return _c('b-form-select-option',{key:key,attrs:{\"value\":key}},[_vm._v(\" \"+_vm._s(_vm.temperatureDisplayName(key))+\" \")])}),1)],1):_vm._e(),(_vm.activeToolTemperature)?_c('div',{staticClass:\"extrude-temperature\"},[_c('div',{staticClass:\"temperature-icon\"},[_c('svg',[_c('use',{attrs:{\"href\":\"#extruder\"}})])]),_c('div',{staticClass:\"temperature-tool truncated\"},[_vm._v(_vm._s(_vm.activeToolDisplayName))]),_c('div',{staticClass:\"temperature-value\"},[_c('span',[_vm._v(_vm._s(_vm.activeToolActualTemperature))]),(_vm.activeToolTargetTemperature)?_c('span',{staticClass:\"temperature-target\"},[_vm._v(\" / \"+_vm._s(_vm.activeToolTargetTemperature)+\" \")]):_vm._e()])]):_vm._e()]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'baby-step-z'),expression:\"activeMenu === 'baby-step-z'\"}],staticClass:\"control-panel baby-step-z\"},[_c('div',{staticClass:\"main\"},[_c('div',{staticClass:\"toggles\"},_vm._l((_vm.zOffsetJogDistance.options),function(option){return _c('div',{key:'xyz-' + option,staticClass:\"pill\",class:{ active: option === _vm.zOffsetJogDistance.value },on:{\"click\":function($event){_vm.zOffsetJogDistance.value = option}}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0),_c('div',{staticClass:\"z-move\"},[_c('div',{staticClass:\"up\",on:{\"click\":function($event){return _vm.controlZOffset(_vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('div',{staticClass:\"down\",on:{\"click\":function($event){return _vm.controlZOffset(_vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-down\"})])])]),_c('div',{staticClass:\"additional\"},[_c('div',{staticClass:\"current-offset\"},[_c('div',{staticClass:\"label\"},[_vm._v(_vm._s(_vm.$t(\"Current Offset\")))]),_c('div',{staticClass:\"value\"},[(_vm.currentZOffset || typeof _vm.currentZOffset === 'number')?_c('span',[_vm._v(\" \"+_vm._s(_vm.currentZOffset)+\" \")]):_c('span',[_c('b-spinner',{attrs:{\"small\":\"\"}})],1)])])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'tune-printer'),expression:\"activeMenu === 'tune-printer'\"}],staticClass:\"control-panel tune-printer\"},[(!_vm.printer.isAgentMoonraker() || _vm.currentFeedRate !== null)?[_c('div',{staticClass:\"controls-title\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Feed Rate / Speed\")))]),_c('help-widget',{staticClass:\"help-message\",attrs:{\"id\":\"print-speed-widget-help\"}})],1),_c('div',{staticClass:\"controls\"},[_c('div',{staticClass:\"custom\"},[_c('b-input-group',{attrs:{\"prepend\":\"%\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('b-button',{attrs:{\"variant\":\"background\",\"disabled\":_vm.customFeedRateFactor === null || parseInt(_vm.customFeedRateFactor) < 1},on:{\"click\":function($event){return _vm.setPrintSpeed(_vm.customFeedRateFactor)}}},[_vm._v(_vm._s(_vm.$t(\"Apply\")))])]},proxy:true}],null,false,3696614275)},[_c('b-form-input',{attrs:{\"placeholder\":\"100\",\"type\":\"number\"},on:{\"focus\":function($event){return $event.target.select()}},model:{value:(_vm.customFeedRateFactor),callback:function ($$v) {_vm.customFeedRateFactor=$$v},expression:\"customFeedRateFactor\"}})],1)],1)])]:_vm._e(),(!_vm.printer.isAgentMoonraker() || _vm.currentFlowRate !== null)?[_c('div',{staticClass:\"controls-title\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Flow Rate\")))]),_c('help-widget',{staticClass:\"help-message\",attrs:{\"id\":\"flow-rate-widget-help\"}})],1),_c('div',{staticClass:\"controls\"},[_c('div',{staticClass:\"custom\"},[_c('b-input-group',{attrs:{\"prepend\":\"%\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('b-button',{attrs:{\"variant\":\"background\",\"disabled\":_vm.customFlowRateFactor === null || parseInt(_vm.customFlowRateFactor) < 1},on:{\"click\":function($event){return _vm.setFlowRate(_vm.customFlowRateFactor)}}},[_vm._v(_vm._s(_vm.$t(\"Apply\")))])]},proxy:true}],null,false,4188500917)},[_c('b-form-input',{attrs:{\"placeholder\":\"100\",\"type\":\"number\"},on:{\"focus\":function($event){return $event.target.select()}},model:{value:(_vm.customFlowRateFactor),callback:function ($$v) {_vm.customFlowRateFactor=$$v},expression:\"customFlowRateFactor\"}})],1)],1)])]:_vm._e(),(!_vm.printer.isAgentMoonraker() || _vm.currentFanSpeed !== null)?[_c('div',{staticClass:\"controls-title\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Fan Speed\")))]),_c('help-widget',{staticClass:\"help-message\",attrs:{\"id\":\"fan-speed-widget-help\"}})],1),_c('div',{staticClass:\"controls\"},[_c('b-button',{staticClass:\"off\",attrs:{\"variant\":\"background\",\"small\":\"\"},on:{\"click\":function($event){{\n                  _vm.customFanSpeed = 0\n                  _vm.setFanSpeed(0)\n                }}}},[_vm._v(_vm._s(_vm.$t(\"0% (Off)\")))]),_c('div',{staticClass:\"custom\"},[_c('b-input-group',{attrs:{\"prepend\":\"%\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('b-button',{attrs:{\"variant\":\"background\",\"disabled\":_vm.customFanSpeed === null ||\n                      parseInt(_vm.customFanSpeed) > 100 ||\n                      parseInt(_vm.customFanSpeed) < 0},on:{\"click\":function($event){return _vm.setFanSpeed(_vm.customFanSpeed)}}},[_vm._v(_vm._s(_vm.$t(\"Apply\")))])]},proxy:true}],null,false,22301740)},[_c('b-form-input',{attrs:{\"placeholder\":\"0-100\",\"type\":\"number\"},on:{\"focus\":function($event){return $event.target.select()}},model:{value:(_vm.customFanSpeed),callback:function ($$v) {_vm.customFanSpeed=$$v},expression:\"customFanSpeed\"}})],1)],1),_c('b-button',{staticClass:\"btn\",attrs:{\"variant\":\"background\",\"small\":\"\"},on:{\"click\":function($event){{\n                  _vm.customFanSpeed = 100\n                  _vm.setFanSpeed(100)\n                }}}},[_vm._v(\"100%\")])],1)]:_vm._e(),(!_vm.printer.isAgentMoonraker())?_c('muted-alert',{staticClass:\"info-block\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"These settings can only be set. They can't be read back from the firmware due to a limitation of the communication protocol.\"))+\" \")]):_vm._e()],2)])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>\n      <div v-if=\"activeMenu\" class=\"nav-btn\" @click=\"activeMenu = null\">\n        <i class=\"fas fa-arrow-left\"></i>&nbsp;&nbsp;{{$t(\"Back\")}}\n      </div>\n      <span v-else>{{ $t(\"Printer Controls\") }}</span>\n    </template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div v-show=\"!activeMenu\" class=\"home-menu\">\n          <button\n            class=\"menu-button\"\n            :disabled=\"printer.isActive()\"\n            @click=\"activeMenu = 'move-head'\"\n          >\n            <svg class=\"icon move-xy\"><use href=\"#svg-move-xy\" /></svg>\n            <div class=\"title\">{{ $t(\"Move Head\") }}</div>\n          </button>\n          <button\n            class=\"menu-button\"\n            :disabled=\"printer.isActive()\"\n            @click=\"activeMenu = 'extrude'\"\n          >\n            <svg class=\"icon extruder\"><use href=\"#extruder\" /></svg>\n            <div class=\"title\">{{ $t(\"Extrude\") }}</div>\n          </button>\n          <button\n            v-if=\"printer.isAgentMoonraker()\"\n            class=\"menu-button\"\n            @click=\"activeMenu = 'baby-step-z'\"\n          >\n            <svg class=\"icon move-z\"><use href=\"#svg-move-z\" /></svg>\n            <div class=\"title\">{{ $t(\"Baby Step Z\") }}</div>\n          </button>\n          <button v-if=\"!hideTunePrinter\" class=\"menu-button\" @click=\"activeMenu = 'tune-printer'\">\n            <font-awesome-icon :icon=\"['fas', 'gear']\" />\n            <div class=\"title\">{{ $t(\"Tune Printer\") }}</div>\n          </button>\n        </div>\n\n        <!-- Move Head -->\n        <div v-show=\"activeMenu === 'move-head'\" class=\"control-panel move-head\">\n          <div class=\"main\">\n            <div class=\"toggles\">\n              <div\n                v-for=\"option in xyzJogDistance.options\"\n                :key=\"'xyz-' + option\"\n                class=\"pill\"\n                :class=\"{ active: option === xyzJogDistance.value }\"\n                @click=\"xyzJogDistance.value = option\"\n              >\n                {{ option }}\n              </div>\n            </div>\n            <div class=\"xy-move\">\n              <div class=\"left\" @click=\"xyzControl(axis.x, directions.down)\">\n                <i class=\"fas fa-arrow-left\"></i>\n              </div>\n              <div class=\"right\" @click=\"xyzControl(axis.x, directions.up)\">\n                <i class=\"fas fa-arrow-right\"></i>\n              </div>\n              <div class=\"up\" @click=\"xyzControl(axis.y, directions.up)\">\n                <i class=\"fas fa-arrow-up\"></i>\n              </div>\n              <div class=\"down\" @click=\"xyzControl(axis.y, directions.down)\">\n                <i class=\"fas fa-arrow-down\"></i>\n              </div>\n              <div class=\"home\" @click=\"xyzControl(axis.xy, directions.home)\">\n                <i class=\"fas fa-home\"></i>\n              </div>\n            </div>\n            <div class=\"z-move\">\n              <div class=\"up\" @click=\"xyzControl(axis.z, directions.up)\">\n                <i class=\"fas fa-arrow-up\"></i>\n              </div>\n              <div class=\"down\" @click=\"xyzControl(axis.z, directions.down)\">\n                <i class=\"fas fa-arrow-down\"></i>\n              </div>\n              <div class=\"home\" @click=\"xyzControl(axis.z, directions.home)\">\n                <i class=\"fas fa-home\"></i>\n              </div>\n            </div>\n          </div>\n          <div class=\"additional\">\n            <div class=\"control-btn\" @click=\"homeAll\"><i class=\"fas fa-home\"></i>{{ $t(\" Home All\") }}</div>\n            <div class=\"control-btn\" @click=\"disableSteppers\">\n              <i class=\"fas fa-power-off\"></i> {{$t(\"Disable Steppers\")}}\n            </div>\n          </div>\n        </div>\n\n        <!-- Extrude -->\n        <div v-show=\"activeMenu === 'extrude'\" class=\"control-panel extrude\">\n          <div class=\"main\">\n            <template v-if=\"showExtrudeControl\">\n              <div class=\"toggles\">\n                <div\n                  v-for=\"option in extrudeJogDistance.options\"\n                  :key=\"'xyz-' + option\"\n                  class=\"pill\"\n                  :class=\"{ active: option === extrudeJogDistance.value }\"\n                  @click=\"extrudeJogDistance.value = option\"\n                >\n                  {{ option }}\n                </div>\n              </div>\n              <div class=\"main-buttons\">\n                <div class=\"control-btn\" @click=\"handleFilament(filamentDirections.retract)\">\n                  <i class=\"fas fa-minus\"></i> {{$t(\"Retract\")}}\n                </div>\n                <div class=\"control-btn\" @click=\"handleFilament(filamentDirections.extrude)\">\n                  <i class=\"fas fa-plus\"></i> {{$t(\"Extrude\")}}\n                </div>\n              </div>\n            </template>\n            <template v-else>\n              <div class=\"text-center mt-4\">\n                <b-spinner></b-spinner>\n                <p class=\"mt-2\">{{ $t(\"Loading tools...\") }}</p>\n              </div>\n            </template>\n          </div>\n          <div v-if=\"showToolsSelector\" class=\"additional\">\n            <b-form-select v-model=\"activeTool\" class=\"form-control tool-select\">\n              <b-form-select-option v-for=\"(item, key) in tools\" :key=\"key\" :value=\"key\">\n                {{ temperatureDisplayName(key) }}\n              </b-form-select-option>\n            </b-form-select>\n          </div>\n          <div v-if=\"activeToolTemperature\" class=\"extrude-temperature\">\n            <div class=\"temperature-icon\">\n              <svg>\n                <use href=\"#extruder\" />\n              </svg>\n            </div>\n            <div class=\"temperature-tool truncated\">{{ activeToolDisplayName }}</div>\n            <div class=\"temperature-value\">\n              <span>{{ activeToolActualTemperature }}</span>\n              <span v-if=\"activeToolTargetTemperature\" class=\"temperature-target\">\n                / {{ activeToolTargetTemperature }}\n              </span>\n            </div>\n          </div>\n        </div>\n\n        <!-- Baby Step Z -->\n        <div v-show=\"activeMenu === 'baby-step-z'\" class=\"control-panel baby-step-z\">\n          <div class=\"main\">\n            <div class=\"toggles\">\n              <div\n                v-for=\"option in zOffsetJogDistance.options\"\n                :key=\"'xyz-' + option\"\n                class=\"pill\"\n                :class=\"{ active: option === zOffsetJogDistance.value }\"\n                @click=\"zOffsetJogDistance.value = option\"\n              >\n                {{ option }}\n              </div>\n            </div>\n            <div class=\"z-move\">\n              <div class=\"up\" @click=\"controlZOffset(directions.up)\">\n                <i class=\"fas fa-arrow-up\"></i>\n              </div>\n              <div class=\"down\" @click=\"controlZOffset(directions.down)\">\n                <i class=\"fas fa-arrow-down\"></i>\n              </div>\n            </div>\n          </div>\n          <div class=\"additional\">\n            <div class=\"current-offset\">\n              <div class=\"label\">{{ $t(\"Current Offset\") }}</div>\n              <div class=\"value\">\n                <span v-if=\"currentZOffset || typeof currentZOffset === 'number'\">\n                  {{ currentZOffset }}\n                </span>\n                <span v-else>\n                  <b-spinner small></b-spinner>\n                </span>\n              </div>\n            </div>\n          </div>\n        </div>\n        <!-- Tune Printer -->\n        <div v-show=\"activeMenu === 'tune-printer'\" class=\"control-panel tune-printer\">\n          <template v-if=\"!printer.isAgentMoonraker() || currentFeedRate !== null\">\n            <div class=\"controls-title\">\n              <span>{{ $t(\"Feed Rate / Speed\") }}</span>\n              <help-widget id=\"print-speed-widget-help\" class=\"help-message\"></help-widget>\n            </div>\n            <div class=\"controls\">\n              <div class=\"custom\">\n                <b-input-group prepend=\"%\">\n                  <template #append>\n                    <b-button\n                      variant=\"background\"\n                      :disabled=\"\n                        customFeedRateFactor === null || parseInt(customFeedRateFactor) < 1\n                      \"\n                      @click=\"setPrintSpeed(customFeedRateFactor)\"\n                      >{{ $t(\"Apply\") }}</b-button\n                    >\n                  </template>\n                  <b-form-input\n                    v-model=\"customFeedRateFactor\"\n                    placeholder=\"100\"\n                    type=\"number\"\n                    @focus=\"$event.target.select()\"\n                  ></b-form-input>\n                </b-input-group>\n              </div>\n            </div>\n          </template>\n\n          <template v-if=\"!printer.isAgentMoonraker() || currentFlowRate !== null\">\n            <div class=\"controls-title\">\n              <span>{{ $t(\"Flow Rate\") }}</span>\n              <help-widget id=\"flow-rate-widget-help\" class=\"help-message\"></help-widget>\n            </div>\n            <div class=\"controls\">\n              <div class=\"custom\">\n                <b-input-group prepend=\"%\">\n                  <template #append>\n                    <b-button\n                      variant=\"background\"\n                      :disabled=\"\n                        customFlowRateFactor === null || parseInt(customFlowRateFactor) < 1\n                      \"\n                      @click=\"setFlowRate(customFlowRateFactor)\"\n                      >{{ $t(\"Apply\") }}</b-button\n                    >\n                  </template>\n                  <b-form-input\n                    v-model=\"customFlowRateFactor\"\n                    placeholder=\"100\"\n                    type=\"number\"\n                    @focus=\"$event.target.select()\"\n                  ></b-form-input>\n                </b-input-group>\n              </div>\n            </div>\n          </template>\n\n          <template v-if=\"!printer.isAgentMoonraker() || currentFanSpeed !== null\">\n            <div class=\"controls-title\">\n              <span>{{ $t(\"Fan Speed\") }}</span>\n              <help-widget id=\"fan-speed-widget-help\" class=\"help-message\"></help-widget>\n            </div>\n            <div class=\"controls\">\n              <b-button\n                class=\"off\"\n                variant=\"background\"\n                small\n                @click=\"\n                  {\n                    customFanSpeed = 0\n                    setFanSpeed(0)\n                  }\n                \"\n                >{{ $t(\"0% (Off)\") }}</b-button\n              >\n              <div class=\"custom\">\n                <b-input-group prepend=\"%\">\n                  <template #append>\n                    <b-button\n                      variant=\"background\"\n                      :disabled=\"\n                        customFanSpeed === null ||\n                        parseInt(customFanSpeed) > 100 ||\n                        parseInt(customFanSpeed) < 0\n                      \"\n                      @click=\"setFanSpeed(customFanSpeed)\"\n                      >{{ $t(\"Apply\") }}</b-button\n                    >\n                  </template>\n                  <b-form-input\n                    v-model=\"customFanSpeed\"\n                    placeholder=\"0-100\"\n                    type=\"number\"\n                    @focus=\"$event.target.select()\"\n                  ></b-form-input>\n                </b-input-group>\n              </div>\n              <b-button\n                class=\"btn\"\n                variant=\"background\"\n                small\n                @click=\"\n                  {\n                    customFanSpeed = 100\n                    setFanSpeed(100)\n                  }\n                \"\n                >100%</b-button\n              >\n            </div>\n          </template>\n\n          <muted-alert v-if=\"!printer.isAgentMoonraker()\" class=\"info-block\">\n            {{$t(\"These settings can only be set. They can't be read back from the firmware due to a limitation of the communication protocol.\")}}\n          </muted-alert>\n        </div>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport get from 'lodash/get'\nimport { temperatureDisplayName } from '@src/lib/utils'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport MutedAlert from '@src/components/MutedAlert.vue'\n\nconst AXIS = {\n  x: 'x',\n  y: 'y',\n  z: 'z',\n  xy: ['x', 'y'],\n  xyz: ['x', 'y', 'z'],\n}\n\nconst DIRECTIONS = {\n  up: 1,\n  down: -1,\n  home: 0,\n}\n\nconst FILAMENT_DIRECTIONS = {\n  retract: -1,\n  extrude: 1,\n}\n\nexport default {\n  name: 'PrinterControlWidget',\n\n  components: {\n    WidgetTemplate,\n    HelpWidget,\n    MutedAlert,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      activeMenu: null, // 'move-head' | 'extrude' | 'baby-step-z'\n\n      axis: AXIS,\n      directions: DIRECTIONS,\n      filamentDirections: FILAMENT_DIRECTIONS,\n\n      xyzJogDistance: {\n        value: 10,\n        options: [1, 10, 50, 100],\n      },\n      extrudeJogDistance: {\n        value: 10,\n        options: [1, 10, 50],\n      },\n      zOffsetJogDistance: {\n        value: 0.01,\n        options: [0.005, 0.01, 0.05, 0.1],\n      },\n      activeTool: null,\n\n      currentZOffset: null,\n\n      customFeedRateFactor: null,\n      customFlowRateFactor: null,\n      customFanSpeed: null,\n    }\n  },\n\n  computed: {\n    tools() {\n      const extruders = {}\n      for (const [key, value] of Object.entries(get(this.printer, 'status.temperatures', {}))) {\n        if (\n          Boolean(value.actual) &&\n          !isNaN(value.actual) &&\n          (key.toLowerCase().includes('tool') || key.toLowerCase().includes('extruder'))\n        ) {\n          // Take out NaN, 0, null. Apparently printers like Prusa throws random temperatures here.\n          extruders[key] = value\n        }\n      }\n      return extruders\n    },\n    showExtrudeControl() {\n      return Object.keys(this.tools).length > 0\n    },\n    showToolsSelector() {\n      return Object.keys(this.tools).length > 1\n    },\n    activeToolTemperature() {\n      return this.activeTool ? this.tools[this.activeTool] : null\n    },\n    activeToolDisplayName() {\n      return this.activeTool ? temperatureDisplayName(this.activeTool) : ''\n    },\n    activeToolActualTemperature() {\n      if (!this.activeToolTemperature || isNaN(this.activeToolTemperature.actual)) {\n        return null\n      }\n      return `${parseFloat(this.activeToolTemperature.actual).toFixed(1)} °C`\n    },\n    activeToolTargetTemperature() {\n      const target = this.activeToolTemperature?.target\n      if (target === null || target === undefined || isNaN(target)) {\n        return null\n      }\n      return `${Math.round(target)} °C`\n    },\n    currentFeedRate() {\n      const val = this.printer.status?.currentFeedRate\n      return val !== undefined ? val : null\n    },\n    currentFlowRate() {\n      const val = this.printer.status?.currentFlowRate\n      return val !== undefined ? val : null\n    },\n    currentFanSpeed() {\n      const val = this.printer.status?.currentFanSpeed\n      return val !== undefined ? val : null\n    },\n    hideTunePrinter() {\n      return (\n        this.printer.isAgentMoonraker() &&\n        this.currentFlowRate === null &&\n        this.currentFanSpeed === null &&\n        this.currentFeedRate === null\n      )\n    },\n  },\n\n  watch: {\n    tools: {\n      handler: function (newValue, prevValue) {\n        const toolKeys = Object.keys(newValue || {})\n        if (toolKeys.length === 0) {\n          this.activeTool = null\n        } else if (\n          !this.activeTool ||\n          !Object.prototype.hasOwnProperty.call(newValue, this.activeTool)\n        ) {\n          this.activeTool = toolKeys[0]\n        }\n      },\n      immediate: true,\n    },\n    printer: {\n      handler: function (newValue, oldValue) {\n        if (newValue.isActive() && ['move-head', 'extrude'].includes(this.activeMenu)) {\n          this.activeMenu = null\n        }\n      },\n      deep: true,\n    },\n    xyzJogDistance: {\n      handler: function (newValue, oldValue) {\n        if (isLocalStorageSupported()) {\n          localStorage.setItem(`xyz-mm-per-step-${this.printer.id}`, newValue.value)\n        }\n      },\n      deep: true,\n    },\n    extrudeJogDistance: {\n      handler: function (newValue, oldValue) {\n        if (isLocalStorageSupported()) {\n          localStorage.setItem(`extrude-mm-per-step-${this.printer.id}`, newValue.value)\n        }\n      },\n      deep: true,\n    },\n    zOffsetJogDistance: {\n      handler: function (newValue, oldValue) {\n        if (isLocalStorageSupported()) {\n          localStorage.setItem(`z-offset-mm-per-step-${this.printer.id}`, newValue.value)\n        }\n      },\n      deep: true,\n    },\n    activeMenu(newValue, oldValue) {\n      if (newValue === 'baby-step-z') {\n        this.getCurrentZOffset()\n      } else if (newValue === 'tune-printer') {\n        this.customFeedRateFactor =\n          this.currentFeedRate !== null ? Math.round(this.currentFeedRate * 100) : null\n        this.customFlowRateFactor =\n          this.currentFlowRate !== null ? Math.round(this.currentFlowRate * 100) : null\n        this.customFanSpeed =\n          this.currentFanSpeed !== null ? Math.round(this.currentFanSpeed * 100) : null\n      }\n    },\n  },\n\n  created() {\n    // Get jogDistance from localStorage or set default value\n    if (isLocalStorageSupported()) {\n      this.xyzJogDistance.value =\n        +localStorage.getItem(`xyz-mm-per-step-${this.printer.id}`) || this.xyzJogDistance.value\n\n      this.extrudeJogDistance.value =\n        +localStorage.getItem(`extrude-mm-per-step-${this.printer.id}`) ||\n        this.extrudeJogDistance.value\n\n      this.zOffsetJogDistance.value =\n        +localStorage.getItem(`z-offset-mm-per-step-${this.printer.id}`) ||\n        this.zOffsetJogDistance.value\n    }\n\n    // Listen for ESC key to close active menu\n    const onEscape = (e) => {\n      if (e.keyCode === 27) {\n        this.activeMenu = null\n      }\n    }\n    document.addEventListener('keydown', onEscape)\n    this.$once('hook:destroyed', () => {\n      document.removeEventListener('keydown', onEscape)\n    })\n  },\n\n  methods: {\n    // XYZ Control\n    xyzControl(axis, direction) {\n      let args = []\n      let func = 'jog'\n      if (direction === this.directions.home) {\n        args.push(axis)\n        func = 'home'\n      } else {\n        args.push({ [axis]: direction * this.xyzJogDistance.value })\n      }\n      const payload = { func: func, target: '_printer', args: args }\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n    getCurrentZOffset() {\n      const moonrakerPayload = { func: 'printer/objects/query?gcode_move', target: 'moonraker_api' }\n      this.printerComm.passThruToPrinter(moonrakerPayload, (err, ret) => {\n        if (err) {\n          this.currentZOffset = 'no reading'\n        } else {\n          const offset = ret.status.gcode_move.homing_origin[2]\n          const cleanOffset = parseFloat(offset.toFixed(3))\n          this.currentZOffset = cleanOffset\n        }\n      })\n    },\n    homeAll() {\n      this.xyzControl(this.axis.xyz, this.directions.home)\n    },\n    disableSteppers() {\n      const octoPayload = { func: 'commands', target: '_printer', args: ['M18'] }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: 'M18' },\n      }\n\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n\n    // Extrude / Retract\n    temperatureDisplayName,\n    handleFilament(direction) {\n      const currentToolTemp = this.tools[this.activeTool].actual\n      if (currentToolTemp < 179) {\n        this.$swal.Confirm.fire({\n          title: `${this.$i18next.t('Unable to extrude / retract')}`,\n          html: `<p class=\"text-center\">${this.$i18next.t(\"The hotend is below the minimum temperature\")}</p>`,\n          confirmButtonText: `${this.$i18next.t('Heat to 180°C')}`,\n          cancelButtonText: `${this.$i18next.t('Cancel')}`,\n        }).then((result) => {\n          if (result.isConfirmed) {\n            this.printerComm.passThruToPrinter(\n              { func: 'set_temperature', target: '_printer', args: [this.activeTool, 180] },\n              (err, ret) => {\n                if (err) {\n                  this.$swal.Toast.fire({\n                    icon: 'error',\n                    title: err,\n                  })\n                }\n              }\n            )\n          }\n        })\n\n        return\n      }\n\n      const toolNum = Object.entries(this.tools).findIndex((t) => t[0] === this.activeTool)\n      const changeAmount = direction * this.extrudeJogDistance.value\n      const commandScript = `M83\\nT${toolNum}\\nG1 E${changeAmount} F300`\n\n      const octoPayload = { func: 'commands', target: '_printer', args: [commandScript] }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: commandScript },\n      }\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n\n    // Baby Step Z\n    controlZOffset(direction) {\n      const changeAmount = this.zOffsetJogDistance.value * direction\n      const octoVal = Math.round(changeAmount * 10000) / 10000\n      const moonrakerVal = octoVal > 0 ? `+${octoVal}` : `${octoVal}`\n      const octoPayload = {\n        func: 'commands',\n        target: '_printer',\n        args: [`M290 Z ${octoVal}`],\n        force: true,\n      }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: `SET_GCODE_OFFSET Z_ADJUST=${moonrakerVal}` },\n      }\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n      this.currentZOffset = null\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        } else {\n          this.getCurrentZOffset()\n        }\n      })\n    },\n\n    // Print Speed / Flow Rate / Fan Speed\n    setPrintSpeed(value) {\n      if (value === null || value < 1) return\n      this.sendCommandToPrinter(`M220 S${Math.round(value)}`)\n    },\n    setFlowRate(value) {\n      if (value === null || value < 1) return\n      this.sendCommandToPrinter(`M221 S${Math.round(value)}`)\n    },\n    setFanSpeed(value) {\n      if (value === null || value < 0 || value > 100) return\n      let command = value === 0 ? 'M107' : `M106 S${Math.round((value / 100) * 255)}`\n      this.sendCommandToPrinter(command)\n    },\n    sendCommandToPrinter(command, { onError, onSuccess } = {}) {\n      const payload = this.printer.isAgentMoonraker()\n        ? {\n            func: 'printer/gcode/script',\n            target: 'moonraker_api',\n            kwargs: { script: command },\n          }\n        : {\n            func: 'commands',\n            target: '_printer',\n            args: [command],\n          }\n\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          if (onError) {\n            onError(err, ret)\n          } else {\n            this.$swal.Toast.fire({\n              icon: 'error',\n              title: err,\n            })\n          }\n        } else {\n          if (onSuccess) {\n            onSuccess(err, ret)\n          } else {\n            this.$swal.Toast.fire({\n              icon: 'success',\n              title: `${this.$i18next.t('Command successfully sent!')}`,\n            })\n          }\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.nav-btn\n  display: inline-block\n  color: var(--color-text-primary)\n  cursor: pointer\n\n.wrapper\n  padding-bottom: 1.5rem\n  min-height: 260px\n  display: flex\n  justify-content: center\n  align-items: center\n\n.home-menu\n  display: flex\n  flex-direction: row\n  justify-content: center\n  gap: 1rem\n  width: 100%\n  flex-wrap: wrap\n  @media (max-width: 510px)\n    gap: .5rem\n\n.menu-button\n  width: calc((100% - 3rem) / 3)\n  flex-shrink: 0\n  padding: 1.5rem 1rem\n  background-color: var(--color-background)\n  color: var(--color-text-primary)\n  border: none\n  border-radius: var(--border-radius-md)\n  display: flex\n  flex-direction: column\n  align-items: center\n  justify-content: center\n  gap: .5rem\n  cursor: pointer\n  @media (max-width: 510px)\n    width: calc((100% - 2rem) / 3)\n    padding: 1rem 0.5rem\n  &:hover\n    opacity: .8\n  &:disabled\n    opacity: .5\n    cursor: not-allowed\n  i, svg\n    font-size: 1.75rem\n    @media (max-width: 510px)\n      font-size: 1.2rem\n.icon\n  --icon-size: 42px\n  width: var(--icon-size)\n  height: var(--icon-size)\n  color: var(--color-text-primary)\n  &.move-xy\n    --icon-size: 38px\n  &.extruder\n    --icon-size: 36px\n  @media (max-width: 510px)\n    --icon-size: 24px !important\n.title\n  font-size: 0.875rem\n  line-height: 1.2\n\n\n.control-panel\n  width: 100%\n  .main\n    display: flex\n    align-items: center\n    justify-content: center\n    gap: 2rem\n    margin-bottom: 2rem\n    @media (max-width: 510px)\n      gap: 1rem\n  .toggles\n    display: flex\n    flex-direction: column\n    gap: .5rem\n  .pill\n    padding: .25rem\n    width: 3.5rem\n    background-color: var(--color-secondary)\n    color: var(--color-on-secondary)\n    border-radius: 999px\n    font-size: 0.875rem\n    text-align: center\n    cursor: pointer\n    &.active\n      background-color: var(--color-primary)\n      color: var(--color-on-primary)\n  .xy-move, .z-move\n    width: 146px\n    height: 146px\n    border-radius: var(--border-radius-md)\n    background-color: var(--color-background)\n    color: var(--color-text-primary)\n    position: relative\n    .left, .right, .up, .down, .home\n      position: absolute\n      width: 42px\n      height: 42px\n      font-size: 1.25rem\n      text-align: center\n      line-height: 42px\n      margin: auto\n      left: 0\n      right: 0\n      top: 0\n      bottom: 0\n      cursor: pointer\n      &:hover\n        opacity: .8\n    .left\n      right: unset\n    .right\n      left: unset\n    .up\n      bottom: unset\n    .down\n      top: unset\n\n  .z-move\n    width: 60px\n  .additional\n    display: flex\n    justify-content: center\n    gap: 1rem\n  .control-btn\n    display: flex\n    align-items: center\n    gap: .5rem\n    cursor: pointer\n    background-color: var(--color-background)\n    border-radius: var(--border-radius-sm)\n    color: var(--color-text-primary)\n    padding: .5rem 1rem\n    font-size: 0.875rem\n    &:hover\n      opacity: .8\n\n.current-offset\n  display: flex\n  gap: 1rem\n  border: 1px solid var(--color-divider-muted)\n  border-radius: var(--border-radius-sm)\n  color: var(--color-text-primary)\n  padding: .5rem 1rem\n  font-size: 0.875rem\n  .value\n    font-weight: bold\n\n.main-buttons\n  display: flex\n  flex-direction: column\n  gap: 1rem\n  .control-btn\n    font-size: 1rem\n    border-radius: var(--border-radius-md)\n    padding: .625rem 1.5rem\n\n.tool-select\n  width: 80%\n\n.extrude-temperature\n  display: flex\n  align-items: center\n  gap: .875rem\n  width: 100%\n  min-height: 62px\n  margin-top: 1rem\n  padding: .8125rem\n  border-radius: var(--border-radius-md)\n  background-color: var(--color-background)\n  color: var(--color-text-primary)\n  .temperature-icon\n    width: 36px\n    height: 36px\n    flex-shrink: 0\n    display: flex\n    align-items: center\n    justify-content: center\n    background-color: var(--color-primary)\n    color: var(--color-on-primary)\n    border-radius: var(--border-radius-sm)\n    svg\n      width: 20px\n      height: 20px\n  .temperature-tool\n    min-width: 0\n    font-size: 1rem\n    font-weight: 600\n  .temperature-value\n    display: flex\n    gap: .375rem\n    align-items: baseline\n    margin-left: auto\n    white-space: nowrap\n    font-size: 1rem\n    font-weight: bold\n  .temperature-target\n    color: var(--color-text-secondary)\n\n.tune-printer\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n\n  .controls-title\n    font-size: 1rem\n    width: 100%\n    display: flex\n    gap: .375rem\n  .controls\n    width: 100%\n    display: flex\n    gap: .75rem\n    margin-bottom: 1rem\n\n    .off\n      flex-shrink: 0\n      width: 100px\n\n    .custom\n      border-radius: 100px\n      overflow: hidden\n      flex: 1\n\n    ::v-deep .input-group-text\n      background-color: var(--color-divider)\n      color: var(--color-text-primary)\n\n    @media (max-width: 510px)\n      flex-direction: column\n      .off\n        width: 100%\n\n  .info-block\n    width: 100%\n\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterControlWidget.vue?vue&type=template&id=8cc7b434&scoped=true&\"\nimport script from \"./PrinterControlWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterControlWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterControlWidget.vue?vue&type=style&index=0&id=8cc7b434&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"8cc7b434\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper\"},[_c('draggable',{attrs:{\"ghost-class\":\"ghost\",\"handle\":\".handle\"},on:{\"start\":function($event){_vm.dragging = true},\"end\":function($event){_vm.dragging = false}},model:{value:(_vm.currentItems),callback:function ($$v) {_vm.currentItems=$$v},expression:\"currentItems\"}},_vm._l((_vm.currentItems),function(item){return _c('div',{key:item.id,staticClass:\"item\"},[_c('div',{staticClass:\"handle\"},[_c('i',{staticClass:\"fas fa-grip-lines\"})]),_c('div',{staticClass:\"title\"},[_c('span',[_vm._v(_vm._s(_vm.getTitle(item.id)))])]),_c('div',{staticClass:\"switch\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'widget-toggle-' + item.id,\"type\":\"checkbox\",\"name\":\"pause_on_failure\"},domProps:{\"checked\":item.enabled},on:{\"click\":function($event){return _vm.toggleItemEnabled(item)}}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'widget-toggle-' + item.id}})])])])}),0),_c('input',{ref:\"sortingConfig\",attrs:{\"id\":\"sorting-config\",\"type\":\"hidden\"}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"wrapper\">\n    <draggable\n      v-model=\"currentItems\"\n      ghost-class=\"ghost\"\n      handle=\".handle\"\n      @start=\"dragging = true\"\n      @end=\"dragging = false\"\n    >\n      <div v-for=\"item in currentItems\" :key=\"item.id\" class=\"item\">\n        <div class=\"handle\">\n          <i class=\"fas fa-grip-lines\"></i>\n        </div>\n        <div class=\"title\">\n          <span>{{ getTitle(item.id) }}</span>\n        </div>\n        <div class=\"switch\">\n          <div class=\"custom-control custom-switch\">\n            <input\n              :id=\"'widget-toggle-' + item.id\"\n              type=\"checkbox\"\n              name=\"pause_on_failure\"\n              class=\"custom-control-input update-printer\"\n              :checked=\"item.enabled\"\n              @click=\"toggleItemEnabled(item)\"\n            />\n            <label\n              class=\"custom-control-label\"\n              :for=\"'widget-toggle-' + item.id\"\n              style=\"font-size: 1rem\"\n            ></label>\n          </div>\n        </div>\n      </div>\n    </draggable>\n    <input id=\"sorting-config\" ref=\"sortingConfig\" type=\"hidden\" />\n  </div>\n</template>\n\n<script>\nimport draggable from 'vuedraggable'\n\nexport default {\n  name: 'ReorderModal',\n\n  components: {\n    draggable,\n  },\n\n  props: {\n    items: {\n      type: Array,\n      required: true,\n    },\n    extraInfo: {\n      type: Array,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      dragging: false,\n      currentItems: [],\n    }\n  },\n\n  watch: {\n    dragging(newVal, oldVal) {\n      if (!newVal) {\n        this.saveNewOrder()\n      }\n    },\n  },\n\n  created() {\n    this.currentItems = JSON.parse(JSON.stringify(this.items))\n  },\n\n  mounted() {},\n\n  methods: {\n    getTitle(id) {\n      return this.extraInfo.find((item) => item.id === id).title\n    },\n    toggleItemEnabled(item) {\n      item.enabled = !item.enabled\n      this.saveNewOrder()\n    },\n    saveNewOrder() {\n      this.$refs.sortingConfig.value = JSON.stringify(this.currentItems)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  gap: 1rem\n\n.item\n  display: flex\n  align-items: center\n  gap: .5rem\n  border-bottom: 1px solid var(--color-divider-muted)\n  padding: .5rem 0\n  .handle\n    font-size: 1.25rem\n    color: var(--color-text-secondary)\n    cursor: move\n  .title\n    flex: 1\n  &.ghost\n    opacity: .1\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ReorderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ReorderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ReorderModal.vue?vue&type=template&id=74b26ea3&scoped=true&\"\nimport script from \"./ReorderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ReorderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReorderModal.vue?vue&type=style&index=0&id=74b26ea3&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"74b26ea3\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Printer Terminal\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"terminal-widget\"},[_c('printer-terminal',{attrs:{\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm,\"show-full-screen-opt\":true}})],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:['wrapper', { 'full-screen-height': _vm.fullScreenHeight }]},[_c('div',{staticClass:\"actionWrap\"},[(_vm.showFullScreenOpt)?_c('a',{attrs:{\"href\":`/printers/${_vm.printer.id}/terminal/`}},[_c('b-button',{staticClass:\"actionBtn\",attrs:{\"disabled\":!_vm.feedIsOn}},[_c('i',{staticClass:\"fas fa-expand actionIcon\"})])],1):_vm._e(),(_vm.canToggleFeed)?_c('b-button',{staticClass:\"actionBtn\",on:{\"click\":_vm.toggleTerminalPower}},[(_vm.feedIsOn === null)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_c('i',{class:['fas', 'fa-power-off', 'actionIcon', { 'text-primary': !_vm.feedIsOn }]})],1):_vm._e(),_c('b-button',{staticClass:\"actionBtn\",attrs:{\"disabled\":!_vm.feedIsOn},on:{\"click\":_vm.clearFeed}},[_c('i',{staticClass:\"fas fa-trash actionIcon\"})]),_c('b-dropdown',{staticClass:\"actionBtnNoP\",attrs:{\"disabled\":!_vm.feedIsOn,\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":\"Filter\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('div',[_c('div',[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Filter\")))]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('temperature', !_vm.hideTempMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideTempMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-fire\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress Temperature\")))])])])]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('sd', !_vm.hideSDMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideSDMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-sd-card\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress SD Status Messages\")))])])])]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('gcode', !_vm.hideGCodeMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideGCodeMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-code\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress Position Messages\")))])])])]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('ok', !_vm.hideOKMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideOKMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-thumbs-up\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress 'OK' Messages\")))])])])])],1)])])],1),_c('terminal-feed-view',{staticClass:\"feedWrap\",attrs:{\"terminal-feed-array\":_vm.terminalFeedArray,\"feed-is-on\":_vm.feedIsOn}}),_c('div',{staticClass:\"inputWrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.inputValue),expression:\"inputValue\"}],staticClass:\"textInput\",attrs:{\"disabled\":!_vm.feedIsOn,\"type\":\"text\",\"placeholder\":_vm.$t('Enter code...')},domProps:{\"value\":(_vm.inputValue)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.sendMessage.apply(null, arguments)},\"input\":function($event){if($event.target.composing)return;_vm.inputValue=$event.target.value}}}),_c('b-button',{staticClass:\"sendBtn\",attrs:{\"disabled\":!_vm.feedIsOn,\"variant\":\"outline-primary\"},on:{\"click\":_vm.sendMessage}},[_c('i',{staticClass:\"fas fa-chevron-right text-primary-icon\"})])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"feedWrap\",attrs:{\"colorScheme\":\"background\"}},[(!_vm.feedIsOn)?_c('div',{staticStyle:{\"width\":\"100%\"}},[_c('p',{staticStyle:{\"margin\":\"0\",\"margin-top\":\"5px\",\"text-align\":\"center\"}},[_c('i',{staticClass:\"fas fa-power-off\",staticStyle:{\"margin-right\":\"5px\"}}),_vm._v(_vm._s(_vm.$t(\"Terminal feed is off\"))+\" \")])]):_vm._l((_vm.terminalFeedArray),function(feed,index){return _c('div',{key:index,staticClass:\"itemWrap\"},[(feed?.msg)?_c('div',{staticClass:\"terminalText\"},[_c('p',{staticClass:\"messageTimeStamp\"},[_vm._v(\" \"+_vm._s(feed.normalTimeStamp)+\" \")]),_c('p',{staticClass:\"messageText\"},[_vm._v(\" \"+_vm._s(feed.msg)+\" \")])]):_vm._e(),_c('div',{staticClass:\"divider\"})])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"feedWrap\" colorScheme=\"background\">\n    <div v-if=\"!feedIsOn\" style=\"width: 100%\">\n      <p style=\"margin: 0; margin-top: 5px; text-align: center\">\n        <i class=\"fas fa-power-off\" style=\"margin-right: 5px\"></i>{{$t(\"Terminal feed is off\")}}\n      </p>\n    </div>\n    <div v-else v-for=\"(feed, index) in terminalFeedArray\" :key=\"index\" class=\"itemWrap\">\n      <div v-if=\"feed?.msg\" class=\"terminalText\">\n        <p class=\"messageTimeStamp\">\n          {{ feed.normalTimeStamp }}\n        </p>\n        <p class=\"messageText\">\n          {{ feed.msg }}\n        </p>\n      </div>\n      <div class=\"divider\"></div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'TerminalFeedView',\n\n  components: {},\n\n  props: {\n    terminalFeedArray: {\n      type: Array,\n      required: true,\n    },\n    feedIsOn: {\n      type: Boolean,\n      required: true,\n    },\n  },\n\n  methods: {\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'share') {\n        this.onSharePrinter()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.feedWrap\n  display: flex\n  align-items: flex-start\n  flex-direction: column\n  overflow-y: scroll\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n\n.feedWrap::-webkit-scrollbar\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n\n.feedWrap::-webkit-scrollbar-thumb\n  background-color: var(--color-surface-primary)\n  border-radius:  var(--border-radius-md)\n\n.filterItemH\n  display: flex\n  flex-direction: row\n  align-items: center\n\n.terminalText\n  display: flex\n  align-items: center\n  flex-direction: row\n\n.messageTimeStamp\n  opacity: 0.8\n  margin-right: 20px\n  font-size: 0.7rem\n  margin-top: 7px\n  margin-bottom: 7px\n.divider\n  width: 100%\n  background-color: var(--color-divider)\n  height: 1px\n\n.itemWrap\n  display: flex\n  flex-direction: column\n  width: 100%\n.messageText\n  margin-top: 7px\n  margin-bottom: 7px\n  white-space: pre-wrap\n  word-break: break-all\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalFeedView.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalFeedView.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TerminalFeedView.vue?vue&type=template&id=04d63edc&scoped=true&\"\nimport script from \"./TerminalFeedView.vue?vue&type=script&lang=js&\"\nexport * from \"./TerminalFeedView.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TerminalFeedView.vue?vue&type=style&index=0&id=04d63edc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"04d63edc\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div :class=\"['wrapper', { 'full-screen-height': fullScreenHeight }]\">\n    <div class=\"actionWrap\">\n      <a v-if=\"showFullScreenOpt\" :href=\"`/printers/${printer.id}/terminal/`\">\n        <b-button :disabled=\"!feedIsOn\" class=\"actionBtn\">\n          <i class=\"fas fa-expand actionIcon\"></i>\n        </b-button>\n      </a>\n      <b-button v-if=\"canToggleFeed\" class=\"actionBtn\" @click=\"toggleTerminalPower\">\n        <b-spinner v-if=\"feedIsOn === null\" small />\n        <i v-else :class=\"['fas', 'fa-power-off', 'actionIcon', { 'text-primary': !feedIsOn }]\"></i>\n      </b-button>\n      <b-button :disabled=\"!feedIsOn\" class=\"actionBtn\" @click=\"clearFeed\">\n        <i class=\"fas fa-trash actionIcon\"></i>\n      </b-button>\n      <b-dropdown\n        :disabled=\"!feedIsOn\"\n        right\n        no-caret\n        class=\"actionBtnNoP\"\n        toggle-class=\"action-btn icon-btn\"\n        menu-class=\"scrollable\"\n        title=\"Filter\"\n      >\n        <template #button-content>\n          <i class=\"fas fa-filter\"></i>\n        </template>\n        <div>\n          <div>\n            <b-dropdown-text class=\"small text-secondary\">{{ $t(\"Filter\") }}</b-dropdown-text>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"\n                updateFilterPrefs('temperature', !hideTempMessages)\n              \"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideTempMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-fire\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress Temperature\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"updateFilterPrefs('sd', !hideSDMessages)\"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideSDMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-sd-card\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress SD Status Messages\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"updateFilterPrefs('gcode', !hideGCodeMessages)\"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideGCodeMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-code\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress Position Messages\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"updateFilterPrefs('ok', !hideOKMessages)\"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideOKMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-thumbs-up\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress 'OK' Messages\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n          </div>\n        </div>\n      </b-dropdown>\n    </div>\n    <terminal-feed-view\n      class=\"feedWrap\"\n      :terminal-feed-array=\"terminalFeedArray\"\n      :feed-is-on=\"feedIsOn\"\n    />\n    <div class=\"inputWrap\">\n      <input\n        :disabled=\"!feedIsOn\"\n        v-model=\"inputValue\"\n        type=\"text\"\n        class=\"textInput\"\n        :placeholder=\"$t('Enter code...')\"\n        @keyup.enter=\"sendMessage\"\n      />\n      <b-button\n        :disabled=\"!feedIsOn\"\n        variant=\"outline-primary\"\n        class=\"sendBtn\"\n        @click=\"sendMessage\"\n      >\n        <i class=\"fas fa-chevron-right text-primary-icon\"></i>\n      </b-button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport moment from 'moment'\nimport TerminalFeedView from '@src/components/terminal/TerminalFeedView'\n\nexport default {\n  name: 'PrinterTerminal',\n\n  components: {\n    TerminalFeedView,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n    fullScreenHeight: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    showFullScreenOpt: {\n      type: Boolean,\n      required: true,\n      default: true,\n    },\n  },\n\n  data() {\n    return {\n      oldTerminalFeed: null,\n      terminalFeedArray: [],\n      inputValue: '',\n      hideTempMessages: true,\n      hideSDMessages: true,\n      hideOKMessages: true,\n      hideGCodeMessages: true,\n      feedIsOn: true,\n    }\n  },\n\n  computed: {\n    canToggleFeed() {\n      if (this.printer.isAgentMoonraker()) {\n        return false\n      }\n      return this.printer.isAgentVersionGte('2.4.7', '0.0.0')\n    },\n  },\n\n  created() {\n    this.printerComm.onTerminalFeedReceived = this.onNextTerminalFeed\n    this.terminalSetup()\n  },\n\n  mounted() {\n    const hideTempPref = localStorage.getItem(`printer-terminal-filter-prefs-temperature`)\n    const hideSDPref = localStorage.getItem(`printer-terminal-filter-prefs-sd`)\n    const hideOKPref = localStorage.getItem(`printer-terminal-filter-prefs-ok`)\n    const hideGCodePref = localStorage.getItem(`printer-terminal-filter-prefs-gcode`)\n    if (hideTempPref) {\n      this.hideTempMessages = JSON.parse(hideTempPref)\n    }\n    if (hideSDPref) {\n      this.hideSDMessages = JSON.parse(hideSDPref)\n    }\n    if (hideGCodePref) {\n      this.hideGCodeMessages = JSON.parse(hideGCodePref)\n    }\n    if (hideOKPref) {\n      this.hideOKMessages = JSON.parse(hideOKPref)\n    }\n  },\n\n  methods: {\n    onNextTerminalFeed(newTerminalFeed) {\n      const sameMsg = newTerminalFeed?.msg === this.oldTerminalFeed?.msg\n      const same_ts = newTerminalFeed?._ts === this.oldTerminalFeed?._ts\n      const newMsg = newTerminalFeed?.msg\n\n      this.oldTerminalFeed = newTerminalFeed\n      const tempRegex = /((N\\d+\\s+)?M105)|((ok\\s+([PBN]\\d+\\s+)*)?([BCLPR]|T\\d*):-?\\d+)/g\n      const SDRegex = /((N\\d+\\s+)?M27)|(SD printing byte)|(Not SD printing)/g\n      const gCodeRegex = /^G[0-3].*$/g\n\n      if (this.hideSDMessages && SDRegex.test(newMsg)) return\n      if (this.hideTempMessages && tempRegex.test(newMsg)) return\n      if (this.hideGCodeMessages && gCodeRegex.test(newMsg)) return\n      if (this.hideOKMessages && newMsg.toLowerCase().trim() === 'ok') return\n      if (!sameMsg && !same_ts) {\n        newTerminalFeed.normalTimeStamp = moment().format('h:mm:ssa')\n        newTerminalFeed.msg = newMsg.trim() // remove unnecessary whitespace\n        this.terminalFeedArray.unshift(newTerminalFeed)\n      }\n    },\n\n    sendMessage() {\n      if (!this.inputValue.length) return\n      if (!this.feedIsOn) return\n      const newString = this.inputValue.toUpperCase()\n\n      if (this.printer.isAgentMoonraker()) {\n        this.onNextTerminalFeed({ msg: newString, _ts: new Date() }) // Moonraker doesn't echo the gcodes user enters. Hence we need to insert them to the terminal\n      }\n\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: `${newString}` },\n      }\n      const octoPayload = {\n        func: 'commands',\n        target: '_printer',\n        args: [`${newString}`],\n        force: true,\n      }\n\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n      this.inputValue = ''\n    },\n    clearFeed() {\n      this.terminalFeedArray = []\n    },\n    updateFilterPrefs(str, val) {\n      localStorage.setItem(`printer-terminal-filter-prefs-${str}`, JSON.stringify(val))\n      if (str === 'temperature') {\n        this.hideTempMessages = val\n      } else if (str === 'gcode') {\n        this.hideGCodeMessages = val\n      } else if (str === 'ok') {\n        this.hideOKMessages = val\n      } else {\n        this.hideSDMessages = val\n      }\n    },\n    async terminalSetup() {\n      if (!this.canToggleFeed) {\n        this.feedIsOn = true\n        return\n      }\n\n      this.printerComm.passThruToPrinter(\n        {\n          func: 'toggle_terminal_feed',\n          target: 'gcode_hooks',\n          args: ['get'],\n        },\n        (err, ret) => {\n          this.feedIsOn = ret || false\n        }\n      )\n    },\n\n    async toggleTerminalPower() {\n      const str = this.feedIsOn ? 'off' : 'on'\n      this.feedIsOn = null\n      this.clearFeed()\n      this.printerComm.passThruToPrinter(\n        {\n          func: 'toggle_terminal_feed',\n          target: 'gcode_hooks',\n          args: [str],\n        },\n        (err, ret) => {\n          this.feedIsOn = ret || false\n        }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n\n.full-screen-height\n  height: calc(100vh - 50px - var(--gap-between-blocks))\n  margin-bottom: -120px\n\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n  padding-bottom: 1rem\n  position: relative\n  width: 100%\n\n.feedWrap\n  display: flex\n  flex-direction: column\n  flex: 1\n  padding: 10px\n  width: 100%\n  background-color: var(--color-background)\n  border: solid var(--color-surface-primary) 1px\n.feedWrap::-webkit-scrollbar\n  background-color: var(--color-background)\n.feedWrap::-webkit-scrollbar-thumb\n  background-color: var(--color-surface-primary)\n\n.inputWrap\n  display: flex\n  flex-direction: row\n  justify-content: space-between\n  height: 50px\n  width: 100%\n  gap: 1rem\n\n.textInput\n  height: 100%\n  flex: 1\n  padding: 10px\n\n.sendBtn\n  height: 100%\n  width: auto\n  min-width: 60px\n  border-radius: var(--border-radius-sm)\n  background-color: var(--color-surface-primary)\n  border: none\n\n.actionBtn\n  margin-left: 5px\n  margin-right: 5px\n  padding: 10px 16px\n  height: 100%\n  display: flex\n  align-items: center\n  justify-content: center\n  background-color: var(--color-surface-primary)\n  border-radius: var(--border-radius-sm)\n  border: none\n  &:hover\n    cursor: pointer\n\n.actionBtnNoP\n  margin-left: 5px\n  margin-right: 5px\n  height: 100%\n  display: flex\n  align-items: center\n  justify-content: center\n  background-color: var(--color-surface-primary)\n  border-radius: var(--border-radius-sm)\n  z-index: 1\n  &:hover\n    cursor: pointer\n\n.actionIcon\n  width: 16px\n  height: 16px\n  color: var(--color-text-primary)\n\n.text-primary-icon\n  color: var(--color-text-primary)\n\n.actionWrap\n  display: flex\n  flex-direction: row\n  top: 0px\n  right: 15px\n  align-items: center\n  justify-content: flex-end\n  width: 100%\n  padding: 10px 15px\n\n.filterItemH\n  display: flex\n  flex-direction: row\n  align-items: center\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterTerminal.vue?vue&type=template&id=7c771c69&scoped=true&\"\nimport script from \"./PrinterTerminal.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterTerminal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterTerminal.vue?vue&type=style&index=0&id=7c771c69&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7c771c69\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <widget-template>\n    <template #title>{{ $t(\"Printer Terminal\") }}</template>\n    <template #content>\n      <div class=\"terminal-widget\">\n        <printer-terminal\n          :printer=\"printer\"\n          :printer-comm=\"printerComm\"\n          :show-full-screen-opt=\"true\"\n        ></printer-terminal>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport PrinterTerminal from '@src/components/terminal/PrinterTerminal'\n\nexport default {\n  name: 'TerminalWidget',\n\n  components: {\n    WidgetTemplate,\n    PrinterTerminal,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.terminal-widget\n  height: 400px\n  display: flex\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TerminalWidget.vue?vue&type=template&id=78933ce3&scoped=true&\"\nimport script from \"./TerminalWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./TerminalWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TerminalWidget.vue?vue&type=style&index=0&id=78933ce3&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"78933ce3\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"LCD Display Message\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[_c('div',{staticClass:\"message-content\"},[_c('p',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.printer.status.display_status.message))])]),_c('b-button',{staticClass:\"dismiss-btn\",attrs:{\"variant\":\"outline-primary\"},on:{\"click\":_vm.onDisplayClear}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Dismiss\"))+\" \")])],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>{{ $t(\"LCD Display Message\") }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div class=\"message-content\">\n          <p class=\"text\">{{ printer.status.display_status.message }}</p>\n        </div>\n        <b-button variant=\"outline-primary\" class=\"dismiss-btn\" @click=\"onDisplayClear\">\n          {{ $t(\"Dismiss\") }}\n        </b-button>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\n\nexport default {\n  name: 'DisplayStatusWidget',\n\n  components: {\n    WidgetTemplate,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  methods: {\n    onDisplayClear() {\n      const octoPayload = {\n        func: 'commands',\n        target: '_printer',\n        args: [\"M117\"],\n        force: true,\n      }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: {\"script\": \"SET_DISPLAY_TEXT\"},\n      }\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: row\n  align-items: center\n  justify-content: space-between\n  gap: 1rem\n  padding-bottom: 1rem\n\n.message-content\n  display: flex\n  align-items: center\n  justify-content: flex-start\n  flex: 1\n  min-width: 0\n\n.text\n  margin: 0\n  font-size: 1.5rem\n  font-weight: bold\n  color: var(--color-warning)\n  word-break: break-word\n  overflow-wrap: break-word\n  text-align: left\n  line-height: 1.4\n\n.dismiss-btn\n  flex-shrink: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DisplayStatusWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DisplayStatusWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DisplayStatusWidget.vue?vue&type=template&id=e46a13a2&scoped=true&\"\nimport script from \"./DisplayStatusWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./DisplayStatusWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DisplayStatusWidget.vue?vue&type=style&index=0&id=e46a13a2&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e46a13a2\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.availablePowerDevices.length)?_c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Power\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"power-control\"},[_vm._l((_vm.availablePowerDevices),function(item){return _c('div',{key:item.device,staticClass:\"power-item\"},[_c('div',{staticClass:\"title\"},[_c('div',{staticClass:\"name\"},[_vm._v(_vm._s(item.device))]),_c('div',{staticClass:\"status text-danger\",class:{ 'text-success': item.status.toUpperCase() === 'ON' }},[_vm._v(\" • \"+_vm._s(item.status.toUpperCase())+\" \")])]),_c('b-button',{attrs:{\"variant\":\"outline-primary\"},on:{\"click\":function($event){return _vm.togglePower(item)}}},[_vm._v(\" \"+_vm._s(_vm.$t(\" Toggle Power \"))+\" \")])],1)}),(_vm.availablePowerDevices.length > 1)?_c('div',{staticClass:\"bulk-actions\"},[_c('b-button',{attrs:{\"variant\":\"success\"},on:{\"click\":function($event){return _vm.batchPowerControl('on')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\" Power On All \"))+\" \")]),_c('b-button',{attrs:{\"variant\":\"danger\"},on:{\"click\":function($event){return _vm.batchPowerControl('off')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\" Power Off All \"))+\" \")])],1):_vm._e(),_c('muted-alert',{staticClass:\"info-block\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Rapid toggling power may result in error. Please allow a cooldown period.\"))+\" \")])],2)]},proxy:true}],null,false,1595045800)}):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template v-if=\"availablePowerDevices.length\">\n    <template #title>{{ $t(\"Power\") }}</template>\n    <template #content>\n      <div class=\"power-control\">\n        <div v-for=\"item in availablePowerDevices\" :key=\"item.device\" class=\"power-item\">\n          <div class=\"title\">\n            <div class=\"name\">{{ item.device }}</div>\n            <div\n              class=\"status text-danger\"\n              :class=\"{ 'text-success': item.status.toUpperCase() === 'ON' }\"\n            >\n              • {{ item.status.toUpperCase() }}\n            </div>\n          </div>\n          <b-button variant=\"outline-primary\" @click=\"togglePower(item)\">\n            {{ $t(\" Toggle Power \") }}\n          </b-button>\n        </div>\n\n        <div v-if=\"availablePowerDevices.length > 1\" class=\"bulk-actions\">\n          <b-button variant=\"success\" @click=\"batchPowerControl('on')\">\n            {{ $t(\" Power On All \") }}\n          </b-button>\n          <b-button variant=\"danger\" @click=\"batchPowerControl('off')\">\n            {{ $t(\" Power Off All \") }}\n          </b-button>\n        </div>\n\n        <muted-alert class=\"info-block\">\n          {{$t(\"Rapid toggling power may result in error. Please allow a cooldown period.\")}}\n        </muted-alert>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\n\nexport default {\n  name: 'PowerControlWidget',\n\n  components: {\n    MutedAlert,\n    WidgetTemplate,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      powerDevices: [],\n    }\n  },\n\n  computed: {\n    availablePowerDevices() {\n      if (!this.printer.isOffline() && !this.printer.isDisconnected()) {\n        return this.powerDevices\n      }\n\n      return this.powerDevices.filter(device => device.type !== 'klipper_device')\n    },\n  },\n\n  created() {\n    this.getPowerDevices()\n  },\n\n  methods: {\n    getPowerDevices() {\n      const payload = {\n        func: 'machine/device_power/devices',\n        target: 'moonraker_api',\n        args: [],\n      }\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        this.powerDevices = err ? [] : ret?.devices || []\n      })\n    },\n    togglePower(device) {\n      const action = device.status.toUpperCase() === 'ON' ? 'off' : 'on'\n      const payload = {\n        func: `machine/device_power/device?device=${device.device}&action=${action}`,\n        target: 'moonraker_api',\n        kwargs: { verb: 'post' },\n      }\n      this.printerComm.passThruToPrinter(payload, (err) => {\n        this.getPowerDevices()\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n    batchPowerControl(action) {\n      if (!this.availablePowerDevices.length) return\n\n      const devices = this.availablePowerDevices.map(device => device.device).join('&')\n      const payload = {\n        func: `machine/device_power/${action}?${devices}`,\n        target: 'moonraker_api',\n        kwargs: { verb: 'post' },\n      }\n      this.printerComm.passThruToPrinter(payload, (err) => {\n        this.getPowerDevices()\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.power-control\n  padding-bottom: .5rem\n  .power-item\n    margin: 1rem 0\n    display: flex\n    flex-direction: column\n    gap: .5rem\n  .title\n    display: flex\n    justify-content: space-between\n    font-size: 1rem\n    font-weight: bold\n  .bulk-actions\n    display: flex\n    gap: 1rem\n    margin: 2rem 0\n    button\n      flex: 1\n  .info-block\n    width: 100%\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PowerControlWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PowerControlWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PowerControlWidget.vue?vue&type=template&id=6b4f0900&scoped=true&\"\nimport script from \"./PowerControlWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PowerControlWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PowerControlWidget.vue?vue&type=style&index=0&id=6b4f0900&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6b4f0900\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #topBarLeft>\n      <div class=\"printer-name truncated\">\n        {{ printer ? printer.name : '' }}\n      </div>\n    </template>\n\n    <template #topBarRight>\n      <div v-if=\"printer\" class=\"action-panel\">\n        <!-- Share Feed -->\n        <a\n          href=\"#\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          title=\"Share\"\n          @click.prevent=\"onSharePrinter()\"\n        >\n          <i class=\"fas fa-share-alt fa-lg\"></i>\n          <span class=\"sr-only\">{{ $t(\"Share\") }}</span>\n        </a>\n        <!-- Tunnel -->\n        <a\n          :href=\"`/tunnels/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          title=\"OctoPrint Tunnel\"\n        >\n          <svg class=\"custom-svg-icon\">\n            <use href=\"#svg-tunnel\" />\n          </svg>\n          <span class=\"sr-only\">{{ $t(\"OctoPrint Tunnel\") }}</span>\n        </a>\n        <!-- Configure -->\n        <a\n          :href=\"`/printers/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          title=\"Configure\"\n        >\n          <i class=\"fas fa-wrench\"></i>\n          <span class=\"sr-only\">{{ $t(\"Configure\") }}</span>\n        </a>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'share',\n                icon: 'fas fa-share-alt fa-lg',\n                title: $t('Share'),\n                callback: true,\n              },\n              {\n                key: 'tunnel',\n                svgIcon: 'svg-tunnel',\n                title: $t('OctoPrint Tunnel'),\n                href: `/tunnels/${printer.id}/`,\n              },\n              {\n                key: 'settings',\n                icon: 'fas fa-wrench',\n                title: $t('Configure'),\n                href: `/printers/${printer.id}/`,\n              },\n            ]\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          />\n        </b-dropdown>\n      </div>\n    </template>\n    <template #content>\n      <loading-placeholder v-if=\"!printer\" />\n      <div v-else class=\"page-container\" fluid>\n        <div class=\"widgets-container\">\n          <template v-for=\"widget in widgets\">\n            <component\n              :is=\"widget.component\"\n              v-if=\"isWidgetVisible(widget)\"\n              :key=\"widget.id\"\n              :printer=\"printer\"\n              :printer-comm=\"printerComm\"\n              :print=\"lastPrint\"\n              @sendPrinterAction=\"onSendPrinterAction\"\n              @notAFailureClicked=\"onNotAFailureClicked\"\n              @updateSettings=\"onUpdateSettings\"\n            ></component>\n          </template>\n\n          <div class=\"extra-actions\">\n            <h2 class=\"section-title\">{{ $t(\"Additional Actions\") }}</h2>\n            <b-button variant=\"outline-secondary\" class=\"custom-button\" @click=\"onReorderClicked\">\n              <i class=\"fas fa-arrows-alt-v\"></i>\n              {{$t(\"Reorder\")}} &amp; {{$t(\"Hide\")}}\n            </b-button>\n            <div class=\"text-muted extra-actions-explanation\">\n              <small>{{ $t(\"Customize this page for each of your printers by reodering or hiding cards above.\") }}</small\n              >\n            </div>\n            <b-button variant=\"outline-primary\" class=\"custom-button\" href=\"/printers/wizard/\">\n              <i class=\"fas fa-plus\"></i>\n              {{$t(\"Add Printer\")}}\n            </b-button>\n            <div class=\"text-muted extra-actions-explanation\">\n              <small>{{ $t(\"Link another printer to {brandName}.\",{brandName:$syndicateText.brandName}) }}</small>\n            </div>\n          </div>\n        </div>\n        <div class=\"stream-container\">\n          <div class=\"header-container\">\n            <div class=\"title\">{{ $t('Webcam') }}</div>\n            <div class=\"d-flex align-items-center\">\n              <b-dropdown v-if=\"webcams.length > 1\" class=\"webcam-dropdown\" block size=\"sm\" variant=\"link\" toggle-class=\"text-decoration-none\" no-caret>\n                <template #button-content>\n                  <i class=\"fa fa-camera\" aria-hidden=\"true\"></i>\n                  {{ !!selectedWebcam ? (selectedWebcam.name || 'Primary') : 'All' }}\n                  <i class=\"fa fa-chevron-down\" aria-hidden=\"true\"></i>\n                </template>\n                <b-dropdown-text class=\"small text-secondary\">{{ $t(\"WEBCAM SELECTION\") }}</b-dropdown-text>\n                <b-dropdown-item v-for=\"(webcam, index) in webcams\" :key=\"index\" href=\"#\" @click=\"chooseWebcam(index, webcam.stream_id)\">{{ webcam.name || 'Primary' }}</b-dropdown-item>\n                <b-dropdown-item @click=\"chooseWebcam('all')\">{{ $t('All') }}</b-dropdown-item>\n              </b-dropdown>\n              <div v-else class=\"mr-3\">\n                <i class=\"fa fa-camera\" aria-hidden=\"true\"></i>\n                {{ webcams.length ? webcams[0].name || 'Primary' : '' }}\n              </div>\n            </div>\n          </div>\n        <b-card-text v-if=\"webcams.length || printer?.pic?.img_url\" class=\"px-0 py-0 content d-inline-block\" style=\"width: 100%;\">\n            <b-row>\n                <b-col class=\"pb-0\" style=\"position: relative\">\n                  <b-container fluid class=\"p-0\">\n                    <b-row no-gutters style=\"flex-direction: column; align-items: center;\">\n                      <b-col v-if=\"webcams.length === 0 && printer?.pic?.img_url\" :key=\"printer?.pic?.img_url\" :cols=\"12\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :autoplay=\"true\"\n                            :stickyStreamingSrc=\"'IMAGE'\"\n                          />\n                        </div>\n                      </b-col>\n                      <b-col v-for=\"(webcam, index) in webcams\" :key=\"index\" v-show=\"isWebcamSelected(webcam)\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :webrtc=\"printerComm.webrtcConnections.get(webcam.name)\"\n                            :autoplay=\"user.is_pro\"\n                            :webcam=\"webcam\"\n                            :halfHeight=\"webcams.length > 1 && !selectedWebcam\"\n                            @onRotateRightClicked=\"(deg) => handleRotateRightClicked(deg, webcam.stream_id)\"\n                          />\n                        </div>\n                      </b-col>\n                    </b-row>\n                  </b-container>\n              </b-col>\n            </b-row>\n        </b-card-text>\n        </div>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport split from 'lodash/split'\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport { normalizedPrinter, normalizedPrint } from '@src/lib/normalizers'\nimport StreamingBox from '@src/components/StreamingBox'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport WebRTCConnection, {DataChannelOnlyWebRTCConnection} from '@src/lib/webrtc'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { user } from '@src/lib/page-context'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport PrintJobControlWidget from '@src/components/printer-control/PrintJobControlWidget'\nimport PrintProgressWidget from '@src/components/printer-control/PrintProgressWidget'\nimport FailureDetectionWidget from '@src/components/printer-control/FailureDetectionWidget'\nimport TemperatureWidget from '@src/components/printer-control/TemperatureWidget'\nimport PrinterControlWidget from '@src/components/printer-control/PrinterControlWidget'\nimport ReorderModal from '@src/components/ReorderModal'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport SharePrinter from '@src/components/printers/SharePrinter.vue'\nimport TerminalWidget from '../components/printer-control/TerminalWidget.vue'\nimport DisplayStatusWidget from '../components/printer-control/DisplayStatusWidget.vue'\nimport PowerControlWidget from '@src/components/printer-control/PowerControlWidget.vue'\n\nconst RESUME_PRINT = '/resume_print/'\nconst MUTE_CURRENT_PRINT = '/mute_current_print/?mute_alert=true'\nconst ACK_ALERT_NOT_FAILED = '/acknowledge_alert/?alert_overwrite=NOT_FAILED'\n\n// Widgets config (for local storage and params) format: [{id: 1, enabled: true}, ...]\n// WIDGETS below maps IDs to other useful info\nconst WIDGETS = [\n  {\n    id: 7,\n    title: 'LCD Display Message',\n    component: 'DisplayStatusWidget',\n  },\n  {\n    id: 1,\n    title: 'Print Job Control',\n    component: 'PrintJobControlWidget',\n  },\n  {\n    id: 2,\n    title: 'Last Print / Progress',\n    component: 'PrintProgressWidget',\n  },\n  {\n    id: 3,\n    title: 'Failure Detection',\n    component: 'FailureDetectionWidget',\n  },\n  {\n    id: 4,\n    title: 'Temperature Controls',\n    component: 'TemperatureWidget',\n  },\n  {\n    id: 5,\n    title: 'Printer Controls',\n    component: 'PrinterControlWidget',\n  },\n  {\n    id: 8,\n    title: 'Power',\n    component: 'PowerControlWidget',\n  },\n  {\n    id: 6,\n    title: 'Terminal Widget',\n    component: 'TerminalWidget',\n  },\n]\n\nexport default {\n  name: 'PrinterControlPage',\n\n  components: {\n    StreamingBox,\n    PageLayout,\n    CascadedDropdown,\n    PrintJobControlWidget,\n    PrintProgressWidget,\n    FailureDetectionWidget,\n    TemperatureWidget,\n    PrinterControlWidget,\n    PowerControlWidget,\n    TerminalWidget,\n    DisplayStatusWidget,\n  },\n\n  data() {\n    return {\n      user: null,\n      printerId: null,\n      printer: null,\n      webcams: [],\n      currentBitrate: null,\n      lastPrint: null,\n      lastPrintFetchCounter: 0,\n      widgetsConfig: null,\n      customRotationDeg: 0,\n      preferredWebcam: null,\n      customRotationData: [],\n    }\n  },\n\n  computed: {\n    widgets() {\n      if (!this.widgetsConfig) return\n      return this.widgetsConfig.map((widget) => {\n        const configItem = WIDGETS.find((w) => w.id === widget.id)\n        return { ...widget, ...configItem }\n      })\n    },\n    videoRotationDeg() {\n      const rotation = +(this.printer?.settings?.webcam_rotation ?? 0) + this.customRotationDeg\n      return rotation % 360\n    },\n    selectedWebcam() {\n      if (this.preferredWebcam === null) {\n        return undefined\n      } else {\n        return this.webcams.find(webcam => webcam.stream_id == this.preferredWebcam)\n      }\n    }\n  },\n\n  watch: {\n    printer: {\n      handler(newValue, oldValue) {\n        if (newValue && oldValue === null) {\n          this.widgetsConfig = this.restoreWidgets()\n        } else {\n          if (\n            newValue?.isActive() !== oldValue?.isActive() ||\n            newValue?.current_print?.started_at !== oldValue?.current_print?.started_at\n          ) {\n            // poll server for the last print with correct status on starting/cancelling/finishing print\n            this.fetchLastPrint({ pollForCorrect: true })\n          }\n        }\n      },\n      deep: true,\n    },\n  },\n\n  created() {\n    this.customRotationDeg = getLocalPref('webcamRotationDeg', 0, `${this.printer?.id}_${this.webcams.length ? this.webcams[0].stream_id : 0}`)\n    this.user = user()\n    this.printerId = split(window.location.pathname, '/').slice(-3, -2).pop()\n    this.fetchLastPrint()\n    this.preferredWebcam = getLocalPref('preferredWebcam', null, this.printerId)\n\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.printerId,\n      urls.printerWebSocket(this.printerId),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.printer = normalizedPrinter(data, this.printer)\n\n          if (this.printer?.settings?.data_channel_id && !this.printerComm.webrtcConnections.has(null)) { // null means it's data channel only\n            const dataChannelOnlyWebrtc = DataChannelOnlyWebRTCConnection([parseInt(this.printer.settings.data_channel_id)]);\n            dataChannelOnlyWebrtc.openForPrinter(this.printer.id, this.printer.auth_token);\n            this.printerComm.setWebRTCConnection(null, dataChannelOnlyWebrtc);\n          }\n\n          if ((this.printer?.settings?.webcams || []).length > 0) {\n            const webcamsDeepCopy = JSON.parse(JSON.stringify(this.printer?.settings?.webcams)) // Probably a good idea to deep copy as we will change the objects and keep them around\n\n            for (const webcam of webcamsDeepCopy) {\n              if (this.printerComm.webrtcConnections.has(webcam.name)) {\n                  continue;\n              }\n              this.webcams.push(webcam)\n              const webrtc = WebRTCConnection(webcam.stream_mode, webcam.stream_id)\n              this.printerComm.setWebRTCConnection(webcam.name, webrtc);\n              // Has to be called after this.webcams.push(webcam) otherwise the callbacks won't be established properly.\n              webrtc.openForPrinter(this.printer.id, this.printer.auth_token)\n            }\n          }\n        },\n        onStatusReceived: (printerStatus) => {\n          // Backward compatibility: octoprint_data is for OctoPrint-Obico 2.1.2 or earlier, or moonraker-obico 0.5.1 or earlier\n          const status = printerStatus.status || printerStatus.octoprint_data\n          this.printer = normalizedPrinter({ status }, this.printer)\n        },\n      }\n    )\n    this.printerComm.connect()\n  },\n\n  mounted() {\n    document.querySelector('body').style.paddingBottom = 0\n  },\n\n  methods: {\n    isWidgetVisible(widget) {\n      if (!widget.enabled) return false\n\n      // PrintJobControlWidget always shows\n      if (widget.component === 'PrintJobControlWidget') return true\n\n      // Moonraker power devices remain available when Klippy is disconnected.\n      if (widget.component === 'PowerControlWidget') {\n        return this.printer.agent_connected && this.printer.isAgentMoonraker()\n      }\n\n      // DisplayStatusWidget only shows when there's a message\n      if (widget.component === 'DisplayStatusWidget') {\n        return !!this.printer.status?.display_status?.message\n      }\n\n      // All other widgets require printer to be online and connected\n      return !this.printer.isOffline() && !this.printer.isDisconnected()\n    },\n    isWebcamSelected(webcam) {\n      if (this.preferredWebcam === null) {\n        return true\n      }\n      // In case this.preferredWebcam is an old stream_id that no longer exists\n      const webcamExists = this.webcams.some(w => w.stream_id === this.preferredWebcam)\n      if (!webcamExists) {\n        return true\n      }\n      return this.preferredWebcam === webcam.stream_id\n    },\n    handleRotateRightClicked(val, streamId) {\n      const customRotationIndex = this.customRotationData.findIndex(custom => custom.streamId === streamId)\n      if (customRotationIndex === -1) {\n        this.customRotationData.push({ streamId: streamId, customRotation: val })\n      } else {\n        this.customRotationData[customRotationIndex].customRotation = val\n      }\n\n      this.customRotationDeg = val\n    },\n    chooseWebcam(value, streamId = 'all') {\n      if (value == 'all') {\n        this.preferredWebcam = null\n      } else {\n        this.preferredWebcam = streamId\n      }\n      setLocalPref('preferredWebcam', this.preferredWebcam, this.printer.id)\n    },\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'share') {\n        this.onSharePrinter()\n      }\n    },\n    onSharePrinter() {\n      this.$swal.openModalWithComponent(\n        SharePrinter,\n        {\n          isProAccount: this.user.is_pro,\n          printer: this.printer,\n        },\n        {\n          confirmButtonText: 'Close',\n        }\n      )\n    },\n    restoreWidgets() {\n      let widgets = WIDGETS.map((w) => ({ id: w.id, enabled: true }))\n\n      if (isLocalStorageSupported()) {\n        widgets =\n          JSON.parse(localStorage.getItem('printer-control-widgets-' + this.printer.id)) || widgets\n      }\n\n      // add any new widgets\n      for (const WIDGET of WIDGETS) {\n        if (!widgets.find((w) => w.id === WIDGET.id)) {\n          widgets.push({ id: WIDGET.id, enabled: true })\n        }\n      }\n\n      // remove any old widgets which are no longer supported\n      for (const widget of widgets) {\n        if (!WIDGETS.find((w) => w.id === widget.id)) {\n          widgets.splice(widgets.indexOf(widget), 1)\n        }\n      }\n\n      // delete terminal widget if it's not supported\n      const terminalWidget = widgets.find((w) => w.id === 6)\n      if (terminalWidget && !this.printer.isAgentVersionGte('2.3.11', '1.4.4')) {\n        widgets.splice(widgets.indexOf(terminalWidget), 1)\n      }\n\n      if (isLocalStorageSupported()) {\n        localStorage.setItem('printer-control-widgets-' + this.printer.id, JSON.stringify(widgets))\n      }\n      return widgets\n    },\n    onUpdateSettings(props) {\n      const { settingName, settingValue } = props\n      this.printer[settingName] = settingValue\n\n      axios\n        .patch(urls.printer(this.printer.id), {\n          [settingName]: settingValue,\n        })\n        .catch((err) => {\n          console.error('Failed to update printer settings: ', err)\n        })\n    },\n    fetchLastPrint(props) {\n      const defaultProps = { pollForCorrect: false }\n      const { pollForCorrect } = props || defaultProps\n\n      axios\n        .get(urls.prints(), {\n          params: {\n            start: 0,\n            limit: 1,\n            filter_by_printer_ids: [this.printerId],\n            sorting: 'date_desc',\n          },\n        })\n        .then((response) => {\n          if (response.data.length) {\n            this.lastPrint = normalizedPrint(response.data[0])\n          }\n\n          if (pollForCorrect) {\n            let retry = false\n            if (!this.lastPrint || this.printer.isActive() !== this.lastPrint.status.isActive) {\n              retry = true\n            }\n\n            if (retry && this.lastPrintFetchCounter < 5) {\n              const newDelay = (this.lastPrintFetchCounter + 1) * 1000\n              setTimeout(() => this.fetchLastPrint({ pollForCorrect: true }), newDelay)\n              this.lastPrintFetchCounter += 1\n            } else {\n              this.lastPrintFetchCounter = 0\n            }\n          }\n        })\n        .catch((error) => {\n          console.error('Error fetching last print: ', error)\n        })\n    },\n\n    onNotAFailureClicked(ev, resumePrint) {\n      this.$swal.Confirm.fire({\n        title: `${this.$i18next.t('Noted!')}`,\n        html: `<p>${this.$i18next.t(\"Do you want to mute failure detection on for this print?\")}</p><small>${this.$i18next.t(\"If you select 'Mute', failure detection will be turned off for this print, but will be automatically turned on for your next print.\")}</small>`,\n        confirmButtonText: `${this.$i18next.t('Mute')}`,\n        cancelButtonText: `${this.$i18next.t('Cancel')}`,\n      }).then((result) => {\n        if (result.isConfirmed) {\n          // Hack: So that 2 APIs are not called at the same time\n          setTimeout(() => {\n            this.onSendPrinterAction(this.printer.id, MUTE_CURRENT_PRINT)\n          }, 1000)\n        }\n        if (resumePrint) {\n          this.printer.setTransientState('Resuming')\n          this.onSendPrinterAction(this.printer.id, RESUME_PRINT)\n        } else {\n          this.onSendPrinterAction(this.printer.id, ACK_ALERT_NOT_FAILED)\n        }\n      })\n      ev.preventDefault()\n    },\n    onSendPrinterAction(printerId, path, isOctoPrintCommand) {\n      axios.post(urls.printerAction(printerId, path))\n    },\n    onReorderClicked() {\n      this.$swal\n        .openModalWithComponent(\n          ReorderModal,\n          {\n            items: [...this.widgetsConfig],\n            extraInfo: WIDGETS,\n          },\n          {\n            confirmButtonText: `${this.$i18next.t('Save')}`,\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                config: document.getElementById('sorting-config').value,\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value?.config) {\n            const config = JSON.parse(result.value.config)\n\n            this.widgetsConfig = config\n\n            if (isLocalStorageSupported()) {\n              localStorage.setItem(\n                'printer-control-widgets-' + this.printer.id,\n                JSON.stringify(config)\n              )\n            }\n          }\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.webcamBackground\n    position: relative\n\n// Navbar\n.printer-name\n  font-size: 1rem\n  max-width: 360px\n  font-weight: bold\n  @media (max-width: 768px)\n    max-width: 200px\n.divider\n  margin-right: 1rem\n  width: 1px\n  height: 1rem\n  display: inline-block\n  background-color: var(--color-divider)\n.custom-svg-icon\n  height: 1.25rem\n  width: 1.25rem\n\n.page-container\n  --widget-width: 480px\n  display: flex\n  flex: 1\n  padding: 0 15px\n  @media (max-width: 768px)\n    flex: unset\n\n.widgets-container\n  flex-shrink: 0\n  width: var(--widget-width)\n.stream-container\n  flex: 1\n  position: fixed\n  right: var(--gap-between-blocks)\n  top: calc(50px + var(--gap-between-blocks))\n  width: calc(100vw - 100px - var(--gap-between-blocks)*3 - var(--widget-width))\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  background-color: #000\n\n  .header-container\n    display: flex\n    justify-content: space-between\n    background-color: var(--color-surface-secondary)\n    .title\n      color: var(--color-text-secondary)\n      padding: 6px 12px\n      font-size: 14px\n\n@media (max-width: 1024px)\n  .page-container\n    box-sizing: content-box\n    width: 100%\n    max-width: var(--widget-width)\n    margin: 0 auto\n    flex-direction: column\n\n  .widgets-container\n    order: 2\n    width: 100%\n\n  .stream-container\n    order: 1\n    position: relative\n    top: 0\n    left: 0\n    width: 100%\n    margin-bottom: 15px\n    flex: 0\n\n.page-container\n  @media (max-width: 510px)\n    box-sizing: border-box\n    padding: 0 15px\n\n    .widgets-container\n      width: 100%\n\n.extra-actions\n  display: flex\n  justify-content: center\n  margin-top: var(--gap-between-blocks)\n  gap: 1rem\n  .extra-actions-explanation, .section-title\n    display: none\n  @media (max-width: 510px)\n    margin-top: 2rem\n    flex-direction: column\n    .extra-actions-explanation\n      display: block\n      text-align: center\n      margin-top: -0.5rem\n      margin-bottom: 1rem\n    .section-title\n      display: block\n      text-align: center\n      margin-bottom: 1rem\n\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterControlPage.vue?vue&type=template&id=b5382844&scoped=true&\"\nimport script from \"./PrinterControlPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterControlPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterControlPage.vue?vue&type=style&index=0&id=b5382844&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b5382844\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',{staticClass:\"flex-full-size\",class:{ 'is-in-mobile': _vm.useMobileLayout },attrs:{\"fluid\":\"xl\"}},[_c('b-row',{staticClass:\"flex-full-size\"},[_c('b-col',{staticClass:\"flex-full-size\"},[(_vm.user)?_c('div',{staticClass:\"flex-full-size\"},[(_vm.useMobileLayout)?_c('div',{staticClass:\"mobile-settings-wrapper full-on-mobile\"},[(_vm.$route.path === '/user_preferences/')?_c('div',{staticClass:\"mobile-settings-categories\"},[_c('h2',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.onlyNotifications),expression:\"!onlyNotifications\"}],staticClass:\"categories-title section-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Account\"))+\" \")]),_vm._l((_vm.sections),function(value,name){return [(!value.isHidden)?_c('router-link',{key:name,class:value.isSubcategory ? 'subcategory' : '',attrs:{\"to\":value.route}},[_c('span',[(value.faIcon)?_c('i',{class:[value.faIcon, 'mr-2'],staticStyle:{\"font-size\":\"1.125rem\"}}):_vm._e(),_c('span',[_vm._v(_vm._s(value.title))])]),_c('i',{staticClass:\"fas fa-arrow-right\"})]):_vm._e()]}),(!_vm.onlyNotifications)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.logout.apply(null, arguments)}}},[_c('span',[_c('i',{class:['fas fa-sign-out-alt', 'mr-2'],staticStyle:{\"font-size\":\"1.125rem\"}}),_vm._v(\" \"+_vm._s(_vm.$t('Logout'))+\" \")])]):_vm._e()],2):_c('div',{staticClass:\"mobile-settings-content\",class:{ 'is-in-mobile': _vm.useMobileLayout }},[(\n                    _vm.currentSection &&\n                    (!_vm.currentSection.isNotificationChannel || _vm.availableNotificationPlugins)\n                  )?_c(_vm.currentRouteComponent,{tag:\"component\",attrs:{\"user\":_vm.user,\"error-messages\":_vm.errorMessages,\"saving\":_vm.saving,\"config\":_vm.config,\"notification-channel\":_vm.currentSection && _vm.currentSection.isNotificationChannel ? _vm.currentSection : {}},on:{\"createNotificationChannel\":_vm.createNotificationChannel,\"updateNotificationChannel\":_vm.patchNotificationChannel,\"deleteNotificationChannel\":_vm.deleteNotificationChannel,\"clearErrorMessages\":_vm.clearErrorMessages,\"addErrorMessage\":_vm.addErrorMessage,\"updateSetting\":_vm.updateSetting}}):_vm._e()],1)]):_c('b-tabs',{staticClass:\"desktop-settings-wrapper\",attrs:{\"vertical\":true,\"nav-wrapper-class\":\"settings-nav\",\"active-nav-item-class\":\"\",\"content-class\":\"desktop-settings-content\"},on:{\"activate-tab\":_vm.updateRoute},scopedSlots:_vm._u([{key:\"tabs-end\",fn:function(){return [_c('li',{staticClass:\"nav-item\"},[_c('a',{staticClass:\"nav-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.logout.apply(null, arguments)}}},[_c('i',{class:['fas fa-sign-out-alt', 'mr-2']}),_vm._v(\" \"+_vm._s(_vm.$t('Logout'))+\" \")])])]},proxy:true}],null,false,2570481543)},[_vm._l((_vm.sections),function(value,name){return [(!value.isHidden)?_c('b-tab',{key:name,attrs:{\"title-item-class\":value.isSubcategory ? 'subcategory' : '',\"active\":_vm.$route.path === value.route,\"disabled\":value.isNotificationChannel && !_vm.user.notification_enabled},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [(value.faIcon)?_c('i',{class:[value.faIcon, 'mr-2']}):_vm._e(),_vm._v(\" \"+_vm._s(value.title)+\" \")]},proxy:true}],null,true)},[(!value.isNotificationChannel || _vm.availableNotificationPlugins)?_c(name,{tag:\"component\",attrs:{\"user\":_vm.user,\"error-messages\":_vm.errorMessages,\"saving\":_vm.saving,\"config\":_vm.config,\"notification-channel\":value.isNotificationChannel ? value : {}},on:{\"createNotificationChannel\":_vm.createNotificationChannel,\"updateNotificationChannel\":_vm.patchNotificationChannel,\"deleteNotificationChannel\":_vm.deleteNotificationChannel,\"clearErrorMessages\":_vm.clearErrorMessages,\"addErrorMessage\":_vm.addErrorMessage,\"updateSetting\":_vm.updateSetting}}):_vm._e()],1):_vm._e()]})],2)],1):_c('div',{staticClass:\"text-center\"},[_c('b-spinner',{staticClass:\"mt-5\",attrs:{\"label\":_vm.$t('Loading...')}})],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import routes from '@config/user-preferences/pref-routes'\nimport notificationPlugins from '@src/notifications/plugins'\nimport { inMobileWebView } from '@src/lib/page-context'\nimport i18n from '@src/i18n/i18n.js'\n\nconst onlyNotifications =\n  new URLSearchParams(window.location.search).get('onlyNotifications') === 'true'\n\nconst defaultSections = {\n  GeneralPreferences: {\n    title: `${i18n.t('General')}`,\n    faIcon: 'fas fa-cog',\n    importComponent: () => import('@src/components/user-preferences/GeneralPreferences'),\n    route: routes.GeneralPreferences,\n    isHidden: inMobileWebView() || onlyNotifications,\n  },\n  ThemePreferences: {\n    title: `${i18n.t('Appearance')}`,\n    faIcon: 'fas fa-magic',\n    importComponent: () => import('@src/components/user-preferences/ThemePreferences'),\n    route: routes.ThemePreferences,\n    isHidden:\n      (inMobileWebView() &&\n        !(new URLSearchParams(window.location.search).get('themeable') === 'true')) ||\n      onlyNotifications,\n  },\n  ProfilePreferences: {\n    title: `${i18n.t('Profile')}`,\n    faIcon: 'fas fa-user-edit',\n    importComponent: () => import('@src/components/user-preferences/ProfilePreferences'),\n    route: routes.ProfilePreferences,\n    isHidden: onlyNotifications,\n  },\n  AuthorizedApps: {\n    title: `${i18n.t('Authorized Apps')}`,\n    faIcon: 'fas fa-check-circle',\n    importComponent: () => import('@src/components/user-preferences/AuthorizedApps'),\n    route: routes.AuthorizedApps,\n    isHidden: onlyNotifications,\n  },\n\n  // Notifications\n  GeneralNotifications: {\n    title: `${i18n.t('Notifications')}`,\n    faIcon: 'fas fa-bell',\n    importComponent: () =>\n      import('@src/components/user-preferences/notifications/GeneralNotifications'),\n    route: routes.GeneralNotifications,\n  },\n  PushNotifications: {\n    title: `${i18n.t('Push Notification')}`,\n    isSubcategory: true,\n    isNotificationChannel: true,\n    importComponent: () => ({}),\n    route: routes.PushNotifications,\n    isHidden: !inMobileWebView(),\n  },\n}\n\nconst notificationSections = Object.keys(notificationPlugins).reduce((obj, name) => {\n  return Object.assign(obj, {\n    [name]: {\n      title: notificationPlugins[name].displayName,\n      channelName: name,\n      isSubcategory: true,\n      isNotificationChannel: true,\n      route: routes[name],\n      importComponent: () =>\n        import('@src/notifications/plugins/' + notificationPlugins[name].componentName),\n    },\n  })\n}, {})\n\nexport default {\n  ...defaultSections,\n  ...notificationSections,\n}\n","import routes from '@config/user-preferences/pref-routes'\nimport publicSections from '@src/config/user-preferences/sections'\nimport i18n from '@src/i18n/i18n.js'\nlet entSections = {}\n\nconst onlyNotifications =\n  new URLSearchParams(window.location.search).get('onlyNotifications') === 'true'\n\nconst subscriptionSection = {\n  title: `${i18n.t('Subscription')}`,\n  faIcon: 'fas fa-money-check',\n  importComponent: () => import('@entSrc/components/user-preferences/SubscriptionPreferences'),\n  route: routes.Subscription,\n  isHidden: onlyNotifications,\n}\nconst detectiveHoursSection = {\n  title: `${i18n.t('AI Detection Hours')}`,\n  faIcon: 'fas fa-hourglass-half',\n  importComponent: () => import('@entSrc/components/user-preferences/DetectiveHours'),\n  route: routes.DetectiveHours,\n  isHidden: onlyNotifications,\n}\nconst deleteAccountSection = {\n  title: `${i18n.t('Delete Account')}`,\n  faIcon: 'fas fa-trash-alt',\n  importComponent: () => import('@entSrc/components/user-preferences/DeleteAccount'),\n  route: routes.DeleteAccount,\n  isHidden: onlyNotifications,\n}\n\nfor (const [key, value] of Object.entries(publicSections)) {\n  // insert Subscription section right before Athorized Apps\n  if (key === 'AuthorizedApps') {\n    entSections.Subscription = subscriptionSection\n    entSections.DetectiveHours = detectiveHoursSection\n  }\n  entSections[key] = value\n}\n\n// reinsurance: if Authorized Apps will gone, instert Subscription at the end\nif (!entSections.Subscription) {\n  entSections.Subscription = subscriptionSection\n  entSections.DetectiveHours = detectiveHoursSection\n}\n\nentSections.DeleteAccount = deleteAccountSection\n\nexport default entSections\n","<template>\n  <page-layout>\n    <template #content>\n      <b-container fluid=\"xl\" :class=\"{ 'is-in-mobile': useMobileLayout }\" class=\"flex-full-size\">\n        <b-row class=\"flex-full-size\">\n          <b-col class=\"flex-full-size\">\n            <div v-if=\"user\" class=\"flex-full-size\">\n              <!-- Mobile (web / app) -->\n              <div v-if=\"useMobileLayout\" class=\"mobile-settings-wrapper full-on-mobile\">\n                <div v-if=\"$route.path === '/user_preferences/'\" class=\"mobile-settings-categories\">\n                  <h2 v-show=\"!onlyNotifications\" class=\"categories-title section-title\">\n                    {{$t(\"Account\")}}\n                  </h2>\n                  <template v-for=\"(value, name) in sections\">\n                    <router-link\n                      v-if=\"!value.isHidden\"\n                      :key=\"name\"\n                      :to=\"value.route\"\n                      :class=\"value.isSubcategory ? 'subcategory' : ''\"\n                    >\n                      <span>\n                        <i\n                          v-if=\"value.faIcon\"\n                          :class=\"[value.faIcon, 'mr-2']\"\n                          style=\"font-size: 1.125rem\"\n                        ></i>\n                        <span>{{ value.title }}</span>\n                      </span>\n                      <i class=\"fas fa-arrow-right\"></i>\n                    </router-link>\n                  </template>\n\n                  <a v-if=\"!onlyNotifications\" href=\"#\" @click.prevent=\"logout\">\n                    <span>\n                      <i :class=\"['fas fa-sign-out-alt', 'mr-2']\" style=\"font-size: 1.125rem\"></i>\n                      {{$t('Logout')}}\n                    </span>\n                  </a>\n                </div>\n                <div\n                  v-else\n                  class=\"mobile-settings-content\"\n                  :class=\"{ 'is-in-mobile': useMobileLayout }\"\n                >\n                  <component\n                    :is=\"currentRouteComponent\"\n                    v-if=\"\n                      currentSection &&\n                      (!currentSection.isNotificationChannel || availableNotificationPlugins)\n                    \"\n                    :user=\"user\"\n                    :error-messages=\"errorMessages\"\n                    :saving=\"saving\"\n                    :config=\"config\"\n                    :notification-channel=\"\n                      currentSection && currentSection.isNotificationChannel ? currentSection : {}\n                    \"\n                    @createNotificationChannel=\"createNotificationChannel\"\n                    @updateNotificationChannel=\"patchNotificationChannel\"\n                    @deleteNotificationChannel=\"deleteNotificationChannel\"\n                    @clearErrorMessages=\"clearErrorMessages\"\n                    @addErrorMessage=\"addErrorMessage\"\n                    @updateSetting=\"updateSetting\"\n                  ></component>\n                </div>\n              </div>\n              <!-- Desktop -->\n              <b-tabs\n                v-else\n                :vertical=\"true\"\n                class=\"desktop-settings-wrapper\"\n                nav-wrapper-class=\"settings-nav\"\n                active-nav-item-class=\"\"\n                content-class=\"desktop-settings-content\"\n                @activate-tab=\"updateRoute\"\n              >\n                <template v-for=\"(value, name) in sections\">\n                  <b-tab\n                    v-if=\"!value.isHidden\"\n                    :key=\"name\"\n                    :title-item-class=\"value.isSubcategory ? 'subcategory' : ''\"\n                    :active=\"$route.path === value.route\"\n                    :disabled=\"value.isNotificationChannel && !user.notification_enabled\"\n                  >\n                    <template #title>\n                      <i v-if=\"value.faIcon\" :class=\"[value.faIcon, 'mr-2']\"></i>\n                      {{ value.title }}\n                    </template>\n                    <component\n                      :is=\"name\"\n                      v-if=\"!value.isNotificationChannel || availableNotificationPlugins\"\n                      :user=\"user\"\n                      :error-messages=\"errorMessages\"\n                      :saving=\"saving\"\n                      :config=\"config\"\n                      :notification-channel=\"value.isNotificationChannel ? value : {}\"\n                      @createNotificationChannel=\"createNotificationChannel\"\n                      @updateNotificationChannel=\"patchNotificationChannel\"\n                      @deleteNotificationChannel=\"deleteNotificationChannel\"\n                      @clearErrorMessages=\"clearErrorMessages\"\n                      @addErrorMessage=\"addErrorMessage\"\n                      @updateSetting=\"updateSetting\"\n                    ></component>\n                  </b-tab>\n                </template>\n                <template #tabs-end>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link\" href=\"#\" @click.prevent=\"logout\">\n                      <i :class=\"['fas fa-sign-out-alt', 'mr-2']\"></i>\n                      {{$t('Logout')}}\n                    </a>\n                  </li>\n                </template>\n              </b-tabs>\n            </div>\n            <div v-else class=\"text-center\">\n              <b-spinner class=\"mt-5\" :label=\"$t('Loading...')\"></b-spinner>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { inMobileWebView } from '@src/lib/page-context'\nimport sections from '@config/user-preferences/sections'\nimport routes from '@config/user-preferences/pref-routes'\nimport { getNotificationSettingKey } from '@src/lib/utils'\n\nexport default {\n  name: 'UserPreferencesPage',\n\n  components: {\n    PageLayout,\n    ...Object.keys(sections).reduce((obj, name) => {\n      return Object.assign(obj, { [name]: sections[name].importComponent })\n    }, {}),\n  },\n\n  props: {\n    config: {\n      default() {\n        return {}\n      },\n      type: Object,\n    },\n  },\n\n  data() {\n    return {\n      sections,\n      availableNotificationPlugins: null,\n      configuredNotificationChannels: null,\n      user: null,\n      saving: {},\n      errorMessages: {},\n      delayedSubmit: {\n        // Make pause before sending new value to API\n        first_name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        last_name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n      },\n      combinedInputs: {}, // Send changes to API only if all the other values in the array have data\n      useMobileLayout: false,\n    }\n  },\n\n  computed: {\n    visibleSections() {\n      return Object.values(sections).filter((item) => !item.isHidden)\n    },\n    currentRouteComponent() {\n      for (const [component, route] of Object.entries(routes)) {\n        if (this.$route.path === route) {\n          return component\n        }\n      }\n      return null\n    },\n    currentSection() {\n      for (const section of Object.values(this.sections)) {\n        if (section.route === this.$route.path) {\n          return section\n        }\n      }\n      return null\n    },\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n    clientIsThemeable() {\n      return (\n        !inMobileWebView() ||\n        new URLSearchParams(window.location.search).get('themeable') === 'true'\n      )\n    },\n    onlyNotifications() {\n      return new URLSearchParams(window.location.search).get('onlyNotifications') === 'true'\n    },\n  },\n\n  created() {\n    this.fetchNotificationPlugins()\n    this.fetchNotificationChannels()\n    this.fetchUser()\n  },\n\n  mounted() {\n    this.checkMobileLayout()\n    window.onresize = this.checkMobileLayout\n    if (this.useMobileLayout) {\n      document.querySelector('body').style.paddingTop = '0px'\n    }\n  },\n\n  methods: {\n    updateRoute(newTabIndex) {\n      const section = Object.values(this.visibleSections)[newTabIndex]\n      this.$router.replace({ path: section.route })\n    },\n    logout() {\n      this.$swal.Confirm.fire({\n        title: `${this.$i18next.t('Confirmation')}`,\n        html: `<p class=\"text-center\">${this.$i18next.t(\"You a going to logout from your account\")}</p>`,\n        confirmButtonText: `${this.$i18next.t('Logout')}`,\n        cancelButtonText: `${this.$i18next.t('Cancel')}`,\n      }).then((result) => {\n        if (result.isConfirmed) {\n          window.location.replace('/accounts/logout/')\n        }\n      })\n    },\n    checkMobileLayout() {\n      const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0)\n      this.useMobileLayout = inMobileWebView() || vw < 1140\n    },\n    fetchUser() {\n      return axios.get(urls.user()).then((response) => {\n        this.user = response.data\n      })\n    },\n    fetchNotificationPlugins() {\n      return axios.get(urls.notificationPlugins()).then((response) => {\n        const plugins = response.data.plugins || {}\n        this.availableNotificationPlugins = plugins\n        for (const [key, val] of Object.entries(this.sections)) {\n          if (val.isNotificationChannel) {\n            this.sections[key].pluginInfo = plugins[val.channelName]\n          }\n          if (val.channelName && plugins[val.channelName] && plugins[val.channelName].env_vars) {\n            const env_vars = plugins[val.channelName].env_vars\n            const needHidden = Object.values(env_vars).some(envItem => {\n              return envItem.is_required && !envItem.is_set\n            })\n            if (needHidden) {\n              this.$set(this.sections, key, { ...this.sections[key], isHidden: true });\n            }\n          }\n        }\n      })\n    },\n    fetchNotificationChannels() {\n      return axios.get(urls.notificationChannels()).then((response) => {\n        const channels = response.data\n        this.configuredNotificationChannels = channels\n        for (const [key, val] of Object.entries(this.sections)) {\n          if (val.isNotificationChannel) {\n            this.sections[key].channelInfo = channels.find(\n              (channel) => channel.name === val.channelName\n            )\n          }\n        }\n      })\n    },\n    createNotificationChannel({ section, config, opts = {} }) {\n      const data = {\n        user: this.user.id,\n        name: section.channelName,\n        config,\n        ...opts,\n      }\n\n      const key = getNotificationSettingKey(section, 'config')\n      this.setSavingStatus(key, true)\n\n      return axios\n        .post(urls.notificationChannels(), data)\n        .then(() => {\n          this.setSavingStatus(key, false)\n          this.$router.go()\n        })\n        .catch((err) => {\n          this.setSavingStatus(key, false)\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            let errors = []\n            for (const error of Object.values(err.response.data)) {\n              if (typeof error === 'object') {\n                for (const innnerError of Object.values(error)) {\n                  errors.push(innnerError)\n                }\n              } else if (typeof error === 'string') {\n                errors.push(error)\n              } else {\n                console.warn('Undefined error object structure')\n                console.log(err.response)\n              }\n            }\n            const key = getNotificationSettingKey(section, 'config')\n            this.$set(this.errorMessages, key, errors)\n          } else {\n            this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n          }\n        })\n    },\n    patchNotificationChannel({ section, propNames, propValues }) {\n      if (propValues !== undefined) {\n        // assuming propNames.length and propValues.lenth are equal\n        propValues.forEach((value, index) => {\n          const propName = propNames[index]\n          this.sections[section.channelName].channelInfo[propName] = value\n        })\n      }\n\n      let data = {\n        name: section.channelName,\n      }\n\n      for (const prop of propNames) {\n        data[prop] = section.channelInfo[prop]\n      }\n\n      for (const prop of propNames) {\n        const key = getNotificationSettingKey(section, prop)\n        this.setSavingStatus(key, true)\n      }\n\n      return axios\n        .patch(urls.updateNotificationChannel(section.channelInfo.id), data)\n        .then(() => {\n          for (const prop of propNames) {\n            const key = getNotificationSettingKey(section, prop)\n            this.setSavingStatus(key, false)\n          }\n        })\n        .catch((err) => {\n          for (const prop of propNames) {\n            const key = getNotificationSettingKey(section, prop)\n            this.setSavingStatus(key, false)\n          }\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            let errors = []\n            for (const error of Object.values(err.response.data)) {\n              if (typeof error === 'object') {\n                for (const innnerError of Object.values(error)) {\n                  errors.push(innnerError)\n                }\n              } else if (typeof error === 'string') {\n                errors.push(error)\n              } else {\n                console.warn('Undefined error object structure')\n                console.log(err.response)\n              }\n            }\n            for (const prop of propNames) {\n              const key = getNotificationSettingKey(section, prop)\n              this.$set(this.errorMessages, key, errors)\n            }\n          } else {\n            this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n          }\n        })\n    },\n    deleteNotificationChannel(section) {\n      return axios\n        .delete(urls.updateNotificationChannel(section.channelInfo.id))\n        .then(() => {\n          this.$router.go()\n        })\n        .catch((err) => {\n          this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n        })\n    },\n    clearErrorMessages(propName) {\n      this.errorMessages[propName] = []\n    },\n    addErrorMessage(propName, message) {\n      this.errorMessages[propName]\n        ? this.errorMessages[propName].push(message)\n        : (this.errorMessages[propName] = [message])\n    },\n    patchUser(propName, propValue) {\n      let data = {}\n      let key = propName\n      const combinedInputs = this.checkForCombinedValues(propName)\n      if (combinedInputs) {\n        // Must include all the inputs from the array\n        // or don't send if some of them have no data\n        for (const input of combinedInputs.inputs) {\n          key = combinedInputs.key\n          const value = this.user[input]\n          data[input] = value\n        }\n        // Allow either completely empty or completely filled data\n        const values = Object.values(data)\n        const emptyValues = values.filter((val) => !val)\n        if (emptyValues.length !== values.length && emptyValues.length !== 0) {\n          return\n        }\n      } else {\n        data = { [propName]: propValue }\n      }\n      this.setSavingStatus(key, true)\n      // Make request to API\n      return axios\n        .patch(urls.user(), data)\n        .catch((err) => {\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            if (err.response.data.non_field_errors) {\n              this.errorDialog(err, err.response.data.non_field_errors)\n            } else {\n              for (const error in err.response.data) {\n                this.errorMessages[key] = err.response.data[error]\n              }\n            }\n          } else {\n            this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n          }\n        })\n        .then(() => {\n          // send to mobile app to update it's state\n          if (window.ReactNativeWebView) {\n            if (key === 'first_name') {\n              window.ReactNativeWebView.postMessage(\n                JSON.stringify({ firstName: this.user.first_name })\n              )\n            } else if (key === 'last_name') {\n              window.ReactNativeWebView.postMessage(\n                JSON.stringify({ lastName: this.user.last_name })\n              )\n            }\n          }\n\n          this.setSavingStatus(key, false)\n        })\n    },\n    checkForCombinedValues(propName) {\n      for (const [key, inputs] of Object.entries(this.combinedInputs)) {\n        if (inputs.includes(propName)) {\n          return { inputs, key }\n        }\n      }\n      return null\n    },\n    setSavingStatus(propName, status) {\n      if (status) {\n        delete this.errorMessages[propName]\n      }\n      this.$set(this.saving, propName, status)\n    },\n    updateSetting(settingsItem, value) {\n      if (value !== undefined) {\n        this.user[settingsItem] = value\n      }\n\n      if (settingsItem in this.delayedSubmit) {\n        const delayInfo = this.delayedSubmit[settingsItem]\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n        this.delayedSubmit[settingsItem]['timeoutId'] = setTimeout(() => {\n          this.patchUser(settingsItem, this.user[settingsItem])\n        }, delayInfo['delay'])\n        return\n      }\n      this.patchUser(settingsItem, this.user[settingsItem])\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.flex-full-size\n  display: flex\n  flex-direction: column\n  flex: 1\n.desktop-settings-wrapper\n  margin: 0\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-lg)\n  ::v-deep .desktop-settings-content\n    padding: 2rem\n    padding-right: 3rem\n.mobile-settings-wrapper\n  flex: 1\n  background-color: var(--color-surface-secondary)\n  padding: 1.5rem\n  .mobile-settings-content\n    padding-right: 1rem\n  .mobile-settings-categories\n    .categories-title\n      font-weight: bold\n      font-size: 1.5rem\n      margin-bottom: 1rem\n    a\n      color: var(--text-primary)\n      display: flex\n      justify-content: space-between\n      align-items: center\n      padding: .8rem 0\n      border-bottom: 1px solid var(--color-divider)\n      font-size: 1.2em\n      &.subcategory\n        font-size: 1em\n        padding-left: 1.625em\n      i\n        font-size: .8rem\n::v-deep section:not(:first-child) .section-title\n  margin-top: 2rem\n::v-deep .settings-nav\n  width: 25%\n  background-color: var(--color-surface-primary)\n  min-height: 80vh\n  padding: 1.5rem 1rem\n  border-radius: var(--border-radius-lg) 0 0 var(--border-radius-lg)\n  .subcategory\n    a\n      padding-left: 3.125em\n      font-size: 0.9em\n  .active\n    border-radius: 6px\n  a\n    border: initial\n::v-deep .nav-tabs\n  border-bottom: none\n\n::v-deep .inactive\n  opacity: .3\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UserPreferencesPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UserPreferencesPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UserPreferencesPage.vue?vue&type=template&id=6717962a&scoped=true&\"\nimport script from \"./UserPreferencesPage.vue?vue&type=script&lang=js&\"\nexport * from \"./UserPreferencesPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserPreferencesPage.vue?vue&type=style&index=0&id=6717962a&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6717962a\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarRight\",fn:function(){return [_c('div',[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_vm._l((_vm.eventClassFiltering),function(eventClass){return _c('b-dropdown-item',{key:eventClass.key,on:{\"click\":function($event){return _vm.toggleEventFiltering('eventClassFiltering', eventClass.key)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: eventClass.selected ? 'visible' : 'hidden' })}),_c('span',{class:_vm.cssClassFromEventClass(eventClass.key)},[_vm._v(_vm._s(eventClass.title))])])}),_c('b-dropdown-divider'),_vm._l((_vm.eventTypeFiltering),function(eventType){return _c('b-dropdown-item',{key:eventType.key,on:{\"click\":function($event){return _vm.toggleEventFiltering('eventTypeFiltering', eventType.key)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: eventType.selected ? 'visible' : 'hidden' })}),_vm._v(_vm._s(eventType.title)+\" \")])})],2)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('div',{staticClass:\"col-sm-12 col-md-10 col-lg-8\"},[(!_vm.loading && _vm.printerEvents.length === 0)?_c('div',{staticClass:\"text-center\"},[_c('img',{staticClass:\"w-25 my-4\",attrs:{\"src\":require('@static/img/vacation.gif')}}),_c('h5',{staticClass:\"text-primary\"},[_vm._v(_vm._s(_vm.$t(\"Nothing to look here. Enjoy your vacation!\")))])]):_c('div',[_vm._l((_vm.printerEvents),function(item){return _c('printer-event-card',{key:item.id,attrs:{\"printer-event\":item}})}),_c('mugen-scroll',{staticClass:\"text-center p-4\",attrs:{\"handler\":_vm.fetchMoreData,\"should-handle\":!_vm.loading}},[(_vm.noMoreData)?_c('div',{staticClass:\"text-center p-2\"},[_vm._v(_vm._s(_vm.$t(\"No more notifications.\")))]):_vm._e(),(!_vm.noMoreData)?_c('b-spinner',{attrs:{\"label\":\"Loading...\"}}):_vm._e()],1)],2)])])],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"printer-event-card my-3\",class:_vm.tintBorderClass},[_c('div',{staticClass:\"printer-event-text\",class:{ link: _vm.printerEvent.info_url },on:{\"click\":_vm.onTextClick}},[_c('div',{staticClass:\"title font-weight-bold my-2\",class:_vm.tintClass},[_vm._v(\" \"+_vm._s(_vm.eventTitle)+\" \"),(_vm.printerEvent.info_url)?_c('i',{staticClass:\"fas fa-external-link-alt\"}):_vm._e()]),_c('div',{staticClass:\"description\",domProps:{\"innerHTML\":_vm._s(_vm.printerEvent.event_text)}}),_c('div',{staticClass:\"my-2 text-muted font-weight-light small\"},[_vm._v(\" \"+_vm._s(_vm.printerEvent.created_at.format('LLLL'))+\" \")])]),(_vm.printerEvent.image_url)?_c('div',{staticClass:\"printer-event-snapshot\",style:({ backgroundImage: `url(${_vm.printerEvent.image_url})` })}):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"printer-event-card my-3\" :class=\"tintBorderClass\">\n    <div class=\"printer-event-text\" :class=\"{ link: printerEvent.info_url }\" @click=\"onTextClick\">\n      <div class=\"title font-weight-bold my-2\" :class=\"tintClass\">\n        {{ eventTitle }}\n        <i v-if=\"printerEvent.info_url\" class=\"fas fa-external-link-alt\"></i>\n      </div>\n      <div class=\"description\" v-html=\"printerEvent.event_text\"></div>\n      <div class=\"my-2 text-muted font-weight-light small\">\n        {{ printerEvent.created_at.format('LLLL') }}\n      </div>\n    </div>\n    <div\n      v-if=\"printerEvent.image_url\"\n      :style=\"{ backgroundImage: `url(${printerEvent.image_url})` }\"\n      class=\"printer-event-snapshot\"\n    ></div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'PrinterEventCard',\n\n  components: {},\n\n  props: {\n    printerEvent: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  computed: {\n    eventTitle() {\n      return this.printerEvent.event_title || `${this.$i18next.t('Unknown event')}`\n    },\n    tintClass() {\n      switch (this.printerEvent.event_class) {\n        case 'ERROR':\n          return 'text-danger'\n        case 'WARNING':\n          return 'text-warning'\n        case 'SUCCESS':\n          return 'text-success'\n        default:\n          return ''\n      }\n    },\n    tintBorderClass() {\n      switch (this.printerEvent.event_class) {\n        case 'ERROR':\n          return 'border-danger'\n        case 'WARNING':\n          return 'border-warning'\n        case 'SUCCESS':\n          return 'border-success'\n        default:\n          return ''\n      }\n    },\n  },\n\n  methods: {\n    onTextClick() {\n      if (this.printerEvent.info_url) {\n        window.open(this.printerEvent.info_url, '_blank')\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-event-card\n  display: flex\n  justify-content: space-between\n  border-radius: var(--border-radius-sm)\n  background-color: var(--color-surface-secondary)\n  border-left: solid thick\n\n  >:last-child\n    border-top-right-radius: inherit\n    border-bottom-right-radius: inherit\n\n.printer-event-text\n  flex: 1\n  padding: 0px 14px\n  overflow: hidden\n\n  .title\n    display: flex\n    justify-content: space-between\n\n  &.link\n    &:hover\n      cursor: pointer\n      opacity: .9\n\n  .description ::v-deep div\n    text-overflow: ellipsis\n    overflow: hidden\n    white-space: nowrap\n\n.printer-event-snapshot\n  flex: 0 0 120px\n  background-size: cover\n  background-repeat: no-repeat\n  background-position: center center\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterEventCard.vue?vue&type=template&id=6e084bdc&scoped=true&\"\nimport script from \"./PrinterEventCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterEventCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterEventCard.vue?vue&type=style&index=0&id=6e084bdc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6e084bdc\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #topBarRight>\n      <div>\n        <b-dropdown right no-caret toggle-class=\"icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <b-dropdown-item\n            v-for=\"eventClass in eventClassFiltering\"\n            :key=\"eventClass.key\"\n            @click=\"toggleEventFiltering('eventClassFiltering', eventClass.key)\"\n          >\n            <i\n              class=\"fas fa-check text-primary\"\n              :style=\"{ visibility: eventClass.selected ? 'visible' : 'hidden' }\"\n            ></i\n            ><span :class=\"cssClassFromEventClass(eventClass.key)\">{{ eventClass.title }}</span>\n          </b-dropdown-item>\n          <b-dropdown-divider />\n          <b-dropdown-item\n            v-for=\"eventType in eventTypeFiltering\"\n            :key=\"eventType.key\"\n            @click=\"toggleEventFiltering('eventTypeFiltering', eventType.key)\"\n          >\n            <i\n              class=\"fas fa-check text-primary\"\n              :style=\"{ visibility: eventType.selected ? 'visible' : 'hidden' }\"\n            ></i\n            >{{ eventType.title }}\n          </b-dropdown-item>\n        </b-dropdown>\n      </div>\n    </template>\n    <template #content>\n      <b-container>\n        <b-row class=\"justify-content-center\">\n          <div class=\"col-sm-12 col-md-10 col-lg-8\">\n            <div v-if=\"!loading && printerEvents.length === 0\" class=\"text-center\">\n              <img :src=\"require('@static/img/vacation.gif')\" class=\"w-25 my-4\" />\n              <h5 class=\"text-primary\">{{ $t(\"Nothing to look here. Enjoy your vacation!\") }}</h5>\n            </div>\n            <div v-else>\n              <printer-event-card\n                v-for=\"item in printerEvents\"\n                :key=\"item.id\"\n                :printer-event=\"item\"\n              />\n              <mugen-scroll\n                :handler=\"fetchMoreData\"\n                :should-handle=\"!loading\"\n                class=\"text-center p-4\"\n              >\n                <div v-if=\"noMoreData\" class=\"text-center p-2\">{{ $t(\"No more notifications.\") }}</div>\n                <b-spinner v-if=\"!noMoreData\" label=\"Loading...\"></b-spinner>\n              </mugen-scroll>\n            </div>\n          </div>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport filter from 'lodash/filter'\nimport map from 'lodash/map'\nimport axios from 'axios'\nimport MugenScroll from 'vue-mugen-scroll'\n\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport PrinterEventCard from '@src/components/printer-events/PrinterEventCard.vue'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport { normalizedPrinterEvent } from '@src/lib/normalizers'\nimport findIndex from 'lodash/findIndex'\n\nconst LOCAL_PREF_NAMES = {\n  eventClassFiltering: 'printer-event-class-filtering',\n  eventTypeFiltering: 'printer-event-type-filtering',\n}\n\nconst localPrefKey = (prefix, key) => {\n  return `${LOCAL_PREF_NAMES['prefix']}.${key}`\n}\n\nconst localPref = (prefix, key, defaultValue) => {\n  return getLocalPref(localPrefKey(prefix, key), defaultValue)\n}\n\nconst PAGE_SIZE = 12\n\nexport default {\n  name: 'PrinterEventsPage',\n\n  components: {\n    MugenScroll,\n    PageLayout,\n    PrinterEventCard,\n  },\n\n  props: {},\n\n  data() {\n    return {\n      printerEvents: [],\n      loading: false,\n      noMoreData: false,\n      eventClassFiltering: [\n        { key: 'ERROR', title: 'Error', selected: localPref('eventClassFiltering', 'ERROR', true) },\n        {\n          key: 'WARNING',\n          title: 'Warning',\n          selected: localPref('eventClassFiltering', 'WARNING', true),\n        },\n        {\n          key: 'SUCCESS',\n          title: 'Successs',\n          selected: localPref('eventClassFiltering', 'SUCCESS', true),\n        },\n        { key: 'INFO', title: 'Other', selected: localPref('eventClassFiltering', 'INFO', true) },\n      ],\n      eventTypeFiltering: [\n        {\n          key: 'ALERT',\n          title: 'Failure Detection',\n          selected: localPref('eventTypeFiltering', 'ALERT', true),\n        },\n        {\n          key: 'ENDED',\n          title: 'Print Job Ended',\n          selected: localPref('eventTypeFiltering', 'ENDED', true),\n        },\n        {\n          key: 'STARTED',\n          title: 'Print Job Started',\n          selected: localPref('eventTypeFiltering', 'STARTED', true),\n        },\n        {\n          key: 'PAUSE_RESUME',\n          title: 'Print Job Paused/Resumed',\n          selected: localPref('eventTypeFiltering', 'PAUSE_RESUME', true),\n        },\n        {\n          key: 'FILAMENT_CHANGE',\n          title: 'Filament Change',\n          selected: localPref('eventTypeFiltering', 'FILAMENT_CHANGE', true),\n        },\n        {\n          key: 'PRINTER_ERROR',\n          title: 'Printer Error',\n          selected: localPref('eventTypeFiltering', 'PRINTER_ERROR', true),\n        },\n      ],\n    }\n  },\n\n  created() {\n    this.refetchData()\n  },\n\n  methods: {\n    fetchMoreData() {\n      if (this.noMoreData) {\n        return\n      }\n\n      this.loading = true\n      const filter_by_classes = map(filter(this.eventClassFiltering, 'selected'), 'key')\n      const filter_by_types = map(filter(this.eventTypeFiltering, 'selected'), 'key')\n      axios\n        .get(urls.printerEvents(), {\n          params: {\n            start: this.printerEvents.length,\n            limit: PAGE_SIZE,\n            filter_by_classes,\n            filter_by_types,\n          },\n        })\n        .then((response) => {\n          this.loading = false\n          this.noMoreData = response.data.length < PAGE_SIZE\n          this.printerEvents.push(...response.data.map((data) => normalizedPrinterEvent(data)))\n        })\n    },\n    refetchData() {\n      this.printerEvents = []\n      this.noMoreData = false\n      this.fetchMoreData()\n    },\n    cssClassFromEventClass(eventClass) {\n      switch (eventClass) {\n        case 'ERROR':\n          return 'text-danger'\n        case 'INFO':\n          return ''\n        default:\n          return `text-${eventClass.toLowerCase()}`\n      }\n    },\n    toggleEventFiltering(filter, key) {\n      const i = findIndex(this[filter], (f) => f.key == key)\n      const original = this[filter][i]\n      this.$set(this[filter], i, { ...original, selected: !original.selected })\n      setLocalPref(localPrefKey('eventClassFiltering', filter.key), !original.selected)\n      this.refetchData()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped></style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventsPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventsPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterEventsPage.vue?vue&type=template&id=0d7008ab&scoped=true&\"\nimport script from \"./PrinterEventsPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterEventsPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0d7008ab\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"printer-name truncated\"},[_vm._v(\" \"+_vm._s(_vm.printer ? _vm.printer.name : '')+\" \")])]},proxy:true},{key:\"topBarRight\",fn:function(){return [(_vm.printer)?_c('div',{staticClass:\"action-panel\"},[_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/tunnels/${_vm.printer.id}/`,\"title\":_vm.$t('OctoPrint Tunnel')}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-tunnel\"}})]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"OctoPrint Tunnel\")))])]),_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/printers/${_vm.printer.id}/`,\"title\":_vm.$t('Configure')}},[_c('i',{staticClass:\"fas fa-wrench\"}),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"Configure\")))])]),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}],null,false,3452768261)},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'tunnel',\n              svgIcon: 'svg-tunnel',\n              title: _vm.$t('OctoPrint Tunnel'),\n              href: `/tunnels/${_vm.printer.id}/`,\n            },\n            {\n              key: 'settings',\n              icon: 'fas fa-wrench',\n              title: _vm.$t('Configure'),\n              href: `/printers/${_vm.printer.id}/`,\n            },\n          ]},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked}})],1)],1):_vm._e()]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"contentWrap\"},[(_vm.printerComm !== null && _vm.printer !== null)?_c('printer-terminal',{attrs:{\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm,\"full-screen-height\":true,\"show-full-screen-opt\":false}}):_vm._e()],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <!-- Tob bar -->\n    <template #topBarLeft>\n      <div class=\"printer-name truncated\">\n        {{ printer ? printer.name : '' }}\n      </div>\n    </template>\n    <template #topBarRight>\n      <div v-if=\"printer\" class=\"action-panel\">\n        <!-- Tunnel -->\n        <a\n          :href=\"`/tunnels/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          :title=\"$t('OctoPrint Tunnel')\"\n        >\n          <svg class=\"custom-svg-icon\">\n            <use href=\"#svg-tunnel\" />\n          </svg>\n          <span class=\"sr-only\">{{ $t(\"OctoPrint Tunnel\") }}</span>\n        </a>\n        <!-- Configure -->\n        <a\n          :href=\"`/printers/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          :title=\"$t('Configure')\"\n        >\n          <i class=\"fas fa-wrench\"></i>\n          <span class=\"sr-only\">{{ $t(\"Configure\") }}</span>\n        </a>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'tunnel',\n                svgIcon: 'svg-tunnel',\n                title: $t('OctoPrint Tunnel'),\n                href: `/tunnels/${printer.id}/`,\n              },\n              {\n                key: 'settings',\n                icon: 'fas fa-wrench',\n                title: $t('Configure'),\n                href: `/printers/${printer.id}/`,\n              },\n            ]\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          />\n        </b-dropdown>\n      </div>\n    </template>\n    <!-- Page content -->\n    <template #content>\n      <div class=\"contentWrap\">\n        <printer-terminal\n          v-if=\"printerComm !== null && printer !== null\"\n          :printer=\"printer\"\n          :printer-comm=\"printerComm\"\n          :full-screen-height=\"true\"\n          :show-full-screen-opt=\"false\"\n        ></printer-terminal>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport urls from '@config/server-urls'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { user } from '@src/lib/page-context'\nimport split from 'lodash/split'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport PrinterTerminal from '@src/components/terminal/PrinterTerminal'\n\nexport default {\n  name: 'PrinterTerminalPage',\n\n  components: {\n    PageLayout,\n    CascadedDropdown,\n    PrinterTerminal,\n  },\n\n  data: function () {\n    return {\n      user: null,\n      printerId: null,\n      printer: null,\n      printerComm: null,\n    }\n  },\n\n  created() {\n    this.user = user()\n    this.printerId = split(window.location.pathname, '/').slice(-3, -2).pop()\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.printerId,\n      urls.printerWebSocket(this.printerId),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.printer = normalizedPrinter(data, this.printer)\n        },\n        onTerminalFeedReceived: this.onNextTerminalFeed,\n      }\n    )\n    this.printerComm.connect()\n  },\n\n  methods: {\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'share') {\n        this.onSharePrinter()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-name\n  font-size: 1rem\n  max-width: 360px\n  font-weight: bold\n  @media (max-width: 768px)\n    max-width: 200px\n\n.custom-svg-icon\n  height: 1.25rem\n  width: 1.25rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminalPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminalPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterTerminalPage.vue?vue&type=template&id=020f0348&scoped=true&\"\nimport script from \"./PrinterTerminalPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterTerminalPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterTerminalPage.vue?vue&type=style&index=0&id=020f0348&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"020f0348\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('h2',{staticClass:\"text-center\"},[_vm._v(_vm._s(_vm.$t('First Layer Snapshots')))]),_c('p',{staticClass:\"my-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Help {brandName}'s First Layer AI (codename: Celestrius) learn and improve quickly by telling her what issues exist in each of these snapshots.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t('Why should I do this?')))]),_c('p',{staticClass:\"text-secondary small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"{brandName}'s First Layer AI is still in her infant time. Just like a human baby, the only way she can learn is to be told by adults what is good and what is bad. By telling her what issues exist in these snapshots, you will help her get better at telling a good first layer apart from a bad one.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',{staticClass:\"small\"},[_c('i',[_vm._v(\" \"+_vm._s(_vm.$t(\"Privacy Notice: By participating in this survey, you grant the {brandName} team members the permission to review all snapshots below.\",{brandName:_vm.$syndicateText.brandName}))+\" \")])]),_c('h5',{staticClass:\"text-primary mt-4\"},[_vm._v(_vm._s(_vm.$t('Earn 3 AI Detection Hours!')))]),_c('p',{staticClass:\"text-primary mb-5\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"{name} snapshots were selected from your first layer print. Earn 3 AI Detection Hours by telling us if you see any printing issues with these snapshots!\",{name:_vm.shots.length}))+\" \")])])],1),_c('b-row',{staticClass:\"feedback-card\"},[_c('b-col',{attrs:{\"md\":\"8\",\"lg\":\"6\"}},[_c('div',{staticClass:\"card\"},[_c('loading',{attrs:{\"active\":_vm.firstLayerInspection === null,\"is-full-page\":true}}),(_vm.firstLayerInspection !== null)?_c('div',[_c('div',[_c('div',[_c('vue-slick-carousel',{ref:\"carousel\",attrs:{\"arrows\":false,\"dots\":true},on:{\"afterChange\":_vm.onNextShot},scopedSlots:_vm._u([{key:\"customPaging\",fn:function(page){return [_c('div',{class:_vm.pageClass(page)},[_vm._v(\"•\")])]}}],null,false,3226812120)},_vm._l((_vm.shots),function(shot,i){return _c('first-layer-shot-card',{key:i,attrs:{\"shot\":shot,\"shot-index\":i,\"total-shots\":_vm.shots.length},on:{\"imageUpdated\":_vm.onImageUpdated,\"prev\":_vm.onPrev,\"next\":_vm.onNext}})}),1)],1),_c('br'),_c('div',{staticClass:\"card-body p-3\"})])]):_vm._e()],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('img',{staticClass:\"card-img-top\",attrs:{\"src\":_vm.shot.image_url}}),_c('div',{staticClass:\"px-3 pt-4\"},[_c('p',[_vm._v(_vm._s(_vm.$t('What issues do you see in this snapshot? Select all that apply.')))]),_c('div',{staticClass:\"mb-4\"},[_c('b-form',[_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.raisedRipples),callback:function ($$v) {_vm.$set(_vm.labels, \"raisedRipples\", $$v)},expression:\"labels.raisedRipples\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Raised ripples ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('raised', 'Raised ripples')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.bubbling),callback:function ($$v) {_vm.$set(_vm.labels, \"bubbling\", $$v)},expression:\"labels.bubbling\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Bubbling ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('bubbling', 'Bubbling')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.bumpsAndRoughSurface),callback:function ($$v) {_vm.$set(_vm.labels, \"bumpsAndRoughSurface\", $$v)},expression:\"labels.bumpsAndRoughSurface\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Bumps or rough surfaces ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('bumps', 'Bumps or rough surfaces')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.detached),callback:function ($$v) {_vm.$set(_vm.labels, \"detached\", $$v)},expression:\"labels.detached\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Detached or warping ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('detached', 'Detached or warping')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.gaps),callback:function ($$v) {_vm.$set(_vm.labels, \"gaps\", $$v)},expression:\"labels.gaps\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Gaps between lines ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('gaps', 'Gaps between lines')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.other),callback:function ($$v) {_vm.$set(_vm.labels, \"other\", $$v)},expression:\"labels.other\"}},[_vm._v(_vm._s(_vm.$t('Other')))]),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.noIssues),callback:function ($$v) {_vm.$set(_vm.labels, \"noIssues\", $$v)},expression:\"labels.noIssues\"}},[_vm._v(_vm._s(_vm.$t('No issues')))]),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.notANozzleCam),callback:function ($$v) {_vm.$set(_vm.labels, \"notANozzleCam\", $$v)},expression:\"labels.notANozzleCam\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Oops, this is {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/nozzle-camera-configuration'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t('not a nozzle camera')))])]},proxy:true}])})],1)],1)],1),_c('div',{staticClass:\"navigation-container my-4\"},[_c('b-button',{attrs:{\"disabled\":_vm.isFirst,\"variant\":\"outline-secondary\"},on:{\"click\":function($event){return _vm.$emit('prev')}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\"  \"+_vm._s(_vm.$t('Previous'))+\" \")]),_c('b-button',{attrs:{\"disabled\":!_vm.labelsSelected,\"variant\":\"outline-secondary\"},on:{\"click\":_vm.onNext}},[_vm._v(\" \"+_vm._s(_vm.isLast ? _vm.$t('Finish') : _vm.$t('Next'))+\"  \"),_c('i',{staticClass:\"fas fa-chevron-right\"})])],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <img class=\"card-img-top\" :src=\"shot.image_url\" />\n    <div class=\"px-3 pt-4\">\n      <p>{{ $t('What issues do you see in this snapshot? Select all that apply.') }}</p>\n      <div class=\"mb-4\">\n        <b-form>\n          <b-form-checkbox v-model=\"labels.raisedRipples\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Raised ripples ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('raised', 'Raised ripples')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.bubbling\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Bubbling ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('bubbling', 'Bubbling')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.bumpsAndRoughSurface\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Bumps or rough surfaces ({localizedDom})`)\">\n              <template #localizedDom>\n                <a\n                  href=\"#\"\n                  @click.prevent=\"() => openExample('bumps', 'Bumps or rough surfaces')\"\n                  >{{ $t('examples') }}</a\n                >\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.detached\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Detached or warping ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('detached', 'Detached or warping')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.gaps\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Gaps between lines ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('gaps', 'Gaps between lines')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.other\" class=\"pr-5\">{{ $t('Other') }}</b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.noIssues\" class=\"pr-5\">{{\n            $t('No issues')\n          }}</b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.notANozzleCam\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Oops, this is {localizedDom}`)\">\n              <template #localizedDom>\n                <a :href=\"getDocUrl('/user-guides/nozzle-camera-configuration')\" target=\"_blank\"\n                  >&nbsp;{{ $t('not a nozzle camera') }}</a\n                >\n              </template>\n            </i18next>\n          </b-form-checkbox>\n        </b-form>\n      </div>\n      <div class=\"navigation-container my-4\">\n        <b-button :disabled=\"isFirst\" variant=\"outline-secondary\" @click=\"$emit('prev')\">\n          <i class=\"fas fa-chevron-left\"></i>&nbsp;&nbsp;{{ $t('Previous') }}\n        </b-button>\n\n        <b-button :disabled=\"!labelsSelected\" variant=\"outline-secondary\" @click=\"onNext\">\n          {{ isLast ? $t('Finish') : $t('Next') }}&nbsp;&nbsp;<i class=\"fas fa-chevron-right\"></i>\n        </b-button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport raised1 from '@src/components/first-layer-review/example-images/raisedRipples-2.jpg'\nimport raised2 from '@src/components/first-layer-review/example-images/raisedRipples-3.jpg'\nimport bubbling1 from '@src/components/first-layer-review/example-images/bubbling-1.jpg'\nimport bubbling2 from '@src/components/first-layer-review/example-images/bubbling-2.jpg'\nimport bumps1 from '@src/components/first-layer-review/example-images/bumpsAndRoughSurface-1.jpg'\nimport bumps2 from '@src/components/first-layer-review/example-images/bumpsAndRoughSurface-2.jpg'\nimport detached1 from '@src/components/first-layer-review/example-images/detached-1.jpg'\nimport detached2 from '@src/components/first-layer-review/example-images/detached-2.jpg'\nimport gaps1 from '@src/components/first-layer-review/example-images/gaps-1.jpg'\nimport gaps2 from '@src/components/first-layer-review/example-images/gaps-2.jpg'\n\nexport default {\n  name: 'FirstLayerShotCard',\n\n  props: {\n    shot: {\n      type: Object,\n      required: true,\n    },\n    totalShots: {\n      type: Number,\n      required: true,\n    },\n    shotIndex: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  computed: {\n    labelsSelected() {\n      return this.labelsToString(this.labels) !== ''\n    },\n    isFirst() {\n      return this.shotIndex === 0\n    },\n    isLast() {\n      return this.totalShots - 1 === this.shotIndex\n    },\n  },\n  watch: {\n    shot: {\n      immediate: true,\n      handler(shot) {\n        this.parseLabelsString(shot.labels)\n      },\n    },\n  },\n\n  data() {\n    return {\n      answer: this.shot.answer,\n      labels: {\n        bubbling: false,\n        raisedRipples: false,\n        bumpsAndRoughSurface: false,\n        detached: false,\n        gaps: false,\n        other: false,\n        noIssues: false,\n        notANozzleCam: false,\n      },\n    }\n  },\n\n  methods: {\n    labelsToString: function (labels) {\n      return Object.keys(labels)\n        .filter((key) => labels[key])\n        .join('|')\n    },\n\n    onNext: function () {\n      this.updateLabels()\n      this.$emit('next')\n    },\n\n    updateLabels: function () {\n      const labelsString = this.labelsToString(this.labels)\n\n      axios\n        .patch(`/ent/api/first_layer_inspection_image/${this.shot.id}/`, {\n          labels: labelsString,\n        })\n        .then((response) => {\n          this.$emit('imageUpdated', response.data)\n        })\n    },\n    parseLabelsString(labels) {\n      const labelArray = labels.split('|')\n      for (const key in this.labels) {\n        this.$set(this.labels, key, labelArray.includes(key))\n      }\n    },\n    openExample(type, desc) {\n      const imageUrls = {\n        raised: [raised1, raised2],\n        bubbling: [bubbling1, bubbling2],\n        bumps: [bumps1, bumps2],\n        detached: [detached1, detached2],\n        gaps: [gaps1, gaps2],\n      }\n      this.$swal.fire({\n        title: `<p style=\"text-align:center\">${desc}</p>`,\n        html: `\n          <div style=\"display:flex; align-items:center; justify-content:center; width: 100%; gap: 10px; flex-direction: column;\">\n              <img src=${imageUrls[type][0]} width=\"100%\" height=\"400\" alt=\"${type} example 1\"></img>\n              <img src=${imageUrls[type][1]} width=\"100%\" height=\"400\" alt=\"${type} example 2\"></img>\n            </div>\n            `,\n        customClass: {\n          container: 'dark-backdrop',\n        },\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.navigation-container\n  display: flex\n  justify-content: space-between\n  align-items: center\n  gap: 1rem\n  margin: -1.5em\n  margin-bottom: .5em\n  padding: 1em 1.5em\n  background-color: var(--color-surface-primary)\n  .btn\n    flex-shrink: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerShotCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerShotCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FirstLayerShotCard.vue?vue&type=template&id=26964d5c&scoped=true&\"\nimport script from \"./FirstLayerShotCard.vue?vue&type=script&lang=js&\"\nexport * from \"./FirstLayerShotCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FirstLayerShotCard.vue?vue&type=style&index=0&id=26964d5c&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"26964d5c\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <h2 class=\"text-center\">{{ $t('First Layer Snapshots') }}</h2>\n            <p class=\"my-4\">\n              {{$t(\"Help {brandName}'s First Layer AI (codename: Celestrius) learn and improve quickly by telling her what issues exist in each of these snapshots.\",{brandName:$syndicateText.brandName})}}\n            </p>\n            <p class=\"text-secondary\">{{ $t('Why should I do this?') }}</p>\n            <p class=\"text-secondary small\">\n              {{$t(\"{brandName}'s First Layer AI is still in her infant time. Just like a human baby, the only way she can learn is to be told by adults what is good and what is bad. By telling her what issues exist in these snapshots, you will help her get better at telling a good first layer apart from a bad one.\",{brandName:$syndicateText.brandName})}}\n            </p>\n            <p class=\"small\">\n              <i\n                >\n                {{ $t(\"Privacy Notice: By participating in this survey, you grant the {brandName} team members the permission to review all snapshots below.\",{brandName:$syndicateText.brandName}) }}\n                </i\n              >\n            </p>\n            <h5 class=\"text-primary mt-4\">{{ $t('Earn 3 AI Detection Hours!') }}</h5>\n            <p class=\"text-primary mb-5\">\n              {{ $t(\"{name} snapshots were selected from your first layer print. Earn 3 AI Detection Hours by telling us if you see any printing issues with these snapshots!\",{name:shots.length}) }}\n            </p>\n          </b-col>\n        </b-row>\n        <b-row class=\"feedback-card\">\n          <b-col md=\"8\" lg=\"6\">\n            <div class=\"card\">\n              <loading :active=\"firstLayerInspection === null\" :is-full-page=\"true\"></loading>\n              <div v-if=\"firstLayerInspection !== null\">\n                <div>\n                  <div>\n                    <vue-slick-carousel\n                      ref=\"carousel\"\n                      :arrows=\"false\"\n                      :dots=\"true\"\n                      @afterChange=\"onNextShot\"\n                    >\n                      <first-layer-shot-card\n                        v-for=\"(shot, i) in shots\"\n                        :key=\"i\"\n                        :shot=\"shot\"\n                        :shot-index=\"i\"\n                        :total-shots=\"shots.length\"\n                        @imageUpdated=\"onImageUpdated\"\n                        @prev=\"onPrev\"\n                        @next=\"onNext\"\n                      ></first-layer-shot-card>\n                      <template #customPaging=\"page\">\n                        <div :class=\"pageClass(page)\">&bull;</div>\n                      </template>\n                    </vue-slick-carousel>\n                  </div>\n                  <br />\n                  <div class=\"card-body p-3\"></div>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport findIndex from 'lodash/findIndex'\nimport VueSlickCarousel from 'vue-slick-carousel'\nimport 'vue-slick-carousel/dist/vue-slick-carousel.css'\nimport 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'\nimport Loading from 'vue-loading-overlay'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport PageLayout from '@src/components/PageLayout'\nimport FirstLayerShotCard from '@src/components/first-layer-review/FirstLayerShotCard.vue'\n\nexport default {\n  name: 'FirstLayerInspectionImagePage',\n  components: {\n    Loading,\n    FirstLayerShotCard,\n    VueSlickCarousel,\n    PageLayout,\n  },\n\n  data: function () {\n    return {\n      shots: [],\n      currentShot: 0,\n      firstLayerInspection: null,\n      inspectionId: null,\n    }\n  },\n  computed: {},\n\n  mounted() {\n    this.fetchData()\n  },\n\n  methods: {\n    fetchData() {\n      const urlParts = window.location.pathname.split('/')\n      this.inspectionId = urlParts[urlParts.length - 2]\n\n      const urlParams = new URLSearchParams(window.location.search)\n      this.inspectionId = urlParams.get('print_id')\n\n      axios.get(urls.firstLayerInspection(this.inspectionId)).then((response) => {\n        if (response.data.length) {\n          this.firstLayerInspection = response.data[0]\n          this.shots = this.firstLayerInspection.images.sort((a, b) => a.id - b.id)\n        }\n      })\n    },\n\n    onImageUpdated(data) {\n      const i = findIndex(this.shots, (shot) => shot.id == data.id)\n      this.$set(this.shots, i, data)\n      const { credited_dhs } = data\n\n      if (credited_dhs > 0) {\n        this.$swal.Prompt.fire({\n          title: `${this.$i18next.t('You just earned 3 AI Detection Hours!')}`,\n          html: `<p>${this.$i18next.t(\"Having more training data is crucial for a better First Layer AI. Thank you!\")}</p><p>${this.$i18next.t(\"You can now close this page\")}.</p>`,\n          confirmButtonText: `${this.$i18next.t('Okay!')}`,\n        })\n      }\n    },\n\n    onNextShot(shotIndex) {\n      this.currentShot = shotIndex\n    },\n\n    onPrev() {\n      this.$refs.carousel.prev()\n    },\n\n    onNext() {\n      this.$refs.carousel.next()\n    },\n\n    pageClass(page) {\n      if (page === this.currentShot) {\n        return 'page-visiting'\n      }\n      return this.shots[page].answered_at ? 'text-success' : 'page-unvisited'\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.prev-btn\n  display: inline\n  position: absolute\n  left: 2%\n  top: 40%\n  opacity: 0.5\n\n.next-btn\n  display: inline\n  position: absolute\n  right: 2%\n  top: 40%\n  opacity: 0.5\n\n.page-visiting\n  color: var(--color-primary)\n\n.page-unvisited\n  color: var(--color-divider)\n\n.feedback-container\n  padding-left: 30px\n  padding-right: 30px\n\n.cardH\n  align-items: center\n  justify-content: center\n  display: flex\n  gap: 5px\n\n.feedback-card\n  justify-content: center\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FirstLayerInspectionImagePage.vue?vue&type=template&id=07968630&scoped=true&\"\nimport script from \"./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"\nexport * from \"./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FirstLayerInspectionImagePage.vue?vue&type=style&index=0&id=07968630&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"07968630\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('chat-panel-header',{ref:\"chatHeader\",attrs:{\"should-popup-chat-panel\":Boolean(_vm.oauthAccessToken),\"credits-info\":_vm.creditsInfo},on:{\"action\":_vm.callAgentAction,\"show-contact-support-form\":_vm.showContactSupportForm,\"show-discord-support-message\":_vm.showDiscordSupportMessage,\"show-upgrade-modal\":_vm.openUpgradeModal}}),_c('upgrade-modal',{attrs:{\"show\":_vm.showUpgradeModal,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"close\":_vm.closeUpgradeModal}}),(_vm.oauthAccessToken)?_c('div',{staticClass:\"chat-container mt-3\"},[_c('div',{ref:\"chatMessageContainer\",staticClass:\"chat-messages\",on:{\"scroll\":_vm.handleChatScroll}},[_vm._m(0),_vm._l((_vm.messages),function(message,index){return _c('div',{key:index,staticClass:\"message\",class:message.role},[(message.content)?_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[(message.has_upgrade_link)?_c('div',{staticClass:\"upgrade-message\"},[_c('div',[_vm._v(_vm._s(_vm.$t('Since you are on a Free plan, please join our Discord server to seek support from the community.')))]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('You can also {localizedDom} to get email support from the Obico team.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"upgrade-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.openUpgradeModal.apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('upgrade to the Unlimited plan')))])]},proxy:true}],null,true)})],1)]):_c('VueMarkdown',[_vm._v(_vm._s(message.content))]),(\n                message.per_override_explanations && message.per_override_explanations.length > 0\n              )?_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Detailed explanations:\")))]),_vm._l((message.per_override_explanations),function(explanation,index){return _c('div',{key:index},[_c('div',[_c('b',[_vm._v(_vm._s(explanation.parameter)+\":\")]),_vm._v(\" \"+_vm._s(explanation.explanation)+\" \")])])})],2):_vm._e()],1)]):_vm._e(),(message.slicing_profiles && _vm.slicingSettingsInMessage(message))?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I have applied the following settings:\")))]),(message.slicing_profiles.use_print_process_preset)?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Process preset:\"))+\" \"),_c('b',[_vm._v(_vm._s(message.slicing_profiles.use_print_process_preset))])]):_vm._e(),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Additional slicing parameters:\"))+\" \"),(Object.keys(_vm.changedParams(message)).length === 0)?_c('b',[_vm._v(_vm._s(_vm.$t(\"None\")))]):_vm._e(),_vm._l((_vm.changedParams(message)),function(value,key){return _c('div',{key:key},[_vm._v(\"     - \"+_vm._s(key)+\": \"),_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(value))])])})],2)]),(index !== _vm.messages.length - 1)?_c('div',{staticClass:\"quick-button pt-2\"},[_c('quick-button-component',{attrs:{\"message\":_vm.$t('Re-apply settings')},on:{\"click\":function($event){return _vm.applySettingsInMessage(message)}}})],1):_vm._e()],1)]):_vm._e(),(message.suggested_printing_method)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I suggest the following to achieve the best results:\")))]),_c('VueMarkdown',[_vm._v(_vm._s(message.suggested_printing_method))])],1)]):_vm._e(),(message.jusprinNotification)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Oh no! My slicing algorithm lord just said:\")))]),_c('div',{staticClass:\"notification-text\",class:message.jusprinNotification.level},[_c('i',{class:message.jusprinNotification.level === 'error'\n                    ? 'mdi mdi-alert-circle'\n                    : 'mdi mdi-alert'}),_vm._v(\" \"+_vm._s(message.jusprinNotification.text)+\" \")])])]):_vm._e(),(message.discord_support)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"discord-support-container\"},[_c('div',{staticClass:\"discord-info\"},[_c('div',{staticClass:\"discord-url\"},[_c('strong',[_vm._v(\"Discord Server:\")]),_c('code',[_vm._v(_vm._s(message.discord_support.url))])]),_c('div',{staticClass:\"discord-instructions\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Scan this QR code with your phone to join our Discord server:\"))+\" \")])]),_c('div',{staticClass:\"qr-code-container\"},[_c('img',{staticClass:\"qr-code\",attrs:{\"src\":message.discord_support.qr_code_url,\"alt\":\"Discord QR Code\"},on:{\"error\":_vm.handleQRCodeError}})])])])]):_vm._e()])}),(_vm.thinking)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block align-items-center\"},[_c('div',{staticClass:\"message-content thinking-animation\"},[_c('VueMarkdown',[_vm._v(\"_\"+_vm._s(_vm.$t(\"Thinking...\"))+\"_\")])],1)])]):_vm._e(),(_vm.showContactSupport)?_c('contact-support-form',{attrs:{\"messages\":_vm.messages,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"form-dismissed\":_vm.handleContactSupportFormDismissed}}):_vm._e(),(_vm.slicingProgress)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block slicing-message-block\",class:{ 'fade-out': _vm.slicingProgress.fadeOut }},[_c('div',{staticClass:\"message-content\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.slicingProgress.overrun ? _vm.$t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.') : _vm.slicingProgress.text || _vm.$t('Slicing in progress...'))+\" \")]),_c('div',{staticClass:\"slicing-progress-container\"},[_c('div',{staticClass:\"slicing-progress-bar\",style:({ width: `${_vm.slicingProgress?.percentage * 100}%` })}),_c('div',{staticClass:\"slicing-progress-text\"},[_vm._v(\" \"+_vm._s(Math.round(_vm.slicingProgress?.percentage * 100))+\"% \")])]),(_vm.slicingProgress.errors && _vm.slicingProgress.errors.length > 0)?_c('div',{staticClass:\"slicing-errors\"},_vm._l((_vm.slicingProgress.errors),function(error,index){return _c('div',{key:index,staticClass:\"error-message\"},[_vm._v(\" \"+_vm._s(error)+\" \")])}),0):_vm._e()])])]):_vm._e(),(_vm.quickButtons.length > 0)?_c('div',{staticClass:\"quick-button pt-2\"},_vm._l((_vm.quickButtons),function(action,index){return _c('quick-button-component',{key:index,attrs:{\"message\":action.message},on:{\"click\":action.onClick}})}),1):_vm._e()],2),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showScrollButton),expression:\"showScrollButton\"}],staticClass:\"scroll-to-bottom\",on:{\"click\":_vm.scrollToBottom}},[_c('i',{staticClass:\"mdi mdi-arrow-down large-icon\"})]),_c('div',{staticClass:\"chat-input\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userInput),expression:\"userInput\"}],ref:\"chatTextarea\",attrs:{\"rows\":\"1\",\"type\":\"text\",\"disabled\":!_vm.readyForUserQuery,\"placeholder\":_vm.readyForUserQuery\n            ? _vm.$t('Type your message here...')\n            : _vm.$t('Select printer, filament, and add models first')},domProps:{\"value\":(_vm.userInput)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handleEnterKey.apply(null, arguments)},\"input\":function($event){if($event.target.composing)return;_vm.userInput=$event.target.value}}}),_vm._v(\" \"),_c('button',{staticClass:\"send-button\",attrs:{\"disabled\":!_vm.readyForUserQuery},on:{\"click\":_vm.onUserInput}},[_c('i',{staticClass:\"mdi mdi-arrow-up send-icon\"})])])]):_c('div',[_c('div',{staticClass:\"login-container\"},[_c('div',[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"id\":\"signUpSignInBtn\"},on:{\"click\":() => _vm.callAgentAction('show_login')}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Sign Up/Sign In to Get Started\"))+\" \")])])])])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[_c('i',{staticClass:\"mdi mdi-alert-circle-outline\"}),_c('span',[_vm._v(\" You are on an outdated JusPrin version. Download the latest version at \"),_c('span',{staticClass:\"highlighted-url\"},[_vm._v(\"https://github.com/TheSpaghettiDetective/JusPrin/releases/latest\")])])])])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"btn btn-outline-primary\",attrs:{\"href\":\"#\"},on:{\"click\":_vm.handleClick}},[_vm._v(\" \"+_vm._s(_vm.message)+\" \")])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <a href=\"#\" class=\"btn btn-outline-primary\" @click=\"handleClick\">\n    {{ message }}\n  </a>\n</template>\n\n<script>\nexport default {\n  name: 'QuickButtonComponent',\n  props: {\n    message: {\n      type: String,\n      required: true,\n    },\n  },\n  methods: {\n    handleClick(event) {\n      this.$emit('click', event)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn\n  width: auto\n  max-width: 100%\n  white-space: normal\n  text-align: center\n  padding: 0.5rem 1rem\n  hyphens: auto\n  word-wrap: break-word\n  overflow-wrap: break-word\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuickButtonComponent.vue?vue&type=template&id=81513708&scoped=true&\"\nimport script from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nexport * from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuickButtonComponent.vue?vue&type=style&index=0&id=81513708&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"81513708\",\n  null\n  \n)\n\nexport default component.exports","import axios from 'axios'\n\nexport default {\n  get: (url, authToken) => {\n    return axios.get(url, {\n      headers: {\n        Authorization: `Bearer ${authToken}`,\n      },\n    })\n  },\n  post: (url, authToken, data) => {\n    return axios.post(url, data, {\n      headers: {\n        Authorization: `Bearer ${authToken}`,\n      },\n    })\n  },\n  put: (url, authToken, data) => {\n    return axios.put(url, data, {\n      headers: {\n        Authorization: `Bearer ${authToken}`,\n      },\n    })\n  },\n}\n","// Global state\nwindow.stubAgentActionResponse = new Map()\nwindow.agentActionCallMap = {}\n\nimport i18next from '@src/i18n/i18n.js'\n\n// Helper functions\nexport function setAgentActionRetVal({ refId, retVal = null, error = null }) {\n  window.agentActionCallMap[refId] = { retVal, error }\n}\n\nexport function callAgentAction(action, payload = null, refId = null) {\n  const message = { action }\n  if (payload !== null) message.payload = payload\n  if (refId !== null) message.refId = refId\n\n  if (window.wx?.postMessage) {\n    window.wx.postMessage(message)\n  } else {\n    console.log(`window.wx.postMessage(${JSON.stringify(message)})`)\n\n    if (refId !== null && refId !== undefined) {\n      setTimeout(() => {\n        const retVal = window.stubAgentActionResponse.get(action) || {}\n        setAgentActionRetVal({ refId, retVal })\n      }, 10)\n    }\n  }\n}\n\nexport function getAgentActionResponse(action, payload = {}, timeout = 10000) {\n  return new Promise((resolve, reject) => {\n    const refId = Math.random().toString(36).substring(2, 15)\n    window.agentActionCallMap[refId] = null // Initialize with null\n\n    callAgentAction(action, payload, refId)\n\n    const timeoutId = setTimeout(() => {\n      if (refId in window.agentActionCallMap) {\n        reject(new Error(i18next.t('Timeout: No response for action \"{action}\" within {timeout}ms', {\n          action,\n          timeout\n        })))\n        delete window.agentActionCallMap[refId] // Clean up\n      }\n    }, timeout)\n\n    // Poll for response\n    const checkResponse = () => {\n      const response = window.agentActionCallMap[refId]\n      if (response !== null && response !== undefined) {\n        clearTimeout(timeoutId)\n        delete window.agentActionCallMap[refId] // Clean up\n        if (response.error) {\n          reject(new Error(response.error))\n        } else {\n          resolve(response.retVal)\n        }\n      } else {\n        setTimeout(checkResponse, 10) // Check again in 10ms\n      }\n    }\n    checkResponse()\n  })\n}\n","import { callAgentAction, getAgentActionResponse } from '../lib/agentAction'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  data() {\n    return {\n      quickButtonsStack: [],\n    }\n  },\n  computed: {\n    quickButtons() {\n      return this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n    },\n    cannedActions() {\n      return {\n        addPrinters: {\n          message: this.$i18next.t('Add printer'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n          },\n        },\n        addFilaments: {\n          message: this.$i18next.t('Add filament'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n          },\n        },\n        changePrinter: {\n          message: this.$i18next.t('Change printer'),\n          onClick: () => this.showPresetOptions('printer'),\n        },\n        changeFilament: {\n          message: this.$i18next.t('Change filament'),\n          onClick: () => this.showPresetOptions('filament'),\n        },\n        moreOptions: {\n          message: this.$i18next.t('More options'),\n          onClick: () => this.showMoreOptions(),\n        },\n        cancel: {\n          message: this.$i18next.t('Cancel'),\n          onClick: () => this.popQuickButtons(),\n        },\n        sliceWithCurrentSettings: {\n          message: this.$i18next.t('Slice with current settings'),\n          onClick: () => this.doSliceWithCurrentSettings(),\n        },\n        endTroubleshooting: {\n          message: this.$i18next.t('End troubleshooting'),\n          onClick: () => {\n            this.current_workflow = null\n            this.onUserQueryQuickButton(this.$i18next.t('I want to end troubleshooting'))\n          },\n        },\n        stayInTroubleshooting: {\n          message: this.$i18next.t('Stay in troubleshooting'),\n          onClick: () => {\n            this.onUserQueryQuickButton(this.$i18next.t('I want to continue troubleshooting'))\n          },\n        },\n        startOver: {\n          message: this.$i18next.t('Start over'),\n          onClick: () => this.startOver(),\n        },\n        exportGCode: {\n          message: this.$i18next.t('Export G-code'),\n          onClick: () => this.callAgentAction('export_gcode'),\n        },\n        switchToPreview: {\n          message: this.$i18next.t('Switch to preview'),\n          onClick: () => this.callAgentAction('switch_to_preview'),\n        },\n        autoOrient: {\n          message: this.$i18next.t('Auto-orient models'),\n          onClick: () => {\n            this.autoOrientAllObjects()\n          },\n        },\n        undoAutoOrient: {\n          message: this.$i18next.t('Undo auto-orient'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-orient is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoOrient])\n          },\n        },\n        undoAutoArrange: {\n          message: this.$i18next.t('Undo auto-arrange'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-arrange is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoArrange])\n          },\n        },\n        enableSupport: {\n          message: this.$i18next.t('Enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '1' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Support enabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.enableSupport])\n            this.setQuickButtons([this.cannedActions.undoEnableSupport, ...this.quickButtons])\n          },\n        },\n        undoEnableSupport: {\n          message: this.$i18next.t('Undo enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '0' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Support is now disabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoEnableSupport])\n          },\n        },\n        tellMeWhatNotificationMeans: {\n          message: this.$i18next.t('Explain it to me'),\n          onClick: () => {\n            // Find the last assistant message that contains a notification\n            const lastErrorMessage = [...this.messages]\n              .reverse()\n              .find((msg) => msg.role === 'assistant' && msg.jusprinNotification)\n\n            // Get the original error message if found\n            let originalErrorMessage = ''\n            if (lastErrorMessage && lastErrorMessage.jusprinNotification) {\n              originalErrorMessage = lastErrorMessage.jusprinNotification.text\n            }\n\n            // Format the new message\n            const newMessage = this.$i18next.t('JusPrin displays this message: *\"{originalErrorMessage}\"* Explain it to me.', {\n              originalErrorMessage\n            })\n\n            // Send the message\n            this.onUserQueryQuickButton(newMessage)\n          },\n        },\n        acknowledgeError: {\n          message: this.$i18next.t('Okay'),\n          onClick: () => {\n            this.messages.pop()\n            this.popQuickButtons()\n          },\n        },\n        commonPrintingPrompts: {\n          message: this.$i18next.t('Common printing prompts'),\n          onClick: () => this.showCommonPrintingPrompts(),\n        },\n        testRender: {\n          message: this.$i18next.t('Test render'),\n          onClick: () => this.renderPlateForAnalysis(),\n        },\n        analyseModel: {\n          message: this.$i18next.t('✨ Do your magic!'),\n          onClick: () => this.getAnalysisResult(),\n        },\n        plateAnalysisLooksGoodToMe: {\n          message: this.$i18next.t('Looks good to me'),\n          onClick: () => this.queryWithSuggestedPrintingMethod(),\n        },\n        plateAnalysisIsNotGood: {\n          message: this.$i18next.t('You got it wrong. Scratch that.'),\n          onClick: () => this.removePlateAnalysis(),\n        },\n        editPlateAnalysis: {\n          message: this.$i18next.t('Let me change it'),\n          onClick: () => this.editPlateAnalysis(),\n        },\n      }\n    },\n    shouldShowSliceWithCurrentSettingsQuickButton() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      return lastMessage && this.slicingSettingsInMessage(lastMessage)\n    },\n    shouldShowStartOverQuickButton() {\n      return this.messages.some((message) => message.role === 'user')\n    },\n    shouldShowPlateAnalysisQuickButton() {\n      return !this.haveDonePlateAnalysis && this.hasModelObjects\n    },\n  },\n  methods: {\n    pushQuickButtons(actions) {\n      this.quickButtonsStack.push(actions)\n    },\n    popQuickButtons() {\n      this.quickButtonsStack.pop()\n    },\n    removeQuickButtons(actions) {\n      const actionMessages = actions.map((action) => action.message)\n      let topActions = this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n      topActions = topActions.filter((action) => !actionMessages.includes(action.message))\n      this.$set(this.quickButtonsStack, this.quickButtonsStack.length - 1, topActions)\n    },\n    clearQuickButtons() {\n      this.quickButtonsStack = []\n    },\n    setQuickButtons(actions) {\n      this.clearQuickButtons()\n      this.pushQuickButtons(actions)\n    },\n    initUserQueryHintButtons() {\n      const initQueryHints = [\n        this.$i18next.t('Just do a standard print. Nothing special.'),\n        this.$i18next.t('I want to do a fast print. Draft quality.'),\n        this.$i18next.t('Print a strong part.'),\n        this.$i18next.t('My last print did not stick to the bed. Help me fix it.'),\n      ]\n\n      return initQueryHints.map((hint) => ({\n        message: hint,\n        onClick: () => this.onUserQueryQuickButton(hint),\n      }))\n    },\n    showCommonPrintingPrompts() {\n      this.pushQuickButtons([...this.initUserQueryHintButtons(), this.cannedActions.cancel])\n    },\n    async showPresetOptions(presetType) {\n      const presets = (await getAgentActionResponse('get_presets'))[`${presetType}Presets`] || []\n      const options = presets.map((preset) => ({\n        message: preset.name,\n        onClick: async () => {\n          await getAgentActionResponse(`select_preset`, {\n            type: presetType,\n            name: preset.name,\n          })\n          await this.refreshSelectedPresets()\n          this.populateQuickButtons()\n        },\n      }))\n      this.messages.push({\n        role: 'assistant',\n        content: this.$i18next.t('Select a {presetType}. If the {presetType} is not listed, use the \"Add {presetType}\" button to add it first.', {\n          presetType\n        }),\n      })\n      this.pushQuickButtons([\n        ...options,\n        this.cannedActions[`add${presetType.charAt(0).toUpperCase() + presetType.slice(1)}s`],\n        this.cannedActions.cancel,\n      ])\n    },\n    showMoreOptions() {\n      const additionalActions = [\n        this.cannedActions.changePrinter,\n        this.cannedActions.changeFilament,\n        this.cannedActions.addPrinters,\n        this.cannedActions.addFilaments,\n        this.cannedActions.startOver,\n      ]\n      this.removeQuickButtons([this.cannedActions.moreOptions])\n\n      const topActions = this.quickButtons\n      // Filter out actions that are already present in topActions\n      const newActions = additionalActions.filter(\n        (newAction) => !topActions.some((existing) => existing.message === newAction.message)\n      )\n\n      if (newActions.length > 0) {\n        this.popQuickButtons()\n        this.pushQuickButtons([...topActions, ...newActions])\n      }\n    },\n    populateQuickButtons() {\n      const quickButtons = []\n      if (this.shouldShowSliceWithCurrentSettingsQuickButton) {\n        quickButtons.push(this.cannedActions.sliceWithCurrentSettings)\n        quickButtons.push(this.cannedActions.startOver)\n        quickButtons.push(this.cannedActions.moreOptions)\n        this.setQuickButtons(quickButtons)\n        return\n      }\n\n      if (this.shouldShowPlateAnalysisQuickButton) {\n        quickButtons.push(this.cannedActions.analyseModel)\n      }\n\n      if (this.hasModelObjects) {\n        quickButtons.push(this.cannedActions.commonPrintingPrompts)\n      }\n\n      if (this.shouldShowStartOverQuickButton) {\n        quickButtons.push(this.cannedActions.startOver)\n      }\n\n      quickButtons.push(this.cannedActions.moreOptions)\n      this.setQuickButtons(quickButtons)\n    },\n    populateQuickButtonsOnError() {\n      this.setQuickButtons([this.cannedActions.startOver])\n    },\n  },\n}\n","import pluralize from 'pluralize'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  computed: {\n    cannedMessages() {\n      return {\n        greeting: {\n          role: 'assistant',\n          content: this.$i18next.t(\"🤖 Hi, I'm JusBot, your 3D printing AI assistant.\"),\n        },\n        needToAddPrinters: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any printers yet. You need to add at least one printer before you can use JusPrin.\"\n          ),\n        },\n        needToAddFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any filaments yet. You need to add at least one filament before you can use JusPrin.\"\n          ),\n        },\n        noModelObjects: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you don't have any models on your plate.\\n\\nAdd some models to see the magic. 😀\"\n          ),\n        },\n        noSupportForMultiplePlatesOrFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            'I notice your model uses multiple plates or filaments.\\n\\nJusPrin is still in beta and does not support multiple plates or filaments yet.\\n\\nPlease manually slice your model. Also stay tuned for our product update.'\n          ),\n        },\n        currentPresetSelections: (printerName, filamentName) => ({\n          role: 'assistant',\n          content: `${this.$i18next.t('You are currently using:')}\\n- ${this.$i18next.t('Printer:')} **${printerName}**\\n- ${this.$i18next.t('Filament:')} **${filamentName}**`,\n        }),\n        currentModelObjects: (modelObjectCount) => ({\n          role: 'assistant',\n          content:\n            modelObjectCount === 1\n              ? this.$i18next.t('You have {num} model on your plate.', {\n                  num: modelObjectCount,\n                })\n              : this.$i18next.t('You have {num} models on your plate.', {\n                  num: modelObjectCount,\n                }),\n        }),\n        newModelObjects: (newModelObjects) => {\n          let content = ''\n          if (newModelObjects.length === 1) {\n            content = this.$i18next.t('I see \"{modelName}\" added to your plate.', {\n              modelName: newModelObjects[0].name\n            })\n          } else if (newModelObjects.length > 1) {\n            content = (newModelObjects.length - 1) === 1 ? this.$i18next.t('I see \"{modelName}\" and {num} other model added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n              : this.$i18next.t('I see \"{modelName}\" and {num} other models added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n          }\n          return {\n            role: 'assistant',\n            content,\n          }\n        },\n        generalError: {\n          role: 'assistant',\n          content: this.$i18next.t('Sorry, there was an error processing your request.'),\n        },\n      }\n    },\n  },\n}\n","export default {\n  methods: {\n    fixFilamentParamOverrides(param_overrides) {\n      // FIXME: No idea how these temps are used in Orca. But for most printers this hack seems to be good enough.\n\n      // Filament params now have an array of values but apply_config still expects a single value\n      Object.keys(param_overrides).forEach((key) => {\n        if (Array.isArray(param_overrides[key]) && param_overrides[key].length > 0) {\n          param_overrides[key] = param_overrides[key][0]; // Unpack to the first value\n        }\n      });\n\n      const plateTemps = [\n        'cool_plate_temp',\n        'eng_plate_temp',\n        'hot_plate_temp',\n        'textured_cool_plate_temp',\n        'textured_plate_temp',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTemp = plateTemps.find((key) => key in param_overrides)\n\n      if (existingTemp) {\n        const tempValue = param_overrides[existingTemp]\n        // Set the same temperature for all plate types\n        plateTemps.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      const plateTempsInitialLayer = [\n        'cool_plate_temp_initial_layer',\n        'eng_plate_temp_initial_layer',\n        'hot_plate_temp_initial_layer',\n        'textured_cool_plate_temp_initial_layer',\n        'textured_plate_temp_initial_layer',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTempInitialLayer = plateTempsInitialLayer.find((key) => key in param_overrides)\n\n      if (existingTempInitialLayer) {\n        const tempValue = param_overrides[existingTempInitialLayer]\n        // Set the same temperature for all plate types\n        plateTempsInitialLayer.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      return param_overrides\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{ref:\"container\",staticClass:\"gradient-fade-wrapper\",class:{ 'is-unfaded': _vm.isUnfaded },on:{\"click\":_vm.toggleFade}},[_vm._t(\"default\"),(_vm.hasFade && !_vm.isUnfaded)?_c('div',{staticClass:\"fade-overlay\"}):_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    ref=\"container\"\n    class=\"gradient-fade-wrapper\"\n    :class=\"{ 'is-unfaded': isUnfaded }\"\n    @click=\"toggleFade\"\n  >\n    <slot></slot>\n    <div v-if=\"hasFade && !isUnfaded\" class=\"fade-overlay\"></div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'GradientFadableContainer',\n  data() {\n    return {\n      isUnfaded: false,\n      hasFade: false,\n    }\n  },\n  mounted() {\n    this.checkIfNeedsFade()\n  },\n  updated() {\n    this.checkIfNeedsFade()\n  },\n  methods: {\n    toggleFade() {\n      this.isUnfaded = !this.isUnfaded\n\n      // Wait for transition to complete before rechecking\n      setTimeout(() => {\n        this.checkIfNeedsFade()\n      }, 300)\n    },\n    checkIfNeedsFade() {\n      this.$nextTick(() => {\n        const el = this.$refs.container\n        if (!this.isUnfaded) {\n          this.hasFade = el.scrollHeight > el.clientHeight\n        } else {\n          this.hasFade = false\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.gradient-fade-wrapper\n  position: relative\n  max-height: 8rem\n  overflow: hidden\n  transition: max-height 0.3s ease-out\n  cursor: pointer\n\n  &.is-unfaded\n    max-height: 1000px\n\n.fade-overlay\n  position: absolute\n  bottom: 0\n  left: 0\n  right: 0\n  height: 3rem\n  background: linear-gradient(transparent, var(--message-bg, white))\n  pointer-events: none\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GradientFadableContainer.vue?vue&type=template&id=5aa2b926&scoped=true&\"\nimport script from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GradientFadableContainer.vue?vue&type=style&index=0&id=5aa2b926&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5aa2b926\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"chat-header\"},[_c('div',{staticClass:\"header-left\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.chatPanelPopUpOnErrors),expression:\"chatPanelPopUpOnErrors\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"dont-show-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.chatPanelPopUpOnErrors)?_vm._i(_vm.chatPanelPopUpOnErrors,null)>-1:(_vm.chatPanelPopUpOnErrors)},on:{\"change\":function($event){var $$a=_vm.chatPanelPopUpOnErrors,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.chatPanelPopUpOnErrors=$$a.concat([$$v]))}else{$$i>-1&&(_vm.chatPanelPopUpOnErrors=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.chatPanelPopUpOnErrors=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"dont-show-checkbox\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Pop up on errors\"))+\" \")])])]),(_vm.creditsInfo && _vm.isEnt)?_c('div',{staticClass:\"credit-display\",class:_vm.creditStatusClass,attrs:{\"title\":_vm.creditTooltipText},on:{\"click\":function($event){return _vm.$emit('show-upgrade-modal')}}},[(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('i',{staticClass:\"mdi mdi-crown credit-icon\"}):_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credits\"}}),(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited Account'))+\" \")]):_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.remainingCredits)+\"/\"+_vm._s(_vm.creditsInfo.ai_credit_free_monthly_quota)+\" \")])]):_vm._e(),_c('div',{staticClass:\"header-actions\"},[_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Contact Support')},on:{\"click\":_vm.handleSupportButtonClick}},[_c('i',{staticClass:\"mdi mdi-message-question-outline large-icon\"})]),_c('div',{staticClass:\"header-divider\"},[_vm._v(\"|\")]),(_vm.curChatPanelViewMode !== 'large')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Large Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('large', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-expand large-icon\"})]):_vm._e(),(_vm.curChatPanelViewMode !== 'small')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Small Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('small', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-collapse large-icon\"})]):_vm._e(),_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Close')},on:{\"click\":function($event){return _vm.changeChatPanelVisibility(false)}}},[_c('i',{staticClass:\"mdi mdi-close large-icon\"})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"chat-header\">\n    <div class=\"header-left\">\n      <div class=\"custom-control custom-checkbox\">\n        <input\n          id=\"dont-show-checkbox\"\n          v-model=\"chatPanelPopUpOnErrors\"\n          class=\"custom-control-input\"\n          type=\"checkbox\"\n        />\n        <label class=\"custom-control-label\" for=\"dont-show-checkbox\"> {{ $t(\"Pop up on errors\") }} </label>\n      </div>\n    </div>\n\n    <!-- Credit Display -->\n    <div\n      v-if=\"creditsInfo && isEnt\"\n      class=\"credit-display\"\n      :class=\"creditStatusClass\"\n      @click=\"$emit('show-upgrade-modal')\"\n      :title=\"creditTooltipText\"\n    >\n      <i v-if=\"creditsInfo.ai_credit_free_monthly_quota === -1\" class=\"mdi mdi-crown credit-icon\"></i>\n      <img v-else src=\"/static/img/jusprin-credit.png\" alt=\"Credits\" class=\"credit-icon\" />\n      <span class=\"credit-text\" v-if=\"creditsInfo.ai_credit_free_monthly_quota === -1\">\n        {{ $t('Unlimited Account') }}\n      </span>\n      <span class=\"credit-text\" v-else>\n        {{ remainingCredits }}/{{ creditsInfo.ai_credit_free_monthly_quota }}\n      </span>\n    </div>\n\n    <div class=\"header-actions\">\n      <button\n        class=\"header-button\"\n        :title=\"$t('Contact Support')\"\n        @click=\"handleSupportButtonClick\"\n      >\n        <i class=\"mdi mdi-message-question-outline large-icon\"></i>\n      </button>\n\n      <div class=\"header-divider\">|</div>\n      <button\n        v-if=\"curChatPanelViewMode !== 'large'\"\n        class=\"header-button\"\n        :title=\"$t('Large Chat Window')\"\n        @click=\"changeChatPanelViewMode('large', true)\"\n      >\n        <i class=\"mdi mdi-arrow-expand large-icon\"></i>\n      </button>\n\n      <button\n        v-if=\"curChatPanelViewMode !== 'small'\"\n        class=\"header-button\"\n        :title=\"$t('Small Chat Window')\"\n        @click=\"changeChatPanelViewMode('small', true)\"\n      >\n        <i class=\"mdi mdi-arrow-collapse large-icon\"></i>\n      </button>\n\n      <button class=\"header-button\" :title=\"$t('Close')\" @click=\"changeChatPanelVisibility(false)\">\n        <i class=\"mdi mdi-close large-icon\"></i>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getAgentActionResponse, callAgentAction } from '../lib/agentAction'\nimport { settings } from '@src/lib/page-context'\n\nexport default {\n  name: 'ChatPanelHeader',\n  props: {\n    shouldPopupChatPanel: {\n      type: Boolean,\n      default: true,\n    },\n    creditsInfo: {\n      type: Object,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      curChatPanelViewMode: 'large',\n      preferredChatPanelViewModeValue:\n        localStorage.getItem('jusprin.preferredChatPanelViewMode') || 'large',\n      curChatPanelVisible: false,\n      popupChatPanelTimeout: null,\n      notificationBadgeCount: {\n        green_badge: 0,\n        orange_badge: 0,\n        red_badge: 0,\n      },\n      chatPanelPopUpOnErrorsValue:\n        localStorage.getItem('jusprin.chatPanelPopUpOnErrors') !== 'false',\n      isEnt: false,\n    }\n  },\n  computed: {\n    chatPanelPopUpOnErrors: {\n      get() {\n        return this.chatPanelPopUpOnErrorsValue\n      },\n      set(newValue) {\n        this.chatPanelPopUpOnErrorsValue = newValue\n        localStorage.setItem('jusprin.chatPanelPopUpOnErrors', newValue.toString())\n      },\n    },\n    preferredChatPanelViewMode: {\n      get() {\n        return this.preferredChatPanelViewModeValue\n      },\n      set(newViewMode) {\n        this.preferredChatPanelViewModeValue = newViewMode\n        localStorage.setItem('jusprin.preferredChatPanelViewMode', newViewMode)\n      },\n    },\n    remainingCredits() {\n      if (!this.creditsInfo || this.creditsInfo.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.creditsInfo || this.creditsInfo.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.creditsInfo.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    creditTooltipText() {\n      if (this.creditsInfo.ai_credit_free_monthly_quota === -1) {\n        return this.$i18next.t('Unlimited AI credits')\n      }\n\n      return this.$i18next.t('You are on a free plan, which has limited AI credits. Click to see upgrade options.')\n    },\n  },\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n  },\n\n  async mounted() {\n    const devMode = new URLSearchParams(window.location.search).get('devmode') === 'true'\n    await this.changeChatPanelViewMode(this.preferredChatPanelViewMode, false)\n    await this.changeChatPanelVisibility(devMode) // If dev mode, show the chat panel so that we can debug it\n  },\n\n  methods: {\n    async popupChatPanelIfNecessary(level) {\n      if (this.curChatPanelVisible) return // Don't popup if the panel is already open\n\n      if (!this.chatPanelPopUpOnErrors) {\n        if (level === 'error') {\n          this.notificationBadgeCount.red_badge += 1\n        } else if (level === 'warning') {\n          this.notificationBadgeCount.orange_badge += 1\n        } else {\n          this.notificationBadgeCount.green_badge += 1\n        }\n        callAgentAction('set_btn_notification_badges', this.notificationBadgeCount)\n        return\n      }\n      await this.changeChatPanelViewMode('small', false)\n      await this.changeChatPanelVisibility(true)\n    },\n    async changeChatPanelViewMode(newViewMode, savePreferredViewMode = false) {\n      const { view_mode } = await getAgentActionResponse('change_chatpanel_display', {\n        view_mode: newViewMode,\n      })\n\n      this.curChatPanelViewMode = view_mode\n      if (savePreferredViewMode) {\n        this.preferredChatPanelViewMode = view_mode\n      }\n    },\n    async changeChatPanelVisibility(newVisible) {\n      const { visible } = await getAgentActionResponse('change_chatpanel_display', {\n        visible: newVisible,\n      })\n      this.curChatPanelVisible = visible\n    },\n    async processChatPanelFocusEvent(event) {\n      if (!event?.data?.focusEventType) return\n\n      const { focusEventType } = event.data\n      if (focusEventType === 'in_focus') {\n        await this.changeChatPanelViewMode(this.preferredChatPanelViewMode, false)\n        await this.changeChatPanelVisibility(true)\n\n        this.notificationBadgeCount = {\n          green_badge: 0,\n          orange_badge: 0,\n          red_badge: 0,\n        }\n        callAgentAction('set_btn_notification_badges', this.notificationBadgeCount)\n      } else if (focusEventType === 'out_of_focus') {\n        this.changeChatPanelVisibility(false)\n      }\n    },\n    handleSupportButtonClick() {\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        // Free user - show Discord message\n        this.$emit('show-discord-support-message')\n      } else {\n        // Paid user - show contact form\n        this.$emit('show-contact-support-form')\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.chat-header\n  display: flex\n  justify-content: space-between\n  align-items: center\n  padding: 2px 16px\n  background-color: var(--color-primary)\n  color: white\n  position: sticky\n  top: 0\n  z-index: 10\n\n.header-left\n  display: flex\n  align-items: center\n\n.header-actions\n  display: flex\n  align-items: center\n  gap: 8px\n\n.header-button\n  background: none\n  border: none\n  color: white\n  padding: 4px\n  cursor: pointer\n  display: flex\n  align-items: center\n  justify-content: center\n  &:hover\n    opacity: 0.8\n\n.header-divider\n  color: rgba(255, 255, 255, 0.5)\n  margin: 0 8px\n\n.custom-control-input\n  cursor: pointer\n\n.custom-control-label\n  cursor: pointer\n  font-size: 14px\n\n.credit-display\n  display: flex\n  align-items: center\n  gap: 6px\n  padding: 4px 8px\n  border-radius: var(--border-radius-sm)\n  cursor: pointer\n  transition: opacity 0.2s\n  font-size: 14px\n  font-weight: 500\n\n  &:hover\n    opacity: 0.8\n\n  .credit-icon\n    width: 16px\n    height: 16px\n\n    &.mdi-crown\n      font-size: 1.25rem\n      display: inline-flex\n      align-items: center\n      color: gold\n\n  .credit-text\n    color: white\n\n  &.credit-success\n    background-color: var(--color-success)\n\n  &.credit-warning\n    background-color: var(--color-warning)\n\n  &.credit-exhausted\n    background-color: var(--color-danger)\n  margin-bottom: 0\n\n.custom-control-label::before\n  border-color: white !important\n  border-width: 1px\n  border-style: solid\n\n.custom-control-input:checked ~ .custom-control-label::before\n  border-color: white !important\n  border-width: 1px\n  border-style: solid\n\n.large-icon\n  font-size: 24px\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatPanelHeader.vue?vue&type=template&id=7f13343f&scoped=true&\"\nimport script from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatPanelHeader.vue?vue&type=style&index=0&id=7f13343f&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7f13343f\",\n  null\n  \n)\n\nexport default component.exports","export default {\n  data() {\n    return {\n      processedNotifications: new Set(),\n    }\n  },\n  methods: {\n    processNotificationPushedEvent(event) {\n      if (!event.data?.text) return\n\n      const { level, text } = event.data\n      const notificationKey = `${level}:${text}`\n\n      if (this.processedNotifications.has(notificationKey)) return\n\n      this.processedNotifications.add(notificationKey)\n\n      if (!['error', 'warning'].includes(level)) {\n        return\n      }\n\n      if (this.slicingProgress) {\n        this.slicingProgress.errors.push(text)\n        return\n      }\n\n      this.messages.push({\n        role: 'assistant',\n        content: '', // jusprinNotification message is constructed from jusprinNotification field\n        jusprinNotification: {\n          level,\n          text,\n        },\n      })\n\n      this.pushQuickButtons([this.cannedActions.tellMeWhatNotificationMeans, this.cannedActions.acknowledgeError])\n      this.$refs.chatHeader.popupChatPanelIfNecessary(level)\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"contact-support-form\"},[_c('p',[_vm._v(_vm._s(_vm.$t(\"Would you like to send a support request?\")))]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.supportMessage),expression:\"supportMessage\"}],staticClass:\"form-control mb-3\",attrs:{\"rows\":\"4\",\"placeholder\":_vm.$t('Describe your issue here...')},domProps:{\"value\":(_vm.supportMessage)},on:{\"input\":function($event){if($event.target.composing)return;_vm.supportMessage=$event.target.value}}}),_c('div',{staticClass:\"d-flex justify-content-between\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.sendSupportRequest}},[_c('i',{staticClass:\"mdi mdi-message-question-outline mr-1\"}),_vm._v(\" \"+_vm._s(_vm.isSubmitting ? _vm.$t('Sending...') : _vm.$t('Ask for tech support'))+\" \")]),_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.cancelSupportRequest}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Nah, I'm good\"))+\" \")])]),(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-3\"},[_vm._v(\" \"+_vm._s(_vm.error)+\" \")]):_vm._e()])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"message assistant\">\n    <div class=\"message-block\">\n      <div class=\"message-content\">\n        <div class=\"contact-support-form\">\n          <p>{{ $t(\"Would you like to send a support request?\") }}</p>\n          <textarea\n            v-model=\"supportMessage\"\n            class=\"form-control mb-3\"\n            rows=\"4\"\n            :placeholder=\"$t('Describe your issue here...')\"\n          ></textarea>\n          <div class=\"d-flex justify-content-between\">\n            <button class=\"btn btn-primary\" @click=\"sendSupportRequest\" :disabled=\"isSubmitting\">\n              <i class=\"mdi mdi-message-question-outline mr-1\"></i>\n              {{ isSubmitting ? $t('Sending...') : $t('Ask for tech support') }}\n            </button>\n            <button\n              class=\"btn btn-secondary\"\n              @click=\"cancelSupportRequest\"\n              :disabled=\"isSubmitting\"\n            >\n              {{ $t(\"Nah, I'm good\") }}\n            </button>\n          </div>\n          <div v-if=\"error\" class=\"alert alert-danger mt-3\">\n            {{ error }}\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'ContactSupportForm',\n  props: {\n    messages: {\n      type: Array,\n      required: true,\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      supportMessage: '',\n      isSubmitting: false,\n      error: null,\n    }\n  },\n  computed: {\n    lastUserMessage() {\n      // Find the last user message in the messages array using higher-order function\n      const lastUserMsg = [...this.messages].reverse().find((message) => message.role === 'user')\n\n      return lastUserMsg ? lastUserMsg.content : ''\n    },\n  },\n  created() {\n    // Pre-fill with the last user message\n    this.supportMessage = this.lastUserMessage\n  },\n  methods: {\n    async sendSupportRequest() {\n      if (!this.supportMessage.trim()) {\n        this.error = this.$t('Please enter a message before submitting.')\n        return\n      }\n\n      this.isSubmitting = true\n      this.error = null\n\n      try {\n        await api.post(urls.jusprinContactSupport(), this.oauthAccessToken, {\n          message: this.supportMessage,\n        })\n\n        this.$emit('form-dismissed', {\n          message:\n            this.$t('Your support request has been sent. Our team will get back to you as soon as possible.'),\n        })\n      } catch (error) {\n        console.error('Failed to send support request:', error)\n        this.error = this.$t('Failed to send your support request. Please try again later.')\n        this.isSubmitting = false\n      }\n    },\n    cancelSupportRequest() {\n      this.$emit('form-dismissed', {\n        message: this.$t(\"No problem! Let me know if there's anything else I can help you with.\"),\n      })\n    },\n  },\n}\n</script>\n\n<style scoped>\n.contact-support-form {\n  width: 100%;\n}\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContactSupportForm.vue?vue&type=template&id=16e50642&scoped=true&\"\nimport script from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nexport * from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ContactSupportForm.vue?vue&type=style&index=0&id=16e50642&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"16e50642\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.show)?_c('div',{staticClass:\"upgrade-modal-backdrop\",on:{\"click\":_vm.closeModal}},[_c('div',{staticClass:\"upgrade-modal surface\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"close-button icon-btn\",on:{\"click\":_vm.closeModal}},[_c('i',{staticClass:\"mdi mdi-close\"})]),_c('h2',{staticClass:\"modal-title\"},[_vm._v(_vm._s(_vm.$t(\"Your JusPrin Account\")))]),(!_vm.loading && !_vm.isUnlimitedPlan && _vm.remainingCredits <= 0)?_c('div',{staticClass:\"credit-exhausted-banner\"},[_c('i',{staticClass:\"mdi mdi-alert-circle\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"You have run out of AI credits!\")))])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"text-center\"},[_c('i',{staticClass:\"mdi mdi-loading mdi-spin\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Loading...\"))+\" \")]):_c('div',[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-details\"},[(_vm.userInfo.first_name || _vm.userInfo.last_name)?_c('h3',{staticClass:\"user-name\"},[_vm._v(_vm._s(_vm.userDisplayName))]):_vm._e(),_c('div',{staticClass:\"user-email\"},[_vm._v(_vm._s(_vm.userInfo.email))])]),_c('span',{staticClass:\"plan-badge\",class:{ 'pro-badge': _vm.isUnlimitedPlan }},[_vm._v(\" \"+_vm._s(_vm.isUnlimitedPlan ? _vm.$t('Unlimited') : _vm.$t('FREE Plan'))+\" \")])]),(_vm.isUnlimitedPlan)?[_c('div',{staticClass:\"body-section text-center\"},[_vm._m(0),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Yay! You are on the Unlimited Plan!'))+\" \")]),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\",\"margin-bottom\":\"3rem\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Enjoy unlimited AI credits!'))+\" \")]),_c('a',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"href\":\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Manage Subscription Plan'))+\" \")])])]:[_c('div',{staticClass:\"body-section\"},[_c('div',{staticClass:\"ai-credits-header\"},[_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"JusPrin Credit Icon\"}}),_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"AI Credits\")))])]),_c('div',{staticClass:\"progress-bar-container\"},[_c('div',{staticClass:\"progress-bar\",class:_vm.creditStatusClass,style:({ width: `${_vm.progressPercentage}%` })})]),_c('div',{staticClass:\"progress-info\"},[_c('span',{staticClass:\"usage-text\"},[_vm._v(\" You've used \"+_vm._s(_vm.credits.ai_credit_used_current_month)+\" AI credits of \"+_vm._s(_vm.isUnlimitedPlan ? 'unlimited' : _vm.credits.ai_credit_free_monthly_quota)+\" this month \")]),_c('span',{staticClass:\"reset-date\"},[_vm._v(_vm._s(_vm.$t(\"Reset on {resetDate}\", { resetDate: _vm.nextMonthResetDate })))])])]),_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\"))+\" \"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\"))+\" \")]),_c('muted-alert',{staticClass:\"mt-2 feature-notice\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI credit limit is reset at the beginning of each month.\"))+\" \")]),_c('div',{staticClass:\"body-section\"},[_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"Get More AI Credits\")))]),_c('div',{staticClass:\"section-description\"},[_vm._v(_vm._s(_vm.$t(\"If you are running short on AI credits, there are two ways to get more.\")))]),_c('div',{staticClass:\"upgrade-option\"},[_c('div',{staticClass:\"upgrade-details\"},[_c('div',{staticClass:\"upgrade-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Upgrade to Unlimited Plan\"))+\" \"),(_vm.userInfo.has_active_subscription)?_c('span',{staticClass:\"discount\"},[_vm._v(_vm._s(_vm.$t(\"30% OFF\")))]):_vm._e()]),_c('div',{staticClass:\"text-primary small\"},[_vm._v(_vm._s(_vm.$t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\")))])]),_c('a',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"href\":\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Upgrade'))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Alternatively, you can {hostYourOwnLink} and get unlimited AI credits using your own OpenAI API key.')},scopedSlots:_vm._u([{key:\"hostYourOwnLink\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://github.com/TheSpaghettiDetective/obico-server/blob/release/README_jusprin_server.md\"}},[_vm._v(_vm._s(_vm.$t(\"host your own JusPrin server\")))])]},proxy:true}],null,false,2080485700)})],1)])]],2)])]):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"celebration\",staticStyle:{\"font-size\":\"2.5rem\",\"margin\":\"1.5rem 0\"}},[_vm._v(\" 🎉 \"),_c('i',{staticClass:\"mdi mdi-crown\",staticStyle:{\"color\":\"gold\",\"font-size\":\"2.5rem\"}}),_vm._v(\" 🎉 \")])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"show\" class=\"upgrade-modal-backdrop\" @click=\"closeModal\">\n    <div class=\"upgrade-modal surface\" @click.stop>\n      <button class=\"close-button icon-btn\" @click=\"closeModal\">\n        <i class=\"mdi mdi-close\"></i>\n      </button>\n\n      <h2 class=\"modal-title\">{{ $t(\"Your JusPrin Account\") }}</h2>\n\n      <!-- Red banner for zero credits -->\n      <div v-if=\"!loading && !isUnlimitedPlan && remainingCredits <= 0\" class=\"credit-exhausted-banner\">\n        <i class=\"mdi mdi-alert-circle\"></i>\n        <span>{{ $t(\"You have run out of AI credits!\") }}</span>\n      </div>\n\n      <div v-if=\"loading\" class=\"text-center\">\n        <i class=\"mdi mdi-loading mdi-spin\"></i> {{ $t(\"Loading...\") }}\n      </div>\n\n      <div v-else>\n        <div class=\"user-info\">\n          <div class=\"user-details\">\n            <h3 v-if=\"userInfo.first_name || userInfo.last_name\" class=\"user-name\">{{ userDisplayName }}</h3>\n            <div class=\"user-email\">{{ userInfo.email }}</div>\n          </div>\n          <span class=\"plan-badge\" :class=\"{ 'pro-badge': isUnlimitedPlan }\">\n            {{ isUnlimitedPlan ? $t('Unlimited') : $t('FREE Plan') }}\n          </span>\n        </div>\n\n        <template v-if=\"isUnlimitedPlan\">\n          <div class=\"body-section text-center\">\n            <div class=\"celebration\" style=\"font-size: 2.5rem; margin: 1.5rem 0;\">\n              🎉 <i class=\"mdi mdi-crown\" style=\"color: gold; font-size: 2.5rem;\"></i> 🎉\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold;\">\n              {{ $t('Yay! You are on the Unlimited Plan!') }}\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold; margin-bottom: 3rem;\">\n              {{ $t('Enjoy unlimited AI credits!') }}\n            </div>\n            <a\n              href=\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"\n              class=\"btn btn-primary upgrade-button\"\n            >\n              {{ $t('Manage Subscription Plan') }}\n            </a>\n          </div>\n        </template>\n        <template v-else>\n          <div class=\"body-section\">\n            <div class=\"ai-credits-header\">\n              <img src=\"/static/img/jusprin-credit.png\" alt=\"JusPrin Credit Icon\" class=\"credit-icon\" />\n              <h4 class=\"modal-section-title\">{{ $t(\"AI Credits\") }}</h4>\n            </div>\n            <div class=\"progress-bar-container\">\n              <div class=\"progress-bar\" :class=\"creditStatusClass\" :style=\"{ width: `${progressPercentage}%` }\"></div>\n            </div>\n            <div class=\"progress-info\">\n              <span class=\"usage-text\">\n                You've used {{ credits.ai_credit_used_current_month }} AI credits of {{ isUnlimitedPlan ? 'unlimited' : credits.ai_credit_free_monthly_quota }} this month\n              </span>\n              <span class=\"reset-date\">{{ $t(\"Reset on {resetDate}\", { resetDate: nextMonthResetDate }) }}</span>\n            </div>\n          </div>\n\n          <div class=\"text-muted small\">\n           {{ $t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\") }}\n           <br>\n           {{ $t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\") }}\n          </div>\n\n          <muted-alert class=\"mt-2 feature-notice\">\n            {{ $t(\"AI credit limit is reset at the beginning of each month.\") }}\n          </muted-alert>\n\n          <div class=\"body-section\">\n            <h4 class=\"modal-section-title\">{{ $t(\"Get More AI Credits\") }}</h4>\n            <div class=\"section-description\">{{ $t(\"If you are running short on AI credits, there are two ways to get more.\") }}</div>\n            <div class=\"upgrade-option\">\n              <div class=\"upgrade-details\">\n                <div class=\"upgrade-title\">\n                  {{ $t(\"Upgrade to Unlimited Plan\") }}\n                  <span v-if=\"userInfo.has_active_subscription\" class=\"discount\">{{ $t(\"30% OFF\") }}</span>\n                </div>\n                <div class=\"text-primary small\">{{ $t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\") }}</div>\n              </div>\n              <a\n                href=\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"\n                class=\"btn btn-primary upgrade-button\"\n              >\n                {{ $t('Upgrade') }}\n              </a>\n            </div>\n            <div class=\"mt-4\">\n              <i18next :translation=\"$t('Alternatively, you can {hostYourOwnLink} and get unlimited AI credits using your own OpenAI API key.')\">\n                <template #hostYourOwnLink>\n                  <a href=\"https://github.com/TheSpaghettiDetective/obico-server/blob/release/README_jusprin_server.md\">{{ $t(\"host your own JusPrin server\") }}</a>\n                </template>\n              </i18next>\n            </div>\n          </div>\n        </template>\n\n        <div class=\"body-section\" v-else>\n          <h4 class=\"modal-section-title\">{{ $t(\"Your Active Subscription\") }}</h4>\n          <div class=\"subscription-info\">\n            <div class=\"subscription-details\">\n              <div class=\"subscription-plan\">\n                <i class=\"mdi mdi-crown\"></i>\n                {{ $t(\"You have an active {plan} subscription\", { plan: userInfo.subscription_plan || 'Pro' }) }}\n              </div>\n              <div class=\"text-muted small\">{{ $t(\"Your subscription gives you access to enhanced features and higher AI credit limits.\") }}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'UpgradeModal',\n  components: {\n    MutedAlert,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: false\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null\n    }\n  },\n  data() {\n    return {\n      loading: false,\n      userInfo: null,\n      credits: null,\n      error: null\n    }\n  },\n  computed: {\n    progressPercentage() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota === -1) return 100\n      if (this.credits.ai_credit_free_monthly_quota === 0) return 0\n      return Math.min(100, (this.credits.ai_credit_used_current_month / this.credits.ai_credit_free_monthly_quota) * 100)\n    },\n    isUnlimitedPlan() {\n      return this.credits?.ai_credit_free_monthly_quota === -1\n    },\n    remainingCredits() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.credits.ai_credit_free_monthly_quota - (this.credits.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.credits.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    userDisplayName() {\n      if (!this.userInfo) return ''\n      return `${this.userInfo.first_name || ''} ${this.userInfo.last_name || ''}`.trim()\n    },\n    nextMonthResetDate() {\n      const now = new Date()\n      const nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1)\n      return nextMonth.toLocaleDateString('en-US', {\n        month: 'short',\n        day: 'numeric'\n      })\n    }\n  },\n  watch: {\n    show(newValue) {\n      if (newValue) {\n        this.fetchAICreditsData()\n      }\n    }\n  },\n  mounted() {\n    if (this.show) {\n      this.fetchAICreditsData()\n    }\n  },\n  methods: {\n    async fetchAICreditsData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      this.loading = true\n      this.error = null\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      if (response.data) {\n        this.userInfo = response.data.user\n        this.credits = response.data.ai_credits\n      }\n      this.loading = false\n    },\n    closeModal() {\n      this.$emit('close')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../../../styles/theme';\n@import '../../../../styles/mixin';\n\n// Upgrade Modal Styles\n.upgrade-modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: var(--color-overlay);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 1050;\n}\n\n.upgrade-modal {\n  background-color: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  padding: 2rem;\n  max-width: 500px;\n  width: 90%;\n  max-height: 90vh;\n  overflow-y: auto;\n  position: relative;\n  box-shadow: var(--shadow-top-nav);\n\n  @include respond-below(md) {\n    padding: 1.5rem;\n    margin: 0 1rem;\n    width: calc(100% - 2rem);\n  }\n\n  .close-button {\n    position: absolute;\n    top: 1rem;\n    right: 1rem;\n    width: 2rem;\n    height: 2rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 1.5rem;\n\n    &:hover, &:focus {\n      background-color: var(--color-hover) !important;\n      color: var(--color-text-primary) !important;\n    }\n  }\n\n  .modal-title {\n    color: var(--color-text-primary);\n    font-size: 1.5rem;\n    font-weight: 600;\n    margin: 0 0 1.5rem 0;\n    text-align: center;\n\n    @include respond-below(md) {\n      font-size: 1.25rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  .user-info {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n\n    @media (max-width: 400px) {\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 1rem;\n      margin-bottom: 1.5rem;\n    }\n\n    .user-details {\n      .user-name {\n        color: var(--color-text-primary);\n        font-size: 1.25rem;\n        font-weight: 600;\n        margin: 0 0 0.25rem 0;\n\n        @include respond-below(md) {\n          font-size: 1.125rem;\n        }\n      }\n\n      .user-email {\n        color: var(--color-text-secondary);\n        font-size: 0.875rem;\n        text-decoration: underline;\n      }\n    }\n\n    .plan-badge {\n      color: var(--color-text-primary);\n      padding: 0.25rem 0.75rem;\n      border-radius: var(--border-radius-sm);\n      border: 1px dashed var(--color-divider);\n      font-size: 0.75rem;\n      font-weight: 600;\n      text-transform: uppercase;\n\n      &.pro-badge {\n        color: var(--color-primary);\n        border: 1px dashed var(--color-primary);\n      }\n    }\n  }\n\n  .body-section {\n    margin-bottom: 1rem;\n\n    @include respond-below(md) {\n      margin-bottom: 1.5rem;\n    }\n\n    .ai-credits-header {\n      display: flex;\n      align-items: baseline;\n      gap: 0.5rem;\n      margin-bottom: 1rem;\n\n      .credit-icon {\n        width: 1.5rem;\n        height: 1.5rem;\n        flex-shrink: 0;\n      }\n    }\n\n    .progress-bar-container {\n      width: 100%;\n      height: 8px;\n      background-color: var(--color-surface-primary);\n      border-radius: var(--border-radius-xs);\n      overflow: hidden;\n      border: 1px solid var(--color-divider-muted);\n\n      .progress-bar {\n        height: 100%;\n        background-color: var(--color-primary);\n        border-radius: var(--border-radius-xs);\n        transition: width 0.3s ease;\n\n        &.credit-success {\n          background-color: var(--color-success);\n        }\n\n        &.credit-warning {\n          background-color: var(--color-warning);\n        }\n\n        &.credit-exhausted {\n          background-color: var(--color-danger);\n        }\n      }\n    }\n\n    .progress-info {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-top: 0.5rem;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 0.25rem;\n      }\n\n      .usage-text {\n        color: var(--color-text-primary);\n        font-size: 0.875rem;\n        font-weight: 500;\n        flex: 1;\n        min-width: 0;\n      }\n\n      .reset-date {\n        color: var(--color-text-secondary);\n        font-size: 0.75rem;\n        font-weight: 400;\n        flex-shrink: 0;\n        white-space: nowrap;\n      }\n    }\n\n    .modal-section-title {\n      color: var(--color-text-primary);\n      font-size: 1.5rem;\n      font-weight: 600;\n      margin-bottom: 0.5rem;\n      margin-top: 2rem;\n      text-decoration: none;\n    }\n\n    .section-description {\n      color: var(--color-text-secondary);\n      font-size: 0.875rem;\n      margin-bottom: 1rem;\n    }\n\n    .upgrade-option {\n      border: 1px solid var(--color-divider);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: stretch;\n        gap: 1rem;\n        padding: 0.875rem;\n      }\n\n      .upgrade-details {\n        flex: 1;\n        min-width: 0;\n\n        @media (min-width: 401px) {\n          min-width: 200px;\n        }\n\n        .upgrade-title {\n          color: var(--color-text-primary);\n          font-size: 1.2rem;\n          font-weight: 500;\n          margin-bottom: 0.25rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          .discount {\n            background-color: var(--color-primary);\n            color: var(--color-on-primary);\n            padding: 0.125rem 0.5rem;\n            border-radius: var(--border-radius-lg);\n            font-size: 0.75rem;\n            font-weight: 600;\n          }\n        }\n      }\n\n      .upgrade-button {\n        padding: 0.75rem 2rem;\n        font-size: 0.875rem;\n        font-weight: 600;\n        white-space: nowrap;\n        flex-shrink: 0;\n\n        @media (max-width: 400px) {\n          width: 100%;\n          white-space: normal;\n        }\n\n        &:hover {\n          background-color: var(--color-primary-hover);\n        }\n      }\n    }\n\n    .subscription-info {\n      border: 1px solid var(--color-primary);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      background-color: var(--color-surface-primary);\n\n      .subscription-details {\n        .subscription-plan {\n          color: var(--color-primary);\n          font-size: 1.1rem;\n          font-weight: 600;\n          margin-bottom: 0.5rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          i {\n            color: var(--color-primary);\n          }\n        }\n      }\n    }\n  }\n\n  .credit-exhausted-banner {\n    background-color: var(--color-danger);\n    color: white;\n    padding: 1rem;\n    border-radius: var(--border-radius-md);\n    margin-bottom: 1.5rem;\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n    font-weight: 700;\n    font-size: 1rem;\n    text-align: center;\n    justify-content: center;\n    border: 2px solid var(--color-danger);\n    animation: pulse-danger 2s ease-in-out infinite;\n\n    i {\n      font-size: 1.25rem;\n      flex-shrink: 0;\n    }\n\n    span {\n      font-weight: 700;\n    }\n\n    @media (max-width: 400px) {\n      font-size: 0.875rem;\n      padding: 0.875rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  @keyframes pulse-danger {\n    0%, 100% {\n      box-shadow: 0 0 0 0 rgba(var(--color-danger-rgb, 220, 53, 69), 0.4);\n    }\n    50% {\n      box-shadow: 0 0 0 8px rgba(var(--color-danger-rgb, 220, 53, 69), 0);\n    }\n  }\n}\n</style>","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UpgradeModal.vue?vue&type=template&id=c75daef2&scoped=true&\"\nimport script from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nexport * from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UpgradeModal.vue?vue&type=style&index=0&id=c75daef2&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"c75daef2\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <chat-panel-header\n      ref=\"chatHeader\"\n      @action=\"callAgentAction\"\n      :should-popup-chat-panel=\"Boolean(oauthAccessToken)\"\n      @show-contact-support-form=\"showContactSupportForm\"\n      @show-discord-support-message=\"showDiscordSupportMessage\"\n      @show-upgrade-modal=\"openUpgradeModal\"\n      :credits-info=\"creditsInfo\"\n    />\n\n    <!-- Upgrade Modal -->\n    <upgrade-modal\n      :show=\"showUpgradeModal\"\n      :oauth-access-token=\"oauthAccessToken\"\n      @close=\"closeUpgradeModal\"\n    />\n\n    <div v-if=\"oauthAccessToken\" class=\"chat-container mt-3\">\n      <div ref=\"chatMessageContainer\" class=\"chat-messages\" @scroll=\"handleChatScroll\">\n        <!-- Outdated version notice as first JusBot message bubble -->\n        <div class=\"message assistant\">\n          <div class=\"message-block\">\n            <div class=\"message-content\">\n              <i class=\"mdi mdi-alert-circle-outline\"></i>\n              <span>\n                You are on an outdated JusPrin version. Download the latest version at\n                <span class=\"highlighted-url\">https://github.com/TheSpaghettiDetective/JusPrin/releases/latest</span>\n              </span>\n            </div>\n          </div>\n        </div>\n        <div\n          v-for=\"(message, index) in messages\"\n          :key=\"index\"\n          class=\"message\"\n          :class=\"message.role\"\n        >\n          <div v-if=\"message.content\" class=\"message-block\">\n            <div class=\"message-content\">\n              <div v-if=\"message.has_upgrade_link\" class=\"upgrade-message\">\n                <div>{{ $t('Since you are on a Free plan, please join our Discord server to seek support from the community.') }}</div>\n                <div>\n                  <i18next :translation=\"$t('You can also {localizedDom} to get email support from the Obico team.')\">\n                    <template #localizedDom>\n                      <a href=\"#\" @click.prevent=\"openUpgradeModal\" class=\"upgrade-link\">{{ $t('upgrade to the Unlimited plan') }}</a>\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <VueMarkdown v-else>{{ message.content }}</VueMarkdown>\n              <gradient-fadable-container\n                v-if=\"\n                  message.per_override_explanations && message.per_override_explanations.length > 0\n                \"\n              >\n                <div class=\"pt-2 pb-1\">{{ $t(\"Detailed explanations:\") }}</div>\n                <div v-for=\"(explanation, index) in message.per_override_explanations\" :key=\"index\">\n                  <div>\n                    <b>{{ explanation.parameter }}:</b> {{ explanation.explanation }}\n                  </div>\n                </div>\n              </gradient-fadable-container>\n            </div>\n          </div>\n          <div\n            v-if=\"message.slicing_profiles && slicingSettingsInMessage(message)\"\n            class=\"message-block mt-2\"\n          >\n            <div class=\"message-content\">\n              <gradient-fadable-container>\n                <div class=\"pt-2 pb-1\">{{ $t(\"I have applied the following settings:\") }}</div>\n                <div v-if=\"message.slicing_profiles.use_print_process_preset\">\n                  {{ $t(\"- Process preset:\") }} <b>{{ message.slicing_profiles.use_print_process_preset }}</b>\n                </div>\n                <div>\n                  {{ $t(\"- Additional slicing parameters:\") }}\n                  <b v-if=\"Object.keys(changedParams(message)).length === 0\">{{ $t(\"None\") }}</b>\n                  <div v-for=\"(value, key) in changedParams(message)\" :key=\"key\">\n                    &nbsp;&nbsp;&nbsp;&nbsp;- {{ key }}:\n                    <span class=\"font-weight-bold\">{{ value }}</span>\n                  </div>\n                </div>\n              </gradient-fadable-container>\n              <div v-if=\"index !== messages.length - 1\" class=\"quick-button pt-2\">\n                <quick-button-component\n                  :message=\"$t('Re-apply settings')\"\n                  @click=\"applySettingsInMessage(message)\"\n                />\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.suggested_printing_method\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"I suggest the following to achieve the best results:\") }}</div>\n              <VueMarkdown>{{ message.suggested_printing_method }}</VueMarkdown>\n            </div>\n          </div>\n          <div v-if=\"message.jusprinNotification\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"Oh no! My slicing algorithm lord just said:\") }}</div>\n              <div class=\"notification-text\" :class=\"message.jusprinNotification.level\">\n                <i\n                  :class=\"\n                    message.jusprinNotification.level === 'error'\n                      ? 'mdi mdi-alert-circle'\n                      : 'mdi mdi-alert'\n                  \"\n                ></i>\n                {{ message.jusprinNotification.text }}\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.discord_support\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"discord-support-container\">\n                <div class=\"discord-info\">\n                  <div class=\"discord-url\">\n                    <strong>Discord Server:</strong>\n                    <code>{{ message.discord_support.url }}</code>\n                  </div>\n                  <div class=\"discord-instructions\">\n                    {{ $t(\"Scan this QR code with your phone to join our Discord server:\") }}\n                  </div>\n                </div>\n                <div class=\"qr-code-container\">\n                  <img\n                    :src=\"message.discord_support.qr_code_url\"\n                    alt=\"Discord QR Code\"\n                    class=\"qr-code\"\n                    @error=\"handleQRCodeError\"\n                  />\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"thinking\" class=\"message assistant\">\n          <div class=\"message-block align-items-center\">\n            <div class=\"message-content thinking-animation\">\n              <VueMarkdown>_{{ $t(\"Thinking...\") }}_</VueMarkdown>\n            </div>\n          </div>\n        </div>\n        <contact-support-form\n          v-if=\"showContactSupport\"\n          :messages=\"messages\"\n          :oauth-access-token=\"oauthAccessToken\"\n          @form-dismissed=\"handleContactSupportFormDismissed\"\n        />\n        <div v-if=\"slicingProgress\" class=\"message assistant\">\n          <div\n            class=\"message-block slicing-message-block\"\n            :class=\"{ 'fade-out': slicingProgress.fadeOut }\"\n          >\n            <div class=\"message-content\">\n              <p>\n                {{\n                  slicingProgress.overrun\n                    ? $t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.')\n                    : slicingProgress.text || $t('Slicing in progress...')\n                }}\n              </p>\n              <div class=\"slicing-progress-container\">\n                <div\n                  class=\"slicing-progress-bar\"\n                  :style=\"{ width: `${slicingProgress?.percentage * 100}%` }\"\n                ></div>\n                <div class=\"slicing-progress-text\">\n                  {{ Math.round(slicingProgress?.percentage * 100) }}%\n                </div>\n              </div>\n              <div\n                v-if=\"slicingProgress.errors && slicingProgress.errors.length > 0\"\n                class=\"slicing-errors\"\n              >\n                <div\n                  v-for=\"(error, index) in slicingProgress.errors\"\n                  :key=\"index\"\n                  class=\"error-message\"\n                >\n                  {{ error }}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"quickButtons.length > 0\" class=\"quick-button pt-2\">\n          <quick-button-component\n            v-for=\"(action, index) in quickButtons\"\n            :key=\"index\"\n            :message=\"action.message\"\n            @click=\"action.onClick\"\n          />\n        </div>\n      </div>\n      <button v-show=\"showScrollButton\" class=\"scroll-to-bottom\" @click=\"scrollToBottom\">\n        <i class=\"mdi mdi-arrow-down large-icon\"></i>\n      </button>\n\n      <div class=\"chat-input\">\n        <textarea\n          ref=\"chatTextarea\"\n          rows=\"1\"\n          v-model=\"userInput\"\n          type=\"text\"\n          :disabled=\"!readyForUserQuery\"\n          :placeholder=\"\n            readyForUserQuery\n              ? $t('Type your message here...')\n              : $t('Select printer, filament, and add models first')\n          \"\n          @keydown.enter.prevent=\"handleEnterKey\"\n        />\n        <button class=\"send-button\" :disabled=\"!readyForUserQuery\" @click=\"onUserInput\">\n          <i class=\"mdi mdi-arrow-up send-icon\"></i>\n        </button>\n      </div>\n    </div>\n    <div v-else>\n      <div class=\"login-container\">\n        <div>\n          <button\n            id=\"signUpSignInBtn\"\n            class=\"btn btn-primary\"\n            @click=\"() => callAgentAction('show_login')\"\n          >\n            {{ $t(\"Sign Up/Sign In to Get Started\") }}\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport VueMarkdown from 'vue-markdown'\nimport urls from '@config/server-urls'\nimport QuickButtonComponent from './components/QuickButtonComponent.vue'\nimport api from './lib/api'\nimport QuickButtonsMixin from './mixins/quickButtonsMixin'\nimport MessagesMixin from './mixins/messagesMixin'\nimport SlicingParamFixerMixin from './mixins/slicingParamFixerMixin'\nimport GradientFadableContainer from './components/GradientFadableContainer.vue'\nimport ChatPanelHeader from './components/ChatPanelHeader.vue'\nimport userNotificationMixin from './mixins/userNotificationMixin'\nimport { callAgentAction, getAgentActionResponse, setAgentActionRetVal } from './lib/agentAction'\nimport ContactSupportForm from './components/ContactSupportForm'\nimport UpgradeModal from './components/UpgradeModal'\n\nexport default {\n  name: 'EmbeddedChatPage',\n  components: {\n    VueMarkdown,\n    QuickButtonComponent,\n    GradientFadableContainer,\n    ChatPanelHeader,\n    ContactSupportForm,\n    UpgradeModal,\n  },\n  mixins: [QuickButtonsMixin, MessagesMixin, SlicingParamFixerMixin, userNotificationMixin],\n  data() {\n    return {\n      oauthAccessToken: null,\n      currentChatId: null,\n      userInput: '',\n      thinking: false,\n      messages: [],\n      modelObjects: [],\n      supportedActions: [],\n      autoOrientInProgress: false,\n      isDevMode: false,\n      haveDonePlateAnalysis: false,\n      showScrollButton: false,\n      slicingProgress: null,\n      current_workflow: null,\n      showUpgradeModal: false,\n      creditsInfo: null, // Will be populated from API responses\n      userInfo: null, // Will be populated from /jusprin/api/me/\n    }\n  },\n  computed: {\n    readyForUserQuery() {\n      if (this.slicingProgress || this.thinking) {\n        return false\n      }\n      return true\n    },\n    readyToSlice() {\n      return this.messages.some(\n        (message) => message.role === 'assistant' && this.slicingSettingsInMessage(message)\n      )\n    },\n    hasModelObjects() {\n      return this.modelObjects.length > 0\n    },\n    showContactSupport() {\n      // Check if any message has a contact_support agent action using higher-order function\n      return this.messages.some(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some((action) => action.name === 'contact_support')\n      )\n    },\n  },\n  watch: {\n    messages: 'onChatContentChanged',\n    quickButtons: 'onChatContentChanged',\n    userInput() {\n      this.$nextTick(() => {\n        this.adjustTextareaHeight()\n      })\n    },\n    oauthAccessToken(newValue, oldValue) {\n      // When token becomes available (changes from null to non-null), fetch user data\n      if (newValue && !oldValue) {\n        this.fetchUserData()\n      }\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    this.isDevMode = urlParams.get('devmode') === 'true'\n  },\n  mounted() {\n    this.initMessagesAndQuickButtons()\n  },\n  methods: {\n    callAgentAction,\n    setAgentActionRetVal, // For JusPrin CallEmbeddedChatMethod\n    async fetchUserData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      this.userInfo = response.data.user\n      this.creditsInfo = response.data.ai_credits\n    },\n    async withCreditCheck(apiCall) {\n      // Check if balance is 0 before making the call\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        const remainingCredits = Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n        if (remainingCredits <= 0) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n      }\n\n      try {\n        const result = await apiCall()\n\n        // Refresh user data after successful call\n        await this.fetchUserData()\n\n        return result\n      } catch (error) {\n        // Catch 402 errors and show UpgradeModal\n        if (error.response && error.response.status === 402) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n\n        // Let all other errors bubble up to Sentry\n        throw error\n      }\n    },\n    async callLongRunningAgentActionThenRefreshPresets(action, payload = null) {\n      await getAgentActionResponse(action, payload, 1000 * 60 * 60 * 24) // Make timeout super long as it's hard to know how long it takes user to finish things like adding a printer\n      this.refreshSelectedPresets()\n      this.populateQuickButtons()\n    },\n    processAgentEvent(event) {\n      if (event.type === 'modelObjectsChanged') {\n        this.processModelObjectsChangedEvent(event)\n      } else if (event.type === 'autoOrient') {\n        this.processAutoOrientEvent(event)\n      } else if (event.type === 'nativeErrorOccurred') {\n        this.processNativeErrorOccurredEvent(event)\n      } else if (event.type === 'notificationPushed') {\n        this.processNotificationPushedEvent(event)\n      } else if (event.type === 'chatPanelFocus') {\n        this.$refs.chatHeader.processChatPanelFocusEvent(event)\n      } else if (event.type === 'slicingProgress') {\n        this.processSlicingProgressEvent(event)\n      }\n    },\n\n    editedPreset(presetType, editedPresets = {}) {\n      return editedPresets[\n        `edited${presetType.charAt(0).toUpperCase() + presetType.slice(1)}Preset`\n      ]\n    },\n\n    overridesFromEditedPreset(presetType, editedPresets = {}) {\n      const editedPreset = this.editedPreset(presetType, editedPresets)\n      const { config, dirty_options } = editedPreset\n\n      if (!dirty_options || dirty_options.length === 0) {\n        return {}\n      }\n\n      const overrides = {}\n      dirty_options.forEach((option) => {\n        if (Object.prototype.hasOwnProperty.call(config, option)) {\n          overrides[option] = config[option]\n        }\n      })\n\n      return overrides\n    },\n\n    selectedPreset(presetType, presets) {\n      return presets[`${presetType}Presets`]?.find((preset) => preset.is_selected) || null\n    },\n\n    slicingSettingsInMessage(message) {\n      return (\n        message.slicing_profiles?.use_print_process_preset ||\n        message.slicing_profiles?.filament_overrides ||\n        message.slicing_profiles?.print_process_overrides\n      )\n    },\n\n    async onUserQueryQuickButton(msg) {\n      this.messages.push({ role: 'user', content: msg })\n      await this.sendUserQuery()\n    },\n\n    async onUserInput() {\n      if (this.userInput.trim()) {\n        this.clearQuickButtons()\n        this.messages.push({ role: 'user', content: this.userInput })\n        this.userInput = ''\n        // Reset textarea height to one line after clearing input\n        const textarea = this.$refs.chatTextarea\n        if (textarea) {\n          textarea.style.height = 'auto'\n        }\n        await this.sendUserQuery()\n      }\n    },\n    startOver() {\n      this.slicingProgress = null\n      this.processedNotifications = new Set()\n      this.current_workflow = null\n      this.initMessagesAndQuickButtons()\n    },\n\n    async sendUserQuery() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      try {\n        const presets = await getAgentActionResponse('get_presets')\n        const editedPresets = await getAgentActionResponse('get_edited_presets')\n        const currentProject = await getAgentActionResponse('get_current_project')\n        const plates = currentProject.plates\n        if (!this.userQueryPreconditionsMet(presets, editedPresets, plates)) {\n          this.thinking = false\n          return\n        }\n\n        // TODO: It's an important assumption that selected preset should be the same as edited preset\n        // Remove this check once it's in production for a while with no messages captured in sentry\n        for (const preset_type of ['filament', 'printProcess', 'printer']) {\n          if (\n            this.editedPreset(preset_type, editedPresets)?.name !==\n            this.selectedPreset(preset_type, presets)?.name\n          ) {\n            window.Sentry?.captureMessage(\n              `Selected preset ${preset_type} is not the same as edited preset ${\n                this.editedPreset(preset_type, editedPresets)?.name\n              }`\n            )\n          }\n        }\n\n        const currentChatId = await this.getCurrentChatId()\n        const response = await this.withCreditCheck(async () => {\n          return api.post(urls.jusprinChatMessages(), this.oauthAccessToken, {\n            messages: this.messages,\n            current_workflow: this.current_workflow,\n            slicing_profiles: {\n              filament_presets: [this.selectedPreset('filament', presets)],\n              print_process_presets: presets.printProcessPresets,\n              filament_overrides: this.overridesFromEditedPreset('filament', editedPresets),\n              print_process_overrides: this.overridesFromEditedPreset('printProcess', editedPresets),\n            },\n            plates: plates,\n            chat_id: currentChatId,\n          })\n        })\n        this.thinking = false\n\n        this.processChatResponse(response.data, presets)\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.thinking = false\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n      }\n    },\n\n    async getCurrentChatId() {\n      if (!this.currentChatId) {\n        const chatsApiUrl = urls.jusprinChats(this.currentChatId)\n        const newChatResponse = await api['post'](chatsApiUrl, this.oauthAccessToken, {\n          messages: JSON.stringify(this.messages),\n        })\n        this.currentChatId = newChatResponse?.data?.id // Assign the new chat ID\n      }\n      return this.currentChatId\n    },\n\n    async processChatResponse(responseData, presets) {\n      const message = responseData.message\n      this.messages.push(message)\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n        machine_name: this.selectedPreset('printer', presets)?.name,\n        filament_name: this.selectedPreset('filament', presets)?.name,\n        print_process_name: this.selectedPreset('printProcess', presets)?.name,\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (this.slicingSettingsInMessage(message)) {\n        this.applySettingsInMessage(message)\n      }\n\n      if (message.agent_actions?.length) {\n        await this.processAgentActions(message)\n      } else {\n        this.populateQuickButtons() // If there are no agent actions, we can populate default quick buttons\n      }\n    },\n\n    async populateDatabaseWithChat(payload = null) {\n      const currentChatId = await this.getCurrentChatId()\n      const chatsApiUrl = urls.jusprinChats(currentChatId)\n      const chatsApiVerb = currentChatId ? 'put' : 'post'\n      await api[chatsApiVerb](chatsApiUrl, this.oauthAccessToken, payload)\n    },\n\n    async processAgentActions(message) {\n      if (!message.agent_actions?.length) return\n      this.clearQuickButtons()\n\n      for (const action of message.agent_actions) {\n        if (action.name === 'slice_model') {\n          await this.doSliceWithCurrentSettings()\n        } else if (action.name === 'start_chat_over') {\n          await this.startOver()\n        } else if (action.name === 'add_printers') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n        } else if (action.name === 'add_filaments') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n        } else if (action.name === 'change_printer') {\n          await this.showPresetOptions('printer')\n        } else if (action.name === 'change_filament') {\n          await this.showPresetOptions('filament')\n        } else if (action.name === 'contact_support') {\n          this.scrollToBottom()\n        } else if (action.name === 'auto_orient_all_models') {\n          await this.autoOrientAllObjects()\n        } else if (action.name === 'auto_arrange_all_models') {\n          await this.autoArrangeAllObjects()\n        } else if (action.name === 'ask_user_to_choose_from_options') {\n          this.showOptionsAsQuickButtons(action.arguments)\n        }\n      }\n    },\n\n    async applySettingsInMessage(message) {\n      if (!this.slicingSettingsInMessage(message)) {\n        // If LLM didn't select a preset, it didn't know how to process the query. Nothing should be assumed in this case.\n        return\n      }\n\n      this.clearQuickButtons()\n\n      try {\n        if (message.slicing_profiles.use_print_process_preset) {\n          await getAgentActionResponse('select_preset', {\n            type: 'print',\n            name: message.slicing_profiles.use_print_process_preset,\n          })\n        }\n\n        let filamentOverrides = message.slicing_profiles?.filament_overrides || {}\n        filamentOverrides = this.fixFilamentParamOverrides(filamentOverrides)\n\n        let param_overrides = [\n          ...this.paramOverridesToApplyConfigPayload(filamentOverrides, 'filament'),\n          ...this.paramOverridesToApplyConfigPayload(\n            message.slicing_profiles?.print_process_overrides || {},\n            'print'\n          ),\n        ]\n\n        if (param_overrides.length > 0) {\n          await getAgentActionResponse('apply_config', param_overrides)\n        }\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return\n      }\n    },\n    async doSliceWithCurrentSettings() {\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      const hasModels = plates.some((plate) => plate.model_objects?.length > 0)\n      if (!hasModels) {\n        this.messages.push(this.cannedMessages.noModelObjects)\n        this.setQuickButtons([this.cannedActions.startOver, this.cannedActions.moreOptions])\n        return\n      }\n\n      if (!this.readyToSlice) {\n        const presets = await getAgentActionResponse('get_presets')\n        this.messages.push({\n          role: 'assistant',\n          content: `${this.$i18next.t(\"I have not set any slicing parameters for you. Do you want me to slice your model with these?\")}\\n${this.$i18next.t(\"- Filament:\")} **${\n            this.selectedPreset('filament', presets)?.name\n          }**\\n${this.$i18next.t(\"- Process preset:\")} **${this.selectedPreset('printProcess', presets)?.name}**`,\n        })\n\n        this.pushQuickButtons([\n          {\n            message: this.$t('Yes'),\n            onClick: () => this.doSlice(),\n          },\n          {\n            message: this.$t('No'),\n            onClick: () => this.popQuickButtons(),\n          },\n        ])\n        return\n      } else {\n        this.doSlice()\n      }\n    },\n    async doSlice() {\n      this.clearQuickButtons()\n      this.slicingProgress = { percentage: 0, errors: [] }\n      callAgentAction('start_slicer_all')\n\n      setTimeout(() => {\n        if (this.slicingProgress && this.slicingProgress.percentage < 1.0 - 1e-6) {\n          this.slicingProgress.overrun = true\n          this.setQuickButtons([this.cannedActions.startOver])\n        }\n      }, 1000 * 60 * 2)\n    },\n    async autoOrientAllObjects() {\n      let agentActionName = 'auto_orient_all_objects'\n\n      // TODO: Remove this once 0.4 is no longer supported\n      if (this.supportedActions.includes('auto_orient_object')) {\n        agentActionName = 'auto_orient_object'\n      }\n\n      callAgentAction(agentActionName, {})\n      this.autoOrientInProgress = true\n      this.populateQuickButtons()\n    },\n    async autoArrangeAllObjects() {\n      setTimeout(() => {\n        callAgentAction('arrange_all_objects', {})\n        this.autoArrangeInProgress = true\n      }, 100)\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Models auto-arranged.'),\n      })\n      this.populateQuickButtons()\n      this.setQuickButtons([this.cannedActions.undoAutoArrange, ...this.quickButtons])\n    },\n    changedParams(message) {\n      return {\n        ...(message.slicing_profiles?.filament_overrides ?? {}),\n        ...(message.slicing_profiles?.print_process_overrides ?? {}),\n      }\n    },\n    initMessagesAndQuickButtons() {\n      this.currentChatId = null\n\n      // Reset messages and quick actions\n      this.messages = [this.cannedMessages.greeting]\n      setTimeout(async () => {\n        await this.refreshSelectedPresets()\n        await this.refreshModelObjects()\n        this.populateQuickButtons()\n      }, 10)\n    },\n\n    async refreshModelObjects() {\n      const project = await getAgentActionResponse('get_current_project')\n      this.modelObjects = this.distinctModelObjectsInProject(project)\n      if (this.modelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.currentModelObjects(this.modelObjects.length))\n      } else {\n        this.messages.push(this.cannedMessages.noModelObjects)\n      }\n    },\n    async refreshSelectedPresets() {\n      const presets = await getAgentActionResponse('get_presets')\n      this.messages.push(\n        this.cannedMessages.currentPresetSelections(\n          this.selectedPreset('printer', presets)?.name,\n          this.selectedPreset('filament', presets)?.name\n        )\n      )\n    },\n    fixBrokenMarkdown(text) {\n      // Markdown returned from LLM may be broken.\n      const formattedText = text.replace(/ (\\d\\.) /g, '\\n$1 ')\n      return formattedText\n    },\n    scrollToBottom() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      if (chatMessageContainer) {\n        chatMessageContainer.scrollTop = chatMessageContainer.scrollHeight\n      }\n    },\n    onChatContentChanged() {\n      this.$nextTick(() => {\n        this.scrollToBottom()\n      })\n    },\n    paramOverridesToApplyConfigPayload(params, type) {\n      const param_overrides = []\n      for (const [key, value] of Object.entries(params)) {\n        param_overrides.push({ type, key, value })\n      }\n      return param_overrides\n    },\n    userQueryPreconditionsMet(presets, editedPresets, plates) {\n      if (\n        (presets?.printerPresets && presets.printerPresets?.length < 1) ||\n        presets.printerPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddPrinters)\n        this.setQuickButtons([this.cannedActions.addPrinters])\n        return false\n      } else if (\n        (presets?.filamentPresets && presets.filamentPresets?.length < 1) ||\n        presets.filamentPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddFilaments)\n        this.setQuickButtons([this.cannedActions.addFilaments])\n        return false\n      }\n      return true\n    },\n\n    modelObjectsWithOverhang(modelObjects) {\n      return modelObjects.filter((obj) => (obj.features?.overhang ?? 0) > 0.001)\n    },\n\n    distinctModelObjectsInProject(project) {\n      return project.plates\n        .flatMap((plate) => plate.model_objects)\n        .reduce((unique, obj) => {\n          const exists = unique.find((item) => item.id === obj.id)\n          return exists ? unique : [...unique, obj]\n        }, [])\n    },\n\n    processModelObjectsChangedEvent(event) {\n      const currentProject = event.data\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      const newModelObjects = currentModelObjects.filter(\n        (obj) => !this.modelObjects.some((item) => item.id === obj.id)\n      )\n      this.modelObjects = currentModelObjects\n      if (newModelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.newModelObjects(newModelObjects))\n        this.$refs.chatHeader.popupChatPanelIfNecessary()\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          this.messages.push({\n            role: 'assistant',\n            content:\n              this.$i18next.t('I notice some of your models have overhangs. I can try to auto-orient them to minimize the need for supports.'),\n          })\n        }\n        const quickButtons = [this.cannedActions.autoOrient, this.cannedActions.enableSupport]\n        if (this.shouldShowPlateAnalysisQuickButton) {\n          quickButtons.push(this.cannedActions.analyseModel)\n        }\n        this.setQuickButtons([\n          ...quickButtons,\n          this.cannedActions.commonPrintingPrompts,\n          this.cannedActions.moreOptions,\n        ])\n        return\n      }\n\n      this.populateQuickButtons()\n    },\n    processAutoOrientEvent(event) {\n      const currentProject = event.data?.currentProject\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      this.modelObjects = currentModelObjects\n\n      if (!this.autoOrientInProgress) {\n        return\n      }\n\n      this.autoOrientInProgress = false\n      if (event.data?.status === 'completed') {\n        let msg = this.$t('Models auto-oriented.')\n        let quickButtons = [this.cannedActions.undoAutoOrient]\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          msg +=\n            ` ${this.$t('However, some models still have overhangs. I recommend enabling support to make sure they can be printed successfully.')}`\n          quickButtons.push(this.cannedActions.enableSupport)\n        }\n\n        this.messages.push({\n          role: 'assistant',\n          content: msg,\n        })\n        this.removeQuickButtons([\n          this.cannedActions.autoOrient,\n          this.cannedActions.enableSupport,\n          this.cannedActions.undoAutoOrient,\n        ])\n        this.setQuickButtons([...quickButtons, ...this.quickButtons])\n      }\n    },\n    processNativeErrorOccurredEvent(event) {\n      window.Sentry?.captureMessage(event.data?.errorMessage, 'error')\n    },\n    processSlicingProgressEvent(event) {\n      if (!this.slicingProgress) {\n        return\n      }\n\n      const percentage = event.data?.percentage\n      if (percentage !== undefined) {\n        this.slicingProgress.percentage = percentage\n        this.slicingProgress.text = event.data?.text\n      }\n\n      if (percentage && percentage < 1.0 - 1e-6) {\n        return\n      }\n\n      if (this.slicingProgress.fadeOut) {\n        return\n      }\n\n      const quickButtons = [this.cannedActions.startOver, this.cannedActions.moreOptions]\n\n      if (this.slicingProgress.errors && this.slicingProgress.errors.length > 0) {\n        this.messages.push({\n          role: 'assistant',\n          content: `${this.$i18next.t(\"My slicing algorithm lord just said:\")}\\n *\"${this.slicingProgress.errors.join(\n            '\\n'\n          )}\"*`,\n        })\n        quickButtons.unshift(this.cannedActions.tellMeWhatNotificationMeans)\n      } else {\n        if (this.supportedActions.includes('switch_to_preview')) {\n          quickButtons.unshift(this.cannedActions.switchToPreview)\n        }\n        quickButtons.unshift(this.cannedActions.exportGCode)\n      }\n\n      this.setQuickButtons(quickButtons)\n\n      // Add fade-out class first\n      this.slicingProgress.fadeOut = true\n\n      // Remove the progress bar after fade out animation completes\n      setTimeout(() => {\n        this.slicingProgress = null\n      }, 2000) // Match the transition duration in CSS\n    },\n\n    async callPlateAnalysis() {\n      const project = await getAgentActionResponse('get_current_project')\n      const plates = project.plates\n      const images = await this.renderPlateForAnalysis()\n      const currentChatId = await this.getCurrentChatId()\n\n      const payload = {\n        images: images,\n        plates: plates,\n        chat_id: currentChatId,\n      }\n\n      try {\n        const response = await this.withCreditCheck(async () => {\n          return api.post(\n            urls.jusprinPlateAnalysisProcess(),\n            this.oauthAccessToken,\n            payload\n          )\n        })\n\n                // Handle credit response structure - if it's a credit message, restructure it for processAnalysisResponse\n        if (response.data && response.data.message && response.data.message.role === 'assistant') {\n          return { message: response.data.message }\n        }\n\n        return response.data\n      } catch (error) {\n        console.error('Error calling plate analysis:', error)\n      }\n    },\n\n    async renderPlateForAnalysis() {\n      // This function now only fetches and renders the plate images,\n      // then returns an array of base64 image strings.\n      const cameraPositionByDegrees = (target, xyPlaneAngle, zPlaneAngle) => {\n        const distanceFromTarget = 1000 // OrcaSlicer default\n        const xyPlaneAngleRadians = xyPlaneAngle * (Math.PI / 180)\n        const zPlaneAngleRadians = zPlaneAngle * (Math.PI / 180)\n        return {\n          x: target.x + distanceFromTarget * Math.sin(xyPlaneAngleRadians),\n          y: target.y - distanceFromTarget * Math.cos(xyPlaneAngleRadians),\n          z: target.z + distanceFromTarget * Math.sin(zPlaneAngleRadians),\n        }\n      }\n\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      if (plates.length === 0) {\n        return []\n      }\n\n      const { index, bounding_box, model_objects } = plates[0]\n      if (!model_objects || model_objects.length === 0) {\n        return []\n      }\n\n      const target = {\n        x: (bounding_box.max.x + bounding_box.min.x) / 2,\n        y: (bounding_box.max.y + bounding_box.min.y) / 2,\n        z: 0,\n      }\n\n      const views = [\n        { camera_position: cameraPositionByDegrees(target, 0, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -30, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -210, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, 0, -45), target: target },\n      ]\n\n      const renderResult = await getAgentActionResponse('render_plate', {\n        plate_index: index,\n        views: views,\n      })\n\n      // Build an array of all images from renderResult and return it.\n      const images = renderResult.filter((result) => result.base64).map((result) => result.base64)\n\n      return images\n    },\n\n    async getAnalysisResult() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      const analysisResponse = await this.callPlateAnalysis()\n      await this.processAnalysisResponse(analysisResponse)\n    },\n\n    async processAnalysisResponse(response) {\n      this.messages.push(response.message)\n      this.thinking = false\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (response.message.suggested_printing_method) {\n        this.pushQuickButtons([\n          this.cannedActions.plateAnalysisLooksGoodToMe,\n          this.cannedActions.plateAnalysisIsNotGood,\n          this.cannedActions.editPlateAnalysis,\n          this.cannedActions.moreOptions,\n        ])\n      } else {\n        this.populateQuickButtons()\n      }\n\n      return\n    },\n\n    ensurePlateAnalysisMessageExists() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      if (!lastMessage?.suggested_printing_method) {\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return false\n      }\n      return true\n    },\n\n    async queryWithSuggestedPrintingMethod() {\n      this.clearQuickButtons()\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const lastMessage = this.messages[this.messages.length - 1]\n      this.messages.push({\n        role: 'user',\n        content: `${this.$i18next.t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${lastMessage.suggested_printing_method}`,\n      })\n      this.sendUserQuery()\n    },\n\n    removePlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      this.messages.pop()\n      this.popQuickButtons()\n      this.populateQuickButtons()\n    },\n\n    editPlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const plateAnalysisMessage = this.messages.pop()\n      this.clearQuickButtons()\n      this.userInput = `${this.$i18next.t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${plateAnalysisMessage.suggested_printing_method}`\n    },\n\n    handleChatScroll() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      const atBottom =\n        chatMessageContainer.scrollHeight - chatMessageContainer.scrollTop <=\n        chatMessageContainer.clientHeight\n      this.showScrollButton = !atBottom\n    },\n    adjustTextareaHeight() {\n      const textarea = this.$refs.chatTextarea\n      const chatMessages = this.$refs.chatMessageContainer\n      if (!textarea || !chatMessages) return\n\n      // Reset height to auto to get correct scrollHeight\n      textarea.style.height = 'auto'\n      // Set new height based on scrollHeight, with max of 150px\n      const newHeight = Math.min(textarea.scrollHeight, 150)\n      textarea.style.height = newHeight + 'px'\n\n      // Update chat messages padding to match input height plus padding\n      const chatInput = textarea.closest('.chat-input')\n      if (chatInput) {\n        const inputTotalHeight = chatInput.offsetHeight\n        chatMessages.style.paddingBottom = `${inputTotalHeight + 8}px`\n      }\n    },\n    handleEnterKey(e) {\n      if (e.shiftKey || e.metaKey || e.ctrlKey || e.altKey) {\n        this.userInput += '\\n'\n        return\n      }\n      this.onUserInput()\n    },\n    handleContactSupportFormDismissed(data) {\n      // Find the index of the message with contact_support agent action\n      const supportMsgIndex = this.messages.findIndex(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some(action => action.name === 'contact_support')\n      )\n\n      // Remove the message if found\n      if (supportMsgIndex !== -1) {\n        this.messages.splice(supportMsgIndex, 1)\n      }\n\n      // Add new assistant message with the response\n      this.messages.push({\n        role: 'assistant',\n        content: data.message,\n      })\n\n      this.populateQuickButtons()\n      this.scrollToBottom()\n    },\n    showContactSupportForm() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: null,\n        agent_actions: [{ name: 'contact_support', arguments: {} }],\n      })\n      this.scrollToBottom()\n    },\n    showDiscordSupportMessage() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Since you are on a Free plan, please join our Discord server to seek support from the community. You can also upgrade to the Unlimited plan to get email support from the Obico team.'),\n        discord_support: {\n          url: 'https://discord.gg/Tx67dHNYH3',\n          qr_code_url: 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=https%3A%2F%2Fdiscord.gg%2FTx67dHNYH3'\n        },\n        has_upgrade_link: true\n      })\n      this.setQuickButtons([this.cannedActions.moreOptions])\n      this.scrollToBottom()\n    },\n\n    showOptionsAsQuickButtons(args) {\n      const options = args?.user_options_to_choose_from || []\n      if (!options || !Array.isArray(options)) return\n\n      const newQuickButtons = options.map((option) => ({\n        message: option,\n        onClick: () => this.onUserQueryQuickButton(option),\n      }))\n\n      // Remove any existing buttons with the same messages\n      this.removeQuickButtons(newQuickButtons)\n\n      // Add the new buttons to the existing ones\n      this.pushQuickButtons([...this.quickButtons, ...newQuickButtons])\n    },\n\n    // Modal methods\n    openUpgradeModal() {\n      this.showUpgradeModal = true\n    },\n    closeUpgradeModal() {\n      this.showUpgradeModal = false\n    },\n    handleQRCodeError(event) {\n      // Hide the QR code if it fails to load\n      event.target.style.display = 'none'\n      console.warn('Failed to load QR code for Discord support')\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n@import './styles/EmbeddedChatPage'\n\n.highlighted-url\n  background: var(--color-surface-primary, #e9ecef)\n  color: var(--color-primary, #007bff)\n  border-radius: var(--border-radius-xs, 4px)\n  padding: 2px 8px\n  margin-left: 6px\n  font-family: monospace\n  font-size: 0.98em\n  word-break: break-all\n  display: inline-block\n  vertical-align: middle\n// icon style for message bubble\n.message-content i.mdi-alert-circle-outline\n  font-size: 1.3em\n  margin-right: 8px\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EmbeddedChatPage.vue?vue&type=template&id=146a1112&scoped=true&\"\nimport script from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nexport * from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EmbeddedChatPage.vue?vue&type=style&index=0&id=146a1112&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"146a1112\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('chat-panel-header',{ref:\"chatHeader\",attrs:{\"should-popup-chat-panel\":Boolean(_vm.oauthAccessToken),\"credits-info\":_vm.creditsInfo},on:{\"action\":_vm.callAgentAction,\"show-contact-support-form\":_vm.showContactSupportForm,\"show-discord-support-message\":_vm.showDiscordSupportMessage,\"show-upgrade-modal\":_vm.openUpgradeModal}}),_c('upgrade-modal',{attrs:{\"show\":_vm.showUpgradeModal,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"close\":_vm.closeUpgradeModal}}),(_vm.oauthAccessToken)?_c('div',{staticClass:\"chat-container mt-3\"},[_c('div',{ref:\"chatMessageContainer\",staticClass:\"chat-messages\",on:{\"scroll\":_vm.handleChatScroll}},[_vm._l((_vm.messages),function(message,index){return _c('div',{key:index,staticClass:\"message\",class:message.role},[(message.content)?_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[(message.has_upgrade_link)?_c('div',{staticClass:\"upgrade-message\"},[_c('div',[_vm._v(_vm._s(_vm.$t('Since you are on a Free plan, please join our Discord server to seek support from the community.')))]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('You can also {localizedDom} to get email support from the Obico team.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"upgrade-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.openUpgradeModal.apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('upgrade to the Unlimited plan')))])]},proxy:true}],null,true)})],1)]):_c('VueMarkdown',[_vm._v(_vm._s(message.content))]),(\n                message.per_override_explanations && message.per_override_explanations.length > 0\n              )?_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Detailed explanations:\")))]),_vm._l((message.per_override_explanations),function(explanation,index){return _c('div',{key:index},[_c('div',[_c('b',[_vm._v(_vm._s(explanation.parameter)+\":\")]),_vm._v(\" \"+_vm._s(explanation.explanation)+\" \")])])})],2):_vm._e()],1)]):_vm._e(),(message.slicing_profiles && _vm.slicingSettingsInMessage(message))?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I have applied the following settings:\")))]),(message.slicing_profiles.use_print_process_preset)?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Process preset:\"))+\" \"),_c('b',[_vm._v(_vm._s(message.slicing_profiles.use_print_process_preset))])]):_vm._e(),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Additional slicing parameters:\"))+\" \"),(Object.keys(_vm.changedParams(message)).length === 0)?_c('b',[_vm._v(_vm._s(_vm.$t(\"None\")))]):_vm._e(),_vm._l((_vm.changedParams(message)),function(value,key){return _c('div',{key:key},[_vm._v(\"     - \"+_vm._s(key)+\": \"),_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(value))])])})],2)]),(index !== _vm.messages.length - 1)?_c('div',{staticClass:\"quick-button pt-2\"},[_c('quick-button-component',{attrs:{\"message\":_vm.$t('Re-apply settings')},on:{\"click\":function($event){return _vm.applySettingsInMessage(message)}}})],1):_vm._e()],1)]):_vm._e(),(message.suggested_printing_method)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I suggest the following to achieve the best results:\")))]),_c('VueMarkdown',[_vm._v(_vm._s(message.suggested_printing_method))])],1)]):_vm._e(),(message.jusprinNotification)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Oh no! My slicing algorithm lord just said:\")))]),_c('div',{staticClass:\"notification-text\",class:message.jusprinNotification.level},[_c('i',{class:message.jusprinNotification.level === 'error'\n                    ? 'mdi mdi-alert-circle'\n                    : 'mdi mdi-alert'}),_vm._v(\" \"+_vm._s(message.jusprinNotification.text)+\" \")])])]):_vm._e(),(message.discord_support)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"discord-support-container\"},[_c('div',{staticClass:\"discord-info\"},[_c('div',{staticClass:\"discord-url\"},[_c('strong',[_vm._v(\"Discord Server:\")]),_c('code',[_vm._v(_vm._s(message.discord_support.url))])]),_c('div',{staticClass:\"discord-instructions\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Scan this QR code with your phone to join our Discord server:\"))+\" \")])]),_c('div',{staticClass:\"qr-code-container\"},[_c('img',{staticClass:\"qr-code\",attrs:{\"src\":message.discord_support.qr_code_url,\"alt\":\"Discord QR Code\"},on:{\"error\":_vm.handleQRCodeError}})])])])]):_vm._e()])}),(_vm.thinking)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block align-items-center\"},[_c('div',{staticClass:\"message-content thinking-animation\"},[_c('VueMarkdown',[_vm._v(\"_\"+_vm._s(_vm.$t(\"Thinking...\"))+\"_\")])],1)])]):_vm._e(),(_vm.showContactSupport)?_c('contact-support-form',{attrs:{\"messages\":_vm.messages,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"form-dismissed\":_vm.handleContactSupportFormDismissed}}):_vm._e(),(_vm.slicingProgress)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block slicing-message-block\",class:{ 'fade-out': _vm.slicingProgress.fadeOut }},[_c('div',{staticClass:\"message-content\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.slicingProgress.overrun ? _vm.$t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.') : _vm.slicingProgress.text || _vm.$t('Slicing in progress...'))+\" \")]),_c('div',{staticClass:\"slicing-progress-container\"},[_c('div',{staticClass:\"slicing-progress-bar\",style:({ width: `${_vm.slicingProgress?.percentage * 100}%` })}),_c('div',{staticClass:\"slicing-progress-text\"},[_vm._v(\" \"+_vm._s(Math.round(_vm.slicingProgress?.percentage * 100))+\"% \")])]),(_vm.slicingProgress.errors && _vm.slicingProgress.errors.length > 0)?_c('div',{staticClass:\"slicing-errors\"},_vm._l((_vm.slicingProgress.errors),function(error,index){return _c('div',{key:index,staticClass:\"error-message\"},[_vm._v(\" \"+_vm._s(error)+\" \")])}),0):_vm._e()])])]):_vm._e(),(_vm.quickButtons.length > 0)?_c('div',{staticClass:\"quick-button pt-2\"},_vm._l((_vm.quickButtons),function(action,index){return _c('quick-button-component',{key:index,attrs:{\"message\":action.message},on:{\"click\":action.onClick}})}),1):_vm._e()],2),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showScrollButton),expression:\"showScrollButton\"}],staticClass:\"scroll-to-bottom\",on:{\"click\":_vm.scrollToBottom}},[_c('i',{staticClass:\"mdi mdi-arrow-down large-icon\"})]),_c('div',{staticClass:\"chat-input\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userInput),expression:\"userInput\"}],ref:\"chatTextarea\",attrs:{\"rows\":\"1\",\"type\":\"text\",\"disabled\":!_vm.readyForUserQuery,\"placeholder\":_vm.readyForUserQuery\n            ? _vm.$t('Type your message here...')\n            : _vm.$t('Select printer, filament, and add models first')},domProps:{\"value\":(_vm.userInput)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handleEnterKey.apply(null, arguments)},\"input\":function($event){if($event.target.composing)return;_vm.userInput=$event.target.value}}}),_vm._v(\" \"),_c('button',{staticClass:\"send-button\",attrs:{\"disabled\":!_vm.readyForUserQuery},on:{\"click\":_vm.onUserInput}},[_c('i',{staticClass:\"mdi mdi-arrow-up send-icon\"})])])]):_c('div',[_c('div',{staticClass:\"login-container\"},[_c('div',[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"id\":\"signUpSignInBtn\"},on:{\"click\":() => _vm.callAgentAction('show_login')}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Sign Up/Sign In to Get Started\"))+\" \")])])])])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"btn btn-outline-primary\",attrs:{\"href\":\"#\"},on:{\"click\":_vm.handleClick}},[_vm._v(\" \"+_vm._s(_vm.message)+\" \")])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <a href=\"#\" class=\"btn btn-outline-primary\" @click=\"handleClick\">\n    {{ message }}\n  </a>\n</template>\n\n<script>\nexport default {\n  name: 'QuickButtonComponent',\n  props: {\n    message: {\n      type: String,\n      required: true,\n    },\n  },\n  methods: {\n    handleClick(event) {\n      this.$emit('click', event)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn\n  width: auto\n  max-width: 100%\n  white-space: normal\n  text-align: center\n  padding: 0.5rem 1rem\n  hyphens: auto\n  word-wrap: break-word\n  overflow-wrap: break-word\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuickButtonComponent.vue?vue&type=template&id=79a2bd8c&scoped=true&\"\nimport script from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nexport * from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuickButtonComponent.vue?vue&type=style&index=0&id=79a2bd8c&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"79a2bd8c\",\n  null\n  \n)\n\nexport default component.exports","import axios from 'axios'\nimport i18n from '@src/i18n/i18n'\n\nconst getHeaders = (authToken) => ({\n  Authorization: `Bearer ${authToken}`,\n})\n\nconst getConfig = (authToken) => ({\n  headers: getHeaders(authToken),\n  params: {\n    lang: i18n.language,\n  },\n})\n\nexport default {\n  get: (url, authToken) => {\n    return axios.get(url, getConfig(authToken))\n  },\n  post: (url, authToken, data) => {\n    return axios.post(url, data, getConfig(authToken))\n  },\n  put: (url, authToken, data) => {\n    return axios.put(url, data, getConfig(authToken))\n  },\n}\n","// Global state\nwindow.stubAgentActionResponse = new Map()\nwindow.agentActionCallMap = {}\n\nimport i18next from '@src/i18n/i18n.js'\n\n// Helper functions\nexport function setAgentActionRetVal({ refId, retVal = null, error = null }) {\n  window.agentActionCallMap[refId] = { retVal, error }\n}\n\nexport function callAgentAction(action, payload = null, refId = null) {\n  const message = { action }\n  if (payload !== null) message.payload = payload\n  if (refId !== null) message.refId = refId\n\n  if (window.wx?.postMessage) {\n    window.wx.postMessage(message)\n  } else {\n    console.log(`window.wx.postMessage(${JSON.stringify(message)})`)\n\n    if (refId !== null && refId !== undefined) {\n      setTimeout(() => {\n        const retVal = window.stubAgentActionResponse.get(action) || {}\n        setAgentActionRetVal({ refId, retVal })\n      }, 10)\n    }\n  }\n}\n\nexport function getAgentActionResponse(action, payload = {}, timeout = 10000) {\n  return new Promise((resolve, reject) => {\n    const refId = Math.random().toString(36).substring(2, 15)\n    window.agentActionCallMap[refId] = null // Initialize with null\n\n    callAgentAction(action, payload, refId)\n\n    const timeoutId = setTimeout(() => {\n      if (refId in window.agentActionCallMap) {\n        reject(new Error(i18next.t('Timeout: No response for action \"{action}\" within {timeout}ms', {\n          action,\n          timeout\n        })))\n        delete window.agentActionCallMap[refId] // Clean up\n      }\n    }, timeout)\n\n    // Poll for response\n    const checkResponse = () => {\n      const response = window.agentActionCallMap[refId]\n      if (response !== null && response !== undefined) {\n        clearTimeout(timeoutId)\n        delete window.agentActionCallMap[refId] // Clean up\n        if (response.error) {\n          reject(new Error(response.error))\n        } else {\n          resolve(response.retVal)\n        }\n      } else {\n        setTimeout(checkResponse, 10) // Check again in 10ms\n      }\n    }\n    checkResponse()\n  })\n}\n","import { callAgentAction, getAgentActionResponse } from '../lib/agentAction'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  data() {\n    return {\n      quickButtonsStack: [],\n    }\n  },\n  computed: {\n    quickButtons() {\n      return this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n    },\n    cannedActions() {\n      return {\n        addPrinters: {\n          message: this.$i18next.t('Add printer'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n          },\n        },\n        addFilaments: {\n          message: this.$i18next.t('Add filament'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n          },\n        },\n        changePrinter: {\n          message: this.$i18next.t('Change printer'),\n          onClick: () => this.showPresetOptions('printer'),\n        },\n        changeFilament: {\n          message: this.$i18next.t('Change filament'),\n          onClick: () => this.showPresetOptions('filament'),\n        },\n        moreOptions: {\n          message: this.$i18next.t('More options'),\n          onClick: () => this.showMoreOptions(),\n        },\n        cancel: {\n          message: this.$i18next.t('Cancel'),\n          onClick: () => this.popQuickButtons(),\n        },\n        sliceWithCurrentSettings: {\n          message: this.$i18next.t('Slice with current settings'),\n          onClick: () => this.doSliceWithCurrentSettings(),\n        },\n        endTroubleshooting: {\n          message: this.$i18next.t('End troubleshooting'),\n          onClick: () => {\n            this.current_workflow = null\n            this.onUserQueryQuickButton(this.$i18next.t('I want to end troubleshooting'))\n          },\n        },\n        stayInTroubleshooting: {\n          message: this.$i18next.t('Stay in troubleshooting'),\n          onClick: () => {\n            this.onUserQueryQuickButton(this.$i18next.t('I want to continue troubleshooting'))\n          },\n        },\n        startOver: {\n          message: this.$i18next.t('Start over'),\n          onClick: () => this.startOver(),\n        },\n        exportGCode: {\n          message: this.$i18next.t('Export G-code'),\n          onClick: () => this.callAgentAction('export_gcode'),\n        },\n        switchToPreview: {\n          message: this.$i18next.t('Switch to preview'),\n          onClick: () => this.callAgentAction('switch_to_preview'),\n        },\n        autoOrient: {\n          message: this.$i18next.t('Auto-orient models'),\n          onClick: () => {\n            this.autoOrientAllObjects()\n          },\n        },\n        undoAutoOrient: {\n          message: this.$i18next.t('Undo auto-orient'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-orient is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoOrient])\n          },\n        },\n        undoAutoArrange: {\n          message: this.$i18next.t('Undo auto-arrange'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-arrange is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoArrange])\n          },\n        },\n        enableSupport: {\n          message: this.$i18next.t('Enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '1' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Support enabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.enableSupport])\n            this.setQuickButtons([this.cannedActions.undoEnableSupport, ...this.quickButtons])\n          },\n        },\n        undoEnableSupport: {\n          message: this.$i18next.t('Undo enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '0' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Support is now disabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoEnableSupport])\n          },\n        },\n        tellMeWhatNotificationMeans: {\n          message: this.$i18next.t('Explain it to me'),\n          onClick: () => {\n            // Find the last assistant message that contains a notification\n            const lastErrorMessage = [...this.messages]\n              .reverse()\n              .find((msg) => msg.role === 'assistant' && msg.jusprinNotification)\n\n            // Get the original error message if found\n            let originalErrorMessage = ''\n            if (lastErrorMessage && lastErrorMessage.jusprinNotification) {\n              originalErrorMessage = lastErrorMessage.jusprinNotification.text\n            }\n\n            // Format the new message\n            const newMessage = this.$i18next.t('JusPrin displays this message: *\"{originalErrorMessage}\"* Explain it to me.', {\n              originalErrorMessage\n            })\n\n            // Send the message\n            this.onUserQueryQuickButton(newMessage)\n          },\n        },\n        acknowledgeError: {\n          message: this.$i18next.t('Okay'),\n          onClick: () => {\n            this.messages.pop()\n            this.popQuickButtons()\n          },\n        },\n        commonPrintingPrompts: {\n          message: this.$i18next.t('Common printing prompts'),\n          onClick: () => this.showCommonPrintingPrompts(),\n        },\n        testRender: {\n          message: this.$i18next.t('Test render'),\n          onClick: () => this.renderPlateForAnalysis(),\n        },\n        analyseModel: {\n          message: this.$i18next.t('✨ Do your magic!'),\n          onClick: () => this.getAnalysisResult(),\n        },\n        plateAnalysisLooksGoodToMe: {\n          message: this.$i18next.t('Looks good to me'),\n          onClick: () => this.queryWithSuggestedPrintingMethod(),\n        },\n        plateAnalysisIsNotGood: {\n          message: this.$i18next.t('You got it wrong. Scratch that.'),\n          onClick: () => this.removePlateAnalysis(),\n        },\n        editPlateAnalysis: {\n          message: this.$i18next.t('Let me change it'),\n          onClick: () => this.editPlateAnalysis(),\n        },\n      }\n    },\n    shouldShowSliceWithCurrentSettingsQuickButton() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      return lastMessage && this.slicingSettingsInMessage(lastMessage)\n    },\n    shouldShowStartOverQuickButton() {\n      return this.messages.some((message) => message.role === 'user')\n    },\n    shouldShowPlateAnalysisQuickButton() {\n      return !this.haveDonePlateAnalysis && this.hasModelObjects\n    },\n  },\n  methods: {\n    pushQuickButtons(actions) {\n      this.quickButtonsStack.push(actions)\n    },\n    popQuickButtons() {\n      this.quickButtonsStack.pop()\n    },\n    removeQuickButtons(actions) {\n      const actionMessages = actions.map((action) => action.message)\n      let topActions = this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n      topActions = topActions.filter((action) => !actionMessages.includes(action.message))\n      this.$set(this.quickButtonsStack, this.quickButtonsStack.length - 1, topActions)\n    },\n    clearQuickButtons() {\n      this.quickButtonsStack = []\n    },\n    setQuickButtons(actions) {\n      this.clearQuickButtons()\n      this.pushQuickButtons(actions)\n    },\n    initUserQueryHintButtons() {\n      const initQueryHints = [\n        this.$i18next.t('Just do a standard print. Nothing special.'),\n        this.$i18next.t('I want to do a fast print. Draft quality.'),\n        this.$i18next.t('Print a strong part.'),\n        this.$i18next.t('My last print did not stick to the bed. Help me fix it.'),\n      ]\n\n      return initQueryHints.map((hint) => ({\n        message: hint,\n        onClick: () => this.onUserQueryQuickButton(hint),\n      }))\n    },\n    showCommonPrintingPrompts() {\n      this.pushQuickButtons([...this.initUserQueryHintButtons(), this.cannedActions.cancel])\n    },\n    async showPresetOptions(presetType) {\n      const presets = (await getAgentActionResponse('get_presets'))[`${presetType}Presets`] || []\n      const options = presets.map((preset) => ({\n        message: preset.name,\n        onClick: async () => {\n          await getAgentActionResponse(`select_preset`, {\n            type: presetType,\n            name: preset.name,\n          })\n          await this.refreshSelectedPresets(false)\n          this.populateQuickButtons()\n        },\n      }))\n      this.messages.push({\n        role: 'assistant',\n        content: this.$i18next.t('Select a {presetType}. If the {presetType} is not listed, use the \"Add {presetType}\" button to add it first.', {\n          presetType\n        }),\n      })\n      this.pushQuickButtons([\n        ...options,\n        this.cannedActions[`add${presetType.charAt(0).toUpperCase() + presetType.slice(1)}s`],\n        this.cannedActions.cancel,\n      ])\n    },\n    showMoreOptions() {\n      const additionalActions = [\n        this.cannedActions.changePrinter,\n        this.cannedActions.changeFilament,\n        this.cannedActions.addPrinters,\n        this.cannedActions.addFilaments,\n        this.cannedActions.startOver,\n      ]\n      this.removeQuickButtons([this.cannedActions.moreOptions])\n\n      const topActions = this.quickButtons\n      // Filter out actions that are already present in topActions\n      const newActions = additionalActions.filter(\n        (newAction) => !topActions.some((existing) => existing.message === newAction.message)\n      )\n\n      if (newActions.length > 0) {\n        this.popQuickButtons()\n        this.pushQuickButtons([...topActions, ...newActions])\n      }\n    },\n    populateQuickButtons() {\n      const quickButtons = []\n      if (this.shouldShowSliceWithCurrentSettingsQuickButton) {\n        quickButtons.push(this.cannedActions.sliceWithCurrentSettings)\n        quickButtons.push(this.cannedActions.startOver)\n        quickButtons.push(this.cannedActions.moreOptions)\n        this.setQuickButtons(quickButtons)\n        return\n      }\n\n      if (this.shouldShowPlateAnalysisQuickButton) {\n        quickButtons.push(this.cannedActions.analyseModel)\n      }\n\n      if (this.hasModelObjects) {\n        quickButtons.push(this.cannedActions.commonPrintingPrompts)\n      }\n\n      if (this.shouldShowStartOverQuickButton) {\n        quickButtons.push(this.cannedActions.startOver)\n      }\n\n      quickButtons.push(this.cannedActions.moreOptions)\n      this.setQuickButtons(quickButtons)\n    },\n    populateQuickButtonsOnError() {\n      this.setQuickButtons([this.cannedActions.startOver])\n    },\n  },\n}\n","import pluralize from 'pluralize'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  computed: {\n    cannedMessages() {\n      return {\n        greeting: {\n          role: 'assistant',\n          content: this.$i18next.t(\"🤖 Hi, I'm JusBot, your 3D printing AI assistant.\"),\n        },\n        needToAddPrinters: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any printers yet. You need to add at least one printer before you can use JusPrin.\"\n          ),\n        },\n        needToAddFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any filaments yet. You need to add at least one filament before you can use JusPrin.\"\n          ),\n        },\n        noModelObjects: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you don't have any models on your plate.\\n\\nAdd some models to see the magic. 😀\"\n          ),\n        },\n        noSupportForMultiplePlatesOrFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            'I notice your model uses multiple plates or filaments.\\n\\nJusPrin is still in beta and does not support multiple plates or filaments yet.\\n\\nPlease manually slice your model. Also stay tuned for our product update.'\n          ),\n        },\n        currentPresetSelections: (printerName, filamentName, isFirstTime = false) => ({\n          role: 'assistant',\n          content: `${isFirstTime ? this.$i18next.t('You are currently using:') : this.$i18next.t('You have switched to:')}\\n- ${this.$i18next.t('Printer:')} **${printerName}**\\n- ${this.$i18next.t('Filament:')} **${filamentName}**`,\n        }),\n        currentModelObjects: (modelObjectCount) => ({\n          role: 'assistant',\n          content:\n            modelObjectCount === 1\n              ? this.$i18next.t('You have {num} model on your plate.', {\n                  num: modelObjectCount,\n                })\n              : this.$i18next.t('You have {num} models on your plate.', {\n                  num: modelObjectCount,\n                }),\n        }),\n        newModelObjects: (newModelObjects) => {\n          let content = ''\n          if (newModelObjects.length === 1) {\n            content = this.$i18next.t('I see \"{modelName}\" added to your plate.', {\n              modelName: newModelObjects[0].name\n            })\n          } else if (newModelObjects.length > 1) {\n            content = (newModelObjects.length - 1) === 1 ? this.$i18next.t('I see \"{modelName}\" and {num} other model added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n              : this.$i18next.t('I see \"{modelName}\" and {num} other models added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n          }\n          return {\n            role: 'assistant',\n            content,\n          }\n        },\n        generalError: {\n          role: 'assistant',\n          content: this.$i18next.t('Sorry, there was an error processing your request.'),\n        },\n      }\n    },\n  },\n}\n","export default {\n  methods: {\n    fixFilamentParamOverrides(param_overrides) {\n      // FIXME: No idea how these temps are used in Orca. But for most printers this hack seems to be good enough.\n\n      // Filament params now have an array of values but apply_config still expects a single value\n      Object.keys(param_overrides).forEach((key) => {\n        if (Array.isArray(param_overrides[key]) && param_overrides[key].length > 0) {\n          param_overrides[key] = param_overrides[key][0]; // Unpack to the first value\n        }\n      });\n\n      const plateTemps = [\n        'cool_plate_temp',\n        'eng_plate_temp',\n        'hot_plate_temp',\n        'textured_cool_plate_temp',\n        'textured_plate_temp',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTemp = plateTemps.find((key) => key in param_overrides)\n\n      if (existingTemp) {\n        const tempValue = param_overrides[existingTemp]\n        // Set the same temperature for all plate types\n        plateTemps.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      const plateTempsInitialLayer = [\n        'cool_plate_temp_initial_layer',\n        'eng_plate_temp_initial_layer',\n        'hot_plate_temp_initial_layer',\n        'textured_cool_plate_temp_initial_layer',\n        'textured_plate_temp_initial_layer',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTempInitialLayer = plateTempsInitialLayer.find((key) => key in param_overrides)\n\n      if (existingTempInitialLayer) {\n        const tempValue = param_overrides[existingTempInitialLayer]\n        // Set the same temperature for all plate types\n        plateTempsInitialLayer.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      return param_overrides\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{ref:\"container\",staticClass:\"gradient-fade-wrapper\",class:{ 'is-unfaded': _vm.isUnfaded },on:{\"click\":_vm.toggleFade}},[_vm._t(\"default\"),(_vm.hasFade && !_vm.isUnfaded)?_c('div',{staticClass:\"fade-overlay\"}):_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    ref=\"container\"\n    class=\"gradient-fade-wrapper\"\n    :class=\"{ 'is-unfaded': isUnfaded }\"\n    @click=\"toggleFade\"\n  >\n    <slot></slot>\n    <div v-if=\"hasFade && !isUnfaded\" class=\"fade-overlay\"></div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'GradientFadableContainer',\n  data() {\n    return {\n      isUnfaded: false,\n      hasFade: false,\n    }\n  },\n  mounted() {\n    this.checkIfNeedsFade()\n  },\n  updated() {\n    this.checkIfNeedsFade()\n  },\n  methods: {\n    toggleFade() {\n      this.isUnfaded = !this.isUnfaded\n\n      // Wait for transition to complete before rechecking\n      setTimeout(() => {\n        this.checkIfNeedsFade()\n      }, 300)\n    },\n    checkIfNeedsFade() {\n      this.$nextTick(() => {\n        const el = this.$refs.container\n        if (!this.isUnfaded) {\n          this.hasFade = el.scrollHeight > el.clientHeight\n        } else {\n          this.hasFade = false\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.gradient-fade-wrapper\n  position: relative\n  max-height: 8rem\n  overflow: hidden\n  transition: max-height 0.3s ease-out\n  cursor: pointer\n\n  &.is-unfaded\n    max-height: 1000px\n\n.fade-overlay\n  position: absolute\n  bottom: 0\n  left: 0\n  right: 0\n  height: 3rem\n  background: linear-gradient(transparent, var(--message-bg, white))\n  pointer-events: none\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GradientFadableContainer.vue?vue&type=template&id=411f3522&scoped=true&\"\nimport script from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GradientFadableContainer.vue?vue&type=style&index=0&id=411f3522&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"411f3522\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"chat-header\"},[_c('div',{staticClass:\"header-left\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.chatPanelPopUpOnErrors),expression:\"chatPanelPopUpOnErrors\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"dont-show-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.chatPanelPopUpOnErrors)?_vm._i(_vm.chatPanelPopUpOnErrors,null)>-1:(_vm.chatPanelPopUpOnErrors)},on:{\"change\":function($event){var $$a=_vm.chatPanelPopUpOnErrors,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.chatPanelPopUpOnErrors=$$a.concat([$$v]))}else{$$i>-1&&(_vm.chatPanelPopUpOnErrors=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.chatPanelPopUpOnErrors=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"dont-show-checkbox\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Pop up on errors\"))+\" \")])])]),(_vm.creditsInfo && _vm.isEnt)?_c('div',{staticClass:\"credit-display\",class:_vm.creditStatusClass,attrs:{\"title\":_vm.creditTooltipText},on:{\"click\":function($event){return _vm.$emit('show-upgrade-modal')}}},[(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('i',{staticClass:\"mdi mdi-crown credit-icon\"}):_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credits\"}}),(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited Account'))+\" \")]):_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.remainingCredits)+\"/\"+_vm._s(_vm.creditsInfo.ai_credit_free_monthly_quota)+\" \")])]):_vm._e(),_c('div',{staticClass:\"header-actions\"},[_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Contact Support')},on:{\"click\":_vm.handleSupportButtonClick}},[_c('i',{staticClass:\"mdi mdi-message-question-outline large-icon\"})]),_c('div',{staticClass:\"header-divider\"},[_vm._v(\"|\")]),(_vm.curChatPanelViewMode !== 'large')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Large Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('large', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-expand large-icon\"})]):_vm._e(),(_vm.curChatPanelViewMode !== 'small')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Small Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('small', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-collapse large-icon\"})]):_vm._e(),_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Close')},on:{\"click\":function($event){return _vm.changeChatPanelVisibility(false)}}},[_c('i',{staticClass:\"mdi mdi-close large-icon\"})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"chat-header\">\n    <div class=\"header-left\">\n      <div class=\"custom-control custom-checkbox\">\n        <input\n          id=\"dont-show-checkbox\"\n          v-model=\"chatPanelPopUpOnErrors\"\n          class=\"custom-control-input\"\n          type=\"checkbox\"\n        />\n        <label class=\"custom-control-label\" for=\"dont-show-checkbox\"> {{ $t(\"Pop up on errors\") }} </label>\n      </div>\n    </div>\n\n    <!-- Credit Display -->\n    <div\n      v-if=\"creditsInfo && isEnt\"\n      class=\"credit-display\"\n      :class=\"creditStatusClass\"\n      @click=\"$emit('show-upgrade-modal')\"\n      :title=\"creditTooltipText\"\n    >\n      <i v-if=\"creditsInfo.ai_credit_free_monthly_quota === -1\" class=\"mdi mdi-crown credit-icon\"></i>\n      <img v-else src=\"/static/img/jusprin-credit.png\" alt=\"Credits\" class=\"credit-icon\" />\n      <span class=\"credit-text\" v-if=\"creditsInfo.ai_credit_free_monthly_quota === -1\">\n        {{ $t('Unlimited Account') }}\n      </span>\n      <span class=\"credit-text\" v-else>\n        {{ remainingCredits }}/{{ creditsInfo.ai_credit_free_monthly_quota }}\n      </span>\n    </div>\n\n    <div class=\"header-actions\">\n      <button\n        class=\"header-button\"\n        :title=\"$t('Contact Support')\"\n        @click=\"handleSupportButtonClick\"\n      >\n        <i class=\"mdi mdi-message-question-outline large-icon\"></i>\n      </button>\n\n      <div class=\"header-divider\">|</div>\n      <button\n        v-if=\"curChatPanelViewMode !== 'large'\"\n        class=\"header-button\"\n        :title=\"$t('Large Chat Window')\"\n        @click=\"changeChatPanelViewMode('large', true)\"\n      >\n        <i class=\"mdi mdi-arrow-expand large-icon\"></i>\n      </button>\n\n      <button\n        v-if=\"curChatPanelViewMode !== 'small'\"\n        class=\"header-button\"\n        :title=\"$t('Small Chat Window')\"\n        @click=\"changeChatPanelViewMode('small', true)\"\n      >\n        <i class=\"mdi mdi-arrow-collapse large-icon\"></i>\n      </button>\n\n      <button class=\"header-button\" :title=\"$t('Close')\" @click=\"changeChatPanelVisibility(false)\">\n        <i class=\"mdi mdi-close large-icon\"></i>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getAgentActionResponse, callAgentAction } from '../lib/agentAction'\nimport { settings } from '@src/lib/page-context'\n\nexport default {\n  name: 'ChatPanelHeader',\n  props: {\n    shouldPopupChatPanel: {\n      type: Boolean,\n      default: true,\n    },\n    creditsInfo: {\n      type: Object,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      curChatPanelViewMode: 'large',\n      preferredChatPanelViewModeValue:\n        localStorage.getItem('jusprin.preferredChatPanelViewMode') || 'large',\n      curChatPanelVisible: false,\n      popupChatPanelTimeout: null,\n      notificationBadgeCount: {\n        green_badge: 0,\n        orange_badge: 0,\n        red_badge: 0,\n      },\n      chatPanelPopUpOnErrorsValue:\n        localStorage.getItem('jusprin.chatPanelPopUpOnErrors') !== 'false',\n      isEnt: false,\n    }\n  },\n  computed: {\n    chatPanelPopUpOnErrors: {\n      get() {\n        return this.chatPanelPopUpOnErrorsValue\n      },\n      set(newValue) {\n        this.chatPanelPopUpOnErrorsValue = newValue\n        localStorage.setItem('jusprin.chatPanelPopUpOnErrors', newValue.toString())\n      },\n    },\n    preferredChatPanelViewMode: {\n      get() {\n        return this.preferredChatPanelViewModeValue\n      },\n      set(newViewMode) {\n        this.preferredChatPanelViewModeValue = newViewMode\n        localStorage.setItem('jusprin.preferredChatPanelViewMode', newViewMode)\n      },\n    },\n    remainingCredits() {\n      if (!this.creditsInfo || this.creditsInfo.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.creditsInfo || this.creditsInfo.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.creditsInfo.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    creditTooltipText() {\n      if (this.creditsInfo.ai_credit_free_monthly_quota === -1) {\n        return this.$i18next.t('Unlimited AI credits')\n      }\n\n      return this.$i18next.t('You are on a free plan, which has limited AI credits. Click to see upgrade options.')\n    },\n  },\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n  },\n\n  async mounted() {\n    const devMode = new URLSearchParams(window.location.search).get('devmode') === 'true'\n    await this.changeChatPanelViewMode(this.preferredChatPanelViewMode, false)\n    await this.changeChatPanelVisibility(devMode) // If dev mode, show the chat panel so that we can debug it\n  },\n\n  methods: {\n    async popupChatPanelIfNecessary(level) {\n      if (this.curChatPanelVisible) return // Don't popup if the panel is already open\n\n      if (!this.chatPanelPopUpOnErrors) {\n        if (level === 'error') {\n          this.notificationBadgeCount.red_badge += 1\n        } else if (level === 'warning') {\n          this.notificationBadgeCount.orange_badge += 1\n        } else {\n          this.notificationBadgeCount.green_badge += 1\n        }\n        callAgentAction('set_btn_notification_badges', this.notificationBadgeCount)\n        return\n      }\n      await this.changeChatPanelViewMode('small', false)\n      await this.changeChatPanelVisibility(true)\n    },\n    async changeChatPanelViewMode(newViewMode, savePreferredViewMode = false) {\n      const { view_mode } = await getAgentActionResponse('change_chatpanel_display', {\n        view_mode: newViewMode,\n      })\n\n      this.curChatPanelViewMode = view_mode\n      if (savePreferredViewMode) {\n        this.preferredChatPanelViewMode = view_mode\n      }\n    },\n    async changeChatPanelVisibility(newVisible) {\n      const { visible } = await getAgentActionResponse('change_chatpanel_display', {\n        visible: newVisible,\n      })\n      this.curChatPanelVisible = visible\n    },\n    async processChatPanelFocusEvent(event) {\n      if (!event?.data?.focusEventType) return\n\n      const { focusEventType } = event.data\n      if (focusEventType === 'in_focus') {\n        await this.changeChatPanelViewMode(this.preferredChatPanelViewMode, false)\n        await this.changeChatPanelVisibility(true)\n\n        this.notificationBadgeCount = {\n          green_badge: 0,\n          orange_badge: 0,\n          red_badge: 0,\n        }\n        callAgentAction('set_btn_notification_badges', this.notificationBadgeCount)\n      } else if (focusEventType === 'out_of_focus') {\n        this.changeChatPanelVisibility(false)\n      }\n    },\n    handleSupportButtonClick() {\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        // Free user - show Discord message\n        this.$emit('show-discord-support-message')\n      } else {\n        // Paid user - show contact form\n        this.$emit('show-contact-support-form')\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.chat-header\n  display: flex\n  justify-content: space-between\n  align-items: center\n  padding: 2px 16px\n  background-color: var(--color-primary)\n  color: white\n  position: sticky\n  top: 0\n  z-index: 10\n\n.header-left\n  display: flex\n  align-items: center\n\n.header-actions\n  display: flex\n  align-items: center\n  gap: 8px\n\n.header-button\n  background: none\n  border: none\n  color: white\n  padding: 4px\n  cursor: pointer\n  display: flex\n  align-items: center\n  justify-content: center\n  &:hover\n    opacity: 0.8\n\n.header-divider\n  color: rgba(255, 255, 255, 0.5)\n  margin: 0 8px\n\n.custom-control-input\n  cursor: pointer\n\n.custom-control-label\n  cursor: pointer\n  font-size: 14px\n\n.credit-display\n  display: flex\n  align-items: center\n  gap: 6px\n  padding: 4px 8px\n  border-radius: var(--border-radius-sm)\n  cursor: pointer\n  transition: opacity 0.2s\n  font-size: 14px\n  font-weight: 500\n\n  &:hover\n    opacity: 0.8\n\n  .credit-icon\n    width: 16px\n    height: 16px\n\n    &.mdi-crown\n      font-size: 1.25rem\n      display: inline-flex\n      align-items: center\n      color: gold\n\n  .credit-text\n    color: white\n\n  &.credit-success\n    background-color: var(--color-success)\n\n  &.credit-warning\n    background-color: var(--color-warning)\n\n  &.credit-exhausted\n    background-color: var(--color-danger)\n  margin-bottom: 0\n\n.custom-control-label::before\n  border-color: white !important\n  border-width: 1px\n  border-style: solid\n\n.custom-control-input:checked ~ .custom-control-label::before\n  border-color: white !important\n  border-width: 1px\n  border-style: solid\n\n.large-icon\n  font-size: 24px\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatPanelHeader.vue?vue&type=template&id=33cffac1&scoped=true&\"\nimport script from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatPanelHeader.vue?vue&type=style&index=0&id=33cffac1&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"33cffac1\",\n  null\n  \n)\n\nexport default component.exports","export default {\n  data() {\n    return {\n      processedNotifications: new Set(),\n    }\n  },\n  methods: {\n    processNotificationPushedEvent(event) {\n      if (!event.data?.text) return\n\n      const { level, text } = event.data\n      const notificationKey = `${level}:${text}`\n\n      if (this.processedNotifications.has(notificationKey)) return\n\n      this.processedNotifications.add(notificationKey)\n\n      if (!['error', 'warning'].includes(level)) {\n        return\n      }\n\n      if (this.slicingProgress) {\n        this.slicingProgress.errors.push(text)\n        return\n      }\n\n      this.messages.push({\n        role: 'assistant',\n        content: '', // jusprinNotification message is constructed from jusprinNotification field\n        jusprinNotification: {\n          level,\n          text,\n        },\n      })\n\n      this.pushQuickButtons([this.cannedActions.tellMeWhatNotificationMeans, this.cannedActions.acknowledgeError])\n      this.$refs.chatHeader.popupChatPanelIfNecessary(level)\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"contact-support-form\"},[_c('p',[_vm._v(_vm._s(_vm.$t(\"Would you like to send a support request?\")))]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.supportMessage),expression:\"supportMessage\"}],staticClass:\"form-control mb-3\",attrs:{\"rows\":\"4\",\"placeholder\":_vm.$t('Describe your issue here...')},domProps:{\"value\":(_vm.supportMessage)},on:{\"input\":function($event){if($event.target.composing)return;_vm.supportMessage=$event.target.value}}}),_c('div',{staticClass:\"d-flex justify-content-between\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.sendSupportRequest}},[_c('i',{staticClass:\"mdi mdi-message-question-outline mr-1\"}),_vm._v(\" \"+_vm._s(_vm.isSubmitting ? _vm.$t('Sending...') : _vm.$t('Ask for tech support'))+\" \")]),_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.cancelSupportRequest}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Nah, I'm good\"))+\" \")])]),(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-3\"},[_vm._v(\" \"+_vm._s(_vm.error)+\" \")]):_vm._e()])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"message assistant\">\n    <div class=\"message-block\">\n      <div class=\"message-content\">\n        <div class=\"contact-support-form\">\n          <p>{{ $t(\"Would you like to send a support request?\") }}</p>\n          <textarea\n            v-model=\"supportMessage\"\n            class=\"form-control mb-3\"\n            rows=\"4\"\n            :placeholder=\"$t('Describe your issue here...')\"\n          ></textarea>\n          <div class=\"d-flex justify-content-between\">\n            <button class=\"btn btn-primary\" @click=\"sendSupportRequest\" :disabled=\"isSubmitting\">\n              <i class=\"mdi mdi-message-question-outline mr-1\"></i>\n              {{ isSubmitting ? $t('Sending...') : $t('Ask for tech support') }}\n            </button>\n            <button\n              class=\"btn btn-secondary\"\n              @click=\"cancelSupportRequest\"\n              :disabled=\"isSubmitting\"\n            >\n              {{ $t(\"Nah, I'm good\") }}\n            </button>\n          </div>\n          <div v-if=\"error\" class=\"alert alert-danger mt-3\">\n            {{ error }}\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'ContactSupportForm',\n  props: {\n    messages: {\n      type: Array,\n      required: true,\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      supportMessage: '',\n      isSubmitting: false,\n      error: null,\n    }\n  },\n  computed: {\n    lastUserMessage() {\n      // Find the last user message in the messages array using higher-order function\n      const lastUserMsg = [...this.messages].reverse().find((message) => message.role === 'user')\n\n      return lastUserMsg ? lastUserMsg.content : ''\n    },\n  },\n  created() {\n    // Pre-fill with the last user message\n    this.supportMessage = this.lastUserMessage\n  },\n  methods: {\n    async sendSupportRequest() {\n      if (!this.supportMessage.trim()) {\n        this.error = this.$t('Please enter a message before submitting.')\n        return\n      }\n\n      this.isSubmitting = true\n      this.error = null\n\n      try {\n        await api.post(urls.jusprinContactSupport(), this.oauthAccessToken, {\n          message: this.supportMessage,\n        })\n\n        this.$emit('form-dismissed', {\n          message:\n            this.$t('Your support request has been sent. Our team will get back to you as soon as possible.'),\n        })\n      } catch (error) {\n        console.error('Failed to send support request:', error)\n        this.error = this.$t('Failed to send your support request. Please try again later.')\n        this.isSubmitting = false\n      }\n    },\n    cancelSupportRequest() {\n      this.$emit('form-dismissed', {\n        message: this.$t(\"No problem! Let me know if there's anything else I can help you with.\"),\n      })\n    },\n  },\n}\n</script>\n\n<style scoped>\n.contact-support-form {\n  width: 100%;\n}\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContactSupportForm.vue?vue&type=template&id=d1933d3e&scoped=true&\"\nimport script from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nexport * from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ContactSupportForm.vue?vue&type=style&index=0&id=d1933d3e&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"d1933d3e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.show)?_c('div',{staticClass:\"upgrade-modal-backdrop\",on:{\"click\":_vm.closeModal}},[_c('div',{staticClass:\"upgrade-modal surface\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"close-button icon-btn\",on:{\"click\":_vm.closeModal}},[_c('i',{staticClass:\"mdi mdi-close\"})]),_c('h2',{staticClass:\"modal-title\"},[_vm._v(_vm._s(_vm.$t(\"Your JusPrin Account\")))]),(!_vm.loading && !_vm.isUnlimitedPlan && _vm.remainingCredits <= 0)?_c('div',{staticClass:\"credit-exhausted-banner\"},[_c('i',{staticClass:\"mdi mdi-alert-circle\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"You have run out of AI credits!\")))])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"text-center\"},[_c('i',{staticClass:\"mdi mdi-loading mdi-spin\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Loading...\"))+\" \")]):_c('div',[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-details\"},[(_vm.userInfo.first_name || _vm.userInfo.last_name)?_c('h3',{staticClass:\"user-name\"},[_vm._v(_vm._s(_vm.userDisplayName))]):_vm._e(),_c('div',{staticClass:\"user-email\"},[_vm._v(_vm._s(_vm.userInfo.email))])]),_c('span',{staticClass:\"plan-badge\",class:{ 'pro-badge': _vm.isUnlimitedPlan }},[_vm._v(\" \"+_vm._s(_vm.isUnlimitedPlan ? _vm.$t('Unlimited') : _vm.$t('FREE Plan'))+\" \")])]),(_vm.isUnlimitedPlan)?[_c('div',{staticClass:\"body-section text-center\"},[_vm._m(0),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Yay! You are on the Unlimited Plan!'))+\" \")]),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\",\"margin-bottom\":\"3rem\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Enjoy unlimited AI credits!'))+\" \")]),_c('button',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.showPricingPlan}},[_vm._v(\" \"+_vm._s(_vm.$t('Manage Subscription Plan'))+\" \")])])]:[_c('div',{staticClass:\"body-section\"},[_c('div',{staticClass:\"ai-credits-header\"},[_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"JusPrin Credit Icon\"}}),_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"AI Credits\")))])]),_c('div',{staticClass:\"progress-bar-container\"},[_c('div',{staticClass:\"progress-bar\",class:_vm.creditStatusClass,style:({ width: `${_vm.progressPercentage}%` })})]),_c('div',{staticClass:\"progress-info\"},[_c('span',{staticClass:\"usage-text\"},[_vm._v(\" You've used \"+_vm._s(_vm.credits.ai_credit_used_current_month)+\" AI credits of \"+_vm._s(_vm.isUnlimitedPlan ? 'unlimited' : _vm.credits.ai_credit_free_monthly_quota)+\" this month \")]),_c('span',{staticClass:\"reset-date\"},[_vm._v(_vm._s(_vm.$t(\"Reset on {resetDate}\", { resetDate: _vm.nextMonthResetDate })))])])]),_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\"))+\" \"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\"))+\" \")]),_c('muted-alert',{staticClass:\"mt-2 feature-notice\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI credit limit is reset at the beginning of each month.\"))+\" \")]),_c('div',{staticClass:\"body-section\"},[_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"Get More AI Credits\")))]),_c('div',{staticClass:\"section-description\"},[_vm._v(_vm._s(_vm.$t(\"If you are running short on AI credits, there are two ways to get more.\")))]),_c('div',{staticClass:\"upgrade-option\"},[_c('div',{staticClass:\"upgrade-details\"},[_c('div',{staticClass:\"upgrade-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Upgrade to Unlimited Plan\"))+\" \"),(_vm.userInfo.has_active_subscription)?_c('span',{staticClass:\"discount\"},[_vm._v(_vm._s(_vm.$t(\"30% OFF\")))]):_vm._e()]),_c('div',{staticClass:\"text-primary small\"},[_vm._v(_vm._s(_vm.$t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\")))])]),_c('button',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.showPricingPlan}},[_vm._v(\" \"+_vm._s(_vm.$t('Upgrade'))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Alternatively, you can host your own JusPrin server and get unlimited AI credits using your own OpenAI API key.'))+\" \")])])]],2)])]):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"celebration\",staticStyle:{\"font-size\":\"2.5rem\",\"margin\":\"1.5rem 0\"}},[_vm._v(\" 🎉 \"),_c('i',{staticClass:\"mdi mdi-crown\",staticStyle:{\"color\":\"gold\",\"font-size\":\"2.5rem\"}}),_vm._v(\" 🎉 \")])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"show\" class=\"upgrade-modal-backdrop\" @click=\"closeModal\">\n    <div class=\"upgrade-modal surface\" @click.stop>\n      <button class=\"close-button icon-btn\" @click=\"closeModal\">\n        <i class=\"mdi mdi-close\"></i>\n      </button>\n\n      <h2 class=\"modal-title\">{{ $t(\"Your JusPrin Account\") }}</h2>\n\n      <!-- Red banner for zero credits -->\n      <div v-if=\"!loading && !isUnlimitedPlan && remainingCredits <= 0\" class=\"credit-exhausted-banner\">\n        <i class=\"mdi mdi-alert-circle\"></i>\n        <span>{{ $t(\"You have run out of AI credits!\") }}</span>\n      </div>\n\n      <div v-if=\"loading\" class=\"text-center\">\n        <i class=\"mdi mdi-loading mdi-spin\"></i> {{ $t(\"Loading...\") }}\n      </div>\n\n      <div v-else>\n        <div class=\"user-info\">\n          <div class=\"user-details\">\n            <h3 v-if=\"userInfo.first_name || userInfo.last_name\" class=\"user-name\">{{ userDisplayName }}</h3>\n            <div class=\"user-email\">{{ userInfo.email }}</div>\n          </div>\n          <span class=\"plan-badge\" :class=\"{ 'pro-badge': isUnlimitedPlan }\">\n            {{ isUnlimitedPlan ? $t('Unlimited') : $t('FREE Plan') }}\n          </span>\n        </div>\n\n        <template v-if=\"isUnlimitedPlan\">\n          <div class=\"body-section text-center\">\n            <div class=\"celebration\" style=\"font-size: 2.5rem; margin: 1.5rem 0;\">\n              🎉 <i class=\"mdi mdi-crown\" style=\"color: gold; font-size: 2.5rem;\"></i> 🎉\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold;\">\n              {{ $t('Yay! You are on the Unlimited Plan!') }}\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold; margin-bottom: 3rem;\">\n              {{ $t('Enjoy unlimited AI credits!') }}\n            </div>\n            <button\n              type=\"button\"\n              class=\"btn btn-primary upgrade-button\"\n              @click=\"showPricingPlan\"\n            >\n              {{ $t('Manage Subscription Plan') }}\n            </button>\n          </div>\n        </template>\n        <template v-else>\n          <div class=\"body-section\">\n            <div class=\"ai-credits-header\">\n              <img src=\"/static/img/jusprin-credit.png\" alt=\"JusPrin Credit Icon\" class=\"credit-icon\" />\n              <h4 class=\"modal-section-title\">{{ $t(\"AI Credits\") }}</h4>\n            </div>\n            <div class=\"progress-bar-container\">\n              <div class=\"progress-bar\" :class=\"creditStatusClass\" :style=\"{ width: `${progressPercentage}%` }\"></div>\n            </div>\n            <div class=\"progress-info\">\n              <span class=\"usage-text\">\n                You've used {{ credits.ai_credit_used_current_month }} AI credits of {{ isUnlimitedPlan ? 'unlimited' : credits.ai_credit_free_monthly_quota }} this month\n              </span>\n              <span class=\"reset-date\">{{ $t(\"Reset on {resetDate}\", { resetDate: nextMonthResetDate }) }}</span>\n            </div>\n          </div>\n\n          <div class=\"text-muted small\">\n           {{ $t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\") }}\n           <br>\n           {{ $t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\") }}\n          </div>\n\n          <muted-alert class=\"mt-2 feature-notice\">\n            {{ $t(\"AI credit limit is reset at the beginning of each month.\") }}\n          </muted-alert>\n\n          <div class=\"body-section\">\n            <h4 class=\"modal-section-title\">{{ $t(\"Get More AI Credits\") }}</h4>\n            <div class=\"section-description\">{{ $t(\"If you are running short on AI credits, there are two ways to get more.\") }}</div>\n            <div class=\"upgrade-option\">\n              <div class=\"upgrade-details\">\n                <div class=\"upgrade-title\">\n                  {{ $t(\"Upgrade to Unlimited Plan\") }}\n                  <span v-if=\"userInfo.has_active_subscription\" class=\"discount\">{{ $t(\"30% OFF\") }}</span>\n                </div>\n                <div class=\"text-primary small\">{{ $t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\") }}</div>\n              </div>\n              <button\n                type=\"button\"\n                class=\"btn btn-primary upgrade-button\"\n                @click=\"showPricingPlan\"\n              >\n                {{ $t('Upgrade') }}\n              </button>\n            </div>\n            <div class=\"mt-4\">\n              {{ $t('Alternatively, you can host your own JusPrin server and get unlimited AI credits using your own OpenAI API key.') }}\n            </div>\n          </div>\n        </template>\n\n        <div class=\"body-section\" v-else>\n          <h4 class=\"modal-section-title\">{{ $t(\"Your Active Subscription\") }}</h4>\n          <div class=\"subscription-info\">\n            <div class=\"subscription-details\">\n              <div class=\"subscription-plan\">\n                <i class=\"mdi mdi-crown\"></i>\n                {{ $t(\"You have an active {plan} subscription\", { plan: userInfo.subscription_plan || 'Pro' }) }}\n              </div>\n              <div class=\"text-muted small\">{{ $t(\"Your subscription gives you access to enhanced features and higher AI credit limits.\") }}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\nimport { callAgentAction } from '../lib/agentAction'\n\nexport default {\n  name: 'UpgradeModal',\n  components: {\n    MutedAlert,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: false\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null\n    }\n  },\n  data() {\n    return {\n      loading: false,\n      userInfo: null,\n      credits: null,\n      error: null\n    }\n  },\n  computed: {\n    progressPercentage() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota === -1) return 100\n      if (this.credits.ai_credit_free_monthly_quota === 0) return 0\n      return Math.min(100, (this.credits.ai_credit_used_current_month / this.credits.ai_credit_free_monthly_quota) * 100)\n    },\n    isUnlimitedPlan() {\n      return this.credits?.ai_credit_free_monthly_quota === -1\n    },\n    remainingCredits() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.credits.ai_credit_free_monthly_quota - (this.credits.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.credits.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    userDisplayName() {\n      if (!this.userInfo) return ''\n      return `${this.userInfo.first_name || ''} ${this.userInfo.last_name || ''}`.trim()\n    },\n    nextMonthResetDate() {\n      const now = new Date()\n      const nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1)\n      return nextMonth.toLocaleDateString('en-US', {\n        month: 'short',\n        day: 'numeric'\n      })\n    }\n  },\n  watch: {\n    show(newValue) {\n      if (newValue) {\n        this.fetchAICreditsData()\n      }\n    }\n  },\n  mounted() {\n    if (this.show) {\n      this.fetchAICreditsData()\n    }\n  },\n  methods: {\n    async fetchAICreditsData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      this.loading = true\n      this.error = null\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      if (response.data) {\n        this.userInfo = response.data.user\n        this.credits = response.data.ai_credits\n      }\n      this.loading = false\n    },\n    closeModal() {\n      this.$emit('close')\n    },\n    showPricingPlan() {\n      callAgentAction('show_pricing_plan')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../../../styles/theme';\n@import '../../../../styles/mixin';\n\n// Upgrade Modal Styles\n.upgrade-modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: var(--color-overlay);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 1050;\n}\n\n.upgrade-modal {\n  background-color: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  padding: 2rem;\n  max-width: 500px;\n  width: 90%;\n  max-height: 90vh;\n  overflow-y: auto;\n  position: relative;\n  box-shadow: var(--shadow-top-nav);\n\n  @include respond-below(md) {\n    padding: 1.5rem;\n    margin: 0 1rem;\n    width: calc(100% - 2rem);\n  }\n\n  .close-button {\n    position: absolute;\n    top: 1rem;\n    right: 1rem;\n    width: 2rem;\n    height: 2rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 1.5rem;\n\n    &:hover, &:focus {\n      background-color: var(--color-hover) !important;\n      color: var(--color-text-primary) !important;\n    }\n  }\n\n  .modal-title {\n    color: var(--color-text-primary);\n    font-size: 1.5rem;\n    font-weight: 600;\n    margin: 0 0 1.5rem 0;\n    text-align: center;\n\n    @include respond-below(md) {\n      font-size: 1.25rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  .user-info {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n\n    @media (max-width: 400px) {\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 1rem;\n      margin-bottom: 1.5rem;\n    }\n\n    .user-details {\n      .user-name {\n        color: var(--color-text-primary);\n        font-size: 1.25rem;\n        font-weight: 600;\n        margin: 0 0 0.25rem 0;\n\n        @include respond-below(md) {\n          font-size: 1.125rem;\n        }\n      }\n\n      .user-email {\n        color: var(--color-text-secondary);\n        font-size: 0.875rem;\n        text-decoration: underline;\n      }\n    }\n\n    .plan-badge {\n      color: var(--color-text-primary);\n      padding: 0.25rem 0.75rem;\n      border-radius: var(--border-radius-sm);\n      border: 1px dashed var(--color-divider);\n      font-size: 0.75rem;\n      font-weight: 600;\n      text-transform: uppercase;\n\n      &.pro-badge {\n        color: var(--color-primary);\n        border: 1px dashed var(--color-primary);\n      }\n    }\n  }\n\n  .body-section {\n    margin-bottom: 1rem;\n\n    @include respond-below(md) {\n      margin-bottom: 1.5rem;\n    }\n\n    .ai-credits-header {\n      display: flex;\n      align-items: baseline;\n      gap: 0.5rem;\n      margin-bottom: 1rem;\n\n      .credit-icon {\n        width: 1.5rem;\n        height: 1.5rem;\n        flex-shrink: 0;\n      }\n    }\n\n    .progress-bar-container {\n      width: 100%;\n      height: 8px;\n      background-color: var(--color-surface-primary);\n      border-radius: var(--border-radius-xs);\n      overflow: hidden;\n      border: 1px solid var(--color-divider-muted);\n\n      .progress-bar {\n        height: 100%;\n        background-color: var(--color-primary);\n        border-radius: var(--border-radius-xs);\n        transition: width 0.3s ease;\n\n        &.credit-success {\n          background-color: var(--color-success);\n        }\n\n        &.credit-warning {\n          background-color: var(--color-warning);\n        }\n\n        &.credit-exhausted {\n          background-color: var(--color-danger);\n        }\n      }\n    }\n\n    .progress-info {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-top: 0.5rem;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 0.25rem;\n      }\n\n      .usage-text {\n        color: var(--color-text-primary);\n        font-size: 0.875rem;\n        font-weight: 500;\n        flex: 1;\n        min-width: 0;\n      }\n\n      .reset-date {\n        color: var(--color-text-secondary);\n        font-size: 0.75rem;\n        font-weight: 400;\n        flex-shrink: 0;\n        white-space: nowrap;\n      }\n    }\n\n    .modal-section-title {\n      color: var(--color-text-primary);\n      font-size: 1.5rem;\n      font-weight: 600;\n      margin-bottom: 0.5rem;\n      margin-top: 2rem;\n      text-decoration: none;\n    }\n\n    .section-description {\n      color: var(--color-text-secondary);\n      font-size: 0.875rem;\n      margin-bottom: 1rem;\n    }\n\n    .upgrade-option {\n      border: 1px solid var(--color-divider);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: stretch;\n        gap: 1rem;\n        padding: 0.875rem;\n      }\n\n      .upgrade-details {\n        flex: 1;\n        min-width: 0;\n\n        @media (min-width: 401px) {\n          min-width: 200px;\n        }\n\n        .upgrade-title {\n          color: var(--color-text-primary);\n          font-size: 1.2rem;\n          font-weight: 500;\n          margin-bottom: 0.25rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          .discount {\n            background-color: var(--color-primary);\n            color: var(--color-on-primary);\n            padding: 0.125rem 0.5rem;\n            border-radius: var(--border-radius-lg);\n            font-size: 0.75rem;\n            font-weight: 600;\n          }\n        }\n      }\n\n      .upgrade-button {\n        padding: 0.75rem 2rem;\n        font-size: 0.875rem;\n        font-weight: 600;\n        white-space: nowrap;\n        flex-shrink: 0;\n\n        @media (max-width: 400px) {\n          width: 100%;\n          white-space: normal;\n        }\n\n        &:hover {\n          background-color: var(--color-primary-hover);\n        }\n      }\n    }\n\n    .subscription-info {\n      border: 1px solid var(--color-primary);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      background-color: var(--color-surface-primary);\n\n      .subscription-details {\n        .subscription-plan {\n          color: var(--color-primary);\n          font-size: 1.1rem;\n          font-weight: 600;\n          margin-bottom: 0.5rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          i {\n            color: var(--color-primary);\n          }\n        }\n      }\n    }\n  }\n\n  .credit-exhausted-banner {\n    background-color: var(--color-danger);\n    color: white;\n    padding: 1rem;\n    border-radius: var(--border-radius-md);\n    margin-bottom: 1.5rem;\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n    font-weight: 700;\n    font-size: 1rem;\n    text-align: center;\n    justify-content: center;\n    border: 2px solid var(--color-danger);\n    animation: pulse-danger 2s ease-in-out infinite;\n\n    i {\n      font-size: 1.25rem;\n      flex-shrink: 0;\n    }\n\n    span {\n      font-weight: 700;\n    }\n\n    @media (max-width: 400px) {\n      font-size: 0.875rem;\n      padding: 0.875rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  @keyframes pulse-danger {\n    0%, 100% {\n      box-shadow: 0 0 0 0 rgba(var(--color-danger-rgb, 220, 53, 69), 0.4);\n    }\n    50% {\n      box-shadow: 0 0 0 8px rgba(var(--color-danger-rgb, 220, 53, 69), 0);\n    }\n  }\n}\n</style>","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UpgradeModal.vue?vue&type=template&id=429c0503&scoped=true&\"\nimport script from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nexport * from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UpgradeModal.vue?vue&type=style&index=0&id=429c0503&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"429c0503\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <chat-panel-header\n      ref=\"chatHeader\"\n      @action=\"callAgentAction\"\n      :should-popup-chat-panel=\"Boolean(oauthAccessToken)\"\n      @show-contact-support-form=\"showContactSupportForm\"\n      @show-discord-support-message=\"showDiscordSupportMessage\"\n      @show-upgrade-modal=\"openUpgradeModal\"\n      :credits-info=\"creditsInfo\"\n    />\n\n    <!-- Upgrade Modal -->\n    <upgrade-modal\n      :show=\"showUpgradeModal\"\n      :oauth-access-token=\"oauthAccessToken\"\n      @close=\"closeUpgradeModal\"\n    />\n\n\n\n    <div v-if=\"oauthAccessToken\" class=\"chat-container mt-3\">\n      <div ref=\"chatMessageContainer\" class=\"chat-messages\" @scroll=\"handleChatScroll\">\n        <div\n          v-for=\"(message, index) in messages\"\n          :key=\"index\"\n          class=\"message\"\n          :class=\"message.role\"\n        >\n          <div v-if=\"message.content\" class=\"message-block\">\n            <div class=\"message-content\">\n              <div v-if=\"message.has_upgrade_link\" class=\"upgrade-message\">\n                <div>{{ $t('Since you are on a Free plan, please join our Discord server to seek support from the community.') }}</div>\n                <div>\n                  <i18next :translation=\"$t('You can also {localizedDom} to get email support from the Obico team.')\">\n                    <template #localizedDom>\n                      <a href=\"#\" @click.prevent=\"openUpgradeModal\" class=\"upgrade-link\">{{ $t('upgrade to the Unlimited plan') }}</a>\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <VueMarkdown v-else>{{ message.content }}</VueMarkdown>\n              <gradient-fadable-container\n                v-if=\"\n                  message.per_override_explanations && message.per_override_explanations.length > 0\n                \"\n              >\n                <div class=\"pt-2 pb-1\">{{ $t(\"Detailed explanations:\") }}</div>\n                <div v-for=\"(explanation, index) in message.per_override_explanations\" :key=\"index\">\n                  <div>\n                    <b>{{ explanation.parameter }}:</b> {{ explanation.explanation }}\n                  </div>\n                </div>\n              </gradient-fadable-container>\n            </div>\n          </div>\n          <div\n            v-if=\"message.slicing_profiles && slicingSettingsInMessage(message)\"\n            class=\"message-block mt-2\"\n          >\n            <div class=\"message-content\">\n              <gradient-fadable-container>\n                <div class=\"pt-2 pb-1\">{{ $t(\"I have applied the following settings:\") }}</div>\n                <div v-if=\"message.slicing_profiles.use_print_process_preset\">\n                  {{ $t(\"- Process preset:\") }} <b>{{ message.slicing_profiles.use_print_process_preset }}</b>\n                </div>\n                <div>\n                  {{ $t(\"- Additional slicing parameters:\") }}\n                  <b v-if=\"Object.keys(changedParams(message)).length === 0\">{{ $t(\"None\") }}</b>\n                  <div v-for=\"(value, key) in changedParams(message)\" :key=\"key\">\n                    &nbsp;&nbsp;&nbsp;&nbsp;- {{ key }}:\n                    <span class=\"font-weight-bold\">{{ value }}</span>\n                  </div>\n                </div>\n              </gradient-fadable-container>\n              <div v-if=\"index !== messages.length - 1\" class=\"quick-button pt-2\">\n                <quick-button-component\n                  :message=\"$t('Re-apply settings')\"\n                  @click=\"applySettingsInMessage(message)\"\n                />\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.suggested_printing_method\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"I suggest the following to achieve the best results:\") }}</div>\n              <VueMarkdown>{{ message.suggested_printing_method }}</VueMarkdown>\n            </div>\n          </div>\n          <div v-if=\"message.jusprinNotification\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"Oh no! My slicing algorithm lord just said:\") }}</div>\n              <div class=\"notification-text\" :class=\"message.jusprinNotification.level\">\n                <i\n                  :class=\"\n                    message.jusprinNotification.level === 'error'\n                      ? 'mdi mdi-alert-circle'\n                      : 'mdi mdi-alert'\n                  \"\n                ></i>\n                {{ message.jusprinNotification.text }}\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.discord_support\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"discord-support-container\">\n                <div class=\"discord-info\">\n                  <div class=\"discord-url\">\n                    <strong>Discord Server:</strong>\n                    <code>{{ message.discord_support.url }}</code>\n                  </div>\n                  <div class=\"discord-instructions\">\n                    {{ $t(\"Scan this QR code with your phone to join our Discord server:\") }}\n                  </div>\n                </div>\n                <div class=\"qr-code-container\">\n                  <img\n                    :src=\"message.discord_support.qr_code_url\"\n                    alt=\"Discord QR Code\"\n                    class=\"qr-code\"\n                    @error=\"handleQRCodeError\"\n                  />\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"thinking\" class=\"message assistant\">\n          <div class=\"message-block align-items-center\">\n            <div class=\"message-content thinking-animation\">\n              <VueMarkdown>_{{ $t(\"Thinking...\") }}_</VueMarkdown>\n            </div>\n          </div>\n        </div>\n        <contact-support-form\n          v-if=\"showContactSupport\"\n          :messages=\"messages\"\n          :oauth-access-token=\"oauthAccessToken\"\n          @form-dismissed=\"handleContactSupportFormDismissed\"\n        />\n        <div v-if=\"slicingProgress\" class=\"message assistant\">\n          <div\n            class=\"message-block slicing-message-block\"\n            :class=\"{ 'fade-out': slicingProgress.fadeOut }\"\n          >\n            <div class=\"message-content\">\n              <p>\n                {{\n                  slicingProgress.overrun\n                    ? $t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.')\n                    : slicingProgress.text || $t('Slicing in progress...')\n                }}\n              </p>\n              <div class=\"slicing-progress-container\">\n                <div\n                  class=\"slicing-progress-bar\"\n                  :style=\"{ width: `${slicingProgress?.percentage * 100}%` }\"\n                ></div>\n                <div class=\"slicing-progress-text\">\n                  {{ Math.round(slicingProgress?.percentage * 100) }}%\n                </div>\n              </div>\n              <div\n                v-if=\"slicingProgress.errors && slicingProgress.errors.length > 0\"\n                class=\"slicing-errors\"\n              >\n                <div\n                  v-for=\"(error, index) in slicingProgress.errors\"\n                  :key=\"index\"\n                  class=\"error-message\"\n                >\n                  {{ error }}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"quickButtons.length > 0\" class=\"quick-button pt-2\">\n          <quick-button-component\n            v-for=\"(action, index) in quickButtons\"\n            :key=\"index\"\n            :message=\"action.message\"\n            @click=\"action.onClick\"\n          />\n        </div>\n      </div>\n      <button v-show=\"showScrollButton\" class=\"scroll-to-bottom\" @click=\"scrollToBottom\">\n        <i class=\"mdi mdi-arrow-down large-icon\"></i>\n      </button>\n\n      <div class=\"chat-input\">\n        <textarea\n          ref=\"chatTextarea\"\n          rows=\"1\"\n          v-model=\"userInput\"\n          type=\"text\"\n          :disabled=\"!readyForUserQuery\"\n          :placeholder=\"\n            readyForUserQuery\n              ? $t('Type your message here...')\n              : $t('Select printer, filament, and add models first')\n          \"\n          @keydown.enter.prevent=\"handleEnterKey\"\n        />\n        <button class=\"send-button\" :disabled=\"!readyForUserQuery\" @click=\"onUserInput\">\n          <i class=\"mdi mdi-arrow-up send-icon\"></i>\n        </button>\n      </div>\n    </div>\n    <div v-else>\n      <div class=\"login-container\">\n        <div>\n          <button\n            id=\"signUpSignInBtn\"\n            class=\"btn btn-primary\"\n            @click=\"() => callAgentAction('show_login')\"\n          >\n            {{ $t(\"Sign Up/Sign In to Get Started\") }}\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport VueMarkdown from 'vue-markdown'\nimport urls from '@config/server-urls'\nimport QuickButtonComponent from './components/QuickButtonComponent.vue'\nimport api from './lib/api'\nimport QuickButtonsMixin from './mixins/quickButtonsMixin'\nimport MessagesMixin from './mixins/messagesMixin'\nimport SlicingParamFixerMixin from './mixins/slicingParamFixerMixin'\nimport GradientFadableContainer from './components/GradientFadableContainer.vue'\nimport ChatPanelHeader from './components/ChatPanelHeader.vue'\nimport userNotificationMixin from './mixins/userNotificationMixin'\nimport { callAgentAction, getAgentActionResponse, setAgentActionRetVal } from './lib/agentAction'\nimport ContactSupportForm from './components/ContactSupportForm'\nimport UpgradeModal from './components/UpgradeModal'\n\nexport default {\n  name: 'EmbeddedChatPage',\n  components: {\n    VueMarkdown,\n    QuickButtonComponent,\n    GradientFadableContainer,\n    ChatPanelHeader,\n    ContactSupportForm,\n    UpgradeModal,\n  },\n  mixins: [QuickButtonsMixin, MessagesMixin, SlicingParamFixerMixin, userNotificationMixin],\n  data() {\n    return {\n      oauthAccessToken: null,\n      currentChatId: null,\n      userInput: '',\n      thinking: false,\n      messages: [],\n      modelObjects: [],\n      supportedActions: [],\n      autoOrientInProgress: false,\n      isDevMode: false,\n      haveDonePlateAnalysis: false,\n      showScrollButton: false,\n      slicingProgress: null,\n      slicingProgressCompletionTimeout: null,\n      current_workflow: null,\n      showUpgradeModal: false,\n      creditsInfo: null, // Will be populated from API responses\n      userInfo: null, // Will be populated from /jusprin/api/me/\n    }\n  },\n  computed: {\n    readyForUserQuery() {\n      if (this.slicingProgress || this.thinking) {\n        return false\n      }\n      return true\n    },\n    readyToSlice() {\n      return this.messages.some(\n        (message) => message.role === 'assistant' && this.slicingSettingsInMessage(message)\n      )\n    },\n    hasModelObjects() {\n      return this.modelObjects.length > 0\n    },\n    showContactSupport() {\n      // Check if any message has a contact_support agent action using higher-order function\n      return this.messages.some(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some((action) => action.name === 'contact_support')\n      )\n    },\n  },\n  watch: {\n    messages: 'onChatContentChanged',\n    quickButtons: 'onChatContentChanged',\n    userInput() {\n      this.$nextTick(() => {\n        this.adjustTextareaHeight()\n      })\n    },\n    oauthAccessToken(newValue, oldValue) {\n      // When token becomes available (changes from null to non-null), fetch user data\n      if (newValue && !oldValue) {\n        this.fetchUserData()\n      }\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    this.isDevMode = urlParams.get('devmode') === 'true'\n  },\n  mounted() {\n    this.initMessagesAndQuickButtons()\n  },\n  methods: {\n    callAgentAction,\n    setAgentActionRetVal, // For JusPrin CallEmbeddedChatMethod\n    async fetchUserData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      this.userInfo = response.data.user\n      this.creditsInfo = response.data.ai_credits\n    },\n    async withCreditCheck(apiCall) {\n      // Check if balance is 0 before making the call\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        const remainingCredits = Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n        if (remainingCredits <= 0) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n      }\n\n      try {\n        const result = await apiCall()\n\n        // Refresh user data after successful call\n        await this.fetchUserData()\n\n        return result\n      } catch (error) {\n        // Catch 402 errors and show UpgradeModal\n        if (error.response && error.response.status === 402) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n\n        // Let all other errors bubble up to Sentry\n        throw error\n      }\n    },\n    async callLongRunningAgentActionThenRefreshPresets(action, payload = null) {\n      await getAgentActionResponse(action, payload, 1000 * 60 * 60 * 24) // Make timeout super long as it's hard to know how long it takes user to finish things like adding a printer\n      this.refreshSelectedPresets(false)\n      this.populateQuickButtons()\n    },\n    processAgentEvent(event) {\n      if (event.type === 'modelObjectsChanged') {\n        this.processModelObjectsChangedEvent(event)\n      } else if (event.type === 'autoOrient') {\n        this.processAutoOrientEvent(event)\n      } else if (event.type === 'nativeErrorOccurred') {\n        this.processNativeErrorOccurredEvent(event)\n      } else if (event.type === 'notificationPushed') {\n        this.processNotificationPushedEvent(event)\n      } else if (event.type === 'chatPanelFocus') {\n        this.$refs.chatHeader.processChatPanelFocusEvent(event)\n      } else if (event.type === 'slicingProgress') {\n        this.processSlicingProgressEvent(event)\n      }\n    },\n\n    editedPreset(presetType, editedPresets = {}) {\n      return editedPresets[\n        `edited${presetType.charAt(0).toUpperCase() + presetType.slice(1)}Preset`\n      ]\n    },\n\n    overridesFromEditedPreset(presetType, editedPresets = {}) {\n      const editedPreset = this.editedPreset(presetType, editedPresets)\n      const { config, dirty_options } = editedPreset\n\n      if (!dirty_options || dirty_options.length === 0) {\n        return {}\n      }\n\n      const overrides = {}\n      dirty_options.forEach((option) => {\n        if (Object.prototype.hasOwnProperty.call(config, option)) {\n          overrides[option] = config[option]\n        }\n      })\n\n      return overrides\n    },\n\n    selectedPreset(presetType, presets) {\n      return presets[`${presetType}Presets`]?.find((preset) => preset.is_selected) || null\n    },\n\n    slicingSettingsInMessage(message) {\n      return (\n        message.slicing_profiles?.use_print_process_preset ||\n        message.slicing_profiles?.filament_overrides ||\n        message.slicing_profiles?.print_process_overrides\n      )\n    },\n\n    async onUserQueryQuickButton(msg) {\n      this.messages.push({ role: 'user', content: msg })\n      await this.sendUserQuery()\n    },\n\n    async onUserInput() {\n      if (this.userInput.trim()) {\n        this.clearQuickButtons()\n        this.messages.push({ role: 'user', content: this.userInput })\n        this.userInput = ''\n        // Reset textarea height to one line after clearing input\n        const textarea = this.$refs.chatTextarea\n        if (textarea) {\n          textarea.style.height = 'auto'\n        }\n        await this.sendUserQuery()\n      }\n    },\n    startOver() {\n      if (this.slicingProgressCompletionTimeout) {\n        clearTimeout(this.slicingProgressCompletionTimeout)\n        this.slicingProgressCompletionTimeout = null\n      }\n      this.slicingProgress = null\n      this.processedNotifications = new Set()\n      this.current_workflow = null\n      this.initMessagesAndQuickButtons()\n    },\n\n    async sendUserQuery() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      try {\n        const presets = await getAgentActionResponse('get_presets')\n        const editedPresets = await getAgentActionResponse('get_edited_presets')\n        const currentProject = await getAgentActionResponse('get_current_project')\n        const plates = currentProject.plates\n        if (!this.userQueryPreconditionsMet(presets, editedPresets, plates)) {\n          this.thinking = false\n          return\n        }\n\n        // TODO: It's an important assumption that selected preset should be the same as edited preset\n        // Remove this check once it's in production for a while with no messages captured in sentry\n        for (const preset_type of ['filament', 'printProcess', 'printer']) {\n          if (\n            this.editedPreset(preset_type, editedPresets)?.name !==\n            this.selectedPreset(preset_type, presets)?.name\n          ) {\n            window.Sentry?.captureMessage(\n              `Selected preset ${preset_type} is not the same as edited preset ${\n                this.editedPreset(preset_type, editedPresets)?.name\n              }`\n            )\n          }\n        }\n\n        const currentChatId = await this.getCurrentChatId()\n        const response = await this.withCreditCheck(async () => {\n          return api.post(urls.jusprinChatMessages(), this.oauthAccessToken, {\n            messages: this.messages,\n            current_workflow: this.current_workflow,\n            slicing_profiles: {\n              filament_presets: [this.selectedPreset('filament', presets)],\n              print_process_presets: presets.printProcessPresets,\n              filament_overrides: this.overridesFromEditedPreset('filament', editedPresets),\n              print_process_overrides: this.overridesFromEditedPreset('printProcess', editedPresets),\n            },\n            plates: plates,\n            chat_id: currentChatId,\n          })\n        })\n        this.thinking = false\n\n        this.processChatResponse(response.data, presets)\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.thinking = false\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n      }\n    },\n\n    async getCurrentChatId() {\n      if (!this.currentChatId) {\n        const chatsApiUrl = urls.jusprinChats(this.currentChatId)\n        const newChatResponse = await api['post'](chatsApiUrl, this.oauthAccessToken, {\n          messages: JSON.stringify(this.messages),\n        })\n        this.currentChatId = newChatResponse?.data?.id // Assign the new chat ID\n      }\n      return this.currentChatId\n    },\n\n    async processChatResponse(responseData, presets) {\n      const message = responseData.message\n      this.messages.push(message)\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n        machine_name: this.selectedPreset('printer', presets)?.name,\n        filament_name: this.selectedPreset('filament', presets)?.name,\n        print_process_name: this.selectedPreset('printProcess', presets)?.name,\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (this.slicingSettingsInMessage(message)) {\n        this.applySettingsInMessage(message)\n      }\n\n      if (message.agent_actions?.length) {\n        await this.processAgentActions(message)\n      } else {\n        this.populateQuickButtons() // If there are no agent actions, we can populate default quick buttons\n      }\n    },\n\n    async populateDatabaseWithChat(payload = null) {\n      const currentChatId = await this.getCurrentChatId()\n      const chatsApiUrl = urls.jusprinChats(currentChatId)\n      const chatsApiVerb = currentChatId ? 'put' : 'post'\n      await api[chatsApiVerb](chatsApiUrl, this.oauthAccessToken, payload)\n    },\n\n    async processAgentActions(message) {\n      if (!message.agent_actions?.length) return\n      this.clearQuickButtons()\n\n      for (const action of message.agent_actions) {\n        if (action.name === 'slice_model') {\n          await this.doSliceWithCurrentSettings()\n        } else if (action.name === 'start_chat_over') {\n          await this.startOver()\n        } else if (action.name === 'add_printers') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n        } else if (action.name === 'add_filaments') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n        } else if (action.name === 'change_printer') {\n          await this.showPresetOptions('printer')\n        } else if (action.name === 'change_filament') {\n          await this.showPresetOptions('filament')\n        } else if (action.name === 'contact_support') {\n          this.scrollToBottom()\n        } else if (action.name === 'auto_orient_all_models') {\n          await this.autoOrientAllObjects()\n        } else if (action.name === 'auto_arrange_all_models') {\n          await this.autoArrangeAllObjects()\n        } else if (action.name === 'ask_user_to_choose_from_options') {\n          this.showOptionsAsQuickButtons(action.arguments)\n        }\n      }\n    },\n\n    async applySettingsInMessage(message) {\n      if (!this.slicingSettingsInMessage(message)) {\n        // If LLM didn't select a preset, it didn't know how to process the query. Nothing should be assumed in this case.\n        return\n      }\n\n      this.clearQuickButtons()\n\n      try {\n        if (message.slicing_profiles.use_print_process_preset) {\n          await getAgentActionResponse('select_preset', {\n            type: 'print',\n            name: message.slicing_profiles.use_print_process_preset,\n          })\n        }\n\n        let filamentOverrides = message.slicing_profiles?.filament_overrides || {}\n        filamentOverrides = this.fixFilamentParamOverrides(filamentOverrides)\n\n        let param_overrides = [\n          ...this.paramOverridesToApplyConfigPayload(filamentOverrides, 'filament'),\n          ...this.paramOverridesToApplyConfigPayload(\n            message.slicing_profiles?.print_process_overrides || {},\n            'print'\n          ),\n        ]\n\n        if (param_overrides.length > 0) {\n          await getAgentActionResponse('apply_config', param_overrides)\n        }\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return\n      }\n    },\n    async doSliceWithCurrentSettings() {\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      const hasModels = plates.some((plate) => plate.model_objects?.length > 0)\n      if (!hasModels) {\n        this.messages.push(this.cannedMessages.noModelObjects)\n        this.setQuickButtons([this.cannedActions.startOver, this.cannedActions.moreOptions])\n        return\n      }\n\n      if (!this.readyToSlice) {\n        const presets = await getAgentActionResponse('get_presets')\n        this.messages.push({\n          role: 'assistant',\n          content: `${this.$t(\"I have not set any slicing parameters for you. Do you want me to slice your model with these?\")}\\n${this.$t(\"- Filament:\")} **${\n            this.selectedPreset('filament', presets)?.name\n          }**\\n${this.$t(\"- Process preset:\")} **${this.selectedPreset('printProcess', presets)?.name}**`,\n        })\n\n        this.pushQuickButtons([\n          {\n            message: this.$t('Yes'),\n            onClick: () => this.doSlice(),\n          },\n          {\n            message: this.$t('No'),\n            onClick: () => this.popQuickButtons(),\n          },\n        ])\n        return\n      } else {\n        this.doSlice()\n      }\n    },\n    async doSlice() {\n      this.clearQuickButtons()\n      this.slicingProgress = { percentage: 0, errors: [] }\n      callAgentAction('start_slicer_all')\n\n      setTimeout(() => {\n        if (this.slicingProgress && this.slicingProgress.percentage < 1.0 - 1e-6) {\n          this.slicingProgress.overrun = true\n          this.setQuickButtons([this.cannedActions.startOver])\n        }\n      }, 1000 * 60 * 2)\n    },\n    async autoOrientAllObjects() {\n      let agentActionName = 'auto_orient_all_objects'\n\n      // TODO: Remove this once 0.4 is no longer supported\n      if (this.supportedActions.includes('auto_orient_object')) {\n        agentActionName = 'auto_orient_object'\n      }\n\n      callAgentAction(agentActionName, {})\n      this.autoOrientInProgress = true\n      this.populateQuickButtons()\n    },\n    async autoArrangeAllObjects() {\n      setTimeout(() => {\n        callAgentAction('arrange_all_objects', {})\n        this.autoArrangeInProgress = true\n      }, 100)\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Models auto-arranged.'),\n      })\n      this.populateQuickButtons()\n      this.setQuickButtons([this.cannedActions.undoAutoArrange, ...this.quickButtons])\n    },\n    changedParams(message) {\n      return {\n        ...(message.slicing_profiles?.filament_overrides ?? {}),\n        ...(message.slicing_profiles?.print_process_overrides ?? {}),\n      }\n    },\n    initMessagesAndQuickButtons() {\n      this.currentChatId = null\n\n      // Reset messages and quick actions\n      this.messages = [this.cannedMessages.greeting]\n      setTimeout(async () => {\n        await this.refreshSelectedPresets(true)\n        await this.refreshModelObjects()\n        this.populateQuickButtons()\n      }, 10)\n    },\n\n    async refreshModelObjects() {\n      const project = await getAgentActionResponse('get_current_project')\n      this.modelObjects = this.distinctModelObjectsInProject(project)\n      if (this.modelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.currentModelObjects(this.modelObjects.length))\n      } else {\n        this.messages.push(this.cannedMessages.noModelObjects)\n      }\n    },\n    async refreshSelectedPresets(isFirstTime = false) {\n      const presets = await getAgentActionResponse('get_presets')\n      this.messages.push(\n        this.cannedMessages.currentPresetSelections(\n          this.selectedPreset('printer', presets)?.name,\n          this.selectedPreset('filament', presets)?.name,\n          isFirstTime\n        )\n      )\n    },\n    fixBrokenMarkdown(text) {\n      // Markdown returned from LLM may be broken.\n      const formattedText = text.replace(/ (\\d\\.) /g, '\\n$1 ')\n      return formattedText\n    },\n    scrollToBottom() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      if (chatMessageContainer) {\n        chatMessageContainer.scrollTop = chatMessageContainer.scrollHeight\n      }\n    },\n    onChatContentChanged() {\n      this.$nextTick(() => {\n        this.scrollToBottom()\n      })\n    },\n    paramOverridesToApplyConfigPayload(params, type) {\n      const param_overrides = []\n      for (const [key, value] of Object.entries(params)) {\n        param_overrides.push({ type, key, value })\n      }\n      return param_overrides\n    },\n    userQueryPreconditionsMet(presets, editedPresets, plates) {\n      if (\n        (presets?.printerPresets && presets.printerPresets?.length < 1) ||\n        presets.printerPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddPrinters)\n        this.setQuickButtons([this.cannedActions.addPrinters])\n        return false\n      } else if (\n        (presets?.filamentPresets && presets.filamentPresets?.length < 1) ||\n        presets.filamentPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddFilaments)\n        this.setQuickButtons([this.cannedActions.addFilaments])\n        return false\n      }\n      return true\n    },\n\n    modelObjectsWithOverhang(modelObjects) {\n      return modelObjects.filter((obj) => (obj.features?.overhang ?? 0) > 0.001)\n    },\n\n    distinctModelObjectsInProject(project) {\n      return project.plates\n        .flatMap((plate) => plate.model_objects)\n        .reduce((unique, obj) => {\n          const exists = unique.find((item) => item.id === obj.id)\n          return exists ? unique : [...unique, obj]\n        }, [])\n    },\n\n    processModelObjectsChangedEvent(event) {\n      const currentProject = event.data\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      const newModelObjects = currentModelObjects.filter(\n        (obj) => !this.modelObjects.some((item) => item.id === obj.id)\n      )\n      this.modelObjects = currentModelObjects\n      if (newModelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.newModelObjects(newModelObjects))\n        this.$refs.chatHeader.popupChatPanelIfNecessary()\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          this.messages.push({\n            role: 'assistant',\n            content:\n              this.$t('I notice some of your models have overhangs. I can try to auto-orient them to minimize the need for supports.'),\n          })\n        }\n        const quickButtons = [this.cannedActions.autoOrient, this.cannedActions.enableSupport]\n        if (this.shouldShowPlateAnalysisQuickButton) {\n          quickButtons.push(this.cannedActions.analyseModel)\n        }\n        this.setQuickButtons([\n          ...quickButtons,\n          this.cannedActions.commonPrintingPrompts,\n          this.cannedActions.moreOptions,\n        ])\n        return\n      }\n\n      this.populateQuickButtons()\n    },\n    processAutoOrientEvent(event) {\n      const currentProject = event.data?.currentProject\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      this.modelObjects = currentModelObjects\n\n      if (!this.autoOrientInProgress) {\n        return\n      }\n\n      this.autoOrientInProgress = false\n      if (event.data?.status === 'completed') {\n        let msg = this.$t('Models auto-oriented.')\n        let quickButtons = [this.cannedActions.undoAutoOrient]\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          msg +=\n            ` ${this.$t('However, some models still have overhangs. I recommend enabling support to make sure they can be printed successfully.')}`\n          quickButtons.push(this.cannedActions.enableSupport)\n        }\n\n        this.messages.push({\n          role: 'assistant',\n          content: msg,\n        })\n        this.removeQuickButtons([\n          this.cannedActions.autoOrient,\n          this.cannedActions.enableSupport,\n          this.cannedActions.undoAutoOrient,\n        ])\n        this.setQuickButtons([...quickButtons, ...this.quickButtons])\n      }\n    },\n    processNativeErrorOccurredEvent(event) {\n      window.Sentry?.captureMessage(event.data?.errorMessage, 'error')\n    },\n    processSlicingProgressEvent(event) {\n      if (!this.slicingProgress) {\n        return\n      }\n\n      const percentage = event.data?.percentage\n      if (percentage !== undefined) {\n        this.slicingProgress.percentage = percentage\n        this.slicingProgress.text = event.data?.text\n      }\n\n      if (percentage && percentage < 1.0 - 1e-6) {\n        return\n      }\n\n      if (this.slicingProgress.fadeOut) {\n        return\n      }\n\n      // Add fade-out class first\n      this.slicingProgress.fadeOut = true\n\n      // Remove the progress bar after fade out animation completes\n      this.slicingProgressCompletionTimeout = setTimeout(() => {\n        this.slicingProgressCompletionTimeout = null\n        const progress = this.slicingProgress\n        if (!progress) {\n          return\n        }\n\n        const quickButtons = [this.cannedActions.startOver, this.cannedActions.moreOptions]\n\n        if (progress.errors && progress.errors.length > 0) {\n          this.messages.push({\n            role: 'assistant',\n            content: `${this.$t(\"My slicing algorithm lord just said:\")}\\n *\"${progress.errors.join(\n              '\\n'\n            )}\"*`,\n          })\n          quickButtons.unshift(this.cannedActions.tellMeWhatNotificationMeans)\n        } else {\n          if (this.supportedActions.includes('switch_to_preview')) {\n            quickButtons.unshift(this.cannedActions.switchToPreview)\n          }\n          quickButtons.unshift(this.cannedActions.exportGCode)\n        }\n\n        this.setQuickButtons(quickButtons)\n\n        this.slicingProgress = null\n      }, 2000) // Match the transition duration in CSS\n    },\n\n    async callPlateAnalysis() {\n      const project = await getAgentActionResponse('get_current_project')\n      const plates = project.plates\n      const images = await this.renderPlateForAnalysis()\n      const currentChatId = await this.getCurrentChatId()\n\n      const payload = {\n        images: images,\n        plates: plates,\n        chat_id: currentChatId,\n      }\n\n      const response = await this.withCreditCheck(async () => {\n        return api.post(\n          urls.jusprinPlateAnalysisProcess(),\n          this.oauthAccessToken,\n          payload\n        )\n      })\n\n      // Handle credit response structure - if it's a credit message, restructure it for processAnalysisResponse\n      if (response.data && response.data.message && response.data.message.role === 'assistant') {\n        return { message: response.data.message }\n      }\n\n      return response.data\n    },\n\n    async renderPlateForAnalysis() {\n      // This function now only fetches and renders the plate images,\n      // then returns an array of base64 image strings.\n      const cameraPositionByDegrees = (target, xyPlaneAngle, zPlaneAngle) => {\n        const distanceFromTarget = 1000 // OrcaSlicer default\n        const xyPlaneAngleRadians = xyPlaneAngle * (Math.PI / 180)\n        const zPlaneAngleRadians = zPlaneAngle * (Math.PI / 180)\n        return {\n          x: target.x + distanceFromTarget * Math.sin(xyPlaneAngleRadians),\n          y: target.y - distanceFromTarget * Math.cos(xyPlaneAngleRadians),\n          z: target.z + distanceFromTarget * Math.sin(zPlaneAngleRadians),\n        }\n      }\n\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      if (plates.length === 0) {\n        return []\n      }\n\n      const { index, bounding_box, model_objects } = plates[0]\n      if (!model_objects || model_objects.length === 0) {\n        return []\n      }\n\n      const target = {\n        x: (bounding_box.max.x + bounding_box.min.x) / 2,\n        y: (bounding_box.max.y + bounding_box.min.y) / 2,\n        z: 0,\n      }\n\n      const views = [\n        { camera_position: cameraPositionByDegrees(target, 0, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -30, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -210, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, 0, -45), target: target },\n      ]\n\n      const renderResult = await getAgentActionResponse('render_plate', {\n        plate_index: index,\n        views: views,\n      })\n\n      // Build an array of all images from renderResult and return it.\n      const images = renderResult.filter((result) => result.base64).map((result) => result.base64)\n\n      return images\n    },\n\n    async getAnalysisResult() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      try {\n        const analysisResponse = await this.callPlateAnalysis()\n        await this.processAnalysisResponse(analysisResponse)\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.thinking = false\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n      }\n    },\n\n    async processAnalysisResponse(response) {\n      this.messages.push(response.message)\n      this.thinking = false\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (response.message.suggested_printing_method) {\n        this.pushQuickButtons([\n          this.cannedActions.plateAnalysisLooksGoodToMe,\n          this.cannedActions.plateAnalysisIsNotGood,\n          this.cannedActions.editPlateAnalysis,\n          this.cannedActions.moreOptions,\n        ])\n      } else {\n        this.populateQuickButtons()\n      }\n\n      return\n    },\n\n    ensurePlateAnalysisMessageExists() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      if (!lastMessage?.suggested_printing_method) {\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return false\n      }\n      return true\n    },\n\n    async queryWithSuggestedPrintingMethod() {\n      this.clearQuickButtons()\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const lastMessage = this.messages[this.messages.length - 1]\n      this.messages.push({\n        role: 'user',\n        content: `${this.$t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${lastMessage.suggested_printing_method}`,\n      })\n      this.sendUserQuery()\n    },\n\n    removePlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      this.messages.pop()\n      this.popQuickButtons()\n      this.populateQuickButtons()\n    },\n\n    editPlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const plateAnalysisMessage = this.messages.pop()\n      this.clearQuickButtons()\n      this.userInput = `${this.$t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${plateAnalysisMessage.suggested_printing_method}`\n    },\n\n    handleChatScroll() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      const atBottom =\n        chatMessageContainer.scrollHeight - chatMessageContainer.scrollTop <=\n        chatMessageContainer.clientHeight\n      this.showScrollButton = !atBottom\n    },\n    adjustTextareaHeight() {\n      const textarea = this.$refs.chatTextarea\n      const chatMessages = this.$refs.chatMessageContainer\n      if (!textarea || !chatMessages) return\n\n      // Reset height to auto to get correct scrollHeight\n      textarea.style.height = 'auto'\n      // Set new height based on scrollHeight, with max of 150px\n      const newHeight = Math.min(textarea.scrollHeight, 150)\n      textarea.style.height = newHeight + 'px'\n\n      // Update chat messages padding to match input height plus padding\n      const chatInput = textarea.closest('.chat-input')\n      if (chatInput) {\n        const inputTotalHeight = chatInput.offsetHeight\n        chatMessages.style.paddingBottom = `${inputTotalHeight + 8}px`\n      }\n    },\n    handleEnterKey(e) {\n      if (e.shiftKey || e.metaKey || e.ctrlKey || e.altKey) {\n        this.userInput += '\\n'\n        return\n      }\n      this.onUserInput()\n    },\n    handleContactSupportFormDismissed(data) {\n      // Find the index of the message with contact_support agent action\n      const supportMsgIndex = this.messages.findIndex(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some(action => action.name === 'contact_support')\n      )\n\n      // Remove the message if found\n      if (supportMsgIndex !== -1) {\n        this.messages.splice(supportMsgIndex, 1)\n      }\n\n      // Add new assistant message with the response\n      this.messages.push({\n        role: 'assistant',\n        content: data.message,\n      })\n\n      this.populateQuickButtons()\n      this.scrollToBottom()\n    },\n    showContactSupportForm() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: null,\n        agent_actions: [{ name: 'contact_support', arguments: {} }],\n      })\n      this.scrollToBottom()\n    },\n    showDiscordSupportMessage() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Since you are on a Free plan, please join our Discord server to seek support from the community. You can also upgrade to the Unlimited plan to get email support from the Obico team.'),\n        discord_support: {\n          url: 'https://discord.gg/Tx67dHNYH3',\n          qr_code_url: 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=https%3A%2F%2Fdiscord.gg%2FTx67dHNYH3'\n        },\n        has_upgrade_link: true\n      })\n      this.setQuickButtons([this.cannedActions.moreOptions])\n      this.scrollToBottom()\n    },\n\n    showOptionsAsQuickButtons(args) {\n      const options = args?.user_options_to_choose_from || []\n      if (!options || !Array.isArray(options)) return\n\n      const newQuickButtons = options.map((option) => ({\n        message: option,\n        onClick: () => this.onUserQueryQuickButton(option),\n      }))\n\n      // Remove any existing buttons with the same messages\n      this.removeQuickButtons(newQuickButtons)\n\n      // Add the new buttons to the existing ones\n      this.pushQuickButtons([...this.quickButtons, ...newQuickButtons])\n    },\n\n    // Modal methods\n    openUpgradeModal() {\n      this.showUpgradeModal = true\n    },\n    closeUpgradeModal() {\n      this.showUpgradeModal = false\n    },\n    handleQRCodeError(event) {\n      // Hide the QR code if it fails to load\n      event.target.style.display = 'none'\n      console.warn('Failed to load QR code for Discord support')\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n@import './styles/EmbeddedChatPage'\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EmbeddedChatPage.vue?vue&type=template&id=7ae7d3b0&scoped=true&\"\nimport script from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nexport * from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EmbeddedChatPage.vue?vue&type=style&index=0&id=7ae7d3b0&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7ae7d3b0\",\n  null\n  \n)\n\nexport default component.exports","import VueRouter from 'vue-router'\nimport prefRoutes from '@config/user-preferences/pref-routes'\n\nimport NewOctoPrintTunnelPage from '@src/views/NewOctoPrintTunnelPage.vue'\nimport OctoPrintTunnelPage from '@src/views/OctoPrintTunnelPage.vue'\nimport PrintShotFeedbackApp from '@src/views/PrintShotFeedbackApp.vue'\nimport PrintHistoryPage from '@src/views/PrintHistoryPage.vue'\nimport StatsPage from '@src/views/StatsPage.vue'\nimport PrintPage from '@src/views/PrintPage.vue'\nimport PrinterListPage from '@src/views/PrinterListPage.vue'\nimport SharedPrinterPage from '@src/views/SharedPrinterPage.vue'\nimport PrinterSettingsPage from '@src/views/PrinterSettingsPage.vue'\nimport PrinterLinkingPage from '@src/views/printer-wizard/PrinterLinkingPage.vue'\nimport TargetPlatformSelectionPage from '@src/views/printer-wizard/TargetPlatformSelectionPage.vue'\nimport ObicoInstallationGuidePage from '@src/views/printer-wizard/ObicoInstallationGuidePage.vue'\nimport AddPrinterSuccessPage from '@src/views/printer-wizard/AddPrinterSuccessPage.vue'\nimport PrinterControlPage from '@src/views/PrinterControlPage.vue'\nimport GCodeFoldersPage from '@src/views/GCodeFoldersPage.vue'\nimport GCodeFilePage from '@src/views/GCodeFilePage.vue'\nimport UserPreferencesPage from '@src/views/UserPreferencesPage.vue'\nimport PrinterEventsPage from '@src/views/PrinterEventsPage.vue'\nimport PrinterTerminalPage from '@src/views/PrinterTerminalPage.vue'\nimport FirstLayerInspectionImagePage from '@src/views/FirstLayerInspectionImagePage.vue'\nimport { EmbeddedChatV10Page, EmbeddedChatV12Page } from '@src/views/jusprin'\n\n\n  const routes = [\n    {\n      path: '/g_code_folders/cloud/:parentFolder/',\n      component: GCodeFoldersPage,\n    },\n    {\n      path: '/g_code_folders/local/:printerId/:parentFolder?/',\n      component: GCodeFoldersPage,\n    },\n    {\n      path: '/g_code_files/cloud/:fileId/',\n      component: GCodeFilePage,\n    },\n    {\n      path: '/g_code_files/local/:printerId/:fileId/',\n      component: GCodeFilePage,\n    },\n    {\n      path: '/user_preferences/',\n      component: UserPreferencesPage,\n    },\n    {\n      path: '/printers/wizard/',\n      component: TargetPlatformSelectionPage,\n    },\n    {\n      path: '/printers/wizard/guide/:targetPlatform/',\n      component: ObicoInstallationGuidePage,\n    },\n    {\n      path: '/printers/wizard/link/:targetPlatform/',\n      component: PrinterLinkingPage,\n    },\n    {\n      path: '/printers/wizard/success/:printerId/',\n      component: AddPrinterSuccessPage,\n    },\n    ...Object.values(prefRoutes).map((route) => ({\n      path: route,\n      component: UserPreferencesPage,\n    })),\n  ]\n\nconst components = {\n  NewOctoPrintTunnelPage,\n  OctoPrintTunnelPage,\n  PrintShotFeedbackApp,\n  PrinterListPage,\n  SharedPrinterPage,\n  PrinterSettingsPage,\n  PrinterLinkingPage,\n  PrinterControlPage,\n  GCodeFoldersPage,\n  GCodeFilePage,\n  PrintPage,\n  PrintHistoryPage,\n  StatsPage,\n  UserPreferencesPage,\n  PrinterEventsPage,\n  PrinterTerminalPage,\n  FirstLayerInspectionImagePage,\n  EmbeddedChatV10Page,\n  EmbeddedChatV12Page,\n}\n\nexport { routes, components }\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pricing\"},[_c('nav-bar',{attrs:{\"view-name\":\"pricing\"}}),(!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('h1',{staticClass:\"text-center mt-5\"},[_vm._v(_vm._s(_vm.$t('Obico Cloud Plans')))]),(_vm.couponCode && !_vm.hasSubscription)?_c('div',{staticClass:\"alert alert-info text-center\",attrs:{\"role\":\"status\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Referral code: {code}. Your discount will appear at checkout. Prices below exclude discounts.', { code: _vm.couponCode }))+\" \")]):_vm._e(),_c('div',{staticClass:\"text-center py-1\"},[_vm._v(\" \"+_vm._s(_vm.$t('Thinking about self-hosting Obico Server instead?'))+\" \"),_c('a',{attrs:{\"href\":\"https://obico.io/obico-cloud-vs-self-hosted.html\"}},[_vm._v(_vm._s(_vm.$t('Check out self-hosting vs Obico Cloud.')))])]),_c('div',{staticClass:\"container text-center py-4\",attrs:{\"id\":\"pricing-selections\"}},[_c('div',{staticClass:\"btn-group btn-group-toggle\"},[_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': _vm.isAnnual },attrs:{\"id\":\"sub-annual-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Annual,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Annual)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Annual}}}),_vm._v(\" \"+_vm._s(_vm.$t('Annual (SAVE 33%)'))+\" \")]),_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': !_vm.isAnnual },attrs:{\"id\":\"sub-monthly-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Monthly,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Monthly)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Monthly}}}),_vm._v(\" \"+_vm._s(_vm.$t('Monthly'))+\" \")])])]),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row price-matrix\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Free')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Print occasionally.')))]),_vm._m(0),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('Limited to 1 printer.')))])]),_c('div',{staticClass:\"price-action\"},[(!_vm.isAuthenticated)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Get Started')))]):_vm._e()]),_c('div',[_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"first-gen-ai-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('First-gen AI failure detection technology'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-free-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('10 free AI Detection Hours/month included'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"basic-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"basic-streaming-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Basic webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"tunneling-cap-per-month\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-free-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('300MB /mo tunnel data'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('G-Code cloud storage up to 50MB per file, 1GB total')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Notifications via Email, mobile push notification, Telegram, and more.'))+\" \")])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"3rd-party-app-integration-free-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('300MB /mo integration with your favorite 3rd-party mobile apps'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Community technical support')))])])])])]),_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(\"AI Premium\")]),_c('div',[_vm._v(_vm._s(_vm.$t('Print every day. 2+ printers.')))]),_c('div',{staticClass:\"plan-price\"},[_c('span',[_vm._v(_vm._s(_vm.$t('$')))]),_c('span',{attrs:{\"id\":\"monthly-price\"}},[_vm._v(_vm._s(_vm.priceTable.basePlanPrice))]),_c('span',{staticClass:\"price-unit\"},[_vm._v(\" / \"+_vm._s(_vm.$t('month')))]),(_vm.isAnnual)?_c('span',{staticStyle:{\"font-size\":\"0.95rem\",\"font-weight\":\"100\"},attrs:{\"id\":\"annual-bill\"}},[_vm._v(\" \"+_vm._s(_vm.$t('(Billed {name} annually)', { name: _vm.priceTable.totalPlanPrice })))]):_vm._e()]),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('1st printer included')))]),_c('div',{staticClass:\"price-sub\"},[_c('span',[_vm._v(_vm._s(_vm.$t('2+ printers at $')))]),_c('span',{attrs:{\"id\":\"addl-printer-price\"}},[_vm._v(_vm._s(_vm.priceTable.basePrinterPrice))]),_vm._v(\" / \"+_vm._s(_vm.$t('month / printer'))+\" \")]),_c('div',{staticClass:\"price-sub\"},[_c('a',{staticClass:\"price-calculator-trigger link\",on:{\"click\":_vm.calc}},[_vm._v(_vm._s(_vm.$t('Calculate cost'))+\" >>>\")])])]),_c('div',{staticClass:\"price-action\"},[(_vm.isAuthenticated)?_c('div',[(_vm.hasSubscription)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('View/Change Subscription')))]):_c('a',{directives:[{name:\"b-popover\",rawName:\"v-b-popover.hover\",value:({\n                  placement: 'top',\n                  content: _vm.$t('Full refund within 30 days if you are not happy.'),\n                }),expression:\"{\\n                  placement: 'top',\\n                  content: $t('Full refund within 30 days if you are not happy.'),\\n                }\",modifiers:{\"hover\":true}}],staticClass:\"btn btn-primary btn-block\",attrs:{\"id\":\"subscribe-pro\",\"role\":\"button\"},on:{\"click\":_vm.upgrade}},[_vm._v(_vm._s(_vm.$t('Upgrade (30-Day Money Back Guarantee)')))])]):_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":_vm.signupUrl}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial')))])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"next-gen-ai-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Next-gen AI failure detection technology'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-pro-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('50 free AI Detection Hours/month included'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"premium-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"premium-streaming-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Premium webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"unlimited-tunnling-for-pro\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-pro-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited tunnel data'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('G-Code cloud storage up to 500MB per file, 50GB total')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Notifications via Email, mobile push notification, Telegram, and more.'))+\" \")])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"3rd-party-app-integration-pro-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited integration with your favorite 3rd-party mobile apps'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Email technical support')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Printer feed sharing with premium streaming quality')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Failure alerts via SMS (text message)')))])])])])]),_c('div',{attrs:{\"id\":\"need-more\"}},[_c('h1',{staticClass:\"text-center mt-3\"},[_vm._v(_vm._s(_vm.$t('AI Detection Hour Packs')))]),_c('div',{staticClass:\"text-center\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Need more AI Detection Hours? Add the right amount of AI Detection Hours without burning a hole on your wallet.' ))+\" \")])]),_c('div',{staticClass:\"row price-matrix mt-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header dh-pack-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Pre-paid Pack')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Turn on AI failure detection only for the prints.')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Available to all plans.')))])]),_c('div',[_c('div',{staticClass:\"features dh-pack\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Pre-paid AI Detection Hours never expire.')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('One Time Purchase.')))])])])]),_c('div',[_c('div',{staticClass:\"form-group\"},_vm._l((Object.values(_vm.PrepaidDHPacks)),function({ hours, price }){return _c('div',{key:hours,staticClass:\"custom-control custom-radio\",staticStyle:{\"margin\":\"0.5rem 0px\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedPrepaidPack),expression:\"selectedPrepaidPack\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":'dh-single-pack-selected-' + hours,\"type\":\"radio\"},domProps:{\"value\":hours,\"checked\":_vm._q(_vm.selectedPrepaidPack,hours)},on:{\"change\":function($event){_vm.selectedPrepaidPack=hours}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":'dh-single-pack-selected-' + hours}},[_c('strong',[_vm._v(_vm._s(hours)+\" \"+_vm._s(_vm.$t('AI Detection Hours')))]),_vm._v(\" \"+_vm._s(_vm.$t('for'))+\" $\"+_vm._s(price)+\" \")])])}),0)]),_c('div',{staticStyle:{\"margin-top\":\"1rem\"}},[(!_vm.isAuthenticated)?_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial + 250 FREE AI Detection Hours')))])]):_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\"},on:{\"click\":_vm.purchasePrepaidPack}},[_vm._v(_vm._s(_vm.$t('Purchase Selected AI Detection Hour Pack')))])])])]),_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header dh-pack-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Subscribe&Save Packs')))]),_c('div',[_vm._v(_vm._s(_vm.$t('AI failure detection for all prints.')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Available only as add-on to the'))+\" AI Premium \"+_vm._s(_vm.$t('plan.')))])]),_c('div',[_c('div',{staticClass:\"features dh-pack\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Subscribed AI Detection Hours roll over month to month.')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Subscribed AI Detection Hours expire when subscription ends.'))+\" \")])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('You can change AI Detection Hour Pack or remove it from your'))+\" AI Premium \"+_vm._s(_vm.$t('plan any time you want.'))+\" \")])])])]),_c('div',[_c('div',{staticClass:\"form-group\",attrs:{\"id\":\"sns-dh-packs\"}},_vm._l((Object.keys(_vm.DHPacks)),function(key){return _c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(key != 0),expression:\"key != 0\"}],key:key,staticClass:\"custom-control custom-radio\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.dhPackKey),expression:\"dhPackKey\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":'dh-pack-selected-' + key,\"type\":\"radio\",\"name\":\"dh-pack-selected\",\"autocomplete\":\"off\"},domProps:{\"value\":key,\"checked\":_vm._q(_vm.dhPackKey,key)},on:{\"change\":function($event){_vm.dhPackKey=key}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":'dh-pack-selected-' + key}},[_c('strong',[_vm._v(_vm._s(_vm.getDHPackLabel(key))+\":\")]),_vm._v(\" \"+_vm._s(_vm.getDHPackSubLabel(key))+\" \")])])}),0),(_vm.isAuthenticated)?_c('div',[(_vm.hasSubscription)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('View/Change Subscription')))]):_c('a',{class:{\n                  'py-2 btn btn-primary btn-block': true,\n                  disabled: _vm.dhPackKey == '0',\n                },attrs:{\"id\":\"upgrade-with-selected-dh-pack\",\"role\":\"button\"},on:{\"click\":_vm.upgradeWithDHPack}},[_vm._v(_vm._s(_vm.$t('Upgrade to'))+\" AI Premium \"+_vm._s(_vm.$t('with selected AI Detection Hour Pack')))])]):_c('div',[_c('a',{staticClass:\"py-2 btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial + 250 FREE AI Detection Hours')))])]),_c('a',{staticClass:\"py-2 btn btn-block price-calculator-trigger link\",attrs:{\"id\":\"cal-with-selected-dh-pack\",\"role\":\"button\"},on:{\"click\":_vm.calcWithDHPack}},[_vm._v(_vm._s(_vm.$t('Calculate Cost >>>')))])])])])]),_c('QuestionsSection',{on:{\"calc\":_vm.calc}})],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"plan-price\"},[_vm._v(\" $0 \"),_c('span',{staticClass:\"price-unit\"})])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"row justify-content-center py-4\"},[_c('div',{staticClass:\"col-12 text-center\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('Questions You May Have')))])])]),_c('div',{staticClass:\"row justify-content-center pb-5\"},[_c('div',{staticClass:\"col-lg-10 col-md-12\",attrs:{\"id\":\"accordion\",\"role\":\"tablist\"}},[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-1\",modifiers:{\"accordion-1\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What currency are your prices in?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-1\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('They’re in US dollars.')))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-2\",modifiers:{\"accordion-2\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-2\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Which plan is right for me?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-2\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('It depends on how many 3D printers you have, and how often you print.')))]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The Free plan is for users with only 1 printer and print very in-frequently. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 5 FPS). The Free plan even comes with 10 free AI Detection Hours per month. And you can get {localizedDom} if you need more.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t('additional AI Detection Hours')))])]},proxy:true}])})],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The {planName} plan is for users who want to enjoy watching the webcam feed at the slick 25 FPS rate. It also comes with 50 AI Detection Hours every month. If you occasionally print more than 50 hours a month, you will most likely be ok because the {localizedDom}. When you upgrade to the {planName} plan, you are also eligible to the {localizedDom2} at favorable rates.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.getDocUrl(\n                        '/user-guides/how-does-detective-hour-work/#what-happens-to-the-balance-of-my-dhs-when-i-cancel-my-subscription-plan'\n                      )}},[_vm._v(\"AI Detection Hours roll over month to month\")])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t('Subscribe&Save AI Detection Hour Packs')))])]},proxy:true},{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-3\",modifiers:{\"accordion-3\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-3\"}},[_vm._v(\" \"+_vm._s(_vm.$t('I have X printers and I print Y hours a month. Tell me exactly how much the'))+\" AI Premium \"+_vm._s(_vm.$t('plan will cost me.'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-3\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Oops. We forgot to mention we have built a {localizedDom} for you.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"price-calculator-trigger link\",on:{\"click\":function($event){return _vm.$emit('calc')}}},[_vm._v(_vm._s(_vm.$t('price calculator')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-4\",modifiers:{\"accordion-4\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-4\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I change my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-4\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.' ))+\" \")]),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'You will keep the unused AI Detection Hours when you change your subscription plan.' ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-5\",modifiers:{\"accordion-5\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-5\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I cancel my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-5\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('Yes again! You can cancel your subscription any time.')))]),_c('b-card-text',[_vm._v(_vm._s(_vm.$t( 'However, the AI Detection Hours included in the plan and Subscribe&Save pack will expire at the end of your subscription period.' )))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-6\",modifiers:{\"accordion-6\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-6\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What is your refund policy?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-6\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`We offer a {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',[_vm._v(_vm._s(_vm.$t('30-Day Full Refund Policy')))])]},proxy:true}])}),_vm._v(\" . \")],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                  )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\" ))+\" \")]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-7\",modifiers:{\"accordion-7\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-7\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Is it safe to give my credit card number to the {brandName} Cloud?', { brandName: _vm.$syndicateText.brandName, }))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-7\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":\"https://www.chargebee.com/security/\"}},[_vm._v(_vm._s(_vm.$t('a fully compliant billing service provider')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Under no circumstances will the {brandName} Cloud process or store your payment information.', { brandName: _vm.$syndicateText.brandName } ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-8\",modifiers:{\"accordion-8\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-8\"}},[_vm._v(\" \"+_vm._s(_vm.$t('I have many printers and print a lot. The'))+\" AI Premium \"+_vm._s(_vm.$t('plan becomes really expensive. Can I still use the'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t('Cloud?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-8\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Please {localizedDom} to customize a plan that works for your budget.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('contact us')))])]},proxy:true}])})],1)],1)],1)],1)],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div class=\"row justify-content-center py-4\">\n      <div class=\"col-12 text-center\">\n        <h1>{{ $t('Questions You May Have') }}</h1>\n      </div>\n    </div>\n    <div class=\"row justify-content-center pb-5\">\n      <div id=\"accordion\" class=\"col-lg-10 col-md-12\" role=\"tablist\">\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-1\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-1\"\n            >\n              {{ $t('What currency are your prices in?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-1\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{ $t('They’re in US dollars.') }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-2\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-2\"\n            >\n              {{ $t('Which plan is right for me?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-2\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('It depends on how many 3D printers you have, and how often you print.')\n              }}</b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The Free plan is for users with only 1 printer and print very in-frequently. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 5 FPS). The Free plan even comes with 10 free AI Detection Hours per month. And you can get {localizedDom} if you need more.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a href=\"#need-more\">{{ $t('additional AI Detection Hours') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The {planName} plan is for users who want to enjoy watching the webcam feed at the slick 25 FPS rate. It also comes with 50 AI Detection Hours every month. If you occasionally print more than 50 hours a month, you will most likely be ok because the {localizedDom}. When you upgrade to the {planName} plan, you are also eligible to the {localizedDom2} at favorable rates.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a\n                      class=\"link\"\n                      :href=\"\n                        getDocUrl(\n                          '/user-guides/how-does-detective-hour-work/#what-happens-to-the-balance-of-my-dhs-when-i-cancel-my-subscription-plan'\n                        )\n                      \"\n                      >AI Detection Hours roll over month to month</a\n                    >\n                  </template>\n                  <template #localizedDom2>\n                    <a href=\"#need-more\">{{ $t('Subscribe&Save AI Detection Hour Packs') }}</a>\n                  </template>\n                  <template #planName>AI Premium</template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-3\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-3\"\n            >\n              {{ $t('I have X printers and I print Y hours a month. Tell me exactly how much the') }}\n              AI Premium\n              {{ $t('plan will cost me.') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-3\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(`Oops. We forgot to mention we have built a {localizedDom} for you.`)\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"price-calculator-trigger link\" @click=\"$emit('calc')\">{{\n                      $t('price calculator')\n                    }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-4\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-4\"\n            >\n              {{ $t('Can I change my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-4\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                {{\n                  $t(\n                    'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.'\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'You will keep the unused AI Detection Hours when you change your subscription plan.'\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-5\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-5\"\n            >\n              {{ $t('Can I cancel my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-5\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('Yes again! You can cancel your subscription any time.')\n              }}</b-card-text>\n              <b-card-text>{{\n                $t(\n                  'However, the AI Detection Hours included in the plan and Subscribe&Save pack will expire at the end of your subscription period.'\n                )\n              }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-6\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-6\"\n            >\n              {{ $t('What is your refund policy?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-6\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next :translation=\"$t(`We offer a {localizedDom}`)\">\n                  <template #localizedDom>\n                    <strong>{{ $t('30-Day Full Refund Policy') }}</strong>\n                  </template>\n                </i18next>\n                .\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                    )\n                  \"\n                >\n                  <template #planName>AI Premium</template>\n                  <template #localizedDom>\n                    <a :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\"\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-7\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-7\"\n            >\n              {{\n                $t('Is it safe to give my credit card number to the {brandName} Cloud?', {\n                  brandName: $syndicateText.brandName,\n                })\n              }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-7\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" href=\"https://www.chargebee.com/security/\">{{\n                      $t('a fully compliant billing service provider')\n                    }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'Under no circumstances will the {brandName} Cloud process or store your payment information.',\n                    { brandName: $syndicateText.brandName }\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-8\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-8\"\n            >\n              {{ $t('I have many printers and print a lot. The') }}\n              AI Premium\n              {{ $t('plan becomes really expensive. Can I still use the') }}\n              {{ $syndicateText.brandName }} {{ $t('Cloud?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-8\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(`Please {localizedDom} to customize a plan that works for your budget.`)\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('contact us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { SupportEmail } from '@entSrc/lib/consts.js'\n\nexport default {\n  name: 'QuestionsSection',\n  computed: {\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-link\n  cursor: pointer\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuestionsSection.vue?vue&type=template&id=13bcafb3&scoped=true&\"\nimport script from \"./QuestionsSection.vue?vue&type=script&lang=js&\"\nexport * from \"./QuestionsSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuestionsSection.vue?vue&type=style&index=0&id=13bcafb3&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"13bcafb3\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"pricing\">\n    <nav-bar view-name=\"pricing\"></nav-bar>\n\n    <div v-if=\"!loaded\" class=\"text-center my-5\">\n      <b-spinner></b-spinner>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <h1 class=\"text-center mt-5\">{{ $t('Obico Cloud Plans') }}</h1>\n      <div v-if=\"couponCode && !hasSubscription\" class=\"alert alert-info text-center\" role=\"status\">\n        {{ $t('Referral code: {code}. Your discount will appear at checkout. Prices below exclude discounts.', { code: couponCode }) }}\n      </div>\n      <div class=\"text-center py-1\">\n        {{ $t('Thinking about self-hosting Obico Server instead?') }}\n        <a href=\"https://obico.io/obico-cloud-vs-self-hosted.html\">{{\n          $t('Check out self-hosting vs Obico Cloud.')\n        }}</a>\n      </div>\n      <div id=\"pricing-selections\" class=\"container text-center py-4\">\n        <div class=\"btn-group btn-group-toggle\">\n          <label\n            id=\"sub-annual-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Annual\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Annual (SAVE 33%)') }}\n          </label>\n          <label\n            id=\"sub-monthly-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': !isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Monthly\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Monthly') }}\n          </label>\n        </div>\n      </div>\n      <div class=\"container\">\n        <div class=\"row price-matrix\">\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">{{ $t('Free') }}</div>\n              <div>{{ $t('Print occasionally.') }}</div>\n              <div class=\"plan-price\">\n                $0\n                <span class=\"price-unit\" />\n              </div>\n              <div class=\"price-sub\">{{ $t('Limited to 1 printer.') }}</div>\n            </div>\n            <div class=\"price-action\">\n              <a\n                v-if=\"!isAuthenticated\"\n                role=\"button\"\n                class=\"btn btn-primary btn-block\"\n                href=\"/accounts/signup/\"\n                >{{ $t('Get Started') }}</a\n              >\n            </div>\n            <div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"first-gen-ai-on-pricing-page\">\n                      {{ $t('First-gen AI failure detection technology') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"detective-hours-free-plan-on-pricing-page\">\n                      {{ $t('10 free AI Detection Hours/month included') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"basic-webcam-streaming\">\n                    <help-widget id=\"basic-streaming-on-pricing-page\">\n                      {{ $t('Basic webcam streaming') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"tunneling-cap-per-month\">\n                    <help-widget id=\"tunneling-free-plan-on-pricing-page\">\n                      {{ $t('300MB /mo tunnel data') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('G-Code cloud storage up to 50MB per file, 1GB total') }}</div>\n                </div>\n              </div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <i18next\n                      :translation=\"\n                        $t('Companion mobile app for {localizedDom} and {localizedDom2}')\n                      \"\n                    >\n                      <template #localizedDom>\n                        <a\n                          href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n                          >{{ $t('Android') }}</a\n                        >\n                      </template>\n                      <template #localizedDom2>\n                        <a\n                          href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n                          >{{ $t('iOS') }}</a\n                        >\n                      </template>\n                    </i18next>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Remote printer access and control') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{\n                      $t('Notifications via Email, mobile push notification, Telegram, and more.')\n                    }}\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"3rd-party-app-integration-free-on-pricing-page\">\n                      {{ $t('300MB /mo integration with your favorite 3rd-party mobile apps') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Community technical support') }}</div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">AI Premium</div>\n              <div>{{ $t('Print every day. 2+ printers.') }}</div>\n              <div class=\"plan-price\">\n                <span>{{ $t('$') }}</span>\n                <span id=\"monthly-price\">{{ priceTable.basePlanPrice }}</span>\n                <span class=\"price-unit\">&nbsp;/ {{ $t('month') }}</span>\n                <span v-if=\"isAnnual\" id=\"annual-bill\" style=\"font-size: 0.95rem; font-weight: 100\"\n                  >&nbsp;{{\n                    $t('(Billed {name} annually)', { name: priceTable.totalPlanPrice })\n                  }}</span\n                >\n              </div>\n              <div class=\"price-sub\">{{ $t('1st printer included') }}</div>\n              <div class=\"price-sub\">\n                <span>{{ $t('2+ printers at $') }}</span>\n                <span id=\"addl-printer-price\">{{ priceTable.basePrinterPrice }}</span>\n                / {{ $t('month / printer') }}\n              </div>\n              <div class=\"price-sub\">\n                <a class=\"price-calculator-trigger link\" @click=\"calc\"\n                  >{{ $t('Calculate cost') }} &gt;&gt;&gt;</a\n                >\n              </div>\n            </div>\n            <div class=\"price-action\">\n              <div v-if=\"isAuthenticated\">\n                <a\n                  v-if=\"hasSubscription\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  href=\"/user_preferences/subscription/\"\n                  >{{ $t('View/Change Subscription') }}</a\n                >\n                <a\n                  v-else\n                  id=\"subscribe-pro\"\n                  v-b-popover.hover=\"{\n                    placement: 'top',\n                    content: $t('Full refund within 30 days if you are not happy.'),\n                  }\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  @click=\"upgrade\"\n                  >{{ $t('Upgrade (30-Day Money Back Guarantee)') }}</a\n                >\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"btn btn-primary btn-block\" :href=\"signupUrl\">{{\n                  $t('Start 1 month FREE trial')\n                }}</a>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"next-gen-ai-on-pricing-page\">\n                    {{ $t('Next-gen AI failure detection technology') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"detective-hours-pro-plan-on-pricing-page\">\n                    {{ $t('50 free AI Detection Hours/month included') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"premium-webcam-streaming\">\n                  <help-widget id=\"premium-streaming-on-pricing-page\">\n                    {{ $t('Premium webcam streaming') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"unlimited-tunnling-for-pro\">\n                  <help-widget id=\"tunneling-pro-plan-on-pricing-page\">\n                    {{ $t('Unlimited tunnel data') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('G-Code cloud storage up to 500MB per file, 50GB total') }}</div>\n              </div>\n            </div>\n            <div class=\"features\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <i18next\n                    :translation=\"$t('Companion mobile app for {localizedDom} and {localizedDom2}')\"\n                  >\n                    <template #localizedDom>\n                      <a\n                        href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n                        >{{ $t('Android') }}</a\n                      >\n                    </template>\n                    <template #localizedDom2>\n                      <a\n                        href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n                        >{{ $t('iOS') }}</a\n                      >\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Remote printer access and control') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  {{ $t('Notifications via Email, mobile push notification, Telegram, and more.') }}\n                </div>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"3rd-party-app-integration-pro-on-pricing-page\">\n                    {{ $t('Unlimited integration with your favorite 3rd-party mobile apps') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Email technical support') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Printer feed sharing with premium streaming quality') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Failure alerts via SMS (text message)') }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div id=\"need-more\">\n          <h1 class=\"text-center mt-3\">{{ $t('AI Detection Hour Packs') }}</h1>\n          <div class=\"text-center\">\n            {{\n              $t(\n                'Need more AI Detection Hours? Add the right amount of AI Detection Hours without burning a hole on your wallet.'\n              )\n            }}\n          </div>\n        </div>\n        <div class=\"row price-matrix mt-5\">\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header dh-pack-header\">\n              <div class=\"plan-name\">{{ $t('Pre-paid Pack') }}</div>\n              <div>{{ $t('Turn on AI failure detection only for the prints.') }}</div>\n              <div>{{ $t('Available to all plans.') }}</div>\n            </div>\n            <div>\n              <div class=\"features dh-pack\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Pre-paid AI Detection Hours never expire.') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('One Time Purchase.') }}</div>\n                </div>\n              </div>\n            </div>\n            <div>\n              <div class=\"form-group\">\n                <div\n                  v-for=\"{ hours, price } in Object.values(PrepaidDHPacks)\"\n                  :key=\"hours\"\n                  class=\"custom-control custom-radio\"\n                  style=\"margin: 0.5rem 0px\"\n                >\n                  <input\n                    :id=\"'dh-single-pack-selected-' + hours\"\n                    v-model=\"selectedPrepaidPack\"\n                    type=\"radio\"\n                    :value=\"hours\"\n                    class=\"custom-control-input field_required\"\n                  />\n                  <label class=\"custom-control-label\" :for=\"'dh-single-pack-selected-' + hours\">\n                    <strong>{{ hours }} {{ $t('AI Detection Hours') }}</strong> {{ $t('for') }} ${{\n                      price\n                    }}\n                  </label>\n                </div>\n              </div>\n            </div>\n            <div style=\"margin-top: 1rem\">\n              <div v-if=\"!isAuthenticated\">\n                <a role=\"button\" class=\"btn btn-primary btn-block\" href=\"/accounts/signup/\">{{\n                  $t('Start 1 month FREE trial + 250 FREE AI Detection Hours')\n                }}</a>\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"btn btn-primary btn-block\" @click=\"purchasePrepaidPack\">{{\n                  $t('Purchase Selected AI Detection Hour Pack')\n                }}</a>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header dh-pack-header\">\n              <div class=\"plan-name\">{{ $t('Subscribe&Save Packs') }}</div>\n              <div>{{ $t('AI failure detection for all prints.') }}</div>\n              <div>{{ $t('Available only as add-on to the') }} AI Premium {{ $t('plan.') }}</div>\n            </div>\n            <div>\n              <div class=\"features dh-pack\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Subscribed AI Detection Hours roll over month to month.') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{ $t('Subscribed AI Detection Hours expire when subscription ends.') }}\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{ $t('You can change AI Detection Hour Pack or remove it from your') }}\n                    AI Premium\n                    {{ $t('plan any time you want.') }}\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div>\n              <div id=\"sns-dh-packs\" class=\"form-group\">\n                <div\n                  v-for=\"key in Object.keys(DHPacks)\"\n                  v-show=\"key != 0\"\n                  :key=\"key\"\n                  class=\"custom-control custom-radio\"\n                >\n                  <input\n                    :id=\"'dh-pack-selected-' + key\"\n                    v-model=\"dhPackKey\"\n                    type=\"radio\"\n                    name=\"dh-pack-selected\"\n                    :value=\"key\"\n                    class=\"custom-control-input field_required\"\n                    autocomplete=\"off\"\n                  />\n                  <label class=\"custom-control-label\" :for=\"'dh-pack-selected-' + key\">\n                    <strong>{{ getDHPackLabel(key) }}:</strong>\n                    {{ getDHPackSubLabel(key) }}\n                  </label>\n                </div>\n              </div>\n              <div v-if=\"isAuthenticated\">\n                <a\n                  v-if=\"hasSubscription\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  href=\"/user_preferences/subscription/\"\n                  >{{ $t('View/Change Subscription') }}</a\n                >\n                <a\n                  v-else\n                  id=\"upgrade-with-selected-dh-pack\"\n                  role=\"button\"\n                  :class=\"{\n                    'py-2 btn btn-primary btn-block': true,\n                    disabled: dhPackKey == '0',\n                  }\"\n                  @click=\"upgradeWithDHPack\"\n                  >{{ $t('Upgrade to') }} AI Premium {{ $t('with selected AI Detection Hour Pack') }}</a\n                >\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"py-2 btn btn-primary btn-block\" href=\"/accounts/signup/\">{{\n                  $t('Start 1 month FREE trial + 250 FREE AI Detection Hours')\n                }}</a>\n              </div>\n              <a\n                id=\"cal-with-selected-dh-pack\"\n                role=\"button\"\n                class=\"py-2 btn btn-block price-calculator-trigger link\"\n                @click=\"calcWithDHPack\"\n                >{{ $t('Calculate Cost &gt;&gt;&gt;') }}</a\n              >\n            </div>\n          </div>\n        </div>\n      </div>\n      <QuestionsSection @calc=\"calc\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport {\n  BillingCycle,\n  DHPacks,\n  PrepaidDHPacks,\n  CalcPeriod,\n  calcPriceTable,\n  calcDHPackPrice,\n} from '@entSrc/lib/pricing.js'\n\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport { SupportEmail } from '@entSrc/lib/consts.js'\nimport NavBar from '@src/components/NavBar.vue'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport axios from '@src/lib/axios-csrf'\nimport urls from '@config/server-urls'\n\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport QuestionsSection from '@entSrc/components/pricing/QuestionsSection.vue'\n\nexport default {\n  name: 'PricingPage',\n  components: {\n    QuestionsSection,\n    NavBar,\n    HelpWidget,\n  },\n  props: {\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    annualAsDefault: {\n      type: Boolean,\n      default() {\n        return true\n      },\n    },\n    couponCode: {\n      type: String,\n      default: '',\n    },\n  },\n  data() {\n    return {\n      initialCBSubscription: null,\n      loaded: false,\n      billingCycle: this.annualAsDefault ? BillingCycle.Annual : BillingCycle.Monthly,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      isCalcOpen: false,\n      selectedPrepaidPack: null,\n    }\n  },\n  computed: {\n    signupUrl() {\n      return this.couponCode\n        ? '/accounts/signup/?next=' + encodeURIComponent(window.location.pathname)\n        : '/accounts/signup/'\n    },\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n    isAnnual() {\n      return this.billingCycle === BillingCycle.Annual\n    },\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n    priceTable() {\n      return calcPriceTable(this.billingCycle, this.numPrinters, this.dhPackKey)\n    },\n  },\n  created() {\n    this.BillingCycle = BillingCycle\n    this.DHPacks = DHPacks\n    this.PrepaidDHPacks = PrepaidDHPacks\n    this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n    if (this.isAuthenticated) {\n      axios.get(urls.activeSubscription()).then((response) => {\n        this.loaded = true\n        const data = response.data\n        this.initialCBSubscription = data ? data.cb_subscription : null\n      })\n    } else {\n      this.loaded = true\n    }\n  },\n  mounted() {\n    // Google Optimize\n    let googleOptimizeScript = document.createElement('script')\n    googleOptimizeScript.setAttribute(\n      'src',\n      'https://www.googleoptimize.com/optimize.js?id=OPT-NVC4QPD'\n    )\n    document.head.appendChild(googleOptimizeScript)\n  },\n  methods: {\n    getDHPackLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month`, { name: DHPacks[key].hours })}`\n        : `${this.$i18next.t('AI Detection Hour Pack not selected')}`\n    },\n    getDHPackSubLabel(key) {\n      const year = calcDHPackPrice(this.billingCycle, CalcPeriod.Year, key)\n      const month = calcDHPackPrice(this.billingCycle, CalcPeriod.Month, key)\n      const hour = (month / DHPacks[key].hours).toFixed(4)\n\n      if (key > 0) {\n        return this.billingCycle == BillingCycle.Annual\n          ? `${this.$i18next.t(\n              ' for ${month} / month (${hour} / AI Detection Hour). Billed ${year} annually.',\n              { month, hour, year }\n            )}`\n          : `${this.$i18next.t(' for ${month} / month (${hour} / AI Detection Hour).', {\n              month,\n              hour,\n            })}`\n      }\n      return ''\n    },\n    calc() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    calcWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    upgrade() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    upgradeWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    checkoutPrepaidDHPack(level) {\n      chargeBee.checkout(this.chargeBeeInstance, '/ent/generate_prepaid_dhpack_checkout_url/', {\n        dhpack_level: level,\n      })\n    },\n    purchasePrepaidPack() {\n      if (this.selectedPrepaidPack === null) {\n        return\n      } else {\n        this.checkoutPrepaidDHPack(this.selectedPrepaidPack)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped></style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PricingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PricingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PricingPage.vue?vue&type=template&id=155dc778&scoped=true&\"\nimport script from \"./PricingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PricingPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"155dc778\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',{staticClass:\"archived-printers\"},[(_vm.overSubscribed === null)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('b-row',{staticClass:\"justify-content-center detective-hour-log\"},[_c('b-col',{attrs:{\"sm\":\"11\",\"md\":\"10\",\"lg\":\"8\"}},[(_vm.archivedPrinters.length > 0)?_c('div',{staticClass:\"form-container full-on-mobile\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('Archived Printers')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'The following printers have been archived because you have more printers than your plan allows.' ))+\" \")]),_c('table',{staticClass:\"archived-printers-list table table-striped table-borderless my-4\"},[_c('tbody',_vm._l((_vm.archivedPrinters),function(printer){return _c('tr',{key:printer.id},[_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(printer.name))]),_c('td',{staticClass:\"text-right\"},[(_vm.overSubscribed)?_c('a',{staticClass:\"btn link mr-0 mr-md-2 printer-action\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.unarchivePrinter(printer)}}},[_vm._v(_vm._s(_vm.$t('Un-archive')))]):_c('a',{directives:[{name:\"b-tooltip\",rawName:\"v-b-tooltip.hover\",modifiers:{\"hover\":true}}],staticClass:\"btn disabled link mr-0 mr-md-2 printer-action\",attrs:{\"title\":\"Your subscription plan doesn't allow more printers.\",\"href\":\"#\"}},[_vm._v(_vm._s(_vm.$t('Un-archive')))]),_c('a',{staticClass:\"btn link printer-action\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.deletePrinter(printer)}}},[_vm._v(_vm._s(_vm.$t('Delete')))])])])}),0)]),_c('p',[_vm._v(_vm._s(_vm.$t('You have a few options to un-archive printer(s)'))+\":\")]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t('Delete or archive the printers you no longer need.')))]),_c('li',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                      `Upgrade to the {planName} plan. Please remember the Free plan is limited to only 1 printer. Check out {localizedDom}.`\n                    )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('the'))+\" AI Premium \"+_vm._s(_vm.$t('plan pricing')))])]},proxy:true}],null,false,1971554533)})],1),_c('li',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                      `If you are already on the {planName} plan, you can change the number of printers on {localizedDom}.`\n                    )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('your subscription page')))])]},proxy:true}],null,false,2400451523)})],1)]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Once your account is set up to allow for more printers, come back and un-archive the printers here.' ))+\" \")]),_c('p',{staticClass:\"font-weight-light font-italic\"},[_vm._v(\" \"+_vm._s(_vm.$t('Questions on why your printers are archived?'))+\" \"),_c('a',{attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('Contact us.')))])])]):_c('div',{staticClass:\"form-container m-0\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('Archived Printers')))]),_c('p',[_vm._v(_vm._s(_vm.$t('You have no archived printers.')))]),_c('p',[_c('a',{attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t('Go back to the printer page.')))])])])])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container class=\"archived-printers\">\n        <div v-if=\"overSubscribed === null\" class=\"text-center my-5\">\n          <b-spinner></b-spinner>\n        </div>\n        <b-row v-else class=\"justify-content-center detective-hour-log\">\n          <b-col sm=\"11\" md=\"10\" lg=\"8\">\n            <div v-if=\"archivedPrinters.length > 0\" class=\"form-container full-on-mobile\">\n              <h2>{{ $t('Archived Printers') }}</h2>\n              <p>\n                {{\n                  $t(\n                    'The following printers have been archived because you have more printers than your plan allows.'\n                  )\n                }}\n              </p>\n              <table class=\"archived-printers-list table table-striped table-borderless my-4\">\n                <tbody>\n                  <tr v-for=\"printer in archivedPrinters\" :key=\"printer.id\">\n                    <td class=\"align-middle\">{{ printer.name }}</td>\n                    <td class=\"text-right\">\n                      <a\n                        v-if=\"overSubscribed\"\n                        class=\"btn link mr-0 mr-md-2 printer-action\"\n                        href=\"#\"\n                        @click.prevent=\"unarchivePrinter(printer)\"\n                        >{{ $t('Un-archive') }}</a\n                      >\n                      <a\n                        v-else\n                        v-b-tooltip.hover\n                        class=\"btn disabled link mr-0 mr-md-2 printer-action\"\n                        title=\"Your subscription plan doesn't allow more printers.\"\n                        href=\"#\"\n                        >{{ $t('Un-archive') }}</a\n                      >\n                      <a\n                        class=\"btn link printer-action\"\n                        href=\"#\"\n                        @click.prevent=\"deletePrinter(printer)\"\n                        >{{ $t('Delete') }}</a\n                      >\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n              <p>{{ $t('You have a few options to un-archive printer(s)') }}:</p>\n              <ul>\n                <li>{{ $t('Delete or archive the printers you no longer need.') }}</li>\n                <li>\n                  <i18next\n                    :translation=\"\n                      $t(\n                        `Upgrade to the {planName} plan. Please remember the Free plan is limited to only 1 printer. Check out {localizedDom}.`\n                      )\n                    \"\n                  >\n                    <template #planName>AI Premium</template>\n                    <template #localizedDom>\n                      <a href=\"/ent_pub/pricing/\">{{ $t('the') }} AI Premium {{ $t('plan pricing') }}</a>\n                    </template>\n                  </i18next>\n                </li>\n                <li>\n                  <i18next\n                    :translation=\"\n                      $t(\n                        `If you are already on the {planName} plan, you can change the number of printers on {localizedDom}.`\n                      )\n                    \"\n                  >\n                    <template #planName>AI Premium</template>\n                    <template #localizedDom>\n                      <a href=\"/user_preferences/subscription/\">{{\n                        $t('your subscription page')\n                      }}</a>\n                    </template>\n                  </i18next>\n                </li>\n              </ul>\n              <p>\n                {{\n                  $t(\n                    'Once your account is set up to allow for more printers, come back and un-archive the printers here.'\n                  )\n                }}\n              </p>\n              <p class=\"font-weight-light font-italic\">\n                {{ $t('Questions on why your printers are archived?') }}\n                <a href=\"mailto:support@obico.io\">{{ $t('Contact us.') }}</a>\n              </p>\n            </div>\n            <div v-else class=\"form-container m-0\">\n              <h2>{{ $t('Archived Printers') }}</h2>\n              <p>{{ $t('You have no archived printers.') }}</p>\n              <p>\n                <a href=\"/printers/\">{{ $t('Go back to the printer page.') }}</a>\n              </p>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\n\nexport default {\n  name: 'ArchivedPrintersPage',\n\n  components: {\n    PageLayout,\n  },\n\n  data() {\n    return {\n      archivedPrinters: [],\n      overSubscribed: null,\n    }\n  },\n\n  created() {\n    this.fetchData()\n  },\n\n  methods: {\n    deletePrinter(printer) {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t(`Delete {name} printer? This action can not be undone.`, {\n          name: printer.name,\n        })}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.delete(urls.printer(printer.id) + '?with_archived=true').then(() => {\n            this.$swal.Toast.fire({\n              title: `${this.$i18next.t('Printer deleted')}`,\n              text: `${this.$i18next.t(`{name} has been permanently deleted`, { name: printer.name })}`,\n            })\n            this.fetchData()\n          })\n        }\n      })\n    },\n\n    unarchivePrinter(printer) {\n      if (!this.overSubscribed) {\n        return\n      }\n\n      const href = `/ent/printers/${printer.id}/unarchive/`\n      window.location.href = href\n    },\n\n    fetchData() {\n      this.archivedPrinters = []\n      this.overSubscribed = null\n      axios.get(urls.printers() + '?with_archived=true').then((response) => {\n        for (const printer of response.data) {\n          if (printer.archived_at) {\n            this.archivedPrinters.push(printer)\n          }\n        }\n      })\n      axios.get(urls.activeSubscription()).then((response) => {\n        const data = response.data\n        this.overSubscribed = data.over_subscribed\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\ntable.archived-printers-list td\n  white-space: normal\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ArchivedPrintersPage.vue?vue&type=template&id=b5b4a9e6&scoped=true&\"\nimport script from \"./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"\nexport * from \"./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ArchivedPrintersPage.vue?vue&type=style&index=0&id=b5b4a9e6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b5b4a9e6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_vm._v(\"\\\"> \"),(_vm.loading)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',{attrs:{\"sm\":\"11\",\"md\":\"10\",\"lg\":\"8\"}},[(_vm.lastRedeemedCode)?_c('div',{staticClass:\"form-container full-on-mobile mb-4 detective-hour-coupon-codes\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('Last redeemed Detective Hours')))]),_c('table',{staticClass:\"coupon-codes-list table table-striped table-borderless my-4\"},[_c('thead',[_c('tr',[_c('th',[_vm._v(_vm._s(_vm.$t('Code')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Hours')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Description')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Redeemed at')))])])]),_c('tbody',[_c('tr',[_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.lastRedeemedCode.code))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.lastRedeemedCode.hours))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.lastRedeemedCode.description))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.formatDate(_vm.lastRedeemedCode.redeemed_at)))])])])])]):_vm._e(),(_vm.couponCodes.length > 0)?_c('div',{staticClass:\"form-container full-on-mobile\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('AI Hour Coupon Codes')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Here are your AI Hour coupon codes and their redemption status.'))+\" \")]),_c('table',{staticClass:\"coupon-codes-list table table-striped table-borderless my-4\"},[_c('thead',[_c('tr',[_c('th',[_vm._v(_vm._s(_vm.$t('Code')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Hours')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Description')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Redeemed at')))])])]),_c('tbody',_vm._l((_vm.couponCodes),function(code){return _c('tr',{key:code.id},[_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(code.code))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(code.hours))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(code.description))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(\" \"+_vm._s(code.redeemed_at ? _vm.formatDate(code.redeemed_at) : _vm.$t('Available'))+\" \")])])}),0)])]):_c('div',{staticClass:\"form-container m-0\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('AI Hour Coupon Codes')))]),_c('p',[_vm._v(_vm._s(_vm.$t('You have no AI Hour coupon codes.')))]),_c('p',[_c('a',{attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t('Go back to the printer page.')))])])])])],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container\">\n        <div v-if=\"loading\" class=\"text-center my-5\">\n          <b-spinner></b-spinner>\n        </div>\n        <b-row v-else class=\"justify-content-center\">\n          <b-col sm=\"11\" md=\"10\" lg=\"8\">\n            <div v-if=\"lastRedeemedCode\" class=\"form-container full-on-mobile mb-4 detective-hour-coupon-codes\">\n              <h2>{{ $t('Last redeemed Detective Hours') }}</h2>\n              <table class=\"coupon-codes-list table table-striped table-borderless my-4\">\n                <thead>\n                  <tr>\n                    <th>{{ $t('Code') }}</th>\n                    <th>{{ $t('Hours') }}</th>\n                    <th>{{ $t('Description') }}</th>\n                    <th>{{ $t('Redeemed at') }}</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td class=\"align-middle\">{{ lastRedeemedCode.code }}</td>\n                    <td class=\"align-middle\">{{ lastRedeemedCode.hours }}</td>\n                    <td class=\"align-middle\">{{ lastRedeemedCode.description }}</td>\n                    <td class=\"align-middle\">{{ formatDate(lastRedeemedCode.redeemed_at) }}</td>\n                  </tr>\n                </tbody>\n              </table>\n            </div>\n            <div v-if=\"couponCodes.length > 0\" class=\"form-container full-on-mobile\">\n              <h2>{{ $t('AI Hour Coupon Codes') }}</h2>\n              <p>\n                {{ $t('Here are your AI Hour coupon codes and their redemption status.') }}\n              </p>\n              <table class=\"coupon-codes-list table table-striped table-borderless my-4\">\n                <thead>\n                  <tr>\n                    <th>{{ $t('Code') }}</th>\n                    <th>{{ $t('Hours') }}</th>\n                    <th>{{ $t('Description') }}</th>\n                    <th>{{ $t('Redeemed at') }}</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr v-for=\"code in couponCodes\" :key=\"code.id\">\n                    <td class=\"align-middle\">{{ code.code }}</td>\n                    <td class=\"align-middle\">{{ code.hours }}</td>\n                    <td class=\"align-middle\">{{ code.description }}</td>\n                    <td class=\"align-middle\">\n                      {{ code.redeemed_at ? formatDate(code.redeemed_at) : $t('Available') }}\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </div>\n            <div v-else class=\"form-container m-0\">\n              <h2>{{ $t('AI Hour Coupon Codes') }}</h2>\n              <p>{{ $t('You have no AI Hour coupon codes.') }}</p>\n              <p>\n                <a href=\"/printers/\">{{ $t('Go back to the printer page.') }}</a>\n              </p>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\n\nexport default {\n  name: 'DetectiveHourCouponCodesPage',\n\n  components: {\n    PageLayout,\n  },\n\n  data() {\n    return {\n      couponCodes: [],\n      loading: true,\n    }\n  },\n\n  created() {\n    this.fetchData()\n  },\n\n  methods: {\n    fetchData() {\n      this.loading = true\n      axios.get(urls.detectiveHourCouponCodes()).then((response) => {\n        this.couponCodes = response.data\n        this.loading = false\n      })\n    },\n\n    formatDate(dateString) {\n      if (!dateString) return ''\n      const date = new Date(dateString)\n      const locale = this.$i18n?.locale || 'en-US'\n      return new Intl.DateTimeFormat(locale, {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit',\n      }).format(date)\n    },\n  },\n\n  computed: {\n    lastRedeemedCode() {\n      return this.couponCodes.length > 0 ? this.couponCodes[0] : null\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\ntable.coupon-codes-list\n  td, th\n    white-space: normal\n\n// Add styling for the first table's body only\n.detective-hour-coupon-codes table:first-of-type tbody\n  color: var(--color-success)\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DetectiveHourCouponCodesPage.vue?vue&type=template&id=3931bb0f&scoped=true&\"\nimport script from \"./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"\nexport * from \"./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DetectiveHourCouponCodesPage.vue?vue&type=style&index=0&id=3931bb0f&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3931bb0f\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('nav-bar',{attrs:{\"view-name\":\"publictimelapse_list\"}}),_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"timelapse-gallery\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-sm-12 text-center\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('The Spaghetti Gallery')))])])]),_c('div',{staticClass:\"row\"},_vm._l((_vm.pageTimelapses),function(timelapse){return _c('print-card',{key:timelapse.id,attrs:{\"print\":timelapse,\"is-public\":true},on:{\"fullscreen\":_vm.openFullScreen}})}),1),_c('mugen-scroll',{staticClass:\"text-center p-4\",attrs:{\"handler\":_vm.fetchMoreData,\"should-handle\":!_vm.loading}},[(_vm.noMoreData)?_c('div',{staticClass:\"text-center p-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('End of public time-lapse list.'))+\" \")]):_vm._e(),(!_vm.noMoreData)?_c('b-spinner',{attrs:{\"label\":_vm.$t('Loading...')}}):_vm._e()],1),_c('b-modal',{attrs:{\"id\":\"tl-fullscreen-modal\",\"size\":\"full\",\"title\":_vm.fullScreenPrintTitle,\"hide-footer\":true},on:{\"hidden\":_vm.fullScreenClosed}},[_c('full-screen-print-card',{attrs:{\"print\":_vm.fullScreenPrint,\"video-url\":_vm.fullScreenPrintVideoUrl,\"autoplay\":true,\"is-public\":true}})],1)],1)])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-sm-12 col-md-6 col-lg-4 print-card\"},[_c('div',{staticClass:\"card vld-parent\"},[(_vm.isPublic)?_c('div',{staticClass:\"card-header\"},[_vm._v(\"- By \"+_vm._s(_vm.print.creator_name))]):_c('div',{staticClass:\"card-header\"},[_c('div',{style:({ visibility: _vm.hasSelectedChangedListener ? 'visible' : 'hidden' })},[_c('b-form-checkbox',{staticClass:\"text-decoration-none\",attrs:{\"size\":\"lg\"},model:{value:(_vm.isSelected),callback:function ($$v) {_vm.isSelected=$$v},expression:\"isSelected\"}})],1),_c('b-form-radio-group',{attrs:{\"buttons\":\"\",\"button-variant\":\"outline-primary\",\"name\":\"radio-btn-outline\"},model:{value:(_vm.selectedCardView),callback:function ($$v) {_vm.selectedCardView=$$v},expression:\"selectedCardView\"}},[_c('b-form-radio',{staticClass:\"no-corner no-shadow\",attrs:{\"value\":\"detective\",\"disabled\":!_vm.canShowDetectiveView}},[_c('i',{staticClass:\"fas fa-balance-scale\"})]),_c('b-form-radio',{staticClass:\"no-corner no-shadow\",attrs:{\"value\":\"info\"}},[_c('i',{staticClass:\"fas fa-info\"})])],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[(_vm.print.video_url && !_vm.print.video_archived_at)?_c('b-dropdown-item',{attrs:{\"href\":_vm.print.video_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"fas fa-download\"}),_vm._v(_vm._s(_vm.$t(\"Download Original Time-lapse\"))+\" \")]):_vm._e(),(_vm.print.tagged_video_url && !_vm.print.video_archived_at)?_c('b-dropdown-item',{attrs:{\"href\":_vm.print.tagged_video_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"fas fa-download\"}),_vm._v(_vm._s(_vm.$t(\"Download Detective Time-lapse\"))+\" \")]):_vm._e(),_c('b-dropdown-divider'),_c('b-dropdown-item',{on:{\"click\":_vm.deleteVideo}},[_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.$t(\" \"))),_c('i',{staticClass:\"fas fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t(\"Delete\"))+\" \")])])],1)],1),_c('div',[(_vm.print.video_archived_at)?_c('div',{staticClass:\"position-relative\"},[_c('div',{staticClass:\"poster-placeholder-wrapper\"},[_c('svg',{staticClass:\"poster-placeholder\"},[_c('use',{attrs:{\"href\":_vm.posterSrc}})])]),_c('div',{staticClass:\"archived-info\"},[_c('div',{staticClass:\"text\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Video file is deleted.\"))+\" \"),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.showVideoArchivedDescription($event)}}},[_vm._v(_vm._s(_vm.$t(\"Why?\")))])])])]):_c('div',[(_vm.videoUrl)?_c('video-box',{attrs:{\"video-url\":_vm.videoUrl,\"poster-url\":_vm.print.poster_url,\"fluid\":true,\"fullscreen-btn\":_vm.hasFullscreenListener},on:{\"timeupdate\":_vm.onTimeUpdate,\"fullscreen\":function($event){return _vm.$emit('fullscreen', _vm.print.id, _vm.videoUrl)}}}):_c('div',[_c('detective-working')],1)],1),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.cardView == 'info' && !_vm.isPublic),expression:\"cardView == 'info' && !isPublic\"}]},[_c('div',{staticClass:\"card-body\"},[_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"text-muted col-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"File\"))+\" \"),_c('span',{staticClass:\"float-right\"},[_vm._v(\":\")])]),_c('div',{staticClass:\"col-8\"},[_vm._v(_vm._s(_vm.print.filename))])]),_c('div',{directives:[{name:\"b-tooltip\",rawName:\"v-b-tooltip.hover\",modifiers:{\"hover\":true}}],staticClass:\"row\",attrs:{\"title\":_vm.humanizedPrintedOrUploadedTime((_vm.longFormat = true))}},[_c('div',{staticClass:\"text-muted col-4\"},[_vm._v(\" \"+_vm._s(_vm.wasTimelapseUploaded ? 'Uploaded' : 'Printed')+\" \"),_c('span',{staticClass:\"float-right\"},[_vm._v(\":\")])]),_c('div',{staticClass:\"col-8\"},[_vm._v(_vm._s(_vm.humanizedPrintedOrUploadedTime())+\" \"+_vm._s(_vm.endStatus))])]),(!_vm.wasTimelapseUploaded && _vm.duration)?_c('div',{staticClass:\"row\",attrs:{\"id\":'dur-' + _vm.print.id}},[_c('b-tooltip',{attrs:{\"target\":'dur-' + _vm.print.id,\"triggers\":\"hover\"}},[_vm._v(\" \"+_vm._s(_vm._f(\"floor\")(_vm._f(\"duration\")(_vm.duration,'asHours')))+\":\"+_vm._s(_vm._f(\"duration\")(_vm.duration,'minutes'))+\":\"+_vm._s(_vm._f(\"duration\")(_vm.duration,'seconds'))+\" \")]),_c('div',{staticClass:\"text-muted col-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Duration\"))+\" \"),_c('span',{staticClass:\"float-right\"},[_vm._v(\":\")])]),_c('div',{staticClass:\"col-8\"},[_vm._v(_vm._s(_vm.duration.humanize()))])],1):_vm._e()])])]),(_vm.isPublic)?_c('div',{staticClass:\"bg-warning alert-banner text-center\",style:({ opacity: _vm.normalizedP > 0.4 ? 1 : 0 })},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Possible failure detected!\"))+\" \")]):_vm._e(),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.cardView == 'detective' || _vm.isPublic),expression:\"cardView == 'detective' || isPublic\"}]},[(_vm.print.prediction_json_url)?_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}}):_vm._e(),(!_vm.isPublic)?_c('div',{staticClass:\"feedback-section\"},[_c('div',{staticClass:\"text-center py-2 px-3\"},[_c('div',{staticClass:\"lead\",class:[_vm.print.alerted_at ? 'text-danger' : 'text-success']},[_vm._v(\" \"+_vm._s(_vm.print.alerted_at ? 'Failure detected' : 'No failure detected')+\" \")]),_c('div',{staticClass:\"py-2\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Did we get it right?\"))+\" \"),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedUp ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbUpClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-up\"})],1),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedDown ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbDownClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-down\"})],1)],1),_c('transition',{attrs:{\"name\":\"bounce\"}},[(_vm.print.printShotFeedbackEligible)?_c('div',{staticClass:\"pt-2\"},[_c('a',{staticClass:\"btn btn-sm btn-outline-primary px-4\",attrs:{\"role\":\"button\",\"href\":_vm.focusedFeedbackLink}},[_vm._v(\" F \"),_c('i',{staticClass:\"fas fa-search focused-feedback-icon\"}),_vm._v(_vm._s(_vm.$t(\"CUSED FEEDBACK\"))+\" \"),(_vm.print.need_print_shot_feedback)?_c('svg',{staticClass:\"seg-control-icon ml-1 double-hours-icon\"},[_c('use',{attrs:{\"href\":\"#svg-hour-double\"}})]):_vm._e()])]):_vm._e()])],1),_c('div',{staticClass:\"text-muted py-2 px-3 help-text\"},[(_vm.print.printShotFeedbackEligible)?_c('small',[(!_vm.print.need_print_shot_feedback)?_c('span',[_vm._v(_vm._s(_vm.$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\")))]):_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback')}},[_vm._v(_vm._s(_vm.$t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\")))]),_vm._v(\". \")])]):_c('small',[_vm._v(\" \"+_vm._s(_vm.$t(\"Every time you give us feedback,\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"you help us get better at detecting failures\")))]),_vm._v(\". \")])])]):_vm._e()],1)])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"col-sm-12 col-md-6 col-lg-4 print-card\">\n    <div class=\"card vld-parent\">\n      <div v-if=\"isPublic\" class=\"card-header\">- By {{ print.creator_name }}</div>\n      <div v-else class=\"card-header\">\n        <div :style=\"{ visibility: hasSelectedChangedListener ? 'visible' : 'hidden' }\">\n          <b-form-checkbox\n            v-model=\"isSelected\"\n            size=\"lg\"\n            class=\"text-decoration-none\"\n          ></b-form-checkbox>\n        </div>\n        <b-form-radio-group\n          v-model=\"selectedCardView\"\n          buttons\n          button-variant=\"outline-primary\"\n          name=\"radio-btn-outline\"\n        >\n          <b-form-radio\n            value=\"detective\"\n            class=\"no-corner no-shadow\"\n            :disabled=\"!canShowDetectiveView\"\n          >\n            <i class=\"fas fa-balance-scale\"></i>\n          </b-form-radio>\n          <b-form-radio value=\"info\" class=\"no-corner no-shadow\">\n            <i class=\"fas fa-info\"></i>\n          </b-form-radio>\n        </b-form-radio-group>\n        <b-dropdown right no-caret toggle-class=\"icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <b-dropdown-item\n            v-if=\"print.video_url && !print.video_archived_at\"\n            :href=\"print.video_url\"\n            target=\"_blank\"\n          >\n            <i class=\"fas fa-download\"></i>{{$t(\"Download Original Time-lapse\")}}\n          </b-dropdown-item>\n          <b-dropdown-item\n            v-if=\"print.tagged_video_url && !print.video_archived_at\"\n            :href=\"print.tagged_video_url\"\n            target=\"_blank\"\n          >\n            <i class=\"fas fa-download\"></i>{{$t(\"Download Detective Time-lapse\")}}\n          </b-dropdown-item>\n          <b-dropdown-divider></b-dropdown-divider>\n          <b-dropdown-item @click=\"deleteVideo\">\n            <span class=\"text-danger\">{{ $t(\" \") }}<i class=\"fas fa-trash-alt\"></i>{{$t(\"Delete\")}} </span>\n          </b-dropdown-item>\n        </b-dropdown>\n      </div>\n      <div>\n        <div v-if=\"print.video_archived_at\" class=\"position-relative\">\n          <div class=\"poster-placeholder-wrapper\">\n            <svg class=\"poster-placeholder\">\n              <use :href=\"posterSrc\" />\n            </svg>\n          </div>\n          <div class=\"archived-info\">\n            <div class=\"text\">\n              {{$t(\"Video file is deleted.\")}}\n              <a href=\"#\" @click=\"showVideoArchivedDescription($event)\">{{ $t(\"Why?\") }}</a>\n            </div>\n          </div>\n        </div>\n        <div v-else>\n          <video-box\n            v-if=\"videoUrl\"\n            :video-url=\"videoUrl\"\n            :poster-url=\"print.poster_url\"\n            :fluid=\"true\"\n            :fullscreen-btn=\"hasFullscreenListener\"\n            @timeupdate=\"onTimeUpdate\"\n            @fullscreen=\"$emit('fullscreen', print.id, videoUrl)\"\n          />\n          <div v-else>\n            <detective-working />\n          </div>\n        </div>\n        <div v-show=\"cardView == 'info' && !isPublic\">\n          <div class=\"card-body\">\n            <div class=\"container\">\n              <div class=\"row\">\n                <div class=\"text-muted col-4\">\n                  {{$t(\"File\")}}\n                  <span class=\"float-right\">:</span>\n                </div>\n                <div class=\"col-8\">{{ print.filename }}</div>\n              </div>\n              <div\n                v-b-tooltip.hover\n                class=\"row\"\n                :title=\"humanizedPrintedOrUploadedTime((longFormat = true))\"\n              >\n                <div class=\"text-muted col-4\">\n                  {{ wasTimelapseUploaded ? 'Uploaded' : 'Printed' }}\n                  <span class=\"float-right\">:</span>\n                </div>\n                <div class=\"col-8\">{{ humanizedPrintedOrUploadedTime() }} {{ endStatus }}</div>\n              </div>\n              <div v-if=\"!wasTimelapseUploaded && duration\" :id=\"'dur-' + print.id\" class=\"row\">\n                <b-tooltip :target=\"'dur-' + print.id\" triggers=\"hover\">\n                  {{ duration | duration('asHours') | floor }}:{{\n                    duration | duration('minutes')\n                  }}:{{ duration | duration('seconds') }}\n                </b-tooltip>\n                <div class=\"text-muted col-4\">\n                  {{$t(\"Duration\")}}\n                  <span class=\"float-right\">:</span>\n                </div>\n                <div class=\"col-8\">{{ duration.humanize() }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div\n          v-if=\"isPublic\"\n          class=\"bg-warning alert-banner text-center\"\n          :style=\"{ opacity: normalizedP > 0.4 ? 1 : 0 }\"\n        >\n          <!-- v-show=\"normalizedP > 0.4\" -->\n          <i class=\"fas fa-exclamation-triangle\"></i> {{$t(\"Possible failure detected!\")}}\n        </div>\n\n        <div v-show=\"cardView == 'detective' || isPublic\">\n          <failure-detection-gauge v-if=\"print.prediction_json_url\" :normalized-p=\"normalizedP\" />\n          <div v-if=\"!isPublic\" class=\"feedback-section\">\n            <div class=\"text-center py-2 px-3\">\n              <div class=\"lead\" :class=\"[print.alerted_at ? 'text-danger' : 'text-success']\">\n                {{ print.alerted_at ? 'Failure detected' : 'No failure detected' }}\n              </div>\n              <div class=\"py-2\">\n                {{$t(\"Did we get it right?\")}}\n                <b-button\n                  :variant=\"thumbedUp ? 'primary' : 'outline'\"\n                  class=\"mx-2 btn-sm\"\n                  @click=\"onThumbUpClick\"\n                >\n                  <b-spinner v-if=\"inflightAlertOverwrite\" type=\"grow\" small></b-spinner>\n                  <i v-else class=\"fas fa-thumbs-up\"></i>\n                </b-button>\n                <b-button\n                  :variant=\"thumbedDown ? 'primary' : 'outline'\"\n                  class=\"mx-2 btn-sm\"\n                  @click=\"onThumbDownClick\"\n                >\n                  <b-spinner v-if=\"inflightAlertOverwrite\" type=\"grow\" small></b-spinner>\n                  <i v-else class=\"fas fa-thumbs-down\"></i>\n                </b-button>\n              </div>\n              <transition name=\"bounce\">\n                <div v-if=\"print.printShotFeedbackEligible\" class=\"pt-2\">\n                  <a\n                    role=\"button\"\n                    class=\"btn btn-sm btn-outline-primary px-4\"\n                    :href=\"focusedFeedbackLink\"\n                  >\n                    F\n                    <i class=\"fas fa-search focused-feedback-icon\"></i>{{$t(\"CUSED FEEDBACK\")}}\n                    <svg\n                      v-if=\"print.need_print_shot_feedback\"\n                      class=\"seg-control-icon ml-1 double-hours-icon\"\n                    >\n                      <use href=\"#svg-hour-double\" />\n                    </svg>\n                  </a>\n                </div>\n              </transition>\n            </div>\n            <div class=\"text-muted py-2 px-3 help-text\">\n              <small v-if=\"print.printShotFeedbackEligible\">\n                <span v-if=\"!print.need_print_shot_feedback\"\n                  >{{$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\")}}</span\n                >\n                <span v-else> {{$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\")}}\n                  <a\n                    :href=\"getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback')\"\n                    >{{ $t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\") }}</a\n                  >.\n                </span>\n              </small>\n\n              <small v-else>\n                {{$t(\"Every time you give us feedback,\")}}\n                <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                  >{{ $t(\"you help us get better at detecting failures\") }}</a\n                >.\n              </small>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport { getNormalizedP } from '@src/lib/utils'\nimport urls from '@config/server-urls'\nimport VideoBox from '@src/components/VideoBox'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport DetectiveWorking from '@src/components/DetectiveWorking'\n\nexport default {\n  name: 'PrintCard',\n\n  components: {\n    VideoBox,\n    FailureDetectionGauge,\n    DetectiveWorking,\n  },\n\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n    isPublic: {\n      type: Boolean,\n      default: false,\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data: function () {\n    return {\n      ALERT_THRESHOLD: 0.4,\n      currentPosition: 0,\n      predictions: [],\n      selectedCardView: 'detective',\n      inflightAlertOverwrite: null,\n      isSelected: this.selected,\n    }\n  },\n\n  computed: {\n    wasTimelapseUploaded() {\n      return this.print.uploaded_at !== null\n    },\n\n    endStatus() {\n      return this.print.cancelled_at ? `${this.$i18next.t('(Cancelled)')}` : ''\n    },\n\n    duration() {\n      return this.print.ended_at && this.print.started_at\n        ? moment.duration(this.print.ended_at.diff(this.print.started_at))\n        : null\n    },\n\n    canShowDetectiveView() {\n      if (this.print.prediction_json_url !== null && this.print.tagged_video_url !== null) {\n        return true\n      }\n      // Time-lapses that was uploaded within the past 24 hours are presumably still be processed\n      if (this.print.uploaded_at && moment().diff(this.print.uploaded_at, 'hours') < 24) {\n        return true\n      }\n      return false\n    },\n\n    cardView() {\n      return this.canShowDetectiveView ? this.selectedCardView : 'info'\n    },\n\n    videoUrl() {\n      return this.cardView == 'info' ? this.print.video_url : this.print.tagged_video_url\n    },\n\n    thumbedUp() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'NOT_FAILED')\n    },\n\n    thumbedDown() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'FAILED')\n    },\n\n    focusedFeedbackLink() {\n      return `/prints/shot-feedback/${this.print.id}/`\n    },\n\n    hasSelectedChangedListener() {\n      return Boolean(this.$listeners && this.$listeners.selectedChanged)\n    },\n\n    hasFullscreenListener() {\n      return Boolean(this.$listeners && this.$listeners.fullscreen)\n    },\n\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, this.isPublic)\n    },\n\n    posterSrc() {\n      return this.print.poster_url || '#svg-3d-printer'\n    },\n  },\n\n  watch: {\n    isSelected(newValue) {\n      this.$emit('selectedChanged', this.print.id, newValue)\n    },\n  },\n\n  mounted() {\n    if (this.print.prediction_json_url) {\n      this.fetchPredictions()\n    }\n\n    if (!this.print.tagged_video_url) {\n      this.selectedCardView = 'info'\n    }\n  },\n\n  methods: {\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n\n    deleteVideo() {\n      axios.delete(urls.print(this.print.id)).then(() => {\n        this.$emit('printDeleted', this.print.id)\n      })\n    },\n\n    onThumbUpClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'FAILED' : 'NOT_FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n\n    onThumbDownClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'NOT_FAILED' : 'FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n\n    alertOverwrite(value) {\n      axios\n        .patch(urls.print(this.print.id), {\n          alert_overwrite: value,\n        })\n        .then((response) => {\n          this.$emit('printDataChanged', response.data)\n          this.inflightAlertOverwrite = null\n        })\n    },\n\n    fetchPredictions() {\n      axios.get(this.print.prediction_json_url).then((response) => {\n        this.predictions = response.data\n      })\n    },\n\n    humanizedPrintedOrUploadedTime(longFormat = false) {\n      if (!this.print.uploaded_at && !this.print.ended_at) {\n        return '-'\n      }\n      const ts = this.wasTimelapseUploaded ? this.print.uploaded_at : this.print.ended_at\n      if (longFormat) {\n        return ts.format('LLLL')\n      } else {\n        return ts.fromNow()\n      }\n    },\n    showVideoArchivedDescription(event) {\n      event.preventDefault()\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Time-lapse video deleted')}`,\n        html: `\n          <p>${this.$i18next.t(\"Time-lapse videos older than 6-months are deleted from the {brandName} app server as they are rarely needed and cost significant amount to store in the cloud.\",{brandName:this.$syndicateText.brandName})}</p>\n          <p>${this.$i18next.t(\"If you are a Pro subscriber and you don't want your time-lapse videos to be deleted, please \")}<a href=\"mailto:support@obico.io?subject=Please%20keep%20my%20timelapse%20videos\">${this.$i18next.t(\"contact us\")}</a>.</p>\n          `,\n        showCloseButton: true,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.print-card\n  margin-top: var(--gap-between-blocks)\n\n  .card\n    border-radius: var(--border-radius-lg)\n    overflow: hidden\n\n.card-header\n  display: flex\n  flex-flow: row nowrap\n  justify-content: space-between\n  align-items: center\n\n.seg-control-icon\n  height: 1.2rem\n  width: 1.2rem\n  &.double-hours-icon\n    width: 1.5rem\n\n.feedback-section\n  background-color: var(--color-surface-secondary)\n\n.bounce-enter-active\n  animation: bounce-in .5s\n\n.bounce-leave-active\n  animation: bounce-in .5s reverse\n\n@keyframes bounce-in\n  0%\n    transform: scale(0)\n  50%\n    transform: scale(1.5)\n  100%\n    transform: scale(1)\n\n.help-text\n  line-height: 1.2\n\n.bg-warning.alert-banner\n  position: static\n  display: block\n\n.archived-info\n  position: absolute\n  width: 100%\n  z-index: 10\n  bottom: 0\n  left: 0\n  background-color: rgba(0,0,0,.6)\n  text-align: center\n  padding: 10px 0\n\n::v-deep .vjs-poster, ::v-deep .video-js\n  background-color: #000\n\n.poster-placeholder-wrapper\n  height: 250px\n  background-color: #000\n\n  .poster-placeholder\n    $size: 100px\n    color: rgb(255 255 255 / .2)\n    width: $size\n    height: $size\n    position: absolute\n    left: calc(50% - $size / 2)\n    top: calc(50% - $size / 2 - 20px)\n\ni.fas\n  width: 1em\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintCard.vue?vue&type=template&id=514d0214&scoped=true&\"\nimport script from \"./PrintCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintCard.vue?vue&type=style&index=0&id=514d0214&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"514d0214\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('video-box',{attrs:{\"video-url\":_vm.videoUrl,\"poster-url\":_vm.print.poster_url,\"fluid\":false,\"autoplay\":_vm.autoplay,\"fullscreen-btn\":false},on:{\"timeupdate\":_vm.onTimeUpdate}}),(_vm.isPublic)?_c('div',{staticClass:\"bg-warning alert-banner text-center\",style:({ opacity: _vm.normalizedP > 0.4 ? 1 : 0 })},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Possible failure detected!\"))+\" \")]):_vm._e(),_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <video-box\n      :video-url=\"videoUrl\"\n      :poster-url=\"print.poster_url\"\n      :fluid=\"false\"\n      :autoplay=\"autoplay\"\n      :fullscreen-btn=\"false\"\n      @timeupdate=\"onTimeUpdate\"\n    />\n\n    <div\n      v-if=\"isPublic\"\n      :style=\"{ opacity: normalizedP > 0.4 ? 1 : 0 }\"\n      class=\"bg-warning alert-banner text-center\"\n    >\n      <i class=\"fas fa-exclamation-triangle\"></i> {{$t(\"Possible failure detected!\")}}\n    </div>\n\n    <failure-detection-gauge :normalized-p=\"normalizedP\" />\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport { getNormalizedP } from '@src/lib/utils'\nimport VideoBox from '@src/components/VideoBox'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\n\nexport default {\n  name: 'FullScreenPrintCard',\n  components: {\n    VideoBox,\n    FailureDetectionGauge,\n  },\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n    videoUrl: {\n      type: String,\n      required: true,\n    },\n    initialPosition: {\n      type: Number,\n      default: () => 0,\n    },\n    autoplay: {\n      type: Boolean,\n      default: () => false,\n    },\n    isPublic: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  data() {\n    return {\n      currentPosition: 0,\n      predictions: [],\n    }\n  },\n  computed: {\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, this.isPublic)\n    },\n  },\n  mounted() {\n    if (this.print.prediction_json_url) {\n      this.fetchPredictions()\n    }\n  },\n  methods: {\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n\n    fetchPredictions() {\n      axios.get(this.print.prediction_json_url).then((response) => {\n        this.predictions = response.data\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.bg-warning.alert-banner\n  position: static\n  display: block\n  padding: 0.3rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FullScreenPrintCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FullScreenPrintCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FullScreenPrintCard.vue?vue&type=template&id=be9465e8&scoped=true&\"\nimport script from \"./FullScreenPrintCard.vue?vue&type=script&lang=js&\"\nexport * from \"./FullScreenPrintCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FullScreenPrintCard.vue?vue&type=style&index=0&id=be9465e8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"be9465e8\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <nav-bar view-name=\"publictimelapse_list\"></nav-bar>\n\n    <div id=\"content-wrapper\" class=\"container\">\n      <div class=\"timelapse-gallery\">\n        <!-- Header -->\n        <div class=\"row\">\n          <div class=\"col-sm-12 text-center\">\n            <h1>{{ $t('The Spaghetti Gallery') }}</h1>\n          </div>\n        </div>\n        <!-- Timelapses -->\n        <div class=\"row\">\n          <print-card\n            v-for=\"timelapse of pageTimelapses\"\n            :key=\"timelapse.id\"\n            :print=\"timelapse\"\n            :is-public=\"true\"\n            @fullscreen=\"openFullScreen\"\n          ></print-card>\n        </div>\n\n        <!-- Timelapses loader on scroll down -->\n        <mugen-scroll :handler=\"fetchMoreData\" :should-handle=\"!loading\" class=\"text-center p-4\">\n          <div v-if=\"noMoreData\" class=\"text-center p-2\">\n            {{ $t('End of public time-lapse list.') }}\n          </div>\n          <b-spinner v-if=\"!noMoreData\" :label=\"$t('Loading...')\"></b-spinner>\n        </mugen-scroll>\n\n        <!-- Full-screen timelapse -->\n        <b-modal\n          id=\"tl-fullscreen-modal\"\n          size=\"full\"\n          :title=\"fullScreenPrintTitle\"\n          :hide-footer=\"true\"\n          @hidden=\"fullScreenClosed\"\n        >\n          <full-screen-print-card\n            :print=\"fullScreenPrint\"\n            :video-url=\"fullScreenPrintVideoUrl\"\n            :autoplay=\"true\"\n            :is-public=\"true\"\n          />\n        </b-modal>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport NavBar from '@src/components/NavBar.vue'\nimport PrintCard from '@src/components/prints/PrintCard.vue'\nimport FullScreenPrintCard from '@src/components/prints/FullScreenPrintCard.vue'\nimport findIndex from 'lodash/findIndex'\nimport MugenScroll from 'vue-mugen-scroll'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'PublicTimelapsesPage',\n\n  components: {\n    NavBar,\n    PrintCard,\n    FullScreenPrintCard,\n    MugenScroll,\n  },\n\n  data() {\n    return {\n      perLoad: 6,\n      loadsNumber: 1,\n      timelapses: [],\n      fullScreenPrint: null,\n      fullScreenPrintVideoUrl: null,\n      noMoreData: false,\n      loading: false,\n    }\n  },\n\n  computed: {\n    pageTimelapses() {\n      const end = (this.loadsNumber - 1) * this.perLoad + this.perLoad\n      return this.timelapses.slice(0, end)\n    },\n\n    fullScreenPrintTitle() {\n      if (this.fullScreenPrint) {\n        return `- By ${this.fullScreenPrint.creator_name}`\n      }\n\n      return ''\n    },\n  },\n\n  created() {\n    axios.get(urls.publicTimelapses()).then((response) => {\n      for (const timelapse of response.data) {\n        this.timelapses.push(this.adaptTimelapseToPrint(timelapse))\n      }\n    })\n  },\n\n  methods: {\n    openFullScreen(printId, videoUrl) {\n      const i = findIndex(this.timelapses, (p) => p.id == printId)\n      if (i != -1) {\n        this.fullScreenPrint = this.timelapses[i]\n        this.fullScreenPrintVideoUrl = videoUrl\n        this.$bvModal.show('tl-fullscreen-modal')\n      }\n    },\n\n    fullScreenClosed() {\n      this.fullScreenPrint = null\n      this.fullScreenPrintVideoUrl = null\n    },\n\n    fetchMoreData() {\n      if (this.noMoreData) {\n        return\n      }\n\n      this.loading = true\n      setTimeout(() => {\n        this.loadsNumber++\n        this.loading = false\n        if (this.timelapses.length <= this.loadsNumber * this.perLoad) {\n          this.noMoreData = true\n        }\n      }, 500)\n    },\n\n    // TODO: remove after API fix\n    adaptTimelapseToPrint(timelapse) {\n      timelapse.prediction_json_url = timelapse.p_json_url\n      delete timelapse.p_json_url\n      return timelapse\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n::v-deep .pagination-wrapper button\n  border-radius: 0\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PublicTimelapsesPage.vue?vue&type=template&id=3118e4a9&scoped=true&\"\nimport script from \"./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PublicTimelapsesPage.vue?vue&type=style&index=0&id=3118e4a9&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3118e4a9\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('nav-bar',{attrs:{\"view-name\":\"timelapse_upload\"}}),_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"timelapse-upload\"},[_c('div',{staticClass:\"hero-section text-center\"},[_c('h1',{staticClass:\"hero-title\"},[_c('i',{staticClass:\"fas fa-magic\"}),_vm._v(\" \"+_vm._s(_vm.$t('The Spaghetti Detective (Re-)Invented'))+\" \")]),_c('p',{staticClass:\"hero-subtitle\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"Back in 2020, we pioneered AI-powered failure detection for 3D printing. We called it 'The Spaghetti Detective'. Today, we're reinventing it with a next-generation AI model that's more accurate and smarter.\" ))+\" \")]),_c('div',{staticClass:\"hero-cta\"},[_c('div',{staticClass:\"announcement-badge\"},[_c('i',{staticClass:\"fas fa-rocket\"}),_vm._v(\" \"+_vm._s(_vm.$t('The next-gen AI failure detection technology is now live for everyone!'))+\" \")]),_c('a',{staticClass:\"learn-more-link\",attrs:{\"href\":\"https://www.obico.io/blog/next-gen-ai-failure-detection-general-release/\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Read the announcement'))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]),_c('div',{staticClass:\"video-upload-row\"},[_c('div',{staticClass:\"upload-section\"},[_c('div',{staticClass:\"upload-card\"},[_c('h2',{staticClass:\"section-heading\"},[_vm._v(_vm._s(_vm.$t('Try It Now: Upload Your Time-lapse')))]),_c('p',{staticClass:\"upload-intro\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Already have a time-lapse? Test our new AI right away and see the difference.' ))+\" \")]),_c('vue-dropzone',{ref:\"dropzone\",staticClass:\"upload-dropzone\",attrs:{\"id\":\"dropzone\",\"options\":_vm.dropzoneOptions,\"use-custom-slot\":true},on:{\"vdropzone-success\":_vm.onUploadSuccess,\"vdropzone-error\":_vm.onUploadError}},[_c('div',{staticClass:\"dropzone-content\"},[_c('div',{staticClass:\"upload-icon\"},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('p',{staticClass:\"upload-text\"},[_vm._v(_vm._s(_vm.$t('Drag and drop your time-lapse video here')))]),_c('p',{staticClass:\"upload-or\"},[_vm._v(_vm._s(_vm.$t('or')))]),_c('button',{staticClass:\"btn btn-outline-secondary browse-btn\",attrs:{\"type\":\"button\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Browse Files'))+\" \")]),_c('p',{staticClass:\"upload-formats\"},[_vm._v(\" \"+_vm._s(_vm.$t('*.mp4 or *.mpg files only. Up to 100MB each.'))+\" \")])])])],1)]),_c('div',{staticClass:\"video-section\"},[_c('h2',{staticClass:\"section-heading\"},[_vm._v(_vm._s(_vm.$t('See the Difference')))]),_vm._m(0),_c('p',{staticClass:\"video-caption text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t('Watch how to capture your time-lapse and see our old vs. new AI in action'))+\" \")])])]),_c('hr',{staticClass:\"section-divider\"}),_c('div',{staticClass:\"analyses-section\"},[_c('h2',{staticClass:\"section-heading\"},[_vm._v(_vm._s(_vm.$t('Your Analyses')))]),(_vm.timelapses.length === 0)?_c('div',{staticClass:\"empty-state text-center\"},[_c('i',{staticClass:\"fas fa-film empty-icon\"}),_c('p',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t('No timelapses uploaded yet. Upload one above to get started.'))+\" \")])]):_c('div',{staticClass:\"analyses-grid\"},_vm._l((_vm.timelapses),function(timelapse){return _c('div',{key:timelapse.id,staticClass:\"analysis-card\",class:{ clickable: timelapse.status === 'completed' },on:{\"click\":function($event){return _vm.openTimelapse(timelapse)}}},[_c('div',{staticClass:\"card-thumbnail\"},[(timelapse.poster_url)?_c('img',{staticClass:\"poster-img\",attrs:{\"src\":timelapse.poster_url,\"alt\":timelapse.filename}}):_c('i',{staticClass:\"fas fa-clock thumbnail-icon\"}),(timelapse.status === 'completed')?_c('div',{staticClass:\"play-overlay\"},[_c('i',{staticClass:\"fas fa-play-circle play-icon\"})]):_vm._e(),(timelapse.issue_severity)?_c('div',{staticClass:\"issues-badge\"},[_vm._v(\" \"+_vm._s(_vm.$t('Issues Detected!'))+\" \")]):_vm._e()]),_c('div',{staticClass:\"card-info\"},[_c('div',{staticClass:\"card-filename truncated\",attrs:{\"title\":timelapse.filename}},[_vm._v(\" \"+_vm._s(timelapse.filename)+\" \")]),_c('div',{staticClass:\"card-date text-muted\"},[_c('i',{staticClass:\"far fa-clock\"}),_vm._v(\" \"+_vm._s(_vm.formatDate(timelapse.created_at))+\" \")]),_c('div',{staticClass:\"card-status\",class:_vm.statusClass(timelapse)},[_c('i',{class:_vm.statusIcon(timelapse)}),_vm._v(\" \"+_vm._s(_vm.statusText(timelapse))+\" \")])])])}),0)]),_c('b-modal',{attrs:{\"id\":\"results-modal\",\"size\":\"xl\",\"title\":_vm.selectedTimelapse ? _vm.selectedTimelapse.filename : '',\"hide-footer\":true},on:{\"hidden\":_vm.onModalHidden}},[(_vm.selectedTimelapse)?_c('div',{staticClass:\"timelapse-viewer\"},[_c('b-tabs',{attrs:{\"content-class\":\"mt-3\"},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},[_c('b-tab',{attrs:{\"title\":_vm.$t('Detective Time-Lapse'),\"active\":\"\"}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[(_vm.selectedTimelapse.tagged_video_url)?_c('video-box',{attrs:{\"video-url\":_vm.selectedTimelapse.tagged_video_url,\"poster-url\":_vm.selectedTimelapse.poster_url,\"fluid\":false,\"autoplay\":false,\"fullscreen-btn\":false},on:{\"timeupdate\":_vm.onTimeUpdate}}):_vm._e()],1)]),(_vm.warningTriggered)?_c('div',{staticClass:\"alert alert-warning text-center mt-3\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t('Possible failure detected!'))+\" \")]):_vm._e(),_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}})],1),_c('b-tab',{attrs:{\"title\":_vm.$t('Original Time-Lapse')}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[(_vm.selectedTimelapse.original_video_url)?_c('video-box',{attrs:{\"video-url\":_vm.selectedTimelapse.original_video_url,\"poster-url\":_vm.selectedTimelapse.poster_url,\"fluid\":false,\"autoplay\":false,\"fullscreen-btn\":false}}):_vm._e()],1)])])],1)],1):_vm._e()])],1)])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"video-wrapper\"},[_c('iframe',{attrs:{\"src\":\"https://www.youtube.com/embed/lASpilGUKKs?rel=0\",\"title\":\"Spaghetti Detective 2nd Gen Demo\",\"frameborder\":\"0\",\"allow\":\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\",\"referrerpolicy\":\"strict-origin-when-cross-origin\",\"allowfullscreen\":\"\"}})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <nav-bar view-name=\"timelapse_upload\"></nav-bar>\n\n    <div id=\"content-wrapper\" class=\"container\">\n      <div class=\"timelapse-upload\">\n        <!-- Hero Section -->\n        <div class=\"hero-section text-center\">\n          <h1 class=\"hero-title\">\n            <i class=\"fas fa-magic\"></i>\n            {{ $t('The Spaghetti Detective (Re-)Invented') }}\n          </h1>\n          <p class=\"hero-subtitle\">\n            {{\n              $t(\n                \"Back in 2020, we pioneered AI-powered failure detection for 3D printing. We called it 'The Spaghetti Detective'. Today, we're reinventing it with a next-generation AI model that's more accurate and smarter.\"\n              )\n            }}\n          </p>\n          <div class=\"hero-cta\">\n            <div class=\"announcement-badge\">\n              <i class=\"fas fa-rocket\"></i>\n              {{ $t('The next-gen AI failure detection technology is now live for everyone!') }}\n            </div>\n            <a\n              href=\"https://www.obico.io/blog/next-gen-ai-failure-detection-general-release/\"\n              class=\"learn-more-link\"\n              target=\"_blank\"\n              rel=\"noopener\"\n            >\n              {{ $t('Read the announcement') }}\n              <i class=\"fas fa-external-link-alt\"></i>\n            </a>\n          </div>\n        </div>\n\n        <!-- Video and Upload Row -->\n        <div class=\"video-upload-row\">\n          <!-- Upload Section (Left) -->\n          <div class=\"upload-section\">\n            <div class=\"upload-card\">\n              <h2 class=\"section-heading\">{{ $t('Try It Now: Upload Your Time-lapse') }}</h2>\n              <p class=\"upload-intro\">\n                {{\n                  $t(\n                    'Already have a time-lapse? Test our new AI right away and see the difference.'\n                  )\n                }}\n              </p>\n              <vue-dropzone\n                id=\"dropzone\"\n                ref=\"dropzone\"\n                class=\"upload-dropzone\"\n                :options=\"dropzoneOptions\"\n                :use-custom-slot=\"true\"\n                @vdropzone-success=\"onUploadSuccess\"\n                @vdropzone-error=\"onUploadError\"\n              >\n                <div class=\"dropzone-content\">\n                  <div class=\"upload-icon\">\n                    <i class=\"fas fa-arrow-up\"></i>\n                  </div>\n                  <p class=\"upload-text\">{{ $t('Drag and drop your time-lapse video here') }}</p>\n                  <p class=\"upload-or\">{{ $t('or') }}</p>\n                  <button type=\"button\" class=\"btn btn-outline-secondary browse-btn\">\n                    {{ $t('Browse Files') }}\n                  </button>\n                  <p class=\"upload-formats\">\n                    {{ $t('*.mp4 or *.mpg files only. Up to 100MB each.') }}\n                  </p>\n                </div>\n              </vue-dropzone>\n            </div>\n          </div>\n\n          <!-- YouTube Video Section (Right) -->\n          <div class=\"video-section\">\n            <h2 class=\"section-heading\">{{ $t('See the Difference') }}</h2>\n            <div class=\"video-wrapper\">\n              <iframe\n                src=\"https://www.youtube.com/embed/lASpilGUKKs?rel=0\"\n                title=\"Spaghetti Detective 2nd Gen Demo\"\n                frameborder=\"0\"\n                allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                referrerpolicy=\"strict-origin-when-cross-origin\"\n                allowfullscreen\n              ></iframe>\n            </div>\n            <p class=\"video-caption text-muted\">\n              {{ $t('Watch how to capture your time-lapse and see our old vs. new AI in action') }}\n            </p>\n          </div>\n        </div>\n\n        <hr class=\"section-divider\" />\n\n        <!-- Your Analyses Section -->\n        <div class=\"analyses-section\">\n          <h2 class=\"section-heading\">{{ $t('Your Analyses') }}</h2>\n\n          <div v-if=\"timelapses.length === 0\" class=\"empty-state text-center\">\n            <i class=\"fas fa-film empty-icon\"></i>\n            <p class=\"text-muted\">\n              {{ $t('No timelapses uploaded yet. Upload one above to get started.') }}\n            </p>\n          </div>\n\n          <div v-else class=\"analyses-grid\">\n            <div\n              v-for=\"timelapse in timelapses\"\n              :key=\"timelapse.id\"\n              class=\"analysis-card\"\n              :class=\"{ clickable: timelapse.status === 'completed' }\"\n              @click=\"openTimelapse(timelapse)\"\n            >\n              <!-- Thumbnail Area -->\n              <div class=\"card-thumbnail\">\n                <img\n                  v-if=\"timelapse.poster_url\"\n                  :src=\"timelapse.poster_url\"\n                  :alt=\"timelapse.filename\"\n                  class=\"poster-img\"\n                />\n                <i v-else class=\"fas fa-clock thumbnail-icon\"></i>\n                <!-- Play Button Overlay -->\n                <div v-if=\"timelapse.status === 'completed'\" class=\"play-overlay\">\n                  <i class=\"fas fa-play-circle play-icon\"></i>\n                </div>\n                <!-- Issues Badge -->\n                <div v-if=\"timelapse.issue_severity\" class=\"issues-badge\">\n                  {{ $t('Issues Detected!') }}\n                </div>\n              </div>\n\n              <!-- Card Info -->\n              <div class=\"card-info\">\n                <div class=\"card-filename truncated\" :title=\"timelapse.filename\">\n                  {{ timelapse.filename }}\n                </div>\n                <div class=\"card-date text-muted\">\n                  <i class=\"far fa-clock\"></i>\n                  {{ formatDate(timelapse.created_at) }}\n                </div>\n                <div class=\"card-status\" :class=\"statusClass(timelapse)\">\n                  <i :class=\"statusIcon(timelapse)\"></i>\n                  {{ statusText(timelapse) }}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Results Modal -->\n        <b-modal\n          id=\"results-modal\"\n          size=\"xl\"\n          :title=\"selectedTimelapse ? selectedTimelapse.filename : ''\"\n          :hide-footer=\"true\"\n          @hidden=\"onModalHidden\"\n        >\n          <div v-if=\"selectedTimelapse\" class=\"timelapse-viewer\">\n            <!-- Video Type Tabs -->\n            <b-tabs v-model=\"activeTab\" content-class=\"mt-3\">\n              <b-tab :title=\"$t('Detective Time-Lapse')\" active>\n                <div class=\"row\">\n                  <div class=\"col-12\">\n                    <video-box\n                      v-if=\"selectedTimelapse.tagged_video_url\"\n                      :video-url=\"selectedTimelapse.tagged_video_url\"\n                      :poster-url=\"selectedTimelapse.poster_url\"\n                      :fluid=\"false\"\n                      :autoplay=\"false\"\n                      :fullscreen-btn=\"false\"\n                      @timeupdate=\"onTimeUpdate\"\n                    />\n                  </div>\n                </div>\n                <div v-if=\"warningTriggered\" class=\"alert alert-warning text-center mt-3\">\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  {{ $t('Possible failure detected!') }}\n                </div>\n                <failure-detection-gauge :normalized-p=\"normalizedP\" />\n              </b-tab>\n              <b-tab :title=\"$t('Original Time-Lapse')\">\n                <div class=\"row\">\n                  <div class=\"col-12\">\n                    <video-box\n                      v-if=\"selectedTimelapse.original_video_url\"\n                      :video-url=\"selectedTimelapse.original_video_url\"\n                      :poster-url=\"selectedTimelapse.poster_url\"\n                      :fluid=\"false\"\n                      :autoplay=\"false\"\n                      :fullscreen-btn=\"false\"\n                    />\n                  </div>\n                </div>\n              </b-tab>\n            </b-tabs>\n          </div>\n        </b-modal>\n\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport vue2Dropzone from 'vue2-dropzone'\nimport 'vue2-dropzone/dist/vue2Dropzone.min.css'\nimport NavBar from '@src/components/NavBar.vue'\nimport VideoBox from '@src/components/VideoBox.vue'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge.vue'\nimport { getNormalizedP } from '@src/lib/utils'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'TimelapseUploadPage',\n\n  components: {\n    NavBar,\n    VideoBox,\n    FailureDetectionGauge,\n    vueDropzone: vue2Dropzone,\n  },\n\n  props: {\n    csrf: {\n      type: String,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data() {\n    return {\n      dropzoneOptions: {\n        withCredentials: true,\n        maxFilesize: 100, // MB\n        timeout: 60 * 60 * 1000, // 1 hour for large files\n        acceptedFiles: 'video/mp4,video/mpeg',\n        url: urls.uploadedTimelapses(),\n        headers: { 'X-CSRFToken': this.csrf },\n        paramName: 'file',\n      },\n      timelapses: [],\n      selectedTimelapse: null,\n      pollInterval: null,\n      activeTab: 0,\n      currentPosition: 0,\n      predictions: [],\n      warningTriggered: false,\n    }\n  },\n\n  computed: {\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, true)\n    },\n  },\n\n  watch: {\n    normalizedP(newVal) {\n      if (newVal > 0.33) {\n        this.warningTriggered = true\n      }\n    },\n  },\n\n  created() {\n    if (this.isAuthenticated) {\n      this.fetchTimelapses()\n      this.pollInterval = setInterval(this.fetchTimelapses, 10000)\n    }\n  },\n\n  beforeDestroy() {\n    if (this.pollInterval) {\n      clearInterval(this.pollInterval)\n    }\n  },\n\n  methods: {\n    computeIssueFromPredictions(predictions) {\n      const MINOR_THRESHOLD = 0.33\n      const MAJOR_THRESHOLD = 0.66\n      let firstIssueFrame = null\n      let issueSeverity = null\n\n      for (const pred of predictions) {\n        if (firstIssueFrame === null) {\n          if (pred.p >= MAJOR_THRESHOLD) {\n            firstIssueFrame = pred.frame\n            issueSeverity = 'major'\n          } else if (pred.p >= MINOR_THRESHOLD) {\n            firstIssueFrame = pred.frame\n            issueSeverity = 'minor'\n          }\n        } else if (issueSeverity === 'minor' && pred.p >= MAJOR_THRESHOLD) {\n          issueSeverity = 'major'\n        }\n      }\n      return { firstIssueFrame, issueSeverity }\n    },\n\n    fetchTimelapses() {\n      axios.get(urls.uploadedTimelapses()).then((response) => {\n        this.timelapses = response.data\n        // Compute issue values from predictions (not stored in DB, computed client-side)\n        this.timelapses.forEach((timelapse) => {\n          if (timelapse.status === 'completed' && timelapse.predictions_json_url) {\n            axios.get(timelapse.predictions_json_url).then((predResponse) => {\n              const { firstIssueFrame, issueSeverity } = this.computeIssueFromPredictions(\n                predResponse.data\n              )\n              this.$set(timelapse, 'first_issue_frame', firstIssueFrame)\n              this.$set(timelapse, 'issue_severity', issueSeverity)\n            })\n          }\n        })\n      })\n    },\n\n    onUploadSuccess(file) {\n      this.$refs.dropzone.removeFile(file)\n      this.fetchTimelapses()\n    },\n\n    onUploadError(file, message) {\n      console.error('Upload failed:', message)\n      alert(this.$t('Upload failed. Please try again.'))\n    },\n\n    openTimelapse(timelapse) {\n      if (timelapse.status !== 'completed') return\n\n      this.selectedTimelapse = timelapse\n      this.currentPosition = 0\n      this.predictions = []\n      this.activeTab = 0\n      this.warningTriggered = false\n\n      // Fetch predictions for gauge\n      if (timelapse.predictions_json_url) {\n        axios.get(timelapse.predictions_json_url).then((response) => {\n          this.predictions = response.data\n        })\n      }\n\n      this.$bvModal.show('results-modal')\n    },\n\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n\n    onModalHidden() {\n      this.selectedTimelapse = null\n      this.predictions = []\n      this.currentPosition = 0\n      this.warningTriggered = false\n    },\n\n    formatDate(dateString) {\n      const date = new Date(dateString)\n      return date.toLocaleDateString(undefined, {\n        month: 'numeric',\n        day: 'numeric',\n        year: 'numeric',\n      })\n    },\n\n    statusClass(timelapse) {\n      if (timelapse.status === 'completed') {\n        if (timelapse.issue_severity === 'major') return 'major-issue'\n        if (timelapse.issue_severity === 'minor') return 'minor-issue'\n        return 'no-issue'\n      }\n      if (timelapse.status === 'processing') return 'processing'\n      if (timelapse.status === 'failed') return 'failed'\n      return 'pending'\n    },\n\n    statusIcon(timelapse) {\n      if (timelapse.status === 'completed') {\n        if (timelapse.issue_severity) return 'fas fa-exclamation-triangle'\n        return 'fas fa-check-circle'\n      }\n      if (timelapse.status === 'processing') return 'fas fa-spinner fa-spin'\n      if (timelapse.status === 'failed') return 'fas fa-times-circle'\n      return 'far fa-clock'\n    },\n\n    statusText(timelapse) {\n      if (timelapse.status === 'completed') {\n        if (timelapse.issue_severity === 'major') {\n          return `${this.$t('Major problems at frame')} #${timelapse.first_issue_frame}`\n        }\n        if (timelapse.issue_severity === 'minor') {\n          return `${this.$t('Minor problems at frame')} #${timelapse.first_issue_frame}`\n        }\n        return this.$t('No problems detected')\n      }\n      if (timelapse.status === 'processing') return this.$t('Processing...')\n      if (timelapse.status === 'failed') return this.$t('Processing failed')\n      return this.$t('Pending...')\n    },\n\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.timelapse-upload\n  padding: 2rem 0\n  max-width: 1100px\n  margin: 0 auto\n\n// Hero Section\n.hero-section\n  padding: 1rem 0 2rem\n\n.hero-title\n  font-size: 2rem\n  font-weight: bold\n  margin-bottom: 1rem\n  i\n    color: var(--color-primary)\n    margin-right: 0.5rem\n\n.hero-subtitle\n  color: var(--color-text-secondary)\n  font-size: 1rem\n  line-height: 1.6\n  max-width: 800px\n  margin: 0 auto\n\n.hero-cta\n  margin-top: 1.5rem\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: 0.75rem\n\n.learn-more-link\n  color: var(--color-text-secondary)\n  font-size: 0.875rem\n  text-decoration: none\n  display: inline-flex\n  align-items: center\n  gap: 0.375rem\n  &:hover\n    color: var(--color-primary)\n    text-decoration: underline\n  i\n    font-size: 0.75rem\n\n// Section Divider\n.section-divider\n  border: none\n  border-top: 1px solid var(--color-divider-muted)\n  margin: 2rem 0\n\n// Section Heading\n.section-heading\n  font-size: 1.25rem\n  font-weight: bold\n  margin-bottom: 1rem\n\n// Video and Upload Row\n.video-upload-row\n  display: grid\n  grid-template-columns: 1fr 1fr\n  gap: 2rem\n  align-items: start\n  @media (max-width: 768px)\n    grid-template-columns: 1fr\n    gap: 2rem\n\n// Upload Section (Left)\n.upload-section\n  padding: 0\n\n.upload-card\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  padding: 1.5rem\n\n.upload-intro\n  color: var(--color-text-secondary)\n  font-size: 0.9375rem\n  margin-bottom: 1.25rem\n  line-height: 1.5\n\n.upload-dropzone\n  border: 2px dashed var(--color-divider)\n  border-radius: var(--border-radius-md)\n  background: transparent\n  padding: 2rem 1.5rem\n  text-align: center\n  cursor: pointer\n  transition: border-color 0.2s, background-color 0.2s\n  &:hover\n    border-color: var(--color-primary)\n    background: var(--color-hover)\n\n// Video Section (Right)\n.video-section\n  padding: 0\n\n.video-wrapper\n  position: relative\n  width: 100%\n  padding-bottom: 56.25% // 16:9 aspect ratio\n  background: var(--color-surface-primary)\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  iframe\n    position: absolute\n    top: 0\n    left: 0\n    width: 100%\n    height: 100%\n\n.video-caption\n  margin-top: 0.75rem\n  font-size: 0.875rem\n  line-height: 1.5\n\n.dropzone-content\n  pointer-events: none\n\n.upload-icon\n  font-size: 2rem\n  color: var(--color-text-secondary)\n  margin-bottom: 1rem\n\n.upload-text\n  font-size: 1rem\n  color: var(--color-text-primary)\n  margin-bottom: 0.5rem\n\n.upload-or\n  color: var(--color-text-secondary)\n  font-size: 0.875rem\n  margin-bottom: 0.75rem\n\n.browse-btn\n  pointer-events: none\n  padding: 0.5rem 1.5rem\n\n.upload-formats\n  font-size: 0.75rem\n  color: var(--color-text-secondary)\n  margin-top: 1rem\n  margin-bottom: 0\n\n// Analyses Section\n.analyses-section\n  padding: 0.5rem 0\n\n.empty-state\n  padding: 3rem\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n\n.empty-icon\n  font-size: 3rem\n  color: var(--color-divider)\n  margin-bottom: 1rem\n\n// Analyses Grid\n.analyses-grid\n  display: grid\n  grid-template-columns: repeat(3, 1fr)\n  gap: 1.25rem\n  @media (max-width: 992px)\n    grid-template-columns: repeat(2, 1fr)\n  @media (max-width: 576px)\n    grid-template-columns: 1fr\n\n// Analysis Card\n.analysis-card\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  position: relative\n  transition: transform 0.2s, box-shadow 0.2s\n  &.clickable\n    cursor: pointer\n    &:hover\n      transform: translateY(-2px)\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3)\n\n.card-thumbnail\n  background: var(--color-surface-primary)\n  height: 140px\n  display: flex\n  align-items: center\n  justify-content: center\n  overflow: hidden\n  position: relative\n\n.poster-img\n  width: 100%\n  height: 100%\n  object-fit: cover\n\n.thumbnail-icon\n  font-size: 3rem\n  color: var(--color-divider)\n\n.play-overlay\n  position: absolute\n  top: 0\n  left: 0\n  right: 0\n  bottom: 0\n  background: rgba(0, 0, 0, 0.2)\n  display: flex\n  align-items: center\n  justify-content: center\n  transition: background 0.2s\n\n.play-icon\n  font-size: 3.5rem\n  color: rgba(255, 255, 255, 0.8)\n  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3)\n  transition: transform 0.2s\n\n.issues-badge\n  position: absolute\n  top: 0.5rem\n  right: 0.5rem\n  background: var(--color-danger)\n  color: white\n  font-size: 0.75rem\n  font-weight: bold\n  padding: 0.25rem 0.625rem\n  border-radius: var(--border-radius-sm)\n\n.analysis-card.clickable:hover\n  .play-overlay\n    background: rgba(0, 0, 0, 0.35)\n  .play-icon\n    transform: scale(1.1)\n\n.card-info\n  padding: 1rem\n\n.card-filename\n  font-weight: bold\n  font-size: 0.9375rem\n  margin-bottom: 0.375rem\n  white-space: nowrap\n  overflow: hidden\n  text-overflow: ellipsis\n\n.card-date\n  font-size: 0.8125rem\n  margin-bottom: 0.5rem\n  i\n    margin-right: 0.375rem\n\n.card-status\n  font-size: 0.8125rem\n  display: flex\n  align-items: center\n  gap: 0.375rem\n  &.no-issue\n    color: var(--color-success, #28a745)\n  &.minor-issue\n    color: var(--color-warning, #ffc107)\n  &.major-issue\n    color: var(--color-danger)\n  &.processing\n    color: var(--color-text-secondary)\n  &.failed\n    color: var(--color-danger)\n  &.pending\n    color: var(--color-text-secondary)\n\n// Results Modal\n.timelapse-viewer\n  .alert\n    border-radius: var(--border-radius-sm)\n\n  // Set video player height like the print page does\n  ::v-deep .video-js\n    height: calc(100vh - 350px)\n\n::v-deep .nav-tabs\n  margin-bottom: 1rem\n\n::v-deep .vue-dropzone\n  min-height: auto !important\n  .dz-message\n    margin: 0\n\n::v-deep .dz-preview\n  display: none !important\n\n// Announcement Badge\n.announcement-badge\n  display: inline-flex\n  align-items: center\n  gap: 0.5rem\n  padding: 0.625rem 1.25rem\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  color: var(--color-success, #28a745)\n  font-weight: 600\n  i\n    font-size: 1.25rem\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimelapseUploadPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimelapseUploadPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TimelapseUploadPage.vue?vue&type=template&id=3178e435&scoped=true&\"\nimport script from \"./TimelapseUploadPage.vue?vue&type=script&lang=js&\"\nexport * from \"./TimelapseUploadPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TimelapseUploadPage.vue?vue&type=style&index=0&id=3178e435&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3178e435\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[(_vm.trialDaysLeft >= 29)?_c('h3',{staticClass:\"py-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Your 30-Day {localizedDom} Free Trial Has Started!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(\"AI Premium \"+_vm._s(_vm.$t('Plan')))])]},proxy:true}],null,false,996614776)})],1):_c('h3',{staticClass:\"pt-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(\"AI Premium \"+_vm._s(_vm.$t('Plan'))+\" \")])]},proxy:true},{key:\"trialDaysLeft\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.trialDaysLeft)+\" \")]},proxy:true}])})],1),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited, 25 FPS Premium Webcam Streaming')))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('250 Hours Watched by AI for Failure Detection')))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Upload and Printing')))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"lead py-4\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Link your 3D printer now so that you can fully enjoy the 30-Day Free Trial' ))+\"! \")]),_c('div',{staticClass:\"d-flex flex-column align-center justify-content-center\"},[_c('div',{staticClass:\"mt-5\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/wizard/\"}},[_vm._v(_vm._s(_vm.$t('Link Printer')))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"It's as easy as 1-2-3\"))+\". \")])]),_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-block mx-auto\",attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t('Just Checking Out')))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t('Not a whole lot you can see without your printer linked'))+\". \")])])])])]),_c('div',{staticClass:\"footer-note small\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Not ready to start yet? {localizedDom} to pause your free trial.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\"}},[_vm._v(_vm._s(_vm.$t('Email us')))])]},proxy:true}])})],1)],1)],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row class=\"justify-content-center\">\n          <b-col>\n            <div class=\"wizard-container full-on-mobile\">\n              <b-container>\n                <b-row>\n                  <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                    <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                      <use href=\"#svg-logo-compact\" />\n                    </svg>\n                  </div>\n                </b-row>\n                <b-row>\n                  <h1 class=\"mx-auto mt-4\">\n                    {{ $t('Welcome To') }} {{ $syndicateText.brandName }}\n                  </h1>\n                </b-row>\n                <b-row>\n                  <b-col>\n                    <hr />\n                  </b-col>\n                </b-row>\n                <b-row>\n                  <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                    <h3 v-if=\"trialDaysLeft >= 29\" class=\"py-3\">\n                      <i18next\n                        :translation=\"$t('Your 30-Day {localizedDom} Free Trial Has Started!')\"\n                      >\n                        <template #localizedDom>\n                          <a class=\"link\" :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\">AI Premium {{ $t('Plan') }}</a>\n                        </template>\n                      </i18next>\n                    </h3>\n                    <h3 v-else class=\"pt-3\">\n                      <i18next\n                        :translation=\"\n                          $t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')\n                        \"\n                      >\n                        <template #localizedDom>\n                          <a\n                            class=\"link\"\n                            target=\"_blank\"\n                            :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\"\n                            >AI Premium {{ $t('Plan') }}\n                          </a>\n                        </template>\n                        <template #trialDaysLeft>\n                          {{ trialDaysLeft }}\n                        </template>\n                      </i18next>\n                    </h3>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">\n                        {{ $t('Unlimited, 25 FPS Premium Webcam Streaming') }}</span\n                      >\n                    </div>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('250 Hours Watched by AI for Failure Detection')\n                      }}</span>\n                    </div>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('G-Code Remote Upload and Printing')\n                      }}</span>\n                    </div>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                      }}</span>\n                    </div>\n                    <div class=\"lead py-4\">\n                      {{\n                        $t(\n                          'Link your 3D printer now so that you can fully enjoy the 30-Day Free Trial'\n                        )\n                      }}!\n                    </div>\n                    <div class=\"d-flex flex-column align-center justify-content-center\">\n                      <div class=\"mt-5\">\n                        <a\n                          href=\"/printers/wizard/\"\n                          class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                          >{{ $t('Link Printer') }}</a\n                        >\n                      </div>\n                      <div>\n                        <div class=\"text-muted mx-auto text-center font-weight-light\">\n                          {{ $t(\"It's as easy as 1-2-3\") }}.\n                        </div>\n                      </div>\n                      <div class=\"mt-4\">\n                        <a href=\"/printers/\" class=\"btn btn-outline-secondary btn-block mx-auto\">{{\n                          $t('Just Checking Out')\n                        }}</a>\n                      </div>\n                      <div>\n                        <div class=\"text-muted mx-auto text-center font-weight-light\">\n                          {{ $t('Not a whole lot you can see without your printer linked') }}.\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </b-row>\n                <div class=\"footer-note small\">\n                  <i18next\n                    :translation=\"\n                      $t('Not ready to start yet? {localizedDom} to pause your free trial.')\n                    \"\n                  >\n                    <template #localizedDom>\n                      <a\n                        href=\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\"\n                        >{{ $t('Email us') }}</a\n                      >\n                    </template>\n                  </i18next>\n                </div>\n              </b-container>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\n\nexport default {\n  components: {\n    PageLayout,\n  },\n\n  props: {\n    trialDaysLeft: {\n      type: Number,\n      required: true,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding: 1.5rem 0.6rem 3rem\n  background: var(--color-surface-secondary)\n  -webkit-box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.3) !important\n  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.3) !important\n  border: none !important\n  border-radius: var(--border-radius-lg)\n\n.btn-link\n  color: var(--color-text-primary)\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 0.5em\n\n.success\n  width: 12rem\n\n.footer-note\n  margin: 3rem 0 -1.5rem\n  text-align: right\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WelcomePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WelcomePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WelcomePage.vue?vue&type=template&id=34f8280e&scoped=true&\"\nimport script from \"./WelcomePage.vue?vue&type=script&lang=js&\"\nexport * from \"./WelcomePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WelcomePage.vue?vue&type=style&index=0&id=34f8280e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"34f8280e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"page-name truncated\"},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja AI Configuration')))])]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"body-wrap\"},[_c('div',{staticClass:\"heading-wrap\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('Nozzle Ninja AI Configuration')))])]),_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Nozzle Ninja, {brandName}’s First Layer AI, Is Here!', { brandName: _vm.$syndicateText.brandName, }))+\" \")]),_c('p',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Configure a compatible nozzle camera to get started'))+\" \")])]),(!_vm.selectedPrinter)?_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" 🔄 \"+_vm._s(_vm.$t('Update the {brandName} Plugin in OctoPrint or Fluidd/Mainsail', { brandName: _vm.$syndicateText.brandName, }))+\" \")]),_c('p',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t( 'Before you configure Nozzle Ninja, Update the {brandName} plugin in OctoPrint or Fluidd/Mainsail. Once the plugin is up-to-date, restart your printer or Raspberry, and then come back here.', { brandName: _vm.$syndicateText.brandName } ))+\" \")])]):_vm._e(),_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('Select the Printer You Want to Configure')))]),(!_vm.printers)?_c('loading-placeholder'):_c('div',{staticStyle:{\"display\":\"flex\",\"min-width\":\"100%\"}},[(_vm.printers.length > 0)?_c('div',{staticClass:\"has-printers-wrap\"},[_c('p',[_vm._v(_vm._s(_vm.printers.length)+\" \"+_vm._s(_vm.$t('Printers Found')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Select which printer(s) you want to configure. Note: AI detection hours are currently not impacted by first layer AI.' ))+\" \")]),_c('b-form-select',{staticClass:\"form-control printer-select\",model:{value:(_vm.selectedPrinter),callback:function ($$v) {_vm.selectedPrinter=$$v},expression:\"selectedPrinter\"}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":null}},[_vm._v(\" \"+_vm._s(_vm.$t('Please select a printer to configure'))+\" \")]),_vm._l((_vm.printers),function(printer){return _c('option',{key:printer.name,domProps:{\"value\":printer}},[_vm._v(\" \"+_vm._s(printer.name)+\" \")])})],2),(_vm.showSuccess)?_c('p',{staticClass:\"text-success\",staticStyle:{\"text-align\":\"center\",\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Nozzle camera URL saved!'))+\" \")]):_vm._e(),(_vm.selectedPrinter)?_c('div',{staticClass:\"selected-printer-content\"},[(_vm.selectedPrinter.agent_name === 'octoprint_obico')?_c('div',{staticClass:\"selected-text-wrap\"},[_c('p',[_c('span',{staticClass:\"system-text\"},[_vm._v(_vm._s(_vm.$t('System: ')))]),_vm._v(\" OctoPrint \")])]):_c('div',{staticClass:\"selected-text-wrap\"},[_c('p',[_c('span',{staticClass:\"system-text\"},[_vm._v(_vm._s(_vm.$t('System: ')))]),_vm._v(\" Klipper \")])]),(_vm.selectedPrinter.agent_name === 'moonraker_obico')?_c('div',{staticStyle:{\"text-align\":\"left\"}},[_c('h5',[_vm._v(_vm._s(_vm.$t('Post first layer scan')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Scan your print after your first layer is done at a lower speed. The scan will produce better images more in focus and with less motion blur. This is opted in by default but you can opt out of it.' ))+\" \")]),_c('p',{staticClass:\"text-warning\"},[_vm._v(\" \"+_vm._s(_vm.$t('Note: Please make sure'))+\" \"),_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl(\n                        '/user-guides/slicer-configuration-for-first-layer-ai-klipper-only/'\n                      ),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('the slicer correctly configured'))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})]),_vm._v(\". \"+_vm._s(_vm.$t(\"Otherwise it won't scan.\"))+\" \")]),_c('div',{staticClass:\"checkbox-wrapper\"},[_c('b-form-checkbox',{attrs:{\"size\":\"md\",\"checked\":_vm.firstLayerOptedIn},on:{\"change\":_vm.updateFirstLayerOptedIn}},[_vm._v(_vm._s(_vm.$t('Enable post first layer scan')))])],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Scan at height'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":0.1},on:{\"input\":_vm.updateFirstLayerZhop},model:{value:(_vm.firstLayerScanZhop),callback:function ($$v) {_vm.firstLayerScanZhop=$$v},expression:\"firstLayerScanZhop\"}})],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Cooldown extruder'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":5,\"unit\":\"°C\"},on:{\"input\":_vm.updateFirstLayerCooldownTemp},model:{value:(_vm.firstLayerCooldownTemp),callback:function ($$v) {_vm.firstLayerCooldownTemp=$$v},expression:\"firstLayerCooldownTemp\"}})],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Retract before scan'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":0.5},on:{\"input\":_vm.updateFirstLayerRetract},model:{value:(_vm.firstLayerScanRetract),callback:function ($$v) {_vm.firstLayerScanRetract=$$v},expression:\"firstLayerScanRetract\"}})],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Retraction speed'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":1,\"unit\":\"mm/s\"},on:{\"input\":_vm.updateFirstLayerScanRetractSpeed},model:{value:(_vm.firstLayerScanRetractSpeed),callback:function ($$v) {_vm.firstLayerScanRetractSpeed=$$v},expression:\"firstLayerScanRetractSpeed\"}})],1)]):_vm._e()]):_vm._e()],1):_c('div',{staticClass:\"no-printers-wrap\"},[_c('i',{staticClass:\"fas fa-times-circle fa-2x\"}),_c('h3',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('No printers found!')))])])])],1),(_vm.selectedPrinter)?_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja Configuration')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Follow the camera configuration guide to configure your nozzle camera with {brandName}', { brandName: _vm.$syndicateText.brandName } ))+\" \")]),(_vm.selectedPrinter.agent_name !== 'octoprint_obico')?_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja configuration guide for Klipper '))),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})]):_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration-octoprint/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja configuration guide for Octoprint '))),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})])]):_vm._e(),(_vm.selectedPrinter && _vm.selectedPrinter.agent_name !== 'octoprint_obico')?_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('Slicer Configuration')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Configure your slicer to send first layer information to {brandName} and optionally enable first layer scanning. First layer scanning is an experimental feature that enables a slow scan of the first layer. This feature requires some configureation to avoid impacting print quality.', { brandName: _vm.$syndicateText.brandName } ))),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('Currently, PrusaSlicer, SuperSlicer and OrcaSlicer are supported.'))+\" \")]),_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl(\n              '/user-guides/first_layer_ai/slicer-configuration-for-first-layer-ai-klipper-only/'\n            ),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('Slicer configuration guide '))),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})])]):_vm._e()])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #topBarLeft>\n      <div class=\"page-name truncated\">{{ $t('Nozzle Ninja AI Configuration') }}</div>\n    </template>\n\n    <template #content>\n      <div class=\"body-wrap\">\n        <div class=\"heading-wrap\">\n          <h1>{{ $t('Nozzle Ninja AI Configuration') }}</h1>\n        </div>\n        <div class=\"body-section\">\n          <h2 style=\"margin: 0\">\n            {{\n              $t('Nozzle Ninja, {brandName}’s First Layer AI, Is Here!', {\n                brandName: $syndicateText.brandName,\n              })\n            }}\n          </h2>\n          <p style=\"margin: 0\">\n            {{ $t('Configure a compatible nozzle camera to get started') }}\n          </p>\n        </div>\n        <div v-if=\"!selectedPrinter\" class=\"body-section\">\n          <h2 style=\"margin: 0\">\n            🔄\n            {{\n              $t('Update the {brandName} Plugin in OctoPrint or Fluidd/Mainsail', {\n                brandName: $syndicateText.brandName,\n              })\n            }}\n          </h2>\n          <p style=\"margin: 0\">\n            {{\n              $t(\n                'Before you configure Nozzle Ninja, Update the {brandName} plugin in OctoPrint or Fluidd/Mainsail. Once the plugin is up-to-date, restart your printer or Raspberry, and then come back here.',\n                { brandName: $syndicateText.brandName }\n              )\n            }}\n          </p>\n        </div>\n        <div class=\"body-section\">\n          <h2 style=\"margin: 0\">{{ $t('Select the Printer You Want to Configure') }}</h2>\n          <loading-placeholder v-if=\"!printers\" />\n          <div v-else style=\"display: flex; min-width: 100%\">\n            <!-- Printer selection -->\n            <div v-if=\"printers.length > 0\" class=\"has-printers-wrap\">\n              <p>{{ printers.length }} {{ $t('Printers Found') }}</p>\n              <p>\n                {{\n                  $t(\n                    'Select which printer(s) you want to configure. Note: AI detection hours are currently not impacted by first layer AI.'\n                  )\n                }}\n              </p>\n              <b-form-select v-model=\"selectedPrinter\" class=\"form-control printer-select\">\n                <option :value=\"null\" selected disabled>\n                  {{ $t('Please select a printer to configure') }}\n                </option>\n                <option v-for=\"printer in printers\" :key=\"printer.name\" :value=\"printer\">\n                  {{ printer.name }}\n                </option>\n              </b-form-select>\n              <p v-if=\"showSuccess\" class=\"text-success\" style=\"text-align: center; margin: 0\">\n                {{ $t('Nozzle camera URL saved!') }}\n              </p>\n              <!-- Opened when select printer -->\n              <div v-if=\"selectedPrinter\" class=\"selected-printer-content\">\n                <div\n                  v-if=\"selectedPrinter.agent_name === 'octoprint_obico'\"\n                  class=\"selected-text-wrap\"\n                >\n                  <p>\n                    <span class=\"system-text\">{{ $t('System: ') }}</span> OctoPrint\n                  </p>\n                </div>\n                <div v-else class=\"selected-text-wrap\">\n                  <p>\n                    <span class=\"system-text\">{{ $t('System: ') }}</span> Klipper\n                  </p>\n                </div>\n                <div\n                  v-if=\"selectedPrinter.agent_name === 'moonraker_obico'\"\n                  style=\"text-align: left\"\n                >\n                  <h5>{{ $t('Post first layer scan') }}</h5>\n                  <p>\n                    {{\n                      $t(\n                        'Scan your print after your first layer is done at a lower speed. The scan will produce better images more in focus and with less motion blur. This is opted in by default but you can opt out of it.'\n                      )\n                    }}\n                  </p>\n\n                  <p class=\"text-warning\">\n                    {{ $t('Note: Please make sure') }}\n                    <a\n                      :href=\"\n                        getDocUrl(\n                          '/user-guides/slicer-configuration-for-first-layer-ai-klipper-only/'\n                        )\n                      \"\n                      target=\"_blank\"\n                      style=\"font-weight: bold\"\n                      >{{ $t('the slicer correctly configured') }}\n                      <i class=\"fas fa-external-link-alt fa-xs\"></i></a\n                    >. {{ $t(\"Otherwise it won't scan.\") }}\n                  </p>\n\n                  <div class=\"checkbox-wrapper\">\n                    <b-form-checkbox\n                      size=\"md\"\n                      :checked=\"firstLayerOptedIn\"\n                      @change=\"updateFirstLayerOptedIn\"\n                      >{{ $t('Enable post first layer scan') }}</b-form-checkbox\n                    >\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Scan at height') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerScanZhop\"\n                      :step=\"0.1\"\n                      style=\"max-width: 20rem\"\n                      @input=\"updateFirstLayerZhop\"\n                    ></number-input>\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Cooldown extruder') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerCooldownTemp\"\n                      :step=\"5\"\n                      style=\"max-width: 20rem\"\n                      unit=\"°C\"\n                      @input=\"updateFirstLayerCooldownTemp\"\n                    ></number-input>\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Retract before scan') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerScanRetract\"\n                      :step=\"0.5\"\n                      style=\"max-width: 20rem\"\n                      @input=\"updateFirstLayerRetract\"\n                    ></number-input>\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Retraction speed') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerScanRetractSpeed\"\n                      :step=\"1\"\n                      style=\"max-width: 20rem\"\n                      unit=\"mm/s\"\n                      @input=\"updateFirstLayerScanRetractSpeed\"\n                    ></number-input>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <!-- No printers found scenario -->\n            <div v-else class=\"no-printers-wrap\">\n              <i class=\"fas fa-times-circle fa-2x\"></i>\n              <h3 style=\"margin: 0\">{{ $t('No printers found!') }}</h3>\n            </div>\n          </div>\n        </div>\n\n        <div v-if=\"selectedPrinter\" class=\"body-section\">\n          <h2 style=\"margin: 0\">{{ $t('Nozzle Ninja Configuration') }}</h2>\n          <p>\n            {{\n              $t(\n                'Follow the camera configuration guide to configure your nozzle camera with {brandName}',\n                { brandName: $syndicateText.brandName }\n              )\n            }}\n          </p>\n          <a\n            v-if=\"selectedPrinter.agent_name !== 'octoprint_obico'\"\n            :href=\"getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration/')\"\n            target=\"_blank\"\n            style=\"font-weight: bold\"\n            >{{ $t('Nozzle Ninja configuration guide for Klipper ')\n            }}<i class=\"fas fa-external-link-alt fa-xs\"></i\n          ></a>\n          <a\n            v-else\n            :href=\"getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration-octoprint/')\"\n            target=\"_blank\"\n            style=\"font-weight: bold\"\n            >{{ $t('Nozzle Ninja configuration guide for Octoprint ')\n            }}<i class=\"fas fa-external-link-alt fa-xs\"></i\n          ></a>\n        </div>\n        <div\n          v-if=\"selectedPrinter && selectedPrinter.agent_name !== 'octoprint_obico'\"\n          class=\"body-section\"\n        >\n          <h2 style=\"margin: 0\">{{ $t('Slicer Configuration') }}</h2>\n          <p>\n            {{\n              $t(\n                'Configure your slicer to send first layer information to {brandName} and optionally enable first layer scanning. First layer scanning is an experimental feature that enables a slow scan of the first layer. This feature requires some configureation to avoid impacting print quality.',\n                { brandName: $syndicateText.brandName }\n              )\n            }}<br />\n            {{ $t('Currently, PrusaSlicer, SuperSlicer and OrcaSlicer are supported.') }}\n          </p>\n          <a\n            :href=\"\n              getDocUrl(\n                '/user-guides/first_layer_ai/slicer-configuration-for-first-layer-ai-klipper-only/'\n              )\n            \"\n            target=\"_blank\"\n            style=\"font-weight: bold\"\n            >{{ $t('Slicer configuration guide ') }}<i class=\"fas fa-external-link-alt fa-xs\"></i\n          ></a>\n        </div>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { user } from '@src/lib/page-context'\nimport LoadingPlaceholder from '@src/components/LoadingPlaceholder.vue'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport { getMoonrakerWebcams } from '@src/lib/printer-local-comm'\nimport { requestSnapshot } from '@src/lib/printer-local-comm'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport NumberInput from '@src/components/NumberInput.vue'\n\nexport default {\n  name: 'CelestriusConfigurePage',\n\n  components: { LoadingPlaceholder, PageLayout, NumberInput },\n\n  data() {\n    return {\n      user: null,\n      printers: null,\n      selectedPrinter: null,\n      selectedPrinterComm: null,\n      inputValue: '',\n      showSuccess: false,\n      showFetchingWebcamLoader: false,\n      testSnapshotString: '',\n      urlPlaceHolder: 'Nozzle Camera Snapshot URL',\n      firstLayerOptedIn: true,\n      firstLayerScanZhop: 4,\n      firstLayerScanRetract: 6.5,\n      firstLayerScanRetractSpeed: 15,\n      firstLayerCooldownTemp: 170,\n    }\n  },\n\n  computed: {},\n\n  watch: {\n    selectedPrinter: {\n      async handler(newValue, oldValue) {\n        if (newValue == null) {\n          return\n        } else {\n          this.showSuccess = false\n        }\n        this.inputValue = newValue.ext.nozzlecam_url\n        this.firstLayerOptedIn = newValue.ext.first_layer_scan_opted_in\n        this.firstLayerScanZhop = newValue.ext.first_layer_scan_zhop\n        this.firstLayerScanRetract = newValue.ext.first_layer_scan_retract\n        this.firstLayerScanRetractSpeed = newValue.ext.first_layer_scan_retract_speed\n        this.firstLayerCooldownTemp = newValue.ext.first_layer_scan_cooldown_temp\n        if (newValue.status !== null) {\n          this.selectedPrinterComm = await printerCommManager.getOrCreatePrinterComm(\n            newValue.id,\n            urls.printerWebSocket(newValue.id)\n          )\n          if (newValue.agent_name !== 'octoprint_obico') {\n            this.showFetchingWebcamLoader = true\n            await this.selectedPrinterComm.connect(async () => {\n              await getMoonrakerWebcams(this.selectedPrinterComm)\n                .then((resp) => {\n                  newValue.webcamUrls = resp\n                  this.showFetchingWebcamLoader = false\n                })\n                .catch(() => {\n                  newValue.webcamUrls = undefined\n                  this.showFetchingWebcamLoader = false\n                })\n            })\n          } else {\n            await this.selectedPrinterComm.connect()\n          }\n        }\n      },\n    },\n  },\n\n  async created() {\n    this.user = user()\n    this.printers = await this.fetchPrinters()\n  },\n\n  mounted() {},\n\n  methods: {\n    async updateFirstLayerOptedIn(newValue) {\n      this.patchPrinter({ first_layer_scan_opted_in: newValue })\n    },\n    async updateFirstLayerRetract(newValue) {\n      this.patchPrinter({ first_layer_scan_retract: newValue })\n    },\n    async updateFirstLayerZhop(newValue) {\n      this.patchPrinter({ first_layer_scan_zhop: newValue })\n    },\n    async updateFirstLayerCooldownTemp(newValue) {\n      this.patchPrinter({ first_layer_scan_cooldown_temp: newValue })\n    },\n    async updateFirstLayerScanRetractSpeed(newValue) {\n      this.patchPrinter({ first_layer_scan_retract_speed: newValue })\n    },\n    async patchPrinter(data) {\n      return axios.patch(`/ent/api/printers/${this.selectedPrinter.id}/ext/`, data)\n    },\n    async onUpdateSettings() {\n      if (!this.inputValue.length) return\n\n      await this.patchPrinter({\n        nozzlecam_url: this.inputValue,\n      })\n        .then(async () => {\n          this.inputValue = ''\n          this.showSuccess = true\n          this.printers = await this.fetchPrinters()\n          this.selectedPrinter = null\n        })\n        .catch((err) => {\n          console.error('Failed to update printer settings: ', err)\n          this.showSuccess = false\n        })\n    },\n    async fetchPrinters() {\n      return await axios.get(urls.printers()).then((response) => {\n        response.data.map(async (p) => {\n          p.more = normalizedPrinter(p)\n          p.ext = await axios.get(`/ent/api/printers/${p.id}/ext/`).then((r) => r.data.ext)\n        })\n        return response.data\n      })\n    },\n    async testSnapshotUrl() {\n      if (this.selectedPrinter.status === null) {\n        this.$swal.Reject.fire({\n          html: `<h3 style=\"text-align: center\">Printer is offline!</h3>`,\n          customClass: {\n            container: 'dark-backdrop',\n          },\n        })\n        return\n      } else if (!this.selectedPrinter.more.isAgentVersionGte('2.4.6', '1.4.11')) {\n        this.$swal.Reject.fire({\n          html: `<h3 style=\"text-align: center\">\n            ${this.$i18next.t(\n              'The {brandName} plugin version is too old to use this function. Please update it to the latest version to test camera!',\n              { brandName: this.$syndicateText.brandName }\n            )}</h3>`,\n          customClass: {\n            container: 'dark-backdrop',\n          },\n        })\n        return\n      }\n\n      this.testSnapshotString = 'load'\n      requestSnapshot(this.selectedPrinterComm, this.inputValue)\n        .then((resp) => {\n          this.testSnapshotString = resp\n          this.$swal.fire({\n            html: `\n            <div style=\"display: flex; flex: 1; align-items: center; justify-content: center; flex-direction: column;\">\n              <p class=\"my-4 text-warning\">${this.$i18next.t(\n                'Please confirm the snapshot below came from a'\n              )} <b>${this.$i18next.t('nozzle camera')}</b>, ${this.$i18next.t(\n              'not a regular webcam. The AI will NOT function correctly on a regular camera.'\n            )}</p>\n              <img src='data:image/jpeg;base64,${\n                this.testSnapshotString\n              }' alt='test-image' width=400 height=300></img>\n            </div>\n          `,\n            customClass: {\n              container: 'dark-backdrop',\n            },\n          })\n        })\n        .catch((e) => {\n          this.testSnapshotString = ''\n          this.$swal.Reject.fire({\n            html: `<h3 style=\"text-align: center\">${this.$i18next.t(\n              'Unable to connect to your nozzle camera using the URL you entered!'\n            )}</h3><p>${this.$i18next.t(\n              'Please check the instruction for how to find the correct URL for your nozzle camera.'\n            )}`,\n            customClass: {\n              container: 'dark-backdrop',\n            },\n          })\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.page-name\n  font-size: 1rem\n  max-width: 360px\n  font-weight: bold\n  @media (max-width: 768px)\n    max-width: 200px\n\nh1, h4\n  text-align: center\n\n.no-printers-wrap\n  display: flex\n  flex: 1\n  flex-direction: row\n  align-items: center\n  justify-content: center\n  gap: 10px\n\n.has-printers-wrap\n text-align: center\n flex-direction: column\n width: 100%\n\n.selected-printer-content\n  margin-top: var(--gap-between-blocks)\n  gap: var(--gap-between-blocks)\n\n\n.body-wrap\n  display: flex\n  align-items: center\n  justify-content: center\n  text-align: center\n  flex-direction: column\n  padding: var(--gap-between-blocks) calc(var(--gap-between-blocks) * 3)\n  gap: var(--gap-between-blocks)\n\n.heading-wrap\n display: flex\n flex-direction: column\n text-align: center\n margin-bottom: var(--gap-between-blocks)\n\n.body-section\n display: flex\n text-align: center\n flex-direction: column\n align-items: center\n justify-content: center\n min-width: 100%\n border-radius: var(--border-radius-md)\n background-color: var(--color-surface-primary)\n padding: var(--gap-between-blocks)\n gap: var(--gap-between-blocks)\n\n.note-text\n color: var(--color-warning)\n\n.printer-select\n  cursor: pointer\n  min-width: 100%\n  flex: 1\n  border: none\n  background-color: var(--color-surface-secondary)\n\n.webcam-select\n  cursor: pointer\n  border: none\n  background-color: var(--color-surface-secondary)\n\n.selected-text-wrap\n text-align: left\n\n.system-text\n color: var(--color-text-secondary)\n\n.primary-span\n  color: var(--color-primary)\n\n.input-save-wrap\n  display: flex\n  flex: 1\n  flex-direction: row\n  flex-wrap: wrap\n  justify-content: center\n  align-items: center\n  gap: var(--gap-between-blocks)\n  margin-bottom: var(--gap-between-blocks)\n\n.nozzle-input\n  background-color: var(--color-surface-secondary)\n\n.save-btn\n  background-color: var(--color-surface-secondary)\n  border: solid var(--color-surface-secondary) 2px\n  border-radius: var(--border-radius-sm)\n  color: var(--color-text-primary)\n\n.test-btn\n  background-color: var(--color-surface-primary)\n  border: solid var(--color-text-primary) 2px\n  border-radius: var(--border-radius-sm)\n  color: var(--color-text-primary)\n  white-space: nowrap\n\n.config-help-wrap\n width: 100%\n display: flex\n flex-direction: column\n text-align: left\n\n.input-width\n flex: 1\n min-width: 200px\n\n.select-label\n color: var(--color-text-secondary)\n text-align: left\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CelestriusConfigurePage.vue?vue&type=template&id=e62ff952&scoped=true&\"\nimport script from \"./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"\nexport * from \"./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CelestriusConfigurePage.vue?vue&type=style&index=0&id=e62ff952&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e62ff952\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[_c('div',{staticClass:\"text pl-3\"},[(_vm.redeemPeriod === 3)?[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your Three-Month Obico Pro Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued Mintion customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Mintion customers to ensure you continue to enjoy the benefits of Obico without interruption.' ))+\" \")])]:_vm._e(),(_vm.redeemPeriod === 6)?[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your One Year Obico Pro Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued Mintion customer, you are eligible for an exclusive life-time Pro Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.' ))+\" \")]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.' ))+\" \")])]:_vm._e(),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])],2),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mintion-obico-logo.png')}})])])]),_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your Pro Plan\")))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])])])]),_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[(_vm.redeemPeriod === 3)?_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(_vm._s(_vm.$t('What happens when the three-month Pro Plan expires?')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'When your three-month plan expires, you will have the chance to upgrade to one of Obico’s Pro Plans at a special discounted rate. Learn more about the plan options' ))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('here')))]),_vm._v(\". \"+_vm._s(_vm.$t( 'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.' ))+\" \")])]):_vm._e(),(_vm.redeemPeriod === 6)?_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t( 'I already paid for the Pro Plan. Why do I need to enter my credit card information again?' ))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Your plan is fully covered for the first one year. After the first one year, the plan will renew with a special discount available exclusively for Mintion customers. You are free to cancel the plan at any time in the “Subscription” section of the Obico mobile or web app.' ))+\" \")])]):_vm._e(),_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('Still have questions?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Contact'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('{brandName} support.', { brandName: _vm.$syndicateText.brandName })))])])])])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[(_vm.isPlanAdded)?_c('h2',{staticClass:\"mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Sign Up or Sign in to Your Obico Account'))+\" \")]):_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[(_vm.isPlanAdded)?[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('And get instant access to')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Signup/Sign In'))+\" \")])])])]:[_c('div',{staticClass:\"col-sm-12\"},[_c('h3',{staticClass:\"title d-flex justify-content-center\"},[_vm._v(\" \"+_vm._s(_vm.$t('Create an account or Sign in to Choose Your plan'))+\" \")]),_c('div',{staticClass:\"plan-not-added-features offset-md-1 offset-lg-2\"},[_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(\" \"+_vm._s(_vm.isPlanAdded ? _vm.$t('Unlimited AI Failure Detection') : _vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])])]),_c('div',{staticClass:\"col-md-10 offset-md-1 col-lg-8 offset-lg-2 p-0\"},[_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Create Account/Sign In'))+\" \")])])])])]],2)],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col>\n        <div class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h2 v-if=\"isPlanAdded\" class=\"mx-auto mt-4\">\n                {{ $t('Sign Up or Sign in to Your Obico Account') }}\n              </h2>\n              <h1 v-else class=\"text-center mx-auto mt-4\">\n                {{ $t('Welcome To') }}\n                {{ $syndicateText.brandName }}\n              </h1>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row>\n              <template v-if=\"isPlanAdded\">\n                <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                  <h3 class=\"title\">{{ $t('And get instant access to') }}</h3>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{\n                      $t('Unlimited Premium Webcam Streaming')\n                    }}</span>\n                  </div>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{ $t('Unlimited AI Failure Detection') }}</span>\n                  </div>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{\n                      $t('G-Code Remote Uploading and Printing')\n                    }}</span>\n                  </div>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{\n                      $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                    }}</span>\n                  </div>\n                  <div\n                    class=\"redirect-button d-flex flex-column align-center justify-content-center\"\n                  >\n                    <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                      {{ $t('Signup/Sign In') }}\n                    </a>\n                  </div>\n                </div>\n              </template>\n              <template v-else>\n                <div class=\"col-sm-12\">\n                  <h3 class=\"title d-flex justify-content-center\">\n                    {{ $t('Create an account or Sign in to Choose Your plan') }}\n                  </h3>\n                  <div class=\"plan-not-added-features offset-md-1 offset-lg-2\">\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('Unlimited Premium Webcam Streaming')\n                      }}</span>\n                    </div>\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">\n                        {{\n                          isPlanAdded\n                            ? $t('Unlimited AI Failure Detection')\n                            : $t('AI Failure Detection')\n                        }}</span\n                      >\n                    </div>\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('G-Code Remote Uploading and Printing')\n                      }}</span>\n                    </div>\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                      }}</span>\n                    </div>\n                  </div>\n                  <div class=\"col-md-10 offset-md-1 col-lg-8 offset-lg-2 p-0\">\n                    <div\n                      class=\"redirect-button d-flex flex-column align-center justify-content-center\"\n                    >\n                      <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                        {{ $t('Create Account/Sign In') }}\n                      </a>\n                    </div>\n                  </div>\n                </div>\n              </template>\n            </b-row>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nexport default {\n  name: 'BttUserNotAuthenticatedModal',\n  props: {\n    isPlanAdded: {\n      type: Boolean,\n      required: true,\n    },\n    redirectUrl: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      url: '/accounts/signup/?next=' + this.redirectUrl,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding-top: 1em\n\n.title\n  margin-top: 0.5em\n  margin-bottom: 1em\n\n.feature\n  line-height: 2em\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 1.1em\n\n.redirect-button\n  margin-top: 9em\n  margin-bottom: 6em\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BttUserNotAuthenticatedModal.vue?vue&type=template&id=0f963e48&scoped=true&\"\nimport script from \"./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BttUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=0f963e48&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0f963e48\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <!-- Block Activate Your Three-Month Obico Pro Plan -->\n      <!-- OR -->\n      <!-- Block Upgrade to  an Obico Pro Plan and get a 25% discount as a valued BTT customer! -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-1\">\n          <div class=\"text pl-3\">\n            <template v-if=\"redeemPeriod === 3\">\n              <div class=\"title pb-3\">{{ $t('Activate Your Three-Month Obico Pro Plan') }}</div>\n              <p class=\"pb-3\">\n                {{\n                  $t(\n                    'As a valued Mintion customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Mintion customers to ensure you continue to enjoy the benefits of Obico without interruption.'\n                  )\n                }}\n              </p>\n            </template>\n            <template v-if=\"redeemPeriod === 6\">\n              <div class=\"title pb-3\">{{ $t('Activate Your One Year Obico Pro Plan') }}</div>\n              <p class=\"pb-3\">\n                {{\n                  $t(\n                    'As a valued Mintion customer, you are eligible for an exclusive life-time Pro Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.'\n                  )\n                }}\n              </p>\n              <p class=\"pb-3\">\n                {{\n                  $t(\n                    'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.'\n                  )\n                }}\n              </p>\n            </template>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/mintion-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your Pro Plan\") }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div v-if=\"redeemPeriod === 3\" class=\"question\">\n              <h6>{{ $t('What happens when the three-month Pro Plan expires?') }}</h6>\n              <p>\n                {{\n                  $t(\n                    'When your three-month plan expires, you will have the chance to upgrade to one of Obico’s Pro Plans at a special discounted rate. Learn more about the plan options'\n                  )\n                }}\n                <a href=\"/ent_pub/pricing/\" class=\"underline\">{{ $t('here') }}</a\n                >.\n                {{\n                  $t(\n                    'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.'\n                  )\n                }}\n              </p>\n            </div>\n            <div v-if=\"redeemPeriod === 6\" class=\"question\">\n              <h6>\n                {{\n                  $t(\n                    'I already paid for the Pro Plan. Why do I need to enter my credit card information again?'\n                  )\n                }}\n              </h6>\n              <p>\n                {{\n                  $t(\n                    'Your plan is fully covered for the first one year. After the first one year, the plan will renew with a special discount available exclusively for Mintion customers. You are free to cancel the plan at any time in the “Subscription” section of the Obico mobile or web app.'\n                  )\n                }}\n              </p>\n            </div>\n            <div class=\"question\">\n              <h6>\n                {{ $t('Still have questions?') }}\n              </h6>\n              <p>\n                {{ $t('Contact') }}\n                <a href=\"mailto:support@obico.io\" class=\"underline\">{{\n                  $t('{brandName} support.', { brandName: $syndicateText.brandName })\n                }}</a>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport { BillingCycle, DHPacks, PrepaidDHPacks } from '@entSrc/lib/pricing.js'\nimport urls from '@config/server-urls'\nimport BttRedeemCompletedModal from './components/BttRedeemCompletedModal.vue'\nimport BttUserNotAuthenticatedModal from './components/BttUserNotAuthenticatedModal.vue'\nimport { SupportEmail } from '../../../src/lib/consts.js'\n\nexport default {\n  name: 'MintionRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      initialCBSubscription: null,\n      billingCycle: BillingCycle.Annual,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      free3mCouponCodePrefix: 'M58293',\n      free6mCouponCodePrefix: 'MINTION',\n      redirectUrlWhenNotAuthenticated: '',\n      redeemPeriod: '',\n    }\n  },\n  computed: {\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    const couponCode = urlParams.get('coupon_code')\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    if (couponCode.startsWith(this.free3mCouponCodePrefix)) {\n      this.isValidCouponCode = true\n      this.redeemPeriod = 3\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/mintion/?coupon_code=' + couponCode + '&redirect=' + true\n      )\n    } else if (couponCode.startsWith(this.free6mCouponCodePrefix)) {\n      this.isValidCouponCode = true\n      this.redeemPeriod = 6\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/mintion/?coupon_code=' + couponCode + '&redirect=' + true\n      )\n    } else {\n      this.isValidCouponCode = false\n    }\n\n    if (this.isAuthenticated) {\n      this.$loadScript('https://js.chargebee.com/v2/chargebee.js')\n        .then(() => {\n          this.BillingCycle = BillingCycle\n          this.DHPacks = DHPacks\n          this.PrepaidDHPacks = PrepaidDHPacks\n          this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n          axios.get(urls.activeSubscription()).then((response) => {\n            this.loaded = true\n            const data = response.data\n            this.initialCBSubscription = data ? data.cb_subscription : null\n            if (isRedirectedAfterLoginOrSignup) {\n              this.handlePlanAdded()\n            }\n          })\n        })\n        .catch(() => {\n          console.error('Failed to load ChargeBee script')\n        })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.openBttUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanAdded()\n      }\n    },\n    openBttUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        BttUserNotAuthenticatedModal,\n        {\n          isPlanAdded: true,\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanAdded() {\n      const urlParams = new URLSearchParams(window.location.search)\n      const couponCode = urlParams.get('coupon_code')\n\n      if (this.redeemPeriod === 3) {\n        axios\n          .post(urls.redeemMintion3mUnlimited(), {\n            coupon_code: couponCode,\n          })\n          .then(() => {\n            this.$swal.openModalWithComponent(\n              BttRedeemCompletedModal,\n              {},\n              {\n                showConfirmButton: false,\n                allowOutsideClick: false,\n                width: '55em',\n              }\n            )\n          })\n          .catch((error) => {\n            const resp = error.response\n            if (resp.status === 412) {\n              const reason = resp.data.reason\n              // error may be {'reason': 'not_in_pro_trial.' or {'reason': 'already_redeemed'\n              if (reason === 'already_redeemed') {\n                this.$swal.Prompt.fire({\n                  title: `${this.$i18next.t(`You have already redeemed this coupon.`)}`,\n                  html: `\n                    <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n                      'Please contact Obico Support at'\n                    )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n                    `,\n                  width: 600,\n                })\n              } else if (reason === 'not_in_pro_trial.') {\n                this.openAlreadyHaveProPlanModal()\n              }\n            } else {\n              this.$swal.fire({\n                title: this.$i18next.t('Error'),\n                html: `<p style=\"text-align: center;\">${this.$i18next.t(\n                  'Failed to redeem the coupon code. Please try again later.'\n                )}</p>`,\n                icon: 'error',\n              })\n            }\n          })\n      } else {\n        // for 6 months\n        chargeBee.checkout(\n          this.chargeBeeInstance,\n          '/ent/generate_pro_checkout_url/',\n          {\n            plan: 'pro',\n            annual: true,\n            printers: this.numPrinters,\n            dhpack_level: '0',\n            coupon: couponCode,\n          },\n          () => {\n            this.$swal.fire({\n              type: 'error',\n              title: `${this.$i18next.t('Oops...')}`,\n              html: `${this.$i18next.t(\n                'Invalid coupon code. Please make sure the coupon code has not been used, and has not expired. If you believe you have a valid coupon code, please '\n              )} <a href=\"mailto:${SupportEmail}\">${this.$i18next.t(\n                'contact us'\n              )}</a> ${this.$i18next.t('for help.')}`,\n            })\n          }\n        )\n      }\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t(`Oops! You already have an Obico Pro Plan...`)}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact obico support at'\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.mintion-redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MintionRedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MintionRedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MintionRedeemPage.vue?vue&type=template&id=456f3cd8&scoped=true&\"\nimport script from \"./MintionRedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./MintionRedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MintionRedeemPage.vue?vue&type=style&index=0&id=456f3cd8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"456f3cd8\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[(_vm.isPlanAdded)?_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your Three-Month Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued Big Tree Tech customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Big Tree Tech customers to ensure you continue to enjoy the benefits of Obico without interruption.' ))+\" \")]),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])]):_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t('Upgrade to an Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan and get a 25% discount as a valued BTT customer!'))+\" \")]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t('Obico has partnered with Big Tree Tech to give you an exclusive discount on an Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan. Get instant access to AI failure detection, first layer AI, webcam streaming, a highly rated mobile app and more for your 3D printer.'))+\" \")]),_c('button',{staticClass:\"btn choose-plan-btn\",on:{\"click\":_vm.choosePlanClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Choose Plan'))+\" \")])]),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/bigtree-tech-obico-logo.png')}})])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your\"))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),(!_vm.isPlanAdded)?_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn choose-plan-btn\",on:{\"click\":_vm.choosePlanClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Choose Plan'))+\" \")])]):_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])])])]),(_vm.isPlanAdded)?_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(_vm._s(_vm.$t('What happens when the three-month'))+\" AI Premium \"+_vm._s(_vm.$t('Plan expires?')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s'))+\" AI Premium \"+_vm._s(_vm.$t('Plans at a special discounted rate. Learn more about the plan options'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('here')))]),_vm._v(\". \"+_vm._s(_vm.$t( 'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.' ))+\" \")])])])])]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <!-- Block Activate Your Three-Month Obico Pro Plan -->\n      <!-- OR -->\n      <!-- Block Upgrade to  an Obico Pro Plan and get a 25% discount as a valued BTT customer! -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-1\">\n          <div v-if=\"isPlanAdded\" class=\"text pl-3\">\n            <div class=\"title pb-3\">{{ $t('Activate Your Three-Month Obico') }} AI Premium {{ $t('Plan') }}</div>\n            <p class=\"pb-3\">\n              {{\n                $t(\n                  'As a valued Big Tree Tech customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Big Tree Tech customers to ensure you continue to enjoy the benefits of Obico without interruption.'\n                )\n              }}\n            </p>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n          <div v-else class=\"text pl-3\">\n            <div class=\"title pb-3\">\n              {{ $t('Upgrade to an Obico') }} AI Premium {{ $t('Plan and get a 25% discount as a valued BTT customer!') }}\n            </div>\n            <p class=\"pb-3\">\n              {{ $t('Obico has partnered with Big Tree Tech to give you an exclusive discount on an Obico') }}\n              AI Premium\n              {{ $t('Plan. Get instant access to AI failure detection, first layer AI, webcam streaming, a highly rated mobile app and more for your 3D printer.') }}\n            </p>\n            <button class=\"btn choose-plan-btn\" @click=\"choosePlanClicked\">\n              {{ $t('Choose Plan') }}\n            </button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/bigtree-tech-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your\") }} AI Premium {{ $t('Plan') }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div v-if=\"!isPlanAdded\" class=\"mt-5\">\n            <button class=\"btn choose-plan-btn\" @click=\"choosePlanClicked\">\n              {{ $t('Choose Plan') }}\n            </button>\n          </div>\n          <div v-else class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div v-if=\"isPlanAdded\" class=\"btt-redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div class=\"question\">\n              <h6>{{ $t('What happens when the three-month') }} AI Premium {{ $t('Plan expires?') }}</h6>\n              <p>\n                {{ $t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s') }}\n                AI Premium\n                {{ $t('Plans at a special discounted rate. Learn more about the plan options') }}\n                <a href=\"/ent_pub/pricing/\" class=\"underline\">{{ $t('here') }}</a\n                >.\n                {{\n                  $t(\n                    'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.'\n                  )\n                }}\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport { BillingCycle, DHPacks, PrepaidDHPacks } from '@entSrc/lib/pricing.js'\nimport urls from '@config/server-urls'\nimport BttRedeemCompletedModal from './components/BttRedeemCompletedModal.vue'\nimport BttUserNotAuthenticatedModal from './components/BttUserNotAuthenticatedModal.vue'\n\nexport default {\n  name: 'BttRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      isPlanAdded: false,\n      initialCBSubscription: null,\n      billingCycle: BillingCycle.Annual,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      free3mCouponCode: 'btt_3m_free_266647882870',\n      discount25pctCouponCode: 'btt_25_pct_off_759920223081',\n      discount25pctCodeOnly: '759920223081',\n      redirectUrlWhenNotAuthenticated: '',\n      hasFreePlan: true,\n    }\n  },\n  computed: {\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    const couponCode = urlParams.get('coupon_code')\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    if (this.free3mCouponCode === couponCode) {\n      this.isPlanAdded = true\n      this.isValidCouponCode = true\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/btt/?coupon_code=' + this.free3mCouponCode + '&redirect=' + true\n      )\n    } else if (this.discount25pctCouponCode === couponCode) {\n      this.isPlanAdded = false\n      this.isValidCouponCode = true\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/btt/?coupon_code=' +\n          this.discount25pctCouponCode +\n          '&redirect=' +\n          true\n      )\n    } else {\n      this.isValidCouponCode = false\n    }\n\n    if (this.isAuthenticated) {\n      this.$loadScript('https://js.chargebee.com/v2/chargebee.js')\n        .then(() => {\n          this.BillingCycle = BillingCycle\n          this.DHPacks = DHPacks\n          this.PrepaidDHPacks = PrepaidDHPacks\n          this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n          axios.get(urls.activeSubscription()).then((response) => {\n            this.loaded = true\n            const data = response.data\n            const subscription = data.subscription || {}\n            this.hasFreePlan = !subscription.plan_id || subscription.plan_id == 'pro-trial'\n            this.initialCBSubscription = data ? data.cb_subscription : null\n            if (isRedirectedAfterLoginOrSignup) {\n              if (this.isPlanAdded) {\n                this.handlePlanAdded()\n              } else {\n                this.handlePlanNotAdded()\n              }\n            }\n          })\n        })\n        .catch(() => {\n          console.error('Failed to load ChargeBee script')\n        })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.openBttUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanAdded()\n      }\n    },\n    choosePlanClicked() {\n      if (!this.isAuthenticated) {\n        this.openBttUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanNotAdded()\n      }\n    },\n    openBttUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        BttUserNotAuthenticatedModal,\n        {\n          isPlanAdded: this.isPlanAdded,\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanNotAdded() {\n      if (!this.hasFreePlan) {\n        this.openAlreadyHaveProPlanModal()\n      } else {\n        this.$swal.openModalWithComponent(\n          ConfigureSubscription,\n          {\n            calculateOnly: false,\n            initialNumPrinters: this.numPrinters,\n            initialDHPackKey: '0',\n            initialBillingCycle: this.billingCycle,\n            primaryEmailVerified: true,\n            chargeBeeInstance: this.chargeBeeInstance,\n            couponCode: this.discount25pctCodeOnly,\n          },\n          {\n            title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n            showConfirmButton: false,\n          }\n        )\n      }\n    },\n    handlePlanAdded() {\n      axios\n        .post(urls.redeemBtt3mUnlimited(), {\n          coupon_code: this.free3mCouponCode,\n        })\n        .then(() => {\n          this.$swal.openModalWithComponent(\n            BttRedeemCompletedModal,\n            {},\n            {\n              showConfirmButton: false,\n              allowOutsideClick: false,\n              width: '55em',\n            }\n          )\n        })\n        .catch((error) => {\n          const resp = error.response\n          if (resp.status === 412) {\n            const reason = resp.data.reason\n            // error may be {'reason': 'not_in_pro_trial.' or {'reason': 'already_redeemed'\n            if (reason === 'already_redeemed') {\n              this.$swal.Prompt.fire({\n                title: `${this.$i18next.t(`You have already redeemed this coupon.`)}`,\n                html: `\n                  <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n                    'Please contact Obico Support at'\n                  )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n                  `,\n                width: 600,\n              })\n            } else if (reason === 'not_in_pro_trial.') {\n              this.openAlreadyHaveProPlanModal()\n            }\n          } else {\n            this.$swal.fire({\n              title: this.$i18next.t('Error'),\n              text: this.$i18next.t('Failed to redeem the coupon code. Please try again later.'),\n              icon: 'error',\n            })\n          }\n        })\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Oops! You already have an Obico')} AI Premium ${this.$i18next.t('Plan...')}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact obico support at'\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.btt-redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BttRedeemPage.vue?vue&type=template&id=7c122ccc&scoped=true&\"\nimport script from \"./BttRedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./BttRedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BttRedeemPage.vue?vue&type=style&index=0&id=7c122ccc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7c122ccc\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t('Activate Your'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" AI Premium \"+_vm._s(_vm.$t('Plan'))+\" \")]),_c('p',{staticClass:\"pb-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('As a valued Sovol customer, you are eligible for an exclusive'))+\" AI Premium \"+_vm._s(_vm.$t('Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.'))+\" \")]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.' ))+\" \")]),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Redeem Plan'))+\" \")])]),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/sovol-obico-logo.png')}})])])]),_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your\"))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Redeem Plan'))+\" \")])])])]),_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('I already paid for the'))+\" AI Premium \"+_vm._s(_vm.$t('Plan. Why do I need to enter my credit card information again?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Your plan is fully covered for the first year. After the first year, the plan will renew with a special discount available exclusively for Sovol customers. You are free to cancel the plan at any time in the “Subscription” section of the {brandname} mobile or web app.', { brandName: _vm.$syndicateText.brandName } ))+\" \")])]),_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('Still have questions?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Contact'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('{brandName} support.', { brandName: _vm.$syndicateText.brandName })))])])])])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticStyle:{\"width\":\"100%\",\"text-align\":\"center\"}},[_c('h3',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t('Create an account or Sign in to Choose Your plan and get'))+\" \")])]),_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Create Account/Sign In'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col>\n        <div class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h1 class=\"text-center mx-auto mt-4\">\n                {{ $t('Welcome To') }}\n                {{ $syndicateText.brandName }}\n              </h1>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row>\n              <div style=\"width: 100%; text-align: center\">\n                <h3 class=\"title\">\n                  {{ $t('Create an account or Sign in to Choose Your plan and get') }}\n                </h3>\n              </div>\n              <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('Unlimited Premium Webcam Streaming') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('AI Failure Detection') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('G-Code Remote Uploading and Printing')\n                  }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                  }}</span>\n                </div>\n                <div class=\"redirect-button d-flex flex-column align-center justify-content-center\">\n                  <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                    {{ $t('Create Account/Sign In') }}\n                  </a>\n                </div>\n              </div>\n            </b-row>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nexport default {\n  name: 'SovolUserNotAuthenticatedModal',\n  props: {\n    redirectUrl: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      url: '/accounts/signup/?next=' + this.redirectUrl,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding-top: 1em\n\n.title\n  margin-top: 0.5em\n  margin-bottom: 1em\n\n.feature\n  line-height: 2em\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 1.1em\n\n.redirect-button\n  margin-top: 9em\n  margin-bottom: 6em\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SovolUserNotAuthenticatedModal.vue?vue&type=template&id=c7179f58&scoped=true&\"\nimport script from \"./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SovolUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=c7179f58&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"c7179f58\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-1\">\n          <div class=\"text pl-3\">\n            <div class=\"title pb-3\">\n              {{ $t('Activate Your') }} {{ $syndicateText.brandName }} AI Premium {{ $t('Plan') }}\n            </div>\n            <p class=\"pb-2\">\n              {{ $t('As a valued Sovol customer, you are eligible for an exclusive') }}\n              AI Premium\n              {{ $t('Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.') }}\n            </p>\n            <p class=\"pb-3\">\n              {{\n                $t(\n                  'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.'\n                )\n              }}\n            </p>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">\n              {{ $t('Redeem Plan') }}\n            </button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/sovol-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your\") }} AI Premium {{ $t('Plan') }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">\n              {{ $t('Redeem Plan') }}\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div class=\"question\">\n              <h6>\n                {{ $t('I already paid for the') }} AI Premium\n                {{ $t('Plan. Why do I need to enter my credit card information again?') }}\n              </h6>\n              <p>\n                {{\n                  $t(\n                    'Your plan is fully covered for the first year. After the first year, the plan will renew with a special discount available exclusively for Sovol customers. You are free to cancel the plan at any time in the “Subscription” section of the {brandname} mobile or web app.',\n                    { brandName: $syndicateText.brandName }\n                  )\n                }}\n              </p>\n            </div>\n            <div class=\"question\">\n              <h6>\n                {{ $t('Still have questions?') }}\n              </h6>\n              <p>\n                {{ $t('Contact') }}\n                <a href=\"mailto:support@obico.io\" class=\"underline\">{{\n                  $t('{brandName} support.', { brandName: $syndicateText.brandName })\n                }}</a>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport { BillingCycle, DHPacks, PrepaidDHPacks } from '@entSrc/lib/pricing.js'\nimport urls from '@config/server-urls'\nimport SovolUserNotAuthenticatedModal from './components/SovolUserNotAuthenticatedModal.vue'\nimport { SupportEmail } from '../../../src/lib/consts.js'\n\nexport default {\n  name: 'SovolRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      initialCBSubscription: null,\n      billingCycle: BillingCycle.Annual,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      couponPrefix: 'sovol_pro_plan_',\n      redirectUrlWhenNotAuthenticated: '',\n      hasFreePlan: true,\n    }\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    const couponCodeParam = urlParams.get('coupon_code') || ''\n    this.couponCode = couponCodeParam.substring(this.couponPrefix.length)\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    // Verify Coupon Code\n    this.isValidCouponCode = this.validateSovolCode(this.couponCode)\n    this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n      '/ent/partners/redeem/sovol/?coupon_code=' + couponCodeParam + '&redirect=' + true\n    )\n\n    if (this.isAuthenticated) {\n      this.$loadScript('https://js.chargebee.com/v2/chargebee.js')\n        .then(() => {\n          this.BillingCycle = BillingCycle\n          this.DHPacks = DHPacks\n          this.PrepaidDHPacks = PrepaidDHPacks\n          this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n          axios.get(urls.activeSubscription()).then((response) => {\n            this.loaded = true\n            const data = response.data\n            const subscription = data.subscription || {}\n            this.hasFreePlan = !subscription.plan_id || subscription.plan_id == 'pro-trial'\n            this.initialCBSubscription = data ? data.cb_subscription : null\n            if (isRedirectedAfterLoginOrSignup) {\n              this.handlePlanNotAdded()\n            }\n          })\n        })\n        .catch(() => {\n          console.error('Failed to load ChargeBee script')\n        })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    validateSovolCode(code) {\n      // Check if the code has 11 characters\n      if (code.length !== 11) {\n        console.log('length mistake')\n        return false\n      }\n\n      // Check if the code starts with \"SOVOL\"\n      if (code.substring(0, 5) !== 'SOVOL') {\n        console.log('not started with sovol')\n        return false\n      }\n\n      return true\n    },\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.openUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanNotAdded()\n      }\n    },\n    openUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        SovolUserNotAuthenticatedModal,\n        {\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanNotAdded() {\n      if (!this.hasFreePlan) {\n        this.openAlreadyHaveProPlanModal()\n      } else {\n        // Open chargebee automatically\n        chargeBee.checkout(\n          this.chargeBeeInstance,\n          '/ent/generate_pro_checkout_url/',\n          {\n            plan: 'pro',\n            annual: true,\n            printers: this.numPrinters,\n            dhpack_level: '0',\n            coupon: this.couponCode,\n            // coupon: 'sovolj4323hfd93',\n          },\n          () => {\n            this.$swal.fire({\n              type: 'error',\n              title: `${this.$i18next.t('Oops...')}`,\n              html: `${this.$i18next.t(\n                'Invalid coupon code. Please make sure the coupon code has not been used, and has not expired. If you believe you have a valid coupon code, please '\n              )} <a href=\"mailto:${SupportEmail}\">${this.$i18next.t(\n                'contact us'\n              )}</a> ${this.$i18next.t('for help.')}`,\n            })\n          }\n        )\n      }\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t(`Oops! You already have an {brandName} Pro Plan...`, {\n          brandName: this.$syndicateText.brandName,\n        })}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact {brandName} support at',\n            { brandName: this.$syndicateText.brandName }\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolRedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolRedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SovolRedeemPage.vue?vue&type=template&id=580015d4&scoped=true&\"\nimport script from \"./SovolRedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./SovolRedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SovolRedeemPage.vue?vue&type=style&index=0&id=580015d4&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"580015d4\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your Three-Month Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued 3DO Nozzle Camera customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for 3DO customers to ensure you continue to enjoy the benefits of Obico without interruption.' ))+\" \")]),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])]),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/3do-obico-logo.png')}})])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your Plan\")))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(_vm._s(_vm.$t('What happens when the three-month'))+\" AI Premium \"+_vm._s(_vm.$t('Plan expires?')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s'))+\" AI Premium \"+_vm._s(_vm.$t('Plans at a special discounted rate. Learn more about the plan options'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('here')))]),_vm._v(\". \"+_vm._s(_vm.$t( 'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.' ))+\" \")])]),_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('Still have questions?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Contact'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('{brandName} support.', { brandName: _vm.$syndicateText.brandName })))])])])])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h2',{staticClass:\"mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Sign Up or Sign in to Your Obico Account'))+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('And get instant access to')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Webcam-Based AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja First Layer AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Signup/Sign In'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col>\n        <div class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h2 class=\"mx-auto mt-4\">\n                {{ $t('Sign Up or Sign in to Your Obico Account') }}\n              </h2>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row>\n              <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                <h3 class=\"title\">{{ $t('And get instant access to') }}</h3>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('Unlimited Premium Webcam Streaming') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('Webcam-Based AI Failure Detection') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('Nozzle Ninja First Layer AI Failure Detection')\n                  }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('G-Code Remote Uploading and Printing')\n                  }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                  }}</span>\n                </div>\n                <div class=\"redirect-button d-flex flex-column align-center justify-content-center\">\n                  <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                    {{ $t('Signup/Sign In') }}\n                  </a>\n                </div>\n              </div>\n            </b-row>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nexport default {\n  name: 'BttUserNotAuthenticatedModal',\n  props: {\n    redirectUrl: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      url: '/accounts/signup/?next=' + this.redirectUrl,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding-top: 1em\n\n.title\n  margin-top: 0.5em\n  margin-bottom: 1em\n\n.feature\n  line-height: 2em\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 1.1em\n\n.redirect-button\n  margin-top: 9em\n  margin-bottom: 6em\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=template&id=217c34d2&scoped=true&\"\nimport script from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=217c34d2&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"217c34d2\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <!-- Block Activate Your Three-Month Obico Pro Plan -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-1\">\n          <div class=\"text pl-3\">\n            <div class=\"title pb-3\">{{ $t('Activate Your Three-Month Obico') }} AI Premium {{ $t('Plan') }}</div>\n            <p class=\"pb-3\">\n              {{\n                $t(\n                  'As a valued 3DO Nozzle Camera customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for 3DO customers to ensure you continue to enjoy the benefits of Obico without interruption.'\n                )\n              }}\n            </p>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/3do-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your Plan\") }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div class=\"question\">\n              <h6>{{ $t('What happens when the three-month') }} AI Premium {{ $t('Plan expires?') }}</h6>\n              <p>\n                {{ $t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s') }}\n                AI Premium\n                {{ $t('Plans at a special discounted rate. Learn more about the plan options') }}\n                <a href=\"/ent_pub/pricing/\" class=\"underline\">{{ $t('here') }}</a\n                >.\n                {{\n                  $t(\n                    'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.'\n                  )\n                }}\n              </p>\n            </div>\n            <div class=\"question\">\n              <h6>\n                {{ $t('Still have questions?') }}\n              </h6>\n              <p>\n                {{ $t('Contact') }}\n                <a href=\"mailto:support@obico.io\" class=\"underline\">{{\n                  $t('{brandName} support.', { brandName: $syndicateText.brandName })\n                }}</a>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport ThreeDORedeemCompletedModal from './components/ThreeDORedeemCompletedModal.vue'\nimport ThreeDOUserNotAuthenticatedModal from './components/ThreeDOUserNotAuthenticatedModal.vue'\n\nexport default {\n  name: 'BttRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      initialCBSubscription: null,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      couponCode: null,\n      redirectUrlWhenNotAuthenticated: '',\n      hasFreePlan: true,\n    }\n  },\n  computed: {\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    this.couponCode = urlParams.get('coupon_code')\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    // Check if coupon code is valid\n    // Add logic if necessary\n    if (this.couponCode) {\n      this.isValidCouponCode = true\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/3do/?coupon_code=' + this.couponCode + '&redirect=' + true\n      )\n    } else {\n      this.isValidCouponCode = false\n    }\n\n    if (this.isAuthenticated) {\n      axios.get(urls.activeSubscription()).then((response) => {\n        this.loaded = true\n        const data = response.data\n        const subscription = data.subscription || {}\n        this.hasFreePlan = !subscription.plan_id || subscription.plan_id == 'pro-trial'\n        this.initialCBSubscription = data ? data.cb_subscription : null\n        if (isRedirectedAfterLoginOrSignup) {\n          this.handlePlanAdded()\n        }\n      })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.open3doUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanAdded()\n      }\n    },\n    open3doUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        ThreeDOUserNotAuthenticatedModal,\n        {\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanAdded() {\n      axios\n        .post(urls.redeemThreeDO3mUnlimited(), {\n          coupon_code: this.couponCode,\n        })\n        .then(() => {\n          this.$swal.openModalWithComponent(\n            ThreeDORedeemCompletedModal,\n            {},\n            {\n              showConfirmButton: false,\n              allowOutsideClick: false,\n              width: '55em',\n            }\n          )\n        })\n        .catch((error) => {\n          const resp = error.response\n          if (resp.status === 412) {\n            const reason = resp.data.reason\n            // error may be {'reason': 'not_in_pro_trial.' or {'reason': 'already_redeemed'\n            if (reason === 'already_redeemed') {\n              this.$swal.Prompt.fire({\n                title: `${this.$i18next.t(`You have already redeemed this coupon.`)}`,\n                html: `\n                  <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n                    'Please contact Obico Support at'\n                  )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n                  `,\n                width: 600,\n              })\n            } else if (reason === 'not_in_pro_trial.') {\n              this.openAlreadyHaveProPlanModal()\n            }\n          } else {\n            this.$swal.fire({\n              title: this.$i18next.t('Error'),\n              text: this.$i18next.t('Failed to redeem the coupon code. Please try again later.'),\n              icon: 'error',\n            })\n          }\n        })\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t(`Oops! You already have an Obico`)} AI Premium ${this.$i18next.t('Plan...')}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact obico support at'\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.btt-redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThreeDORedeemPage.vue?vue&type=template&id=7d1ec790&scoped=true&\"\nimport script from \"./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThreeDORedeemPage.vue?vue&type=style&index=0&id=7d1ec790&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7d1ec790\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pricing\"},[_c('nav-bar',{attrs:{\"view-name\":\"pricing\"}}),(!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('h1',{staticClass:\"text-center mt-5\"},[_vm._v(_vm._s(_vm.$t('Kingroon Connect Plans')))]),_c('div',{staticClass:\"container text-center py-4\",attrs:{\"id\":\"pricing-selections\"}},[_c('div',{staticClass:\"btn-group btn-group-toggle\"},[_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': _vm.isAnnual },attrs:{\"id\":\"sub-annual-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Annual,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Annual)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Annual}}}),_vm._v(\" \"+_vm._s(_vm.$t('Annual (SAVE 33%)'))+\" \")]),_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': !_vm.isAnnual },attrs:{\"id\":\"sub-monthly-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Monthly,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Monthly)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Monthly}}}),_vm._v(\" \"+_vm._s(_vm.$t('Monthly'))+\" \")])])]),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row price-matrix\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Free')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Print occasionally.')))]),_vm._m(0),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('Unlimited Kingroon printers allowed')))])]),_c('div',{staticClass:\"price-action\"},[(!_vm.isAuthenticated)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Get Started')))]):_vm._e()]),_c('div',[_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"basic-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"basic-streaming-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Basic webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-free-plan-on-kingroon-pricing-page\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t('100 {localizedDom} AI Detection Hours/month, 30s detection interval')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('b',[_vm._v(_vm._s(_vm.$t('Basic')))])]},proxy:true}])})],1)],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"tunneling-cap-per-month\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-free-plan-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('300MB /mo tunnel data - Access Mainsail or Fluidd remotely'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('200MB total G-code cloud storage')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.kingroon.android\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/app/id6499243573\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Failure alerts and print status updates sent through push notification'))+\" \")])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Community technical support')))])])])])]),_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(\"AI Premium\")]),_c('div',[_vm._v(_vm._s(_vm.$t('Print every day. 2+ printers.')))]),_c('div',{staticClass:\"plan-price\"},[_c('span',[_vm._v(_vm._s(_vm.$t('$')))]),_c('span',{attrs:{\"id\":\"monthly-price\"}},[_vm._v(\"3.17\")]),_c('span',{staticClass:\"price-unit\"},[_vm._v(\" / \"+_vm._s(_vm.$t('month')))]),(_vm.isAnnual)?_c('span',{staticStyle:{\"font-size\":\"0.95rem\",\"font-weight\":\"100\"},attrs:{\"id\":\"annual-bill\"}},[_vm._v(\" \"+_vm._s(_vm.$t('(Billed {name} annually)', { name: 38 })))]):_vm._e()]),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('1st printer included')))]),_c('div',{staticClass:\"price-sub\"},[_c('span',[_vm._v(_vm._s(_vm.$t('2+ printers at $')))]),_c('span',{attrs:{\"id\":\"addl-printer-price\"}},[_vm._v(_vm._s(_vm.priceTable.basePrinterPrice))]),_vm._v(\" / \"+_vm._s(_vm.$t('month / printer'))+\" \")])]),_c('div',{staticClass:\"price-action\"},[(_vm.isAuthenticated)?_c('div',[(_vm.hasSubscription)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('View/Change Subscription')))]):_c('a',{directives:[{name:\"b-popover\",rawName:\"v-b-popover.hover\",value:({\n                  placement: 'top',\n                  content: _vm.$t('Full refund within 30 days if you are not happy.'),\n                }),expression:\"{\\n                  placement: 'top',\\n                  content: $t('Full refund within 30 days if you are not happy.'),\\n                }\",modifiers:{\"hover\":true}}],staticClass:\"btn btn-primary btn-block\",attrs:{\"id\":\"subscribe-pro\",\"role\":\"button\"},on:{\"click\":_vm.upgrade}},[_vm._v(_vm._s(_vm.$t('Upgrade (30-Day Money Back Guarantee)')))])]):_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial')))])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"premium-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"premium-streaming-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Premium webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-pro-plan-on-kingroon-pricing-page\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                        '100 {localizedDom} AI Detection Hours per month, 10s detection interval'\n                      )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('b',[_vm._v(_vm._s(_vm.$t('Advanced')))])]},proxy:true}])})],1)],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"unlimited-tunnling-for-pro\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-pro-plan-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited tunnel data - Access Mainsail or fluidd remotely'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('5GB total G-Code cloud storage')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Failure alerts and print status updates sent through push notification'))+\" \")])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Email technical support')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Printer feed sharing with premium streaming quality')))])])])])])]),_c('QuestionsKingroonSection',{on:{\"calc\":_vm.calc}})],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"plan-price\"},[_vm._v(\" $0 \"),_c('span',{staticClass:\"price-unit\"})])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"row justify-content-center py-4\"},[_c('div',{staticClass:\"col-12 text-center\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('Questions You May Have')))])])]),_c('div',{staticClass:\"row justify-content-center pb-5\"},[_c('div',{staticClass:\"col-lg-10 col-md-12\",attrs:{\"id\":\"accordion\",\"role\":\"tablist\"}},[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-1\",modifiers:{\"accordion-1\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What currency are your prices in?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-1\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('They’re in US dollars.')))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-2\",modifiers:{\"accordion-2\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-2\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Which plan is right for me?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-2\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('It depends on how many 3D printers you have, and how often you print.')))]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The Free plan is for users who print occasionally. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 1 FPS). The Free plan even comes with 100 free Basic AI Detection Hours per month. Hours don't roll over month to month.`\n                  )}})],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The {planName} plan is for users who print more often and want to enjoy additional features like watching the webcam feed at the slick 25 FPS rate. It also comes with 100 Advanced AI Detection Hours every month - giving you the ability to detect failures faster and more reliably. If you occasionally print more than 100 hours a month, you will most likely be ok because the Advanced AI Detection Hours roll over month to month.`\n                  )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-4\",modifiers:{\"accordion-4\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-4\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I change my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-4\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.' ))+\" \")]),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'You will keep the unused AI Detection Hours when you change your subscription plan.' ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-5\",modifiers:{\"accordion-5\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-5\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I cancel my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-5\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('Yes again! You can cancel your subscription any time.')))]),_c('b-card-text',[_vm._v(_vm._s(_vm.$t( 'However, the AI Detection Hours included in the plan will expire at the end of your subscription period.' )))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-6\",modifiers:{\"accordion-6\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-6\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What is your refund policy?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-6\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`We offer a {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',[_vm._v(_vm._s(_vm.$t('30-Day Full Refund Policy')))])]},proxy:true}])}),_vm._v(\" . \")],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                  )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\" ))+\" \")]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-7\",modifiers:{\"accordion-7\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-7\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Is it safe to give my credit card number to the Kingroon?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-7\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":\"https://www.chargebee.com/security/\"}},[_vm._v(_vm._s(_vm.$t('a fully compliant billing service provider')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Under no circumstances will Kingroon process or store your payment information.' ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-8\",modifiers:{\"accordion-8\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-8\"}},[_vm._v(\" \"+_vm._s(_vm.$t('I have many printers and print a lot. The'))+\" AI Premium \"+_vm._s(_vm.$t('plan becomes really expensive. Can I still use the Kingroon app?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-8\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Please {localizedDom} to customize a plan that works for your budget.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('contact us')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-9\",modifiers:{\"accordion-9\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-9\"}},[_vm._v(\" \"+_vm._s(_vm.$t( 'I saw {brandName} mentioned somewhere. What does {brandName} have to do with Kingroon?', { brandName: _vm.$syndicateText.brandName, } ))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-9\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( '{brandName} has partnered with Kingroon to provide Kingroon users with AI and a mobile app for Kingroon 3D printers. {brandName}, a US based company is the developer of the Kingroon App.', { brandName: _vm.$syndicateText.brandName, } ))+\" \")])],1)],1)],1)],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div class=\"row justify-content-center py-4\">\n      <div class=\"col-12 text-center\">\n        <h1>{{ $t('Questions You May Have') }}</h1>\n      </div>\n    </div>\n    <div class=\"row justify-content-center pb-5\">\n      <div id=\"accordion\" class=\"col-lg-10 col-md-12\" role=\"tablist\">\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-1\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-1\"\n            >\n              {{ $t('What currency are your prices in?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-1\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{ $t('They’re in US dollars.') }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-2\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-2\"\n            >\n              {{ $t('Which plan is right for me?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-2\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('It depends on how many 3D printers you have, and how often you print.')\n              }}</b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The Free plan is for users who print occasionally. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 1 FPS). The Free plan even comes with 100 free Basic AI Detection Hours per month. Hours don't roll over month to month.`\n                    )\n                  \"\n                >\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The {planName} plan is for users who print more often and want to enjoy additional features like watching the webcam feed at the slick 25 FPS rate. It also comes with 100 Advanced AI Detection Hours every month - giving you the ability to detect failures faster and more reliably. If you occasionally print more than 100 hours a month, you will most likely be ok because the Advanced AI Detection Hours roll over month to month.`\n                    )\n                  \"\n                >\n                  <template #planName>AI Premium</template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-4\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-4\"\n            >\n              {{ $t('Can I change my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-4\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                {{\n                  $t(\n                    'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.'\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'You will keep the unused AI Detection Hours when you change your subscription plan.'\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-5\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-5\"\n            >\n              {{ $t('Can I cancel my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-5\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('Yes again! You can cancel your subscription any time.')\n              }}</b-card-text>\n              <b-card-text>{{\n                $t(\n                  'However, the AI Detection Hours included in the plan will expire at the end of your subscription period.'\n                )\n              }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-6\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-6\"\n            >\n              {{ $t('What is your refund policy?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-6\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next :translation=\"$t(`We offer a {localizedDom}`)\">\n                  <template #localizedDom>\n                    <strong>{{ $t('30-Day Full Refund Policy') }}</strong>\n                  </template>\n                </i18next>\n                .\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                    )\n                  \"\n                >\n                  <template #planName>AI Premium</template>\n                  <template #localizedDom>\n                    <a :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\"\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-7\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-7\"\n            >\n              {{ $t('Is it safe to give my credit card number to the Kingroon?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-7\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" href=\"https://www.chargebee.com/security/\">{{\n                      $t('a fully compliant billing service provider')\n                    }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'Under no circumstances will Kingroon process or store your payment information.'\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-8\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-8\"\n            >\n              {{ $t('I have many printers and print a lot. The') }}\n              AI Premium\n              {{ $t('plan becomes really expensive. Can I still use the Kingroon app?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-8\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(`Please {localizedDom} to customize a plan that works for your budget.`)\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('contact us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-9\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-9\"\n            >\n              {{\n                $t(\n                  'I saw {brandName} mentioned somewhere. What does {brandName} have to do with Kingroon?',\n                  {\n                    brandName: $syndicateText.brandName,\n                  }\n                )\n              }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-9\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                {{\n                  $t(\n                    '{brandName} has partnered with Kingroon to provide Kingroon users with AI and a mobile app for Kingroon 3D printers. {brandName}, a US based company is the developer of the Kingroon App.',\n                    {\n                      brandName: $syndicateText.brandName,\n                    }\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { SupportEmail } from '@entSrc/lib/consts.js'\n\nexport default {\n  name: 'QuestionsKingroonSection',\n  computed: {\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-link\n  cursor: pointer\n#accordion .card\n  background: #000000\na.link\n  color: #ED7100 !important\na\n  color: #ED7100\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuestionsKingroonSection.vue?vue&type=template&id=84449caa&scoped=true&\"\nimport script from \"./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"\nexport * from \"./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuestionsKingroonSection.vue?vue&type=style&index=0&id=84449caa&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"84449caa\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.inMobileWebView)?_c('b-navbar',{class:{\n      'navbar-dark': _vm.theme === _vm.themes.Dark,\n      'navbar-light': _vm.theme === _vm.themes.Light,\n    },attrs:{\"toggleable\":\"xl\"}},[_c('b-container',{staticClass:\"p-0\"},[_c('b-navbar-brand',{attrs:{\"href\":\"https://kingroon.com/\"}},[_c('SyndicateAwareSVG',{attrs:{\"href\":\"#svg-kingroon-logo-compact\",\"width\":\"100\",\"height\":\"30\"}})],1),_c('b-navbar-toggle',{attrs:{\"target\":\"navbar-toggle-collapse\"}},[_c('span',{staticClass:\"navbar-toggler-icon\"})]),_c('b-collapse',{attrs:{\"id\":\"navbar-toggle-collapse\",\"is-nav\":\"\"},model:{value:(_vm.showMainMenu),callback:function ($$v) {_vm.showMainMenu=$$v},expression:\"showMainMenu\"}},[_c('b-navbar-nav',[(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('printers') },attrs:{\"href\":\"https://app.kingroon.com/printers/\"}},[_vm._v(_vm._s(_vm.$t(\"Printers\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('print_history') },attrs:{\"href\":\"https://app.kingroon.com/print_history/\"}},[_vm._v(_vm._s(_vm.$t(\"Print History\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('g_code_folders') },attrs:{\"href\":\"https://app.kingroon.com/g_code_folders/cloud/\"}},[_vm._v(_vm._s(_vm.$t(\"G-Codes\")))]):_vm._e(),(_vm.isEnt)?_c('b-nav-item',{class:{ active: _vm.viewName === 'pricing' },attrs:{\"href\":\"https://app.kingroon.com/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Pricing\")))]):_vm._e(),_c('b-nav-item',{attrs:{\"href\":\"https://docs.kingroon.com/\"}},[_vm._v(_vm._s(_vm.$t(\"Help\")))])],1),_c('b-navbar-nav',{staticClass:\"ml-auto\"},[(!_vm.user)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/login/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN IN\")))]):_vm._e(),(!_vm.user && _vm.allowSignUp)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN UP\")))]):_vm._e(),(_vm.user)?_c('b-nav-item-dropdown',{ref:\"accountDropdown\",attrs:{\"right\":\"\",\"toggle-class\":\"user-menu\",\"text\":_vm.user.first_name || _vm.user.email}},[_c('b-dropdown-item',{attrs:{\"href\":\"/user_preferences/\"}},[_c('i',{staticClass:\"fas fa-cog mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Preferences\"))+\" \")]),_c('b-dropdown-divider'),_c('b-dropdown-item',{attrs:{\"href\":\"/accounts/logout/\"}},[_c('i',{staticClass:\"fas fa-sign-out-alt mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Log out\"))+\" \")])],1):_vm._e()],1)],1)],1)],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <b-navbar\n      v-if=\"!inMobileWebView\"\n      toggleable=\"xl\"\n      :class=\"{\n        'navbar-dark': theme === themes.Dark,\n        'navbar-light': theme === themes.Light,\n      }\"\n    >\n      <b-container class=\"p-0\">\n        <b-navbar-brand href=\"https://kingroon.com/\">\n          <SyndicateAwareSVG href=\"#svg-kingroon-logo-compact\" width=\"100\" height=\"30\" />\n        </b-navbar-brand>\n\n        <b-navbar-toggle target=\"navbar-toggle-collapse\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </b-navbar-toggle>\n\n        <b-collapse id=\"navbar-toggle-collapse\" v-model=\"showMainMenu\" is-nav>\n          <b-navbar-nav>\n            <b-nav-item\n              v-if=\"user\"\n              href=\"https://app.kingroon.com/printers/\"\n              :class=\"{ active: viewName.includes('printers') }\"\n              >{{ $t(\"Printers\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"https://app.kingroon.com/print_history/\"\n              :class=\"{ active: viewName.includes('print_history') }\"\n              >{{ $t(\"Print History\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"https://app.kingroon.com/g_code_folders/cloud/\"\n              :class=\"{ active: viewName.includes('g_code_folders') }\"\n              >{{ $t(\"G-Codes\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"isEnt\"\n              href=\"https://app.kingroon.com/ent_pub/pricing/\"\n              :class=\"{ active: viewName === 'pricing' }\"\n              >{{ $t(\"Pricing\") }}</b-nav-item\n            >\n            <b-nav-item href=\"https://docs.kingroon.com/\">{{ $t(\"Help\") }}</b-nav-item>\n          </b-navbar-nav>\n\n          <b-navbar-nav class=\"ml-auto\">\n            <b-nav-item v-if=\"!user\" href=\"/accounts/login/\">{{ $t(\"SIGN IN\") }}</b-nav-item>\n            <b-nav-item v-if=\"!user && allowSignUp\" href=\"/accounts/signup/\">{{ $t(\"SIGN UP\") }}</b-nav-item>\n            <b-nav-item-dropdown\n              v-if=\"user\"\n              ref=\"accountDropdown\"\n              right\n              toggle-class=\"user-menu\"\n              :text=\"user.first_name || user.email\"\n            >\n              <b-dropdown-item href=\"/user_preferences/\">\n                <i class=\"fas fa-cog mr-2\"></i>{{$t(\"Preferences\")}}\n              </b-dropdown-item>\n              <b-dropdown-divider></b-dropdown-divider>\n              <b-dropdown-item href=\"/accounts/logout/\">\n                <i class=\"fas fa-sign-out-alt mr-2\"></i>{{$t(\"Log out\")}}\n              </b-dropdown-item>\n            </b-nav-item-dropdown>\n          </b-navbar-nav>\n        </b-collapse>\n      </b-container>\n    </b-navbar>\n  </div>\n</template>\n\n<script>\nimport { inMobileWebView, user, settings } from '@src/lib/page-context'\nimport { Themes } from '@static/js/color-scheme'\nimport { currentThemeValue } from '@src/lib/color-scheme-controller'\n\nexport default {\n  name: 'KingroonNavBar',\n\n  components: {},\n\n  props: {\n    viewName: {\n      default() {\n        return ''\n      },\n      type: String,\n    },\n  },\n\n  data() {\n    return {\n      user: null,\n      allowSignUp: false,\n      isEnt: false,\n      themes: Themes,\n      showMainMenu: false,\n    }\n  },\n\n  computed: {\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n\n    theme() {\n      return currentThemeValue()\n    },\n  },\n\n  created() {\n    const { ACCOUNT_ALLOW_SIGN_UP, IS_ENT } = settings()\n    this.allowSignUp = !!ACCOUNT_ALLOW_SIGN_UP\n    this.isEnt = !!IS_ENT\n    this.user = user()\n  },\n\n  methods: {\n    hideDropdowns() {\n      this.showMainMenu = false\n\n      // Check account dropdown (preferences and logout)\n      const accountDropdown = this.$refs.accountDropdown\n      if (accountDropdown) {\n        accountDropdown.hide()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n::v-deep .navbar\n  padding: 0.5rem 1rem\n  background: #131920 !important\n\n  a.navbar-brand\n    margin-top: -3px\n\n  .navbar-toggler\n    color: var(--color-text-primary)\n\n  .nav-item\n    text-transform: uppercase\n\n  .user-menu\n    text-transform: none\n\n  .badge-btn\n    position: relative\n    height: 1.8rem\n    margin-right: 1.5em\n\n    img\n      height: 1.3rem\n\n    .badge\n      position: absolute\n      left: 22px\n      top: 1px\n      height: 18px\n      border-radius: 4px\n      transition: transform 0.2s\n\n      /* Animation */\n      &:hover\n        transform: scale(1.3)\n\n  @media (min-width: 1200px)\n    padding: 0rem 1rem\n\n    .nav-item\n      padding: 0.5rem 0.24rem\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonNavBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonNavBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KingroonNavBar.vue?vue&type=template&id=3e53836d&scoped=true&\"\nimport script from \"./KingroonNavBar.vue?vue&type=script&lang=js&\"\nexport * from \"./KingroonNavBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KingroonNavBar.vue?vue&type=style&index=0&id=3e53836d&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3e53836d\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"pricing\">\n    <nav-bar view-name=\"pricing\"></nav-bar>\n\n    <div v-if=\"!loaded\" class=\"text-center my-5\">\n      <b-spinner></b-spinner>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <h1 class=\"text-center mt-5\">{{ $t('Kingroon Connect Plans') }}</h1>\n      <!-- <div class=\"text-center py-1\">\n        {{ $t('Powered by {obico}', { obico: $syndicateText.brandName }) }}\n      </div> -->\n      <div id=\"pricing-selections\" class=\"container text-center py-4\">\n        <div class=\"btn-group btn-group-toggle\">\n          <label\n            id=\"sub-annual-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Annual\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Annual (SAVE 33%)') }}\n          </label>\n          <label\n            id=\"sub-monthly-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': !isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Monthly\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Monthly') }}\n          </label>\n        </div>\n      </div>\n      <div class=\"container\">\n        <div class=\"row price-matrix\">\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">{{ $t('Free') }}</div>\n              <div>{{ $t('Print occasionally.') }}</div>\n              <div class=\"plan-price\">\n                $0\n                <span class=\"price-unit\" />\n              </div>\n              <div class=\"price-sub\">{{ $t('Unlimited Kingroon printers allowed') }}</div>\n            </div>\n            <div class=\"price-action\">\n              <a\n                v-if=\"!isAuthenticated\"\n                role=\"button\"\n                class=\"btn btn-primary btn-block\"\n                href=\"/accounts/signup/\"\n                >{{ $t('Get Started') }}</a\n              >\n            </div>\n            <div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"basic-webcam-streaming\">\n                    <help-widget id=\"basic-streaming-on-kingroon-pricing-page\">\n                      {{ $t('Basic webcam streaming') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"detective-hours-free-plan-on-kingroon-pricing-page\">\n                      <i18next\n                        :translation=\"\n                          $t('100 {localizedDom} AI Detection Hours/month, 30s detection interval')\n                        \"\n                      >\n                        <template #localizedDom>\n                          <b>{{ $t('Basic') }}</b>\n                        </template>\n                      </i18next>\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"tunneling-cap-per-month\">\n                    <help-widget id=\"tunneling-free-plan-on-kingroon-pricing-page\">\n                      {{ $t('300MB /mo tunnel data - Access Mainsail or Fluidd remotely') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('200MB total G-code cloud storage') }}</div>\n                </div>\n              </div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <i18next\n                      :translation=\"\n                        $t('Companion mobile app for {localizedDom} and {localizedDom2}')\n                      \"\n                    >\n                      <template #localizedDom>\n                        <a\n                          href=\"https://play.google.com/store/apps/details?id=com.kingroon.android\"\n                          >{{ $t('Android') }}</a\n                        >\n                      </template>\n                      <template #localizedDom2>\n                        <a href=\"https://apps.apple.com/app/id6499243573\">{{ $t('iOS') }}</a>\n                      </template>\n                    </i18next>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Remote printer access and control') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{\n                      $t('Failure alerts and print status updates sent through push notification')\n                    }}\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Community technical support') }}</div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">AI Premium</div>\n              <div>{{ $t('Print every day. 2+ printers.') }}</div>\n              <div class=\"plan-price\">\n                <span>{{ $t('$') }}</span>\n                <span id=\"monthly-price\">3.17</span>\n                <span class=\"price-unit\">&nbsp;/ {{ $t('month') }}</span>\n                <span v-if=\"isAnnual\" id=\"annual-bill\" style=\"font-size: 0.95rem; font-weight: 100\"\n                  >&nbsp;{{ $t('(Billed {name} annually)', { name: 38 }) }}</span\n                >\n              </div>\n              <div class=\"price-sub\">{{ $t('1st printer included') }}</div>\n              <div class=\"price-sub\">\n                <span>{{ $t('2+ printers at $') }}</span>\n                <span id=\"addl-printer-price\">{{ priceTable.basePrinterPrice }}</span>\n                / {{ $t('month / printer') }}\n              </div>\n            </div>\n            <div class=\"price-action\">\n              <div v-if=\"isAuthenticated\">\n                <a\n                  v-if=\"hasSubscription\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  href=\"/user_preferences/subscription/\"\n                  >{{ $t('View/Change Subscription') }}</a\n                >\n                <a\n                  v-else\n                  id=\"subscribe-pro\"\n                  v-b-popover.hover=\"{\n                    placement: 'top',\n                    content: $t('Full refund within 30 days if you are not happy.'),\n                  }\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  @click=\"upgrade\"\n                  >{{ $t('Upgrade (30-Day Money Back Guarantee)') }}</a\n                >\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"btn btn-primary btn-block\" href=\"/accounts/signup/\">{{\n                  $t('Start 1 month FREE trial')\n                }}</a>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"premium-webcam-streaming\">\n                  <help-widget id=\"premium-streaming-on-kingroon-pricing-page\">\n                    {{ $t('Premium webcam streaming') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"detective-hours-pro-plan-on-kingroon-pricing-page\">\n                    <i18next\n                      :translation=\"\n                        $t(\n                          '100 {localizedDom} AI Detection Hours per month, 10s detection interval'\n                        )\n                      \"\n                    >\n                      <template #localizedDom>\n                        <b>{{ $t('Advanced') }}</b>\n                      </template>\n                    </i18next>\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"unlimited-tunnling-for-pro\">\n                  <help-widget id=\"tunneling-pro-plan-on-kingroon-pricing-page\">\n                    {{ $t('Unlimited tunnel data - Access Mainsail or fluidd remotely') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('5GB total G-Code cloud storage') }}</div>\n              </div>\n            </div>\n            <div class=\"features\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <i18next\n                    :translation=\"$t('Companion mobile app for {localizedDom} and {localizedDom2}')\"\n                  >\n                    <template #localizedDom>\n                      <a\n                        href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n                        >{{ $t('Android') }}</a\n                      >\n                    </template>\n                    <template #localizedDom2>\n                      <a\n                        href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n                        >{{ $t('iOS') }}</a\n                      >\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Remote printer access and control') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  {{ $t('Failure alerts and print status updates sent through push notification') }}\n                </div>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Email technical support') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Printer feed sharing with premium streaming quality') }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <QuestionsKingroonSection @calc=\"calc\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport {\n  BillingCycle,\n  DHPacks,\n  PrepaidDHPacks,\n  CalcPeriod,\n  calcPriceTable,\n  calcDHPackPrice,\n} from '@entSrc/lib/pricing.js'\n\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport { SupportEmail } from '@entSrc/lib/consts.js'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport axios from '@src/lib/axios-csrf'\nimport urls from '@config/server-urls'\n\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport QuestionsKingroonSection from '@entSrc/components/pricing/QuestionsKingroonSection.vue'\nimport NavBar from '@entSrc/components/KingroonNavBar.vue'\n\nexport default {\n  name: 'KingroonPricingPage',\n  components: {\n    QuestionsKingroonSection,\n    NavBar,\n    HelpWidget,\n  },\n  props: {\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    annualAsDefault: {\n      type: Boolean,\n      default() {\n        return true\n      },\n    },\n  },\n  data() {\n    return {\n      initialCBSubscription: null,\n      loaded: false,\n      billingCycle: this.annualAsDefault ? BillingCycle.Annual : BillingCycle.Monthly,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      isCalcOpen: false,\n      selectedPrepaidPack: null,\n    }\n  },\n  computed: {\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n    isAnnual() {\n      return this.billingCycle === BillingCycle.Annual\n    },\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n    priceTable() {\n      return calcPriceTable(this.billingCycle, this.numPrinters, this.dhPackKey)\n    },\n  },\n  created() {\n    this.BillingCycle = BillingCycle\n    this.DHPacks = DHPacks\n    this.PrepaidDHPacks = PrepaidDHPacks\n    this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n    if (this.isAuthenticated) {\n      axios.get(urls.activeSubscription()).then((response) => {\n        this.loaded = true\n        const data = response.data\n        this.initialCBSubscription = data ? data.cb_subscription : null\n      })\n    } else {\n      this.loaded = true\n    }\n  },\n  mounted() {\n    // Google Optimize\n    let googleOptimizeScript = document.createElement('script')\n    googleOptimizeScript.setAttribute(\n      'src',\n      'https://www.googleoptimize.com/optimize.js?id=OPT-NVC4QPD'\n    )\n    document.head.appendChild(googleOptimizeScript)\n    document.body.classList.add('kingroon-page')\n  },\n  beforeDestroy() {\n    document.body.classList.remove('kingroon-page')\n  },\n  methods: {\n    getDHPackLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month`, { name: DHPacks[key].hours })}`\n        : `${this.$i18next.t('AI Detection Hour Pack not selected')}`\n    },\n    getDHPackSubLabel(key) {\n      const year = calcDHPackPrice(this.billingCycle, CalcPeriod.Year, key)\n      const month = calcDHPackPrice(this.billingCycle, CalcPeriod.Month, key)\n      const hour = (month / DHPacks[key].hours).toFixed(4)\n\n      if (key > 0) {\n        return this.billingCycle == BillingCycle.Annual\n          ? `${this.$i18next.t(\n              ' for ${month} / month (${hour} / AI Detection Hour). Billed ${year} annually.',\n              { month, hour, year }\n            )}`\n          : `${this.$i18next.t(' for ${month} / month (${hour} / AI Detection Hour).', {\n              month,\n              hour,\n            })}`\n      }\n      return ''\n    },\n    calc() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    calcWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    upgrade() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    upgradeWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    checkoutPrepaidDHPack(level) {\n      chargeBee.checkout(this.chargeBeeInstance, '/ent/generate_prepaid_dhpack_checkout_url/', {\n        dhpack_level: level,\n      })\n    },\n    purchasePrepaidPack() {\n      if (this.selectedPrepaidPack === null) {\n        return\n      } else {\n        this.checkoutPrepaidDHPack(this.selectedPrepaidPack)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn-primary\n  background-color: #ED7100\n  border-color: #ED7100\n.keyfeatures\n  color: #ED7100 !important\na\n  color: #ED7100\n.pricing .price-matrix div[class^=col-] .price-header, .pricing .price-matrix div[class^=col-] .price-action, .pricing .price-matrix div[class^=col-] > div, .pricing .price-matrix div[class^=col-]\n  background: #000000\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonPricingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonPricingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KingroonPricingPage.vue?vue&type=template&id=0cc96e90&scoped=true&\"\nimport script from \"./KingroonPricingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./KingroonPricingPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KingroonPricingPage.vue?vue&type=style&index=0&id=0cc96e90&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0cc96e90\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pricing-page\"},[(_vm.canGoBackToChat)?_c('div',{staticClass:\"pricing-header\"},[_c('div',{staticClass:\"header-left\"},[_c('a',{staticClass:\"header-button\",attrs:{\"href\":\"/jusprin/v1.0/embedded_chat/\",\"title\":_vm.$t('Back to Chat')}},[_c('i',{staticClass:\"mdi mdi-arrow-left large-icon\"}),_c('span',{staticClass:\"button-text\"},[_vm._v(_vm._s(_vm.$t('Back to Chat')))])])])]):_vm._e(),_c('div',{staticClass:\"container content-container\"},[_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-10\"},[(!_vm.loading)?_c('div',{staticClass:\"pricing-container\"},[_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-5 col-md-6 mb-4\"},[_c('div',{staticClass:\"pricing-card\"},[_c('div',{staticClass:\"plan-header\"},[_c('h2',{staticClass:\"plan-title\"},[_vm._v(_vm._s(_vm.$t('Free')))]),_c('p',{staticClass:\"plan-subtitle\"},[_vm._v(_vm._s(_vm.$t('Free for everyone')))])]),_vm._m(0),_c('div',{staticClass:\"plan-action\"},[_c('button',{staticClass:\"btn current-plan-btn\",class:_vm.hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary',attrs:{\"disabled\":!_vm.hasActiveSubscription},on:{\"click\":_vm.downgradeToFree}},[_vm._v(\" \"+_vm._s(_vm.freeButtonText)+\" \")])]),_c('div',{staticClass:\"plan-features\"},[_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('50 AI credits per month. Reset on the first day of each month')))])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('Community support')))])])])])]),_c('div',{staticClass:\"col-lg-5 col-md-6 mb-4\"},[_c('div',{staticClass:\"pricing-card\"},[_c('div',{staticClass:\"plan-header\"},[_c('h2',{staticClass:\"plan-title\"},[_vm._v(_vm._s(_vm.$t('JusPrin Unlimited')))]),_c('div',{staticClass:\"billing-toggle\"},[_c('span',{staticClass:\"billing-text\"},[_vm._v(_vm._s(_vm.$t('Billed annually')))]),_c('div',{staticClass:\"toggle-switch\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.isAnnual),expression:\"isAnnual\"}],staticClass:\"toggle-input\",attrs:{\"id\":\"billing-toggle\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.isAnnual)?_vm._i(_vm.isAnnual,null)>-1:(_vm.isAnnual)},on:{\"change\":function($event){var $$a=_vm.isAnnual,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.isAnnual=$$a.concat([$$v]))}else{$$i>-1&&(_vm.isAnnual=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.isAnnual=$$c}}}}),_vm._m(1)])])]),_c('div',{staticClass:\"plan-price\"},[_c('div',{staticClass:\"price-container\"},[(_vm.hasActiveObicoProSubscription)?_c('span',{staticClass:\"original-price\"},[_vm._v(\" $\"+_vm._s(_vm.originalPriceDollars)),_c('span',{staticClass:\"original-price-cents\"},[_vm._v(\".\"+_vm._s(_vm.originalPriceCents))])]):_vm._e(),_c('span',{staticClass:\"price\"},[_vm._v(\" $\"+_vm._s(_vm.discountedPriceDollars)),_c('span',{staticClass:\"price-cents\"},[_vm._v(\".\"+_vm._s(_vm.discountedPriceCents))])]),_c('span',{staticClass:\"price-period\"},[_vm._v(_vm._s(_vm.isAnnual ? _vm.$t('per year') : _vm.$t('per month')))])]),(_vm.hasActiveObicoProSubscription)?_c('div',{staticClass:\"obico-discount-banner\"},[_c('i',{staticClass:\"fas fa-star\"}),_c('span',[_vm._v(_vm._s(_vm.$t('{percentage}% off for Obico Pro subscribers, Yay!', { percentage: _vm.obicoProDiscountPercentage, })))])]):_vm._e()]),_c('div',{staticClass:\"plan-action\"},[_c('button',{staticClass:\"btn upgrade-btn\",class:_vm.hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary',on:{\"click\":_vm.upgradeToProPlan}},[_vm._v(\" \"+_vm._s(_vm.upgradeButtonText)+\" \")])]),_c('div',{staticClass:\"plan-features\"},[_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',{staticClass:\"important-feature\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited AI credits'))+\" \"),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}}),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}}),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}}),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}})])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',{staticClass:\"important-feature\"},[_vm._v(_vm._s(_vm.$t('Unlimited \"Do Your Magic\" AI generations')))])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('AI memory: remember your slicing preferences')))])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('Email support. 24 hours response time')))])])])])])])]):_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"text-center\"},[_c('div',{staticClass:\"spinner-border text-primary\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t('Loading...')))])]),_c('p',{staticClass:\"mt-2\"},[_vm._v(_vm._s(_vm.$t('Loading subscription information...')))])])])])]),_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-10\"},[_c('div',{staticClass:\"faq-container\"},[_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-10\"},[_c('div',{staticClass:\"faq-section\"},[_c('h2',{staticClass:\"faq-title\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'I am an Obico Pro Plan subscriber. Am I eligible for a discount on the Unlimited Plan?' ))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"Yes! You'll receive 30% off the Unlimited Plan. By the way, thank you for supporting the Obico project! 😊\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"I'm an Obico Pro Plan subscriber. Why don't I see the 30% discount?\"))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"First, make sure you're signed into the Obico account with an active Pro subscription. If you still don't see the discount on this page, it should appear at checkout. If it doesn't show up there either, please contact us at support@obico.io for assistance.\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('Am I able to cancel the Unlimited Plan?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Yes, you can cancel at any time by clicking 'Downgrade to Free.'\"))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('What happens after I downgrade to the Free plan?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"Your Unlimited Plan won't renew when your current term ends, and your account won't be charged. You'll still have access to unlimited AI credits until the end of your current term.\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('Can I get a refund for the Unlimited Plan?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"By default, no. This is to prevent abuse, as processing refunds incurs significant fees that we're unable to absorb.\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('Is it possible to request an exception for a refund?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'We handle these requests on a case-by-case basis. You can contact support@obico.io to request an exception and provide your reason for the request.' ))+\" \")])])])])])])])])]),(_vm.showSuccessPopup)?_c('div',{staticClass:\"success-popup-overlay\"},[_c('div',{staticClass:\"success-popup-modal\"},[_c('div',{staticClass:\"success-popup-content\"},[_c('h3',{staticClass:\"success-title\"},[_vm._v(\"🎉 \"+_vm._s(_vm.$t('Unlimited Plan Activated!')))]),_c('p',{staticClass:\"success-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('Enjoy unlimited AI credits!'))+\" \")]),(_vm.canGoBackToChat)?_c('div',{staticClass:\"countdown-container\"},[_c('div',{staticClass:\"circular-progress\"},[_c('svg',{staticClass:\"progress-circle\",attrs:{\"viewBox\":\"0 0 120 120\"}},[_c('circle',{staticClass:\"progress-track\",attrs:{\"cx\":\"60\",\"cy\":\"60\",\"r\":\"50\",\"fill\":\"none\",\"stroke\":\"var(--color-divider)\",\"stroke-width\":\"8\"}}),_c('circle',{staticClass:\"progress-bar\",attrs:{\"cx\":\"60\",\"cy\":\"60\",\"r\":\"50\",\"fill\":\"none\",\"stroke\":\"var(--color-primary)\",\"stroke-width\":\"8\",\"stroke-linecap\":\"round\",\"stroke-dasharray\":_vm.circleCircumference,\"stroke-dashoffset\":_vm.circleOffset}})]),_c('div',{staticClass:\"countdown-text\"},[_c('span',{staticClass:\"countdown-number\"},[_vm._v(_vm._s(_vm.countdownSeconds))])])]),_c('p',{staticClass:\"redirect-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('Redirecting to chat window in'))+\" \"),_c('strong',[_vm._v(_vm._s(_vm.countdownSeconds))]),_vm._v(\" \"+_vm._s(_vm.countdownSeconds === 1 ? _vm.$t('second') : _vm.$t('seconds'))+\" \")])]):_vm._e(),(!_vm.canGoBackToChat)?_c('div',{staticClass:\"no-redirect-message\"},[_c('p',{staticClass:\"close-app-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('You can now close the JusPrin app to make sure the new plan will be effective.'))+\" \")])]):_vm._e(),(_vm.canGoBackToChat)?_c('div',{staticClass:\"popup-actions\"},[_c('button',{staticClass:\"btn btn-outline-secondary cancel-btn\",on:{\"click\":_vm.cancelRedirect}},[_vm._v(\" \"+_vm._s(_vm.$t('Cancel'))+\" \")]),_c('button',{staticClass:\"btn btn-primary redirect-btn\",on:{\"click\":_vm.redirectToChat}},[_vm._v(\" \"+_vm._s(_vm.$t('Go to Chat Now'))+\" \")])]):_vm._e(),(!_vm.canGoBackToChat)?_c('div',{staticClass:\"popup-actions\"},[_c('button',{staticClass:\"btn btn-primary close-btn\",on:{\"click\":_vm.closeSuccessPopup}},[_vm._v(\" \"+_vm._s(_vm.$t('OK'))+\" \")])]):_vm._e()])])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"plan-price\"},[_c('span',{staticClass:\"price\"},[_vm._v(\"$0\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('label',{staticClass:\"toggle-label\",attrs:{\"for\":\"billing-toggle\"}},[_c('span',{staticClass:\"toggle-slider\"})])\n}]\n\nexport { render, staticRenderFns }","import axios from 'axios'\n\nconst init = (site) => {\n  return window.Chargebee.init({ site })\n}\n\nconst checkout = (chargebeeInstance, data, errorHandler = null) => {\n  chargebeeInstance.openCheckout({\n    hostedPage: function () {\n      return axios\n        .get('/ent/jusprin/generate_checkout_url/', {\n          params: data,\n          headers: {\n            Accept: 'application/json',\n            'Content-Type': 'application/json',\n          },\n        })\n        .then((result) => result.data)\n    },\n    error: function () {\n      if (errorHandler) {\n        errorHandler()\n      }\n    },\n  })\n}\n\nconst portal = (chargebeeInstance) => {\n  chargebeeInstance.setPortalSession(function () {\n    return axios\n      .get('/ent/jusprin/generate_portal_session/', {\n        headers: {\n          Accept: 'application/json',\n          'Content-Type': 'application/json',\n        },\n      })\n      .then((result) => result.data)\n  })\n\n  const cbPortal = chargebeeInstance.createChargebeePortal()\n  cbPortal.open({\n    close() {},\n  })\n}\n\nexport { init, checkout, portal }\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('div',{staticClass:\"lead\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Your JusPrin Unlimited subscription will be cancelled at the end of the billing cycle and you will downgrade to the Free plan.' ))+\" \")]),_c('br'),_c('div',{staticClass:\"lead\"},[_vm._v(\" \"+_vm._s(_vm.$t('You will lose unlimited AI credits and return to 50 AI credits per month.'))+\" \")]),_c('br'),_c('div',{staticClass:\"lead\"},[_vm._v(\" \"+_vm._s(_vm.$t('Are you sure you want to proceed?'))+\" \")]),_c('div',{staticClass:\"mt-2 text-center\"},[_c('button',{staticClass:\"btn btn-primary border m-2\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.cancel}},[_vm._v(\" \"+_vm._s(_vm.$t(\"I changed my mind. I'll keep my subscription\"))+\" \")]),_c('button',{staticClass:\"btn btn-secondary border m-2\",attrs:{\"type\":\"submit\"},on:{\"click\":_vm.confirm}},[_vm._v(\" \"+_vm._s(_vm.$t('Yes, downgrade to Free plan'))+\" \")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"p-2\">\n    <div class=\"lead\">\n      {{\n        $t(\n          'Your JusPrin Unlimited subscription will be cancelled at the end of the billing cycle and you will downgrade to the Free plan.'\n        )\n      }}\n    </div>\n    <br />\n    <div class=\"lead\">\n      {{ $t('You will lose unlimited AI credits and return to 50 AI credits per month.') }}\n    </div>\n    <br />\n    <div class=\"lead\">\n      {{ $t('Are you sure you want to proceed?') }}\n    </div>\n    <div class=\"mt-2 text-center\">\n      <button type=\"button\" class=\"btn btn-primary border m-2\" @click=\"cancel\">\n        {{ $t(\"I changed my mind. I'll keep my subscription\") }}\n      </button>\n      <button type=\"submit\" class=\"btn btn-secondary border m-2\" @click=\"confirm\">\n        {{ $t('Yes, downgrade to Free plan') }}\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from '@src/lib/axios-csrf'\n\nexport default {\n  name: 'DowngradeConfirmation',\n\n  props: {\n    subscription: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  methods: {\n    cancel() {\n      this.$swal.close()\n    },\n    confirm() {\n      axios\n        .post(`/ent/jusprin/api/subscription_plan/${this.subscription.id}/cancel/`)\n        .then(() => {\n          // Reload the page to reflect the changes\n          window.location.reload()\n        })\n        .catch((error) => {\n          console.error('Failed to downgrade subscription:', error)\n          this.$swal.Reject.fire({\n            title: this.$i18next.t('Error'),\n            text: this.$i18next.t('Failed to downgrade subscription. Please try again.'),\n          })\n        })\n    },\n  },\n}\n</script>\n\n<style></style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DowngradeConfirmation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DowngradeConfirmation.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DowngradeConfirmation.vue?vue&type=template&id=4e56219c&\"\nimport script from \"./DowngradeConfirmation.vue?vue&type=script&lang=js&\"\nexport * from \"./DowngradeConfirmation.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"pricing-page\">\n    <!-- Header -->\n    <div class=\"pricing-header\" v-if=\"canGoBackToChat\">\n      <div class=\"header-left\">\n        <a href=\"/jusprin/v1.0/embedded_chat/\" class=\"header-button\" :title=\"$t('Back to Chat')\">\n          <i class=\"mdi mdi-arrow-left large-icon\"></i>\n          <span class=\"button-text\">{{ $t('Back to Chat') }}</span>\n        </a>\n      </div>\n    </div>\n\n    <div class=\"container content-container\">\n      <div class=\"row justify-content-center\">\n        <div class=\"col-lg-10\">\n          <div class=\"pricing-container\" v-if=\"!loading\">\n            <div class=\"row justify-content-center\">\n              <!-- Free Plan Card -->\n              <div class=\"col-lg-5 col-md-6 mb-4\">\n                <div class=\"pricing-card\">\n                  <div class=\"plan-header\">\n                    <h2 class=\"plan-title\">{{ $t('Free') }}</h2>\n                    <p class=\"plan-subtitle\">{{ $t('Free for everyone') }}</p>\n                  </div>\n\n                  <div class=\"plan-price\">\n                    <span class=\"price\">$0</span>\n                  </div>\n\n                  <div class=\"plan-action\">\n                    <button\n                      class=\"btn current-plan-btn\"\n                      :class=\"hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary'\"\n                      :disabled=\"!hasActiveSubscription\"\n                      @click=\"downgradeToFree\"\n                    >\n                      {{ freeButtonText }}\n                    </button>\n                  </div>\n\n                  <div class=\"plan-features\">\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{\n                        $t('50 AI credits per month. Reset on the first day of each month')\n                      }}</span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{ $t('Community support') }}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Pro Plan Card -->\n              <div class=\"col-lg-5 col-md-6 mb-4\">\n                <div class=\"pricing-card\">\n                  <div class=\"plan-header\">\n                    <h2 class=\"plan-title\">{{ $t('JusPrin Unlimited') }}</h2>\n                    <div class=\"billing-toggle\">\n                      <span class=\"billing-text\">{{ $t('Billed annually') }}</span>\n                      <div class=\"toggle-switch\">\n                        <input\n                          id=\"billing-toggle\"\n                          type=\"checkbox\"\n                          v-model=\"isAnnual\"\n                          class=\"toggle-input\"\n                        />\n                        <label for=\"billing-toggle\" class=\"toggle-label\">\n                          <span class=\"toggle-slider\"></span>\n                        </label>\n                      </div>\n                    </div>\n                  </div>\n\n                  <div class=\"plan-price\">\n                    <div class=\"price-container\">\n                      <span v-if=\"hasActiveObicoProSubscription\" class=\"original-price\">\n                        ${{ originalPriceDollars\n                        }}<span class=\"original-price-cents\">.{{ originalPriceCents }}</span>\n                      </span>\n                      <span class=\"price\">\n                        ${{ discountedPriceDollars\n                        }}<span class=\"price-cents\">.{{ discountedPriceCents }}</span>\n                      </span>\n                      <span class=\"price-period\">{{\n                        isAnnual ? $t('per year') : $t('per month')\n                      }}</span>\n                    </div>\n\n                    <div v-if=\"hasActiveObicoProSubscription\" class=\"obico-discount-banner\">\n                      <i class=\"fas fa-star\"></i>\n                      <span>{{\n                        $t('{percentage}% off for Obico Pro subscribers, Yay!', {\n                          percentage: obicoProDiscountPercentage,\n                        })\n                      }}</span>\n                    </div>\n                  </div>\n\n                  <div class=\"plan-action\">\n                    <button\n                      class=\"btn upgrade-btn\"\n                      :class=\"hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary'\"\n                      @click=\"upgradeToProPlan\"\n                    >\n                      {{ upgradeButtonText }}\n                    </button>\n                  </div>\n\n                  <div class=\"plan-features\">\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span class=\"important-feature\">\n                        {{ $t('Unlimited AI credits') }}\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                      </span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span class=\"important-feature\">{{\n                        $t('Unlimited \"Do Your Magic\" AI generations')\n                      }}</span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{ $t('AI memory: remember your slicing preferences') }}</span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{ $t('Email support. 24 hours response time') }}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div v-else class=\"loading-container\">\n            <div class=\"text-center\">\n              <div class=\"spinner-border text-primary\" role=\"status\">\n                <span class=\"sr-only\">{{ $t('Loading...') }}</span>\n              </div>\n              <p class=\"mt-2\">{{ $t('Loading subscription information...') }}</p>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- FAQ Section -->\n      <div class=\"row justify-content-center\">\n        <div class=\"col-lg-10\">\n          <div class=\"faq-container\">\n            <div class=\"row justify-content-center\">\n              <div class=\"col-lg-10\">\n                <div class=\"faq-section\">\n                  <h2 class=\"faq-title\">{{ $t('Frequently Asked Questions') }}</h2>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{\n                        $t(\n                          'I am an Obico Pro Plan subscriber. Am I eligible for a discount on the Unlimited Plan?'\n                        )\n                      }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"Yes! You'll receive 30% off the Unlimited Plan. By the way, thank you for supporting the Obico project! 😊\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{\n                        $t(\"I'm an Obico Pro Plan subscriber. Why don't I see the 30% discount?\")\n                      }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"First, make sure you're signed into the Obico account with an active Pro subscription. If you still don't see the discount on this page, it should appear at checkout. If it doesn't show up there either, please contact us at support@obico.io for assistance.\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('Am I able to cancel the Unlimited Plan?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{ $t(\"Yes, you can cancel at any time by clicking 'Downgrade to Free.'\") }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('What happens after I downgrade to the Free plan?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"Your Unlimited Plan won't renew when your current term ends, and your account won't be charged. You'll still have access to unlimited AI credits until the end of your current term.\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('Can I get a refund for the Unlimited Plan?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"By default, no. This is to prevent abuse, as processing refunds incurs significant fees that we're unable to absorb.\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('Is it possible to request an exception for a refund?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          'We handle these requests on a case-by-case basis. You can contact support@obico.io to request an exception and provide your reason for the request.'\n                        )\n                      }}\n                    </p>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <!-- Success Popup Modal -->\n    <div v-if=\"showSuccessPopup\" class=\"success-popup-overlay\">\n      <div class=\"success-popup-modal\">\n        <div class=\"success-popup-content\">\n          <h3 class=\"success-title\">🎉 {{ $t('Unlimited Plan Activated!') }}</h3>\n          <p class=\"success-message\">\n            {{ $t('Enjoy unlimited AI credits!') }}\n          </p>\n\n          <div v-if=\"canGoBackToChat\" class=\"countdown-container\">\n            <div class=\"circular-progress\">\n              <svg class=\"progress-circle\" viewBox=\"0 0 120 120\">\n                <circle\n                  class=\"progress-track\"\n                  cx=\"60\"\n                  cy=\"60\"\n                  r=\"50\"\n                  fill=\"none\"\n                  stroke=\"var(--color-divider)\"\n                  stroke-width=\"8\"\n                />\n                <circle\n                  class=\"progress-bar\"\n                  cx=\"60\"\n                  cy=\"60\"\n                  r=\"50\"\n                  fill=\"none\"\n                  stroke=\"var(--color-primary)\"\n                  stroke-width=\"8\"\n                  stroke-linecap=\"round\"\n                  :stroke-dasharray=\"circleCircumference\"\n                  :stroke-dashoffset=\"circleOffset\"\n                />\n              </svg>\n              <div class=\"countdown-text\">\n                <span class=\"countdown-number\">{{ countdownSeconds }}</span>\n              </div>\n            </div>\n\n            <p class=\"redirect-message\">\n              {{ $t('Redirecting to chat window in') }}\n              <strong>{{ countdownSeconds }}</strong>\n              {{ countdownSeconds === 1 ? $t('second') : $t('seconds') }}\n            </p>\n          </div>\n\n          <div v-if=\"!canGoBackToChat\" class=\"no-redirect-message\">\n            <p class=\"close-app-message\">\n              {{\n                $t('You can now close the JusPrin app to make sure the new plan will be effective.')\n              }}\n            </p>\n          </div>\n\n          <div v-if=\"canGoBackToChat\" class=\"popup-actions\">\n            <button class=\"btn btn-outline-secondary cancel-btn\" @click=\"cancelRedirect\">\n              {{ $t('Cancel') }}\n            </button>\n            <button class=\"btn btn-primary redirect-btn\" @click=\"redirectToChat\">\n              {{ $t('Go to Chat Now') }}\n            </button>\n          </div>\n\n          <div v-if=\"!canGoBackToChat\" class=\"popup-actions\">\n            <button class=\"btn btn-primary close-btn\" @click=\"closeSuccessPopup\">\n              {{ $t('OK') }}\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport * as jusprinChargebee from './lib/jusprin_chargebee.js'\nimport DowngradeConfirmation from './components/DowngradeConfirmation.vue'\n\nexport default {\n  name: 'JusPrinPricingPage',\n\n  props: {\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    obicoProDiscountPercentage: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      isAnnual: true,\n      chargeBeeInstance: null,\n      currentSubscription: null,\n      obicoSubscription: null,\n      loading: true,\n      showBackToChatHeader: false,\n      // Success popup data\n      showSuccessPopup: false,\n      countdownSeconds: 5,\n      countdownInterval: null,\n      circleCircumference: 2 * Math.PI * 50, // radius is 50\n    }\n  },\n\n  mounted() {\n    // Initialize Chargebee instance\n    this.chargeBeeInstance = jusprinChargebee.init(this.chargeBeeSite)\n\n    // Handle can_go_back_to_chat parameter first\n    this.handleCanGoBackToChatParam()\n\n    // Fetch current subscription status\n    this.fetchCurrentSubscription()\n    this.fetchObicoSubscription()\n\n    // Check for checkout success parameter\n    this.checkForCheckoutSuccess()\n  },\n\n  computed: {\n    hasActiveSubscription() {\n      return this.currentSubscription && this.currentSubscription.is_active\n    },\n\n    isCurrentPlanAnnual() {\n      return this.currentSubscription && this.currentSubscription.is_annual\n    },\n\n    isCurrentPlanMonthly() {\n      return this.currentSubscription && this.currentSubscription.is_monthly\n    },\n\n    hasActiveObicoProSubscription() {\n      return Boolean(this.obicoSubscription?.cb_subscription)\n    },\n\n    discountedPrice() {\n      if (this.hasActiveObicoProSubscription) {\n        const originalPrice = this.isAnnual ? 59.99 : 6.99\n        const discountMultiplier = (100 - this.obicoProDiscountPercentage) / 100\n        return (originalPrice * discountMultiplier).toFixed(2)\n      }\n      return this.isAnnual ? '59.99' : '6.99'\n    },\n\n    discountedPriceDollars() {\n      return this.discountedPrice.split('.')[0]\n    },\n\n    discountedPriceCents() {\n      return this.discountedPrice.split('.')[1]\n    },\n\n    originalPriceDollars() {\n      const originalPrice = this.isAnnual ? '59.99' : '6.99'\n      return originalPrice.split('.')[0]\n    },\n\n    originalPriceCents() {\n      const originalPrice = this.isAnnual ? '59.99' : '6.99'\n      return originalPrice.split('.')[1]\n    },\n\n    hasBillingCycleChanged() {\n      // Check if user has active subscription and has changed the billing cycle\n      return this.hasActiveSubscription && this.isAnnual !== this.currentSubscription.is_annual\n    },\n\n    upgradeButtonText() {\n      if (this.hasActiveSubscription) {\n        if (this.hasBillingCycleChanged) {\n          return this.$t('Change Plan')\n        }\n        return this.$t('Manage Account')\n      }\n      return this.$t('Upgrade to JusPrin Unlimited')\n    },\n\n    freeButtonText() {\n      if (!this.hasActiveSubscription) {\n        return this.$t('Current plan')\n      }\n      return this.$t('Downgrade to Free')\n    },\n\n    // Circular progress bar offset calculation\n    circleOffset() {\n      const progress = (5 - this.countdownSeconds) / 5\n      return this.circleCircumference * (1 - progress)\n    },\n\n    canGoBackToChat() {\n      return this.showBackToChatHeader\n    },\n  },\n\n  methods: {\n    async fetchCurrentSubscription() {\n      try {\n        const response = await fetch('/ent/jusprin/api/subscription_plan/', {\n          method: 'GET',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-CSRFToken': this.getCsrfToken(),\n          },\n          credentials: 'same-origin',\n        })\n\n        if (response.ok) {\n          this.currentSubscription = await response.json()\n\n          // Set the initial toggle state based on current subscription\n          if (this.currentSubscription && this.currentSubscription.is_active) {\n            this.isAnnual = this.currentSubscription.is_annual\n          }\n        }\n      } catch (error) {\n        console.error('Error fetching current subscription:', error)\n      } finally {\n        this.loading = false\n      }\n    },\n\n    async fetchObicoSubscription() {\n      try {\n        const response = await fetch('/ent/api/subscriptions/active/', {\n          method: 'GET',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-CSRFToken': this.getCsrfToken(),\n          },\n          credentials: 'same-origin',\n        })\n\n        if (response.ok) {\n          const data = await response.json()\n          this.obicoSubscription = data\n        }\n      } catch (error) {\n        console.error('Error fetching Obico subscription:', error)\n      }\n    },\n\n    getCsrfToken() {\n      const cookies = document.cookie.split(';')\n      for (let cookie of cookies) {\n        const [name, value] = cookie.trim().split('=')\n        if (name === 'csrftoken') {\n          return value\n        }\n      }\n      return ''\n    },\n\n    upgradeToProPlan() {\n      if (this.hasActiveSubscription) {\n        if (this.hasBillingCycleChanged) {\n          // User wants to change billing cycle - proceed with checkout\n          const checkoutOptions = {\n            annual: this.isAnnual,\n          }\n\n          // Note: Coupon for Obico Pro subscribers is applied on backend\n          jusprinChargebee.checkout(this.chargeBeeInstance, checkoutOptions)\n        } else {\n          // User wants to manage account - open Chargebee portal\n          jusprinChargebee.portal(this.chargeBeeInstance)\n        }\n      } else {\n        // New user wants to upgrade - proceed with checkout\n        const checkoutOptions = {\n          annual: this.isAnnual,\n        }\n\n        // Note: Coupon for Obico Pro subscribers is applied on backend\n        jusprinChargebee.checkout(this.chargeBeeInstance, checkoutOptions)\n      }\n    },\n\n    downgradeToFree() {\n      if (!this.hasActiveSubscription) {\n        return\n      }\n\n      this.$swal.openModalWithComponent(\n        DowngradeConfirmation,\n        {\n          subscription: this.currentSubscription,\n        },\n        {\n          title: 'Please Confirm',\n          showConfirmButton: false,\n        }\n      )\n    },\n\n    // Success popup methods\n    checkForCheckoutSuccess() {\n      const urlParams = new URLSearchParams(window.location.search)\n      if (urlParams.get('checkout') === 'success') {\n        this.showSuccessPopup = true\n        if (this.canGoBackToChat) {\n          this.startCountdown()\n        }\n      }\n    },\n\n    startCountdown() {\n      this.countdownInterval = setInterval(() => {\n        this.countdownSeconds--\n        if (this.countdownSeconds <= 0) {\n          this.redirectToChat()\n        }\n      }, 1000)\n    },\n\n    cancelRedirect() {\n      if (this.countdownInterval) {\n        clearInterval(this.countdownInterval)\n        this.countdownInterval = null\n      }\n      this.showSuccessPopup = false\n      // Remove the checkout=success parameter from URL\n      const url = new URL(window.location.href)\n      url.searchParams.delete('checkout')\n      window.history.replaceState({}, '', url.toString())\n    },\n\n    redirectToChat() {\n      if (this.countdownInterval) {\n        clearInterval(this.countdownInterval)\n        this.countdownInterval = null\n      }\n      this.showSuccessPopup = false\n      // Redirect to JusPrin chat window\n      window.location.href = '/jusprin/v1.0/embedded_chat/'\n    },\n\n    handleCanGoBackToChatParam() {\n      const urlParams = new URLSearchParams(window.location.search)\n      const canGoBack = urlParams.get('can_go_back_to_chat')\n      if (canGoBack !== null) {\n        sessionStorage.setItem('can_go_back_to_chat', canGoBack)\n        this.showBackToChatHeader = canGoBack === '1'\n      } else {\n        // Check sessionStorage on page load (for refreshes)\n        this.showBackToChatHeader = sessionStorage.getItem('can_go_back_to_chat') === '1'\n      }\n    },\n\n    closeSuccessPopup() {\n      this.showSuccessPopup = false\n    },\n  },\n\n  beforeUnmount() {\n    // Clean up interval when component is destroyed\n    if (this.countdownInterval) {\n      clearInterval(this.countdownInterval)\n    }\n  },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.pricing-page {\n  min-height: 100vh;\n  background: var(--color-background);\n  padding: 0;\n}\n\n.content-container {\n  padding-top: 2rem;\n}\n\n.pricing-container {\n  padding: 2rem 0;\n}\n\n.loading-container {\n  padding: 4rem 0;\n  min-height: 200px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.pricing-card {\n  background: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  padding: 2.5rem 2rem;\n  height: 100%;\n  position: relative;\n  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.1);\n}\n\n.plan-header {\n  margin-bottom: 2rem;\n}\n\n.plan-title {\n  font-size: 2rem;\n  font-weight: bold;\n  margin-bottom: 0.5rem;\n}\n\n.plan-subtitle {\n  margin-top: 16px;\n  font-size: 1rem;\n  margin-bottom: 0;\n  opacity: 0.8;\n}\n\n.billing-toggle {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n  margin-top: 1rem;\n}\n\n.billing-text {\n  font-size: 0.875rem;\n}\n\n.toggle-switch {\n  position: relative;\n  display: inline-block;\n  width: 50px;\n  height: 24px;\n}\n\n.toggle-input {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.toggle-label {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  border-radius: 24px;\n  transition: 0.3s;\n  background-color: var(--color-text-secondary);\n}\n\n.toggle-slider {\n  position: absolute;\n  content: '';\n  height: 18px;\n  width: 18px;\n  left: 3px;\n  bottom: 3px;\n  background-color: var(--color-surface-secondary);\n  border-radius: 50%;\n  transition: 0.3s;\n}\n\n.toggle-input:checked + .toggle-label {\n  background-color: var(--color-primary);\n}\n\n.toggle-input:checked + .toggle-label .toggle-slider {\n  transform: translateX(26px);\n}\n\n.plan-price {\n  margin-bottom: 2rem;\n}\n\n.obico-discount-banner {\n  padding: 1rem 0;\n  margin-bottom: 1rem;\n  font-weight: 500;\n  font-size: 0.875rem;\n\n  i {\n    margin-right: 0.5rem;\n    color: #ffd700; // Gold star\n  }\n}\n\n.price-container {\n  display: flex;\n  align-items: baseline;\n  gap: 0.5rem;\n  flex-wrap: wrap;\n}\n\n.original-price {\n  font-size: 2rem;\n  font-weight: normal;\n  text-decoration: line-through;\n  opacity: 0.6;\n  color: var(--color-text-secondary);\n}\n\n.original-price-cents {\n  font-size: 1.25rem;\n  vertical-align: top;\n}\n\n.price {\n  font-size: 4rem;\n  font-weight: bold;\n  line-height: 1;\n}\n\n.price-cents {\n  font-size: 2.5rem;\n  vertical-align: top;\n}\n\n.price-period {\n  font-size: 1rem;\n  margin-left: 0.5rem;\n  opacity: 0.8;\n}\n\n.plan-action {\n  margin-bottom: 2rem;\n}\n\n.current-plan-btn {\n  width: 100%;\n  padding: 0.75rem;\n  border: 2px solid;\n  border-radius: var(--border-radius-sm);\n  font-weight: 500;\n}\n\n.upgrade-btn {\n  width: 100%;\n  padding: 0.75rem;\n  background-color: var(--color-primary);\n  border: none;\n  color: var(--color-on-primary);\n  border-radius: var(--border-radius-sm);\n  font-weight: 500;\n\n  &:hover {\n    background-color: var(--color-primary-hover);\n  }\n}\n\n.plan-features {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n.feature-item {\n  display: flex;\n  align-items: flex-start;\n  gap: 0.75rem;\n  .important-feature {\n    font-weight: bold;\n    font-size: 1.125rem;\n  }\n}\n\n.feature-check {\n  color: var(--color-primary);\n  margin-top: 0.125rem;\n  flex-shrink: 0;\n}\n\n.feature-credit-icon {\n  width: 22px;\n  height: 22px;\n  flex-shrink: 0;\n  margin-right: 0.25rem;\n}\n\n.new-badge {\n  background: var(--color-primary);\n  color: var(--color-on-primary);\n  font-size: 0.75rem;\n  padding: 0.125rem 0.5rem;\n  border-radius: 12px;\n  margin-left: 0.5rem;\n  font-weight: 500;\n}\n\n// Override button styles for this component\n.btn {\n  border-radius: var(--border-radius-sm) !important;\n}\n\n// Responsive adjustments\n@media (max-width: 768px) {\n  .pricing-container {\n    padding: 1rem 0;\n  }\n\n  .pricing-card {\n    padding: 2rem 1.5rem;\n  }\n\n  .price {\n    font-size: 3rem;\n  }\n}\n\n/* Success Popup Styles */\n.success-popup-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(0, 0, 0, 0.5);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 1000;\n}\n\n.success-popup-modal {\n  background: var(--color-surface-primary);\n  border-radius: var(--border-radius-lg);\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n  max-width: 500px;\n  width: 90%;\n  max-height: 90vh;\n  overflow-y: auto;\n}\n\n.success-popup-content {\n  padding: 2rem;\n  text-align: center;\n}\n\n.success-title {\n  font-size: 1.5rem;\n  font-weight: bold;\n  margin-bottom: 1rem;\n  color: var(--color-primary);\n}\n\n.success-message {\n  font-size: 1rem;\n  margin-bottom: 2rem;\n  color: var(--color-text-primary);\n}\n\n.countdown-container {\n  margin-bottom: 2rem;\n}\n\n.circular-progress {\n  position: relative;\n  display: inline-block;\n  margin-bottom: 1rem;\n}\n\n.progress-circle {\n  width: 120px;\n  height: 120px;\n  transform: rotate(-90deg);\n}\n\n.progress-track {\n  opacity: 0.3;\n}\n\n.progress-bar {\n  transition: stroke-dashoffset 1s ease-in-out;\n}\n\n.countdown-text {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.countdown-number {\n  font-size: 2.5rem;\n  font-weight: bold;\n  color: var(--color-primary);\n  line-height: 1;\n}\n\n.redirect-message {\n  font-size: 1rem;\n  color: var(--color-text-secondary);\n  margin-bottom: 0;\n}\n\n.no-redirect-message {\n  margin-bottom: 2rem;\n}\n\n.close-app-message {\n  font-size: 1.1rem;\n  color: var(--color-text-primary);\n  margin-bottom: 0;\n  text-align: center;\n  line-height: 1.5;\n}\n\n.popup-actions {\n  display: flex;\n  gap: 1rem;\n  justify-content: center;\n  flex-wrap: wrap;\n}\n\n.cancel-btn,\n.redirect-btn,\n.close-btn {\n  padding: 0.75rem 1.5rem;\n  border-radius: var(--border-radius-sm);\n  font-weight: 500;\n  min-width: 120px;\n}\n\n.cancel-btn {\n  background: transparent;\n  border: 2px solid var(--color-divider);\n  color: var(--color-text-secondary);\n}\n\n.cancel-btn:hover {\n  background: var(--color-hover);\n  border-color: var(--color-text-secondary);\n}\n\n.redirect-btn {\n  background: var(--color-primary);\n  border: 2px solid var(--color-primary);\n  color: var(--color-on-primary);\n}\n\n.redirect-btn:hover {\n  background: var(--color-primary-hover);\n  border-color: var(--color-primary-hover);\n}\n\n.close-btn {\n  background: var(--color-primary);\n  border: 2px solid var(--color-primary);\n  color: var(--color-on-primary);\n}\n\n.close-btn:hover {\n  background: var(--color-primary-hover);\n  border-color: var(--color-primary-hover);\n}\n\n@media (max-width: 480px) {\n  .success-popup-content {\n    padding: 1.5rem;\n  }\n\n  .popup-actions {\n    flex-direction: column;\n    align-items: stretch;\n  }\n\n  .cancel-btn,\n  .redirect-btn,\n  .close-btn {\n    min-width: auto;\n  }\n}\n\n/* Pricing Header Styles */\n.pricing-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 2px 16px;\n  background-color: var(--color-primary);\n  color: white;\n  position: sticky;\n  top: 0;\n  z-index: 10;\n}\n\n.header-left {\n  display: flex;\n  align-items: center;\n}\n\n.header-button {\n  background: none;\n  border: none;\n  color: white;\n  padding: 4px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 14px;\n  font-weight: 500;\n  transition: opacity 0.2s;\n  text-decoration: none;\n\n  &:hover {\n    opacity: 0.8;\n    color: white;\n    text-decoration: none;\n  }\n\n  &:focus {\n    color: white;\n    text-decoration: none;\n  }\n\n  .large-icon {\n    font-size: 24px;\n  }\n\n  .button-text {\n    display: inline;\n  }\n}\n\n/* FAQ Section Styles */\n.faq-container {\n  padding: 2rem 0;\n}\n\n.faq-section {\n  margin-top: 3rem;\n  padding: 2.5rem 2rem;\n  background: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.1);\n}\n\n.faq-title {\n  font-size: 2rem;\n  font-weight: bold;\n  margin-bottom: 2rem;\n  text-align: center;\n  color: var(--color-text-primary);\n}\n\n.faq-item {\n  margin-bottom: 2rem;\n  padding-bottom: 1.5rem;\n  border-bottom: 1px solid var(--color-divider-muted);\n\n  &:last-child {\n    margin-bottom: 0;\n    padding-bottom: 0;\n    border-bottom: none;\n  }\n}\n\n.faq-question {\n  font-size: 1.25rem;\n  font-weight: 600;\n  margin-bottom: 0.75rem;\n  color: var(--color-text-primary);\n  line-height: 1.4;\n}\n\n.faq-answer {\n  font-size: 1rem;\n  color: var(--color-text-secondary);\n  line-height: 1.6;\n  margin-bottom: 0;\n}\n\n// Responsive adjustments for FAQ\n@media (max-width: 768px) {\n  .faq-container {\n    padding: 1rem 0;\n  }\n\n  .faq-section {\n    margin-top: 2rem;\n    padding: 2rem 1.5rem;\n  }\n\n  .faq-title {\n    font-size: 1.75rem;\n  }\n\n  .faq-question {\n    font-size: 1.125rem;\n  }\n\n  .faq-answer {\n    font-size: 0.9rem;\n  }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JusPrinPricingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JusPrinPricingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JusPrinPricingPage.vue?vue&type=template&id=086ae8b6&scoped=true&\"\nimport script from \"./JusPrinPricingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./JusPrinPricingPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JusPrinPricingPage.vue?vue&type=style&index=0&id=086ae8b6&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"086ae8b6\",\n  null\n  \n)\n\nexport default component.exports","import PricingPage from '@entSrc/views/PricingPage.vue'\nimport ArchivedPrintersPage from '@entSrc/views/ArchivedPrintersPage.vue'\nimport DetectiveHourCouponCodesPage from '@entSrc/views/DetectiveHourCouponCodesPage.vue'\nimport PublicTimelapsesPage from '@entSrc/views/PublicTimelapsesPage.vue'\nimport TimelapseUploadPage from '@entSrc/views/TimelapseUploadPage.vue'\nimport WelcomePage from '@entSrc/views/WelcomePage.vue'\nimport CelestriusConfigurePage from '@entSrc/views/CelestriusConfigurePage.vue'\nimport MintionRedeemPage from '@entSrc/views/partners/MintionRedeemPage.vue'\nimport BttRedeemPage from '@entSrc/views/partners/BttRedeemPage.vue'\nimport SovolRedeemPage from '@entSrc/views/partners/SovolRedeemPage.vue'\nimport ThreeDoRedeemPage from '@entSrc/views/partners/ThreeDORedeemPage.vue'\nimport KingroonPricingPage from '@entSrc/views/partners/KingroonPricingPage.vue'\nimport JusPrinPricingPage from '@entSrc/views/jusprin/JusPrinPricingPage.vue'\n\nconst routes = [\n]\n\nconst components = {\n  PricingPage,\n  KingroonPricingPage,\n  ArchivedPrintersPage,\n  DetectiveHourCouponCodesPage,\n  PublicTimelapsesPage,\n  TimelapseUploadPage,\n  WelcomePage,\n  CelestriusConfigurePage,\n  MintionRedeemPage,\n  BttRedeemPage,\n  SovolRedeemPage,\n  ThreeDoRedeemPage,\n  JusPrinPricingPage,\n}\n\nexport { routes, components }\n","import axios from 'axios'\n\nconst state = {\n\n  //Component States\n  RotationbottomSheetOpen: false,\n  ScalebottomSheetOpen: false,\n  TranslatebottomSheetOpen: false,\n  PrintProfilebottomSheetOpen: false,\n  MachineSelectionOpen: false,\n  PatternSelectionOpen: false,\n  GeneralTypeSelectionOpen: false,\n  PatternSelectionType: null,\n  GeneralTypeSelectionType: null,\n  FilamentSelectionOpen: false,\n  PrintProcessSelectionOpen: false,\n  isInitialLoad: true,\n\n\n  // Profile Presets\n  profilePreset: {},   // Preset values for the selected print process. Should not be modified.\n  profileOverwrites: {}, // User-modified values for the selected print process. Should be used to generate the final print process.\n  filamentProfilePreset: {},  // Preset values for the selected filament. Should not be modified.\n  filamentProfileOverwrites: {}, // User-modified values for the selected filament. Should be used to generate the final filament.\n  selectedMachine: null,\n  selectedFilament: null,\n  selectedPrintProcess: null,\n  suggestedPrintProcess: null,\n\n  meshes: [], // Array to store mesh-specific data\n  selectedMeshIndex: 0, // Index of the currently selected mesh\n\n  // JusPrint Chat\n  jusprintCurrentChatId: null,\n}\n\nconst mutations = {\n\n  //ADD MODEL\n  ADD_MODEL(state, mesh) {\n    state.meshes.push(mesh);\n  },\n  SET_SELECTED_MESH_INDEX(state, index) {\n    state.selectedMeshIndex = index;\n  },\n  UPDATE_MESH_ROTATION(state, { meshIndex, rotation }) {\n    state.meshes[meshIndex].rotation = rotation;\n  },\n\n  UPDATE_MESH_TRANSLATE(state, { meshIndex, translate }) {\n    state.meshes[meshIndex].translate = translate;\n  },\n\n  UPDATE_MESH_DEFAULT_TRANSLATE(state, { meshIndex, translate }) {\n    state.meshes[meshIndex].defaultTranslate = translate;\n  },\n\n\n  UPDATE_MESH_DIMENSIONS(state, { index, dimensions }) {\n\n    state.meshes[index].currentDimensions = {\n      x: parseFloat(dimensions.x),\n      y: parseFloat(dimensions.y),\n      z: parseFloat(dimensions.z),\n    };\n  },\n\n\n\n  SET_ROTATION_BOTTOM_SHEET_OPEN(state, RotationbottomSheetOpen) {\n    state.RotationbottomSheetOpen = RotationbottomSheetOpen\n  },\n\n  SET_SCALE_BOTTOM_SHEET_OPEN(state, ScalebottomSheetOpen) {\n    state.ScalebottomSheetOpen = ScalebottomSheetOpen\n  },\n  SET_TRANSLATE_BOTTOM_SHEET_OPEN(state, TranslatebottomSheetOpen) {\n    state.TranslatebottomSheetOpen = TranslatebottomSheetOpen\n  },\n\n  SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN(state, PrintProfilebottomSheetOpen) {\n    state.PrintProfilebottomSheetOpen = PrintProfilebottomSheetOpen;\n  },\n\n  SET_MACHINE_SELECTION_OPEN(state, MachineSelectionOpen) {\n    state.MachineSelectionOpen = MachineSelectionOpen;\n  },\n\n  SET_PATTERN_SELECTION_OPEN(state, PatternSelectionOpen) {\n    state.PatternSelectionOpen = PatternSelectionOpen;\n  },\n\n  SET_PATTERN_SELECTION_TYPE(state, PatternSelectionType) {\n    state.PatternSelectionType = PatternSelectionType;\n  },\n\n  SET_GENERAL_TYPE_SELECTION_OPEN(state, GeneralTypeSelectionOpen) {\n    state.GeneralTypeSelectionOpen = GeneralTypeSelectionOpen;\n  },\n\n  SET_GENERAL_TYPE_SELECTION_TYPE(state, GeneralTypeSelectionType) {\n    state.GeneralTypeSelectionType = GeneralTypeSelectionType;\n  },\n\n  SET_FILAMENT_SELECTION_OPEN(state, FilamentSelectionOpen) {\n    state.FilamentSelectionOpen = FilamentSelectionOpen;\n  },\n\n  SET_PRINT_PROCESS_SELECTION_OPEN(state, PrintProcessSelectionOpen) {\n    state.PrintProcessSelectionOpen = PrintProcessSelectionOpen;\n  },\n\n  SET_SELECTED_MACHINE(state, printerName) {\n    state.selectedMachine = printerName;\n  },\n\n  SET_SELECTED_FILAMENT(state, filamentName) {\n    state.selectedFilament = filamentName;\n  },\n\n  SET_SELECTED_PRINT_PROCESS(state, selectedPrintProcess) {\n    state.selectedPrintProcess = selectedPrintProcess;\n  },\n\n  SET_SUGGESTED_PRINT_PROCESS(state, suggestedPrintProcess) {\n    state.suggestedPrintProcess = suggestedPrintProcess;\n  },\n\n  SET_PROFILE_PRESET(state, profilePreset) {\n    state.profilePreset = { ...profilePreset,\n      fuzzy_skin: 'none',\n      internal_solid_infill_pattern: 'monotonic',\n      brim_type: 'auto_brim',\n     };\n  },\n\n  CLEAR_PROFILE_OVERWRITE_VALUE(state) {\n    state.profileOverwrites = {}\n  },\n\n  UPDATE_PROFILE_OVERWRITE_VALUE(state, { key, value }) {\n    state.profileOverwrites = {\n      ...state.profileOverwrites,\n      [key]: value,\n    };\n  },\n\n  SET_PROFILE_OVERWRITE(state, profileOverwrites) {\n    state.profileOverwrites = profileOverwrites\n  },\n\n  SET_FILAMENT_PROFILE_PRESET(state, filamentProfilePreset) {\n    state.filamentProfilePreset = { ...filamentProfilePreset };\n  },\n\n  SET_FILAMENT_PROFILE_OVERWRITE_VALUE(state, { key, value }) {\n    state.filamentProfileOverwrites = {\n      ...state.filamentProfileOverwrites,\n      [key]: value,\n    };\n  },\n\n  CLEAR_FILAMENT_PROFILE_OVERWRITE_VALUE(state) {\n    state.filamentProfileOverwrites = {}\n  },\n\n  SET_FILAMENT_PROFILE_OVERWRITE(state, filamentProfileOverwrites) {\n    state.filamentProfileOverwrites = filamentProfileOverwrites\n  },\n\n  SET_INITIAL_LOAD(state, value) {\n    state.isInitialLoad = value;\n  },\n\n  SET_JUSPRINT_CURRENT_CHAT_ID(state, jusprintCurrentChatId) {\n    state.jusprintCurrentChatId = jusprintCurrentChatId;\n  },\n}\n\nconst actions = {\n\n  //Multi Mesh Setup\n  addMesh({ commit }, mesh) {\n    commit('ADD_MODEL', mesh);\n  },\n  setSelectedMeshIndex({ commit }, index) {\n    commit('SET_SELECTED_MESH_INDEX', index);\n  },\n  updateMeshRotation({ commit, state }, rotation) {\n    const index = state.selectedMeshIndex;\n    commit('UPDATE_MESH_ROTATION', { index, rotation });\n  },\n\n  updateMeshTranslate({ commit, state }, {meshIndex, translate}) {\n    commit('UPDATE_MESH_TRANSLATE', { meshIndex, translate });\n  },\n\n  updateCurrentDimensions({ commit, state }, { index, dimensions }) {\n    commit('UPDATE_MESH_DIMENSIONS', { index, dimensions });\n  },\n\n  //RotationBottomSheet\n  openMeshRotationBottomSheet({ commit }) {\n    commit('SET_ROTATION_BOTTOM_SHEET_OPEN', true)\n  },\n  closeMeshRotationBottomSheet({ commit }) {\n    commit('SET_ROTATION_BOTTOM_SHEET_OPEN', false)\n  },\n\n  //Scale Bottom Sheet\n  openMeshScaleBottomSheet({ commit }) {\n    commit('SET_SCALE_BOTTOM_SHEET_OPEN', true)\n  },\n  closeMeshScaleBottomSheet({ commit }) {\n    commit('SET_SCALE_BOTTOM_SHEET_OPEN', false)\n  },\n\n  //Translate Bottom Sheet\n  openTranslateBottomSheet({ commit }) {\n    commit('SET_TRANSLATE_BOTTOM_SHEET_OPEN', true)\n  },\n  closeTranslateBottomSheet({ commit }) {\n    commit('SET_TRANSLATE_BOTTOM_SHEET_OPEN', false)\n  },\n\n\n  //Print Profile BottomSheet\n  openPrintProfileBottomSheet({ commit }) {\n    commit('SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN', true);\n  },\n  closePrintProfileBottomSheet({ commit }) {\n    commit('SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN', false);\n  },\n\n  //Profile Presets\n\n  updateProfileValue({ commit }, { key, value }) {\n    commit('UPDATE_PROFILE_OVERWRITE_VALUE', { key, value });\n  },\n\n  openMachineSelection({ commit }) {\n    commit('SET_MACHINE_SELECTION_OPEN', true);\n  },\n\n  closeMachineSelectionAndClearInitialLoad({ commit }) {\n    commit('SET_INITIAL_LOAD', false);\n    commit('SET_MACHINE_SELECTION_OPEN', false);\n  },\n\n  openPatternSelection({ commit }) {\n    commit('SET_PATTERN_SELECTION_OPEN', true);\n  },\n  closePatternSelection({ commit }) {\n    commit('SET_PATTERN_SELECTION_OPEN', false);\n  },\n  setPatternSelectionType({ commit }, type) {\n    commit('SET_PATTERN_SELECTION_TYPE', type);\n  },\n\n\n  openGeneralTypeSelection({ commit }) {\n    commit('SET_GENERAL_TYPE_SELECTION_OPEN', true);\n  },\n  closeGeneralTypeSelection({ commit }) {\n    commit('SET_GENERAL_TYPE_SELECTION_OPEN', false);\n  },\n  setGeneralTypeSelectionType({ commit }, type) {\n    commit('SET_GENERAL_TYPE_SELECTION_TYPE', type);\n  },\n\n  changeMachineAndRelatedPresets({ commit, state, dispatch }, machine) {\n    commit('SET_SELECTED_MACHINE', machine);\n    dispatch('changeFilamentAndLoadPreset', machine?.default_filament);\n    dispatch('changePrintProcessAndLoadPreset', machine?.default_print_process);\n\n    if (state.isInitialLoad) {\n      setTimeout(() => {\n        // A short delay to allow animation to complete for better UX\n        if (!state.selectedFilament || !state.selectedPrintProcess) {\n          commit('SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN', true);\n        }\n      }, 300)\n    }\n\n    dispatch('closeMachineSelectionAndClearInitialLoad');\n  },\n\n\n  changePrintProcessAndLoadPreset({ commit }, selectedPrintProcess) {\n    commit('SET_SELECTED_PRINT_PROCESS', selectedPrintProcess);\n    commit('SET_PRINT_PROCESS_SELECTION_OPEN', false);\n\n    if (selectedPrintProcess?.slicer_profile_url) {\n      // Come on javascript, you still can't do better in 2024 can you?\n      const encodedUrl = encodeURI(selectedPrintProcess.slicer_profile_url).replace(/\\+/g, '%2B');\n      axios\n        .get(encodedUrl)\n        .then((response) => {\n          commit('SET_PROFILE_PRESET', response.data)\n          commit('CLEAR_PROFILE_OVERWRITE_VALUE')\n        })\n    }\n  },\n\n\n  changeFilamentAndLoadPreset({ commit }, selectedFilament) {\n    commit('SET_SELECTED_FILAMENT', selectedFilament);\n\n    if (selectedFilament?.slicer_profile_url) {\n      // Come on javascript, you still can't do better in 2024 can you?\n      const encodedUrl = encodeURI(selectedFilament.slicer_profile_url).replace(/\\+/g, '%2B');\n      axios\n        .get(encodedUrl)\n        .then((response) => {\n          commit('SET_FILAMENT_PROFILE_PRESET', response.data)\n          commit('CLEAR_FILAMENT_PROFILE_OVERWRITE_VALUE')\n        })\n    }\n  },\n\n\n  //FilamentSelection\n  openFilamentSelection({ commit }) {\n    commit('SET_FILAMENT_SELECTION_OPEN', true);\n  },\n  closeFilamentSelection({ commit }) {\n    commit('SET_FILAMENT_SELECTION_OPEN', false);\n  },\n\n\n  //PrintProcess\n  openPrintProcess({ commit }) {\n    commit('SET_PRINT_PROCESS_SELECTION_OPEN', true);\n  },\n  closePrintProcess({ commit }) {\n    commit('SET_PRINT_PROCESS_SELECTION_OPEN', false);\n  },\n\n  setInitialLoadDone({ commit }) {\n    commit('SET_INITIAL_LOAD', false);\n  }\n\n}\n\nconst getters = {\n\n  //Multi Mesh Setup\n  selectedMeshRotation: (state) => state.meshes[state.selectedMeshIndex]?.rotation,\n  selectedMeshTranslate: (state) => state.meshes[state.selectedMeshIndex]?.translate,\n  selectedMeshDefaultTranslate: (state) => state.meshes[state.selectedMeshIndex]?.defaultTranslate,\n  selectedMeshCenter: (state) => state.meshes[state.selectedMeshIndex]?.center,\n\n  selectedMeshDimensions: (state) => ({\n    originalDimensions: state.meshes[state.selectedMeshIndex]?.originalDimensions,\n    currentDimensions: state.meshes[state.selectedMeshIndex]?.currentDimensions,\n  }),\n\n  RotationbottomSheetOpen: (state) => state.RotationbottomSheetOpen,\n  ScalebottomSheetOpen: (state) => state.ScalebottomSheetOpen,\n  TranslatebottomSheetOpen: (state) => state.TranslatebottomSheetOpen,\n  PrintProfilebottomSheetOpen: (state) => state.PrintProfilebottomSheetOpen,\n  MachineSelectionOpen: (state) => state.MachineSelectionOpen,\n  PatternSelectionOpen: (state) => state.PatternSelectionOpen,\n  FilamentSelectionOpenn: (state) => state.FilamentSelectionOpen,\n  PrintProcessSelectionOpen: (state) => state.PrintProcessSelectionOpen,\n\n  selectedMachine: (state) => state.selectedMachine,\n  selectedFilament: (state) => state.selectedFilament,\n  selectedPrintProcess: (state) => state.selectedPrintProcess,\n  suggestedPrintProcess: (state) => state.suggestedPrintProcess,\n  profileOverwrites: (state) => state.profileOverwrites,\n  filamentProfileOverwrites: (state) => state.filamentProfileOverwrites,\n  getProfileValue: (state) => (key) => {\n    if (state.profileOverwrites[key]) {\n      return state.profileOverwrites[key];\n    }\n    return state.profilePreset[key] || ''\n  },\n  getFilamentProfileValue: (state) => (key) => {\n    if (state.filamentProfileOverwrites[key]) {\n      return state.filamentProfileOverwrites[key];\n    }\n    return state.filamentProfilePreset[key] || ''\n  },\n  meshes: (state) => state.meshes,\n  jusprintCurrentChatId: (state) => state.jusprintCurrentChatId,\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions,\n  getters,\n}\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport sliceSettingsStore from './sliceSettingsStore'\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n  modules: {\n    sliceSettingsStore,\n  }\n});\n","import mountVue from '@src/mount'\nimport { routes, components } from '@src/pages'\nimport { components as entComponents, routes as entRoutes } from '@entSrc/pages'\nimport store from '@src/store'\n\nmountVue(store, [...routes, ...entRoutes], { ...components, ...entComponents })\n","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminalPage.vue?vue&type=style&index=0&id=020f0348&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ArchivedPrintersPage.vue?vue&type=style&index=0&id=b5b4a9e6&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/octopod.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchInput.vue?vue&type=style&index=0&id=76904468&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotCard.vue?vue&type=style&index=0&id=413ec1b9&prod&lang=sass&scoped=true&\"","const SupportEmail = 'support@obico.io'\n\nexport { SupportEmail }\n","module.exports = __webpack_public_path__ + \"img/plugin_verification_code.png\";","module.exports = __webpack_public_path__ + \"img/klipper_logo.jpg\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StreamingBox.vue?vue&type=style&index=0&id=0986fe8b&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/detached-2.jpg\";","module.exports = __webpack_public_path__ + \"img/bumpsAndRoughSurface-2.jpg\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DatePickerModal.vue?vue&type=style&index=0&id=56d59fd8&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-7.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberSpinner.vue?vue&type=style&index=0&id=3af0b05a&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsKingroonSection.vue?vue&type=style&index=0&id=84449caa&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=style&index=0&id=79a2bd8c&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatsPage.vue?vue&type=style&index=0&id=1a9239ba&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotFeedbackApp.vue?vue&type=style&index=0&id=3ab8d3da&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureItem.vue?vue&type=style&index=0&id=22dafde6&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('Your three-month Pro Plan Is Now Active')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Webcam-Based AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja First Layer AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Go To Printer Control Page'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","module.exports = __webpack_public_path__ + \"img/install_plugin.png\";","module.exports = __webpack_public_path__ + \"img/download-on-app-store.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureWidget.vue?vue&type=style&index=0&id=85ef39ce&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=style&index=0&id=0f88dca4&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NavBar.vue?vue&type=style&index=0&id=649a7c88&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveWorking.vue?vue&type=style&index=0&id=3c99e284&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SavingAnimation.vue?vue&type=style&index=0&id=067e7fa8&prod&lang=sass&scoped=true&\"","const BillingCycle = {\n  Annual: 'annual',\n  Monthly: 'monthly',\n}\n\nconst CalcPeriod = {\n  Year: 'year',\n  Month: 'month',\n  Hour: 'hour',\n}\n\nconst PlanMonthlyPrice = {\n  [BillingCycle.Annual]: 6.99,\n  [BillingCycle.Monthly]: 8.99,\n}\n\nconst LoyaltyMonthlyPrice = {\n  [BillingCycle.Annual]: 5.49,\n  [BillingCycle.Monthly]: 7.49,\n}\n\nconst monthlyPriceFor = (billingCycle, isLoyalty = false) => {\n  if (isLoyalty) return LoyaltyMonthlyPrice[billingCycle]\n  return PlanMonthlyPrice[billingCycle]\n}\n\nconst DHPackBillingCycleMul = {\n  [BillingCycle.Annual]: 1,\n  [BillingCycle.Monthly]: 1.5,\n}\n\nconst AdditionalPrinterPrice = {\n  [BillingCycle.Annual]: 2,\n  [BillingCycle.Monthly]: 3,\n}\n\nconst CalcPeriodMonths = {\n  [CalcPeriod.Year]: 12,\n  [CalcPeriod.Month]: 1,\n}\n\nconst roundCurrency = (price) => Math.round((price + Number.EPSILON) * 100) / 100\n\nconst toCalcPeriod = (billingCycle) => {\n  return billingCycle == BillingCycle.Annual ? CalcPeriod.Year : CalcPeriod.Month\n}\n\nconst DHPacks = {\n  0: { hours: 0, price: 0 },\n  2: { hours: 80, price: 2 },\n  5: { hours: 300, price: 5 },\n  10: { hours: 800, price: 10 },\n  20: { hours: 2500, price: 20 },\n}\n\nconst RecommendedDHPackKey = ['2', '5', '5', '10', '10', '20', '20', '20', '20', '20']\n\nconst PrepaidDHPacks = {\n  10: { hours: 200, price: 10 },\n  20: { hours: 500, price: 20 },\n}\n\nconst calcPlanPrice = (billingCycle, calcPeriod, isLoyalty = false) => {\n  return roundCurrency(monthlyPriceFor(billingCycle, isLoyalty) * CalcPeriodMonths[calcPeriod])\n}\n\nconst calcDHPackPrice = (billingCycle, calcPeriod, dhPackKey) => {\n  return roundCurrency(\n    DHPacks[dhPackKey].price * DHPackBillingCycleMul[billingCycle] * CalcPeriodMonths[calcPeriod]\n  )\n}\n\nconst calcPrinterPrice = (billingCycle, numAdditionalPrinters, calcPeriod) => {\n  return roundCurrency(\n    AdditionalPrinterPrice[billingCycle] * numAdditionalPrinters * CalcPeriodMonths[calcPeriod]\n  )\n}\n\nconst calcPriceTable = (billingCycle, numPrinters, dhPackKey, isLoyalty = false) => {\n  const billingCycleMonths = CalcPeriodMonths[toCalcPeriod(billingCycle)]\n  const basePlanPrice = calcPlanPrice(billingCycle, CalcPeriod.Month, isLoyalty)\n  const basePrinterPrice = calcPrinterPrice(billingCycle, 1, CalcPeriod.Month)\n  const numAdditionalPrinters = Math.max(numPrinters - 1, 0)\n  const additionalPrintersPrice = calcPrinterPrice(\n    billingCycle,\n    numAdditionalPrinters,\n    CalcPeriod.Month\n  )\n  const dhPackPrice = calcDHPackPrice(billingCycle, CalcPeriod.Month, dhPackKey)\n  const totalPlanPrice = calcPlanPrice(billingCycle, toCalcPeriod(billingCycle), isLoyalty)\n  const totalAdditionalPrintersPrice = calcPrinterPrice(\n    billingCycle,\n    numAdditionalPrinters,\n    toCalcPeriod(billingCycle)\n  )\n  const totalDHPackPrice = calcDHPackPrice(billingCycle, toCalcPeriod(billingCycle), dhPackKey)\n  const totalPrice = roundCurrency(totalPlanPrice + totalAdditionalPrintersPrice + totalDHPackPrice)\n  return {\n    billingCycleMonths,\n    basePlanPrice,\n    basePrinterPrice,\n    numAdditionalPrinters,\n    additionalPrintersPrice,\n    dhPackPrice,\n    totalPlanPrice,\n    totalAdditionalPrintersPrice,\n    totalDHPackPrice,\n    totalPrice,\n  }\n}\n\nexport {\n  BillingCycle,\n  CalcPeriod,\n  PlanMonthlyPrice,\n  LoyaltyMonthlyPrice,\n  monthlyPriceFor,\n  DHPackBillingCycleMul,\n  AdditionalPrinterPrice,\n  DHPacks,\n  PrepaidDHPacks,\n  RecommendedDHPackKey,\n  calcPlanPrice,\n  calcDHPackPrice,\n  calcPriceTable,\n}\n","module.exports = __webpack_public_path__ + \"img/octoprint_logo.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=style&index=0&id=7f862148&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemPage.vue?vue&type=style&index=0&id=7d1ec790&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=style&index=0&id=c75daef2&prod&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/moonraker_verification_code.png\";","module.exports = __webpack_public_path__ + \"img/detached-1.jpg\";","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=style&index=0&id=33cffac1&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=style&index=0&id=5aa2b926&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FileStructureItem.vue?vue&type=style&index=0&id=56a42b8e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=style&index=0&id=d1933d3e&prod&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsSection.vue?vue&type=style&index=0&id=13bcafb3&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinChatHistory.vue?vue&type=style&index=0&id=108f673a&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-1.webp\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ObicoInstallationGuidePage.vue?vue&type=style&index=0&id=3e025757&prod&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/webcam-streaming.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=style&index=0&id=21ff5370&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/gaps-1.jpg\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewFolderModal.vue?vue&type=style&index=0&id=6d629910&prod&lang=sass&scoped=true&\"","// Check if localStorage available\nexport function isLocalStorageSupported() {\n  try {\n    const key = '__random_key_we_are_not_going_to_use__'\n    localStorage.setItem(key, key)\n    localStorage.removeItem(key)\n    return true\n  } catch (e) {\n    return false\n  }\n}\n","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlWidget.vue?vue&type=style&index=0&id=8cc7b434&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=style&index=1&id=b5cfcc80&prod&lang=sass&scoped=true&\"","import Vue from 'vue'\nimport axios from 'axios'\n\nimport { SupportEmail } from './consts.js'\nimport { inMobileWebView } from '@src/lib/page-context'\nimport i18n from '@src/i18n/i18n.js'\n\nconst init = (site) => {\n  return window.Chargebee.init({\n    site: site,\n  })\n}\n\nconst getInstance = () => {\n  return window.Chargebee.getInstance()\n}\n\nconst checkout = (chargebeeInstance, url, data, errorHandler = null) => {\n  if (inMobileWebView()) {\n    const urlObj = new URL(window.location.origin + url)\n    for (const prop in data) {\n      urlObj.searchParams.append(prop, data[prop])\n    }\n    urlObj.searchParams.append('redirect', true)\n    window.location.href = urlObj.href\n    return\n  }\n\n  chargebeeInstance.openCheckout({\n    hostedPage: function () {\n      // Hit your end point that returns hosted page object as response\n      // This sample end point will call checkout new api\n      // https://apidocs.chargebee.com/docs/api/hosted_pages#checkout_new_subscription\n      // If you want to use paypal, go cardless and plaid, pass embed parameter as false\n      let p = axios\n        .get(url, {\n          params: data,\n          headers: {\n            Accept: 'application/json',\n            'Content-Type': 'application/json',\n          },\n        })\n        .then((result) => result.data)\n      return p\n    },\n    error: function () {\n      if (errorHandler) {\n        errorHandler()\n        return\n      }\n      Vue.swal.fire({\n        type: 'error',\n        title: `${i18n.t('Oops...')}`,\n        html: `${i18n.t('Something went wrong! Please')} <a href=\"mailto:${SupportEmail}\">${i18n.t(\n          'Contact us'\n        )}</a> ${i18n.t('for help.')}`,\n      })\n    },\n  })\n}\n\nconst portal = (chargebeeInstance) => {\n  const fetchPortalSession = function () {\n    return axios\n      .get('/ent/generate_portal_session/', {\n        headers: {\n          Accept: 'application/json',\n          'Content-Type': 'application/json',\n        },\n      })\n      .then((result) => result.data)\n  }\n\n  if (inMobileWebView()) {\n    fetchPortalSession()\n      .then((portalSession) => {\n        window.location.href = portalSession.access_url\n      })\n      .catch(() => {\n        Vue.swal.fire({\n          type: 'error',\n          title: `${i18n.t('Oops...')}`,\n          html: `${i18n.t('Something went wrong! Please')} <a href=\"mailto:${SupportEmail}\">${i18n.t(\n            'Contact us'\n          )}</a> ${i18n.t('for help.')}`,\n        })\n      })\n    return\n  }\n\n  chargebeeInstance.setPortalSession(fetchPortalSession)\n\n  let cbPortal = chargebeeInstance.createChargebeePortal()\n  cbPortal.open({\n    close() {\n      //close callbacks\n    },\n  })\n}\n\nexport { init, getInstance, checkout, portal }\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigureSubscription.vue?vue&type=style&index=0&id=7ebe8524&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/detective-working.gif\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintPage.vue?vue&type=style&index=0&id=3b8e9439&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerShotCard.vue?vue&type=style&index=0&id=26964d5c&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FilteringDropdown.vue?vue&type=style&index=0&id=614429e6&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/vacation.gif\";","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=style&index=0&id=146a1112&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"subcribe-dlg pt-4\"},[_c('div',{staticClass:\"text-center py-2\"},[_c('div',{staticClass:\"btn-group btn-group-toggle\"},[_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': _vm.isAnnual }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Annual,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Annual)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Annual}}}),_vm._v(\" \"+_vm._s(_vm.$t('Annual (SAVE 33%)'))+\" \")]),_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': !_vm.isAnnual }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Monthly,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Monthly)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Monthly}}}),_vm._v(\" \"+_vm._s(_vm.$t('Monthly'))+\" \")])])]),_c('div',[_c('div',{staticClass:\"number-printer py-3\",staticStyle:{\"display\":\"flex\",\"align-items\":\"baseline\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Number of printer(s)'))+\":\")]),_c('NumberSpinner',{attrs:{\"id\":\"sub-printers\",\"group-class\":\"input-group-sm\",\"min\":1,\"max\":100,\"step\":1},model:{value:(_vm.numPrinters),callback:function ($$v) {_vm.numPrinters=$$v},expression:\"numPrinters\"}}),(_vm.changeSubscription)?_c('small',{staticClass:\"text-warning ml-2\"},[(_vm.numPrinters > _vm.initialNumPrinters)?_c('span',[_vm._v(\" (\"+_vm._s(_vm.$t('Add'))+\" \"+_vm._s(_vm.numPrinters - _vm.initialNumPrinters)+\") \")]):_vm._e(),(_vm.numPrinters === _vm.initialNumPrinters)?_c('span',[_vm._v(_vm._s(_vm.$t(' (No change) ')))]):_vm._e(),(_vm.numPrinters < _vm.initialNumPrinters)?_c('span',[_vm._v(\" (\"+_vm._s(_vm.$t('Remove'))+\" \"+_vm._s(_vm.initialNumPrinters - _vm.numPrinters)+\") \")]):_vm._e()]):_vm._e()],1),_c('div',[_vm._v(_vm._s(_vm.$t('Add Subscribe&Save AI Detection Hour Pack?')))]),_c('div',[_c('div',{staticClass:\"form-group mt-2\"},_vm._l((Object.keys(_vm.DHPacks)),function(key){return _c('div',{key:key,staticClass:\"custom-control custom-radio\",class:{ recommended: key == _vm.recommendedDHPackKey }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.dhPackKey),expression:\"dhPackKey\"}],staticClass:\"custom-control-input\",attrs:{\"id\":'sub-dh-pack-selected-' + key,\"type\":\"radio\",\"name\":\"sub-dh-pack-selected\",\"autocomplete\":\"off\"},domProps:{\"value\":key,\"checked\":_vm._q(_vm.dhPackKey,key)},on:{\"change\":function($event){_vm.dhPackKey=key}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":'sub-dh-pack-selected-' + key}},[_vm._v(\" \"+_vm._s(_vm.getDHPackChoiceLabel(key))+\" \"),(key == _vm.recommendedDHPackKey && !_vm.changeSubscription)?_c('span',{staticClass:\"tag\"},[_vm._v(_vm._s(_vm.$t('Popular')))]):_vm._e(),(_vm.changeSubscription && _vm.initialDHPackKey == key)?_c('span',{staticClass:\"text-warning ml-2\"},[_vm._v(\" ⟵ \"+_vm._s(_vm.$t('Current'))+\" \")]):_vm._e()])])}),0)])]),_c('table',{staticClass:\"table table-striped pricing mt-sm-2 mt-md-5\"},[_c('tfoot',[_c('tr',[_c('th',{attrs:{\"scope\":\"col\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Total'))+\" \"),(_vm.changeSubscription)?_c('span',{staticClass:\"text-warning\"},[_vm._v(\" * \")]):_vm._e()]),_c('th',{staticClass:\"text-right\",staticStyle:{\"width\":\"50%\"},attrs:{\"scope\":\"col\"}},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalPrice)))])])])]),_c('tbody',[_c('tr',[_c('td',[_vm._v(\"AI Premium \"+_vm._s(_vm.$t('plan')))]),_c('td',{staticClass:\"text-right\"},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalPlanPrice)))]),(_vm.isAnnual)?_c('div',{staticClass:\"price-sub\"},[_vm._v(\" \"+_vm._s(_vm.priceSubDisplay(_vm.priceTable.basePlanPrice))+\" \")]):_vm._e()])]),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('1st printer (included)')))]),_c('td',{staticClass:\"text-right\"},[_vm._v(\"$0\")])]),_c('tr',[_c('td',[_c('span',[_vm._v(_vm._s(_vm.priceTable.numAdditionalPrinters))]),_vm._v(\" \"+_vm._s(_vm.$t('additional'))+\" \"+_vm._s(_vm._f(\"pluralize\")('printer',_vm.priceTable.numAdditionalPrinters))+\" \")]),_c('td',{staticClass:\"text-right\"},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalAdditionalPrintersPrice)))]),(_vm.isAnnual && _vm.priceTable.additionalPrintersPrice > 0)?_c('div',{staticClass:\"price-sub\"},[_vm._v(\" \"+_vm._s(_vm.priceSubDisplay(_vm.priceTable.additionalPrintersPrice))+\" \")]):_vm._e()])]),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('50 AI Detection Hours / month (included)')))]),_c('td',{staticClass:\"text-right\"},[_vm._v(\"$0\")])]),_c('tr',[_c('td',[_c('span',[_vm._v(_vm._s(_vm.dhPackName))])]),_c('td',{staticClass:\"text-right\"},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalDHPackPrice)))]),(_vm.isAnnual && _vm.dhPackKey != '0')?_c('div',{staticClass:\"price-sub\"},[_vm._v(\" \"+_vm._s(_vm.priceSubDisplay(_vm.priceTable.dhPackPrice))+\" \")]):_vm._e()])])])]),(_vm.changeSubscription)?_c('div',{staticClass:\"text-warning font-italic\",staticStyle:{\"margin-top\":\"-0.75rem\",\"font-size\":\"0.85em\"}},[_vm._v(\" * \"+_vm._s(_vm.$t( \"This is the total amount on your next bill. Click 'Checkout' see how much is due today.\" ))+\" \")]):_vm._e(),(!_vm.calculateOnly)?_c('div',{staticClass:\"my-3\",staticStyle:{\"text-align\":\"right\"}},[_c('a',{staticClass:\"btn mr-3\",attrs:{\"role\":\"button\"},on:{\"click\":_vm.cancel}},[_vm._v(_vm._s(_vm.$t('Cancel')))]),_c('a',{staticClass:\"btn btn-primary border\",attrs:{\"role\":\"button\"},on:{\"click\":_vm.checkout}},[_vm._v(_vm._s(_vm.$t('Checkout')))])]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:'input-group ' + _vm.groupClass},[_c('div',{staticClass:\"input-group-prepend\"},[_c('button',{class:'btn btn-num-spinner ' + _vm.buttonsClass,style:({ 'min-width': _vm.buttonsWidth }),attrs:{\"type\":\"button\"},on:{\"click\":_vm.decrease,\"mousedown\":function($event){return _vm.whileMouseDown(_vm.decrease)},\"mouseup\":_vm.clearTimer}},[_vm._t(\"decrementButton\",function(){return [_c('strong',[_vm._v(\"-\")])]})],2)]),_c('input',{class:_vm.classes,style:({ 'text-align': _vm.textAlign }),attrs:{\"type\":\"text\",\"min\":_vm.min,\"max\":_vm.max,\"step\":_vm.step,\"pattern\":\"\\\\d+\"},domProps:{\"value\":_vm.value},on:{\"input\":_vm.onInput,\"paste\":_vm.onInput,\"change\":_vm.onInput,\"focusout\":_vm.onInput}}),_c('div',{staticClass:\"input-group-append\"},[_c('button',{class:'btn btn-num-spinner ' + _vm.buttonsClass,style:({ 'min-width': _vm.buttonsWidth }),attrs:{\"type\":\"button\"},on:{\"click\":_vm.increase,\"mousedown\":function($event){return _vm.whileMouseDown(_vm.increase)},\"mouseup\":_vm.clearTimer}},[_vm._t(\"incrementButton\",function(){return [_c('strong',[_vm._v(\"+\")])]})],2)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div :class=\"'input-group ' + groupClass\">\n    <div class=\"input-group-prepend\">\n      <button\n        type=\"button\"\n        :style=\"{ 'min-width': buttonsWidth }\"\n        :class=\"'btn btn-num-spinner ' + buttonsClass\"\n        @click=\"decrease\"\n        @mousedown=\"whileMouseDown(decrease)\"\n        @mouseup=\"clearTimer\"\n      >\n        <slot name=\"decrementButton\">\n          <strong>-</strong>\n        </slot>\n      </button>\n    </div>\n\n    <input\n      type=\"text\"\n      :class=\"classes\"\n      :style=\"{ 'text-align': textAlign }\"\n      :min=\"min\"\n      :max=\"max\"\n      :step=\"step\"\n      :value=\"value\"\n      pattern=\"\\d+\"\n      @input=\"onInput\"\n      @paste=\"onInput\"\n      @change=\"onInput\"\n      @focusout=\"onInput\"\n    />\n\n    <div class=\"input-group-append\">\n      <button\n        type=\"button\"\n        :style=\"{ 'min-width': buttonsWidth }\"\n        :class=\"'btn btn-num-spinner ' + buttonsClass\"\n        @click=\"increase\"\n        @mousedown=\"whileMouseDown(increase)\"\n        @mouseup=\"clearTimer\"\n      >\n        <slot name=\"incrementButton\">\n          <strong>+</strong>\n        </slot>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'NumberSpinner',\n  props: {\n    min: {\n      type: Number,\n      default: () => null,\n    },\n    max: {\n      type: Number,\n      default: () => null,\n    },\n    step: {\n      type: Number,\n      default: () => null,\n    },\n    value: {\n      type: Number,\n      required: true,\n    },\n    groupClass: {\n      type: String,\n      default: () => '',\n    },\n    buttonsClass: {\n      type: String,\n      default: () => '',\n    },\n    buttonsWidth: {\n      type: String,\n      default: () => '2.5rem',\n    },\n    textAlign: {\n      type: String,\n      default: () => 'center',\n    },\n    mouseDownSpeed: {\n      default: () => 500,\n      type: Number,\n    },\n  },\n  computed: {\n    classes() {\n      return 'form-control'\n    },\n  },\n  created() {\n    this.timer = null\n  },\n  methods: {\n    increase() {\n      if (this.max === null || this.max > this.value) {\n        this.onNewValue(Math.min(this.max, this.value + 1))\n      }\n    },\n    decrease() {\n      if (this.min === null || this.min < this.value) {\n        this.onNewValue(Math.max(this.min, this.value - this.step))\n      }\n    },\n    onInput(event) {\n      this.onNewValue(event.target.value)\n    },\n    onNewValue(value) {\n      const v = parseFloat(value)\n      if (v) {\n        if (this.min === null || (v >= this.min && (this.max === null || v <= this.max))) {\n          this.$emit('input', v)\n        }\n      }\n    },\n    clearTimer() {\n      if (this.timer) {\n        clearInterval(this.timer)\n        this.timer = null\n      }\n    },\n    whileMouseDown(callback) {\n      if (this.timer === null) {\n        this.timer = setInterval(() => {\n          callback()\n        }, this.mouseDownSpeed)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn-num-spinner\n  outline: none\n  box-shadow: none\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberSpinner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberSpinner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NumberSpinner.vue?vue&type=template&id=3af0b05a&scoped=true&\"\nimport script from \"./NumberSpinner.vue?vue&type=script&lang=js&\"\nexport * from \"./NumberSpinner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NumberSpinner.vue?vue&type=style&index=0&id=3af0b05a&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3af0b05a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"subcribe-dlg pt-4\">\n    <div class=\"text-center py-2\">\n      <div class=\"btn-group btn-group-toggle\">\n        <label :class=\"{ btn: true, 'no-corner': true, 'btn-primary': isAnnual }\">\n          <input\n            v-model=\"billingCycle\"\n            type=\"radio\"\n            :value=\"BillingCycle.Annual\"\n            autocomplete=\"off\"\n          />\n          {{ $t('Annual (SAVE 33%)') }}\n        </label>\n        <label :class=\"{ btn: true, 'no-corner': true, 'btn-primary': !isAnnual }\">\n          <input\n            v-model=\"billingCycle\"\n            type=\"radio\"\n            :value=\"BillingCycle.Monthly\"\n            autocomplete=\"off\"\n          />\n          {{ $t('Monthly') }}\n        </label>\n      </div>\n    </div>\n    <div>\n      <div class=\"number-printer py-3\" style=\"display: flex; align-items: baseline\">\n        <div>{{ $t('Number of printer(s)') }}:</div>\n\n        <NumberSpinner\n          id=\"sub-printers\"\n          v-model=\"numPrinters\"\n          group-class=\"input-group-sm\"\n          :min=\"1\"\n          :max=\"100\"\n          :step=\"1\"\n        />\n        <small v-if=\"changeSubscription\" class=\"text-warning ml-2\">\n          <span v-if=\"numPrinters > initialNumPrinters\">\n            ({{ $t('Add') }} {{ numPrinters - initialNumPrinters }})\n          </span>\n          <span v-if=\"numPrinters === initialNumPrinters\">{{ $t(' (No change) ') }}</span>\n          <span v-if=\"numPrinters < initialNumPrinters\">\n            ({{ $t('Remove') }} {{ initialNumPrinters - numPrinters }})\n          </span>\n        </small>\n      </div>\n      <div>{{ $t('Add Subscribe&amp;Save AI Detection Hour Pack?') }}</div>\n      <div>\n        <div class=\"form-group mt-2\">\n          <div\n            v-for=\"key in Object.keys(DHPacks)\"\n            :key=\"key\"\n            class=\"custom-control custom-radio\"\n            :class=\"{ recommended: key == recommendedDHPackKey }\"\n          >\n            <input\n              :id=\"'sub-dh-pack-selected-' + key\"\n              v-model=\"dhPackKey\"\n              type=\"radio\"\n              class=\"custom-control-input\"\n              name=\"sub-dh-pack-selected\"\n              :value=\"key\"\n              autocomplete=\"off\"\n            />\n            <label class=\"custom-control-label\" :for=\"'sub-dh-pack-selected-' + key\">\n              {{ getDHPackChoiceLabel(key) }}\n              <span v-if=\"key == recommendedDHPackKey && !changeSubscription\" class=\"tag\">{{\n                $t('Popular')\n              }}</span>\n              <span v-if=\"changeSubscription && initialDHPackKey == key\" class=\"text-warning ml-2\">\n                ⟵ {{ $t('Current') }}\n              </span>\n            </label>\n          </div>\n        </div>\n      </div>\n    </div>\n    <table class=\"table table-striped pricing mt-sm-2 mt-md-5\">\n      <tfoot>\n        <tr>\n          <th scope=\"col\">\n            {{ $t('Total') }}\n            <span v-if=\"changeSubscription\" class=\"text-warning\"> * </span>\n          </th>\n          <th scope=\"col\" class=\"text-right\" style=\"width: 50%\">\n            <span>{{ priceDisplay(priceTable.totalPrice) }}</span>\n          </th>\n        </tr>\n      </tfoot>\n      <tbody>\n        <tr>\n          <td>AI Premium {{ $t('plan') }}</td>\n          <td class=\"text-right\">\n            <span>{{ priceDisplay(priceTable.totalPlanPrice) }}</span>\n            <div v-if=\"isAnnual\" class=\"price-sub\">\n              {{ priceSubDisplay(priceTable.basePlanPrice) }}\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td>{{ $t('1st printer (included)') }}</td>\n          <td class=\"text-right\">$0</td>\n        </tr>\n        <tr>\n          <td>\n            <span>{{ priceTable.numAdditionalPrinters }}</span> {{ $t('additional') }}\n            {{ 'printer' | pluralize(priceTable.numAdditionalPrinters) }}\n          </td>\n          <td class=\"text-right\">\n            <span>{{ priceDisplay(priceTable.totalAdditionalPrintersPrice) }}</span>\n            <div v-if=\"isAnnual && priceTable.additionalPrintersPrice > 0\" class=\"price-sub\">\n              {{ priceSubDisplay(priceTable.additionalPrintersPrice) }}\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td>{{ $t('50 AI Detection Hours / month (included)') }}</td>\n          <td class=\"text-right\">$0</td>\n        </tr>\n        <tr>\n          <td>\n            <span>{{ dhPackName }}</span>\n          </td>\n          <td class=\"text-right\">\n            <span>{{ priceDisplay(priceTable.totalDHPackPrice) }}</span>\n            <div v-if=\"isAnnual && dhPackKey != '0'\" class=\"price-sub\">\n              {{ priceSubDisplay(priceTable.dhPackPrice) }}\n            </div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n\n    <div\n      v-if=\"changeSubscription\"\n      class=\"text-warning font-italic\"\n      style=\"margin-top: -0.75rem; font-size: 0.85em\"\n    >\n      *\n      {{\n        $t(\n          \"This is the total amount on your next bill. Click 'Checkout' see how much is due today.\"\n        )\n      }}\n    </div>\n\n    <div v-if=\"!calculateOnly\" class=\"my-3\" style=\"text-align: right\">\n      <a role=\"button\" class=\"btn mr-3\" @click=\"cancel\">{{ $t('Cancel') }}</a>\n      <a role=\"button\" class=\"btn btn-primary border\" @click=\"checkout\">{{ $t('Checkout') }}</a>\n    </div>\n  </div>\n</template>\n\n<script>\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport NumberSpinner from '@src/components/NumberSpinner.vue'\nimport { BillingCycle, DHPacks, RecommendedDHPackKey, calcPriceTable } from '@entSrc/lib/pricing.js'\n\nexport default {\n  name: 'ConfigureSubscription',\n  components: {\n    NumberSpinner,\n  },\n  props: {\n    changeSubscription: {\n      default() {\n        return false\n      },\n      type: Boolean,\n    },\n    calculateOnly: {\n      default() {\n        return false\n      },\n      type: Boolean,\n    },\n    initialNumPrinters: {\n      default() {\n        return 1\n      },\n      type: Number,\n    },\n    initialDHPackKey: {\n      default: () => '0',\n      type: String,\n    },\n    initialBillingCycle: {\n      default: () => BillingCycle.Annual,\n      type: String,\n    },\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeInstance: {\n      type: Object,\n      required: true,\n    },\n    couponCode: {\n      type: String,\n      default: () => null,\n    },\n    currentPlanId: {\n      type: String,\n      default: () => null,\n    },\n  },\n  data: function () {\n    return {\n      numPrinters: this.initialNumPrinters,\n      billingCycle: this.initialBillingCycle,\n      dhPackKey: this.initialDHPackKey,\n    }\n  },\n  computed: {\n    isAnnual() {\n      return this.billingCycle === BillingCycle.Annual\n    },\n    recommendedDHPackKey() {\n      return RecommendedDHPackKey[this.numPrinters - 1]\n    },\n    dhPackName() {\n      return this.getDHPackLabel(this.dhPackKey)\n    },\n    isLoyaltyPlan() {\n      return Boolean(this.currentPlanId && this.currentPlanId.endsWith('-loyalty'))\n    },\n    priceTable() {\n      return calcPriceTable(this.billingCycle, this.numPrinters, this.dhPackKey, this.isLoyaltyPlan)\n    },\n  },\n  created() {\n    this.BillingCycle = BillingCycle\n    this.DHPacks = DHPacks\n  },\n  methods: {\n    getDHPackLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month pack`, {\n            name: DHPacks[key].hours,\n          })}`\n        : `${this.$i18next.t('AI Detection Hour Pack not selected')}`\n    },\n    getDHPackChoiceLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month`, { name: DHPacks[key].hours })}`\n        : `${this.$i18next.t('No AI Detection Hour Pack')}`\n    },\n    priceDisplay(price) {\n      if (price == 0) {\n        return '$0'\n      }\n      return this.billingCycle == BillingCycle.Annual ? `$${price} / year` : `$${price} / month`\n    },\n    priceSubDisplay(price) {\n      if (price == 0) {\n        return '$0'\n      }\n      return `= $${price} / month x ${this.priceTable.billingCycleMonths}`\n    },\n    checkout() {\n      if (!this.primaryEmailVerified) {\n        this.showPrimaryEmailUnverifiedWarning()\n        return\n      }\n\n      chargeBee.checkout(this.chargeBeeInstance, '/ent/generate_pro_checkout_url/', {\n        plan: 'pro',\n        annual: this.isAnnual,\n        printers: this.numPrinters,\n        dhpack_level: this.dhPackKey,\n        coupon: this.couponCode,\n      })\n    },\n    showPrimaryEmailUnverifiedWarning() {\n      this.$swal.Reject.fire({\n        html: `<p class=\"text-center\">${this.$i18next.t(\n          'You need to'\n        )} <a href=\"/accounts/email/\">${this.$i18next.t(\n          'verify your primary email'\n        )}</a> ${this.$i18next.t('as it will be used for billing communication.')}</p>`,\n      })\n    },\n    cancel() {\n      this.$swal.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n#sub-printers\n  margin-left: 0.35rem\n\n.price-sub\n  color: var(--color-text-secondary)\n  font-size: 0.9em\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigureSubscription.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigureSubscription.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfigureSubscription.vue?vue&type=template&id=7ebe8524&scoped=true&\"\nimport script from \"./ConfigureSubscription.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfigureSubscription.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfigureSubscription.vue?vue&type=style&index=0&id=7ebe8524&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7ebe8524\",\n  null\n  \n)\n\nexport default component.exports","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinFeedback.vue?vue&type=style&index=0&id=e9689bf8&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintCard.vue?vue&type=style&index=0&id=514d0214&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SliderInput.vue?vue&type=style&index=0&id=abb68ee6&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WelcomePage.vue?vue&type=style&index=0&id=34f8280e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemCompletedModal.vue?vue&type=style&index=0&id=058adf52&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bubbling-2.jpg\";","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=style&index=0&id=411f3522&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=style&index=0&id=b5cfcc80&prod&lang=sass&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ActiveFilterNotice.vue?vue&type=style&index=0&id=061feff7&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=style&index=0&id=429c0503&prod&lang=scss&scoped=true&\"","export const pageContext = () => {\n  return JSON.parse(document.querySelector('#page-context-json').text)\n}\n\nexport const mobilePlatform = () => {\n  return pageContext()['app_platform']\n}\n\nexport const inMobileWebView = () => {\n  return mobilePlatform() !== ''\n}\n\nexport const user = () => {\n  return JSON.parse(document.querySelector('#user-json').text)\n}\n\nexport const settings = () => {\n  return JSON.parse(document.querySelector('#settings-json').text)\n}\n\nexport const syndicate = () => {\n  return pageContext()['syndicate']\n}\n\nexport const language = () => {\n  return pageContext()['language']\n}","import axios from 'axios'\nimport { getCsrfFromDocument } from '@src/lib/utils'\n\naxios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'\nlet token = getCsrfFromDocument()\nif (token) {\n  axios.defaults.headers.common['X-CSRFToken'] = token\n} else {\n  console.error('CSRF token not found')\n}\n\nexport default axios\n","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveModal.vue?vue&type=style&index=0&id=ef0f185e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FocusedFeedbackConsent.vue?vue&type=style&index=0&id=91f97838&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=c7179f58&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/full-remote-access.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryPage.vue?vue&type=style&index=0&id=29682057&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=style&index=1&id=21ff5370&prod&lang=css&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=style&index=1&id=40661357&prod&scoped=true&lang=css&\"","import entries from 'lodash/entries'\nimport map from 'lodash/map'\n\nexport default {\n  // APIs\n  printShotFeedback: (shotId, printId) =>\n    `/api/v1/printshotfeedbacks/${shotId}/?print_id=${printId}`,\n  print: (printId) => `/api/v1/prints/${printId}/`,\n  prints: () => '/api/v1/prints/',\n  printsBulkDelete: () => '/api/v1/prints/bulk_delete/',\n  stats: () => `/api/v1/prints/stats/`,\n\n  printers: () => '/api/v1/printers/',\n  printer: (printerId) => `/api/v1/printers/${printerId}/`,\n  printerAction: (printerId, path) => `/api/v1/printers/${printerId}${path}`,\n  pubPrinter: () => '/api/v1p/printer/',\n\n  tunnels: () => '/api/v1/tunnels/',\n  tunnel: (id) => `/api/v1/tunnels/${id}/`,\n  tunnelUsage: () => '/api/v1/tunnelusage/',\n  verificationCode: () => '/api/v1/onetimeverificationcodes/',\n  user: () => '/api/v1/users/me/',\n  sharedResources: (paramsObj) =>\n    '/api/v1/sharedresources/?' + map(entries(paramsObj), (entry) => entry.join('=')).join('&'),\n  sharedResource: (resourceId) => `/api/v1/sharedresources/${resourceId}/`,\n  printerDiscovery: () => '/api/v1/printer_discovery/',\n  oneTimePasscodes: () => '/api/v1/one_time_passcodes/',\n\n  printerEvents: () => '/api/v1/printer_events/',\n\n  // Notifications\n  notificationPlugins: () => '/api/v1/notification_settings/available_plugins/',\n  notificationChannels: () => '/api/v1/notification_settings/',\n  updateNotificationChannel: (id) => `/api/v1/notification_settings/${id}/`,\n  testNotificationChannel: (id) => `/api/v1/notification_settings/${id}/send_test_message/`,\n\n  // App urls\n  printerControl: (printerId) => `/printers/${printerId}/control/`,\n  printerWebSocket: (printerId) => `/ws/web/${printerId}/`,\n  printerSharedWebSocket: (token) => `/ws/share_token/web/${token}/`,\n  printerWizard: (printerId) => `/printers/wizard/?printerId=${printerId}`,\n\n  // Gcodes\n  gcodeFile: (id) => `/api/v1/g_code_files/${id}/`,\n  gcodeFiles: () => '/api/v1/g_code_files/',\n  gcodeFolder: (id) => `/api/v1/g_code_folders/${id}/`,\n  gcodeFolders: () => '/api/v1/g_code_folders/',\n  gcode: (gcodeId) => `/api/v1/g_code_files/${gcodeId}/`,\n  gcodeFolderBulkDelete: () => '/api/v1/g_code_folders/bulk_delete/',\n  gcodeFileBulkDelete: () => '/api/v1/g_code_files/bulk_delete/',\n  gcodeFolderBulkMove: () => '/api/v1/g_code_folders/bulk_move/',\n  gcodeFileBulkMove: () => '/api/v1/g_code_files/bulk_move/',\n\n  // JusPrin\n  jusprinMe: () => '/jusprin/api/me/',\n  jusprinChats: (chatId) => (chatId ? `/jusprin/api/chats/${chatId}/` : `/jusprin/api/chats/`),\n  jusprinChatMessages: (chat_id) => `/jusprin/api/chats/messages/`,\n  jusprinPlateAnalysisProcess: () => '/jusprin/api/plate_analysis/',\n  jusprinContactSupport: () => '/jusprin/api/contact_support/',\n}\n","import publicUrls from '@src/config/server-urls'\n\nexport default {\n  ...publicUrls,\n  getMessages: () => '/ent/api/messages/',\n  dismissMessage: (id) => `/ent/api/messages/${id}/dismiss/`,\n  deleteAccount: () => '/ent/api/users/delete/',\n  userExt: () => '/ent/api/users/me_ext/',\n  switchLegacySubscriptionToLoyalty: () => '/ent/api/users/switch_legacy_subscription_to_loyalty/',\n  subscriptions: () => '/ent/api/subscriptions/',\n  activeSubscription: () => '/ent/api/subscriptions/active/',\n  cancelSubscription: (id) => `/ent/api/subscriptions/${id}/cancel/`,\n  publicTimelapses: () => '/ent/api/publictimelapse/',\n  uploadedTimelapses: () => '/ent/api/uploaded_timelapses/',\n  firstLayerInspection: (print_id) => `/ent/api/first_layer_inspection/?print_id=${print_id}`,\n  redeemBtt3mUnlimited: () => `/ent/partners/api/redeem/btt_3m_unlimited/`,\n  redeemThreeDO3mUnlimited: () => `/ent/partners/api/redeem/three_do_3m_unlimited/`,\n  redeemMintion3mUnlimited: () => `/ent/partners/api/redeem/mintion_3m_unlimited/`,\n  detectiveHourCouponCodes: () => '/ent/api/detective_hour_coupon_codes/',\n}\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=0f963e48&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/printoid.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFilePage.vue?vue&type=style&index=0&id=5e958c35&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/print-padded.png\";","var map = {\n\t\"./ApprisePlugin\": [\n\t\t\"f571\",\n\t\t\"chunk-691bc59e\"\n\t],\n\t\"./ApprisePlugin.vue\": [\n\t\t\"f571\",\n\t\t\"chunk-691bc59e\"\n\t],\n\t\"./DiscordPlugin\": [\n\t\t\"2ce8\",\n\t\t\"chunk-19479659\"\n\t],\n\t\"./DiscordPlugin.vue\": [\n\t\t\"2ce8\",\n\t\t\"chunk-19479659\"\n\t],\n\t\"./EmailPlugin\": [\n\t\t\"a80e\",\n\t\t\"chunk-683e0066\"\n\t],\n\t\"./EmailPlugin.vue\": [\n\t\t\"a80e\",\n\t\t\"chunk-683e0066\"\n\t],\n\t\"./PushbulletPlugin\": [\n\t\t\"5e41\",\n\t\t\"chunk-38e6bf7c\"\n\t],\n\t\"./PushbulletPlugin.vue\": [\n\t\t\"5e41\",\n\t\t\"chunk-38e6bf7c\"\n\t],\n\t\"./PushoverPlugin\": [\n\t\t\"e7fb\",\n\t\t\"chunk-312ac63a\"\n\t],\n\t\"./PushoverPlugin.vue\": [\n\t\t\"e7fb\",\n\t\t\"chunk-312ac63a\"\n\t],\n\t\"./SlackPlugin\": [\n\t\t\"0d89\",\n\t\t\"chunk-07cc365e\"\n\t],\n\t\"./SlackPlugin.vue\": [\n\t\t\"0d89\",\n\t\t\"chunk-07cc365e\"\n\t],\n\t\"./TelegramPlugin\": [\n\t\t\"350b\",\n\t\t\"chunk-c8beb52c\"\n\t],\n\t\"./TelegramPlugin.vue\": [\n\t\t\"350b\",\n\t\t\"chunk-c8beb52c\"\n\t],\n\t\"./TwilioPlugin\": [\n\t\t\"425a\",\n\t\t\"chunk-716240ff\"\n\t],\n\t\"./TwilioPlugin.vue\": [\n\t\t\"425a\",\n\t\t\"chunk-716240ff\"\n\t],\n\t\"./WebhookPlugin\": [\n\t\t\"affb\",\n\t\t\"chunk-24e37396\"\n\t],\n\t\"./WebhookPlugin.vue\": [\n\t\t\"affb\",\n\t\t\"chunk-24e37396\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = \"cb77\";\nmodule.exports = webpackAsyncContext;","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonPricingPage.vue?vue&type=style&index=0&id=0cc96e90&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MintionRedeemPage.vue?vue&type=style&index=0&id=456f3cd8&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FullScreenPrintCard.vue?vue&type=style&index=0&id=be9465e8&prod&lang=sass&scoped=true&\"","import startCase from 'lodash/startCase'\nimport toLower from 'lodash/toLower'\nimport replace from 'lodash/replace'\nimport get from 'lodash/get'\n\nexport function getNotificationSettingKey(notificationChannel, key) {\n  return `${notificationChannel.channelName}_${key}`\n}\n\nexport function temperatureDisplayName(name) {\n  return startCase(toLower(replace(name, /_/g, ' ')))\n}\n\nexport const getNormalizedP = (predictions, currentPosition, isPublic) => {\n  const num = Math.round(predictions.length * currentPosition)\n  const propName = isPublic ? 'p' : 'fields.normalized_p'\n  return get(predictions[num], `${propName}`, 0)\n}\n\nexport const toArrayBuffer = (maybeBin, onData) => {\n  if (!maybeBin) {\n    return\n  }\n\n  if (maybeBin instanceof Blob) {\n    const reader = new FileReader()\n    reader.addEventListener('loadend', (e) => {\n      if (!e.srcElement) {\n        return\n      }\n      onData(e.srcElement.result)\n    })\n    reader.readAsArrayBuffer(maybeBin)\n  } else {\n    onData(maybeBin)\n  }\n}\n\nexport const getCsrfFromDocument = () => {\n  return document.getElementsByName('csrfmiddlewaretoken')[0]?.value\n}\n\nexport const downloadFile = (url, filename) => {\n  fetch(url)\n    .then((res) => res.blob())\n    .then((res) => {\n      const aElement = document.createElement('a')\n      aElement.setAttribute('download', filename)\n      const href = URL.createObjectURL(res)\n      aElement.href = href\n      aElement.setAttribute('target', '_blank')\n      aElement.click()\n      URL.revokeObjectURL(href)\n    })\n}\n\nexport const formatWithoutDaylightSavingShift = (date, formattingStr) => {\n  return date.utcOffset(date._tzm).format(formattingStr)\n}\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemCompletedModal.vue?vue&type=style&index=0&id=29051c79&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolRedeemPage.vue?vue&type=style&index=0&id=580015d4&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{class:{\n      'saving-in-progress': _vm.savingClass,\n      'successfully-saved': _vm.savingDoneClass,\n      'failed-to-save': _vm.savingFailedClass,\n      'small-height': _vm.smallHeightClass,\n    }},[_vm._t(\"default\")],2),(_vm.errors && _vm.errors.length > 0)?_c('small',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.errorMsg))]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div\n      :class=\"{\n        'saving-in-progress': savingClass,\n        'successfully-saved': savingDoneClass,\n        'failed-to-save': savingFailedClass,\n        'small-height': smallHeightClass,\n      }\"\n    >\n      <slot></slot>\n    </div>\n    <small v-if=\"errors && errors.length > 0\" class=\"text-danger\">{{ errorMsg }}</small>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SavingAnimation',\n\n  props: {\n    saving: {\n      default() {\n        return false\n      },\n      type: Boolean,\n    },\n    errors: {\n      type: Array,\n      default: null,\n    },\n    height: {\n      default() {\n        return 'normal'\n      }, // normal, small\n      type: String,\n    },\n  },\n\n  data() {\n    return {\n      savingTimeout: null,\n      savingDoneTimeout: null,\n    }\n  },\n\n  computed: {\n    savingClass() {\n      return this.saving && this.savingTimeout\n    },\n    savingDoneClass() {\n      return !this.saving && this.savingDoneTimeout && !this.errors\n    },\n    savingFailedClass() {\n      return !this.saving && this.savingDoneTimeout && this.errors && this.errors.length > 0\n    },\n    smallHeightClass() {\n      return this.height === 'small'\n    },\n    errorMsg() {\n      return this.errors ? this.errors.join(' ') : ''\n    },\n  },\n\n  watch: {\n    saving: function (nowSaving, prevSaving) {\n      // watch it\n      if (!prevSaving && nowSaving) {\n        this.clearSavingTimeout()\n        this.savingTimeout = setTimeout(this.clearSavingTimeout, 15 * 1000)\n      } else if (prevSaving && !nowSaving) {\n        this.clearSavingTimeout()\n        this.savingDoneTimeout = setTimeout(() => {\n          clearTimeout(this.savingDoneTimeout)\n          this.savingDoneTimeout = null\n        }, 2 * 1000)\n      }\n    },\n  },\n\n  methods: {\n    clearSavingTimeout() {\n      if (this.savingTimeout) {\n        clearTimeout(this.savingTimeout)\n        this.savingTimeout = null\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.saving-in-progress, .successfully-saved, .failed-to-save\n  $indicatorSize: 16px\n\n  &:before\n    content: \"\"\n    background-size: $indicatorSize $indicatorSize\n    width: $indicatorSize\n    height: $indicatorSize\n    display: block\n    position: absolute\n    top: 0\n    bottom: 0\n    right: -#{$indicatorSize + 12px}\n    margin: auto\n    z-index: 9\n\n  &.saving-in-progress\n    position: relative\n\n    &:before\n      background-image: var(--url-loader)\n\n  &.successfully-saved\n    position: relative\n\n    &:before\n      background-image: url('/static/img/tick.svg')\n\n  &.failed-to-save\n    position: relative\n\n    &:before\n      background-image: url('/static/img/cross.svg')\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SavingAnimation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SavingAnimation.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SavingAnimation.vue?vue&type=template&id=067e7fa8&scoped=true&\"\nimport script from \"./SavingAnimation.vue?vue&type=script&lang=js&\"\nexport * from \"./SavingAnimation.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SavingAnimation.vue?vue&type=style&index=0&id=067e7fa8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"067e7fa8\",\n  null\n  \n)\n\nexport default component.exports","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingPlaceholder.vue?vue&type=style&index=0&id=18d7f03c&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bumpsAndRoughSurface-1.jpg\";","import i18n from '@src/i18n/i18n.js'\n\nexport default {\n  email: {\n    displayName: `${i18n.t('Email')}`,\n    componentName: 'EmailPlugin',\n  },\n  twilio: {\n    displayName: `${i18n.t('SMS')}`,\n    componentName: 'TwilioPlugin',\n  },\n  pushbullet: {\n    displayName: `${i18n.t('Pushbullet')}`,\n    componentName: 'PushbulletPlugin',\n  },\n  discord: {\n    displayName: `${i18n.t('Discord')}`,\n    componentName: 'DiscordPlugin',\n  },\n  telegram: {\n    displayName: `${i18n.t('Telegram')}`,\n    componentName: 'TelegramPlugin',\n  },\n  pushover: {\n    displayName: `${i18n.t('Pushover')}`,\n    componentName: 'PushoverPlugin',\n  },\n  slack: {\n    displayName: `${i18n.t('Slack')}`,\n    componentName: 'SlackPlugin',\n  },\n  webhook: {\n    displayName: `${i18n.t('Webhook')}`,\n    componentName: 'WebhookPlugin',\n  },\n  apprise: {\n    displayName: `${i18n.t('Apprise')}`,\n    componentName: 'ApprisePlugin',\n  },\n}\n","module.exports = __webpack_public_path__ + \"img/compatible-with-favorite-software.png\";","module.exports = __webpack_public_path__ + \"img/mintion-obico-logo.png\";","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=style&index=0&id=16e50642&prod&scoped=true&lang=css&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CollapsableDetails.vue?vue&type=style&index=0&id=48fdd412&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/webpage-multiple.svg\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DisplayStatusWidget.vue?vue&type=style&index=0&id=e46a13a2&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/mobileraker.webp\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"primary\":\"#00c4b4\",\"white\":\"#fff\"};","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PublicTimelapsesPage.vue?vue&type=style&index=0&id=3118e4a9&prod&lang=sass&scoped=true&\"","const Themes = {\n  Light: 'Light',\n  Dark: 'Dark',\n  System: 'System',\n}\n\n\nexport const jusprin = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#694b7c', [Themes.Dark]: '#694b7c'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#7d5c93', [Themes.Dark]: '#7d5c93'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#f3f4f6', [Themes.Dark]: '#f3f4f6'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#f3f4f6', [Themes.Dark]: '#f3f4f6'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#1f2937', [Themes.Dark]: '#1f2937'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#6b7280', [Themes.Dark]: '#6b7280'},\n    },\n  ],\n}\n\nexport const yumi = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#078ED3', [Themes.Dark]: '#FFCC2E'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#0B88C8', [Themes.Dark]: '#FFCC2E'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#24A8EC', [Themes.Dark]: '#018786'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#001210'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#D0D0D0'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#212224'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#131920'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#000000CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#FFFFFF13'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#C9E0FA26'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#6A7B8A'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#6A7B8A66'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#212224'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#EBEBEB80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#283848'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#EAEAEA'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#CDCDCD'},\n    },\n  ],\n}\n\nexport const kingroon = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#ED7100', [Themes.Dark]: '#ED7100'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#fb7a00', [Themes.Dark]: '#fb7a00'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#24A8EC', [Themes.Dark]: '#018786'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#001210'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#D0D0D0'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#212224'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#131920'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#000000CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#FFFFFF13'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#C9E0FA26'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#6A7B8A'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#6A7B8A66'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#42566B'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#EBEBEB80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#283848'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#EAEAEA'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#CDCDCD'},\n    },\n  ],\n}\n\nexport const mintion = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#75C4FE', [Themes.Dark]: '#75C4FE'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#35A9FD', [Themes.Dark]: '#35A9FD'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#03DAC5', [Themes.Dark]: '#03DAC5'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#424A54'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#F5F5F5'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#F5F5F5CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#66666613'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#66666626'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#ABB6C2'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#ABB6C266'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#8A94A2'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#E2E8ED'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#28303A80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#E3E3E3'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#4E5D6C'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#1D2935'},\n    },\n  ],\n}\n\n\nexport const biqu = {\n  // only dark theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#3596f3', [Themes.Dark]: '#3596f3'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#70EFDE', [Themes.Dark]: '#70EFDE'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#018786', [Themes.Dark]: '#018786'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#001210', [Themes.Dark]: '#001210'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#D0D0D0', [Themes.Dark]: '#D0D0D0'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#0a0c22', [Themes.Dark]: '#0a0c22'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#20274f', [Themes.Dark]: '#20274f'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#0c1239', [Themes.Dark]: '#0c1239'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#F5F5F5CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#66666613'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#66666626'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#6A7B8A', [Themes.Dark]: '#6A7B8A'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#ABB6C266'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#AAACB0', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#283848', [Themes.Dark]: '#283848'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#42566B', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#28303A80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#E3E3E3'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#4E5D6C'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#1D2935'},\n    },\n  ],\n}\n","import { isLocalStorageSupported } from './utils.js'\nimport * as syndicates from './syndicate.js'\n\n\nconst Themes = {\n  Light: 'Light',\n  Dark: 'Dark',\n  System: 'System',\n}\n\nconst defaultTheme = (isLocalStorageSupported() ? localStorage.getItem('colorTheme') : Themes.Dark) || Themes.Dark\n\n// CSS Vars\n\nconst colors = [\n  {\n    name: 'primary',\n    values: {[Themes.Light]: '#01A299', [Themes.Dark]: '#03DAC5'},\n  },\n  {\n    name: 'primary-hover',\n    values: {[Themes.Light]: '#019592', [Themes.Dark]: '#70EFDE'},\n  },\n  {\n    name: 'primary-muted',\n    values: {[Themes.Light]: '#03DAC5', [Themes.Dark]: '#018786'},\n  },\n  {\n    name: 'on-primary',\n    values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#001210'},\n  },\n  {\n    name: 'secondary',\n    values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#EBEBEB'},\n  },\n  {\n    name: 'secondary-hover',\n    values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#D0D0D0'},\n  },\n  {\n    name: 'on-secondary',\n    values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#28303A'},\n  },\n  {\n    name: 'success',\n    values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n  },\n  {\n    name: 'success-hover',\n    values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n  },\n  {\n    name: 'on-success',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n  },\n  {\n    name: 'danger',\n    values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n  },\n  {\n    name: 'danger-hover',\n    values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n  },\n  {\n    name: 'on-danger',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n  },\n  {\n    name: 'warning',\n    values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n  },\n  {\n    name: 'warning-hover',\n    values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n  },\n  {\n    name: 'on-warning',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n  },\n  {\n    name: 'on-warning-2',\n    values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n  },\n  {\n    name: 'background',\n    values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#233141'},\n  },\n  {\n    name: 'surface-primary',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#485B71'},\n  },\n  {\n    name: 'surface-secondary',\n    values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#2D3E4F'},\n  },\n  {\n    name: 'overlay',\n    values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#000000CC'},\n  },\n  {\n    name: 'hover',\n    values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#FFFFFF13'},\n  },\n  {\n    name: 'hover-accent',\n    values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#C9E0FA26'},\n  },\n  {\n    name: 'divider',\n    values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#6A7B8A'},\n  },\n  {\n    name: 'divider-muted',\n    values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#6A7B8A66'},\n  },\n  {\n    name: 'text-primary',\n    values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#EBEBEB'},\n  },\n  {\n    name: 'text-secondary',\n    values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#AAACB0'},\n  },\n  {\n    name: 'text-help',\n    values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n  },\n\n  {\n    name: 'input-background',\n    values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#42566B'},\n  },\n  {\n    name: 'input-placeholder',\n    values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#EBEBEB80'},\n  },\n\n  {\n    name: 'table-accent',\n    values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#283848'},\n  },\n\n  // Icon colors\n  {\n    name: 'icon-tunneling-1',\n    values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#EAEAEA'},\n  },\n  {\n    name: 'icon-tunneling-2',\n    values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#CDCDCD'},\n  },\n]\n\nconst urls = [\n  {\n    name: 'loader',\n    values: {[Themes.Light]: 'url(\"/static/img/loader/loader_light-scheme.svg\")', [Themes.Dark]: 'url(\"/static/img/loader/loader_dark-scheme.svg\")'},\n  },\n]\n\nconst shadows = [\n  {\n    name: 'top-nav',\n    values: {[Themes.Light]: '0px 2px 10px rgb(0 0 0 / .1)', [Themes.Dark]: '0px 2px 10px rgb(0 0 0 / .3)'},\n  },\n]\n\n\n// Get theme value (exclude \"System\")\nfunction currentThemeValue(theme, syndicate) {\n  const singleThemeSyndicates = {\n    jusprin: Themes.Light,\n    yumi: Themes.Dark,\n    kingroon: Themes.Light,\n    mintion: Themes.Light,\n  }\n\n  if (syndicate && singleThemeSyndicates[syndicate]) {\n    return singleThemeSyndicates[syndicate]\n  }\n\n  // Get system settings\n  if (theme.value === Themes.System) {\n    if (window.matchMedia('(prefers-color-scheme)').media !== 'not all' && window.matchMedia('(prefers-color-scheme: light)').matches) {\n      return Themes.Light\n    } else {\n      return Themes.Dark\n    }\n  }\n  // Return saved value since it's not \"System\"\n  return theme.value\n}\n\nfunction mergeColorOverrides(defaultColors, syndicateColors) {\n  const merged = new Map(defaultColors.map(color => [color.name, color]));\n\n  syndicateColors.forEach(color => {\n    merged.set(color.name, color);\n  });\n\n  return Array.from(merged.values());\n}\n\n\nfunction initTheme(themeValue, syndicate) {\n  const finalColors = syndicate && syndicates[syndicate]\n  ? mergeColorOverrides(colors, syndicates[syndicate].colors)\n  : colors;\n\n  finalColors.forEach(function(color) {\n    document.documentElement.style.setProperty(`--color-${color.name}`, color.values[themeValue])\n\n    if (color.name === 'surface-secondary') {\n      // Set the <meta name=\"theme-color\"> tag to theme the browser nav bar (Safari)\n      let meta = document.querySelector('meta[name=\"theme-color\"]')\n      meta.content = color.values[themeValue]\n    }\n  })\n\n  urls.forEach(function(url) {\n    document.documentElement.style.setProperty(`--url-${url.name}`, url.values[themeValue])\n  })\n\n  shadows.forEach(function(shadow) {\n    document.documentElement.style.setProperty(`--shadow-${shadow.name}`, shadow.values[themeValue])\n  })\n}\n\n\nexport {\n  Themes,\n  defaultTheme,\n\n  colors,\n  urls,\n  shadows,\n\n  currentThemeValue,\n  initTheme,\n}\n","import Vue from 'vue'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport {\n  currentThemeValue as themeValue,\n  defaultTheme,\n  initTheme as init,\n} from '@static/js/color-scheme'\n\nexport const theme = Vue.observable({\n  value: defaultTheme,\n})\n\nexport function currentThemeValue(syndicate) {\n  return themeValue(theme, syndicate)\n}\n\nexport function initTheme() {\n  return init(currentThemeValue(Vue.prototype.$syndicate), Vue.prototype.$syndicate)\n}\n\nexport function setTheme(newTheme) {\n  theme.value = newTheme\n  if (isLocalStorageSupported()) {\n    localStorage.setItem('colorTheme', theme.value)\n  }\n  initTheme(Vue.prototype.$syndicate)\n}\n","module.exports = __webpack_public_path__ + \"img/sovol-obico-logo.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoBox.vue?vue&type=style&index=0&id=39b52572&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/raisedRipples-3.jpg\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintJobControlWidget.vue?vue&type=style&index=0&id=6af168b5&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JusPrinPricingPage.vue?vue&type=style&index=0&id=086ae8b6&prod&lang=scss&scoped=true&\"","import notificationPlugins from '@src/notifications/plugins'\n\nconst defaultRoutes = {\n  GeneralPreferences: '/user_preferences/general/',\n  ThemePreferences: '/user_preferences/personalization/',\n  ProfilePreferences: '/user_preferences/profile/',\n  AuthorizedApps: '/user_preferences/authorized_apps/',\n  GeneralNotifications: '/user_preferences/general_notifications/',\n  PushNotifications: '/user_preferences/mobile_push_notifications/',\n}\n\nconst notificationRoutes = Object.keys(notificationPlugins).reduce((obj, name) => {\n  return Object.assign(obj, { [name]: `/user_preferences/notification_${name}/` })\n}, {})\n\nexport default {\n  ...defaultRoutes,\n  ...notificationRoutes,\n}\n","import publicRoutes from '@src/config/user-preferences/pref-routes'\n\nexport default {\n  ...publicRoutes,\n  Subscription: '/user_preferences/subscription/',\n  DetectiveHours: '/user_preferences/dh/',\n  DeleteAccount: '/user_preferences/delete/',\n}\n","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFoldersPage.vue?vue&type=style&index=0&id=3469c70e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeDetails.vue?vue&type=style&index=0&id=cccd6f4e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionWidget.vue?vue&type=style&index=0&id=b62a7098&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharedPrinterPage.vue?vue&type=style&index=0&id=36e7a07b&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=style&index=1&id=7f862148&prod&lang=sass&\"","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkPopup.vue?vue&type=style&index=0&id=76d88bae&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MutedAlert.vue?vue&type=style&index=0&id=74f6a500&prod&lang=sass&scoped=true&\"","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintProgressWidget.vue?vue&type=style&index=0&id=5b7d73ac&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-6.webp\";","import { render, staticRenderFns } from \"./ThreeDORedeemCompletedModal.vue?vue&type=template&id=29051c79&scoped=true&\"\nimport script from \"./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThreeDORedeemCompletedModal.vue?vue&type=style&index=0&id=29051c79&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29051c79\",\n  null\n  \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/3do-obico-logo.png\";"],"sourceRoot":""}