From a55916cc4c63f5c871f311bbb06e21d183045e5d Mon Sep 17 00:00:00 2001 From: Governikus Date: Thu, 9 Mar 2023 15:35:38 +0100 Subject: [PATCH] Add revision: v1.26.3 --- AUTHORS | 3 - CMakeLists.txt | 2 +- LICENSE.officially.txt | 2 +- LICENSE.txt | 2 +- cmake/Packaging.cmake | 2 +- cmake/android.toolchain.cmake | 2 +- cmake/cmd.cmake | 39 + cmake/prepare_sonarqube_env.cmake | 12 +- cmake/tests/openssl.cpp | 4 +- docs/installation/README.de.rst | 10 +- docs/installation/README.en.rst | 10 +- docs/releasenotes/1.26.3.rst | 32 + docs/releasenotes/announce.rst | 1 + docs/releasenotes/issues.rst | 5 + docs/releasenotes/support.rst | 22 +- docs/sdk/commands.rst | 8 +- docs/sdk/desktop.rst | 7 + docs/sdk/intro.rst | 10 - docs/sdk/messages.rst | 17 +- libs/CMakeLists.txt | 7 +- ...nsure-timeout-after-session-invalida.patch | 140 ++++ ...itting-some-comments-while-reformatt.patch | 102 +++ resources/ausweisapp.qrc | 13 +- resources/ausweisapp_desktop.qrc | 9 - resources/ausweisapp_mobile.qrc | 2 - resources/images/icon_five_digit_pin.svg | 17 + resources/images/icon_six_digit_pin_blue.svg | 18 + resources/images/icon_six_digit_pin_white.svg | 18 + resources/images/icon_ten_digit_puk.svg | 22 + resources/images/material_block.svg | 1 + .../{desktop => }/material_live_help.svg | 0 resources/images/material_person.svg | 1 + resources/images/mobile/material_five.svg | 1 - resources/images/mobile/material_six.svg | 1 - ...uk_same_page.svg => pin_letter_pinpuk.svg} | 4 +- .../pin_letter_pinpuk_different_page.svg | 104 --- .../images/pin_letter_pinpuk_red_bar.svg | 5 + .../images/pin_letter_pinpuk_red_bar_puk.svg | 5 + resources/images/pin_person.svg | 5 + resources/jenkins/docker/android/Dockerfile | 2 +- .../jenkins/dsl/Builds/Build_Docs.groovy | 2 +- .../jenkins/dsl/Builds/Build_SonarQube.groovy | 2 +- .../jenkins/dsl/Builds/Build_Win64_GNU.groovy | 8 - .../dsl/Builds/Build_Win64_GNU_MSI.groovy | 8 - .../dsl/Builds/Build_Win64_GNU_MSI_dev.groovy | 8 - .../dsl/Libraries/Libs_Win64_GNU.groovy | 1 - .../dsl/Libraries/Libs_Win64_GNU_dev.groovy | 1 - .../jenkins/dsl/Releases/Release_Docs.groovy | 2 +- .../dsl/Releases/Release_Win64_GNU.groovy | 8 - resources/jenkins/dsl/Review_Trigger.groovy | 26 +- .../dsl/Review_Trigger_Configuration.groovy | 2 +- .../jenkins/dsl/Review_Trigger_Libs.groovy | 2 +- .../jenkins/dsl/Reviews/Review_Docs.groovy | 2 +- .../dsl/Reviews/Review_Formatting.groovy | 2 + .../dsl/Reviews/Review_Libs_Win64_GNU.groovy | 1 - .../dsl/Reviews/Review_SonarQube.groovy | 9 +- .../jenkins/dsl/Reviews/Review_Trigger.groovy | 37 +- .../Review_Trigger_Configuration.groovy | 43 +- .../dsl/Reviews/Review_Trigger_Libs.groovy | 43 +- .../dsl/Reviews/Review_Win64_GNU.groovy | 8 - .../dsl/Reviews/Review_Win64_GNU_MSI.groovy | 8 - resources/jenkins/dsl/common/Constants.groovy | 2 + .../jenkins/dsl/common/LibraryReview.groovy | 8 +- .../jenkins/dsl/common/RootTrigger.groovy | 23 +- resources/jenkins/dsl/common/Trigger.groovy | 8 +- resources/jenkins/dsl/install.py | 2 +- resources/jenkins/notify_rb.sh | 93 +++ .../packaging/android/build.gradle.append | 2 +- resources/packaging/win/runtime_settings.wxs | 18 + resources/qml/+desktop/main.qml | 6 +- resources/qml/+mobile/main.qml | 4 +- .../AuthView/+desktop/AuthController.qml | 4 +- .../Governikus/AuthView/+desktop/AuthView.qml | 36 +- .../+desktop/CertificateDescriptionPage.qml | 4 +- .../AuthView/+desktop/DataGroup.qml | 4 +- .../AuthView/+desktop/EditRights.qml | 4 +- .../+desktop/SelfAuthenticationData.qml | 4 +- .../AuthView/+mobile/+phone/DataGroup.qml | 4 +- .../AuthView/+mobile/+phone/EditRights.qml | 4 +- .../AuthView/+mobile/+tablet/DataGroup.qml | 4 +- .../AuthView/+mobile/+tablet/EditRights.qml | 4 +- .../AuthView/+mobile/AbortedProgressView.qml | 4 +- .../AuthView/+mobile/AuthController.qml | 4 +- .../Governikus/AuthView/+mobile/AuthView.qml | 43 +- .../AuthView/+mobile/CardPositionView.qml | 5 +- .../+mobile/CertificateDescriptionPage.qml | 4 +- .../+mobile/CheckConnectivityView.qml | 4 +- .../+mobile/SelfAuthenticationData.qml | 4 +- .../+mobile/TransportPinReminderView.qml | 17 +- .../+desktop/ChangePinController.qml | 4 +- .../ChangePinView/+desktop/ChangePinView.qml | 59 +- .../+mobile/ChangePinController.qml | 4 +- .../ChangePinView/+mobile/ChangePinView.qml | 56 +- .../+mobile/ChangePinViewContent.qml | 113 --- .../ChangePinView/+mobile/PinUnknownView.qml | 73 -- .../ChangePinView/ChangePinViewContent.qml | 99 +++ resources/qml/Governikus/ChangePinView/qmldir | 1 - .../+mobile/CheckIDCardResultView.qml | 7 +- .../+mobile/CheckIDCardSuggestionView.qml | 6 +- .../+mobile/CheckIDCardView.qml | 6 +- .../+mobile/CheckIDCardWorkflow.qml | 4 +- .../+mobile/CheckResultSuggestionView.qml | 4 +- .../+mobile/CheckResultView.qml | 4 +- .../CheckResultView/+mobile/ResultEntry.qml | 4 +- .../+mobile/SuggestionData.qml | 4 +- .../+mobile/CheckSmartResultView.qml | 6 +- .../+mobile/CheckSmartSuggestionView.qml | 6 +- .../CheckSmartView/+mobile/CheckSmartView.qml | 6 +- .../+desktop/EnterPasswordView.qml | 48 +- .../EnterPasswordView/+desktop/NumberPad.qml | 6 +- .../+desktop/NumberPadButton.qml | 4 +- .../+desktop/PasswordInfoView.qml | 163 ----- .../+mobile/EnterPasswordView.qml | 39 +- .../EnterPasswordView/+mobile/NumberPad.qml | 9 +- .../+mobile/NumberPadButton.qml | 7 +- .../+mobile/PasswordInfoView.qml | 122 ---- .../EnterPasswordView/PasswordInfoImage.qml | 109 --- .../qml/Governikus/EnterPasswordView/qmldir | 2 - .../FeedbackView/+desktop/DetachedLogView.qml | 8 +- .../FeedbackView/+desktop/LogView.qml | 4 +- .../FeedbackView/+desktop/LogViewDelegate.qml | 4 +- .../+desktop/LogViewHighLight.qml | 4 +- .../+mobile/+android/StoreFeedbackPopup.qml | 4 +- .../+mobile/+ios/StoreFeedbackPopup.qml | 4 +- .../+mobile/LogTitleBarControls.qml | 4 +- .../FeedbackView/+mobile/LogView.qml | 4 +- .../Global/+desktop/ConfirmationPopup.qml | 6 +- .../Global/+desktop/DecisionView.qml | 5 +- .../Global/+desktop/GFileDialog.qml | 4 +- .../qml/Governikus/Global/+desktop/GPane.qml | 4 +- .../Global/+desktop/NavigationButton.qml | 6 +- .../Global/+desktop/PlatformConstants.qml | 4 +- .../Global/+desktop/ScrollGradients.qml | 4 +- .../Global/+desktop/ScrollablePane.qml | 4 +- .../Governikus/Global/+desktop/SearchBar.qml | 4 +- .../Governikus/Global/+desktop/TabbedPane.qml | 4 +- .../TabbedPaneDelegateIconAndText.qml | 4 +- ...TabbedPaneDelegateIconAndThreeLineText.qml | 4 +- .../+desktop/TabbedPaneDelegateText.qml | 4 +- .../Global/+desktop/ToggleableOption.qml | 26 - .../+android/+phone/DeviceConstants.qml | 4 +- .../+android/+tablet/DeviceConstants.qml | 4 +- .../+mobile/+android/BrandConstants.qml | 4 +- .../+mobile/+android/ConfirmationPopup.qml | 6 +- .../Global/+mobile/+android/SearchBar.qml | 4 +- .../+mobile/+ios/+phone/DeviceConstants.qml | 4 +- .../+mobile/+ios/+tablet/DeviceConstants.qml | 4 +- .../Global/+mobile/+ios/BrandConstants.qml | 4 +- .../Global/+mobile/+ios/ConfirmationPopup.qml | 5 +- .../Global/+mobile/+ios/SearchBar.qml | 4 +- .../Global/+mobile/+phone/DynamicLayout.qml | 8 - .../Global/+mobile/+tablet/DynamicLayout.qml | 8 - .../qml/Governikus/Global/+mobile/GPane.qml | 4 +- .../qml/Governikus/Global/+mobile/GSwitch.qml | 4 +- .../+mobile/IosBackGestureMouseArea.qml | 4 +- .../Global/+mobile/LabeledSwitch.qml | 4 +- .../Governikus/Global/+mobile/ListItem.qml | 4 +- .../Governikus/Global/+mobile/MenuItem.qml | 4 +- .../Governikus/Global/+mobile/PaneTitle.qml | 4 +- .../Global/+mobile/PlatformConstants.qml | 4 +- .../Global/+mobile/SwipeActionDelegate.qml | 4 +- .../Global/+mobile/TitledSeparator.qml | 4 +- .../Global/+qt5/RegExpValidatorCompat.qml | 4 +- .../Global/+qt6/RegExpValidatorCompat.qml | 4 +- .../Global/BaseConfirmationPopup.qml | 8 +- resources/qml/Governikus/Global/Category.qml | 4 +- resources/qml/Governikus/Global/Constants.qml | 4 +- .../qml/Governikus/Global/GBusyIndicator.qml | 4 +- resources/qml/Governikus/Global/GButton.qml | 32 +- resources/qml/Governikus/Global/GCheckBox.qml | 18 +- resources/qml/Governikus/Global/GComboBox.qml | 4 +- .../Governikus/Global/GConicalGradient.qml | 4 +- .../qml/Governikus/Global/GFlickable.qml | 4 +- .../Global/GFlickableColumnLayout.qml | 7 +- resources/qml/Governikus/Global/GGridView.qml | 4 +- .../Governikus/Global/GInformativeButton.qml | 70 ++ resources/qml/Governikus/Global/GListView.qml | 4 +- .../qml/Governikus/Global/GPaneBackground.qml | 4 +- .../qml/Governikus/Global/GProgressBar.qml | 4 +- .../qml/Governikus/Global/GRadioButton.qml | 4 +- resources/qml/Governikus/Global/GRepeater.qml | 4 +- .../qml/Governikus/Global/GScrollBar.qml | 4 +- .../qml/Governikus/Global/GSeparator.qml | 4 +- resources/qml/Governikus/Global/GSpacer.qml | 4 +- resources/qml/Governikus/Global/GText.qml | 27 +- .../qml/Governikus/Global/GTextField.qml | 4 +- resources/qml/Governikus/Global/Hint.qml | 4 +- .../qml/Governikus/Global/LabeledText.qml | 4 +- .../qml/Governikus/Global/LocationButton.qml | 4 +- .../Governikus/Global/MoreInformationLink.qml | 32 +- .../qml/Governikus/Global/NumberField.qml | 11 +- resources/qml/Governikus/Global/PkiSwitch.qml | 4 +- .../Governikus/Global/PrivacyStatement.qml | 7 +- .../Global/ProxyCredentialsPopup.qml | 4 +- .../Governikus/Global/RoundedRectangle.qml | 4 +- .../qml/Governikus/Global/StatusIcon.qml | 4 +- .../qml/Governikus/Global/TintableIcon.qml | 6 +- resources/qml/Governikus/Global/Utils.qml | 6 +- resources/qml/Governikus/Global/qmldir | 3 +- .../HistoryRemovalTimePeriodControl.qml | 6 +- .../HistoryView/+desktop/HistoryView.qml | 6 +- .../+desktop/HistoryViewDetails.qml | 4 +- .../+android/HistoryListViewDelegate.qml | 4 +- .../+mobile/+android/HistoryView.qml | 4 +- .../+android/HistoryViewTitleBarControls.qml | 4 +- .../+mobile/+ios/HistoryListViewDelegate.qml | 4 +- .../HistoryView/+mobile/+ios/HistoryView.qml | 4 +- .../HistoryView/+mobile/BaseHistoryView.qml | 4 +- .../HistoryView/+mobile/HistoryListItem.qml | 4 +- .../+mobile/HistoryViewConfirmationPopup.qml | 4 +- .../+mobile/HistoryViewDetails.qml | 4 +- .../+desktop/DiagnosisView.qml | 4 +- .../+desktop/LicenseInformation.qml | 4 +- .../InformationView/+desktop/ReleaseNotes.qml | 4 +- .../+desktop/VersionInformation.qml | 4 +- .../+mobile/LicenseInformation.qml | 4 +- .../InformationView/+mobile/ReleaseNotes.qml | 4 +- .../+mobile/VersionInformation.qml | 4 +- .../InformationView/ReleaseNotesView.qml | 4 +- .../Governikus/MainView/+desktop/MainView.qml | 4 +- .../qml/Governikus/MainView/+desktop/Tile.qml | 7 +- .../MainView/+mobile/+phone/Tile.qml | 7 +- .../MainView/+mobile/+tablet/Tile.qml | 7 +- .../Governikus/MainView/+mobile/MainView.qml | 4 +- .../Governikus/MoreView/+desktop/MoreView.qml | 4 +- .../MoreView/+desktop/MoreViewDiagnosis.qml | 4 +- .../MoreView/+desktop/MoreViewGeneral.qml | 6 +- .../MoreView/+desktop/MoreViewMenuItem.qml | 4 +- .../Governikus/MoreView/+mobile/MoreView.qml | 4 +- .../Navigation/+mobile/Navigation.qml | 4 +- .../Navigation/+mobile/NavigationItem.qml | 4 +- .../Navigation/+mobile/NavigationView.qml | 4 +- .../+desktop/PasswordInfoView.qml | 153 ++++ .../+mobile/PasswordInfoView.qml | 118 ++++ .../PasswordInfoView/PasswordInfoContent.qml | 29 + .../PasswordInfoContentBlock.qml | 10 + .../PasswordInfoView/PasswordInfoData.qml | 322 +++++++++ .../PasswordInfoView/PasswordInfoImage.qml | 88 +++ .../qml/Governikus/PasswordInfoView/qmldir | 8 + .../ProgressView/+desktop/ProgressView.qml | 4 +- .../ProgressView/+mobile/ProgressView.qml | 4 +- .../+desktop/ProviderDetailButtonBar.qml | 4 +- .../+desktop/ProviderDetailHistory.qml | 4 +- .../+desktop/ProviderDetailHistoryItem.qml | 10 +- .../Provider/+desktop/ProviderDetailView.qml | 4 +- .../Provider/+desktop/ProviderInfoSection.qml | 4 +- .../+mobile/+phone/ProviderDetailView.qml | 4 +- .../+mobile/+phone/ProviderHeader.qml | 4 +- .../+tablet/ProviderDetailButtonBar.qml | 4 +- .../+mobile/+tablet/ProviderDetailHistory.qml | 4 +- .../+tablet/ProviderDetailHistoryInfo.qml | 4 +- .../+tablet/ProviderDetailHistoryItem.qml | 4 +- .../+mobile/+tablet/ProviderDetailView.qml | 4 +- .../+mobile/ProviderDetailDescription.qml | 4 +- .../Provider/+mobile/ProviderInfoSection.qml | 4 +- .../Provider/ProviderContactInfo.qml | 4 +- .../Provider/ProviderContactInfoItem.qml | 4 +- .../Governikus/Provider/ProviderModelItem.qml | 4 +- .../+desktop/ProviderOverview.qml | 9 +- .../ProviderView/+desktop/ProviderView.qml | 4 +- .../+mobile/+android/+phone/ProviderView.qml | 4 +- .../+mobile/+android/+tablet/ProviderView.qml | 4 +- .../+mobile/+ios/+phone/ProviderView.qml | 4 +- .../+mobile/+ios/+tablet/ProviderView.qml | 4 +- .../+mobile/+phone/AdditionalResultsItem.qml | 4 +- .../+mobile/+phone/BaseProviderView.qml | 4 +- .../+phone/ProviderListItemDelegate.qml | 4 +- .../+mobile/+tablet/BaseProviderView.qml | 4 +- .../+mobile/+tablet/CategoryCheckbox.qml | 4 +- .../AdditionalResultsFooterItem.qml | 4 +- .../Governikus/ProviderView/ProviderCard.qml | 4 +- .../ProviderView/ProviderGridView.qml | 4 +- .../+mobile/DevicesListDelegate.qml | 4 +- .../+mobile/LocalNetworkInfo.qml | 7 +- .../+mobile/RemoteServiceView.qml | 4 +- .../+mobile/RemoteServiceViewRemote.qml | 19 +- .../RemoteServiceView/LinkQuality.qml | 4 +- .../RemoteServiceController.qml | 26 +- .../RemoteServiceSettings.qml | 4 +- .../ResultView/+desktop/ResultView.qml | 4 +- .../ResultView/+mobile/ResultErrorView.qml | 8 +- .../ResultView/+mobile/ResultView.qml | 4 +- .../+desktop/SelfAuthenticationView.qml | 5 +- .../+mobile/SelfAuthenticationView.qml | 4 +- .../+desktop/CardReaderDelegate.qml | 11 +- .../SettingsView/+desktop/CardReaderView.qml | 4 +- .../SettingsView/+desktop/ConnectSacView.qml | 10 +- .../SettingsView/+desktop/DebugSettings.qml | 10 +- .../+desktop/DeveloperSettings.qml | 12 +- .../SettingsView/+desktop/GeneralSettings.qml | 16 +- .../+desktop/RemoteReaderDelegate.qml | 4 +- .../+desktop/RemoteReaderView.qml | 4 +- .../+desktop/SecurityAndPrivacySettings.qml | 19 +- .../SettingsView/+desktop/SettingsView.qml | 4 +- .../+desktop/TabbedReaderView.qml | 4 +- .../+mobile/LanguageSelectionPopup.qml | 4 +- .../ScreenOrientationSelectionPopup.qml | 4 +- .../SettingsView/+mobile/SettingsView.qml | 4 +- .../SettingsView/LanguageButtons.qml | 4 +- .../+mobile/PersonalizationController.qml | 26 +- .../PersonalizationLegalInformationView.qml | 4 +- .../+mobile/PersonalizationProgressView.qml | 4 +- .../+mobile/PersonalizationResultView.qml | 21 +- .../SmartView/+mobile/SmartCardView.qml | 4 +- .../+mobile/SmartDeleteStartView.qml | 4 +- .../SmartView/+mobile/SmartMainView.qml | 4 +- .../SmartView/+mobile/SmartSettingsView.qml | 4 +- .../SmartView/+mobile/SmartSetupStartView.qml | 4 +- .../+mobile/SmartUpdateStartView.qml | 6 +- .../SmartView/+mobile/SmartView.qml | 6 +- .../Style/+desktop/HighContrastColors.qml | 4 +- .../Style/+desktop/HighContrastDimensions.qml | 4 +- .../Style/+desktop/PlatformColors.qml | 4 +- .../Style/+desktop/PlatformDimensions.qml | 4 +- .../Style/+desktop/PlatformTextStyles.qml | 4 +- .../Style/+mobile/+android/BrandColors.qml | 4 +- .../+mobile/+android/BrandDimensions.qml | 4 +- .../+mobile/+android/PlatformTextStyles.qml | 27 +- .../Style/+mobile/+ios/BrandColors.qml | 4 +- .../Style/+mobile/+ios/BrandDimensions.qml | 4 +- .../Style/+mobile/+ios/PlatformTextStyles.qml | 27 +- .../Style/+mobile/HighContrastColors.qml | 4 +- .../Style/+mobile/HighContrastDimensions.qml | 4 +- .../Style/+mobile/PlatformColors.qml | 4 +- .../Style/+mobile/PlatformDimensions.qml | 4 +- resources/qml/Governikus/Style/Colors.qml | 4 +- resources/qml/Governikus/Style/Dimensions.qml | 4 +- resources/qml/Governikus/Style/Style.qml | 4 +- resources/qml/Governikus/Style/TextStyle.qml | 7 +- resources/qml/Governikus/Style/TextStyles.qml | 58 +- .../TechnologyInfo/+mobile/TechnologyInfo.qml | 4 +- .../+mobile/TechnologySwitch.qml | 4 +- .../+mobile/TechnologySwitchButton.qml | 4 +- .../TitleBar/+desktop/CancelAction.qml | 11 +- .../TitleBar/+desktop/Notifications.qml | 4 +- .../Governikus/TitleBar/+desktop/TitleBar.qml | 4 +- .../TitleBar/+desktop/TitleBarAction.qml | 8 +- .../TitleBar/+desktop/TitleBarButton.qml | 4 +- .../TitleBar/+desktop/TitleBarText.qml | 11 - .../TitleBar/+mobile/NavigationAction.qml | 4 +- .../Governikus/TitleBar/+mobile/TitleBar.qml | 7 +- .../TitleBar/+mobile/TitleBarAction.qml | 4 +- .../TitleBar/+mobile/TitleBarButton.qml | 4 +- .../TitleBar/+mobile/TitleBarNavigation.qml | 4 +- resources/qml/Governikus/TitleBar/qmldir | 1 - .../+desktop/SetupAssistantView.qml | 8 +- .../+desktop/TransportPinAssistantView.qml | 13 +- .../+mobile/TutorialCollapseAnimation.qml | 4 +- .../TutorialView/+mobile/TutorialContent.qml | 4 +- .../+mobile/TutorialExpandAnimation.qml | 4 +- .../TutorialView/+mobile/TutorialFooter.qml | 4 +- .../+mobile/TutorialFooterButton.qml | 4 +- .../TutorialView/+mobile/TutorialHeader.qml | 7 +- .../TutorialView/+mobile/TutorialHow.qml | 28 +- .../TutorialView/+mobile/TutorialImage.qml | 4 +- .../+mobile/TutorialImportant.qml | 13 +- .../+mobile/TutorialReaderMethodFooter.qml | 4 +- .../+mobile/TutorialReaderMethodNfc.qml | 25 +- .../TutorialReaderMethodSacDesktop.qml | 37 +- .../+mobile/TutorialReaderMethodSacMobile.qml | 34 +- .../+mobile/TutorialSeperator.qml | 4 +- .../+mobile/TutorialShowMenuPath.qml | 4 +- .../TutorialView/+mobile/TutorialSpacer.qml | 4 +- .../+mobile/TutorialStatusBar.qml | 4 +- .../TutorialView/+mobile/TutorialView.qml | 4 +- .../TutorialView/+mobile/TutorialWhat.qml | 19 +- .../TutorialView/+mobile/TutorialWhere.qml | 10 +- .../+mobile/TutorialZoomTriangle.qml | 4 +- .../UpdateView/+desktop/UpdateView.qml | 4 +- .../+desktop/UpdateViewButtonRow.qml | 4 +- .../+desktop/UpdateViewInformation.qml | 4 +- .../Governikus/View/+desktop/Controller.qml | 4 +- .../Governikus/View/+desktop/FocusFrame.qml | 4 +- .../Governikus/View/+desktop/FocusPoint.qml | 4 +- .../Governikus/View/+desktop/FramedImage.qml | 4 +- .../Governikus/View/+desktop/SectionPage.qml | 4 +- .../Governikus/View/+mobile/ContentArea.qml | 4 +- .../Governikus/View/+mobile/Controller.qml | 4 +- .../Governikus/View/+mobile/FocusFrame.qml | 4 +- .../Governikus/View/+mobile/FocusPoint.qml | 4 +- .../Governikus/View/+mobile/SectionPage.qml | 4 +- .../Governikus/View/+mobile/TabBarView.qml | 4 +- .../qml/Governikus/View/BaseController.qml | 4 +- .../+mobile/WhiteListSurveyView.qml | 4 +- .../Workflow/+desktop/GeneralWorkflow.qml | 48 +- .../Workflow/+desktop/ProgressCircle.qml | 4 +- .../Workflow/+desktop/TextCircle.qml | 7 +- .../Workflow/+mobile/BusyImageIndicator.qml | 4 +- .../Workflow/+mobile/CardReader.qml | 4 +- .../Workflow/+mobile/GeneralWorkflow.qml | 4 +- .../Workflow/+mobile/NfcProgressIndicator.qml | 4 +- .../Workflow/+mobile/NfcWorkflow.qml | 8 +- .../Workflow/+mobile/ProgressCircle.qml | 9 +- .../Workflow/+mobile/ProgressIndicator.qml | 4 +- .../Workflow/+mobile/RemoteWorkflow.qml | 4 +- .../Workflow/+mobile/SimulatorWorkflow.qml | 4 +- .../+mobile/SmartProgressIndicator.qml | 4 +- .../Workflow/+mobile/SmartWorkflow.qml | 4 +- .../Workflow/+mobile/TextCircle.qml | 6 +- .../qml/Governikus/Workflow/Workflow.qml | 4 +- resources/translations/ausweisapp2_de.ts | 665 +++++++++++------- resources/translations/ausweisapp2_ru.ts | 661 ++++++++++------- resources/translations/ausweisapp2_uk.ts | 661 ++++++++++------- .../reader/img_ACS_ACR122U.png | Bin 63534 -> 0 bytes .../reader/img_ACS_ACR122U_mit_ausweis.png | Bin 80982 -> 0 bytes .../reader/img_ACS_ACR1252U.png | Bin 105502 -> 0 bytes .../reader/img_ACS_ACR1252U_mit_ausweis.png | Bin 94980 -> 0 bytes .../img_HID_Omnikey_Mobile_Reader_4121_CL.png | Bin 31335 -> 0 bytes ...ikey_Mobile_Reader_4121_CL_mit_ausweis.png | Bin 54625 -> 0 bytes .../reader/img_Identive_SDI010.png | Bin 99211 -> 0 bytes .../img_Identive_SDI010_mit_ausweis.png | Bin 89339 -> 0 bytes .../updatable-files/supported-providers.json | 243 ++++++- .../updatable-files/supported-readers.json | 36 - src/android/AusweisApp2LocalIfdService.java | 4 +- .../AusweisApp2LocalIfdServiceConnection.java | 4 +- src/android/AusweisApp2Service.java | 4 +- src/android/LogHandler.java | 4 +- src/android/MainActivity.java | 4 +- src/android/UpdateReceiver.java | 4 +- src/autostart_helper/main.mm | 4 +- src/card/base/Card.cpp | 4 +- src/card/base/Card.h | 6 +- src/card/base/CardConnection.cpp | 4 +- src/card/base/CardConnection.h | 6 +- src/card/base/CardConnectionWorker.cpp | 4 +- src/card/base/CardConnectionWorker.h | 6 +- src/card/base/CardInfo.cpp | 6 +- src/card/base/CardInfo.h | 8 +- src/card/base/FileRef.cpp | 4 +- src/card/base/FileRef.h | 6 +- src/card/base/InputAPDUInfo.cpp | 4 +- src/card/base/InputAPDUInfo.h | 6 +- src/card/base/Reader.cpp | 4 +- src/card/base/Reader.h | 4 +- src/card/base/ReaderFilter.cpp | 4 +- src/card/base/ReaderFilter.h | 6 +- src/card/base/ReaderInfo.cpp | 4 +- src/card/base/ReaderInfo.h | 4 +- src/card/base/ReaderManager.cpp | 4 +- src/card/base/ReaderManager.h | 4 +- src/card/base/ReaderManagerPlugIn.cpp | 4 +- src/card/base/ReaderManagerPlugIn.h | 6 +- src/card/base/ReaderManagerPlugInInfo.cpp | 4 +- src/card/base/ReaderManagerPlugInInfo.h | 6 +- src/card/base/ReaderManagerWorker.cpp | 4 +- src/card/base/ReaderManagerWorker.h | 6 +- src/card/base/SecurityProtocol.cpp | 4 +- src/card/base/SecurityProtocol.h | 4 +- src/card/base/SmartCardDefinitions.cpp | 4 +- src/card/base/SmartCardDefinitions.h | 4 +- src/card/base/apdu/CommandApdu.cpp | 4 +- src/card/base/apdu/CommandApdu.h | 4 +- src/card/base/apdu/CommandData.cpp | 4 +- src/card/base/apdu/CommandData.h | 4 +- src/card/base/apdu/FileCommand.cpp | 4 +- src/card/base/apdu/FileCommand.h | 4 +- .../base/apdu/GeneralAuthenticateResponse.cpp | 4 +- .../base/apdu/GeneralAuthenticateResponse.h | 6 +- src/card/base/apdu/PacePinStatus.cpp | 4 +- src/card/base/apdu/PacePinStatus.h | 4 +- src/card/base/apdu/ResponseApdu.cpp | 4 +- src/card/base/apdu/ResponseApdu.h | 4 +- src/card/base/apdu/SecureMessagingApdu.cpp | 4 +- src/card/base/apdu/SecureMessagingApdu.h | 6 +- src/card/base/apdu/SecureMessagingCommand.cpp | 4 +- src/card/base/apdu/SecureMessagingCommand.h | 6 +- .../base/apdu/SecureMessagingResponse.cpp | 4 +- src/card/base/apdu/SecureMessagingResponse.h | 6 +- src/card/base/apdu/SecureMessagingTypes.cpp | 4 +- src/card/base/apdu/SecureMessagingTypes.h | 6 +- src/card/base/asn1/ASN1TemplateUtil.cpp | 4 +- src/card/base/asn1/ASN1TemplateUtil.h | 6 +- src/card/base/asn1/ASN1Util.cpp | 4 +- src/card/base/asn1/ASN1Util.h | 6 +- src/card/base/asn1/AccessRoleAndRight.cpp | 4 +- src/card/base/asn1/AccessRoleAndRight.h | 6 +- src/card/base/asn1/ApplicationTemplate.cpp | 4 +- src/card/base/asn1/ApplicationTemplate.h | 6 +- src/card/base/asn1/ApplicationTemplates.cpp | 4 +- src/card/base/asn1/ApplicationTemplates.h | 6 +- .../base/asn1/AuthenticatedAuxiliaryData.cpp | 4 +- .../base/asn1/AuthenticatedAuxiliaryData.h | 6 +- src/card/base/asn1/CVCertificate.cpp | 4 +- src/card/base/asn1/CVCertificate.h | 6 +- src/card/base/asn1/CVCertificateBody.cpp | 4 +- src/card/base/asn1/CVCertificateBody.h | 4 +- src/card/base/asn1/CVCertificateChain.cpp | 4 +- src/card/base/asn1/CVCertificateChain.h | 6 +- .../base/asn1/CVCertificateChainBuilder.cpp | 4 +- .../base/asn1/CVCertificateChainBuilder.h | 6 +- src/card/base/asn1/CertificateDescription.cpp | 4 +- src/card/base/asn1/CertificateDescription.h | 6 +- src/card/base/asn1/ChainBuilder.h | 6 +- src/card/base/asn1/Chat.cpp | 4 +- src/card/base/asn1/Chat.h | 6 +- src/card/base/asn1/ChipAuthenticationInfo.cpp | 4 +- src/card/base/asn1/ChipAuthenticationInfo.h | 6 +- src/card/base/asn1/EFCardSecurity.cpp | 4 +- src/card/base/asn1/EFCardSecurity.h | 6 +- src/card/base/asn1/EcdsaPublicKey.cpp | 4 +- src/card/base/asn1/EcdsaPublicKey.h | 4 +- src/card/base/asn1/MobileEIDTypeInfo.cpp | 4 +- src/card/base/asn1/MobileEIDTypeInfo.h | 6 +- src/card/base/asn1/Oid.cpp | 4 +- src/card/base/asn1/Oid.h | 6 +- src/card/base/asn1/PaceInfo.cpp | 4 +- src/card/base/asn1/PaceInfo.h | 6 +- src/card/base/asn1/SecurityInfo.cpp | 4 +- src/card/base/asn1/SecurityInfo.h | 6 +- src/card/base/asn1/SecurityInfos.cpp | 4 +- src/card/base/asn1/SecurityInfos.h | 6 +- src/card/base/asn1/SignatureChecker.cpp | 4 +- src/card/base/asn1/SignatureChecker.h | 4 +- src/card/base/command/BaseCardCommand.cpp | 4 +- src/card/base/command/BaseCardCommand.h | 6 +- .../command/CreateCardConnectionCommand.cpp | 4 +- .../command/CreateCardConnectionCommand.h | 6 +- .../command/DestroyPaceChannelCommand.cpp | 4 +- .../base/command/DestroyPaceChannelCommand.h | 6 +- .../command/DidAuthenticateEAC1Command.cpp | 4 +- .../base/command/DidAuthenticateEAC1Command.h | 6 +- .../command/DidAuthenticateEAC2Command.cpp | 4 +- .../base/command/DidAuthenticateEAC2Command.h | 6 +- .../command/EstablishPaceChannelCommand.cpp | 4 +- .../command/EstablishPaceChannelCommand.h | 6 +- src/card/base/command/ExecuteCommand.cpp | 4 +- src/card/base/command/ExecuteCommand.h | 6 +- src/card/base/command/SetEidPinCommand.cpp | 4 +- src/card/base/command/SetEidPinCommand.h | 6 +- src/card/base/command/TransmitCommand.cpp | 4 +- src/card/base/command/TransmitCommand.h | 6 +- .../command/UpdateRetryCounterCommand.cpp | 4 +- .../base/command/UpdateRetryCounterCommand.h | 6 +- src/card/base/pace/CipherMac.cpp | 4 +- src/card/base/pace/CipherMac.h | 6 +- .../base/pace/EstablishPaceChannelCode.cpp | 4 +- src/card/base/pace/EstablishPaceChannelCode.h | 6 +- src/card/base/pace/KeyAgreement.cpp | 4 +- src/card/base/pace/KeyAgreement.h | 6 +- src/card/base/pace/KeyDerivationFunction.cpp | 4 +- src/card/base/pace/KeyDerivationFunction.h | 6 +- src/card/base/pace/PaceHandler.cpp | 4 +- src/card/base/pace/PaceHandler.h | 6 +- src/card/base/pace/SecureMessaging.cpp | 4 +- src/card/base/pace/SecureMessaging.h | 6 +- src/card/base/pace/SymmetricCipher.cpp | 4 +- src/card/base/pace/SymmetricCipher.h | 6 +- src/card/base/pace/ec/EcUtil.cpp | 4 +- src/card/base/pace/ec/EcUtil.h | 6 +- src/card/base/pace/ec/EcdhGenericMapping.cpp | 4 +- src/card/base/pace/ec/EcdhGenericMapping.h | 4 +- src/card/base/pace/ec/EcdhKeyAgreement.cpp | 4 +- src/card/base/pace/ec/EcdhKeyAgreement.h | 4 +- .../base/pinpad/DestroyPaceChannelBuilder.cpp | 4 +- .../base/pinpad/DestroyPaceChannelBuilder.h | 6 +- src/card/base/pinpad/EstablishPaceChannel.cpp | 4 +- src/card/base/pinpad/EstablishPaceChannel.h | 6 +- .../pinpad/EstablishPaceChannelOutput.cpp | 4 +- .../base/pinpad/EstablishPaceChannelOutput.h | 6 +- src/card/base/pinpad/LengthValue.h | 6 +- src/card/base/pinpad/PinModify.cpp | 4 +- src/card/base/pinpad/PinModify.h | 4 +- src/card/base/pinpad/PinModifyOutput.cpp | 4 +- src/card/base/pinpad/PinModifyOutput.h | 4 +- src/card/drivers/DeviceListener.cpp | 4 +- src/card/drivers/DeviceListener.h | 4 +- src/card/drivers/ReaderDetector.cpp | 4 +- src/card/drivers/ReaderDetector.h | 6 +- src/card/drivers/ReaderDetector_generic.cpp | 4 +- src/card/drivers/ReaderDetector_linux.cpp | 4 +- src/card/drivers/ReaderDetector_osx.cpp | 4 +- src/card/drivers/ReaderDetector_win.cpp | 4 +- src/card/nfc/NfcCard.cpp | 4 +- src/card/nfc/NfcCard.h | 6 +- src/card/nfc/NfcReader.cpp | 10 +- src/card/nfc/NfcReader.h | 6 +- src/card/nfc/NfcReaderManagerPlugIn.cpp | 4 +- src/card/nfc/NfcReaderManagerPlugIn.h | 6 +- src/card/pcsc/PcscCard.cpp | 4 +- src/card/pcsc/PcscCard.h | 5 +- src/card/pcsc/PcscReader.cpp | 4 +- src/card/pcsc/PcscReader.h | 6 +- src/card/pcsc/PcscReaderFeature.cpp | 4 +- src/card/pcsc/PcscReaderFeature.h | 4 +- src/card/pcsc/PcscReaderManagerPlugIn.cpp | 4 +- src/card/pcsc/PcscReaderManagerPlugIn.h | 6 +- src/card/pcsc/PcscUtils.cpp | 4 +- src/card/pcsc/PcscUtils.h | 6 +- src/card/simulator/SimulatorCard.cpp | 4 +- src/card/simulator/SimulatorCard.h | 6 +- src/card/simulator/SimulatorFileSystem.cpp | 4 +- src/card/simulator/SimulatorFileSystem.h | 6 +- src/card/simulator/SimulatorReader.cpp | 4 +- src/card/simulator/SimulatorReader.h | 6 +- .../SimulatorReaderManagerPlugIn.cpp | 4 +- .../simulator/SimulatorReaderManagerPlugIn.h | 6 +- src/card/smart/SmartCard.cpp | 4 +- src/card/smart/SmartCard.h | 6 +- src/card/smart/SmartManager.cpp | 4 +- src/card/smart/SmartManager.h | 6 +- src/card/smart/SmartReader.cpp | 4 +- src/card/smart/SmartReader.h | 6 +- src/card/smart/SmartReaderManagerPlugIn.cpp | 4 +- src/card/smart/SmartReaderManagerPlugIn.h | 6 +- src/configuration/CallCost.cpp | 4 +- src/configuration/CallCost.h | 6 +- src/configuration/LanguageString.cpp | 4 +- src/configuration/LanguageString.h | 4 +- src/configuration/ProviderConfiguration.cpp | 4 +- src/configuration/ProviderConfiguration.h | 6 +- .../ProviderConfigurationInfo.cpp | 4 +- src/configuration/ProviderConfigurationInfo.h | 6 +- .../ProviderConfigurationParser.cpp | 4 +- .../ProviderConfigurationParser.h | 6 +- src/configuration/ReaderConfiguration.cpp | 4 +- src/configuration/ReaderConfiguration.h | 6 +- src/configuration/ReaderConfigurationInfo.cpp | 4 +- src/configuration/ReaderConfigurationInfo.h | 6 +- .../ReaderConfigurationParser.cpp | 4 +- src/configuration/ReaderConfigurationParser.h | 6 +- src/configuration/ReleaseInformation.cpp | 4 +- src/configuration/ReleaseInformation.h | 6 +- .../ReleaseInformationConfiguration.cpp | 4 +- .../ReleaseInformationConfiguration.h | 6 +- src/core/controller/AppController.cpp | 8 +- src/core/controller/AppController.h | 6 +- src/diagnosis/ContentItem.h | 18 +- src/diagnosis/DiagnosisAntivirusDetection.cpp | 4 +- src/diagnosis/DiagnosisAntivirusDetection.h | 6 +- src/diagnosis/DiagnosisConnectionTest.cpp | 4 +- src/diagnosis/DiagnosisConnectionTest.h | 6 +- src/diagnosis/DiagnosisFirewallDetection.cpp | 9 +- src/diagnosis/DiagnosisFirewallDetection.h | 4 +- src/diagnosis/DiagnosisModel.cpp | 350 +++++---- src/diagnosis/DiagnosisModel.h | 65 +- src/diagnosis/SectionModel.cpp | 88 +-- src/diagnosis/SectionModel.h | 15 +- src/diagnosis/SelfDiagnosisModel.cpp | 8 +- src/diagnosis/SelfDiagnosisModel.h | 4 +- src/diagnosis/context/DiagnosisContext.cpp | 4 +- src/diagnosis/context/DiagnosisContext.h | 6 +- .../controller/DiagnosisController.cpp | 4 +- .../controller/DiagnosisController.h | 6 +- .../DiagnosisController_generic.cpp | 6 +- .../controller/DiagnosisController_osx.mm | 6 +- .../controller/DiagnosisController_win.cpp | 6 +- src/export/PdfCreator.cpp | 4 +- src/export/PdfCreator.h | 6 +- src/export/PdfExporter.cpp | 4 +- src/export/PdfExporter.h | 6 +- .../smart/mock/eid_applet_interface_mock.cpp | 2 +- .../smart/mock/eid_applet_interface_mock.h | 2 +- src/file_provider/Downloader.cpp | 4 +- src/file_provider/Downloader.h | 6 +- src/file_provider/FileProvider.cpp | 4 +- src/file_provider/FileProvider.h | 6 +- src/file_provider/UpdatableFile.cpp | 4 +- src/file_provider/UpdatableFile.h | 6 +- src/global/BuildHelper.cpp | 4 +- src/global/BuildHelper.h | 6 +- src/global/CardReturnCode.cpp | 4 +- src/global/CardReturnCode.h | 6 +- src/global/DeviceInfo.cpp | 4 +- src/global/DeviceInfo.h | 6 +- src/global/ECardApiResult.cpp | 41 +- src/global/ECardApiResult.h | 23 +- src/global/EnumHelper.h | 6 +- src/global/Env.cpp | 4 +- src/global/Env.h | 10 +- src/global/FailureCode.cpp | 99 +++ src/global/FailureCode.h | 186 +++++ src/global/FileDestination.h | 6 +- src/global/FuncUtils.h | 6 +- src/global/GlobalStatus.cpp | 10 +- src/global/GlobalStatus.h | 6 +- src/global/Initializer.h | 6 +- src/global/JsonValueRef.h | 6 +- src/global/LanguageLoader.cpp | 4 +- src/global/LanguageLoader.h | 6 +- src/global/LogCategories.cpp | 5 +- src/global/LogHandler.cpp | 4 +- src/global/LogHandler.h | 6 +- src/global/Randomizer.cpp | 4 +- src/global/Randomizer.h | 6 +- src/global/ResourceLoader.cpp | 4 +- src/global/ResourceLoader.h | 6 +- src/global/SingletonHelper.h | 6 +- src/global/UsbId.cpp | 4 +- src/global/UsbId.h | 4 +- src/global/VersionInfo.cpp | 4 +- src/global/VersionInfo.h | 4 +- src/global/VersionNumber.cpp | 4 +- src/global/VersionNumber.h | 6 +- src/ifd/base/ConnectRequest.cpp | 4 +- src/ifd/base/ConnectRequest.h | 4 +- src/ifd/base/DataChannel.cpp | 4 +- src/ifd/base/DataChannel.h | 6 +- src/ifd/base/IfdCard.cpp | 4 +- src/ifd/base/IfdCard.h | 6 +- src/ifd/base/IfdClient.cpp | 4 +- src/ifd/base/IfdClient.h | 6 +- src/ifd/base/IfdClientImpl.cpp | 4 +- src/ifd/base/IfdClientImpl.h | 4 +- src/ifd/base/IfdConnector.cpp | 4 +- src/ifd/base/IfdConnector.h | 6 +- src/ifd/base/IfdConnectorImpl.cpp | 4 +- src/ifd/base/IfdConnectorImpl.h | 6 +- src/ifd/base/IfdDescriptor.cpp | 4 +- src/ifd/base/IfdDescriptor.h | 6 +- src/ifd/base/IfdDispatcher.cpp | 4 +- src/ifd/base/IfdDispatcher.h | 6 +- src/ifd/base/IfdDispatcherClient.cpp | 4 +- src/ifd/base/IfdDispatcherClient.h | 6 +- src/ifd/base/IfdDispatcherServer.cpp | 4 +- src/ifd/base/IfdDispatcherServer.h | 6 +- src/ifd/base/IfdList.cpp | 4 +- src/ifd/base/IfdList.h | 6 +- src/ifd/base/IfdReader.cpp | 4 +- src/ifd/base/IfdReader.h | 6 +- src/ifd/base/IfdReaderManagerPlugIn.cpp | 4 +- src/ifd/base/IfdReaderManagerPlugIn.h | 4 +- src/ifd/base/IfdServer.cpp | 4 +- src/ifd/base/IfdServer.h | 6 +- src/ifd/base/ServerMessageHandler.cpp | 4 +- src/ifd/base/ServerMessageHandler.h | 6 +- src/ifd/base/ServerMessageHandlerImpl.cpp | 4 +- src/ifd/base/ServerMessageHandlerImpl.h | 6 +- src/ifd/base/TlsServer.cpp | 4 +- src/ifd/base/TlsServer.h | 6 +- src/ifd/base/WebSocketChannel.cpp | 4 +- src/ifd/base/WebSocketChannel.h | 6 +- src/ifd/base/WebSocketServer.cpp | 4 +- src/ifd/base/WebSocketServer.h | 6 +- src/ifd/base/WebSocketServerImpl.cpp | 4 +- src/ifd/base/WebSocketServerImpl.h | 6 +- src/ifd/base/messages/Discovery.cpp | 8 +- src/ifd/base/messages/Discovery.h | 6 +- src/ifd/base/messages/IfdConnect.cpp | 4 +- src/ifd/base/messages/IfdConnect.h | 4 +- src/ifd/base/messages/IfdConnectResponse.cpp | 4 +- src/ifd/base/messages/IfdConnectResponse.h | 4 +- src/ifd/base/messages/IfdDisconnect.cpp | 4 +- src/ifd/base/messages/IfdDisconnect.h | 4 +- .../base/messages/IfdDisconnectResponse.cpp | 4 +- src/ifd/base/messages/IfdDisconnectResponse.h | 4 +- src/ifd/base/messages/IfdError.cpp | 4 +- src/ifd/base/messages/IfdError.h | 4 +- src/ifd/base/messages/IfdEstablishContext.cpp | 4 +- src/ifd/base/messages/IfdEstablishContext.h | 4 +- .../messages/IfdEstablishContextResponse.cpp | 4 +- .../messages/IfdEstablishContextResponse.h | 4 +- .../base/messages/IfdEstablishPaceChannel.cpp | 4 +- .../base/messages/IfdEstablishPaceChannel.h | 4 +- .../IfdEstablishPaceChannelResponse.cpp | 4 +- .../IfdEstablishPaceChannelResponse.h | 4 +- src/ifd/base/messages/IfdGetStatus.cpp | 4 +- src/ifd/base/messages/IfdGetStatus.h | 4 +- src/ifd/base/messages/IfdMessage.cpp | 4 +- src/ifd/base/messages/IfdMessage.h | 4 +- src/ifd/base/messages/IfdMessageResponse.cpp | 4 +- src/ifd/base/messages/IfdMessageResponse.h | 4 +- src/ifd/base/messages/IfdModifyPin.cpp | 4 +- src/ifd/base/messages/IfdModifyPin.h | 4 +- .../base/messages/IfdModifyPinResponse.cpp | 4 +- src/ifd/base/messages/IfdModifyPinResponse.h | 4 +- src/ifd/base/messages/IfdStatus.cpp | 4 +- src/ifd/base/messages/IfdStatus.h | 4 +- src/ifd/base/messages/IfdTransmit.cpp | 4 +- src/ifd/base/messages/IfdTransmit.h | 4 +- src/ifd/base/messages/IfdTransmitResponse.cpp | 4 +- src/ifd/base/messages/IfdTransmitResponse.h | 4 +- src/ifd/base/messages/IfdVersion.cpp | 4 +- src/ifd/base/messages/IfdVersion.h | 4 +- src/ifd/local/LocalIfdClient.cpp | 4 +- src/ifd/local/LocalIfdClient.h | 4 +- src/ifd/local/LocalIfdReaderManagerPlugIn.cpp | 4 +- src/ifd/local/LocalIfdReaderManagerPlugIn.h | 4 +- src/ifd/local/LocalIfdServer.cpp | 4 +- src/ifd/local/LocalIfdServer.h | 6 +- src/ifd/local/LocalTlsServer.cpp | 4 +- src/ifd/local/LocalTlsServer.h | 6 +- src/ifd/local/LocalWebSocketServer.cpp | 4 +- src/ifd/local/LocalWebSocketServer.h | 6 +- src/ifd/local/LocalWebSocketServerImpl.cpp | 4 +- src/ifd/local/LocalWebSocketServerImpl.h | 6 +- src/ifd/remote/RemoteIfdClient.cpp | 4 +- src/ifd/remote/RemoteIfdClient.h | 6 +- .../remote/RemoteIfdReaderManagerPlugIn.cpp | 4 +- src/ifd/remote/RemoteIfdReaderManagerPlugIn.h | 6 +- src/ifd/remote/RemoteIfdServer.cpp | 4 +- src/ifd/remote/RemoteIfdServer.h | 6 +- src/ifd/remote/RemoteReaderAdvertiser.cpp | 23 +- src/ifd/remote/RemoteReaderAdvertiser.h | 9 +- src/ifd/remote/RemoteTlsServer.cpp | 4 +- src/ifd/remote/RemoteTlsServer.h | 6 +- src/ifd/remote/RemoteWebSocketServer.cpp | 4 +- src/ifd/remote/RemoteWebSocketServer.h | 6 +- src/ifd/remote/RemoteWebSocketServerImpl.cpp | 4 +- src/ifd/remote/RemoteWebSocketServerImpl.h | 6 +- src/init/Bootstrap.cpp | 4 +- src/init/Bootstrap.h | 4 +- src/init/CommandLineParser.cpp | 4 +- src/init/CommandLineParser.h | 6 +- src/init/SignalHandler.cpp | 9 +- src/init/SignalHandler.h | 10 +- src/init/SignalHandler_bsd_linux_osx.cpp | 4 +- src/init/SignalHandler_win.cpp | 4 +- src/main.cpp | 4 +- src/network/DatagramHandler.cpp | 4 +- src/network/DatagramHandler.h | 6 +- src/network/DatagramHandlerImpl.cpp | 4 +- src/network/DatagramHandlerImpl.h | 6 +- src/network/HttpHandler.cpp | 4 +- src/network/HttpHandler.h | 4 +- src/network/HttpRequest.cpp | 4 +- src/network/HttpRequest.h | 6 +- src/network/HttpResponse.cpp | 4 +- src/network/HttpResponse.h | 6 +- src/network/HttpServer.cpp | 13 +- src/network/HttpServer.h | 9 +- src/network/HttpServerRequestor.cpp | 4 +- src/network/HttpServerRequestor.h | 6 +- src/network/HttpServerStatusParser.cpp | 4 +- src/network/HttpServerStatusParser.h | 6 +- src/network/MulticastLock.cpp | 4 +- src/network/MulticastLock.h | 4 +- src/network/MulticastLockJniBridgeUtil.java | 4 +- src/network/NetworkManager.cpp | 4 +- src/network/NetworkManager.h | 6 +- src/network/NetworkReplyError.cpp | 4 +- src/network/NetworkReplyError.h | 4 +- src/network/NetworkReplyTimeout.cpp | 4 +- src/network/NetworkReplyTimeout.h | 6 +- src/network/PortFile.cpp | 10 +- src/network/PortFile.h | 5 +- src/network/Template.cpp | 4 +- src/network/Template.h | 6 +- src/network/TlsChecker.cpp | 15 +- src/network/TlsChecker.h | 7 +- src/network/UrlUtil.cpp | 4 +- src/network/UrlUtil.h | 7 +- src/network/WifiInfo.cpp | 4 +- src/network/WifiInfo.h | 6 +- src/network/WifiInfo.java | 4 +- src/network/WifiInfo_android.cpp | 4 +- src/network/WifiInfo_generic.cpp | 4 +- src/network/WifiInfo_ios.mm | 4 +- src/secure_storage/SecureStorage.cpp | 4 +- src/secure_storage/SecureStorage.h | 6 +- src/secure_storage/TlsConfiguration.cpp | 4 +- src/secure_storage/TlsConfiguration.h | 6 +- src/services/AppUpdateData.cpp | 4 +- src/services/AppUpdateData.h | 6 +- src/services/AppUpdater.cpp | 4 +- src/services/AppUpdater.h | 4 +- src/services/Service.cpp | 4 +- src/services/Service.h | 4 +- src/settings/AbstractSettings.cpp | 4 +- src/settings/AbstractSettings.h | 4 +- src/settings/AppSettings.cpp | 4 +- src/settings/AppSettings.h | 6 +- src/settings/AutoStart.cpp | 4 +- src/settings/AutoStart.h | 4 +- src/settings/AutoStart_generic.cpp | 4 +- src/settings/AutoStart_osx.mm | 4 +- src/settings/AutoStart_win.cpp | 4 +- src/settings/Backup.h | 4 +- src/settings/Backup_generic.cpp | 4 +- src/settings/Backup_ios_osx.mm | 4 +- src/settings/GeneralSettings.cpp | 6 +- src/settings/GeneralSettings.h | 6 +- src/settings/HistoryInfo.cpp | 4 +- src/settings/HistoryInfo.h | 6 +- src/settings/HistorySettings.cpp | 4 +- src/settings/HistorySettings.h | 6 +- src/settings/KeyPair.cpp | 4 +- src/settings/KeyPair.h | 6 +- src/settings/PreVerificationSettings.cpp | 4 +- src/settings/PreVerificationSettings.h | 6 +- src/settings/RemoteServiceSettings.cpp | 4 +- src/settings/RemoteServiceSettings.h | 6 +- src/settings/VolatileSettings.cpp | 4 +- src/settings/VolatileSettings.h | 6 +- src/ui/aidl/AidlBinder.java | 4 +- src/ui/aidl/UIPlugInAidl.cpp | 4 +- src/ui/aidl/UIPlugInAidl.h | 6 +- src/ui/automatic/UIPlugInAutomatic.cpp | 13 +- src/ui/automatic/UIPlugInAutomatic.h | 7 +- src/ui/base/UILoader.cpp | 15 +- src/ui/base/UILoader.h | 6 +- src/ui/base/UIPlugIn.cpp | 4 +- src/ui/base/UIPlugIn.h | 6 +- src/ui/functional/AusweisApp2.cpp | 4 +- src/ui/functional/AusweisApp2.h | 4 +- src/ui/functional/AusweisApp2_p.h | 4 +- src/ui/functional/UIPlugInFunctional.cpp | 4 +- src/ui/functional/UIPlugInFunctional.h | 6 +- src/ui/json/MessageDispatcher.cpp | 4 +- src/ui/json/MessageDispatcher.h | 6 +- src/ui/json/UIPlugInJson.cpp | 4 +- src/ui/json/UIPlugInJson.h | 6 +- src/ui/json/messages/Msg.cpp | 4 +- src/ui/json/messages/Msg.h | 6 +- src/ui/json/messages/MsgContext.cpp | 4 +- src/ui/json/messages/MsgContext.h | 6 +- src/ui/json/messages/MsgHandler.cpp | 4 +- src/ui/json/messages/MsgHandler.h | 6 +- .../json/messages/MsgHandlerAccessRights.cpp | 4 +- src/ui/json/messages/MsgHandlerAccessRights.h | 6 +- src/ui/json/messages/MsgHandlerApiLevel.cpp | 4 +- src/ui/json/messages/MsgHandlerApiLevel.h | 6 +- src/ui/json/messages/MsgHandlerAuth.cpp | 6 +- src/ui/json/messages/MsgHandlerAuth.h | 6 +- src/ui/json/messages/MsgHandlerBadState.cpp | 4 +- src/ui/json/messages/MsgHandlerBadState.h | 6 +- .../json/messages/MsgHandlerCertificate.cpp | 4 +- src/ui/json/messages/MsgHandlerCertificate.h | 6 +- src/ui/json/messages/MsgHandlerChangePin.cpp | 4 +- src/ui/json/messages/MsgHandlerChangePin.h | 6 +- src/ui/json/messages/MsgHandlerEnterCan.cpp | 4 +- src/ui/json/messages/MsgHandlerEnterCan.h | 6 +- .../json/messages/MsgHandlerEnterNewPin.cpp | 4 +- src/ui/json/messages/MsgHandlerEnterNewPin.h | 6 +- .../json/messages/MsgHandlerEnterNumber.cpp | 4 +- src/ui/json/messages/MsgHandlerEnterNumber.h | 6 +- src/ui/json/messages/MsgHandlerEnterPin.cpp | 4 +- src/ui/json/messages/MsgHandlerEnterPin.h | 6 +- src/ui/json/messages/MsgHandlerEnterPuk.cpp | 4 +- src/ui/json/messages/MsgHandlerEnterPuk.h | 6 +- src/ui/json/messages/MsgHandlerInfo.cpp | 4 +- src/ui/json/messages/MsgHandlerInfo.h | 6 +- src/ui/json/messages/MsgHandlerInsertCard.cpp | 4 +- src/ui/json/messages/MsgHandlerInsertCard.h | 6 +- .../json/messages/MsgHandlerInternalError.cpp | 4 +- .../json/messages/MsgHandlerInternalError.h | 6 +- src/ui/json/messages/MsgHandlerInvalid.cpp | 4 +- src/ui/json/messages/MsgHandlerInvalid.h | 6 +- src/ui/json/messages/MsgHandlerLog.cpp | 4 +- src/ui/json/messages/MsgHandlerLog.h | 6 +- .../messages/MsgHandlerPersonalization.cpp | 4 +- .../json/messages/MsgHandlerPersonalization.h | 6 +- src/ui/json/messages/MsgHandlerReader.cpp | 4 +- src/ui/json/messages/MsgHandlerReader.h | 6 +- src/ui/json/messages/MsgHandlerReaderList.cpp | 4 +- src/ui/json/messages/MsgHandlerReaderList.h | 6 +- src/ui/json/messages/MsgHandlerStatus.cpp | 4 +- src/ui/json/messages/MsgHandlerStatus.h | 6 +- .../messages/MsgHandlerUnknownCommand.cpp | 4 +- .../json/messages/MsgHandlerUnknownCommand.h | 6 +- src/ui/json/messages/MsgHandlerWorkflows.cpp | 4 +- src/ui/json/messages/MsgHandlerWorkflows.h | 6 +- src/ui/json/messages/MsgTypes.cpp | 4 +- src/ui/json/messages/MsgTypes.h | 6 +- src/ui/local_ifd/UIPlugInLocalIfd.cpp | 4 +- src/ui/local_ifd/UIPlugInLocalIfd.h | 4 +- src/ui/proxy/PortWrapper.h | 4 +- src/ui/proxy/PortWrapper_generic.cpp | 4 +- src/ui/proxy/PortWrapper_win.cpp | 4 +- src/ui/proxy/RedirectRequest.cpp | 4 +- src/ui/proxy/RedirectRequest.h | 4 +- src/ui/proxy/UIPlugInProxy.cpp | 4 +- src/ui/proxy/UIPlugInProxy.h | 6 +- src/ui/qml/AppUpdateDataModel.cpp | 4 +- src/ui/qml/AppUpdateDataModel.h | 4 +- src/ui/qml/ApplicationModel.cpp | 4 +- src/ui/qml/ApplicationModel.h | 6 +- src/ui/qml/ApplicationModel_android.cpp | 4 +- src/ui/qml/ApplicationModel_generic.cpp | 4 +- src/ui/qml/ApplicationModel_ios.mm | 4 +- src/ui/qml/AuthModel.cpp | 32 +- src/ui/qml/AuthModel.h | 7 +- src/ui/qml/CardPosition.cpp | 4 +- src/ui/qml/CardPosition.h | 6 +- src/ui/qml/CardPositionModel.cpp | 4 +- src/ui/qml/CardPositionModel.h | 6 +- src/ui/qml/CertificateDescriptionModel.cpp | 4 +- src/ui/qml/CertificateDescriptionModel.h | 6 +- src/ui/qml/ChangePinModel.cpp | 4 +- src/ui/qml/ChangePinModel.h | 6 +- src/ui/qml/ChatModel.cpp | 6 +- src/ui/qml/ChatModel.h | 6 +- src/ui/qml/CheckIDCardModel.cpp | 4 +- src/ui/qml/CheckIDCardModel.h | 6 +- src/ui/qml/ConnectivityManager.cpp | 4 +- src/ui/qml/ConnectivityManager.h | 6 +- src/ui/qml/Email.cpp | 4 +- src/ui/qml/Email.h | 4 +- src/ui/qml/FormattedTextModel.cpp | 4 +- src/ui/qml/FormattedTextModel.h | 6 +- src/ui/qml/HelpAction.cpp | 4 +- src/ui/qml/HelpAction.h | 6 +- src/ui/qml/HistoryModel.cpp | 6 +- src/ui/qml/HistoryModel.h | 6 +- src/ui/qml/HistoryModelSearchFilter.cpp | 4 +- src/ui/qml/HistoryModelSearchFilter.h | 6 +- src/ui/qml/HistoryProxyModel.cpp | 4 +- src/ui/qml/HistoryProxyModel.h | 4 +- src/ui/qml/LogFilterModel.cpp | 4 +- src/ui/qml/LogFilterModel.h | 4 +- src/ui/qml/LogModel.cpp | 4 +- src/ui/qml/LogModel.h | 4 +- src/ui/qml/LogModel_android.cpp | 4 +- src/ui/qml/LogModel_generic.cpp | 4 +- src/ui/qml/LogModel_ios.mm | 4 +- src/ui/qml/NotificationModel.cpp | 4 +- src/ui/qml/NotificationModel.h | 4 +- src/ui/qml/NumberModel.cpp | 10 +- src/ui/qml/NumberModel.h | 8 +- src/ui/qml/PersonalizationModel.cpp | 4 +- src/ui/qml/PersonalizationModel.h | 6 +- src/ui/qml/PinResetInformationModel.cpp | 94 +-- src/ui/qml/PinResetInformationModel.h | 18 +- src/ui/qml/PlatformTools.h | 4 +- src/ui/qml/PlatformTools_generic.cpp | 4 +- src/ui/qml/PlatformTools_osx.mm | 4 +- src/ui/qml/ProviderCategoryFilterModel.cpp | 4 +- src/ui/qml/ProviderCategoryFilterModel.h | 6 +- src/ui/qml/ProviderModel.cpp | 4 +- src/ui/qml/ProviderModel.h | 6 +- src/ui/qml/ProviderNameFilterModel.cpp | 4 +- src/ui/qml/ProviderNameFilterModel.h | 4 +- src/ui/qml/ProxyCredentials.cpp | 4 +- src/ui/qml/ProxyCredentials.h | 4 +- src/ui/qml/ReaderModel.cpp | 4 +- src/ui/qml/ReaderModel.h | 6 +- src/ui/qml/ReaderScanEnabler.cpp | 4 +- src/ui/qml/ReaderScanEnabler.h | 4 +- src/ui/qml/ReleaseInformationModel.cpp | 4 +- src/ui/qml/ReleaseInformationModel.h | 6 +- src/ui/qml/RemoteDeviceModel.cpp | 4 +- src/ui/qml/RemoteDeviceModel.h | 6 +- src/ui/qml/RemoteServiceModel.cpp | 4 +- src/ui/qml/RemoteServiceModel.h | 6 +- src/ui/qml/SelfAuthModel.cpp | 4 +- src/ui/qml/SelfAuthModel.h | 6 +- src/ui/qml/SettingsModel.cpp | 4 +- src/ui/qml/SettingsModel.h | 6 +- src/ui/qml/ShareUtil.java | 4 +- src/ui/qml/SmartModel.cpp | 4 +- src/ui/qml/SmartModel.h | 6 +- src/ui/qml/SortedReaderModel.cpp | 4 +- src/ui/qml/SortedReaderModel.h | 4 +- src/ui/qml/TrayIcon.cpp | 4 +- src/ui/qml/TrayIcon.h | 4 +- src/ui/qml/UIPlugInQml.cpp | 4 +- src/ui/qml/UIPlugInQml.h | 6 +- src/ui/qml/UIPlugInQml_ios.mm | 4 +- src/ui/qml/UIPlugInQml_osx.mm | 4 +- src/ui/qml/VersionInformationModel.cpp | 6 +- src/ui/qml/VersionInformationModel.h | 4 +- src/ui/qml/WorkflowModel.cpp | 11 +- src/ui/qml/WorkflowModel.h | 6 +- .../scheme/CustomSchemeActivationContext.cpp | 4 +- src/ui/scheme/CustomSchemeActivationContext.h | 4 +- src/ui/scheme/UIPlugInScheme.cpp | 4 +- src/ui/scheme/UIPlugInScheme.h | 4 +- src/ui/webservice/UIPlugInWebService.cpp | 4 +- src/ui/webservice/UIPlugInWebService.h | 6 +- .../WebserviceActivationContext.cpp | 4 +- .../webservice/WebserviceActivationContext.h | 4 +- src/ui/websocket/UIPlugInWebSocket.cpp | 4 +- src/ui/websocket/UIPlugInWebSocket.h | 6 +- src/whitelist_client/SurveyModel.cpp | 4 +- src/whitelist_client/SurveyModel.h | 6 +- src/workflows/base/CertificateChecker.cpp | 4 +- src/workflows/base/CertificateChecker.h | 6 +- src/workflows/base/TcToken.cpp | 4 +- src/workflows/base/TcToken.h | 6 +- src/workflows/base/WorkflowRequest.cpp | 4 +- src/workflows/base/WorkflowRequest.h | 4 +- .../base/context/AccessRightManager.cpp | 4 +- .../base/context/AccessRightManager.h | 6 +- .../base/context/ActivationContext.cpp | 4 +- .../base/context/ActivationContext.h | 4 +- src/workflows/base/context/AuthContext.cpp | 4 +- src/workflows/base/context/AuthContext.h | 6 +- .../base/context/ChangePinContext.cpp | 4 +- src/workflows/base/context/ChangePinContext.h | 6 +- .../context/InternalActivationContext.cpp | 4 +- .../base/context/InternalActivationContext.h | 4 +- .../base/context/WorkflowContext.cpp | 24 +- src/workflows/base/context/WorkflowContext.h | 12 +- .../base/controller/AuthController.cpp | 5 +- .../base/controller/AuthController.h | 6 +- .../base/controller/ChangePinController.cpp | 5 +- .../base/controller/ChangePinController.h | 6 +- .../base/controller/WorkflowController.cpp | 4 +- .../base/controller/WorkflowController.h | 6 +- src/workflows/base/paos/ElementDetector.cpp | 4 +- src/workflows/base/paos/ElementDetector.h | 6 +- src/workflows/base/paos/PaosHandler.cpp | 4 +- src/workflows/base/paos/PaosHandler.h | 6 +- src/workflows/base/paos/PaosMessage.cpp | 4 +- src/workflows/base/paos/PaosMessage.h | 6 +- src/workflows/base/paos/PaosType.cpp | 4 +- src/workflows/base/paos/PaosType.h | 6 +- src/workflows/base/paos/RequestType.cpp | 4 +- src/workflows/base/paos/RequestType.h | 6 +- src/workflows/base/paos/ResponseType.cpp | 4 +- src/workflows/base/paos/ResponseType.h | 6 +- .../base/paos/element/ConnectionHandle.cpp | 4 +- .../base/paos/element/ConnectionHandle.h | 6 +- .../paos/element/ConnectionHandleParser.cpp | 4 +- .../paos/element/ConnectionHandleParser.h | 6 +- .../base/paos/element/Eac1InputType.cpp | 4 +- .../base/paos/element/Eac1InputType.h | 6 +- .../base/paos/element/Eac2InputType.cpp | 4 +- .../base/paos/element/Eac2InputType.h | 6 +- .../base/paos/element/ElementParser.cpp | 4 +- .../base/paos/element/ElementParser.h | 6 +- .../base/paos/element/SupportedApi.cpp | 4 +- .../base/paos/element/SupportedApi.h | 6 +- src/workflows/base/paos/element/UserAgent.cpp | 4 +- src/workflows/base/paos/element/UserAgent.h | 6 +- .../invoke/DidAuthenticateResponseEac1.cpp | 4 +- .../paos/invoke/DidAuthenticateResponseEac1.h | 6 +- .../invoke/DidAuthenticateResponseEac2.cpp | 4 +- .../paos/invoke/DidAuthenticateResponseEac2.h | 6 +- .../invoke/InitializeFrameworkResponse.cpp | 4 +- .../paos/invoke/InitializeFrameworkResponse.h | 6 +- .../base/paos/invoke/PaosCreator.cpp | 4 +- src/workflows/base/paos/invoke/PaosCreator.h | 6 +- src/workflows/base/paos/invoke/StartPaos.cpp | 4 +- src/workflows/base/paos/invoke/StartPaos.h | 6 +- .../base/paos/invoke/TransmitResponse.cpp | 4 +- .../base/paos/invoke/TransmitResponse.h | 6 +- .../paos/retrieve/DidAuthenticateEac1.cpp | 4 +- .../base/paos/retrieve/DidAuthenticateEac1.h | 6 +- .../retrieve/DidAuthenticateEac1Parser.cpp | 6 +- .../paos/retrieve/DidAuthenticateEac1Parser.h | 6 +- .../paos/retrieve/DidAuthenticateEac2.cpp | 4 +- .../base/paos/retrieve/DidAuthenticateEac2.h | 6 +- .../retrieve/DidAuthenticateEac2Parser.cpp | 4 +- .../paos/retrieve/DidAuthenticateEac2Parser.h | 6 +- .../retrieve/DidAuthenticateEacAdditional.cpp | 4 +- .../retrieve/DidAuthenticateEacAdditional.h | 6 +- .../DidAuthenticateEacAdditionalParser.cpp | 4 +- .../DidAuthenticateEacAdditionalParser.h | 6 +- .../paos/retrieve/InitializeFramework.cpp | 6 +- .../base/paos/retrieve/InitializeFramework.h | 6 +- .../base/paos/retrieve/PaosParser.cpp | 4 +- src/workflows/base/paos/retrieve/PaosParser.h | 6 +- .../base/paos/retrieve/StartPaosResponse.cpp | 4 +- .../base/paos/retrieve/StartPaosResponse.h | 6 +- src/workflows/base/paos/retrieve/Transmit.cpp | 4 +- src/workflows/base/paos/retrieve/Transmit.h | 6 +- .../base/paos/retrieve/TransmitParser.cpp | 4 +- .../base/paos/retrieve/TransmitParser.h | 6 +- src/workflows/base/states/AbstractState.cpp | 23 +- src/workflows/base/states/AbstractState.h | 12 +- .../base/states/CompositeStatePace.cpp | 9 +- .../base/states/CompositeStatePace.h | 9 +- .../CompositeStateProcessCvcsAndSetRights.cpp | 4 +- .../CompositeStateProcessCvcsAndSetRights.h | 10 +- .../states/CompositeStateTrustedChannel.cpp | 6 +- .../states/CompositeStateTrustedChannel.h | 8 +- src/workflows/base/states/FinalState.cpp | 4 +- src/workflows/base/states/FinalState.h | 6 +- .../base/states/GenericContextContainer.h | 6 +- .../StateActivateStoreFeedbackDialog.cpp | 4 +- .../states/StateActivateStoreFeedbackDialog.h | 6 +- src/workflows/base/states/StateBuilder.h | 6 +- .../StateCertificateDescriptionCheck.cpp | 12 +- .../states/StateCertificateDescriptionCheck.h | 4 +- src/workflows/base/states/StateChangePin.cpp | 18 +- src/workflows/base/states/StateChangePin.h | 6 +- .../base/states/StateCheckCertificates.cpp | 6 +- .../base/states/StateCheckCertificates.h | 6 +- src/workflows/base/states/StateCheckError.cpp | 7 +- src/workflows/base/states/StateCheckError.h | 9 +- .../base/states/StateCheckRefreshAddress.cpp | 53 +- .../base/states/StateCheckRefreshAddress.h | 8 +- .../base/states/StateCleanUpReaderManager.cpp | 4 +- .../base/states/StateCleanUpReaderManager.h | 6 +- .../base/states/StateClearPacePasswords.cpp | 4 +- .../base/states/StateClearPacePasswords.h | 4 +- .../base/states/StateConnectCard.cpp | 10 +- src/workflows/base/states/StateConnectCard.h | 4 +- .../base/states/StateDestroyPace.cpp | 6 +- src/workflows/base/states/StateDestroyPace.h | 6 +- .../base/states/StateDidAuthenticateEac1.cpp | 8 +- .../base/states/StateDidAuthenticateEac1.h | 4 +- .../base/states/StateDidAuthenticateEac2.cpp | 10 +- .../base/states/StateDidAuthenticateEac2.h | 4 +- .../states/StateEACAdditionalInputType.cpp | 4 +- .../base/states/StateEACAdditionalInputType.h | 4 +- .../base/states/StateEditAccessRights.cpp | 4 +- .../base/states/StateEditAccessRights.h | 6 +- .../base/states/StateEnterNewPacePin.cpp | 4 +- .../base/states/StateEnterNewPacePin.h | 4 +- .../base/states/StateEnterPacePassword.cpp | 7 +- .../base/states/StateEnterPacePassword.h | 7 +- .../base/states/StateEstablishPaceChannel.cpp | 33 +- .../base/states/StateEstablishPaceChannel.h | 11 +- .../StateExtractCvcsFromEac1InputType.cpp | 12 +- .../StateExtractCvcsFromEac1InputType.h | 6 +- .../StateGenericProviderCommunication.cpp | 40 +- .../StateGenericProviderCommunication.h | 6 +- .../base/states/StateGenericSendReceive.cpp | 77 +- .../base/states/StateGenericSendReceive.h | 7 +- src/workflows/base/states/StateGetTcToken.cpp | 24 +- src/workflows/base/states/StateGetTcToken.h | 6 +- .../base/states/StateInitializeFramework.cpp | 4 +- .../base/states/StateInitializeFramework.h | 4 +- .../states/StateMaintainCardConnection.cpp | 11 +- .../base/states/StateMaintainCardConnection.h | 5 +- .../base/states/StateParseTcTokenUrl.cpp | 13 +- .../base/states/StateParseTcTokenUrl.h | 6 +- .../base/states/StatePreVerification.cpp | 12 +- .../base/states/StatePreVerification.h | 6 +- .../base/states/StatePrepareChangePin.cpp | 4 +- .../base/states/StatePrepareChangePin.h | 4 +- .../base/states/StatePreparePace.cpp | 8 +- src/workflows/base/states/StatePreparePace.h | 4 +- .../StateProcessCertificatesFromEac2.cpp | 6 +- .../states/StateProcessCertificatesFromEac2.h | 6 +- src/workflows/base/states/StateProcessing.cpp | 6 +- src/workflows/base/states/StateProcessing.h | 6 +- .../base/states/StateRedirectBrowser.cpp | 8 +- .../base/states/StateRedirectBrowser.h | 6 +- .../base/states/StateSelectReader.cpp | 21 +- src/workflows/base/states/StateSelectReader.h | 7 +- .../base/states/StateSendWhitelistSurvey.cpp | 4 +- .../base/states/StateSendWhitelistSurvey.h | 6 +- src/workflows/base/states/StateShowResult.cpp | 4 +- src/workflows/base/states/StateShowResult.h | 4 +- src/workflows/base/states/StateStartPaos.cpp | 4 +- src/workflows/base/states/StateStartPaos.h | 6 +- .../base/states/StateStartPaosResponse.cpp | 8 +- .../base/states/StateStartPaosResponse.h | 6 +- src/workflows/base/states/StateTransmit.cpp | 8 +- src/workflows/base/states/StateTransmit.h | 6 +- .../states/StateUnfortunateCardPosition.cpp | 4 +- .../states/StateUnfortunateCardPosition.h | 4 +- .../base/states/StateUpdateRetryCounter.cpp | 13 +- .../base/states/StateUpdateRetryCounter.h | 6 +- .../base/states/StateVerifyRetryCounter.cpp | 6 +- .../base/states/StateVerifyRetryCounter.h | 4 +- .../base/states/StateWriteHistory.cpp | 17 +- src/workflows/base/states/StateWriteHistory.h | 6 +- .../ifd/context/IfdServiceContext.cpp | 10 +- src/workflows/ifd/context/IfdServiceContext.h | 8 +- .../ifd/controller/IfdServiceController.cpp | 4 +- .../ifd/controller/IfdServiceController.h | 6 +- .../ifd/states/StateChangePinIfd.cpp | 4 +- src/workflows/ifd/states/StateChangePinIfd.h | 6 +- .../ifd/states/StateChangePinResponse.cpp | 4 +- .../ifd/states/StateChangePinResponse.h | 6 +- .../ifd/states/StateEnterNewPacePinIfd.cpp | 6 +- .../ifd/states/StateEnterNewPacePinIfd.h | 4 +- .../ifd/states/StateEnterPacePasswordIfd.cpp | 10 +- .../ifd/states/StateEnterPacePasswordIfd.h | 6 +- .../states/StateEstablishPaceChannelIfd.cpp | 6 +- .../ifd/states/StateEstablishPaceChannelIfd.h | 6 +- .../StateEstablishPaceChannelResponse.cpp | 4 +- .../StateEstablishPaceChannelResponse.h | 6 +- .../ifd/states/StatePrepareChangePinIfd.cpp | 4 +- .../ifd/states/StatePrepareChangePinIfd.h | 4 +- .../ifd/states/StatePreparePaceIfd.cpp | 6 +- .../ifd/states/StatePreparePaceIfd.h | 4 +- .../ifd/states/StateProcessIfdMessages.cpp | 6 +- .../ifd/states/StateProcessIfdMessages.h | 6 +- .../ifd/states/StateStartIfdService.cpp | 6 +- .../ifd/states/StateStartIfdService.h | 6 +- .../ifd/states/StateStopIfdService.cpp | 4 +- .../ifd/states/StateStopIfdService.h | 6 +- .../context/PersonalizationContext.cpp | 6 +- .../context/PersonalizationContext.h | 4 +- .../controller/PersonalizationController.cpp | 7 +- .../controller/PersonalizationController.h | 6 +- .../states/StateChangeSmartPin.cpp | 8 +- .../states/StateChangeSmartPin.h | 6 +- .../states/StateCheckApplet.cpp | 8 +- .../personalization/states/StateCheckApplet.h | 6 +- .../states/StateCheckStatus.cpp | 6 +- .../personalization/states/StateCheckStatus.h | 8 +- .../states/StateFinalizePersonalization.cpp | 9 +- .../states/StateFinalizePersonalization.h | 9 +- .../states/StateGetChallenge.cpp | 6 +- .../states/StateGetChallenge.h | 6 +- .../states/StateGetSessionId.cpp | 6 +- .../states/StateGetSessionId.h | 6 +- .../states/StateInitializePersonalization.cpp | 6 +- .../states/StateInitializePersonalization.h | 6 +- .../states/StateInsertCard.cpp | 16 +- .../personalization/states/StateInsertCard.h | 4 +- .../states/StateLoadSmartTcTokenUrl.cpp | 4 +- .../states/StateLoadSmartTcTokenUrl.h | 6 +- .../states/StatePrepareApplet.cpp | 32 +- .../states/StatePrepareApplet.h | 6 +- .../states/StatePreparePersonalization.cpp | 4 +- .../states/StatePreparePersonalization.h | 6 +- .../StateSendStartPaosPersonalization.cpp | 4 +- .../StateSendStartPaosPersonalization.h | 4 +- ...ateSendTransmitResponsePersonalization.cpp | 4 +- ...StateSendTransmitResponsePersonalization.h | 4 +- .../states/StateStartPaosPersonalization.cpp | 4 +- .../states/StateStartPaosPersonalization.h | 4 +- .../StateStartPaosResponsePersonalization.cpp | 8 +- .../StateStartPaosResponsePersonalization.h | 6 +- .../states/StateTransmitPersonalization.cpp | 6 +- .../states/StateTransmitPersonalization.h | 6 +- .../selfauth/SelfAuthenticationData.cpp | 4 +- .../selfauth/SelfAuthenticationData.h | 6 +- .../selfauth/context/SelfAuthContext.cpp | 4 +- .../selfauth/context/SelfAuthContext.h | 6 +- .../controller/SelfAuthController.cpp | 6 +- .../selfauth/controller/SelfAuthController.h | 6 +- .../states/StateGetSelfAuthenticationData.cpp | 6 +- .../states/StateGetSelfAuthenticationData.h | 6 +- .../selfauth/states/StateLoadTcTokenUrl.cpp | 4 +- .../selfauth/states/StateLoadTcTokenUrl.h | 6 +- test/helper/common/MockActivationContext.cpp | 4 +- test/helper/common/MockActivationContext.h | 6 +- test/helper/common/MockCard.cpp | 4 +- test/helper/common/MockCard.h | 6 +- test/helper/common/MockCardConnection.cpp | 4 +- test/helper/common/MockCardConnection.h | 4 +- .../common/MockCardConnectionWorker.cpp | 4 +- test/helper/common/MockCardConnectionWorker.h | 6 +- test/helper/common/MockDownloader.cpp | 4 +- test/helper/common/MockDownloader.h | 6 +- test/helper/common/MockHttpServer.cpp | 4 +- test/helper/common/MockHttpServer.h | 6 +- test/helper/common/MockNetworkManager.cpp | 4 +- test/helper/common/MockNetworkManager.h | 6 +- test/helper/common/MockNetworkReply.cpp | 4 +- test/helper/common/MockNetworkReply.h | 6 +- test/helper/common/MockReader.cpp | 4 +- test/helper/common/MockReader.h | 6 +- .../helper/common/MockReaderConfiguration.cpp | 4 +- test/helper/common/MockReaderConfiguration.h | 6 +- test/helper/common/MockReaderDetector.cpp | 4 +- test/helper/common/MockReaderDetector.h | 6 +- .../helper/common/MockReaderManagerPlugIn.cpp | 4 +- test/helper/common/MockReaderManagerPlugIn.h | 6 +- test/helper/common/MockReleaseInformation.cpp | 4 +- test/helper/common/MockReleaseInformation.h | 6 +- test/helper/common/MockSocket.cpp | 4 +- test/helper/common/MockSocket.h | 6 +- .../common/MockWorkflowAuthenticateUi.h | 6 +- test/helper/common/MockWorkflowChangePinUi.h | 6 +- test/helper/common/QtHooks.cpp | 4 +- test/helper/common/QtHooks.h | 4 +- test/helper/common/TestAuthContext.cpp | 4 +- test/helper/common/TestAuthContext.h | 6 +- test/helper/common/TestFileHelper.cpp | 22 +- test/helper/common/TestFileHelper.h | 7 +- test/helper/common/TestWorkflowContext.cpp | 4 +- test/helper/common/TestWorkflowContext.h | 4 +- test/helper/common/TestWorkflowController.cpp | 4 +- test/helper/common/TestWorkflowController.h | 4 +- test/helper/ifd/MockDataChannel.cpp | 4 +- test/helper/ifd/MockDataChannel.h | 6 +- test/helper/ifd/MockIfdDispatcher.cpp | 4 +- test/helper/ifd/MockIfdDispatcher.h | 6 +- test/helper/ifd/MockIfdServer.cpp | 4 +- test/helper/ifd/MockIfdServer.h | 6 +- .../ui/json/MsgHandlerEnterPassword.cpp | 4 +- test/helper/ui/json/MsgHandlerEnterPassword.h | 6 +- test/helper/ui/websocket/WebSocketHelper.cpp | 4 +- test/helper/ui/websocket/WebSocketHelper.h | 4 +- test/integrated/test_Integrated.cpp | 6 +- .../init/test_CommandLineParser.cpp | 6 +- test/integration/ui/qml/test_UIPlugInQml.cpp | 4 +- .../ui/websocket/test_UIPlugInWebSocket.cpp | 6 +- test/qml/AuthView/test_AuthView.qml | 4 +- .../+desktop/test_ChangePinView.qml | 4 +- .../+mobile/test_ChangePinView.qml | 4 +- .../+mobile/test_CheckIDCardView.qml | 4 +- .../test_CheckResultSuggestionView.qml | 4 +- .../+mobile/test_CheckResultView.qml | 4 +- .../+desktop/test_EnterPasswordView.qml | 4 +- .../+desktop/test_PasswordInfoView.qml | 32 - .../test_EnterPasswordView.qml | 4 +- .../+desktop/test_DetachedLogView.qml | 4 +- .../qml/FeedbackView/+mobile/test_LogView.qml | 4 +- .../+mobile/test_StoreFeedbackPopup.qml | 4 +- .../qml/Global/+desktop/test_DecisionView.qml | 4 +- test/qml/Global/+desktop/test_GFileDialog.qml | 4 +- .../Global/+desktop/test_NavigationButton.qml | 4 +- .../Global/+desktop/test_RoundedRectangle.qml | 4 +- .../Global/+desktop/test_ScrollGradients.qml | 4 +- .../Global/+desktop/test_ScrollablePane.qml | 4 +- test/qml/Global/+desktop/test_TabbedPane.qml | 4 +- .../Global/+desktop/test_ToggleableOption.qml | 35 - .../qml/Global/+mobile/test_DynamicLayout.qml | 17 - test/qml/Global/+mobile/test_GSwitch.qml | 4 +- .../qml/Global/+mobile/test_LabeledSwitch.qml | 4 +- test/qml/Global/+mobile/test_ListItem.qml | 4 +- test/qml/Global/+mobile/test_PaneTitle.qml | 4 +- .../+mobile/test_SwipeActionDelegate.qml | 4 +- .../Global/+mobile/test_TitledSeparator.qml | 4 +- test/qml/Global/test_Category.qml | 4 +- test/qml/Global/test_ConfirmationPopup.qml | 4 +- test/qml/Global/test_Constants.qml | 4 +- test/qml/Global/test_GBusyIndicator.qml | 4 +- test/qml/Global/test_GButton.qml | 56 +- test/qml/Global/test_GCheckBox.qml | 4 +- test/qml/Global/test_GComboBox.qml | 4 +- test/qml/Global/test_GFlickable.qml | 4 +- .../Global/test_GFlickableColumnLayout.qml | 4 +- test/qml/Global/test_GGridView.qml | 4 +- test/qml/Global/test_GInformativeButton.qml | 82 +++ test/qml/Global/test_GListView.qml | 4 +- test/qml/Global/test_GPane.qml | 4 +- test/qml/Global/test_GPaneBackground.qml | 4 +- test/qml/Global/test_GRadioButton.qml | 4 +- test/qml/Global/test_GRepeater.qml | 4 +- test/qml/Global/test_GScrollBar.qml | 4 +- test/qml/Global/test_GSeparator.qml | 4 +- test/qml/Global/test_GText.qml | 4 +- test/qml/Global/test_GTextField.qml | 4 +- test/qml/Global/test_Hint.qml | 4 +- test/qml/Global/test_LabeledText.qml | 4 +- test/qml/Global/test_LocationButton.qml | 4 +- test/qml/Global/test_NumberField.qml | 4 +- test/qml/Global/test_PkiSwitch.qml | 4 +- test/qml/Global/test_PrivacyStatement.qml | 4 +- .../qml/Global/test_ProxyCredentialsPopup.qml | 4 +- test/qml/Global/test_SearchBar.qml | 4 +- test/qml/Global/test_StatusIcon.qml | 4 +- test/qml/Global/test_TintableIcon.qml | 4 +- test/qml/Global/test_Utils.qml | 4 +- .../+desktop/test_ReleaseNotes.qml | 4 +- .../+mobile/test_ReleaseNotes.qml | 4 +- .../test_LicenseInformation.qml | 4 +- .../InformationView/test_ReleaseNotesView.qml | 4 +- .../Navigation/+mobile/test_Navigation.qml | 4 +- .../+desktop/test_PasswordInfoView.qml | 34 + .../+mobile/+phone/test_ProviderHeader.qml | 4 +- .../+mobile/test_ProviderModelItem.qml | 4 +- test/qml/Provider/test_ProviderDetailView.qml | 4 +- .../qml/Provider/test_ProviderInfoSection.qml | 4 +- test/qml/QmlTestRunner.cpp | 4 +- .../+mobile/test_RemoteServiceView.qml | 4 +- .../+mobile/test_ResultErrorView.qml | 4 +- test/qml/ResultView/test_ResultView.qml | 4 +- .../+desktop/test_TabbedReaderView.qml | 4 +- .../qml/SettingsView/test_LanguageButtons.qml | 4 +- test/qml/SettingsView/test_SettingsView.qml | 4 +- test/qml/SmartView/+mobile/test_SmartView.qml | 4 +- .../+mobile/test_TechnologyInfo.qml | 4 +- .../TitleBar/+desktop/test_CancelAction.qml | 4 +- test/qml/TitleBar/test_TitleBar.qml | 4 +- test/qml/TitleBar/test_TitleBarButton.qml | 4 +- .../+desktop/test_TutorialView.qml | 4 +- .../+mobile/test_TutorialView.qml | 4 +- test/qml/View/+mobile/test_ContentArea.qml | 4 +- test/qml/View/+mobile/test_TabBarView.qml | 4 +- test/qml/View/test_Controller.qml | 4 +- test/qml/View/test_FocusFrame.qml | 4 +- test/qml/View/test_FocusPoint.qml | 4 +- test/qml/View/test_SectionPage.qml | 4 +- .../+mobile/test_WhiteListSurveyView.qml | 4 +- .../+desktop/test_GeneralWorkflow.qml | 4 +- .../Workflow/+mobile/test_GeneralWorkflow.qml | 4 +- .../qml/Workflow/+mobile/test_NfcWorkflow.qml | 4 +- .../Workflow/+mobile/test_SmartWorkflow.qml | 4 +- test/qml/Workflow/test_Workflow.qml | 4 +- test/qml/test_HistoryView.qml | 4 +- test/qml/test_MainView.qml | 4 +- test/qml/test_MoreView.qml | 4 +- test/qml/test_ProgressView.qml | 4 +- test/qml/test_ProviderView.qml | 4 +- test/qml/test_SelfAuthenticationView.qml | 4 +- test/qml/test_Style.qml | 4 +- test/qml/test_UiPluginQml.qml | 4 +- test/qt/card/asn1/test_AccessRoleAndRight.cpp | 6 +- .../qt/card/asn1/test_ApplicationTemplate.cpp | 6 +- .../card/asn1/test_ApplicationTemplates.cpp | 6 +- test/qt/card/asn1/test_Asn1BCDDateUtil.cpp | 6 +- test/qt/card/asn1/test_Asn1IntegerUtil.cpp | 6 +- .../qt/card/asn1/test_Asn1OctetStringUtil.cpp | 6 +- test/qt/card/asn1/test_Asn1StringUtil.cpp | 6 +- test/qt/card/asn1/test_Asn1TypeUtil.cpp | 6 +- test/qt/card/asn1/test_Asn1Util.cpp | 4 +- .../asn1/test_AuxiliaryAuthenticatedData.cpp | 6 +- test/qt/card/asn1/test_CVCertificate.cpp | 6 +- test/qt/card/asn1/test_CVCertificateBody.cpp | 6 +- .../asn1/test_CVCertificateChainBuilder.cpp | 6 +- .../card/asn1/test_CertificateDescription.cpp | 6 +- test/qt/card/asn1/test_ChainBuilder.cpp | 6 +- test/qt/card/asn1/test_Chat.cpp | 6 +- .../card/asn1/test_ChipAuthenticationInfo.cpp | 6 +- test/qt/card/asn1/test_EcdsaPublicKey.cpp | 6 +- test/qt/card/asn1/test_Oid.cpp | 4 +- test/qt/card/asn1/test_PaceInfo.cpp | 6 +- test/qt/card/asn1/test_SecurityInfo.cpp | 6 +- test/qt/card/asn1/test_SecurityInfos.cpp | 6 +- test/qt/card/asn1/test_SignatureChecker.cpp | 6 +- test/qt/card/asn1/test_efCardAccess.cpp | 4 +- test/qt/card/asn1/test_efCardSecurity.cpp | 4 +- test/qt/card/base/apdu/test_CommandApdu.cpp | 6 +- test/qt/card/base/apdu/test_CommandData.cpp | 4 +- test/qt/card/base/apdu/test_FileCommand.cpp | 6 +- .../apdu/test_GeneralAuthenticateResponse.cpp | 6 +- test/qt/card/base/apdu/test_PacePinStatus.cpp | 4 +- test/qt/card/base/apdu/test_ResponseApdu.cpp | 6 +- .../card/base/apdu/test_SecureMessaging.cpp | 4 +- .../base/apdu/test_SecureMessagingCommand.cpp | 6 +- .../apdu/test_SecureMessagingResponse.cpp | 6 +- .../base/command/test_BaseCardCommand.cpp | 6 +- .../test_DestroyPaceChannelCommand.cpp | 4 +- .../test_DidAuthenticateEAC1Command.cpp | 4 +- .../test_DidAuthenticateEAC2Command.cpp | 4 +- .../test_EstablishPaceChannelCommand.cpp | 4 +- .../base/command/test_SetEidPinCommand.cpp | 4 +- .../base/command/test_TransmitCommand.cpp | 4 +- .../command/test_UpdRetryCounterCommand.cpp | 4 +- .../base/pinpad/test_EstablishPaceChannel.cpp | 6 +- .../test_EstablishPaceChannelOutput.cpp | 6 +- test/qt/card/base/pinpad/test_LengthValue.cpp | 4 +- test/qt/card/base/pinpad/test_PinModify.cpp | 4 +- .../card/base/pinpad/test_PinModifyOutput.cpp | 4 +- test/qt/card/base/test_CardConnection.cpp | 6 +- .../card/base/test_CardConnectionWorker.cpp | 6 +- test/qt/card/base/test_CardInfo.cpp | 6 +- test/qt/card/base/test_FileRef.cpp | 4 +- test/qt/card/base/test_Reader.cpp | 6 +- test/qt/card/base/test_ReaderInfo.cpp | 6 +- test/qt/card/base/test_ReaderManager.cpp | 4 +- test/qt/card/base/test_SecurityProtocol.cpp | 4 +- test/qt/card/drivers/test_ReaderDetector.cpp | 6 +- test/qt/card/pace/test_CipherMAC.cpp | 4 +- test/qt/card/pace/test_EcUtil.cpp | 4 +- test/qt/card/pace/test_EcdhGenericMapping.cpp | 4 +- test/qt/card/pace/test_EcdhKeyAgreement.cpp | 6 +- .../card/pace/test_KeyDerivationFunction.cpp | 4 +- test/qt/card/pace/test_PaceHandler.cpp | 6 +- test/qt/card/pace/test_SymmetricCipher.cpp | 4 +- test/qt/card/pcsc/test_PcscUtils.cpp | 6 +- test/qt/card/pcsc/test_pcscReaderFeature.cpp | 6 +- test/qt/card/simulator/test_SimulatorCard.cpp | 4 +- .../simulator/test_SimulatorFileSystem.cpp | 4 +- .../smart/test_MockSmartEidRestClient.cpp | 4 +- test/qt/card/smart/test_SmartCard.cpp | 4 +- test/qt/card/smart/test_SmartManager.cpp | 6 +- test/qt/card/smart/test_SmartReader.cpp | 4 +- .../smart/test_SmartReaderManagerPlugIn.cpp | 4 +- .../qt/card/smart/test_eid_applet_service.cpp | 4 +- .../test_ProviderConfiguration.cpp | 8 +- .../test_ProviderConfigurationParser.cpp | 10 +- .../test_ReaderConfiguration.cpp | 19 +- .../test_ReaderConfigurationEntryParser.cpp | 6 +- .../test_ReaderConfigurationParser.cpp | 6 +- .../configuration/test_ReleaseInformation.cpp | 6 +- .../test_ReleaseInformationConfiguration.cpp | 6 +- test/qt/core/test_AppController.cpp | 4 +- .../test_DiagnosisAntivirusDetection.cpp | 6 +- .../test_DiagnosisConnectionTest.cpp | 6 +- test/qt/diagnosis/test_DiagnosisContext.cpp | 4 +- .../test_DiagnosisFirewallDetection.cpp | 6 +- test/qt/diagnosis/test_DiagnosisModel.cpp | 208 +++--- test/qt/export/test_PdfExporter.cpp | 6 +- test/qt/file_provider/test_Downloader.cpp | 6 +- test/qt/file_provider/test_FileProvider.cpp | 4 +- test/qt/file_provider/test_UpdatableFile.cpp | 4 +- test/qt/global/test_BuildHelper.cpp | 6 +- test/qt/global/test_CardReturnCode.cpp | 6 +- test/qt/global/test_DeviceInfo.cpp | 6 +- test/qt/global/test_ECardApiResult.cpp | 24 +- test/qt/global/test_EnumHelper.cpp | 6 +- test/qt/global/test_Env.cpp | 20 +- test/qt/global/test_FailureCode.cpp | 69 ++ test/qt/global/test_FileDestination.cpp | 6 +- test/qt/global/test_FuncUtils.cpp | 6 +- test/qt/global/test_GlobalStatus.cpp | 6 +- test/qt/global/test_LanguageLoader.cpp | 6 +- test/qt/global/test_LogHandler.cpp | 6 +- test/qt/global/test_Randomizer.cpp | 6 +- test/qt/global/test_ResourceLoader.cpp | 6 +- test/qt/global/test_VersionInfo.cpp | 4 +- test/qt/global/test_VersionNumber.cpp | 6 +- test/qt/ifd/local/test_LocalTlsServer.cpp | 6 +- .../ifd/local/test_LocalWebSocketServer.cpp | 6 +- test/qt/ifd/messages/test_Discovery.cpp | 4 +- test/qt/ifd/messages/test_IfdConnect.cpp | 4 +- .../ifd/messages/test_IfdConnectResponse.cpp | 4 +- test/qt/ifd/messages/test_IfdDisconnect.cpp | 4 +- .../messages/test_IfdDisconnectResponse.cpp | 4 +- test/qt/ifd/messages/test_IfdError.cpp | 4 +- .../ifd/messages/test_IfdEstablishContext.cpp | 4 +- .../test_IfdEstablishContextResponse.cpp | 4 +- .../messages/test_IfdEstablishPaceChannel.cpp | 4 +- .../test_IfdEstablishPaceChannelResponse.cpp | 4 +- test/qt/ifd/messages/test_IfdGetStatus.cpp | 4 +- test/qt/ifd/messages/test_IfdMessage.cpp | 4 +- .../ifd/messages/test_IfdMessageResponse.cpp | 4 +- test/qt/ifd/messages/test_IfdModifyPin.cpp | 4 +- .../messages/test_IfdModifyPinResponse.cpp | 4 +- test/qt/ifd/messages/test_IfdStatus.cpp | 4 +- test/qt/ifd/messages/test_IfdTransmit.cpp | 4 +- .../ifd/messages/test_IfdTransmitResponse.cpp | 4 +- test/qt/ifd/messages/test_IfdVersion.cpp | 4 +- test/qt/ifd/remote/test_RemoteIfdClient.cpp | 4 +- .../test_RemoteIfdReaderManagerPlugin.cpp | 6 +- test/qt/ifd/remote/test_RemoteIfdServer.cpp | 6 +- .../remote/test_RemoteReaderAdvertiser.cpp | 53 +- test/qt/ifd/remote/test_RemoteTlsServer.cpp | 6 +- .../ifd/remote/test_RemoteWebSocketServer.cpp | 6 +- test/qt/ifd/test_IfdConnector.cpp | 6 +- test/qt/ifd/test_IfdDescriptor.cpp | 4 +- test/qt/ifd/test_IfdDispatcher.cpp | 6 +- test/qt/ifd/test_IfdListImpl.cpp | 4 +- test/qt/ifd/test_ServerMessageHandler.cpp | 6 +- test/qt/network/test_DatagramHandlerImpl.cpp | 12 +- test/qt/network/test_HttpRequest.cpp | 6 +- test/qt/network/test_HttpResponse.cpp | 6 +- test/qt/network/test_HttpServer.cpp | 22 +- test/qt/network/test_HttpServerRequestor.cpp | 4 +- test/qt/network/test_NetworkManager.cpp | 6 +- test/qt/network/test_PortFile.cpp | 6 +- test/qt/network/test_Template.cpp | 6 +- test/qt/network/test_TlsChecker.cpp | 6 +- test/qt/network/test_UrlUtil.cpp | 6 +- test/qt/network/test_WifiInfo.cpp | 6 +- test/qt/secure_storage/test_SecureStorage.cpp | 6 +- .../secure_storage/test_TlsConfiguration.cpp | 6 +- test/qt/services/test_AppUpdatData.cpp | 6 +- test/qt/services/test_AppUpdatr.cpp | 6 +- test/qt/settings/test_Backup.mm | 4 +- test/qt/settings/test_GeneralSettings.cpp | 6 +- test/qt/settings/test_HistorySettings.cpp | 6 +- test/qt/settings/test_KeyPair.cpp | 6 +- .../settings/test_PreVerificationSettings.cpp | 6 +- .../settings/test_RemoteServiceSettings.cpp | 6 +- test/qt/settings/test_VolatileSettings.cpp | 6 +- .../ui/automatic/test_UIPlugInAutomatic.cpp | 6 +- test/qt/ui/json/test_Message.cpp | 6 +- test/qt/ui/json/test_MsgContext.cpp | 6 +- test/qt/ui/json/test_MsgHandler.cpp | 6 +- .../ui/json/test_MsgHandlerAccessRights.cpp | 6 +- test/qt/ui/json/test_MsgHandlerApiLevel.cpp | 6 +- test/qt/ui/json/test_MsgHandlerAuth.cpp | 6 +- .../qt/ui/json/test_MsgHandlerCertificate.cpp | 6 +- test/qt/ui/json/test_MsgHandlerChangePin.cpp | 6 +- test/qt/ui/json/test_MsgHandlerEnterCan.cpp | 6 +- .../qt/ui/json/test_MsgHandlerEnterNewPin.cpp | 6 +- test/qt/ui/json/test_MsgHandlerEnterPin.cpp | 6 +- test/qt/ui/json/test_MsgHandlerEnterPuk.cpp | 6 +- test/qt/ui/json/test_MsgHandlerInfo.cpp | 6 +- test/qt/ui/json/test_MsgHandlerInsertCard.cpp | 6 +- .../ui/json/test_MsgHandlerInternalError.cpp | 6 +- .../json/test_MsgHandlerPersonalization.cpp | 6 +- test/qt/ui/json/test_MsgHandlerReader.cpp | 6 +- test/qt/ui/json/test_MsgHandlerReaderList.cpp | 6 +- test/qt/ui/json/test_MsgHandlerStatus.cpp | 6 +- test/qt/ui/json/test_UILoader.cpp | 6 +- test/qt/ui/json/test_UIPlugInJson.cpp | 6 +- test/qt/ui/proxy/test_RedirectRequest.cpp | 6 +- test/qt/ui/proxy/test_UILoader.cpp | 6 +- test/qt/ui/proxy/test_UIPlugInProxy.cpp | 4 +- .../qml/smart/test_PersonalizationModel.cpp | 6 +- test/qt/ui/qml/smart/test_SmartModel.cpp | 6 +- test/qt/ui/qml/test_ApplicationModel.cpp | 6 +- test/qt/ui/qml/test_AuthModel.cpp | 6 +- test/qt/ui/qml/test_CardPositionModel.cpp | 6 +- .../qml/test_CertificateDescriptionModel.cpp | 6 +- test/qt/ui/qml/test_ChangePinModel.cpp | 6 +- test/qt/ui/qml/test_ChatModel.cpp | 6 +- test/qt/ui/qml/test_ConnectivityManager.cpp | 6 +- test/qt/ui/qml/test_FormattedTextModel.cpp | 6 +- test/qt/ui/qml/test_HelpAction.cpp | 6 +- test/qt/ui/qml/test_HistoryModel.cpp | 6 +- test/qt/ui/qml/test_LogFilterModel.cpp | 4 +- test/qt/ui/qml/test_LogModel.cpp | 6 +- test/qt/ui/qml/test_NotificationModel.cpp | 6 +- test/qt/ui/qml/test_NumberModel.cpp | 32 +- .../ui/qml/test_PinResetInformationModel.cpp | 6 +- .../qml/test_ProviderCategoryFilterModel.cpp | 6 +- test/qt/ui/qml/test_ProviderModel.cpp | 6 +- .../ui/qml/test_ProviderNameFilterModel.cpp | 6 +- test/qt/ui/qml/test_ProxyCredentials.cpp | 6 +- test/qt/ui/qml/test_QmlFileStructure.cpp | 4 +- test/qt/ui/qml/test_ReaderModel.cpp | 4 +- test/qt/ui/qml/test_ReaderScanEnabler.cpp | 4 +- .../ui/qml/test_ReleaseInformationModel.cpp | 6 +- test/qt/ui/qml/test_RemoteDeviceModel.cpp | 4 +- test/qt/ui/qml/test_RemoteServiceModel.cpp | 63 +- test/qt/ui/qml/test_SelfAuthModel.cpp | 6 +- test/qt/ui/qml/test_SortedReaderModel.cpp | 4 +- test/qt/ui/qml/test_UILoader.cpp | 6 +- test/qt/ui/qml/test_WorkflowModel.cpp | 6 +- .../test_CustomSchemeActivationContext.cpp | 6 +- test/qt/ui/scheme/test_UIPlugInScheme.cpp | 6 +- .../ui/webservice/test_UIPlugInWebService.cpp | 6 +- .../test_WebserviceActivationContext.cpp | 6 +- test/qt/whitelist_client/test_SurveyModel.cpp | 4 +- .../context/test_AccessRightManager.cpp | 6 +- .../qt/workflows/context/test_AuthContext.cpp | 6 +- .../context/test_ChangePinContext.cpp | 6 +- .../context/test_WorkflowContext.cpp | 20 +- .../workflows/ifd/test_IfdServiceContext.cpp | 81 +-- .../workflows/ifd/test_StateChangePinIfd.cpp | 4 +- .../ifd/test_StateEstablishPaceChannelIfd.cpp | 4 +- ...test_StateEstablishPaceChannelResponse.cpp | 4 +- .../ifd/test_StatePreparePaceIfd.cpp | 9 +- .../ifd/test_StateProcessIfdMessages.cpp | 4 +- .../ifd/test_StateStartIfdService.cpp | 4 +- .../ifd/test_StateStopIfdService.cpp | 4 +- .../paos/element/test_ElementParser.cpp | 6 +- .../test_DidAuthenticateResponseEAC1.cpp | 6 +- .../test_DidAuthenticateResponseEAC2.cpp | 6 +- .../paos/invoke/test_PaosCreator.cpp | 6 +- .../workflows/paos/invoke/test_StartPaos.cpp | 6 +- .../paos/invoke/test_TransmitResponse.cpp | 6 +- .../retrieve/test_DidAuthenticateEac1.cpp | 6 +- .../retrieve/test_DidAuthenticateEac2.cpp | 6 +- .../test_DidAuthenticateEacAdditional.cpp | 6 +- .../retrieve/test_InitializeFramework.cpp | 6 +- .../paos/retrieve/test_StartPAOSResponse.cpp | 6 +- .../workflows/paos/retrieve/test_transmit.cpp | 6 +- test/qt/workflows/paos/test_PaosMessage.cpp | 6 +- test/qt/workflows/paos/test_RequestType.cpp | 6 +- test/qt/workflows/paos/test_UserAgent.cpp | 6 +- test/qt/workflows/paos/test_paoshandler.cpp | 4 +- .../test_PersonalizationContext.cpp | 4 +- .../test_StateChangeSmartPin.cpp | 11 +- .../personalization/test_StateCheckApplet.cpp | 11 +- .../test_StateFinalizePersonalization.cpp | 10 +- .../test_StateGetChallenge.cpp | 16 +- .../test_StateGetSessionId.cpp | 14 +- .../test_StateInitializePersonalization.cpp | 5 +- .../test_StatePrepareApplet.cpp | 59 +- .../test_StatePreparePersonalization.cpp | 13 +- .../test_StateTransmitPersonalization.cpp | 7 +- .../selfauth/test_SelfAuthenticationData.cpp | 6 +- .../test_StateCertificateDescriptionCheck.cpp | 8 +- .../workflows/states/test_StateChangePin.cpp | 41 +- .../states/test_StateCheckRefreshAddress.cpp | 21 +- .../states/test_StateConnectCard.cpp | 7 +- .../states/test_StateDestroyPace.cpp | 4 +- .../states/test_StateDidAuthenticateEac1.cpp | 7 +- .../states/test_StateDidAuthenticateEac2.cpp | 23 +- .../states/test_StateEnterPacePassword.cpp | 9 +- .../states/test_StateEstablishPaceChannel.cpp | 45 +- ...test_StateExtractCvcsFromEac1InputType.cpp | 10 +- ...test_StateGenericProviderCommunication.cpp | 35 +- .../states/test_StateGenericSendReceive.cpp | 6 +- .../test_StateGetSelfAuthenticationData.cpp | 24 +- .../workflows/states/test_StateGetTcToken.cpp | 10 +- .../states/test_StateInitializeFramework.cpp | 4 +- .../test_StateMaintainCardConnection.cpp | 12 +- .../states/test_StatePreVerification.cpp | 14 +- .../states/test_StatePreparePace.cpp | 8 +- .../test_StateProcessCertificatesFromEac2.cpp | 7 +- .../states/test_StateRedirectBrowser.cpp | 9 +- .../states/test_StateSelectReader.cpp | 22 +- .../states/test_StateSendWhitelistSurvey.cpp | 4 +- .../states/test_StateStartPaosResponse.cpp | 7 +- .../workflows/states/test_StateTransmit.cpp | 7 +- .../states/test_StateUpdRetryCounter.cpp | 8 +- .../states/test_StateVerifyRetryCounter.cpp | 7 +- .../states/test_StateWriteHistory.cpp | 9 +- .../qt/workflows/states/test_TermsOfUsage.cpp | 6 +- test/qt/workflows/test_CertificateChecker.cpp | 6 +- .../qt/workflows/test_ChangePinController.cpp | 6 +- test/qt/workflows/test_TcToken.cpp | 6 +- test/qt/workflows/test_WorkflowRequest.cpp | 6 +- 1760 files changed, 9843 insertions(+), 6458 deletions(-) create mode 100644 docs/releasenotes/1.26.3.rst create mode 100644 libs/patches/qt-connectivity-0001-iOS-NFC-Always-ensure-timeout-after-session-invalida.patch create mode 100644 libs/patches/qt-declarative-0001-qmlformat-fix-omitting-some-comments-while-reformatt.patch create mode 100644 resources/images/icon_five_digit_pin.svg create mode 100644 resources/images/icon_six_digit_pin_blue.svg create mode 100644 resources/images/icon_six_digit_pin_white.svg create mode 100644 resources/images/icon_ten_digit_puk.svg create mode 100644 resources/images/material_block.svg rename resources/images/{desktop => }/material_live_help.svg (100%) create mode 100644 resources/images/material_person.svg delete mode 100644 resources/images/mobile/material_five.svg delete mode 100644 resources/images/mobile/material_six.svg rename resources/images/{pin_letter_pinpuk_same_page.svg => pin_letter_pinpuk.svg} (99%) delete mode 100644 resources/images/pin_letter_pinpuk_different_page.svg create mode 100644 resources/images/pin_letter_pinpuk_red_bar.svg create mode 100644 resources/images/pin_letter_pinpuk_red_bar_puk.svg create mode 100644 resources/images/pin_person.svg create mode 100755 resources/jenkins/notify_rb.sh delete mode 100644 resources/qml/Governikus/ChangePinView/+mobile/ChangePinViewContent.qml delete mode 100644 resources/qml/Governikus/ChangePinView/+mobile/PinUnknownView.qml create mode 100644 resources/qml/Governikus/ChangePinView/ChangePinViewContent.qml delete mode 100644 resources/qml/Governikus/EnterPasswordView/+desktop/PasswordInfoView.qml delete mode 100644 resources/qml/Governikus/EnterPasswordView/+mobile/PasswordInfoView.qml delete mode 100644 resources/qml/Governikus/EnterPasswordView/PasswordInfoImage.qml delete mode 100644 resources/qml/Governikus/Global/+desktop/ToggleableOption.qml delete mode 100644 resources/qml/Governikus/Global/+mobile/+phone/DynamicLayout.qml delete mode 100644 resources/qml/Governikus/Global/+mobile/+tablet/DynamicLayout.qml create mode 100644 resources/qml/Governikus/Global/GInformativeButton.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/PasswordInfoContentBlock.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/PasswordInfoImage.qml create mode 100644 resources/qml/Governikus/PasswordInfoView/qmldir delete mode 100644 resources/qml/Governikus/TitleBar/+desktop/TitleBarText.qml delete mode 100644 resources/updatable-files/reader/img_ACS_ACR122U.png delete mode 100644 resources/updatable-files/reader/img_ACS_ACR122U_mit_ausweis.png delete mode 100644 resources/updatable-files/reader/img_ACS_ACR1252U.png delete mode 100644 resources/updatable-files/reader/img_ACS_ACR1252U_mit_ausweis.png delete mode 100644 resources/updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL.png delete mode 100644 resources/updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL_mit_ausweis.png delete mode 100644 resources/updatable-files/reader/img_Identive_SDI010.png delete mode 100644 resources/updatable-files/reader/img_Identive_SDI010_mit_ausweis.png create mode 100644 src/global/FailureCode.cpp create mode 100644 src/global/FailureCode.h delete mode 100644 test/qml/EnterPasswordView/+desktop/test_PasswordInfoView.qml delete mode 100644 test/qml/Global/+desktop/test_ToggleableOption.qml delete mode 100644 test/qml/Global/+mobile/test_DynamicLayout.qml create mode 100644 test/qml/Global/test_GInformativeButton.qml create mode 100644 test/qml/PasswordInfoView/+desktop/test_PasswordInfoView.qml create mode 100644 test/qt/global/test_FailureCode.cpp diff --git a/AUTHORS b/AUTHORS index a82c15ddf..e82341486 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,3 @@ -Copyright (c) 2014-2021 Governikus GmbH & Co. KG - - Authors ---------------- André Klitzing diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c337b3da..7c6cce40c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,7 +60,7 @@ if(UNIX AND NOT IOS) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE STRING "Required macOS version") endif() -project(AusweisApp2 VERSION 1.26.2 LANGUAGES ${LANGUAGES}) +project(AusweisApp2 VERSION 1.26.3 LANGUAGES ${LANGUAGES}) # Set TWEAK if not defined in PROJECT_VERSION above to # have a valid tweak version without propagating it diff --git a/LICENSE.officially.txt b/LICENSE.officially.txt index b72592121..d81a69119 100644 --- a/LICENSE.officially.txt +++ b/LICENSE.officially.txt @@ -350,7 +350,7 @@ Die verwendeten Open-Source-Bibliotheken unterliegen den folgenden Nutzungsbedin OpenSSL Lizenz: Apache 2.0 - Version: 3.0.7 + Version: 3.0.8 Adresse: https://www.openssl.org/ Qt diff --git a/LICENSE.txt b/LICENSE.txt index f68a0d5c9..8bae541de 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -318,7 +318,7 @@ Die verwendeten Open-Source-Bibliotheken unterliegen den folgenden Nutzungsbedin OpenSSL Lizenz: Apache 2.0 - Version: 3.0.7 + Version: 3.0.8 Adresse: https://www.openssl.org/ Qt diff --git a/cmake/Packaging.cmake b/cmake/Packaging.cmake index 4afe90644..461c3b285 100644 --- a/cmake/Packaging.cmake +++ b/cmake/Packaging.cmake @@ -222,7 +222,7 @@ elseif(ANDROID) endif() endif() - set(DEPLOY_CMD ${androiddeployqt} --verbose --gradle --input ${ANDROID_DEPLOYMENT_SETTINGS} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN}) + set(DEPLOY_CMD ${androiddeployqt} --verbose --gradle --input ${ANDROID_DEPLOYMENT_SETTINGS} --android-platform ${ANDROID_TARGET_SDK_VERSION} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN}) set(SOURCE_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/build/outputs/${ANDROID_FILE_EXT}) if(NOT INTEGRATED_SDK) diff --git a/cmake/android.toolchain.cmake b/cmake/android.toolchain.cmake index 885621999..c21ea168a 100644 --- a/cmake/android.toolchain.cmake +++ b/cmake/android.toolchain.cmake @@ -57,7 +57,7 @@ READ_REVISION(ANDROID_SDK_REVISION ".*Revision=([0-9|\\.]+)" "${ANDROID_SDK}/cmd set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang) set(CMAKE_SYSTEM_NAME Android) set(CMAKE_SYSTEM_VERSION 24) -set(ANDROID_TARGET_SDK_VERSION 31) +set(ANDROID_TARGET_SDK_VERSION 33) set(CMAKE_ANDROID_STL_TYPE c++_shared) if(NOT CMAKE_ANDROID_ARCH_ABI) diff --git a/cmake/cmd.cmake b/cmake/cmd.cmake index 57b242c37..d2f666c43 100644 --- a/cmake/cmd.cmake +++ b/cmake/cmd.cmake @@ -160,7 +160,44 @@ function(DEPLOY_NEXUS) file(REMOVE settings.xml) endfunction() +function(CHECK_FAILURE_CODES) + file(STRINGS "src/global/FailureCode.h" LINES) + foreach(line ${LINES}) + if(line MATCHES "enum class Reason") + set(ENUM_FOUND 1) + continue() + endif() + + if(ENUM_FOUND) + if(line MATCHES "{") + continue() + endif() + + if(line MATCHES "}") + break() + endif() + string(REGEX REPLACE "//.*" "" line ${line}) + string(APPEND SINGLE_LINE ${line}) + endif() + endforeach() + string(REGEX REPLACE "/\\*[^(\\*/)]*\\*/" "" SINGLE_LINE ${SINGLE_LINE}) + string(REGEX MATCHALL "([a-zA-Z0-9_]+)" FAILURE_CODES ${SINGLE_LINE}) + + file(GLOB_RECURSE SOURCE_FILES src/*.cpp) + foreach(code ${FAILURE_CODES}) + set(COUNTER 0) + foreach(file ${SOURCE_FILES}) + file(READ ${file} CONTENT) + string(REGEX MATCHALL "FailureCode::Reason::${code}" USAGE ${CONTENT}) + list(LENGTH USAGE OCCURRENCES) + math(EXPR COUNTER ${COUNTER}+${OCCURRENCES}) + endforeach() + if(NOT COUNTER EQUAL 1) + message(FATAL_ERROR "${code} is not used excatly one time. Found ${COUNTER}") + endif() + endforeach() +endfunction() if(NOT CMD) message(FATAL_ERROR "You need to specify 'CMD'") @@ -174,6 +211,8 @@ elseif(CMD STREQUAL "IMPORT_PATCH") IMPORT_PATCH() elseif(CMD STREQUAL "DEPLOY_NEXUS") DEPLOY_NEXUS() +elseif(CMD STREQUAL "CHECK_FAILURE_CODES") + CHECK_FAILURE_CODES() else() message(FATAL_ERROR "Unknown CMD: ${CMD}") endif() diff --git a/cmake/prepare_sonarqube_env.cmake b/cmake/prepare_sonarqube_env.cmake index 8ba6e7955..cdda5c055 100644 --- a/cmake/prepare_sonarqube_env.cmake +++ b/cmake/prepare_sonarqube_env.cmake @@ -13,20 +13,20 @@ message(STATUS "Use PACKAGES_DIR: ${PACKAGES_DIR}") set(BUILDWRAPPER_ZIP_NAME build-wrapper-linux-x86.zip) set(BUILDWRAPPER_URL https://sonar.govkg.de/static/cpp/${BUILDWRAPPER_ZIP_NAME}) -set(SONARSCANNERCLI_VERSION 4.7.0.2747-linux) # https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ +set(SONARSCANNERCLI_VERSION 4.8.0.2856-linux) # https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ set(SONARSCANNERCLI_ZIP_NAME sonar-scanner-cli-${SONARSCANNERCLI_VERSION}.zip) set(SONARSCANNERCLI_URL https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/${SONARSCANNERCLI_ZIP_NAME}) -set(SONARSCANNERCLI_HASH 3e121d85a4adb1f30b917d5f3eb897966b59e02c3d6d313a78dcd964193dc963) +set(SONARSCANNERCLI_HASH 45a9a54dfe5f58b554e9b40ad3becbf9871a4eddb1c2892b67cf191cdd891754) -set(DEPENDENCYCHECK_VERSION 7.1.1) # https://github.com/jeremylong/DependencyCheck/releases +set(DEPENDENCYCHECK_VERSION 8.1.0) # https://github.com/jeremylong/DependencyCheck/releases set(DEPENDENCYCHECK_ZIP_NAME dependency-check-${DEPENDENCYCHECK_VERSION}-release.zip) set(DEPENDENCYCHECK_URL https://github.com/jeremylong/DependencyCheck/releases/download/v${DEPENDENCYCHECK_VERSION}/${DEPENDENCYCHECK_ZIP_NAME}) -set(DEPENDENCYCHECK_HASH 1070591e7ae2b9ed60384f58db489405c68856f544b8d27456eb3b153478ec8f) +set(DEPENDENCYCHECK_HASH a87231139f7a3de8e9fec2fa4353a9b21bd0397a4540fa24e91a8716e9e6e74e) -set(MARIADB_CONNECTOR_VERSION 3.0.4) +set(MARIADB_CONNECTOR_VERSION 3.1.2) set(MARIADB_CONNECTOR_ZIP_NAME mariadb-java-client-${MARIADB_CONNECTOR_VERSION}.jar) set(MARIADB_CONNECTOR_URL https://downloads.mariadb.com/Connectors/java/connector-java-${MARIADB_CONNECTOR_VERSION}/${MARIADB_CONNECTOR_ZIP_NAME}) -set(MARIADB_CONNECTOR_HASH c8c9eba4f5368e3fdb321e17353446cbf8d36c822ec604841308b1bef950a529) +set(MARIADB_CONNECTOR_HASH aaec1ad348d030a65b25c93c65cdaf472bf8b4b6b314b965e5ba13aec81bc622) set(SONARQUBETOOLS_DIR ${CMAKE_BINARY_DIR}/sonarqubetools) diff --git a/cmake/tests/openssl.cpp b/cmake/tests/openssl.cpp index 782c7ed0b..1eaeac01c 100644 --- a/cmake/tests/openssl.cpp +++ b/cmake/tests/openssl.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/docs/installation/README.de.rst b/docs/installation/README.de.rst index 7273188b5..a1aea8ea2 100644 --- a/docs/installation/README.de.rst +++ b/docs/installation/README.de.rst @@ -13,7 +13,7 @@ alle unterstützten Parameter, die im Anschluss erläutert werden. .. code-block:: winbatch - msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALLDIR="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false PROXYSERVICE=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false CUSTOMPROXYTYPE="HTTP" CUSTOMPROXYHOST="proxy.example.org" CUSTOMPROXYPORT=1337 UPDATECHECK=false ONSCREENKEYBOARD=true SHUFFLESCREENKEYBOARD=true HISTORY=false ENABLECANALLOWED=true SKIPRIGHTSONCANALLOWED=true LAUNCH=true + msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALLDIR="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false PROXYSERVICE=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false CUSTOMPROXYTYPE="HTTP" CUSTOMPROXYHOST="proxy.example.org" CUSTOMPROXYPORT=1337 UPDATECHECK=false ONSCREENKEYBOARD=true SHUFFLESCREENKEYBOARD=true SECURESCREENKEYBOARD=true HISTORY=false ENABLECANALLOWED=true SKIPRIGHTSONCANALLOWED=true LAUNCH=true INSTALLDIR Gibt das Installationsverzeichnis an. Ohne Angabe wird der Ordner @@ -113,6 +113,11 @@ SHUFFLESCREENKEYBOARD Durch Setzen von SHUFFLESCREENKEYBOARD auf false oder true kann die zufällige Anordnung deaktiviert bzw. aktiviert werden. Der Benutzer kann diese Einstellung anpassen. +SECURESCREENKEYBOARD + Ist die Bildschirmtastatur aktiviert, kann die Animation der Zifferntasten deaktiviert + werden. Durch Setzen von SECURESCREENKEYBOARD auf false oder true kann die Animation + aktiviert bzw. deaktiviert werden. Der Benutzer kann diese Einstellung anpassen. + HISTORY Jede Selbstauskunft oder Authentisierung wird im Verlauf gespeichert. Dabei werden jedoch keine persönlichen Daten gespeichert, sondern nur der Zeitpunkt, @@ -184,6 +189,8 @@ dargestellt: shuffleScreenKeyboard + visualPrivacy + history.enable enableCanAllowed @@ -210,6 +217,7 @@ customProxyHost CUSTOMPROXYHOST autoUpdateCheck UPDATECHECK keylessPassword ONSCREENKEYBOARD shuffleScreenKeyboard SHUFFLESCREENKEYBOARD +visualPrivacy SECURESCREENKEYBOARD history.enable HISTORY enableCanAllowed ENABLECANALLOWED skipRightsOnCanAllowed SKIPRIGHTSONCANALLOWED diff --git a/docs/installation/README.en.rst b/docs/installation/README.en.rst index 90376325d..2f03af350 100644 --- a/docs/installation/README.en.rst +++ b/docs/installation/README.en.rst @@ -12,7 +12,7 @@ contains all supported arguments, which are explained below. .. code-block:: winbatch - msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALLDIR="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false PROXYSERVICE=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false CUSTOMPROXYTYPE="HTTP" CUSTOMPROXYHOST="proxy.example.org" CUSTOMPROXYPORT=1337 UPDATECHECK=false ONSCREENKEYBOARD=true SHUFFLESCREENKEYBOARD=true HISTORY=false ENABLECANALLOWED=true SKIPRIGHTSONCANALLOWED=true LAUNCH=true + msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALLDIR="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false PROXYSERVICE=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false CUSTOMPROXYTYPE="HTTP" CUSTOMPROXYHOST="proxy.example.org" CUSTOMPROXYPORT=1337 UPDATECHECK=false ONSCREENKEYBOARD=true SHUFFLESCREENKEYBOARD=true SECURESCREENKEYBOARD=true HISTORY=false ENABLECANALLOWED=true SKIPRIGHTSONCANALLOWED=true LAUNCH=true INSTALLDIR States the installation directory. If not specified, the folder @@ -105,6 +105,11 @@ SHUFFLESCREENKEYBOARD By setting SHUFFLESCREENKEYBOARD to false or true, the random arrangement can be deactivated or activated. Users are able to adjust the setting. +SECURESCREENKEYBOARD + If the on-screen keyboard is activated, the animation of the number keys can be + disabled. By setting SECURESCREENKEYBOARD to false or true, the animation can be + activated or deactivated. Users are able to adjust the setting. + HISTORY Each authentication is saved in the history. No personal data is saved, only the time of authentication, the provider and the selected fields (without @@ -171,6 +176,8 @@ the file must be "com.governikus.AusweisApp2.plist". The content is shown below: shuffleScreenKeyboard + visualPrivacy + history.enable enableCanAllowed @@ -196,6 +203,7 @@ customProxyHost CUSTOMPROXYHOST autoUpdateCheck UPDATECHECK keylessPassword ONSCREENKEYBOARD shuffleScreenKeyboard SHUFFLESCREENKEYBOARD +visualPrivacy SECURESCREENKEYBOARD history.enable HISTORY enableCanAllowed ENABLECANALLOWED skipRightsOnCanAllowed SKIPRIGHTSONCANALLOWED diff --git a/docs/releasenotes/1.26.3.rst b/docs/releasenotes/1.26.3.rst new file mode 100644 index 000000000..e7c4c5493 --- /dev/null +++ b/docs/releasenotes/1.26.3.rst @@ -0,0 +1,32 @@ +AusweisApp2 1.26.3 +^^^^^^^^^^^^^^^^^^ + +**Releasedatum:** 9. März 2023 + + +Anwender +"""""""" +- Erweiterung der Hilfs- und Erklärungstexte. + +- Verbesserungen in der Diagnose. + +- Korrektur eines Fehlers beim NFC-Dialog von iOS. + +- Verbesserung der Barrierefreiheit bei der Eingabe von + PIN, CAN und PUK. + + +Entwickler +"""""""""" +- Einführung von eindeutigen FailureCodes im SDK. + +- Ergänzung der Umgebungsvariable AUSWEISAPP2_AUTOMATIC_DEVELOPERMODE + im vollautomatischen SDK. + +- Korrektur einer falschen Anzeige des Fortschritts im SDK für iOS. + +- Ergänzung von SECURESCREENKEYBOARD bei der Firmeninstallation. + +- Anhebung des TargetSDKs auf 33 im SDK für Android. + +- Aktualisierung von OpenSSL auf die Version 3.0.8. diff --git a/docs/releasenotes/announce.rst b/docs/releasenotes/announce.rst index f9c896307..8778658b3 100644 --- a/docs/releasenotes/announce.rst +++ b/docs/releasenotes/announce.rst @@ -5,6 +5,7 @@ Mit der Version 1.28.0 der AusweisApp2 wird die Unterstützung folgender Systeme und Funktionen eingestellt. - macOS Catalina 10.15 +- Online-Hilfe Mit der Version 1.24.0 der AusweisApp2 wurde die Unterstützung diff --git a/docs/releasenotes/issues.rst b/docs/releasenotes/issues.rst index abe73ae19..0623c89a1 100644 --- a/docs/releasenotes/issues.rst +++ b/docs/releasenotes/issues.rst @@ -43,6 +43,11 @@ Windows / macOS - Die visuelle Hervorhebung des aktiven Elements wird an einigen Stellen fälschlicherwiese auch aktiviert, wenn die Maus benutzt wurde. +- Unter macOS werden im System hinterlegte Proxy-Server nicht erkannt und + damit auch nicht automatisch verwendet. Um manuell einen Proxy-Server in + der AusweisApp2 zu hinterlegen beachten Sie die Anleitung zur Installation + in Firmennetzwerken. + Android / iOS """"""""""""" diff --git a/docs/releasenotes/support.rst b/docs/releasenotes/support.rst index ec79e7179..8543dfb2f 100644 --- a/docs/releasenotes/support.rst +++ b/docs/releasenotes/support.rst @@ -54,19 +54,19 @@ und sollte daher mit allen marktüblichen Browsern verwendet werden können. Im Rahmen der Qualitätssicherung werden die folgenden Browserversionen getestet. -- Chrome 109 +- Chrome 110 -- Firefox 108 +- Firefox 110 -- Safari 16.1 (macOS) +- Safari 16.3 (macOS) -- Edge 109 +- Edge 110 Kartenleser ~~~~~~~~~~~ -Alle Kartenleser, die die Onlineausweisfunktionalität unterstützen und nach +Alle Kartenleser, die die Online-Ausweisfunktion unterstützen und nach BSI TR-03119 zertifiziert sind. Details hierzu befinden sich auf der Homepage des BSI unter "Nach Technischen Richtlinien zertifizierte Produkte". @@ -96,7 +96,7 @@ Zusätzlich werden folgende nicht zertifizierte Kartenleser getestet. Aktuelle Informationen zu Kartenlesern finden Sie auf unserer Webseite: https://www.ausweisapp.bund.de/aa2/cardreader -Alle NFC-fähigen Smartphones bzw. Tablets, die die Onlineausweisfunktionalität +Alle NFC-fähigen Smartphones bzw. Tablets, die die Online-Ausweisfunktion unterstützen, können als Kartenleser verwendet werden. Dabei ist es notwendig die mobile AusweisApp2 auf dem jeweiligen Smartphone zu installieren und zu starten. @@ -118,18 +118,18 @@ Im mobilen Umfeld ist die Funktionalität jedoch abhängig von der vom Anbieter umgesetzten Aktivierung. Daher empfehlen wir einen der folgenden Browser zu verwenden. -- Chrome 109 (iOS/Android) +- Chrome 110 (iOS/Android) -- Firefox 108 (iOS/Android) +- Firefox 110 (iOS/Android) -- Samsung Internet 19 (Android) +- Samsung Internet 20 (Android) -- Safari 16.1 (iOS) +- Safari 16.3 (iOS) Kartenleser ~~~~~~~~~~~ -Alle NFC-fähigen Smartphones bzw. Tablets, die die Onlineausweisfunktionalität +Alle NFC-fähigen Smartphones bzw. Tablets, die die Online-Ausweisfunktion unterstützen. Details hierzu befinden sich auf der Homepage: https://www.ausweisapp.bund.de/aa2/mobile-devices diff --git a/docs/sdk/commands.rst b/docs/sdk/commands.rst index 62bcad82e..da295dfe8 100644 --- a/docs/sdk/commands.rst +++ b/docs/sdk/commands.rst @@ -112,6 +112,8 @@ The AusweisApp2 will send a :ref:`reader` message as an answer. +.. _get_reader_list: + GET_READER_LIST ^^^^^^^^^^^^^^^ Returns information about all connected readers. @@ -164,8 +166,8 @@ Command :ref:`interrupt` allows to stop the dialog manually, if needed. URL to the TcToken. This is equal to the desktop style activation URL. *(http://127.0.0.1:24727/eID-Client?tcTokenURL=)* - - **developerMode**: True to enable "Developer Mode" for test cards according to BSI TR-03124-1, - otherwise false. (optional, default: false) + - **developerMode**: True to enable "Developer Mode" for test cards and disable some security + checks according to BSI TR-03124-1, otherwise false. (optional, default: false) - **handleInterrupt**: True to automatically handle system dialog on iOS, otherwise false. :ref:`api_level` v1 only. (optional, default: false) @@ -434,7 +436,7 @@ ACCEPT Accept the current state. If the AusweisApp2 will send the message :ref:`access_rights` the user -needs to **accept** or **deny**. So the workflow is paused until +needs to **accept** or **cancel**. So the workflow is paused until your application sends this command to accept the requested information. If the user does not accept the requested information your application diff --git a/docs/sdk/desktop.rst b/docs/sdk/desktop.rst index 818ef98e6..f61d8ab19 100644 --- a/docs/sdk/desktop.rst +++ b/docs/sdk/desktop.rst @@ -74,6 +74,9 @@ Automatic .. versionadded:: 1.24.0 Mode "automatic" added. +.. versionadded:: 1.26.3 + Variable "AUSWEISAPP2_AUTOMATIC_DEVELOPERMODE" added. + You can enable an automatic authentication with the automatic plugin by providing the commandline parameter ``--ui automatic``. @@ -91,6 +94,10 @@ refuses a PIN, CAN or PUK the AusweisApp2 will cancel the whole workflow. Also the workflow will be canceled if the card reader is not a basic reader as it is not possible to automatically enter the values. +The **developerMode** (like in :ref:`run_auth`) can be enabled with the environment +variable ``AUSWEISAPP2_AUTOMATIC_DEVELOPERMODE``. +This will be evaluated if the automatic plugin takes control over the workflow. + .. note:: It is possible to pass multiple plugins to the AusweisApp2, e.g.: ``--ui websocket --ui automatic``. diff --git a/docs/sdk/intro.rst b/docs/sdk/intro.rst index e30328171..2001a1b21 100644 --- a/docs/sdk/intro.rst +++ b/docs/sdk/intro.rst @@ -49,13 +49,3 @@ show a possible communication. `TR-03124`_, part 1: Specifications .. _TR-03124: https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03124/TR-03124-1.pdf - - -Recommended ------------ -The SDK uses JSON as the communication protocol. -It is recommended to use an existing library for this. - - - **Java**: `Google GSON `_ - - - **C++**: `JsonCPP `_ diff --git a/docs/sdk/messages.rst b/docs/sdk/messages.rst index b5f14ec86..716fea368 100644 --- a/docs/sdk/messages.rst +++ b/docs/sdk/messages.rst @@ -226,6 +226,9 @@ started at all. If the workflow is finished the AusweisApp2 will send a message with a result and an url parameter to indicate the end of an authentication. +.. versionadded:: 1.26.3 + Parameter **reason** added. + - **result**: The final result of authentication. @@ -240,6 +243,8 @@ a result and an url parameter to indicate the end of an authentication. - **message**: The error message. + - **reason**: Unique error code. + - **url**: Refresh url or communication error address. .. code-block:: json @@ -680,7 +685,7 @@ The user must provide a physical card or your application needs to to provide a "virtual" card by calling :ref:`set_card`. After the user or your application inserted a card, the workflow will -continue automatically, unless both the eID functionality and +continue automatically, unless both the eID function and CAN allowed mode are disabled. CAN allowed mode is enabled if the AusweisApp2 is used as SDK and the certificate contains the CAN allowed right. @@ -702,6 +707,7 @@ This message will also be sent if there is no connected card reader. +.. _internal_error: INTERNAL_ERROR ^^^^^^^^^^^^^^ @@ -723,6 +729,7 @@ a bug. Please report this issue to our support! +.. _invalid: INVALID ^^^^^^^ @@ -759,9 +766,9 @@ card reader or removed from a card reader. Your application can explicitly check for card reader with :ref:`get_reader`. -If a workflow is in progress and a card with disabled eID functionality was +If a workflow is in progress and a card with disabled eID function was inserted, this message will still be sent, but the workflow will be paused -until a card with enabled eID functionality is inserted. +until a card with enabled eID function is inserted. .. versionadded:: 1.24.0 Parameter **insertable** added. @@ -786,7 +793,7 @@ until a card with enabled eID functionality is inserted. PUK only. It is not possbible to read this data before a user tries to unblock the PIN. - - **deactivated**: True if eID functionality is deactivated, otherwise false. + - **deactivated**: True if eID function is deactivated, otherwise false. - **retryCounter**: Count of possible retries for the PIN. If you enter a PIN with command :ref:`set_pin` it will be decreased if PIN was incorrect. @@ -893,6 +900,8 @@ or :ref:`run_change_pin`. +.. _unknown_command: + UNKNOWN_COMMAND ^^^^^^^^^^^^^^^ Indicates that the command type is unknown. diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt index fccb7db17..1e9fc145f 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt @@ -112,8 +112,8 @@ endif() set(QT 6.4.1) set(QT_HASH e20b850b6134098a7f2e7701cfddfb213c6cf394b9e848e6fbc5b0e89dcfcc09) -set(OPENSSL 3.0.7) -set(OPENSSL_HASH 83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e) +set(OPENSSL 3.0.8) +set(OPENSSL_HASH 6c13d2bf38fdf31eac3ce2a347073673f5d63263398f1f69d0df4a41253e4b3e) ################################## Files set(QT_FILE qt-everywhere-src-${QT}.tar.xz) @@ -423,6 +423,9 @@ elseif(ANDROID) -android-sdk ${ANDROID_SDK} -android-ndk ${CMAKE_ANDROID_NDK} -android-ndk-platform android-${CMAKE_SYSTEM_VERSION} -android-abis ${CMAKE_ANDROID_ARCH_ABI} -xplatform android-clang) + # ANDROID_TARGET_SDK_VERSION cannot be passed here as Qt has it's own variable and uses the latest in "${ANDROID_SDK_ROOT}/platforms". + # https://code.qt.io/cgit/qt/qtbase.git/tree/cmake/QtPlatformAndroid.cmake?h=6.4#n36 + if(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a") set(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -no-use-gold-linker) endif() diff --git a/libs/patches/qt-connectivity-0001-iOS-NFC-Always-ensure-timeout-after-session-invalida.patch b/libs/patches/qt-connectivity-0001-iOS-NFC-Always-ensure-timeout-after-session-invalida.patch new file mode 100644 index 000000000..f7da165bc --- /dev/null +++ b/libs/patches/qt-connectivity-0001-iOS-NFC-Always-ensure-timeout-after-session-invalida.patch @@ -0,0 +1,140 @@ +From 720768b715d432aa084c9c15b994a396a89968a8 Mon Sep 17 00:00:00 2001 +From: Julian Greilich +Date: Thu, 26 Jan 2023 19:19:21 +0100 +Subject: iOS NFC: Always ensure timeout after session invalidation + +iOS needs some time after invalidating a session before a new session +can be started. Otherwise the NFC dialog of iOS will not show up. + +For restarting a session inside the iOS NearfieldManager, this was +already solved with a timeout of 2 seconds. + +This commit fixes the case, that a user of the Nearfieldmanager +restarts a session manually too fast. + +Change-Id: Ic91ad225a9cab13ba92523f33a19f44af68575a0 +Reviewed-by: Timur Pocheptsov +(cherry picked from commit 849ba86ba9a073a266219b6a39786e20f4f3ed7b) +(cherry picked from commit 5052cd14c28bbf0ff93c465a4e33bf1dbd48c7dd) +--- + src/nfc/qnearfieldmanager_ios.mm | 44 +++++++++++++++++++++---------- + src/nfc/qnearfieldmanager_ios_p.h | 5 +++- + 2 files changed, 34 insertions(+), 15 deletions(-) + +diff --git x/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm y/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm +index 6fd71451..a0651626 100644 +--- x/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm ++++ y/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm +@@ -25,6 +25,10 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() + connect(this, &QNearFieldManagerPrivateImpl::didInvalidateWithError, + this, &QNearFieldManagerPrivateImpl::onDidInvalidateWithError, + Qt::QueuedConnection); ++ ++ sessionTimer.setInterval(2000); ++ sessionTimer.setSingleShot(true); ++ connect(&sessionTimer, &QTimer::timeout, this, &QNearFieldManagerPrivateImpl::onSessionTimer); + } + + QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() +@@ -62,7 +66,7 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection(QNearFieldTarget::Access + if (@available(iOS 13, *)) + if (NFCTagReaderSession.readingAvailable) { + detectionRunning = true; +- startSession(); ++ scheduleSession(); + return true; + } + return false; +@@ -71,16 +75,28 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection(QNearFieldTarget::Access + + void QNearFieldManagerPrivateImpl::stopTargetDetection(const QString &errorMessage) + { +- if (detectionRunning) { +- stopSession(errorMessage); +- detectionRunning = false; +- Q_EMIT targetDetectionStopped(); +- } ++ if (!detectionRunning) ++ return; ++ ++ isSessionScheduled = false; ++ stopSession(errorMessage); ++ detectionRunning = false; ++ Q_EMIT targetDetectionStopped(); + } + ++void QNearFieldManagerPrivateImpl::scheduleSession() ++{ ++ if (sessionTimer.isActive()) { ++ isSessionScheduled = true; ++ return; ++ } ++ ++ startSession(); ++} + + void QNearFieldManagerPrivateImpl::startSession() + { ++ isSessionScheduled = false; + if (detectionRunning) + if (@available(iOS 13, *)) + [delegate startSession]; +@@ -132,17 +148,11 @@ void QNearFieldManagerPrivateImpl::onTargetLost(QNearFieldTargetPrivateImpl *tar + void QNearFieldManagerPrivateImpl::onDidInvalidateWithError(bool doRestart) + { + clearTargets(); ++ sessionTimer.start(); + + if (detectionRunning && doRestart) + { +- if (!isRestarting) { +- isRestarting = true; +- using namespace std::chrono_literals; +- QTimer::singleShot(2s, this, [this](){ +- isRestarting = false; +- startSession(); +- }); +- } ++ scheduleSession(); + return; + } + +@@ -150,4 +160,10 @@ void QNearFieldManagerPrivateImpl::onDidInvalidateWithError(bool doRestart) + Q_EMIT targetDetectionStopped(); + } + ++void QNearFieldManagerPrivateImpl::onSessionTimer() ++{ ++ if (isSessionScheduled) ++ scheduleSession(); ++} ++ + QT_END_NAMESPACE +diff --git x/qtconnectivity/src/nfc/qnearfieldmanager_ios_p.h y/qtconnectivity/src/nfc/qnearfieldmanager_ios_p.h +index 6aa1574e..b3668ff6 100644 +--- x/qtconnectivity/src/nfc/qnearfieldmanager_ios_p.h ++++ y/qtconnectivity/src/nfc/qnearfieldmanager_ios_p.h +@@ -54,9 +54,11 @@ Q_SIGNALS: + private: + QT_MANGLE_NAMESPACE(QIosTagReaderDelegate) *delegate API_AVAILABLE(ios(13.0)) = nullptr; + bool detectionRunning = false; +- bool isRestarting = false; ++ bool isSessionScheduled = false; ++ QTimer sessionTimer; + QList detectedTargets; + ++ void scheduleSession(); + void startSession(); + void stopSession(const QString &error); + void clearTargets(); +@@ -65,6 +67,7 @@ private Q_SLOTS: + void onTagDiscovered(void *target); + void onTargetLost(QNearFieldTargetPrivateImpl *target); + void onDidInvalidateWithError(bool doRestart); ++ void onSessionTimer(); + }; + + +-- +2.39.1 + diff --git a/libs/patches/qt-declarative-0001-qmlformat-fix-omitting-some-comments-while-reformatt.patch b/libs/patches/qt-declarative-0001-qmlformat-fix-omitting-some-comments-while-reformatt.patch new file mode 100644 index 000000000..7ad14c863 --- /dev/null +++ b/libs/patches/qt-declarative-0001-qmlformat-fix-omitting-some-comments-while-reformatt.patch @@ -0,0 +1,102 @@ +From f5b5a974f6ad854008c587c9494ae46785e21899 Mon Sep 17 00:00:00 2001 +From: Semih Yavuz +Date: Wed, 18 Jan 2023 15:36:23 +0100 +Subject: qmlformat: fix omitting some comments while reformatting + +We rewrite comments associated to a node on the preVisit call +(if they were marked as preComment), or postVisit( if comments were +marked as postComments) of the reformatter. If the comment +associated with a patternProperty kind of node, neither of these +functions are called. Add missing call to previsit/postVist +in the pattern property node visit. + +Pick-to: 6.4 6.5 +Fixes: QTBUG-109074 +Change-Id: If57968b3f5dbd83aa23dc2cd2bca3608ee841d49 +Reviewed-by: Sami Shalayel +Reviewed-by: Ulf Hermann +(cherry picked from commit 444d4f1f3f27a81996d9cbcc0642040b68728260) +--- + src/qmldom/qqmldomreformatter.cpp | 2 ++ + .../qmlformat/data/dontRemoveComments.formatted.qml | 13 +++++++++++++ + .../auto/qml/qmlformat/data/dontRemoveComments.qml | 13 +++++++++++++ + tests/auto/qml/qmlformat/tst_qmlformat.cpp | 3 +++ + 4 files changed, 31 insertions(+) + create mode 100644 tests/auto/qml/qmlformat/data/dontRemoveComments.formatted.qml + create mode 100644 tests/auto/qml/qmlformat/data/dontRemoveComments.qml + +diff --git x/qtdeclarative/src/qmldom/qqmldomreformatter.cpp y/qtdeclarative/src/qmldom/qqmldomreformatter.cpp +index bb76f8f772..3dfacfc84e 100644 +--- x/qtdeclarative/src/qmldom/qqmldomreformatter.cpp ++++ y/qtdeclarative/src/qmldom/qqmldomreformatter.cpp +@@ -301,6 +301,7 @@ protected: + for (PatternPropertyList *it = ast; it; it = it->next) { + PatternProperty *assignment = AST::cast(it->property); + if (assignment) { ++ preVisit(assignment); + bool isStringLike = AST::cast(assignment->name) + || cast(assignment->name); + if (isStringLike) +@@ -316,6 +317,7 @@ protected: + accept(assignment->initializer); + if (it->next) + newLine(); ++ postVisit(assignment); + continue; + } + PatternPropertyList *getterSetter = AST::cast(it->next); +diff --git x/qtdeclarative/tests/auto/qml/qmlformat/data/dontRemoveComments.formatted.qml y/qtdeclarative/tests/auto/qml/qmlformat/data/dontRemoveComments.formatted.qml +new file mode 100644 +index 0000000000..0c7a2829c9 +--- /dev/null ++++ y/qtdeclarative/tests/auto/qml/qmlformat/data/dontRemoveComments.formatted.qml +@@ -0,0 +1,13 @@ ++Item { ++ property var test: [{ ++ // Testing ++ "foo": "bar" ++ }] ++ ++ onTestChanged: { ++ fooBar(test, { ++ // Testing ++ "foo": "bar" ++ }); ++ } ++} +diff --git x/qtdeclarative/tests/auto/qml/qmlformat/data/dontRemoveComments.qml y/qtdeclarative/tests/auto/qml/qmlformat/data/dontRemoveComments.qml +new file mode 100644 +index 0000000000..1797834879 +--- /dev/null ++++ y/qtdeclarative/tests/auto/qml/qmlformat/data/dontRemoveComments.qml +@@ -0,0 +1,13 @@ ++Item { ++ property var test: [{ ++// Testing ++ "foo": "bar" ++ }] ++ ++ onTestChanged: { ++ fooBar(test, { ++ // Testing ++ "foo": "bar" ++ }); ++ } ++} +diff --git x/qtdeclarative/tests/auto/qml/qmlformat/tst_qmlformat.cpp y/qtdeclarative/tests/auto/qml/qmlformat/tst_qmlformat.cpp +index 9d7beb23a7..7755095acd 100644 +--- x/qtdeclarative/tests/auto/qml/qmlformat/tst_qmlformat.cpp ++++ y/qtdeclarative/tests/auto/qml/qmlformat/tst_qmlformat.cpp +@@ -276,6 +276,9 @@ void TestQmlformat::testFormat_data() + QTest::newRow("forWithLet") + << "forWithLet.qml" + << "forWithLet.formatted.qml" << QStringList {} << RunOption::OnCopy; ++ QTest::newRow("dontRemoveComments") ++ << "dontRemoveComments.qml" ++ << "dontRemoveComments.formatted.qml" << QStringList {} << RunOption::OnCopy; + } + + void TestQmlformat::testFormat() +-- +2.39.1 + diff --git a/resources/ausweisapp.qrc b/resources/ausweisapp.qrc index 917a119f9..9890af022 100644 --- a/resources/ausweisapp.qrc +++ b/resources/ausweisapp.qrc @@ -20,12 +20,17 @@ images/material_refresh.svg images/material_history.svg images/material_alert.svg + images/material_block.svg + images/material_live_help.svg + images/material_person.svg images/checkbox_indicator.svg images/npa.svg images/id_card.png images/signature.jp2 - images/pin_letter_pinpuk_different_page.svg - images/pin_letter_pinpuk_same_page.svg + images/pin_letter_pinpuk.svg + images/pin_letter_pinpuk_red_bar.svg + images/pin_letter_pinpuk_red_bar_puk.svg + images/pin_person.svg images/logo_beta_background.svg images/logo_beta_testing.svg images/status_error.svg @@ -55,6 +60,10 @@ images/provider/other_bg.svg images/provider/other_button.svg updatable-files/supported-providers.json + images/icon_five_digit_pin.svg + images/icon_six_digit_pin_white.svg + images/icon_six_digit_pin_blue.svg + images/icon_ten_digit_puk.svg images/icon_remote_inactive.svg images/icon_remote_0.svg images/icon_remote_25.svg diff --git a/resources/ausweisapp_desktop.qrc b/resources/ausweisapp_desktop.qrc index a64415529..02422ee37 100644 --- a/resources/ausweisapp_desktop.qrc +++ b/resources/ausweisapp_desktop.qrc @@ -4,7 +4,6 @@ images/desktop/titlebar_arrow.svg images/desktop/material_assistant.svg images/desktop/material_bug_report.svg - images/desktop/material_live_help.svg images/desktop/material_new_releases.svg images/desktop/material_rate_review.svg images/desktop/material_save.svg @@ -23,10 +22,6 @@ images/reader/default_reader.png images/reader/default_reader_mit_ausweis.png updatable-files/supported-readers.json - updatable-files/reader/img_ACS_ACR122U.png - updatable-files/reader/img_ACS_ACR122U_mit_ausweis.png - updatable-files/reader/img_ACS_ACR1252U.png - updatable-files/reader/img_ACS_ACR1252U_mit_ausweis.png updatable-files/reader/img_ACS_ACR1281U.png updatable-files/reader/img_ACS_ACR1281U_mit_ausweis.png updatable-files/reader/img_Cherry_TC_1200.png @@ -47,8 +42,6 @@ updatable-files/reader/img_HID_Omnikey_542x_mit_ausweis.png updatable-files/reader/img_HID_Omnikey_Mobile_Reader_502X_CL.png updatable-files/reader/img_HID_Omnikey_Mobile_Reader_502X_CL_mit_ausweis.png - updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL.png - updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL_mit_ausweis.png updatable-files/reader/img_Identive_XXXX_F.png updatable-files/reader/img_Identive_XXXX_F_mit_ausweis.png updatable-files/reader/img_Identive_Cloud_4700_F.png @@ -59,8 +52,6 @@ updatable-files/reader/img_Identive_SCL011_mit_ausweis.png updatable-files/reader/img_Identive_SCL3711.png updatable-files/reader/img_Identive_SCL3711_mit_ausweis.png - updatable-files/reader/img_Identive_SDI010.png - updatable-files/reader/img_Identive_SDI010_mit_ausweis.png updatable-files/reader/img_Identive_SDI011.png updatable-files/reader/img_Identive_SDI011_mit_ausweis.png updatable-files/reader/img_KOBIL_ID_Token.png diff --git a/resources/ausweisapp_mobile.qrc b/resources/ausweisapp_mobile.qrc index 4f36462a2..a6ba90344 100644 --- a/resources/ausweisapp_mobile.qrc +++ b/resources/ausweisapp_mobile.qrc @@ -11,8 +11,6 @@ images/mobile/material_backspace.svg images/mobile/material_view_headline.svg images/mobile/material_home.svg - images/mobile/material_five.svg - images/mobile/material_six.svg images/mobile/phone_smart.svg images/mobile/phone_nfc.svg images/mobile/phone_nfc_with_card.svg diff --git a/resources/images/icon_five_digit_pin.svg b/resources/images/icon_five_digit_pin.svg new file mode 100644 index 000000000..a8a0d5274 --- /dev/null +++ b/resources/images/icon_five_digit_pin.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/icon_six_digit_pin_blue.svg b/resources/images/icon_six_digit_pin_blue.svg new file mode 100644 index 000000000..86e198d10 --- /dev/null +++ b/resources/images/icon_six_digit_pin_blue.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/icon_six_digit_pin_white.svg b/resources/images/icon_six_digit_pin_white.svg new file mode 100644 index 000000000..b667935f9 --- /dev/null +++ b/resources/images/icon_six_digit_pin_white.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/icon_ten_digit_puk.svg b/resources/images/icon_ten_digit_puk.svg new file mode 100644 index 000000000..0035185dc --- /dev/null +++ b/resources/images/icon_ten_digit_puk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/material_block.svg b/resources/images/material_block.svg new file mode 100644 index 000000000..62df84f09 --- /dev/null +++ b/resources/images/material_block.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/desktop/material_live_help.svg b/resources/images/material_live_help.svg similarity index 100% rename from resources/images/desktop/material_live_help.svg rename to resources/images/material_live_help.svg diff --git a/resources/images/material_person.svg b/resources/images/material_person.svg new file mode 100644 index 000000000..a65b4a8e0 --- /dev/null +++ b/resources/images/material_person.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/mobile/material_five.svg b/resources/images/mobile/material_five.svg deleted file mode 100644 index 6c6345ce9..000000000 --- a/resources/images/mobile/material_five.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/resources/images/mobile/material_six.svg b/resources/images/mobile/material_six.svg deleted file mode 100644 index a5e7038e9..000000000 --- a/resources/images/mobile/material_six.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/resources/images/pin_letter_pinpuk_same_page.svg b/resources/images/pin_letter_pinpuk.svg similarity index 99% rename from resources/images/pin_letter_pinpuk_same_page.svg rename to resources/images/pin_letter_pinpuk.svg index bc4bb22b7..7ee0b7364 100644 --- a/resources/images/pin_letter_pinpuk_same_page.svg +++ b/resources/images/pin_letter_pinpuk.svg @@ -14,7 +14,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/resources/images/pin_letter_pinpuk_different_page.svg b/resources/images/pin_letter_pinpuk_different_page.svg deleted file mode 100644 index f4370684e..000000000 --- a/resources/images/pin_letter_pinpuk_different_page.svg +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/images/pin_letter_pinpuk_red_bar.svg b/resources/images/pin_letter_pinpuk_red_bar.svg new file mode 100644 index 000000000..d5911235a --- /dev/null +++ b/resources/images/pin_letter_pinpuk_red_bar.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/pin_letter_pinpuk_red_bar_puk.svg b/resources/images/pin_letter_pinpuk_red_bar_puk.svg new file mode 100644 index 000000000..b25eeaf2e --- /dev/null +++ b/resources/images/pin_letter_pinpuk_red_bar_puk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/pin_person.svg b/resources/images/pin_person.svg new file mode 100644 index 000000000..182b09fd5 --- /dev/null +++ b/resources/images/pin_person.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/resources/jenkins/docker/android/Dockerfile b/resources/jenkins/docker/android/Dockerfile index 000db6934..da95d2aee 100644 --- a/resources/jenkins/docker/android/Dockerfile +++ b/resources/jenkins/docker/android/Dockerfile @@ -22,7 +22,7 @@ RUN wget https://github.com/Kitware/CMake/releases/download/v$CMAKE/cmake-$CMAKE RUN mkdir -p /tmp/dl && cd /tmp/dl && wget -O sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CMDLINE_TOOLS}_latest.zip && \ unzip sdk.zip && \ - yes | /tmp/dl/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_SDK_ROOT "cmdline-tools;6.0" "build-tools;30.0.3" "platforms;android-31" "platforms;android-33" "ndk;${ANDROID_NDK_VERSION}" && \ + yes | /tmp/dl/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_SDK_ROOT "cmdline-tools;6.0" "build-tools;30.0.3" "platforms;android-33" "ndk;${ANDROID_NDK_VERSION}" && \ rm -rf /tmp/dl USER governikus diff --git a/resources/jenkins/dsl/Builds/Build_Docs.groovy b/resources/jenkins/dsl/Builds/Build_Docs.groovy index 16c092f9a..3ce81067d 100644 --- a/resources/jenkins/dsl/Builds/Build_Docs.groovy +++ b/resources/jenkins/dsl/Builds/Build_Docs.groovy @@ -4,7 +4,7 @@ def j = new Build ( name: 'Docs', label: 'Docs', - artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html' + artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html,build/docs/**/*.inv' ).generate(this) diff --git a/resources/jenkins/dsl/Builds/Build_SonarQube.groovy b/resources/jenkins/dsl/Builds/Build_SonarQube.groovy index 681e5d75a..0e426d816 100644 --- a/resources/jenkins/dsl/Builds/Build_SonarQube.groovy +++ b/resources/jenkins/dsl/Builds/Build_SonarQube.groovy @@ -37,7 +37,7 @@ j.with shell('$WORKSPACE/sonarqubetools/sonar-build-wrapper/build-wrapper-linux-x86-64 --out-dir build cmake --build build') - shell('ctest -E qml_ --test-dir build --output-on-failure') + shell('ctest -LE qml -E Test_ui_qml_UIPlugInQml --test-dir build --output-on-failure') shell('cmake --build build --target gcovr.sonar') diff --git a/resources/jenkins/dsl/Builds/Build_Win64_GNU.groovy b/resources/jenkins/dsl/Builds/Build_Win64_GNU.groovy index 4beeeb17f..c8225367d 100644 --- a/resources/jenkins/dsl/Builds/Build_Win64_GNU.groovy +++ b/resources/jenkins/dsl/Builds/Build_Win64_GNU.groovy @@ -12,14 +12,6 @@ def j = new Build j.with { - wrappers - { - environmentVariables - { - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') - } - } - steps { batchFile('cd source & cmake --preset ci-win') diff --git a/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI.groovy b/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI.groovy index b943d1763..7a145aa31 100644 --- a/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI.groovy +++ b/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI.groovy @@ -12,14 +12,6 @@ def j = new Build j.with { - wrappers - { - environmentVariables - { - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') - } - } - steps { batchFile('cd source & cmake --preset ci-win-release') diff --git a/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI_dev.groovy b/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI_dev.groovy index 4033ac11c..0f7a9e116 100644 --- a/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI_dev.groovy +++ b/resources/jenkins/dsl/Builds/Build_Win64_GNU_MSI_dev.groovy @@ -12,14 +12,6 @@ def j = new Build j.with { - wrappers - { - environmentVariables - { - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') - } - } - steps { batchFile('cd source & cmake --preset ci-win-debug') diff --git a/resources/jenkins/dsl/Libraries/Libs_Win64_GNU.groovy b/resources/jenkins/dsl/Libraries/Libs_Win64_GNU.groovy index 56cb77500..9d49d9d4d 100644 --- a/resources/jenkins/dsl/Libraries/Libs_Win64_GNU.groovy +++ b/resources/jenkins/dsl/Libraries/Libs_Win64_GNU.groovy @@ -17,7 +17,6 @@ j.with environmentVariables { env('MSYS2_PATH_TYPE', 'inherit') - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') } } diff --git a/resources/jenkins/dsl/Libraries/Libs_Win64_GNU_dev.groovy b/resources/jenkins/dsl/Libraries/Libs_Win64_GNU_dev.groovy index ffc17388b..91bc7d4d9 100644 --- a/resources/jenkins/dsl/Libraries/Libs_Win64_GNU_dev.groovy +++ b/resources/jenkins/dsl/Libraries/Libs_Win64_GNU_dev.groovy @@ -17,7 +17,6 @@ j.with environmentVariables { env('MSYS2_PATH_TYPE', 'inherit') - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') } } diff --git a/resources/jenkins/dsl/Releases/Release_Docs.groovy b/resources/jenkins/dsl/Releases/Release_Docs.groovy index 71423f0b2..43513609a 100644 --- a/resources/jenkins/dsl/Releases/Release_Docs.groovy +++ b/resources/jenkins/dsl/Releases/Release_Docs.groovy @@ -4,7 +4,7 @@ def j = new Release ( name: 'Docs', label: 'Docs', - artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html' + artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html,build/docs/**/*.inv' ).generate(this) diff --git a/resources/jenkins/dsl/Releases/Release_Win64_GNU.groovy b/resources/jenkins/dsl/Releases/Release_Win64_GNU.groovy index 9f4485b18..4fc281a17 100644 --- a/resources/jenkins/dsl/Releases/Release_Win64_GNU.groovy +++ b/resources/jenkins/dsl/Releases/Release_Win64_GNU.groovy @@ -12,14 +12,6 @@ def j = new Release j.with { - wrappers - { - environmentVariables - { - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') - } - } - steps { batchFile('cd source & cmake --preset ci-win-release') diff --git a/resources/jenkins/dsl/Review_Trigger.groovy b/resources/jenkins/dsl/Review_Trigger.groovy index a011f5a6b..e5aac4ba3 100644 --- a/resources/jenkins/dsl/Review_Trigger.groovy +++ b/resources/jenkins/dsl/Review_Trigger.groovy @@ -3,29 +3,5 @@ import common.RootTrigger def j = new RootTrigger ( jobName: '_Review_Trigger_', - triggerJob: '${REVIEW_BRANCH}__Review_Trigger' + triggerJob: '${REVIEWBOARD_REVIEW_BRANCH}__Review_Trigger' ).generate(this) - - -job('_Review_Check_') -{ - logRotator(3, 50) - label('Trigger') - - triggers - { - cron('H/10 * * * *') - } - - configure - { - project -> project / 'builders' << 'org.jenkinsci.plugins.jenkinsreviewbot.ReviewboardPollingBuilder' { - reviewbotJobName '_Review_Trigger_' - checkBackPeriod '2' - reviewbotRepoId '1' - restrictByUser 'true' - disableAdvanceNotice 'true' - processedReviewDates '' - } - } -} diff --git a/resources/jenkins/dsl/Review_Trigger_Configuration.groovy b/resources/jenkins/dsl/Review_Trigger_Configuration.groovy index 7677034d8..65ea8f047 100644 --- a/resources/jenkins/dsl/Review_Trigger_Configuration.groovy +++ b/resources/jenkins/dsl/Review_Trigger_Configuration.groovy @@ -3,5 +3,5 @@ import common.RootTrigger def j = new RootTrigger ( jobName: '_Review_Trigger_Configuration_', - triggerJob: '${REVIEW_BRANCH}__Review_Trigger_Configuration' + triggerJob: '${REVIEWBOARD_REVIEW_BRANCH}__Review_Trigger_Configuration' ).generate(this) diff --git a/resources/jenkins/dsl/Review_Trigger_Libs.groovy b/resources/jenkins/dsl/Review_Trigger_Libs.groovy index 42840ec61..35f282c3b 100644 --- a/resources/jenkins/dsl/Review_Trigger_Libs.groovy +++ b/resources/jenkins/dsl/Review_Trigger_Libs.groovy @@ -3,5 +3,5 @@ import common.RootTrigger def j = new RootTrigger ( jobName: '_Review_Trigger_Libs_', - triggerJob: '${REVIEW_BRANCH}__Review_Trigger_Libs' + triggerJob: '${REVIEWBOARD_REVIEW_BRANCH}__Review_Trigger_Libs' ).generate(this) diff --git a/resources/jenkins/dsl/Reviews/Review_Docs.groovy b/resources/jenkins/dsl/Reviews/Review_Docs.groovy index cd3d10ee4..73de84eb5 100644 --- a/resources/jenkins/dsl/Reviews/Review_Docs.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Docs.groovy @@ -4,7 +4,7 @@ def j = new Review ( name: 'Docs', label: 'Docs', - artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html' + artifacts: 'build/*.pdf,build/docs/**/*.pdf,build/docs/**/*.tar.xz,build/docs/notes/singlehtml/**/appcast.html,build/docs/**/*.inv' ).generate(this) diff --git a/resources/jenkins/dsl/Reviews/Review_Formatting.groovy b/resources/jenkins/dsl/Reviews/Review_Formatting.groovy index 7f0e55506..54bd2604e 100644 --- a/resources/jenkins/dsl/Reviews/Review_Formatting.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Formatting.groovy @@ -52,6 +52,8 @@ j.with exit 0 fi '''.stripIndent().trim()) + + shell('cd source; cmake -DCMD=CHECK_FAILURE_CODES -P cmake/cmd.cmake') } publishers diff --git a/resources/jenkins/dsl/Reviews/Review_Libs_Win64_GNU.groovy b/resources/jenkins/dsl/Reviews/Review_Libs_Win64_GNU.groovy index 0e230c2e1..b4ae43dbf 100644 --- a/resources/jenkins/dsl/Reviews/Review_Libs_Win64_GNU.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Libs_Win64_GNU.groovy @@ -17,7 +17,6 @@ j.with environmentVariables { env('MSYS2_PATH_TYPE', 'inherit') - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') } } diff --git a/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy b/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy index a1209ae1c..de8179cf2 100644 --- a/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy +++ b/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy @@ -19,7 +19,6 @@ j.with environmentVariables { env("XDG_RUNTIME_DIR", '$WORKSPACE/tmp') - env("REVIEW_URL", '${review.url}') env("SONAR_USER_HOME", '$WORKSPACE/cache/sonar') } } @@ -42,18 +41,16 @@ j.with shell('$WORKSPACE/sonarqubetools/sonar-build-wrapper/build-wrapper-linux-x86-64 --out-dir build cmake --build build') - shell('ctest -E qml_ --test-dir build --output-on-failure') + shell('ctest -LE qml -E Test_ui_qml_UIPlugInQml --test-dir build --output-on-failure') shell('cmake --build build --target gcovr.sonar') shell(strip('''\ - REVIEW_ID=${REVIEW_URL%/}; - REVIEW_ID=${REVIEW_ID##*/}; cd build; $WORKSPACE/sonarqubetools/sonar-scanner/bin/sonar-scanner -Dsonar.scanner.metadataFilePath=${WORKSPACE}/tmp/sonar-metadata.txt - -Dsonar.pullrequest.key=${REVIEW_ID} - -Dsonar.pullrequest.branch=${REVIEW_URL} + -Dsonar.pullrequest.key=${REVIEWBOARD_REVIEW_ID} + -Dsonar.pullrequest.branch=${REVIEWBOARD_REVIEW_ID} -Dsonar.pullrequest.base=${MERCURIAL_REVISION_BRANCH} -Dsonar.login=${SONARQUBE_TOKEN} -Dsonar.qualitygate.wait=true diff --git a/resources/jenkins/dsl/Reviews/Review_Trigger.groovy b/resources/jenkins/dsl/Reviews/Review_Trigger.groovy index 8f6a71124..f556aaedb 100644 --- a/resources/jenkins/dsl/Reviews/Review_Trigger.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Trigger.groovy @@ -1,7 +1,6 @@ import common.Trigger import common.Constants import common.Build.JobType -import static common.Constants.createEnvMap import static common.Constants.createReviewMessage import static common.Constants.getEnvNumber @@ -30,8 +29,6 @@ String getName(String name) return "${MERCURIAL_REVISION_BRANCH}_Review_" + name } -def envMap = createEnvMap(getJobs(), this.&getName) - def reviewMessage = createReviewMessage(getJobs(), this.&getName) + ' | Libraries: ${Libraries}' + ' | SonarQube Analysis: ${SONARQUBE_ANALYSIS_MESSAGE}' @@ -51,13 +48,14 @@ j.with { environmentVariables { - envs(envMap) env('SONARQUBE_ANALYSIS_MESSAGE', '') } } steps { + shell('cd source; resources/jenkins/notify_rb.sh') + shell('cd source; hg import --no-commit ../patch.diff') phase('General', 'UNSTABLE') @@ -157,12 +155,31 @@ j.with } } - configure - { - project -> project / 'publishers' << 'org.jenkinsci.plugins.jenkinsreviewbot.ReviewboardNotifier' { - shipItOnSuccess 'false' - useMarkdown 'true' - customMessage "${reviewMessage}" + publishers { + postBuildScript + { + markBuildUnstable(true) + buildSteps + { + postBuildStep + { + stopOnFailure(false) + results(['SUCCESS', 'FAILURE', 'UNSTABLE', 'ABORTED', 'NOT_BUILT']) + buildSteps + { + envInjectBuilder + { + propertiesFilePath('') + propertiesContent("REVIEWBOARD_MSG=" + reviewMessage) + } + + shell + { + command('cd source; resources/jenkins/notify_rb.sh') + } + } + } + } } } } diff --git a/resources/jenkins/dsl/Reviews/Review_Trigger_Configuration.groovy b/resources/jenkins/dsl/Reviews/Review_Trigger_Configuration.groovy index 70ca0658c..e25460b34 100644 --- a/resources/jenkins/dsl/Reviews/Review_Trigger_Configuration.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Trigger_Configuration.groovy @@ -1,7 +1,6 @@ import common.Trigger import common.Constants import common.Build.JobType -import static common.Constants.createEnvMap import static common.Constants.createReviewMessage import static common.Constants.getEnvNumber @@ -15,7 +14,6 @@ String getName(String name) return "${MERCURIAL_REVISION_BRANCH}_Review_" + name } -def envMap = createEnvMap(getJobs(), this.&getName) def reviewMessage = createReviewMessage(getJobs(), this.&getName) @@ -30,16 +28,10 @@ j.with { concurrentBuild() - wrappers - { - environmentVariables - { - envs(envMap) - } - } - steps { + shell('cd source; resources/jenkins/notify_rb.sh') + shell('cd source; hg import --no-commit ../patch.diff') phase('General', 'UNSTABLE') @@ -53,12 +45,31 @@ j.with } } - configure - { - project -> project / 'publishers' << 'org.jenkinsci.plugins.jenkinsreviewbot.ReviewboardNotifier' { - shipItOnSuccess 'false' - useMarkdown 'true' - customMessage "${reviewMessage}" + publishers { + postBuildScript + { + markBuildUnstable(true) + buildSteps + { + postBuildStep + { + stopOnFailure(false) + results(['SUCCESS', 'FAILURE', 'UNSTABLE', 'ABORTED', 'NOT_BUILT']) + buildSteps + { + envInjectBuilder + { + propertiesFilePath('') + propertiesContent("REVIEWBOARD_MSG=" + reviewMessage) + } + + shell + { + command('cd source; resources/jenkins/notify_rb.sh') + } + } + } + } } } } diff --git a/resources/jenkins/dsl/Reviews/Review_Trigger_Libs.groovy b/resources/jenkins/dsl/Reviews/Review_Trigger_Libs.groovy index 6bbc6d3b7..dcf33bcc6 100644 --- a/resources/jenkins/dsl/Reviews/Review_Trigger_Libs.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Trigger_Libs.groovy @@ -1,7 +1,6 @@ import common.Trigger import common.Constants import common.Build.JobType -import static common.Constants.createEnvMap import static common.Constants.createReviewMessage def getJobs() @@ -27,7 +26,6 @@ String getName(String name) return "${MERCURIAL_REVISION_BRANCH}_Review_Libs_" + name } -def envMap = createEnvMap(getJobs(), this.&getName) def reviewMessage = createReviewMessage(getJobs(), this.&getName) @@ -42,16 +40,10 @@ def j = new Trigger j.with { - wrappers - { - environmentVariables - { - envs(envMap) - } - } - steps { + shell('cd source; resources/jenkins/notify_rb.sh') + shell('cd source; hg import --no-commit ../patch.diff') phase('Libraries') @@ -131,12 +123,31 @@ j.with } } - configure - { - project -> project / 'publishers' << 'org.jenkinsci.plugins.jenkinsreviewbot.ReviewboardNotifier' { - shipItOnSuccess 'false' - useMarkdown 'true' - customMessage "${reviewMessage}" + publishers { + postBuildScript + { + markBuildUnstable(true) + buildSteps + { + postBuildStep + { + stopOnFailure(false) + results(['SUCCESS', 'FAILURE', 'UNSTABLE', 'ABORTED', 'NOT_BUILT']) + buildSteps + { + envInjectBuilder + { + propertiesFilePath('') + propertiesContent("REVIEWBOARD_MSG=" + reviewMessage) + } + + shell + { + command('cd source; resources/jenkins/notify_rb.sh') + } + } + } + } } } } diff --git a/resources/jenkins/dsl/Reviews/Review_Win64_GNU.groovy b/resources/jenkins/dsl/Reviews/Review_Win64_GNU.groovy index 3ee73fbd2..ff6c8863d 100644 --- a/resources/jenkins/dsl/Reviews/Review_Win64_GNU.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Win64_GNU.groovy @@ -14,14 +14,6 @@ def j = new Review j.with { - wrappers - { - environmentVariables - { - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') - } - } - steps { batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake') diff --git a/resources/jenkins/dsl/Reviews/Review_Win64_GNU_MSI.groovy b/resources/jenkins/dsl/Reviews/Review_Win64_GNU_MSI.groovy index faccb5a44..e744abe49 100644 --- a/resources/jenkins/dsl/Reviews/Review_Win64_GNU_MSI.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Win64_GNU_MSI.groovy @@ -12,14 +12,6 @@ def j = new Review j.with { - wrappers - { - environmentVariables - { - env('PATH', '${COMPILER_${MERCURIAL_REVISION_BRANCH}};$PATH') - } - } - steps { batchFile('cd source & cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake') diff --git a/resources/jenkins/dsl/common/Constants.groovy b/resources/jenkins/dsl/common/Constants.groovy index c30b383cd..da5912437 100644 --- a/resources/jenkins/dsl/common/Constants.groovy +++ b/resources/jenkins/dsl/common/Constants.groovy @@ -7,6 +7,8 @@ class Constants static final AndroidArchAAR = ["arm64-v8a"] static final AndroidArch = (AndroidArchAPK + AndroidArchAAR).unique() + static final ReviewBoardServer = "rb.governikus.de" + static String strip(String content) { content = content.stripIndent().trim() diff --git a/resources/jenkins/dsl/common/LibraryReview.groovy b/resources/jenkins/dsl/common/LibraryReview.groovy index 617a832d6..36af22d6b 100644 --- a/resources/jenkins/dsl/common/LibraryReview.groovy +++ b/resources/jenkins/dsl/common/LibraryReview.groovy @@ -3,6 +3,7 @@ package common import javaposse.jobdsl.dsl.Job import javaposse.jobdsl.dsl.DslFactory +import common.Constants import common.Library class LibraryReview extends Library @@ -20,12 +21,15 @@ class LibraryReview extends Library parameters { fileParam('patch.diff', 'Patch file that will be applied and tested') - stringParam('review.url', '', 'Review URL that will be used for description (optional)') + stringParam('REVIEWBOARD_SERVER', Constants.ReviewBoardServer, 'Server') + stringParam('REVIEWBOARD_REVIEW_ID', '', 'ReviewID') + stringParam('REVIEWBOARD_DIFF_REVISION', '', 'ReviewDiffRev') + stringParam('REVIEWBOARD_STATUS_UPDATE_ID', '', 'StatusUpdateID') } steps { - buildDescription('', '${review.url}') + buildDescription('', '${REVIEWBOARD_REVIEW_ID} / ${REVIEWBOARD_DIFF_REVISION}') } } diff --git a/resources/jenkins/dsl/common/RootTrigger.groovy b/resources/jenkins/dsl/common/RootTrigger.groovy index 36e5b25d6..a89c8e957 100644 --- a/resources/jenkins/dsl/common/RootTrigger.groovy +++ b/resources/jenkins/dsl/common/RootTrigger.groovy @@ -3,6 +3,8 @@ package common import javaposse.jobdsl.dsl.Job import javaposse.jobdsl.dsl.DslFactory +import common.Constants + class RootTrigger { String jobName @@ -17,18 +19,20 @@ class RootTrigger logRotator(14, -1) label('Trigger') - configure + parameters { - project -> project / 'properties' / 'hudson.model.ParametersDefinitionProperty' / 'parameterDefinitions' << 'org.jenkinsci.plugins.jenkinsreviewbot.ReviewboardParameterDefinition' { - name('review.url') - defaultValue('') - description('ID of review request') - } + stringParam('REVIEWBOARD_SERVER', Constants.ReviewBoardServer, 'Server') + stringParam('REVIEWBOARD_REVIEW_ID', '', 'ReviewID') + stringParam('REVIEWBOARD_DIFF_REVISION', '', 'ReviewDiffRev') + stringParam('REVIEWBOARD_REVIEW_BRANCH', '', 'ReviewBranch') + stringParam('REVIEWBOARD_STATUS_UPDATE_ID', '', 'StatusUpdateID') } steps { - buildDescription('', '${REVIEW_URL}') + buildDescription('', '${REVIEWBOARD_REVIEW_ID} / ${REVIEWBOARD_DIFF_REVISION}') + + shell('rbt patch --write patch.diff --server ${REVIEWBOARD_SERVER} --diff-revision ${REVIEWBOARD_DIFF_REVISION} ${REVIEWBOARD_REVIEW_ID}') downstreamParameterized { @@ -36,7 +40,10 @@ class RootTrigger { parameters { - predefinedProp('review.url', '${REVIEW_URL}') + predefinedProp('REVIEWBOARD_SERVER', '${REVIEWBOARD_SERVER}') + predefinedProp('REVIEWBOARD_REVIEW_ID', '${REVIEWBOARD_REVIEW_ID}') + predefinedProp('REVIEWBOARD_DIFF_REVISION', '${REVIEWBOARD_DIFF_REVISION}') + predefinedProp('REVIEWBOARD_STATUS_UPDATE_ID', '${REVIEWBOARD_STATUS_UPDATE_ID}') } parameterFactories diff --git a/resources/jenkins/dsl/common/Trigger.groovy b/resources/jenkins/dsl/common/Trigger.groovy index 9d27fef3c..f1fc2ddc4 100644 --- a/resources/jenkins/dsl/common/Trigger.groovy +++ b/resources/jenkins/dsl/common/Trigger.groovy @@ -4,6 +4,7 @@ import javaposse.jobdsl.dsl.Job import javaposse.jobdsl.dsl.DslFactory import common.Build +import common.Constants class Trigger extends Build { @@ -23,13 +24,16 @@ class Trigger extends Build parameters { fileParam('patch.diff', 'Patch file that will be applied and tested') + stringParam('REVIEWBOARD_SERVER', Constants.ReviewBoardServer, 'Server') + stringParam('REVIEWBOARD_REVIEW_ID', '', 'ReviewID') + stringParam('REVIEWBOARD_DIFF_REVISION', '', 'ReviewDiffRev') + stringParam('REVIEWBOARD_STATUS_UPDATE_ID', '', 'StatusUpdateID') stringParam('Libraries', dslFactory.MERCURIAL_REVISION_BRANCH, 'Copy library artifacts from this job (prefix)') - stringParam('review.url', '', 'Review URL that will be used for description (optional)') } steps { - buildDescription('', '${review.url}') + buildDescription('', '${REVIEWBOARD_REVIEW_ID} / ${REVIEWBOARD_DIFF_REVISION}') } } diff --git a/resources/jenkins/dsl/install.py b/resources/jenkins/dsl/install.py index fcb72cf4a..d0b6db8c0 100755 --- a/resources/jenkins/dsl/install.py +++ b/resources/jenkins/dsl/install.py @@ -76,7 +76,6 @@ def installPlugin(plugin): plugins.append('heavy-job') plugins.append('htmlpublisher') plugins.append('jenkins-multijob-plugin') -plugins.append('jenkins-reviewbot') plugins.append('jobConfigHistory') plugins.append('job-dsl') plugins.append('mercurial') @@ -84,6 +83,7 @@ def installPlugin(plugin): plugins.append('naginator') plugins.append('nodelabelparameter') plugins.append('parameterized-trigger') +plugins.append('postbuildscript') plugins.append('show-build-parameters') plugins.append('sloccount') plugins.append('sidebar-link') diff --git a/resources/jenkins/notify_rb.sh b/resources/jenkins/notify_rb.sh new file mode 100755 index 000000000..4ee62fc48 --- /dev/null +++ b/resources/jenkins/notify_rb.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +if [ -z "$REVIEWBOARD_USER" ] +then + echo "REVIEWBOARD_USER is undefined" + exit 1 +fi + +if [ -z "$REVIEWBOARD_TOKEN" ] +then + echo "REVIEWBOARD_TOKEN is undefined" + exit 2 +fi + +if [ -z "${REVIEWBOARD_SERVER}" ] +then + echo "REVIEWBOARD_SERVER is undefined" + exit 3 +fi + +if [ -z "${REVIEWBOARD_REVIEW_ID}" ] +then + echo "REVIEWBOARD_REVIEW_ID is undefined... continue to allow custom build" + exit 0 +fi + + + +cmdline="-r ${REVIEWBOARD_REVIEW_ID} --server ${REVIEWBOARD_SERVER} --username ${REVIEWBOARD_USER} --api-token ${REVIEWBOARD_TOKEN}" + +if [ -n "${REVIEWBOARD_STATUS_UPDATE_ID}" ] +then + echo "Update status..." + + if [ "${BUILD_RESULT}" = "SUCCESS" ] + then + rb_state="done-success" + rb_desc="build succeeded." + else + if [ -z "${BUILD_RESULT}" ] + then + rb_state="pending" + rb_desc="build started..." + else + rb_state="error" + rb_desc="build failed." + fi + fi + + rbt status-update set \ + -s ${REVIEWBOARD_STATUS_UPDATE_ID} \ + --state ${rb_state} \ + --description "${rb_desc}" \ + --url ${BUILD_URL} \ + --url-text "See build" \ + ${cmdline} +fi + + +if [ -n "${BUILD_RESULT}" ] +then + echo "Add review comment: ${BUILD_RESULT}" + + if [ "${BUILD_RESULT}" = "SUCCESS" ] + then + cmdlineIssue="" + cmdlineHeader=":+1: Congratulations, Jenkins successfully built the changes." + else + cmdlineIssue="--open-issue" + + if [ "${BUILD_RESULT}" = "FAILURE" ] + then + cmdlineHeader=":-1: Uh oh, Jenkins tried to build the changes and failed." + elif [ "${BUILD_RESULT}" = "UNSTABLE" ] + then + cmdlineHeader=":hand: Jenkins tried to build the changes and noticed some problems." + else + cmdlineHeader=":bulb: Jenkins stopped build: ${BUILD_RESULT}." + fi + fi + + # Remove empty env variables to avoid ugly messages + MSG=$(echo $REVIEWBOARD_MSG | sed -E "s/\\$\{[0-9A-Z_]+_BUILD_[A-Z]+\}//g") + rbt review add-general-comment \ + -t "$MSG" \ + ${cmdline} ${cmdlineIssue} --markdown + + rbt review edit \ + --header "${cmdlineHeader} See [${JOB_NAME} ${BUILD_DISPLAY_NAME}](${BUILD_URL}) of revision: ${REVIEWBOARD_DIFF_REVISION}" \ + ${cmdline} --markdown + + rbt review publish ${cmdline} +fi diff --git a/resources/packaging/android/build.gradle.append b/resources/packaging/android/build.gradle.append index 06c267633..91ba06e33 100644 --- a/resources/packaging/android/build.gradle.append +++ b/resources/packaging/android/build.gradle.append @@ -1,7 +1,7 @@ task sourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs - classifier = 'sources' + archiveClassifier = "sources" } dependencies { diff --git a/resources/packaging/win/runtime_settings.wxs b/resources/packaging/win/runtime_settings.wxs index 1bf7f0d8f..94d602f96 100644 --- a/resources/packaging/win/runtime_settings.wxs +++ b/resources/packaging/win/runtime_settings.wxs @@ -118,6 +118,16 @@ ) + + + + + + (NOT SECURESCREENKEYBOARD) AND ( + (WIX_UPGRADE_DETECTED OR REINSTALL) AND SECURESCREENKEYBOARD_FOUND + ) + + @@ -162,6 +172,7 @@ + @@ -247,6 +258,13 @@ + + SECURESCREENKEYBOARD + + + + + ENABLECANALLOWED diff --git a/resources/qml/+desktop/main.qml b/resources/qml/+desktop/main.qml index ae546f5fe..45944769f 100644 --- a/resources/qml/+desktop/main.qml +++ b/resources/qml/+desktop/main.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import Governikus.Global 1.0 import Governikus.TitleBar 1.0 @@ -142,7 +142,7 @@ ApplicationWindow { onConfirmed: d.hideUiAndTaskbarEntry() - ToggleableOption { + GCheckBox { checked: !SettingsModel.remindUserToClose //: LABEL DESKTOP text: qsTr("Do not show this dialog again.") diff --git a/resources/qml/+mobile/main.qml b/resources/qml/+mobile/main.qml index 1dac6fb07..f06d3e076 100644 --- a/resources/qml/+mobile/main.qml +++ b/resources/qml/+mobile/main.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+desktop/AuthController.qml b/resources/qml/Governikus/AuthView/+desktop/AuthController.qml index 74315ea64..40533ee0c 100644 --- a/resources/qml/Governikus/AuthView/+desktop/AuthController.qml +++ b/resources/qml/Governikus/AuthView/+desktop/AuthController.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.View 1.0 diff --git a/resources/qml/Governikus/AuthView/+desktop/AuthView.qml b/resources/qml/Governikus/AuthView/+desktop/AuthView.qml index a30595260..7b21cd08c 100644 --- a/resources/qml/Governikus/AuthView/+desktop/AuthView.qml +++ b/resources/qml/Governikus/AuthView/+desktop/AuthView.qml @@ -1,11 +1,12 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 import Governikus.EnterPasswordView 1.0 import Governikus.Global 1.0 import Governikus.Style 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.ProgressView 1.0 import Governikus.ResultView 1.0 import Governikus.SettingsView 1.0 @@ -25,6 +26,7 @@ SectionPage { enum SubViews { Undefined, TransportPinReminder, + TransportPinReminderInfo, Connectivity, Progress, AccessRights, @@ -75,10 +77,7 @@ SectionPage { onClicked: { editRights.showProviderInformation(false); - if (d.activeView === AuthView.SubViews.PasswordInfo) { - d.view = SettingsModel.transportPinReminder ? AuthView.SubViews.TransportPinReminder : AuthView.SubViews.Password; - updateTitleBarActions(); - } else if (d.activeView === AuthView.SubViews.ReaderSettings) { + if (d.activeView === AuthView.SubViews.TransportPinReminderInfo || d.activeView === AuthView.SubViews.PasswordInfo || d.activeView === AuthView.SubViews.ReaderSettings) { d.view = d.precedingView; updateTitleBarActions(); } @@ -93,6 +92,7 @@ SectionPage { readonly property int activeView: inputError.visible ? AuthView.SubViews.InputError : view readonly property bool cancelAllowed: AuthModel.isBasicReader || generalWorkflow.waitingFor !== Workflow.WaitingFor.Password + readonly property int passwordType: NumberModel.passwordType property int precedingView: AuthView.SubViews.Undefined property int view: AuthView.SubViews.Undefined } @@ -119,9 +119,10 @@ SectionPage { } } DecisionView { + moreInformationText: infoData.linkText moreInformationVisible: true - questionSubText: qsTr("The personal, six-digit PIN is mandatory to use the online identification function.") - questionText: qsTr("Do you know your six-digit PIN?") + questionSubText: qsTr("Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function.") + questionText: qsTr("Do you know your six-digit ID card PIN?") visible: d.activeView === AuthView.SubViews.TransportPinReminder onAgree: { @@ -129,7 +130,7 @@ SectionPage { AuthModel.continueWorkflow(); } onDisagree: AuthModel.cancelWorkflowToChangePin() - onMoreInformationClicked: showPasswordInfo() + onMoreInformationClicked: showWithPrecedingView(AuthView.SubViews.TransportPinReminderInfo) } ProgressView { id: checkConnectivityView @@ -148,6 +149,7 @@ SectionPage { GeneralWorkflow { id: generalWorkflow isPinChange: false + passwordInfoLinkText: infoData.linkText visible: d.activeView === AuthView.SubViews.Workflow waitingFor: switch (authController.workflowState) { case AuthController.WorkflowStates.Reader: @@ -163,19 +165,29 @@ SectionPage { } EnterPasswordView { id: enterPasswordView - enableTransportPinLink: passwordType === PasswordType.PIN + //: LABEL DESKTOP A11y button to confirm the PIN and start the provider authentication + accessibleContinueText: passwordType === PasswordType.PIN || passwordType === PasswordType.SMART_PIN || (passwordType === PasswordType.CAN && NumberModel.isCanAllowedMode) ? qsTr("Authenticate with provider") : "" + moreInformationText: infoData.linkText visible: d.activeView === AuthView.SubViews.Password - onChangePinLength: AuthModel.requestTransportPinChange() onPasswordEntered: { d.view = AuthView.SubViews.Progress; AuthModel.continueWorkflow(); } onRequestPasswordInfo: authView.showPasswordInfo() } + PasswordInfoData { + id: infoData + contentType: d.activeView === AuthView.SubViews.TransportPinReminder || d.activeView === AuthView.SubViews.TransportPinReminderInfo ? PasswordInfoContent.Type.CHANGE_PIN : fromPasswordType(d.passwordType, NumberModel.isCanAllowedMode) + } PasswordInfoView { id: passwordInfoView - visible: d.activeView === AuthView.SubViews.PasswordInfo + infoContent: infoData + visible: d.activeView === AuthView.SubViews.PasswordInfo || d.activeView === AuthView.SubViews.TransportPinReminderInfo + + titleBarAction.customSubAction: CancelAction { + onClicked: passwordInfoView.close() + } onClose: { d.view = d.precedingView; diff --git a/resources/qml/Governikus/AuthView/+desktop/CertificateDescriptionPage.qml b/resources/qml/Governikus/AuthView/+desktop/CertificateDescriptionPage.qml index 2ea465f38..12acd67d3 100644 --- a/resources/qml/Governikus/AuthView/+desktop/CertificateDescriptionPage.qml +++ b/resources/qml/Governikus/AuthView/+desktop/CertificateDescriptionPage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+desktop/DataGroup.qml b/resources/qml/Governikus/AuthView/+desktop/DataGroup.qml index d4cc8afc7..e07424381 100644 --- a/resources/qml/Governikus/AuthView/+desktop/DataGroup.qml +++ b/resources/qml/Governikus/AuthView/+desktop/DataGroup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+desktop/EditRights.qml b/resources/qml/Governikus/AuthView/+desktop/EditRights.qml index 7f36b1e77..d2906ef40 100644 --- a/resources/qml/Governikus/AuthView/+desktop/EditRights.qml +++ b/resources/qml/Governikus/AuthView/+desktop/EditRights.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+desktop/SelfAuthenticationData.qml b/resources/qml/Governikus/AuthView/+desktop/SelfAuthenticationData.qml index ded7d3a63..fef51023f 100644 --- a/resources/qml/Governikus/AuthView/+desktop/SelfAuthenticationData.qml +++ b/resources/qml/Governikus/AuthView/+desktop/SelfAuthenticationData.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+mobile/+phone/DataGroup.qml b/resources/qml/Governikus/AuthView/+mobile/+phone/DataGroup.qml index c6bc62431..80e09e3f8 100644 --- a/resources/qml/Governikus/AuthView/+mobile/+phone/DataGroup.qml +++ b/resources/qml/Governikus/AuthView/+mobile/+phone/DataGroup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+mobile/+phone/EditRights.qml b/resources/qml/Governikus/AuthView/+mobile/+phone/EditRights.qml index 17a6caa7a..5129a8f6c 100644 --- a/resources/qml/Governikus/AuthView/+mobile/+phone/EditRights.qml +++ b/resources/qml/Governikus/AuthView/+mobile/+phone/EditRights.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/AuthView/+mobile/+tablet/DataGroup.qml b/resources/qml/Governikus/AuthView/+mobile/+tablet/DataGroup.qml index 0046efd68..f3a70d5d3 100644 --- a/resources/qml/Governikus/AuthView/+mobile/+tablet/DataGroup.qml +++ b/resources/qml/Governikus/AuthView/+mobile/+tablet/DataGroup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/AuthView/+mobile/+tablet/EditRights.qml b/resources/qml/Governikus/AuthView/+mobile/+tablet/EditRights.qml index 2566cea51..bc13e4615 100644 --- a/resources/qml/Governikus/AuthView/+mobile/+tablet/EditRights.qml +++ b/resources/qml/Governikus/AuthView/+mobile/+tablet/EditRights.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/AuthView/+mobile/AbortedProgressView.qml b/resources/qml/Governikus/AuthView/+mobile/AbortedProgressView.qml index 83da4e0f2..483e44da8 100644 --- a/resources/qml/Governikus/AuthView/+mobile/AbortedProgressView.qml +++ b/resources/qml/Governikus/AuthView/+mobile/AbortedProgressView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.ProgressView 1.0 diff --git a/resources/qml/Governikus/AuthView/+mobile/AuthController.qml b/resources/qml/Governikus/AuthView/+mobile/AuthController.qml index b2a459620..dfde7af2c 100644 --- a/resources/qml/Governikus/AuthView/+mobile/AuthController.qml +++ b/resources/qml/Governikus/AuthView/+mobile/AuthController.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Type.ApplicationModel 1.0 diff --git a/resources/qml/Governikus/AuthView/+mobile/AuthView.qml b/resources/qml/Governikus/AuthView/+mobile/AuthView.qml index 9c5972398..4e2093a0c 100644 --- a/resources/qml/Governikus/AuthView/+mobile/AuthView.qml +++ b/resources/qml/Governikus/AuthView/+mobile/AuthView.qml @@ -1,11 +1,12 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.EnterPasswordView 1.0 import Governikus.Global 1.0 import Governikus.Style 1.0 import Governikus.TitleBar 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.ProgressView 1.0 import Governikus.ResultView 1.0 import Governikus.WhiteListClient 1.0 @@ -13,7 +14,6 @@ import Governikus.View 1.0 import Governikus.Workflow 1.0 import Governikus.Type.ApplicationModel 1.0 import Governikus.Type.AuthModel 1.0 -import Governikus.Type.ConnectivityManager 1.0 import Governikus.Type.LogModel 1.0 import Governikus.Type.NumberModel 1.0 import Governikus.Type.PasswordType 1.0 @@ -117,6 +117,7 @@ ProgressView { Component { id: transportPinReminder TransportPinReminderView { + moreInformationText: transportPinReminderInfoData.linkText title: root.title onCancel: AuthModel.cancelWorkflow() @@ -128,12 +129,41 @@ ProgressView { pop(); AuthModel.cancelWorkflowToChangePin(); } + onShowInfoView: { + push(transportPinReminderInfoView); + } + } + } + PasswordInfoData { + id: transportPinReminderInfoData + contentType: PasswordInfoContent.Type.CHANGE_PIN + } + Component { + id: transportPinReminderInfoView + PasswordInfoView { + infoContent: transportPinReminderInfoData + + onClose: pop() + } + } + PasswordInfoData { + id: infoData + contentType: fromPasswordType(NumberModel.passwordType, NumberModel.isCanAllowedMode) + } + Component { + id: passwordInfoView + PasswordInfoView { + infoContent: infoData + + onClose: pop() } } Component { id: enterPinView EnterPasswordView { - enableTransportPinLink: NumberModel.passwordType === PasswordType.PIN + //: LABEL ANDROID IOS A11y button to confirm the PIN and start the provider authentication + accessibleContinueText: passwordType === PasswordType.PIN || passwordType === PasswordType.SMART_PIN || (passwordType === PasswordType.CAN && NumberModel.isCanAllowedMode) ? qsTr("Authenticate with provider") : "" + moreInformationText: infoData.linkText title: root.title titleBarColor: root.titleBarColor @@ -146,14 +176,11 @@ ProgressView { } } - onChangePinLength: { - pop(); - AuthModel.requestTransportPinChange(); - } onPasswordEntered: { pop(); AuthModel.continueWorkflow(); } + onRequestPasswordInfo: push(passwordInfoView) } } Component { diff --git a/resources/qml/Governikus/AuthView/+mobile/CardPositionView.qml b/resources/qml/Governikus/AuthView/+mobile/CardPositionView.qml index 9fab077fe..80dfbd517 100644 --- a/resources/qml/Governikus/AuthView/+mobile/CardPositionView.qml +++ b/resources/qml/Governikus/AuthView/+mobile/CardPositionView.qml @@ -1,9 +1,8 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.ResultView 1.0 -import Governikus.Type.ConnectivityManager 1.0 ResultView { id: root diff --git a/resources/qml/Governikus/AuthView/+mobile/CertificateDescriptionPage.qml b/resources/qml/Governikus/AuthView/+mobile/CertificateDescriptionPage.qml index ff080f557..72473ceaf 100644 --- a/resources/qml/Governikus/AuthView/+mobile/CertificateDescriptionPage.qml +++ b/resources/qml/Governikus/AuthView/+mobile/CertificateDescriptionPage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/AuthView/+mobile/CheckConnectivityView.qml b/resources/qml/Governikus/AuthView/+mobile/CheckConnectivityView.qml index 6913e1cc5..eda1044d8 100644 --- a/resources/qml/Governikus/AuthView/+mobile/CheckConnectivityView.qml +++ b/resources/qml/Governikus/AuthView/+mobile/CheckConnectivityView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.ProgressView 1.0 diff --git a/resources/qml/Governikus/AuthView/+mobile/SelfAuthenticationData.qml b/resources/qml/Governikus/AuthView/+mobile/SelfAuthenticationData.qml index b4fce07e2..8b794e1db 100644 --- a/resources/qml/Governikus/AuthView/+mobile/SelfAuthenticationData.qml +++ b/resources/qml/Governikus/AuthView/+mobile/SelfAuthenticationData.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/AuthView/+mobile/TransportPinReminderView.qml b/resources/qml/Governikus/AuthView/+mobile/TransportPinReminderView.qml index df962ea29..bdc775369 100644 --- a/resources/qml/Governikus/AuthView/+mobile/TransportPinReminderView.qml +++ b/resources/qml/Governikus/AuthView/+mobile/TransportPinReminderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -10,9 +10,13 @@ import Governikus.View 1.0 SectionPage { id: root + + property alias moreInformationText: moreInformationLink.text + signal cancel signal pinKnown signal pinUnknown + signal showInfoView navigationAction: NavigationAction { action: NavigationAction.Action.Cancel @@ -41,10 +45,17 @@ SectionPage { GText { //: LABEL ANDROID IOS - text: qsTr("Online identification with Transport PIN is not possible. The personal, six-digit ID card PIN is mandatory to use the online identification function.") + text: qsTr("Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function.") width: parent.width } } + MoreInformationLink { + id: moreInformationLink + Layout.alignment: Qt.AlignCenter + Layout.topMargin: Constants.component_spacing + + onClicked: root.showInfoView() + } GSpacer { Layout.fillHeight: true } diff --git a/resources/qml/Governikus/ChangePinView/+desktop/ChangePinController.qml b/resources/qml/Governikus/ChangePinView/+desktop/ChangePinController.qml index 4dd3e8f1c..b06842c77 100644 --- a/resources/qml/Governikus/ChangePinView/+desktop/ChangePinController.qml +++ b/resources/qml/Governikus/ChangePinView/+desktop/ChangePinController.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.View 1.0 diff --git a/resources/qml/Governikus/ChangePinView/+desktop/ChangePinView.qml b/resources/qml/Governikus/ChangePinView/+desktop/ChangePinView.qml index 941f50a1b..6918453e6 100644 --- a/resources/qml/Governikus/ChangePinView/+desktop/ChangePinView.qml +++ b/resources/qml/Governikus/ChangePinView/+desktop/ChangePinView.qml @@ -1,19 +1,20 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 import Governikus.EnterPasswordView 1.0 import Governikus.Global 1.0 import Governikus.TitleBar 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.ProgressView 1.0 import Governikus.ResultView 1.0 import Governikus.SettingsView 1.0 import Governikus.View 1.0 import Governikus.Workflow 1.0 -import Governikus.Type.PinResetInformationModel 1.0 import Governikus.Type.ChangePinModel 1.0 import Governikus.Type.NumberModel 1.0 +import Governikus.Type.PasswordType 1.0 import Governikus.Type.UiModule 1.0 SectionPage { @@ -87,6 +88,7 @@ SectionPage { readonly property int activeView: inputError.visible ? ChangePinView.SubViews.InputError : pinUnlocked.visible ? ChangePinView.SubViews.PinUnlocked : view readonly property bool cancelAllowed: view !== ChangePinView.SubViews.NoPassword && view !== ChangePinView.SubViews.Start && (ChangePinModel.isBasicReader || generalWorkflow.waitingFor !== Workflow.WaitingFor.Password) + readonly property int passwordType: NumberModel.passwordType property int precedingView: ChangePinView.SubViews.Start property var view: ChangePinView.SubViews.Start } @@ -108,45 +110,31 @@ SectionPage { d.view = pName; } } - DecisionView { - agreeButton.iconText: "?" - //: LABEL DESKTOP - agreeText: qsTr("PIN unknown") - disagreeButton.iconText: "6" - //: LABEL DESKTOP - disagreeText: qsTr("Six-digit PIN") - mainIconSource: "qrc:/images/material_lock.svg" - moreInformationVisible: true - neutralButton.iconText: "5" - //: LABEL DESKTOP - neutralText: qsTr("Five-digit Transport PIN") - //: LABEL DESKTOP Description of PIN change start page. User has a choice of which PIN to set. - questionSubText: qsTr("Please make a choice to set or change your PIN.") - //: LABEL DESKTOP Title of PIN change start page. User is asked which type of PIN they have. - questionText: qsTr("What kind of PIN do you have?") - style: DecisionView.ButtonStyle.AllButtons + SectionPage { visible: d.activeView === ChangePinView.SubViews.Start - onAgree: d.view = ChangePinView.SubViews.NoPassword - onDisagree: ChangePinModel.startWorkflow(false) - onMoreInformationClicked: baseItem.showPasswordInfo() - onNeutral: ChangePinModel.startWorkflow(true) + ChangePinViewContent { + anchors.fill: parent + moreInformationText: infoData.linkText + + onMoreInformationRequested: baseItem.showPasswordInfo() + onNoPinAvailable: d.view = ChangePinView.SubViews.NoPassword + } } - ResultView { + PasswordInfoView { id: noPasswordView - buttonType: NavigationButton.Type.Check - hintButtonText: PinResetInformationModel.pinResetActionText - hintText: PinResetInformationModel.pinUnknownHint - resultType: ResultView.Type.IsInfo - text: PinResetInformationModel.pinUnknownText visible: d.activeView === ChangePinView.SubViews.NoPassword - onHintClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) - onNextView: baseItem.nextView(UiModule.DEFAULT) + infoContent: PasswordInfoData { + contentType: PasswordInfoContent.Type.NO_PIN + } + + onClose: d.view = ChangePinView.SubViews.Start } GeneralWorkflow { id: generalWorkflow isPinChange: true + passwordInfoLinkText: infoData.linkText visible: d.activeView === ChangePinView.SubViews.Workflow waitingFor: switch (changePinController.workflowState) { case ChangePinController.WorkflowStates.Reader: @@ -162,6 +150,7 @@ SectionPage { } EnterPasswordView { id: enterPasswordView + moreInformationText: infoData.linkText visible: d.activeView === ChangePinView.SubViews.Password onPasswordEntered: pWasNewPin => { @@ -170,9 +159,13 @@ SectionPage { } onRequestPasswordInfo: baseItem.showPasswordInfo() } + PasswordInfoData { + id: infoData + contentType: changePinController.workflowState === ChangePinController.WorkflowStates.Initial ? PasswordInfoContent.Type.CHANGE_PIN : fromPasswordType(d.passwordType) + } PasswordInfoView { id: passwordInfoView - changePinInfo: changePinController.workflowState === ChangePinController.WorkflowStates.Initial + infoContent: infoData visible: d.activeView === ChangePinView.SubViews.PasswordInfo onClose: { diff --git a/resources/qml/Governikus/ChangePinView/+mobile/ChangePinController.qml b/resources/qml/Governikus/ChangePinView/+mobile/ChangePinController.qml index 9f8204feb..28cb8697e 100644 --- a/resources/qml/Governikus/ChangePinView/+mobile/ChangePinController.qml +++ b/resources/qml/Governikus/ChangePinView/+mobile/ChangePinController.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.View 1.0 diff --git a/resources/qml/Governikus/ChangePinView/+mobile/ChangePinView.qml b/resources/qml/Governikus/ChangePinView/+mobile/ChangePinView.qml index 26ab92a0f..17155e4e0 100644 --- a/resources/qml/Governikus/ChangePinView/+mobile/ChangePinView.qml +++ b/resources/qml/Governikus/ChangePinView/+mobile/ChangePinView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.EnterPasswordView 1.0 @@ -7,6 +7,7 @@ import Governikus.Global 1.0 import Governikus.AuthView 1.0 import Governikus.Style 1.0 import Governikus.TitleBar 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.ProgressView 1.0 import Governikus.ResultView 1.0 import Governikus.View 1.0 @@ -53,34 +54,27 @@ SectionPage { ChangePinViewContent { id: changePinViewContent anchors.fill: parent + moreInformationText: changePinInfo.linkText onMoreInformationRequested: push(passwordInfoView) onNoPinAvailable: { setLockedAndHidden(); push(pinUnknownView); } - } - Component { - id: pinWorkflow - GeneralWorkflow { - titleBarColor: baseItem.titleBarColor - workflowModel: ChangePinModel - workflowTitle: baseItem.title + + PasswordInfoData { + id: changePinInfo + contentType: PasswordInfoContent.Type.CHANGE_PIN } - } - Component { - id: pinUnknownView - PinUnknownView { - onClose: { - pop(); - setLockedAndHidden(false); - } + PasswordInfoData { + id: infoData + contentType: ApplicationModel.currentWorkflow === ApplicationModel.WORKFLOW_NONE ? PasswordInfoContent.Type.CHANGE_PIN : fromPasswordType(NumberModel.passwordType) } } Component { id: passwordInfoView PasswordInfoView { - changePinInfo: true + infoContent: infoData navigationAction: NavigationAction { action: NavigationAction.Action.Back @@ -89,6 +83,30 @@ SectionPage { } } } + Component { + id: pinUnknownView + PasswordInfoView { + infoContent: PasswordInfoData { + contentType: PasswordInfoContent.Type.NO_PIN + } + navigationAction: NavigationAction { + action: NavigationAction.Action.Back + + onClicked: { + pop(); + setLockedAndHidden(false); + } + } + } + } + Component { + id: pinWorkflow + GeneralWorkflow { + titleBarColor: baseItem.titleBarColor + workflowModel: ChangePinModel + workflowTitle: baseItem.title + } + } Component { id: cardPositionView CardPositionView { @@ -123,6 +141,7 @@ SectionPage { Component { id: enterPinView EnterPasswordView { + moreInformationText: infoData.linkText title: baseItem.title titleBarColor: baseItem.titleBarColor @@ -137,6 +156,7 @@ SectionPage { pop(); ChangePinModel.continueWorkflow(); } + onRequestPasswordInfo: push(passwordInfoView) } } Component { diff --git a/resources/qml/Governikus/ChangePinView/+mobile/ChangePinViewContent.qml b/resources/qml/Governikus/ChangePinView/+mobile/ChangePinViewContent.qml deleted file mode 100644 index 8b8cdf2e8..000000000 --- a/resources/qml/Governikus/ChangePinView/+mobile/ChangePinViewContent.qml +++ /dev/null @@ -1,113 +0,0 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import Governikus.Global 1.0 -import Governikus.Style 1.0 -import Governikus.Type.ChangePinModel 1.0 -import Governikus.Type.NumberModel 1.0 -import Governikus.Type.ApplicationModel 1.0 - -GFlickableColumnLayout { - id: root - - readonly property var maxIconHeight: Style.dimens.header_icon_size - readonly property var minIconHeight: Style.dimens.medium_icon_size - - signal moreInformationRequested - signal noPinAvailable - - minimumContentHeight: implicitContentHeight - (maxIconHeight - minIconHeight) - spacing: 0 - - TintableIcon { - id: pinIcon - Layout.alignment: Qt.AlignHCenter - Layout.fillHeight: true - Layout.maximumHeight: root.maxIconHeight - Layout.minimumHeight: root.minIconHeight - Layout.preferredHeight: root.maxIconHeight - source: "qrc:///images/material_lock.svg" - sourceSize.height: root.maxIconHeight - tintColor: Style.color.accent - } - GText { - id: pinDescWhatType - Layout.alignment: Qt.AlignCenter - Layout.fillWidth: true - Layout.maximumWidth: Style.dimens.max_text_width - Layout.topMargin: Constants.component_spacing - horizontalAlignment: Text.AlignHCenter - - //: LABEL ANDROID IOS - text: qsTr("What kind of PIN do you have?") - textStyle: Style.text.header_accent - wrapMode: Text.WordWrap - } - GText { - id: pinDesc - Layout.alignment: Qt.AlignCenter - Layout.fillWidth: true - Layout.maximumWidth: Style.dimens.max_text_width - Layout.topMargin: Constants.text_spacing - horizontalAlignment: Text.AlignHCenter - - //: LABEL ANDROID IOS - text: qsTr("Please make a choice to set or change your PIN.") - textStyle: Style.text.normal_secondary - wrapMode: Text.WordWrap - } - MoreInformationLink { - Layout.alignment: Qt.AlignCenter - Layout.fillWidth: true - Layout.maximumWidth: Style.dimens.max_text_width - Layout.topMargin: Constants.component_spacing - horizontalAlignment: Text.AlignHCenter - - onClicked: root.moreInformationRequested() - } - GSpacer { - Layout.fillHeight: true - } - DynamicLayout { - id: buttonLayout - - readonly property double buttonWidth: Math.max(sixDigitButton.implicitWidth, fiveDigitButton.implicitWidth, dontKnowButton.implicitWidth) - - Layout.alignment: Qt.AlignCenter - Layout.topMargin: Constants.component_spacing - spacing: Constants.component_spacing - - GButton { - id: sixDigitButton - Layout.minimumWidth: buttonLayout.buttonWidth - icon.source: "qrc:///images/mobile/material_six.svg" - - //: LABEL ANDROID_TABLET IOS_TABLET - text: qsTr("Six-digit PIN") - - onClicked: ChangePinModel.startWorkflow(false) - } - GButton { - id: fiveDigitButton - Layout.minimumWidth: buttonLayout.buttonWidth - icon.source: "qrc:///images/mobile/material_five.svg" - - //: LABEL ANDROID_TABLET IOS_TABLET - text: qsTr("Five-digit Transport PIN") - - onClicked: ChangePinModel.startWorkflow(true) - } - GButton { - id: dontKnowButton - Layout.minimumWidth: buttonLayout.buttonWidth - icon.source: "qrc:///images/material_help.svg" - - //: LABEL ANDROID_TABLET IOS_TABLET - text: qsTr("PIN unknown") - - onClicked: root.noPinAvailable() - } - } -} diff --git a/resources/qml/Governikus/ChangePinView/+mobile/PinUnknownView.qml b/resources/qml/Governikus/ChangePinView/+mobile/PinUnknownView.qml deleted file mode 100644 index f54be27ff..000000000 --- a/resources/qml/Governikus/ChangePinView/+mobile/PinUnknownView.qml +++ /dev/null @@ -1,73 +0,0 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import Governikus.Global 1.0 -import Governikus.ResultView 1.0 -import Governikus.Type.PinResetInformationModel 1.0 -import Governikus.Type.UiModule 1.0 -import Governikus.Type.WorkflowModel 1.0 - -ResultView { - signal close - - resultType: ResultView.Type.IsInfo - - //: LABEL ANDROID IOS - title: qsTr("No PIN known") - - onCancelClicked: close() - onContinueClicked: close() - - ColumnLayout { - spacing: Constants.pane_spacing - width: parent.width - - PaneTitle { - Layout.fillWidth: true - - //: LABEL ANDROID IOS - text: qsTr("ID card") - } - GText { - Layout.fillWidth: true - text: PinResetInformationModel.pinForgottenTutorialHint - } - GButton { - Layout.alignment: Qt.AlignRight - icon.source: "qrc:///images/material_open_in_new.svg" - text: PinResetInformationModel.pinResetActionText - visible: text !== "" - - onClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) - } - PaneTitle { - Layout.fillWidth: true - Layout.topMargin: Constants.pane_spacing - - //: LABEL ANDROID IOS - text: qsTr("Smart-eID") - visible: WorkflowModel.isSmartSupported - } - GText { - Layout.fillWidth: true - - //: LABEL ANDROID IOS A user wants to change but does not know their Smart-eID PIN. - text: qsTr("If you have forgotten your Smart-eID PIN, you can easily set up Smart-eID again. This requires knowledge of your ID card PIN.") - visible: WorkflowModel.isSmartSupported - } - GButton { - Layout.alignment: Qt.AlignRight - - //: LABEL ANDROID IOS - text: qsTr("Setup Smart-eID") - visible: WorkflowModel.isSmartSupported - - onClicked: { - popAll(); - show(UiModule.SMART); - } - } - } -} diff --git a/resources/qml/Governikus/ChangePinView/ChangePinViewContent.qml b/resources/qml/Governikus/ChangePinView/ChangePinViewContent.qml new file mode 100644 index 000000000..d2ea56bdb --- /dev/null +++ b/resources/qml/Governikus/ChangePinView/ChangePinViewContent.qml @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import Governikus.Global 1.0 +import Governikus.Style 1.0 +import Governikus.Type.ChangePinModel 1.0 +import Governikus.Type.NumberModel 1.0 +import Governikus.Type.ApplicationModel 1.0 + +GFlickableColumnLayout { + id: root + + property alias moreInformationText: moreInformationLink.text + + signal moreInformationRequested + signal noPinAvailable + + maximumContentWidth: Style.dimens.max_text_width + spacing: 0 + + GText { + id: pinDescWhatType + Layout.alignment: Qt.AlignCenter + Layout.maximumWidth: root.effectiveContentWidth + Layout.topMargin: Constants.component_spacing + horizontalAlignment: Text.AlignLeft + + //: LABEL ALL_PLATFORMS + text: qsTr("What kind of PIN do you have?") + textStyle: Style.text.title_highlight + wrapMode: Text.WordWrap + } + MoreInformationLink { + id: moreInformationLink + Layout.alignment: Qt.AlignCenter + Layout.maximumWidth: root.effectiveContentWidth + Layout.topMargin: Constants.component_spacing + + onClicked: root.moreInformationRequested() + } + ColumnLayout { + id: buttonLayout + + readonly property double buttonHeight: Math.max(sixDigitButton.implicitHeight, fiveDigitButton.implicitHeight, dontKnowButton.implicitHeight) + + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: false + Layout.maximumWidth: root.effectiveContentWidth + Layout.topMargin: Constants.component_spacing + spacing: Constants.component_spacing + + GInformativeButton { + id: sixDigitButton + Layout.fillWidth: true + Layout.preferredHeight: buttonLayout.buttonHeight + //: LABEL ALL_PLATFORMS + description: qsTr("Set by yourself") + icon.source: "qrc:///images/icon_six_digit_pin_white.svg" + + //: LABEL ALL_PLATFORMS + text: qsTr("6-digit PIN") + + onClicked: ChangePinModel.startWorkflow(false) + } + GInformativeButton { + id: fiveDigitButton + Layout.fillWidth: true + Layout.preferredHeight: buttonLayout.buttonHeight + //: LABEL ALL_PLATFORMS + description: qsTr("Received by mail in PIN letter") + icon.source: "qrc:///images/icon_five_digit_pin.svg" + + //: LABEL ALL_PLATFORMS + text: qsTr("5-digit Transport PIN") + + onClicked: ChangePinModel.startWorkflow(true) + } + GInformativeButton { + id: dontKnowButton + Layout.fillWidth: true + Layout.preferredHeight: buttonLayout.buttonHeight + //: LABEL ALL_PLATFORMS + description: qsTr("Lost, forgotten, or never received it") + icon.source: "qrc:///images/material_block.svg" + scaleIcon: 0.5 + + //: LABEL ALL_PLATFORMS + text: qsTr("No PIN") + tintIcon: true + + onClicked: root.noPinAvailable() + } + } + GSpacer { + Layout.fillHeight: true + } +} diff --git a/resources/qml/Governikus/ChangePinView/qmldir b/resources/qml/Governikus/ChangePinView/qmldir index 00fdc5814..68fde0b88 100644 --- a/resources/qml/Governikus/ChangePinView/qmldir +++ b/resources/qml/Governikus/ChangePinView/qmldir @@ -2,6 +2,5 @@ module ChangePinView internal ChangePinController ChangePinController.qml internal ChangePinViewContent ChangePinViewContent.qml -internal PinUnknownView PinUnknownView.qml ChangePinView 1.0 ChangePinView.qml diff --git a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml index 94eae5a3b..69e1ff15d 100644 --- a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml +++ b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml @@ -1,11 +1,12 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml.Models 2.15 import Governikus.CheckResultView 1.0 import Governikus.Global 1.0 import Governikus.ResultView 1.0 +import Governikus.Style 1.0 import Governikus.Type.CheckIDCardModel 1.0 CheckResultView { @@ -48,8 +49,8 @@ CheckResultView { } GText { - font.bold: true text: result === CheckIDCardModel.SUCCESS ? qsTr("You may now try the function: \"See my personal data\". Press the Continue button to do so now.") : "" + textStyle: Style.text.normal_highlight visible: text !== "" width: parent.width } diff --git a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml index cef341a4a..efa3ba040 100644 --- a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml +++ b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.CheckResultView 1.0 @@ -49,7 +49,7 @@ CheckResultSuggestionView { //: LABEL ANDROID IOS continueButtonText: qsTr("Open website") //: LABEL ANDROID IOS - text: qsTr("Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the online identification function.

You can find smartphones compatible with the %1 on our website.").arg(Qt.application.name) + text: qsTr("Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the eID function.

You can find smartphones compatible with the %1 on our website.").arg(Qt.application.name) //: LABEL ANDROID IOS title: qsTr("No NFC") diff --git a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardView.qml b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardView.qml index 2eecba703..aee129c52 100644 --- a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardView.qml +++ b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -91,7 +91,7 @@ SectionPage { GText { //: LABEL ANDROID IOS - text: qsTr("To use the online identification function, your device must meet certain technical requirements. Furthermore, the online identification function must be activated.") + text: qsTr("To use the eID function, your device must meet certain technical requirements. Furthermore, the eID function must be activated.") width: parent.width } GText { diff --git a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardWorkflow.qml b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardWorkflow.qml index a108ab1a5..a0511b6e4 100644 --- a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardWorkflow.qml +++ b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.ProgressView 1.0 diff --git a/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml b/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml index ffdf0a5b1..a195d8c20 100644 --- a/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml +++ b/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/CheckResultView/+mobile/CheckResultView.qml b/resources/qml/Governikus/CheckResultView/+mobile/CheckResultView.qml index 1aa31775b..708b31eec 100644 --- a/resources/qml/Governikus/CheckResultView/+mobile/CheckResultView.qml +++ b/resources/qml/Governikus/CheckResultView/+mobile/CheckResultView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/CheckResultView/+mobile/ResultEntry.qml b/resources/qml/Governikus/CheckResultView/+mobile/ResultEntry.qml index 449954802..db707bf12 100644 --- a/resources/qml/Governikus/CheckResultView/+mobile/ResultEntry.qml +++ b/resources/qml/Governikus/CheckResultView/+mobile/ResultEntry.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml b/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml index ee5a249cf..66f696026 100644 --- a/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml +++ b/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartResultView.qml b/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartResultView.qml index 16736eb0a..5bca187aa 100644 --- a/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartResultView.qml +++ b/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartResultView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml.Models 2.15 @@ -59,8 +59,8 @@ CheckResultView { } GText { - font.bold: true text: result === SmartModel.SMART_READY ? qsTr("You may now try the function: \"See my personal data\". Press the Continue button to do so now.") : "" + textStyle: Style.text.normal_highlight visible: text !== "" width: parent.width } diff --git a/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartSuggestionView.qml b/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartSuggestionView.qml index b7e3a9796..621b94a42 100644 --- a/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartSuggestionView.qml +++ b/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartSuggestionView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.CheckResultView 1.0 @@ -53,7 +53,7 @@ CheckResultSuggestionView { //: LABEL ANDROID IOS continueButtonText: qsTr("Check device and ID card") //: LABEL ANDROID IOS - text: qsTr("Your mobile device does not meet the technical requirements for Smart-eID.

You may check if your device and ID card are suitable to use the eID functionality.") + text: qsTr("Your mobile device does not meet the technical requirements for Smart-eID.

You may check if your device and ID card are suitable to use the eID function.") //: LABEL ANDROID IOS title: qsTr("Smart-eID not supported") diff --git a/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartView.qml b/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartView.qml index 950ee1b0f..d4e2d78cd 100644 --- a/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartView.qml +++ b/resources/qml/Governikus/CheckSmartView/+mobile/CheckSmartView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -74,7 +74,7 @@ SectionPage { GText { //: LABEL ANDROID IOS - text: qsTr("Your device needs to meet the technical requirements to use the Smart-eID functionality.") + text: qsTr("Your device needs to meet the technical requirements to use the Smart-eID function.") width: parent.width } GText { diff --git a/resources/qml/Governikus/EnterPasswordView/+desktop/EnterPasswordView.qml b/resources/qml/Governikus/EnterPasswordView/+desktop/EnterPasswordView.qml index 7edc6a076..22e9f8e5e 100644 --- a/resources/qml/Governikus/EnterPasswordView/+desktop/EnterPasswordView.qml +++ b/resources/qml/Governikus/EnterPasswordView/+desktop/EnterPasswordView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -15,11 +15,11 @@ import Governikus.Type.RemoteServiceModel 1.0 SectionPage { id: baseItem - property alias enableTransportPinLink: transportPinLink.visible + property string accessibleContinueText + property alias moreInformationText: moreInformation.text property int passwordType: NumberModel.passwordType property alias statusIcon: statusIcon.source - signal changePinLength signal passwordEntered(bool pWasNewPin) signal requestPasswordInfo @@ -46,7 +46,7 @@ SectionPage { } else if (passwordType === PasswordType.NEW_PIN || passwordType === PasswordType.NEW_SMART_PIN) { if (numberField.inputConfirmation === "") { numberField.inputConfirmation = numberField.number; - numberField.forceActiveFocus(Qt.MouseFocusReason); + mainText.forceActiveFocus(Qt.MouseFocusReason); } else { NumberModel.newPin = numberField.number; numberField.inputConfirmation = ""; @@ -239,27 +239,12 @@ SectionPage { horizontalCenterOffset: eyeWidth / 2 } } - MoreInformationLink { - id: transportPinLink - - //: LABEL DESKTOP Button to switch to start a change of the Transport PIN. - text: qsTr("Do you have a five-digit Transport PIN?") - textStyle: Style.text.hint - visible: false - - onClicked: baseItem.changePinLength() - - anchors { - horizontalCenter: parent.horizontalCenter - top: numberField.bottom - topMargin: Constants.component_spacing - } - } } NumberPad { anchors.bottom: parent.bottom anchors.right: parent.right deleteEnabled: numberField.number.length > 0 + submitAccessibleText: button.accessibleText submitEnabled: numberField.validInput onDeletePressed: { @@ -272,6 +257,27 @@ SectionPage { } NavigationButton { id: button + accessibleText: baseItem.accessibleContinueText !== "" ? baseItem.accessibleContinueText : + //: LABEL DESKTOP + passwordType === PasswordType.CAN ? qsTr("Send CAN") : + //: LABEL DESKTOP + passwordType === PasswordType.PUK ? qsTr("Send PUK") : + //: LABEL DESKTOP + passwordType === PasswordType.REMOTE_PIN ? qsTr("Send pairing code") : + //: LABEL DESKTOP + passwordType === PasswordType.NEW_PIN && numberField.inputConfirmation === "" ? qsTr("Send new ID card PIN") : + //: LABEL DESKTOP + passwordType === PasswordType.NEW_PIN ? qsTr("Confirm new ID card PIN") : + //: LABEL DESKTOP + passwordType === PasswordType.TRANSPORT_PIN ? qsTr("Send Transport PIN") : + //: LABEL DESKTOP + passwordType === PasswordType.SMART_PIN ? qsTr("Send Smart-eID PIN") : + //: LABEL DESKTOP + (passwordType === PasswordType.NEW_SMART_PIN && numberField.inputConfirmation === "") ? qsTr("Send new Smart-eID PIN") : + //: LABEL DESKTOP + (passwordType === PasswordType.NEW_SMART_PIN) ? qsTr("Confirm new Smart-eID PIN") : + //: LABEL DESKTOP + qsTr("Send ID card PIN") activeFocusOnTab: true buttonType: NavigationButton.Type.Forward enabled: numberField.validInput diff --git a/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPad.qml b/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPad.qml index a2aca04c9..f96c4dd49 100644 --- a/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPad.qml +++ b/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPad.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -11,6 +11,7 @@ Item { id: baseItem property alias deleteEnabled: deleteButton.enabled + property string submitAccessibleText property alias submitEnabled: submitButton.enabled signal deletePressed @@ -74,6 +75,7 @@ Item { } NumberPadButton { id: submitButton + Accessible.name: submitAccessibleText !== "" ? submitAccessibleText : text color: Constants.green enabled: baseItem.submitEnabled fontScale: 0.75 diff --git a/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPadButton.qml b/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPadButton.qml index b014727bb..e24f1e76e 100644 --- a/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPadButton.qml +++ b/resources/qml/Governikus/EnterPasswordView/+desktop/NumberPadButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/EnterPasswordView/+desktop/PasswordInfoView.qml b/resources/qml/Governikus/EnterPasswordView/+desktop/PasswordInfoView.qml deleted file mode 100644 index 9e20954ae..000000000 --- a/resources/qml/Governikus/EnterPasswordView/+desktop/PasswordInfoView.qml +++ /dev/null @@ -1,163 +0,0 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 -import Governikus.Global 1.0 -import Governikus.Style 1.0 -import Governikus.TitleBar 1.0 -import Governikus.View 1.0 -import Governikus.Type.ApplicationModel 1.0 -import Governikus.Type.PinResetInformationModel 1.0 -import Governikus.Type.NumberModel 1.0 -import Governikus.Type.PasswordType 1.0 -import Governikus.Type.WorkflowModel 1.0 - -SectionPage { - id: root - - property bool changePinInfo: false - property int passwordType: NumberModel.passwordType - property alias rootEnabled: titleBarAction.rootEnabled - - signal close - - titleBarAction: TitleBarAction { - id: titleBarAction - rootEnabled: ApplicationModel.currentWorkflow === ApplicationModel.WORKFLOW_NONE - showHelp: false - showSettings: false - text: headline.text - } - - Keys.onEnterPressed: close() - Keys.onEscapePressed: close() - Keys.onReturnPressed: close() - - GFlickableColumnLayout { - anchors.fill: parent - anchors.margins: Constants.pane_padding - spacing: Constants.groupbox_spacing - - GText { - id: headline - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - Layout.maximumWidth: rowLayout.width - activeFocusOnTab: true - horizontalAlignment: Text.AlignLeft - //: LABEL DESKTOP - text: changePinInfo ? qsTr("Change PIN information") : - //: LABEL DESKTOP - passwordType === PasswordType.CAN ? qsTr("CAN information") : - //: LABEL DESKTOP - passwordType === PasswordType.PUK ? qsTr("PUK information") : - //: LABEL DESKTOP - passwordType === PasswordType.REMOTE_PIN ? qsTr("Smartphone as card reader information") : - //: LABEL DESKTOP - passwordType === PasswordType.TRANSPORT_PIN ? qsTr("Transport PIN information") : - //: LABEL DESKTOP - qsTr("PIN information") - textStyle: Style.text.header - wrapMode: Text.WordWrap - - FocusFrame { - } - } - GridLayout { - id: rowLayout - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.fillWidth: true - columns: 2 - rowSpacing: Constants.groupbox_spacing - - GText { - id: mainText - Layout.alignment: Qt.AlignTop - Layout.fillWidth: true - Layout.maximumWidth: Style.dimens.max_text_width - activeFocusOnTab: true - horizontalAlignment: Text.AlignJustify - text: { - if (changePinInfo) { - if (WorkflowModel.isSmartSupported) { - //: INFO DESKTOP Description text of change PIN selection options - return qsTr("Select \"Six-digit PIN\" to change the self-chosen PIN of your ID card or the Smart-eID.

Select \"Five-digit Transport PIN\" if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.

Select \"PIN unknown\" if your PIN letter is not at hand or you cannot recall your PIN."); - } - //: INFO DESKTOP Description text of change PIN selection options - return qsTr("Select \"Six-digit PIN\" to change the self-chosen PIN of your ID card.

Select \"Five-digit Transport PIN\" if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.

Select \"PIN unknown\" if your PIN letter is not at hand or you cannot recall your PIN."); - } - if (passwordType === PasswordType.CAN && NumberModel.isCanAllowedMode) { - //: INFO DESKTOP Description text of CAN-allowed authentication - return qsTr("The Card Access Number (CAN) allows to access the imprinted data of the ID card. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red)."); - } - if (passwordType === PasswordType.CAN && !NumberModel.isCanAllowedMode) { - //: INFO DESKTOP Description text of CAN if required for third ID card PIN attempt - return qsTr("The Card Access Number (CAN) is required if the ID card PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red)."); - } - if (passwordType === PasswordType.PUK) { - //: INFO DESKTOP Description text of PUK - return qsTr("The PUK is required if the ID card PIN has been entered incorrectly three times. At this point the ID card PIN is blocked. The PUK (marked in red) is a ten-digit number you received with the letter sent to you by your competent authority. Please note that you can only use the PUK to unblock the PIN entry."); - } - if (passwordType === PasswordType.REMOTE_PIN) { - //: INFO DESKTOP Description text of SaC pairing - return qsTr("You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network.

To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone."); - } - if (passwordType === PasswordType.TRANSPORT_PIN) { - //: INFO DESKTOP Description text of Transport PIN - return qsTr("In order to use the online identification function you need an ID card PIN. It has six digits and is chosen by you.

If you have not yet set a six-digit ID card PIN, e.g. when picking up your ID card, use the five-digit Transport PIN for initially setting the ID card PIN. The Transport PIN is contained in the PIN letter (see figure) you received after applying for your ID card. Note that the Transport PIN is void after setting a six-digit ID card PIN.

If you already have a six-digit PIN only that is valid. This is also the case if you reinstalled the %1, the ID card PIN is stored on your ID card.").arg(Qt.application.name); - } - - //: INFO DESKTOP Description text of PIN - return qsTr("The PIN is a six-digit number you set yourself and is required for every use of the online identification function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither \"123456\" nor your birth date, or any other numbers printed on the ID card."); - } - textStyle: Style.text.header - - FocusFrame { - } - } - PasswordInfoImage { - passwordType: root.passwordType - scaleFactorCan: 2 * ApplicationModel.scaleFactor - scaleFactorGeneral: 2.7 * ApplicationModel.scaleFactor - textStyle: Style.text.normal - visible: passwordType !== PasswordType.PIN || passwordType === PasswordType.TRANSPORT_PIN || changePinInfo - } - GSpacer { - Layout.columnSpan: 2 - Layout.fillHeight: true - Layout.row: 1 - } - Hint { - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - Layout.maximumWidth: mainText.width - Layout.row: 2 - buttonText: PinResetInformationModel.pinResetActionText - text: { - if (passwordType === PasswordType.TRANSPORT_PIN) { - return PinResetInformationModel.noPinAndNoTransportPinHint; - } - if (passwordType === PasswordType.PIN) { - return PinResetInformationModel.pinForgottenHint; - } - if (passwordType === PasswordType.PUK) { - return PinResetInformationModel.noPinAndNoPukHint; - } - return ""; - } - visible: !changePinInfo && text !== "" - - onClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) - } - } - NavigationButton { - id: button - Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom - buttonType: NavigationButton.Type.Back - - onClicked: root.close() - } - } -} diff --git a/resources/qml/Governikus/EnterPasswordView/+mobile/EnterPasswordView.qml b/resources/qml/Governikus/EnterPasswordView/+mobile/EnterPasswordView.qml index 191bb256e..0c8a8f26a 100644 --- a/resources/qml/Governikus/EnterPasswordView/+mobile/EnterPasswordView.qml +++ b/resources/qml/Governikus/EnterPasswordView/+mobile/EnterPasswordView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -15,12 +15,15 @@ import Governikus.Type.PasswordType 1.0 SectionPage { id: baseItem + property string accessibleContinueText property alias enableTransportPinLink: transportPinLink.visible property bool isConfirmation: false + property alias moreInformationText: moreInformation.text property int passwordType: NumberModel.passwordType signal changePinLength signal passwordEntered(bool pWasNewPin) + signal requestPasswordInfo Keys.onPressed: event => { event.accepted = pinField.handleKeyEvent(event.key, event.modifiers); @@ -246,9 +249,8 @@ SectionPage { } MoreInformationLink { id: transportPinLink - Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter Layout.topMargin: Constants.text_spacing - horizontalAlignment: Text.AlignHCenter text: (passwordType === PasswordType.TRANSPORT_PIN ? //: LABEL ANDROID IOS Button to switch to a six-digit ID card PIN. qsTr("Do you have a six-digit ID card PIN?") : @@ -258,6 +260,13 @@ SectionPage { onClicked: baseItem.changePinLength() } + MoreInformationLink { + id: moreInformation + Layout.alignment: Qt.AlignHCenter + Layout.topMargin: Constants.text_spacing + + onClicked: baseItem.requestPasswordInfo() + } Rectangle { Layout.alignment: Qt.AlignHCenter Layout.fillWidth: true @@ -282,11 +291,33 @@ SectionPage { } } NumberPad { + id: numberPad Layout.alignment: Qt.AlignHCenter Layout.preferredHeight: height Layout.preferredWidth: width Layout.topMargin: Constants.component_spacing deleteEnabled: pinField.number.length > 0 + submitAccessibleText: baseItem.accessibleContinueText !== "" ? baseItem.accessibleContinueText : + //: LABEL ANDROID IOS + passwordType === PasswordType.CAN ? qsTr("Send CAN") : + //: LABEL ANDROID IOS + passwordType === PasswordType.PUK ? qsTr("Send PUK") : + //: LABEL ANDROID IOS + passwordType === PasswordType.REMOTE_PIN ? qsTr("Send pairing code") : + //: LABEL ANDROID IOS + (passwordType === PasswordType.NEW_PIN && !isConfirmation) ? qsTr("Send new ID card PIN") : + //: LABEL ANDROID IOS + (passwordType === PasswordType.NEW_PIN && isConfirmation) ? qsTr("Confirm new ID card PIN") : + //: LABEL ANDROID IOS + passwordType === PasswordType.TRANSPORT_PIN ? qsTr("Send Transport PIN") : + //: LABEL ANDROID IOS + passwordType === PasswordType.SMART_PIN ? qsTr("Send Smart-eID PIN") : + //: LABEL ANDROID IOS + (passwordType === PasswordType.NEW_SMART_PIN && !isConfirmation) ? qsTr("Send new Smart-eID PIN") : + //: LABEL ANDROID IOS + (passwordType === PasswordType.NEW_SMART_PIN && isConfirmation) ? qsTr("Confirm new Smart-eID PIN") : + //: LABEL ANDROID IOS + qsTr("Send ID card PIN") submitEnabled: pinField.validInput onDeletePressed: { diff --git a/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPad.qml b/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPad.qml index cc1bddb93..e8a6dab38 100644 --- a/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPad.qml +++ b/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPad.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -10,6 +10,7 @@ GridLayout { id: baseItem property bool deleteEnabled: true + property string submitAccessibleText property bool submitEnabled: true signal deletePressed @@ -67,7 +68,9 @@ GridLayout { onClicked: baseItem.digitPressed(text) } NumberPadButton { - a11yDisabledText: qsTr("Submit, disabled until input is complete.") + //: LABEL ANDROID IOS A11y text, appended onto the "submit" button text when the button is disabled. + a11yDisabledText: a11yText + qsTr(", disabled until input is complete.") + a11yText: submitAccessibleText !== "" ? submitAccessibleText : text enabled: baseItem.submitEnabled icon.source: "qrc:///images/material_check.svg" text: qsTr("Submit") diff --git a/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPadButton.qml b/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPadButton.qml index 4386dd284..39f23be88 100644 --- a/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPadButton.qml +++ b/resources/qml/Governikus/EnterPasswordView/+mobile/NumberPadButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -11,9 +11,10 @@ Button { id: numberPadButton property string a11yDisabledText: qsTr("Disabled") + property string a11yText property bool visualPrivacy: false - Accessible.name: numberPadButton.enabled ? text : a11yDisabledText + Accessible.name: numberPadButton.enabled ? a11yText !== "" ? a11yText : text : a11yDisabledText Layout.fillHeight: true Layout.fillWidth: true implicitHeight: 36 diff --git a/resources/qml/Governikus/EnterPasswordView/+mobile/PasswordInfoView.qml b/resources/qml/Governikus/EnterPasswordView/+mobile/PasswordInfoView.qml deleted file mode 100644 index ba318eaf4..000000000 --- a/resources/qml/Governikus/EnterPasswordView/+mobile/PasswordInfoView.qml +++ /dev/null @@ -1,122 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import Governikus.Global 1.0 -import Governikus.View 1.0 -import Governikus.Style 1.0 -import Governikus.Type.NumberModel 1.0 -import Governikus.Type.PasswordType 1.0 -import Governikus.Type.PinResetInformationModel 1.0 -import Governikus.Type.WorkflowModel 1.0 - -SectionPage { - id: root - - property bool changePinInfo: false - property int passwordType: NumberModel.passwordType - - signal close - - sectionPageFlickable: contentItem - - //: LABEL ANDROID IOS - title: changePinInfo ? qsTr("Change PIN information") : - //: LABEL ANDROID IOS - passwordType === PasswordType.CAN ? qsTr("CAN information") : - //: LABEL ANDROID IOS - passwordType === PasswordType.PUK ? qsTr("PUK information") : - //: LABEL ANDROID IOS - passwordType === PasswordType.REMOTE_PIN ? qsTr("Smartphone as card reader information") : - //: LABEL ANDROID IOS - passwordType === PasswordType.TRANSPORT_PIN ? qsTr("Transport PIN information") : - //: LABEL ANDROID IOS - passwordType === PasswordType.SMART_BLOCKING_CODE ? qsTr("Smart-eID blocking code") : - //: LABEL ANDROID IOS - qsTr("PIN information") - - GFlickableColumnLayout { - id: contentItem - anchors.fill: parent - fillHeight: false - maximumContentWidth: Style.dimens.max_text_width - spacing: Constants.component_spacing - - PasswordInfoImage { - Layout.fillWidth: true - Layout.topMargin: Constants.pane_padding - passwordType: root.passwordType - } - GPane { - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - Layout.maximumWidth: Style.dimens.max_text_width - - GText { - text: { - if (changePinInfo) { - if (WorkflowModel.isSmartSupported) { - //: INFO ANDROID IOS - return qsTr("Select \"Six-digit PIN\" to change the self-chosen PIN of your ID card or the Smart-eID.

Select \"Five-digit Transport PIN\" if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.

Select \"PIN unknown\" if your PIN letter is not at hand or you cannot recall your PIN."); - } - //: INFO ANDROID IOS - return qsTr("Select \"Six-digit PIN\" to change the self-chosen PIN of your ID card.

Select \"Five-digit Transport PIN\" if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.

Select \"PIN unknown\" if your PIN letter is not at hand or you cannot recall your PIN."); - } - if (passwordType === PasswordType.CAN && NumberModel.isCanAllowedMode) { - //: INFO ANDROID IOS Description text of CAN-allowed authentication - return qsTr("The Card Access Number (CAN) allows to access the imprinted data of the ID card. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red)."); - } - if (passwordType === PasswordType.CAN && !NumberModel.isCanAllowedMode) { - //: INFO ANDROID IOS Description text of CAN if required for third ID card PIN attempt - return qsTr("The Card Access Number (CAN) is required if the ID card PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red)."); - } - if (passwordType === PasswordType.PUK) { - //: INFO ANDROID IOS Description text of PUK - return qsTr("The PUK is required if the ID card PIN has been entered incorrectly three times. At this point the ID card PIN is blocked. The PUK (marked in red) is a ten-digit number you received with the letter sent to you by your competent authority. Please note that you can only use the PUK to unblock the PIN entry."); - } - if (passwordType === PasswordType.REMOTE_PIN) { - //: INFO ANDROID IOS Description text of SaC pairing - return qsTr("You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network.

To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone."); - } - if (passwordType === PasswordType.TRANSPORT_PIN) { - //: INFO ANDROID IOS Description text of Transport PIN - return qsTr("In order to use the online identification function you need an ID card PIN. It has six digits and is chosen by you.

If you have not yet set a six-digit ID card PIN, e.g. when picking up your ID card, use the five-digit Transport PIN for initially setting the ID card PIN. The Transport PIN is contained in the PIN letter (see figure) you received after applying for your ID card. Note that the Transport PIN is void after setting a six-digit ID card PIN.

If you already have a six-digit PIN only that is valid. This is also the case if you reinstalled the %1, the ID card PIN is stored on your ID card.").arg(Qt.application.name); - } - if (passwordType === PasswordType.SMART_BLOCKING_CODE) { - //: INFO ANDROID IOS Description text of Transport PIN - return qsTr("Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device.

To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation."); - } - - //: INFO ANDROID IOS Description text of PIN - return qsTr("The PIN is a six-digit number you set yourself and is required for every use of the online identification function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither \"123456\" nor your birth date, or any other numbers printed on the ID card."); - } - width: parent.width - } - } - GSpacer { - Layout.fillHeight: true - } - Hint { - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - Layout.maximumWidth: Style.dimens.max_text_width - buttonText: PinResetInformationModel.pinResetActionText - text: { - if (passwordType === PasswordType.PIN) { - return PinResetInformationModel.pinForgottenHint; - } - if (passwordType === PasswordType.TRANSPORT_PIN) { - return PinResetInformationModel.noPinAndNoTransportPinHint; - } - if (passwordType === PasswordType.PUK) { - return PinResetInformationModel.noPinAndNoPukHint; - } - return ""; - } - visible: !changePinInfo && text !== "" - - onClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) - } - } -} diff --git a/resources/qml/Governikus/EnterPasswordView/PasswordInfoImage.qml b/resources/qml/Governikus/EnterPasswordView/PasswordInfoImage.qml deleted file mode 100644 index c74202e18..000000000 --- a/resources/qml/Governikus/EnterPasswordView/PasswordInfoImage.qml +++ /dev/null @@ -1,109 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import Governikus.Global 1.0 -import Governikus.Style 1.0 -import Governikus.Type.NumberModel 1.0 -import Governikus.Type.PasswordType 1.0 - -Item { - id: root - - property int passwordType: PasswordType.PIN - property real scaleFactorCan: 1 - property real scaleFactorGeneral: 1 - property alias textStyle: imageDescriptionText.textStyle - - height: root.implicitHeight - implicitHeight: infoImage.implicitHeight + (imageDescriptionText.visible ? (Constants.component_spacing + imageDescriptionText.implicitHeight) : 0) - implicitWidth: infoImageContainer.width - visible: infoImage.source.toString() !== "" - width: root.implicitWidth - - Timer { - id: imageChangeTimer - - property bool alternativeLetter: true - - interval: 6000 - repeat: true - running: passwordType === PasswordType.PIN || passwordType === PasswordType.PUK - - onTriggered: alternativeLetter = !alternativeLetter - } - Item { - id: infoImageContainer - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: parent.top - height: infoImage.implicitHeight - width: infoImage.implicitWidth - - states: State { - name: "alternativePinLetter" - when: imageChangeTimer.alternativeLetter - - PropertyChanges { - opacity: 1 - target: pinPukVariantB - } - } - transitions: Transition { - NumberAnimation { - duration: Constants.animation_duration - easing.type: Easing.InOutQuad - properties: "opacity" - } - } - - Image { - id: infoImage - anchors.fill: parent - fillMode: Image.PreserveAspectFit - source: passwordType === PasswordType.CAN ? "qrc:///images/id_card.png" : passwordType === PasswordType.REMOTE_PIN ? "qrc:///images/phone_to_pc.svg" : passwordType === PasswordType.SMART_PIN || passwordType === PasswordType.NEW_SMART_PIN || passwordType === PasswordType.SMART_BLOCKING_CODE ? "" : "qrc:///images/pin_letter_pinpuk_same_page.svg" - sourceSize.width: passwordType === PasswordType.CAN ? 400 * scaleFactorCan : 200 * scaleFactorGeneral - width: parent.width - - Rectangle { - readonly property real leftEdge: (parent.width - parent.paintedWidth) / 2.0 - readonly property real topEdge: (parent.height - parent.paintedHeight) / 2.0 - - anchors.left: parent.left - anchors.leftMargin: parent.paintedWidth * 0.7475 + leftEdge - anchors.top: parent.top - anchors.topMargin: parent.paintedWidth * 0.4175 + topEdge - border.color: Constants.red - border.width: Math.max(1, parent.paintedWidth * 0.015) - color: Style.color.transparent - height: parent.paintedWidth * 0.0625 - visible: passwordType === PasswordType.CAN - width: parent.paintedWidth * 0.2 - } - } - Image { - id: pinPukVariantB - anchors.fill: parent - fillMode: Image.PreserveAspectFit - opacity: 0.0 - source: "qrc:///images/pin_letter_pinpuk_different_page.svg" - sourceSize.width: 200 * scaleFactorGeneral - visible: passwordType === PasswordType.PIN || passwordType === PasswordType.PUK - width: parent.width - } - } - GText { - id: imageDescriptionText - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - horizontalAlignment: Text.AlignHCenter - text: (imageChangeTimer.alternativeLetter ? - //: LABEL - qsTr("ID card PIN/PUK on different pages") : - //: LABEL - qsTr("ID card PIN/PUK on the same page")) - textStyle: Style.text.normal - visible: passwordType === PasswordType.PIN || passwordType === PasswordType.PUK - width: root.width - wrapMode: Text.Wrap - } -} diff --git a/resources/qml/Governikus/EnterPasswordView/qmldir b/resources/qml/Governikus/EnterPasswordView/qmldir index 0d46bd97f..70bece12a 100644 --- a/resources/qml/Governikus/EnterPasswordView/qmldir +++ b/resources/qml/Governikus/EnterPasswordView/qmldir @@ -2,7 +2,5 @@ module EnterPasswordView internal NumberPad NumberPad.qml internal NumberPadButton NumberPadButton.qml -internal PasswordInfoImage PasswordInfoImage.qml EnterPasswordView 1.0 EnterPasswordView.qml -PasswordInfoView 1.0 PasswordInfoView.qml diff --git a/resources/qml/Governikus/FeedbackView/+desktop/DetachedLogView.qml b/resources/qml/Governikus/FeedbackView/+desktop/DetachedLogView.qml index b62045619..b3457d1b6 100644 --- a/resources/qml/Governikus/FeedbackView/+desktop/DetachedLogView.qml +++ b/resources/qml/Governikus/FeedbackView/+desktop/DetachedLogView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -127,7 +127,7 @@ Item { Repeater { model: filterModel.levels - delegate: ToggleableOption { + delegate: GCheckBox { Layout.fillWidth: true checked: filterModel.selectedLevels.indexOf(text) !== -1 text: modelData @@ -169,7 +169,7 @@ Item { id: repeater model: filterModel.categories - delegate: ToggleableOption { + delegate: GCheckBox { Layout.fillWidth: true checked: filterModel.selectedCategories.indexOf(text) !== -1 text: modelData diff --git a/resources/qml/Governikus/FeedbackView/+desktop/LogView.qml b/resources/qml/Governikus/FeedbackView/+desktop/LogView.qml index cdda58c7a..05f38a975 100644 --- a/resources/qml/Governikus/FeedbackView/+desktop/LogView.qml +++ b/resources/qml/Governikus/FeedbackView/+desktop/LogView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/FeedbackView/+desktop/LogViewDelegate.qml b/resources/qml/Governikus/FeedbackView/+desktop/LogViewDelegate.qml index f5c03da14..84dc649ac 100644 --- a/resources/qml/Governikus/FeedbackView/+desktop/LogViewDelegate.qml +++ b/resources/qml/Governikus/FeedbackView/+desktop/LogViewDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/FeedbackView/+desktop/LogViewHighLight.qml b/resources/qml/Governikus/FeedbackView/+desktop/LogViewHighLight.qml index d0026ff4c..d0cdf99dc 100644 --- a/resources/qml/Governikus/FeedbackView/+desktop/LogViewHighLight.qml +++ b/resources/qml/Governikus/FeedbackView/+desktop/LogViewHighLight.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import QtQuick 2.15 diff --git a/resources/qml/Governikus/FeedbackView/+mobile/+android/StoreFeedbackPopup.qml b/resources/qml/Governikus/FeedbackView/+mobile/+android/StoreFeedbackPopup.qml index 6d2ab5a61..bff56d3b1 100644 --- a/resources/qml/Governikus/FeedbackView/+mobile/+android/StoreFeedbackPopup.qml +++ b/resources/qml/Governikus/FeedbackView/+mobile/+android/StoreFeedbackPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/FeedbackView/+mobile/+ios/StoreFeedbackPopup.qml b/resources/qml/Governikus/FeedbackView/+mobile/+ios/StoreFeedbackPopup.qml index 9b2b5226e..eb9d2625a 100644 --- a/resources/qml/Governikus/FeedbackView/+mobile/+ios/StoreFeedbackPopup.qml +++ b/resources/qml/Governikus/FeedbackView/+mobile/+ios/StoreFeedbackPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Type.ApplicationModel 1.0 diff --git a/resources/qml/Governikus/FeedbackView/+mobile/LogTitleBarControls.qml b/resources/qml/Governikus/FeedbackView/+mobile/LogTitleBarControls.qml index 17f57ce47..18156a11e 100644 --- a/resources/qml/Governikus/FeedbackView/+mobile/LogTitleBarControls.qml +++ b/resources/qml/Governikus/FeedbackView/+mobile/LogTitleBarControls.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/FeedbackView/+mobile/LogView.qml b/resources/qml/Governikus/FeedbackView/+mobile/LogView.qml index 6a9623636..749f1d1f4 100644 --- a/resources/qml/Governikus/FeedbackView/+mobile/LogView.qml +++ b/resources/qml/Governikus/FeedbackView/+mobile/LogView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+desktop/ConfirmationPopup.qml b/resources/qml/Governikus/Global/+desktop/ConfirmationPopup.qml index 52d692b3e..cfe2a05ba 100644 --- a/resources/qml/Governikus/Global/+desktop/ConfirmationPopup.qml +++ b/resources/qml/Governikus/Global/+desktop/ConfirmationPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -9,8 +9,6 @@ import Governikus.Style 1.0 BaseConfirmationPopup { id: root - headerTextStyle: Style.text.header - buttons: Row { bottomPadding: Constants.pane_padding layoutDirection: Qt.RightToLeft diff --git a/resources/qml/Governikus/Global/+desktop/DecisionView.qml b/resources/qml/Governikus/Global/+desktop/DecisionView.qml index 952df9458..c55f7073e 100644 --- a/resources/qml/Governikus/Global/+desktop/DecisionView.qml +++ b/resources/qml/Governikus/Global/+desktop/DecisionView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -23,6 +23,7 @@ SectionPage { property alias disagreeButton: disagreeButton property alias disagreeText: disagreeButton.subText property alias mainIconSource: image.source + property alias moreInformationText: moreInformation.text property alias moreInformationVisible: moreInformation.visible property alias neutralButton: neutralButton property alias neutralText: neutralButton.subText diff --git a/resources/qml/Governikus/Global/+desktop/GFileDialog.qml b/resources/qml/Governikus/Global/+desktop/GFileDialog.qml index 21b3eeaf7..14d531125 100644 --- a/resources/qml/Governikus/Global/+desktop/GFileDialog.qml +++ b/resources/qml/Governikus/Global/+desktop/GFileDialog.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Qt.labs.platform 1.1 as Labs diff --git a/resources/qml/Governikus/Global/+desktop/GPane.qml b/resources/qml/Governikus/Global/+desktop/GPane.qml index 9b4357777..a5aec4dfa 100644 --- a/resources/qml/Governikus/Global/+desktop/GPane.qml +++ b/resources/qml/Governikus/Global/+desktop/GPane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.View 1.0 diff --git a/resources/qml/Governikus/Global/+desktop/NavigationButton.qml b/resources/qml/Governikus/Global/+desktop/NavigationButton.qml index 635538117..61955d06d 100644 --- a/resources/qml/Governikus/Global/+desktop/NavigationButton.qml +++ b/resources/qml/Governikus/Global/+desktop/NavigationButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -17,11 +17,13 @@ Button { Cancel } + property string accessibleText property int buttonType: NavigationButton.Type.Forward property string iconSource property string iconText property string subText + Accessible.name: accessibleText !== "" ? accessibleText : text Accessible.role: Accessible.Button implicitHeight: column.implicitHeight implicitWidth: column.implicitWidth diff --git a/resources/qml/Governikus/Global/+desktop/PlatformConstants.qml b/resources/qml/Governikus/Global/+desktop/PlatformConstants.qml index 2aa2e573d..508253088 100644 --- a/resources/qml/Governikus/Global/+desktop/PlatformConstants.qml +++ b/resources/qml/Governikus/Global/+desktop/PlatformConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Type.ApplicationModel 1.0 diff --git a/resources/qml/Governikus/Global/+desktop/ScrollGradients.qml b/resources/qml/Governikus/Global/+desktop/ScrollGradients.qml index 7b3fa28e3..e7e173642 100644 --- a/resources/qml/Governikus/Global/+desktop/ScrollGradients.qml +++ b/resources/qml/Governikus/Global/+desktop/ScrollGradients.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Global/+desktop/ScrollablePane.qml b/resources/qml/Governikus/Global/+desktop/ScrollablePane.qml index 72000ce25..c3cfa33ec 100644 --- a/resources/qml/Governikus/Global/+desktop/ScrollablePane.qml +++ b/resources/qml/Governikus/Global/+desktop/ScrollablePane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+desktop/SearchBar.qml b/resources/qml/Governikus/Global/+desktop/SearchBar.qml index 43d6f90f5..a4ad1a860 100644 --- a/resources/qml/Governikus/Global/+desktop/SearchBar.qml +++ b/resources/qml/Governikus/Global/+desktop/SearchBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+desktop/TabbedPane.qml b/resources/qml/Governikus/Global/+desktop/TabbedPane.qml index aec6e9e1b..42a564451 100644 --- a/resources/qml/Governikus/Global/+desktop/TabbedPane.qml +++ b/resources/qml/Governikus/Global/+desktop/TabbedPane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndText.qml b/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndText.qml index 5127a6ab0..1d31719a5 100644 --- a/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndText.qml +++ b/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndText.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndThreeLineText.qml b/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndThreeLineText.qml index 93da6abd7..66672e6f5 100644 --- a/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndThreeLineText.qml +++ b/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateIconAndThreeLineText.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateText.qml b/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateText.qml index 0c5e380bc..0a6c1fbba 100644 --- a/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateText.qml +++ b/resources/qml/Governikus/Global/+desktop/TabbedPaneDelegateText.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/+desktop/ToggleableOption.qml b/resources/qml/Governikus/Global/+desktop/ToggleableOption.qml deleted file mode 100644 index 948bd7736..000000000 --- a/resources/qml/Governikus/Global/+desktop/ToggleableOption.qml +++ /dev/null @@ -1,26 +0,0 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import Governikus.Global 1.0 -import Governikus.Style 1.0 -import Governikus.View 1.0 -import Governikus.Type.ApplicationModel 1.0 - -GCheckBox { - id: root - Accessible.name: text - Accessible.role: Accessible.CheckBox - activeFocusOnTab: true - textStyle: enabled ? Style.text.normal : Style.text.normal_secondary - - FocusFrame { - } - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - - onClicked: root.toggle() - } -} diff --git a/resources/qml/Governikus/Global/+mobile/+android/+phone/DeviceConstants.qml b/resources/qml/Governikus/Global/+mobile/+android/+phone/DeviceConstants.qml index f0260361a..ff7f8bc05 100644 --- a/resources/qml/Governikus/Global/+mobile/+android/+phone/DeviceConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/+android/+phone/DeviceConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+android/+tablet/DeviceConstants.qml b/resources/qml/Governikus/Global/+mobile/+android/+tablet/DeviceConstants.qml index b00f32d8c..0728a8b2e 100644 --- a/resources/qml/Governikus/Global/+mobile/+android/+tablet/DeviceConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/+android/+tablet/DeviceConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+android/BrandConstants.qml b/resources/qml/Governikus/Global/+mobile/+android/BrandConstants.qml index 19a580168..a5f5ef7f5 100644 --- a/resources/qml/Governikus/Global/+mobile/+android/BrandConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/+android/BrandConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+android/ConfirmationPopup.qml b/resources/qml/Governikus/Global/+mobile/+android/ConfirmationPopup.qml index b3e918adf..71fc17bf5 100644 --- a/resources/qml/Governikus/Global/+mobile/+android/ConfirmationPopup.qml +++ b/resources/qml/Governikus/Global/+mobile/+android/ConfirmationPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -8,8 +8,6 @@ import Governikus.Style 1.0 BaseConfirmationPopup { id: root - headerTextStyle: Style.text.header - buttons: Flow { bottomPadding: Constants.groupbox_spacing / 2 layoutDirection: Qt.RightToLeft diff --git a/resources/qml/Governikus/Global/+mobile/+android/SearchBar.qml b/resources/qml/Governikus/Global/+mobile/+android/SearchBar.qml index 316d1eaa5..684f6be5e 100644 --- a/resources/qml/Governikus/Global/+mobile/+android/SearchBar.qml +++ b/resources/qml/Governikus/Global/+mobile/+android/SearchBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+ios/+phone/DeviceConstants.qml b/resources/qml/Governikus/Global/+mobile/+ios/+phone/DeviceConstants.qml index f0260361a..ff7f8bc05 100644 --- a/resources/qml/Governikus/Global/+mobile/+ios/+phone/DeviceConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/+ios/+phone/DeviceConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+ios/+tablet/DeviceConstants.qml b/resources/qml/Governikus/Global/+mobile/+ios/+tablet/DeviceConstants.qml index b00f32d8c..0728a8b2e 100644 --- a/resources/qml/Governikus/Global/+mobile/+ios/+tablet/DeviceConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/+ios/+tablet/DeviceConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+ios/BrandConstants.qml b/resources/qml/Governikus/Global/+mobile/+ios/BrandConstants.qml index 7e851222d..be8d461a0 100644 --- a/resources/qml/Governikus/Global/+mobile/+ios/BrandConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/+ios/BrandConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+ios/ConfirmationPopup.qml b/resources/qml/Governikus/Global/+mobile/+ios/ConfirmationPopup.qml index 843733251..3463b0200 100644 --- a/resources/qml/Governikus/Global/+mobile/+ios/ConfirmationPopup.qml +++ b/resources/qml/Governikus/Global/+mobile/+ios/ConfirmationPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -9,7 +9,6 @@ import Governikus.Style 1.0 BaseConfirmationPopup { id: root - headerTextStyle: Style.text.header horizontalTextAlignment: Text.AlignHCenter buttons: ColumnLayout { diff --git a/resources/qml/Governikus/Global/+mobile/+ios/SearchBar.qml b/resources/qml/Governikus/Global/+mobile/+ios/SearchBar.qml index 7dc615061..a6d271eb6 100644 --- a/resources/qml/Governikus/Global/+mobile/+ios/SearchBar.qml +++ b/resources/qml/Governikus/Global/+mobile/+ios/SearchBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/+phone/DynamicLayout.qml b/resources/qml/Governikus/Global/+mobile/+phone/DynamicLayout.qml deleted file mode 100644 index 415c294c2..000000000 --- a/resources/qml/Governikus/Global/+mobile/+phone/DynamicLayout.qml +++ /dev/null @@ -1,8 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 - -ColumnLayout { -} diff --git a/resources/qml/Governikus/Global/+mobile/+tablet/DynamicLayout.qml b/resources/qml/Governikus/Global/+mobile/+tablet/DynamicLayout.qml deleted file mode 100644 index 0979b2f3d..000000000 --- a/resources/qml/Governikus/Global/+mobile/+tablet/DynamicLayout.qml +++ /dev/null @@ -1,8 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 - -RowLayout { -} diff --git a/resources/qml/Governikus/Global/+mobile/GPane.qml b/resources/qml/Governikus/Global/+mobile/GPane.qml index 9b4446b53..3cf033934 100644 --- a/resources/qml/Governikus/Global/+mobile/GPane.qml +++ b/resources/qml/Governikus/Global/+mobile/GPane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/+mobile/GSwitch.qml b/resources/qml/Governikus/Global/+mobile/GSwitch.qml index 156aac286..bf7c2d813 100644 --- a/resources/qml/Governikus/Global/+mobile/GSwitch.qml +++ b/resources/qml/Governikus/Global/+mobile/GSwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/IosBackGestureMouseArea.qml b/resources/qml/Governikus/Global/+mobile/IosBackGestureMouseArea.qml index 61ba4da34..4081d8dcb 100644 --- a/resources/qml/Governikus/Global/+mobile/IosBackGestureMouseArea.qml +++ b/resources/qml/Governikus/Global/+mobile/IosBackGestureMouseArea.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/LabeledSwitch.qml b/resources/qml/Governikus/Global/+mobile/LabeledSwitch.qml index 46814e694..248fcd67a 100644 --- a/resources/qml/Governikus/Global/+mobile/LabeledSwitch.qml +++ b/resources/qml/Governikus/Global/+mobile/LabeledSwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Global/+mobile/ListItem.qml b/resources/qml/Governikus/Global/+mobile/ListItem.qml index aa4c12ec4..9371efe17 100644 --- a/resources/qml/Governikus/Global/+mobile/ListItem.qml +++ b/resources/qml/Governikus/Global/+mobile/ListItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Global/+mobile/MenuItem.qml b/resources/qml/Governikus/Global/+mobile/MenuItem.qml index 1d0d49f25..7e4df131a 100644 --- a/resources/qml/Governikus/Global/+mobile/MenuItem.qml +++ b/resources/qml/Governikus/Global/+mobile/MenuItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Global/+mobile/PaneTitle.qml b/resources/qml/Governikus/Global/+mobile/PaneTitle.qml index e959c1959..3bf291b1d 100644 --- a/resources/qml/Governikus/Global/+mobile/PaneTitle.qml +++ b/resources/qml/Governikus/Global/+mobile/PaneTitle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/+mobile/PlatformConstants.qml b/resources/qml/Governikus/Global/+mobile/PlatformConstants.qml index 932bafca1..0a7d6c5b5 100644 --- a/resources/qml/Governikus/Global/+mobile/PlatformConstants.qml +++ b/resources/qml/Governikus/Global/+mobile/PlatformConstants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/SwipeActionDelegate.qml b/resources/qml/Governikus/Global/+mobile/SwipeActionDelegate.qml index dd2262f2f..18f580d72 100644 --- a/resources/qml/Governikus/Global/+mobile/SwipeActionDelegate.qml +++ b/resources/qml/Governikus/Global/+mobile/SwipeActionDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/+mobile/TitledSeparator.qml b/resources/qml/Governikus/Global/+mobile/TitledSeparator.qml index c77c5c9bc..aa6fb85e0 100644 --- a/resources/qml/Governikus/Global/+mobile/TitledSeparator.qml +++ b/resources/qml/Governikus/Global/+mobile/TitledSeparator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Global/+qt5/RegExpValidatorCompat.qml b/resources/qml/Governikus/Global/+qt5/RegExpValidatorCompat.qml index bbe0ca42f..e8ff291aa 100644 --- a/resources/qml/Governikus/Global/+qt5/RegExpValidatorCompat.qml +++ b/resources/qml/Governikus/Global/+qt5/RegExpValidatorCompat.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/+qt6/RegExpValidatorCompat.qml b/resources/qml/Governikus/Global/+qt6/RegExpValidatorCompat.qml index 266db5409..a328c280a 100644 --- a/resources/qml/Governikus/Global/+qt6/RegExpValidatorCompat.qml +++ b/resources/qml/Governikus/Global/+qt6/RegExpValidatorCompat.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/BaseConfirmationPopup.qml b/resources/qml/Governikus/Global/BaseConfirmationPopup.qml index 90df3792b..62694baf3 100644 --- a/resources/qml/Governikus/Global/BaseConfirmationPopup.qml +++ b/resources/qml/Governikus/Global/BaseConfirmationPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -21,7 +21,6 @@ Popup { //: LABEL ALL_PLATFORMS property string cancelButtonText: qsTr("Cancel") default property alias children: customContent.children - property TextStyle headerTextStyle property var horizontalTextAlignment: Text.AlignLeft //: LABEL ALL_PLATFORMS property string okButtonText: qsTr("OK") @@ -84,11 +83,10 @@ Popup { activeFocusOnTab: true elide: Text.ElideRight focus: true - font.bold: true horizontalAlignment: root.horizontalTextAlignment maximumLineCount: 5 text: root.title - textStyle: root.headerTextStyle + textStyle: Style.text.header_highlight visible: text !== "" FocusFrame { diff --git a/resources/qml/Governikus/Global/Category.qml b/resources/qml/Governikus/Global/Category.qml index b5d6518c7..7b27a7862 100644 --- a/resources/qml/Governikus/Global/Category.qml +++ b/resources/qml/Governikus/Global/Category.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ pragma Singleton import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/Constants.qml b/resources/qml/Governikus/Global/Constants.qml index 799265d89..2f0446a94 100644 --- a/resources/qml/Governikus/Global/Constants.qml +++ b/resources/qml/Governikus/Global/Constants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ pragma Singleton import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/GBusyIndicator.qml b/resources/qml/Governikus/Global/GBusyIndicator.qml index 28136f48f..905f27e25 100644 --- a/resources/qml/Governikus/Global/GBusyIndicator.qml +++ b/resources/qml/Governikus/Global/GBusyIndicator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.2 import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/GButton.qml b/resources/qml/Governikus/Global/GButton.qml index f45ac2289..662c215f4 100644 --- a/resources/qml/Governikus/Global/GButton.qml +++ b/resources/qml/Governikus/Global/GButton.qml @@ -1,8 +1,9 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 import Governikus.Global 1.0 import Governikus.Style 1.0 import Governikus.View 1.0 @@ -19,6 +20,7 @@ Button { // Similar to "enabled", but tooltips will continue to work property bool enableButton: true property string enabledTooltipText + property alias maximumLineCount: buttonText.maximumLineCount property color textHighlightColor: textStyle.textColor property TextStyle textStyle: enabled && enableButton ? Style.text.button : Style.text.button_disabled property bool tintIcon: false @@ -28,7 +30,6 @@ Button { ToolTip.text: enableButton ? enabledTooltipText : disabledTooltipText ToolTip.visible: hovered && ToolTip.text !== "" activeFocusOnTab: enableButton - font.pixelSize: textStyle.textSize background: Rectangle { readonly property color pressColor: Qt.darker(buttonColor, Constants.highlightDarkerFactor) @@ -43,11 +44,8 @@ Button { } radius: Style.dimens.button_radius } - contentItem: Item { - implicitHeight: root.textStyle.textSize + 2 * verticalPadding - - // The icon's width is already included in the text's margins - implicitWidth: buttonText.visible ? Math.max(buttonText.effectiveWidth, Style.dimens.large_icon_size) : buttonIcon.width + contentItem: RowLayout { + spacing: Constants.text_spacing z: 1 TintableIcon { @@ -56,27 +54,21 @@ Button { readonly property color iconColor: root.textStyle.textColor readonly property color pressColor: Qt.darker(iconColor, Constants.highlightDarkerFactor) - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter source: root.icon.source - sourceSize.height: parent.height + sourceSize.height: root.textStyle.textSize + 2 * verticalPadding tintColor: !animationsDisabled && root.pressed ? pressColor : iconColor tintEnabled: tintIcon visible: source != "" + width: height } GText { id: buttonText - - readonly property real effectiveWidth: implicitWidth + anchors.leftMargin + anchors.rightMargin - Accessible.ignored: true - anchors.left: parent.left - anchors.leftMargin: buttonIcon.visible ? buttonIcon.width + Constants.text_spacing : 0 - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter + Layout.fillWidth: true + Layout.minimumHeight: root.textStyle.textSize + 2 * verticalPadding + Layout.minimumWidth: Style.dimens.large_icon_size - x color: !animationsDisabled && root.pressed ? root.textHighlightColor : root.textStyle.textColor elide: Text.ElideRight - font: root.font horizontalAlignment: buttonIcon.visible ? Text.AlignLeft : Text.AlignHCenter maximumLineCount: 1 text: root.text @@ -85,7 +77,7 @@ Button { visible: text !== "" FocusFrame { - isOnLightBackground: false + isOnLightBackground: !root.background marginFactor: 0.7 scope: root } diff --git a/resources/qml/Governikus/Global/GCheckBox.qml b/resources/qml/Governikus/Global/GCheckBox.qml index b2d512462..81fb73273 100644 --- a/resources/qml/Governikus/Global/GCheckBox.qml +++ b/resources/qml/Governikus/Global/GCheckBox.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -7,6 +7,7 @@ import QtQuick.Layouts 1.15 import Governikus.Global 1.0 import Governikus.Style 1.0 import Governikus.Type.ApplicationModel 1.0 +import Governikus.View 1.0 CheckBox { id: control @@ -14,17 +15,17 @@ CheckBox { property alias maximumLineCount: description.maximumLineCount property alias textStyle: description.textStyle + activeFocusOnTab: true padding: 0 contentItem: GText { id: description Accessible.ignored: true - activeFocusOnTab: false elide: Text.ElideRight leftPadding: control.indicator.width + control.spacing maximumLineCount: 1 text: control.text - textStyle: Style.text.normal + textStyle: enabled ? Style.text.normal : Style.text.normal_secondary verticalAlignment: Text.AlignVCenter } indicator: Rectangle { @@ -49,4 +50,13 @@ CheckBox { toggle(); toggled(); } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + + onClicked: control.toggle() + } + FocusFrame { + } } diff --git a/resources/qml/Governikus/Global/GComboBox.qml b/resources/qml/Governikus/Global/GComboBox.qml index 82371a6ad..ca9b33018 100644 --- a/resources/qml/Governikus/Global/GComboBox.qml +++ b/resources/qml/Governikus/Global/GComboBox.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GConicalGradient.qml b/resources/qml/Governikus/Global/GConicalGradient.qml index 06299e4ce..68c24d526 100644 --- a/resources/qml/Governikus/Global/GConicalGradient.qml +++ b/resources/qml/Governikus/Global/GConicalGradient.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/GFlickable.qml b/resources/qml/Governikus/Global/GFlickable.qml index 6ad133b14..b7731bc68 100644 --- a/resources/qml/Governikus/Global/GFlickable.qml +++ b/resources/qml/Governikus/Global/GFlickable.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GFlickableColumnLayout.qml b/resources/qml/Governikus/Global/GFlickableColumnLayout.qml index 7f9dc5af9..20ecb3412 100644 --- a/resources/qml/Governikus/Global/GFlickableColumnLayout.qml +++ b/resources/qml/Governikus/Global/GFlickableColumnLayout.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -9,6 +9,7 @@ GFlickable { id: root default property alias children: contentLayout.children + readonly property real effectiveContentWidth: maximumContentWidth > 0 ? Math.min(contentWidth, maximumContentWidth) : contentWidth property bool fillHeight: true readonly property real implicitContentHeight: contentLayout.implicitHeight property real maximumContentWidth: -1 @@ -31,7 +32,7 @@ GFlickable { ColumnLayout { id: contentLayout anchors.horizontalCenter: parent.horizontalCenter - width: maximumContentWidth > 0 ? Math.min(root.contentWidth, maximumContentWidth) : root.contentWidth + width: effectiveContentWidth Binding on height { delayed: fillHeight diff --git a/resources/qml/Governikus/Global/GGridView.qml b/resources/qml/Governikus/Global/GGridView.qml index f335a2a9c..36ae8de66 100644 --- a/resources/qml/Governikus/Global/GGridView.qml +++ b/resources/qml/Governikus/Global/GGridView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GInformativeButton.qml b/resources/qml/Governikus/Global/GInformativeButton.qml new file mode 100644 index 000000000..6c8c361d7 --- /dev/null +++ b/resources/qml/Governikus/Global/GInformativeButton.qml @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import Governikus.Style 1.0 +import Governikus.View 1.0 + +GButton { + id: root + + property alias description: subText.text + property real scaleIcon: 1.0 + + Accessible.name: text + ". " + description + horizontalPadding: Constants.component_spacing + textStyle: Style.text.button + verticalPadding: Constants.text_spacing + + contentItem: RowLayout { + spacing: Constants.component_spacing + z: 1 + + TintableIcon { + Layout.preferredHeight: Layout.preferredWidth + Layout.preferredWidth: Style.dimens.icon_size + fillMode: Image.Pad + source: root.icon.source + sourceSize.width: Layout.preferredWidth * scaleIcon + tintColor: root.textStyle.textColor + tintEnabled: root.tintIcon + } + Item { + Layout.fillWidth: true + implicitHeight: textColumn.implicitHeight + implicitWidth: textColumn.implicitWidth + + ColumnLayout { + id: textColumn + anchors.fill: parent + spacing: Constants.text_spacing / 2 + + GText { + Accessible.ignored: true + Layout.alignment: Qt.AlignBottom + Layout.fillWidth: true + elide: Text.ElideRight + maximumLineCount: 1 + text: root.text + textStyle: Style.text.button_highlight + } + GText { + id: subText + Accessible.ignored: true + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + elide: Text.ElideRight + maximumLineCount: 2 + textStyle: root.textStyle + } + } + FocusFrame { + framee: textColumn + isOnLightBackground: false + marginFactor: 0.7 + scope: root + } + } + } +} diff --git a/resources/qml/Governikus/Global/GListView.qml b/resources/qml/Governikus/Global/GListView.qml index bac3b64c6..3b87d4d4b 100644 --- a/resources/qml/Governikus/Global/GListView.qml +++ b/resources/qml/Governikus/Global/GListView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GPaneBackground.qml b/resources/qml/Governikus/Global/GPaneBackground.qml index 2af2e0256..621d6bda3 100644 --- a/resources/qml/Governikus/Global/GPaneBackground.qml +++ b/resources/qml/Governikus/Global/GPaneBackground.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/GProgressBar.qml b/resources/qml/Governikus/Global/GProgressBar.qml index 3b7e6d201..089373ab0 100644 --- a/resources/qml/Governikus/Global/GProgressBar.qml +++ b/resources/qml/Governikus/Global/GProgressBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GRadioButton.qml b/resources/qml/Governikus/Global/GRadioButton.qml index b31a8d564..f996f888e 100644 --- a/resources/qml/Governikus/Global/GRadioButton.qml +++ b/resources/qml/Governikus/Global/GRadioButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GRepeater.qml b/resources/qml/Governikus/Global/GRepeater.qml index 39d029024..89653a7b6 100644 --- a/resources/qml/Governikus/Global/GRepeater.qml +++ b/resources/qml/Governikus/Global/GRepeater.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/GScrollBar.qml b/resources/qml/Governikus/Global/GScrollBar.qml index a1149fbb4..c27672682 100644 --- a/resources/qml/Governikus/Global/GScrollBar.qml +++ b/resources/qml/Governikus/Global/GScrollBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/GSeparator.qml b/resources/qml/Governikus/Global/GSeparator.qml index c48d79eea..b1dc587f6 100644 --- a/resources/qml/Governikus/Global/GSeparator.qml +++ b/resources/qml/Governikus/Global/GSeparator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/GSpacer.qml b/resources/qml/Governikus/Global/GSpacer.qml index ee0b86d92..f667b8e53 100644 --- a/resources/qml/Governikus/Global/GSpacer.qml +++ b/resources/qml/Governikus/Global/GSpacer.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/GText.qml b/resources/qml/Governikus/Global/GText.qml index f499e2685..31b78eda2 100644 --- a/resources/qml/Governikus/Global/GText.qml +++ b/resources/qml/Governikus/Global/GText.qml @@ -1,11 +1,15 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 +import QtQuick.Controls 2.15 +import Governikus.Global 1.0 import Governikus.Style 1.0 import Governikus.Type.ApplicationModel 1.0 Text { + id: baseItem + property TextStyle textStyle: Style.text.normal Accessible.ignored: text === "" @@ -13,7 +17,10 @@ Text { Accessible.name: ApplicationModel.stripHtmlTags(text) + (Constants.is_desktop && d.hasLink ? " " + qsTr("Press space to open link: %1").arg(d.link) : "") Accessible.role: Accessible.StaticText color: textStyle.textColor + font.bold: textStyle.bold + font.italic: textStyle.italic font.pixelSize: textStyle.textSize + font.underline: textStyle.underline linkColor: textStyle.linkColor wrapMode: d.nonMultilineElided ? Text.NoWrap : Text.Wrap @@ -56,8 +63,22 @@ Text { } } MouseArea { + id: mouseArea acceptedButtons: Qt.NoButton anchors.fill: parent - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : undefined + cursorShape: parent.hoveredLink !== "" ? Qt.PointingHandCursor : undefined + hoverEnabled: true + } + Item { + ToolTip { + delay: Constants.toolTipDelay + text: baseItem.hoveredLink + visible: Constants.is_desktop && baseItem.hoveredLink !== "" + + onAboutToShow: { + parent.x = mouseArea.mouseX; + parent.y = mouseArea.mouseY; + } + } } } diff --git a/resources/qml/Governikus/Global/GTextField.qml b/resources/qml/Governikus/Global/GTextField.qml index 1d5d97640..6e95ca20f 100644 --- a/resources/qml/Governikus/Global/GTextField.qml +++ b/resources/qml/Governikus/Global/GTextField.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/Hint.qml b/resources/qml/Governikus/Global/Hint.qml index c6c4369fa..351713654 100644 --- a/resources/qml/Governikus/Global/Hint.qml +++ b/resources/qml/Governikus/Global/Hint.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Global/LabeledText.qml b/resources/qml/Governikus/Global/LabeledText.qml index f3a120ea7..f4ee9d770 100644 --- a/resources/qml/Governikus/Global/LabeledText.qml +++ b/resources/qml/Governikus/Global/LabeledText.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/Global/LocationButton.qml b/resources/qml/Governikus/Global/LocationButton.qml index 222419f01..3b57da092 100644 --- a/resources/qml/Governikus/Global/LocationButton.qml +++ b/resources/qml/Governikus/Global/LocationButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/MoreInformationLink.qml b/resources/qml/Governikus/Global/MoreInformationLink.qml index 1f2ef7abb..c295983ec 100644 --- a/resources/qml/Governikus/Global/MoreInformationLink.qml +++ b/resources/qml/Governikus/Global/MoreInformationLink.qml @@ -1,33 +1,23 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 import Governikus.View 1.0 import Governikus.Style 1.0 -GText { +GButton { id: root - signal clicked - Accessible.role: Accessible.Button - activeFocusOnTab: true - font.underline: true + property bool iconVisible: true + background: null + horizontalPadding: 0 + icon.source: iconVisible ? "qrc:///images/info.svg" : "" + maximumLineCount: 2 //: LABEL ALL_PLATFORMS text: qsTr("More information") - textStyle: Constants.is_desktop ? Style.text.header : Style.text.normal_accent - - Accessible.onPressAction: root.clicked() - Keys.onSpacePressed: root.clicked() - - MouseArea { - anchors.fill: parent - anchors.margins: -12 - cursorShape: Qt.PointingHandCursor - - onClicked: root.clicked() - } - FocusFrame { - } + textStyle: Style.text.link_accent + tintIcon: true + verticalPadding: 2 } diff --git a/resources/qml/Governikus/Global/NumberField.qml b/resources/qml/Governikus/Global/NumberField.qml index 15098ac2a..4ff7ea2aa 100644 --- a/resources/qml/Governikus/Global/NumberField.qml +++ b/resources/qml/Governikus/Global/NumberField.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -40,6 +40,7 @@ Item { echoField.paste(); } else if (eventKey === Qt.Key_Enter || eventKey === Qt.Key_Return) { root.accepted(); + return true; } else { return false; } @@ -56,7 +57,7 @@ Item { Accessible.name: (eye.activated ? //: LABEL DESKTOP Screenreader text for the password field - qsTr("The password is visible.") : + qsTr("The password is visible. Digits entered so far: %1").arg(root.number.split("").join(" ")) : //: LABEL DESKTOP Screenreader text for the password field qsTr("The password is hidden.")) + (text === undefined ? " " + passwordState : "") Accessible.role: Accessible.EditableText @@ -123,8 +124,10 @@ Item { verticalAlignment: Text.AlignTop Rectangle { + readonly property int normalHeight: Constants.is_desktop ? Math.max(ApplicationModel.scaleFactor * 4, 1) : 1 + color: parent.color - height: Constants.is_desktop ? Math.max(ApplicationModel.scaleFactor * 4, 1) : 1 + height: index === root.number.length ? normalHeight * 3 : normalHeight width: parent.markerWidth anchors { diff --git a/resources/qml/Governikus/Global/PkiSwitch.qml b/resources/qml/Governikus/Global/PkiSwitch.qml index 4fcaf36cc..735e9e59d 100644 --- a/resources/qml/Governikus/Global/PkiSwitch.qml +++ b/resources/qml/Governikus/Global/PkiSwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import QtQuick 2.15 diff --git a/resources/qml/Governikus/Global/PrivacyStatement.qml b/resources/qml/Governikus/Global/PrivacyStatement.qml index 32cb2f817..c1a84752b 100644 --- a/resources/qml/Governikus/Global/PrivacyStatement.qml +++ b/resources/qml/Governikus/Global/PrivacyStatement.qml @@ -1,10 +1,11 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 import Governikus.Type.ApplicationModel 1.0 import Governikus.Type.SettingsModel 1.0 +import Governikus.Style 1.0 GText { readonly property string privacyStatementDescription: smart ? @@ -21,7 +22,7 @@ GText { readonly property string privacyStatementUrl: smart ? "https://www.ausweisapp.bund.de/%1/aa2/bmi/privacy".arg(SettingsModel.language) : "https://www.ausweisapp.bund.de/%1/aa2/privacy".arg(SettingsModel.language) property bool smart: false - font.bold: true text: privacyStatementText.arg(privacyStatementLink) + textStyle: Style.text.normal_highlight wrapMode: Text.WordWrap } diff --git a/resources/qml/Governikus/Global/ProxyCredentialsPopup.qml b/resources/qml/Governikus/Global/ProxyCredentialsPopup.qml index a655d153d..4ae01a916 100644 --- a/resources/qml/Governikus/Global/ProxyCredentialsPopup.qml +++ b/resources/qml/Governikus/Global/ProxyCredentialsPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Global/RoundedRectangle.qml b/resources/qml/Governikus/Global/RoundedRectangle.qml index 836755379..bc3c216f1 100644 --- a/resources/qml/Governikus/Global/RoundedRectangle.qml +++ b/resources/qml/Governikus/Global/RoundedRectangle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Global/StatusIcon.qml b/resources/qml/Governikus/Global/StatusIcon.qml index daa90baa4..8fd841f51 100644 --- a/resources/qml/Governikus/Global/StatusIcon.qml +++ b/resources/qml/Governikus/Global/StatusIcon.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Global/TintableIcon.qml b/resources/qml/Governikus/Global/TintableIcon.qml index c2418c33f..b7e9bf0e9 100644 --- a/resources/qml/Governikus/Global/TintableIcon.qml +++ b/resources/qml/Governikus/Global/TintableIcon.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 @@ -9,6 +9,8 @@ Item { property bool desaturate: false property alias fillMode: image.fillMode + property alias paintedHeight: image.paintedHeight + property alias paintedWidth: image.paintedWidth property alias playAnimation: animation.enabled property alias source: image.source property alias sourceSize: image.sourceSize diff --git a/resources/qml/Governikus/Global/Utils.qml b/resources/qml/Governikus/Global/Utils.qml index 2e3dfeb4d..8a91062d2 100644 --- a/resources/qml/Governikus/Global/Utils.qml +++ b/resources/qml/Governikus/Global/Utils.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ pragma Singleton import QtQuick 2.15 @@ -53,7 +53,7 @@ QtObject { pFlickable.contentY = Math.max(pFlickable.contentY - pFlickable.height, pFlickable.originY); } function shuffle(pArray) { - for (var i = pArray.length - 1; i > 0; i--) { + for (let i = pArray.length - 1; i > 0; i--) { let j = ApplicationModel.randomInt(0, i); let x = pArray[i]; pArray[i] = pArray[j]; diff --git a/resources/qml/Governikus/Global/qmldir b/resources/qml/Governikus/Global/qmldir index 857cd261a..d7e635c71 100644 --- a/resources/qml/Governikus/Global/qmldir +++ b/resources/qml/Governikus/Global/qmldir @@ -11,10 +11,10 @@ singleton Utils 1.0 Utils.qml ConfirmationPopup 1.0 ConfirmationPopup.qml DecisionView 1.0 DecisionView.qml -DynamicLayout 1.0 DynamicLayout.qml GBusyIndicator 1.0 GBusyIndicator.qml GButton 1.0 GButton.qml +GInformativeButton 1.0 GInformativeButton.qml GCheckBox 1.0 GCheckBox.qml GComboBox 1.0 GComboBox.qml GConicalGradient 1.0 GConicalGradient.qml @@ -58,7 +58,6 @@ TabbedPaneDelegateText 1.0 TabbedPaneDelegateText.qml PkiSwitch 1.0 PkiSwitch.qml TintableIcon 1.0 TintableIcon.qml TitledSeparator 1.0 TitledSeparator.qml -ToggleableOption 1.0 ToggleableOption.qml PrivacyStatement 1.0 PrivacyStatement.qml Hint 1.0 Hint.qml MoreInformationLink 1.0 MoreInformationLink.qml diff --git a/resources/qml/Governikus/HistoryView/+desktop/HistoryRemovalTimePeriodControl.qml b/resources/qml/Governikus/HistoryView/+desktop/HistoryRemovalTimePeriodControl.qml index 51c5b8a67..c1cb85cea 100644 --- a/resources/qml/Governikus/HistoryView/+desktop/HistoryRemovalTimePeriodControl.qml +++ b/resources/qml/Governikus/HistoryView/+desktop/HistoryRemovalTimePeriodControl.qml @@ -1,6 +1,6 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany -*/ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ import QtQuick 2.15 import QtQuick.Layouts 1.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/HistoryView/+desktop/HistoryView.qml b/resources/qml/Governikus/HistoryView/+desktop/HistoryView.qml index c174dbe16..1ea38ea42 100644 --- a/resources/qml/Governikus/HistoryView/+desktop/HistoryView.qml +++ b/resources/qml/Governikus/HistoryView/+desktop/HistoryView.qml @@ -1,6 +1,6 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany -*/ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ import QtQml 2.15 import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+desktop/HistoryViewDetails.qml b/resources/qml/Governikus/HistoryView/+desktop/HistoryViewDetails.qml index 92085322b..fdc0ea04c 100644 --- a/resources/qml/Governikus/HistoryView/+desktop/HistoryViewDetails.qml +++ b/resources/qml/Governikus/HistoryView/+desktop/HistoryViewDetails.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryListViewDelegate.qml b/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryListViewDelegate.qml index 8b9f6a286..6c454f3e8 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryListViewDelegate.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryListViewDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryView.qml b/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryView.qml index 92f4153f8..34fb61648 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryView.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryViewTitleBarControls.qml b/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryViewTitleBarControls.qml index 7471e06f1..60fd2133b 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryViewTitleBarControls.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/+android/HistoryViewTitleBarControls.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryListViewDelegate.qml b/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryListViewDelegate.qml index 8205f7c26..c5101f1cf 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryListViewDelegate.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryListViewDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryView.qml b/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryView.qml index 2824a4b29..9fc723eec 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryView.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/+ios/HistoryView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/BaseHistoryView.qml b/resources/qml/Governikus/HistoryView/+mobile/BaseHistoryView.qml index a06e6f8e3..fe4cc72c0 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/BaseHistoryView.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/BaseHistoryView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/HistoryListItem.qml b/resources/qml/Governikus/HistoryView/+mobile/HistoryListItem.qml index 4c177f6f9..f44c84cb9 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/HistoryListItem.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/HistoryListItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/HistoryViewConfirmationPopup.qml b/resources/qml/Governikus/HistoryView/+mobile/HistoryViewConfirmationPopup.qml index 15af71d62..e5d3a70b8 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/HistoryViewConfirmationPopup.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/HistoryViewConfirmationPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/HistoryView/+mobile/HistoryViewDetails.qml b/resources/qml/Governikus/HistoryView/+mobile/HistoryViewDetails.qml index f95816d1a..99a1b0fa1 100644 --- a/resources/qml/Governikus/HistoryView/+mobile/HistoryViewDetails.qml +++ b/resources/qml/Governikus/HistoryView/+mobile/HistoryViewDetails.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/InformationView/+desktop/DiagnosisView.qml b/resources/qml/Governikus/InformationView/+desktop/DiagnosisView.qml index 17d9ae76b..1311aa91f 100644 --- a/resources/qml/Governikus/InformationView/+desktop/DiagnosisView.qml +++ b/resources/qml/Governikus/InformationView/+desktop/DiagnosisView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/InformationView/+desktop/LicenseInformation.qml b/resources/qml/Governikus/InformationView/+desktop/LicenseInformation.qml index b02c0b785..c0922d587 100644 --- a/resources/qml/Governikus/InformationView/+desktop/LicenseInformation.qml +++ b/resources/qml/Governikus/InformationView/+desktop/LicenseInformation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/InformationView/+desktop/ReleaseNotes.qml b/resources/qml/Governikus/InformationView/+desktop/ReleaseNotes.qml index a88eb958f..cadaa9fe7 100644 --- a/resources/qml/Governikus/InformationView/+desktop/ReleaseNotes.qml +++ b/resources/qml/Governikus/InformationView/+desktop/ReleaseNotes.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/InformationView/+desktop/VersionInformation.qml b/resources/qml/Governikus/InformationView/+desktop/VersionInformation.qml index 3e0325fcd..129b52ed2 100644 --- a/resources/qml/Governikus/InformationView/+desktop/VersionInformation.qml +++ b/resources/qml/Governikus/InformationView/+desktop/VersionInformation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/InformationView/+mobile/LicenseInformation.qml b/resources/qml/Governikus/InformationView/+mobile/LicenseInformation.qml index bcec63b9a..9965e9e8d 100644 --- a/resources/qml/Governikus/InformationView/+mobile/LicenseInformation.qml +++ b/resources/qml/Governikus/InformationView/+mobile/LicenseInformation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/InformationView/+mobile/ReleaseNotes.qml b/resources/qml/Governikus/InformationView/+mobile/ReleaseNotes.qml index 74b3bce4a..aab8cc290 100644 --- a/resources/qml/Governikus/InformationView/+mobile/ReleaseNotes.qml +++ b/resources/qml/Governikus/InformationView/+mobile/ReleaseNotes.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/InformationView/+mobile/VersionInformation.qml b/resources/qml/Governikus/InformationView/+mobile/VersionInformation.qml index b1ac5355b..f8ca7cf5b 100644 --- a/resources/qml/Governikus/InformationView/+mobile/VersionInformation.qml +++ b/resources/qml/Governikus/InformationView/+mobile/VersionInformation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/InformationView/ReleaseNotesView.qml b/resources/qml/Governikus/InformationView/ReleaseNotesView.qml index d53508f06..5c7080c1b 100644 --- a/resources/qml/Governikus/InformationView/ReleaseNotesView.qml +++ b/resources/qml/Governikus/InformationView/ReleaseNotesView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/MainView/+desktop/MainView.qml b/resources/qml/Governikus/MainView/+desktop/MainView.qml index 3dcd6c32f..82f4ef294 100644 --- a/resources/qml/Governikus/MainView/+desktop/MainView.qml +++ b/resources/qml/Governikus/MainView/+desktop/MainView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/MainView/+desktop/Tile.qml b/resources/qml/Governikus/MainView/+desktop/Tile.qml index 860b61cfd..9a8041b48 100644 --- a/resources/qml/Governikus/MainView/+desktop/Tile.qml +++ b/resources/qml/Governikus/MainView/+desktop/Tile.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -45,9 +45,8 @@ FocusScope { } GText { id: text - font.bold: true horizontalAlignment: Text.AlignHCenter - textStyle: Style.text.title_accent + textStyle: Style.text.title_accent_highlight anchors { left: parent.left diff --git a/resources/qml/Governikus/MainView/+mobile/+phone/Tile.qml b/resources/qml/Governikus/MainView/+mobile/+phone/Tile.qml index dc2767a9e..72527d49a 100644 --- a/resources/qml/Governikus/MainView/+mobile/+phone/Tile.qml +++ b/resources/qml/Governikus/MainView/+mobile/+phone/Tile.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -44,9 +44,8 @@ GPaneBackground { Accessible.ignored: true color: Qt.darker(textStyle.textColor, mouseArea.pressed ? Constants.highlightDarkerFactor : 1) elide: Text.ElideRight - font.bold: true horizontalAlignment: Text.AlignHCenter - textStyle: Style.text.title_inverse + textStyle: Style.text.title_inverse_highlight verticalAlignment: Text.AlignVCenter anchors { diff --git a/resources/qml/Governikus/MainView/+mobile/+tablet/Tile.qml b/resources/qml/Governikus/MainView/+mobile/+tablet/Tile.qml index 7df1afa78..2f844edd0 100644 --- a/resources/qml/Governikus/MainView/+mobile/+tablet/Tile.qml +++ b/resources/qml/Governikus/MainView/+mobile/+tablet/Tile.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -52,9 +52,8 @@ GPaneBackground { Layout.minimumHeight: lineHeight color: Qt.darker(textStyle.textColor, mouseArea.pressed ? Constants.highlightDarkerFactor : 1) elide: Text.ElideRight - font.bold: true horizontalAlignment: Text.AlignHCenter - textStyle: Style.text.title_inverse + textStyle: Style.text.title_inverse_highlight verticalAlignment: Text.AlignVCenter } GSpacer { diff --git a/resources/qml/Governikus/MainView/+mobile/MainView.qml b/resources/qml/Governikus/MainView/+mobile/MainView.qml index da54d240a..6fbd3fef5 100644 --- a/resources/qml/Governikus/MainView/+mobile/MainView.qml +++ b/resources/qml/Governikus/MainView/+mobile/MainView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/MoreView/+desktop/MoreView.qml b/resources/qml/Governikus/MoreView/+desktop/MoreView.qml index 6f843b14d..a2e54b218 100644 --- a/resources/qml/Governikus/MoreView/+desktop/MoreView.qml +++ b/resources/qml/Governikus/MoreView/+desktop/MoreView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/MoreView/+desktop/MoreViewDiagnosis.qml b/resources/qml/Governikus/MoreView/+desktop/MoreViewDiagnosis.qml index 38de46c37..30f3f2002 100644 --- a/resources/qml/Governikus/MoreView/+desktop/MoreViewDiagnosis.qml +++ b/resources/qml/Governikus/MoreView/+desktop/MoreViewDiagnosis.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/MoreView/+desktop/MoreViewGeneral.qml b/resources/qml/Governikus/MoreView/+desktop/MoreViewGeneral.qml index 1fc1b5320..b22f1e66a 100644 --- a/resources/qml/Governikus/MoreView/+desktop/MoreViewGeneral.qml +++ b/resources/qml/Governikus/MoreView/+desktop/MoreViewGeneral.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -56,7 +56,7 @@ ColumnLayout { buttonTooltip: "https://www.ausweisapp.bund.de/%1/aa2/faq".arg(SettingsModel.language) //: LABEL DESKTOP description: qsTr("Do you have further questions about %1?").arg(Qt.application.name) - iconSource: "qrc:/images/desktop/material_live_help.svg" + iconSource: "qrc:/images/material_live_help.svg" //: LABEL DESKTOP title: qsTr("FAQ") diff --git a/resources/qml/Governikus/MoreView/+desktop/MoreViewMenuItem.qml b/resources/qml/Governikus/MoreView/+desktop/MoreViewMenuItem.qml index 9bb0cc63b..f7f0e768c 100644 --- a/resources/qml/Governikus/MoreView/+desktop/MoreViewMenuItem.qml +++ b/resources/qml/Governikus/MoreView/+desktop/MoreViewMenuItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/MoreView/+mobile/MoreView.qml b/resources/qml/Governikus/MoreView/+mobile/MoreView.qml index c3bd427cd..77e4a4db6 100644 --- a/resources/qml/Governikus/MoreView/+mobile/MoreView.qml +++ b/resources/qml/Governikus/MoreView/+mobile/MoreView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Navigation/+mobile/Navigation.qml b/resources/qml/Governikus/Navigation/+mobile/Navigation.qml index fc39c632e..b52bbb97e 100644 --- a/resources/qml/Governikus/Navigation/+mobile/Navigation.qml +++ b/resources/qml/Governikus/Navigation/+mobile/Navigation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Navigation/+mobile/NavigationItem.qml b/resources/qml/Governikus/Navigation/+mobile/NavigationItem.qml index 972d59149..3386f7c94 100644 --- a/resources/qml/Governikus/Navigation/+mobile/NavigationItem.qml +++ b/resources/qml/Governikus/Navigation/+mobile/NavigationItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Navigation/+mobile/NavigationView.qml b/resources/qml/Governikus/Navigation/+mobile/NavigationView.qml index f8c2d769d..144dfbbbe 100644 --- a/resources/qml/Governikus/Navigation/+mobile/NavigationView.qml +++ b/resources/qml/Governikus/Navigation/+mobile/NavigationView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml b/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml new file mode 100644 index 000000000..b2abf8ca7 --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml @@ -0,0 +1,153 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import Governikus.Global 1.0 +import Governikus.Style 1.0 +import Governikus.TitleBar 1.0 +import Governikus.View 1.0 +import Governikus.Type.ApplicationModel 1.0 +import Governikus.Type.PinResetInformationModel 1.0 + +SectionPage { + id: root + + readonly property url buttonLink: infoContent.buttonLink + readonly property string buttonText: infoContent.buttonText + readonly property var contentList: infoContent.contentList + readonly property string hint: infoContent.hint + readonly property int imageType: infoContent.imageType + property var infoContent: PasswordInfoContent { + } + property alias rootEnabled: titleBarAction.rootEnabled + readonly property string title: infoContent.title + + signal close + + titleBarAction: TitleBarAction { + id: titleBarAction + rootEnabled: ApplicationModel.currentWorkflow === ApplicationModel.WORKFLOW_NONE + showHelp: false + showSettings: false + text: root.title + } + + Keys.onEnterPressed: close() + Keys.onEscapePressed: close() + Keys.onReturnPressed: close() + + GFlickableColumnLayout { + anchors.fill: parent + anchors.margins: Constants.pane_padding + spacing: Constants.groupbox_spacing + + GridLayout { + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.fillWidth: true + columnSpacing: Constants.groupbox_spacing + columns: 2 + rowSpacing: Constants.groupbox_spacing + + ColumnLayout { + id: contentLayout + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + Layout.maximumWidth: Style.dimens.max_text_width + spacing: Constants.component_spacing + + Repeater { + model: root.contentList + + delegate: ColumnLayout { + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + spacing: Constants.component_spacing + + PasswordInfoImage { + Layout.alignment: Qt.AlignHCenter + imageType: blockHeaderImageType + scaleFactorCan: 1 * ApplicationModel.scaleFactor + scaleFactorGeneral: 1.35 * ApplicationModel.scaleFactor + visible: blockHeaderImageType !== PasswordInfoImage.Type.NONE + } + ColumnLayout { + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + spacing: Constants.groupbox_spacing + + GText { + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + Layout.maximumWidth: Style.dimens.max_text_width + activeFocusOnTab: true + horizontalAlignment: Text.AlignLeft + text: blockTitle + textStyle: Style.text.header_highlight + visible: text !== "" + wrapMode: Text.WordWrap + + FocusFrame { + } + } + Repeater { + model: paragraphList + + delegate: GText { + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + Layout.maximumWidth: Style.dimens.max_text_width + activeFocusOnTab: true + horizontalAlignment: Text.AlignJustify + text: modelData + textStyle: Style.text.header + + FocusFrame { + } + } + } + } + } + } + GButton { + Layout.alignment: Qt.AlignRight + Layout.topMargin: Constants.component_spacing + icon.source: "qrc:///images/material_open_in_new.svg" + text: root.buttonText + visible: text !== "" + + onClicked: Qt.openUrlExternally(root.buttonLink) + } + } + PasswordInfoImage { + imageType: root.imageType + scaleFactorCan: 1.5 * ApplicationModel.scaleFactor + scaleFactorGeneral: 2.7 * ApplicationModel.scaleFactor + visible: root.imageType !== PasswordInfoImage.Type.NONE + } + GSpacer { + Layout.columnSpan: 2 + Layout.fillHeight: true + Layout.row: 1 + } + Hint { + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.maximumWidth: contentLayout.width + Layout.row: 2 + buttonText: PinResetInformationModel.pinResetActionText + text: root.hint + visible: text !== "" + + onClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) + } + } + NavigationButton { + Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom + buttonType: NavigationButton.Type.Back + + onClicked: root.close() + } + } +} diff --git a/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml b/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml new file mode 100644 index 000000000..f3558ac5e --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml @@ -0,0 +1,118 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import Governikus.Global 1.0 +import Governikus.View 1.0 +import Governikus.Style 1.0 +import Governikus.TitleBar 1.0 +import Governikus.Type.PinResetInformationModel 1.0 + +SectionPage { + id: root + + readonly property url buttonLink: infoContent.buttonLink + readonly property string buttonText: infoContent.buttonText + readonly property var contentList: infoContent.contentList + readonly property string hint: infoContent.hint + readonly property int imageType: infoContent.imageType + property var infoContent: PasswordInfoContent { + } + readonly property string infoContentTitle: infoContent.title + + signal close + + sectionPageFlickable: contentItem + title: infoContentTitle + + navigationAction: NavigationAction { + action: NavigationAction.Action.Back + + onClicked: close() + } + + GFlickableColumnLayout { + id: contentItem + anchors.fill: parent + fillHeight: false + maximumContentWidth: Style.dimens.max_text_width + spacing: Constants.component_spacing + + PasswordInfoImage { + Layout.fillWidth: true + Layout.topMargin: Constants.pane_padding + imageType: root.imageType + visible: root.imageType !== PasswordInfoImage.Type.NONE + } + GPane { + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.maximumWidth: Style.dimens.max_text_width + + Column { + spacing: Constants.component_spacing + width: parent.width + + Repeater { + model: root.contentList + width: parent.width + + delegate: Column { + spacing: Constants.component_spacing + width: parent.width + + PasswordInfoImage { + anchors.horizontalCenter: parent.horizontalCenter + imageType: blockHeaderImageType + visible: blockHeaderImageType !== PasswordInfoImage.Type.NONE + width: parent.width * 0.3 + } + Column { + spacing: Constants.groupbox_spacing + width: parent.width + + GText { + text: blockTitle + textStyle: Style.text.header_secondary_highlight + width: parent.width + wrapMode: Text.WordWrap + } + Repeater { + model: paragraphList + width: parent.width + + delegate: GText { + text: modelData + width: parent.width + } + } + } + } + } + GButton { + Layout.alignment: Qt.AlignRight + Layout.topMargin: Constants.component_spacing + icon.source: "qrc:///images/material_open_in_new.svg" + text: root.buttonText + visible: text !== "" + + onClicked: Qt.openUrlExternally(root.buttonLink) + } + } + } + GSpacer { + Layout.fillHeight: true + } + Hint { + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.maximumWidth: Style.dimens.max_text_width + buttonText: PinResetInformationModel.pinResetActionText + text: root.hint + visible: text !== "" + + onClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) + } + } +} diff --git a/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml b/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml new file mode 100644 index 000000000..2d1f449a8 --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 + +QtObject { + enum Type { + PIN, + CHOOSE_PIN, + TRANSPORT_PIN, + SMARTPHONE_AS_CARD_READER, + PUK, + CAN, + CAN_ALLOWED, + CHANGE_PIN, + SMART_BLOCKING_CODE, + NO_PIN + } + + property url buttonLink: "" + property string buttonText: "" + property list contentList + property string hint: "" + property int imageType: PasswordInfoImage.Type.NONE + + //: LABEL ALL_PLATFORMS + property string linkText: qsTr("More information") + property string title +} diff --git a/resources/qml/Governikus/PasswordInfoView/PasswordInfoContentBlock.qml b/resources/qml/Governikus/PasswordInfoView/PasswordInfoContentBlock.qml new file mode 100644 index 000000000..4e647b5a2 --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/PasswordInfoContentBlock.qml @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 + +QtObject { + property int blockHeaderImageType: PasswordInfoImage.Type.NONE + property string blockTitle + property var paragraphList +} diff --git a/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml b/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml new file mode 100644 index 000000000..be23b5548 --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml @@ -0,0 +1,322 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import Governikus.Global 1.0 +import Governikus.Type.PasswordType 1.0 +import Governikus.Type.PinResetInformationModel 1.0 +import Governikus.Type.WorkflowModel 1.0 + +Item { + id: root + + readonly property url buttonLink: infoContent.buttonLink + readonly property string buttonText: infoContent.buttonText + readonly property var contentList: infoContent.contentList + property int contentType + readonly property string hint: infoContent.hint + readonly property int imageType: infoContent.imageType + readonly property PasswordInfoContent infoContent: { + switch (contentType) { + case PasswordInfoContent.Type.PIN: + return pinInfo; + case PasswordInfoContent.Type.CHOOSE_PIN: + return choosePinInfo; + case PasswordInfoContent.Type.TRANSPORT_PIN: + return transportPinInfo; + case PasswordInfoContent.Type.SMARTPHONE_AS_CARD_READER: + return smartphoneAsCardReaderInfo; + case PasswordInfoContent.Type.PUK: + return pukInfo; + case PasswordInfoContent.Type.CAN: + return canInfo; + case PasswordInfoContent.Type.CAN_ALLOWED: + return canAllowedInfo; + case PasswordInfoContent.Type.CHANGE_PIN: + return changePinInfo; + case PasswordInfoContent.Type.SMART_BLOCKING_CODE: + return smartBlockingCodeInfo; + case PasswordInfoContent.Type.NO_PIN: + return noPin; + default: + return pinInfo; + } + } + readonly property string linkText: infoContent.linkText + readonly property string title: infoContent.title + + function fromPasswordType(pPasswordType, pIsCanAllowedMode = false) { + switch (pPasswordType) { + case PasswordType.PIN: + return PasswordInfoContent.Type.PIN; + case PasswordType.CAN: + return pIsCanAllowedMode ? PasswordInfoContent.Type.CAN_ALLOWED : PasswordInfoContent.Type.CAN; + case PasswordType.PUK: + return PasswordInfoContent.Type.PUK; + case PasswordType.NEW_PIN: + return PasswordInfoContent.Type.CHOOSE_PIN; + case PasswordType.TRANSPORT_PIN: + return PasswordInfoContent.Type.TRANSPORT_PIN; + default: + return PasswordInfoContent.Type.PIN; + } + } + + PasswordInfoContent { + id: pinInfo + //: LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. + hint: qsTr("If you have forgotten your card PIN, you can request a new PIN free of charge using the PIN Reset Service.") + + //: LABEL ALL_PLATFORMS + linkText: qsTr("What is the card PIN?") + //: LABEL ALL_PLATFORMS + title: qsTr("PIN information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("What is the card PIN?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'what is the card pin?' + qsTr("The card PIN is a 6-digit PIN that you set yourself. You always need this PIN if you want to use the eID function.")] + }, + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Where can I find the card PIN?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'Where can I find the card PIN?' + qsTr("You set the card PIN either directly when you picked up your ID card at the citizens' office (Bürgeramt) or later in AusweisApp2 using the 5-digit Transport PIN. Only when you have set a 6-digit PIN of your own choice can you use the eID function.")] + } + ] + } + PasswordInfoContent { + id: choosePinInfo + + //: LABEL ALL_PLATFORMS + linkText: qsTr("How do I choose a secure PIN?") + + //: LABEL ALL_PLATFORMS + title: qsTr("PIN information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("How do I choose a secure PIN?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 1/3 + qsTr("For your 6-digit PIN, choose a combination of numbers that cannot be guessed - i.e. neither \"123456\", nor your date of birth, nor any other numbers printed on your ID card."), + //: INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 2/3 + qsTr("You can change your 6-digit PIN at any time and an unlimited number of times as long as you know your valid PIN."), + //: INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 3/3 + qsTr("Keep your PIN secret and change it if another person becomes aware of it.")] + } + ] + } + PasswordInfoContent { + id: transportPinInfo + //: LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN, are not known. + hint: qsTr("If you do not know either your Transport PIN or your card PIN, you can request a new PIN free of charge using the PIN Reset Service.") + imageType: PasswordInfoImage.LETTER + + //: LABEL ALL_PLATFORMS + linkText: qsTr("What is the Transport PIN?") + //: LABEL ALL_PLATFORMS + title: qsTr("Transport PIN information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("What is the Transport PIN?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 1/3 + qsTr("The 5-digit Transport PIN was sent to you in the PIN letter by mail after you applied for your ID card."), + //: INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 2/3 + qsTr("If you did not set a self-selected 6-digit card PIN when you picked up your ID card, you can do so using the Transport PIN."), + //: INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 3/3 + qsTr("Once you have set a card PIN, the Transport PIN loses its validity.")] + } + ] + } + PasswordInfoContent { + id: smartphoneAsCardReaderInfo + imageType: PasswordInfoImage.SMARTPHONE_AS_CARD_READER + + //: LABEL ALL_PLATFORMS + title: qsTr("Smartphone as card reader information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Smartphone as card reader information") + paragraphList: [ + //: INFO ALL_PLATFORMS Description text of SaC pairing + qsTr("You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network."), + //: INFO ALL_PLATFORMS Description text of SaC pairing + qsTr("To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone.")] + } + ] + } + PasswordInfoContent { + id: pukInfo + hint: PinResetInformationModel.noPinAndNoPukHint + imageType: PasswordInfoImage.LETTER_PUK + + //: LABEL ALL_PLATFORMS + linkText: qsTr("Where do I find the PUK?") + //: LABEL ALL_PLATFORMS + title: qsTr("PUK information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Where do I find the PUK?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'Where do I find the PUK?' + qsTr("The PUK is a 10-digit number that you can find in the PIN letter that was sent to you by mail after you applied for your ID card.")] + }, + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Why is the PUK required?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'Why is the PUK required?' + qsTr("The PUK is required if the card PIN has been entered incorrectly three times in a row. As a result, the card PIN is blocked.")] + }, + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("What is the PUK's purpose?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'What is the PUK's purpose?' + qsTr("By entering the PUK, you unblock the card PIN and have another three chances to enter the correct PIN.")] + } + ] + } + PasswordInfoContent { + id: canInfo + imageType: PasswordInfoImage.CAN + + //: LABEL ALL_PLATFORMS + linkText: qsTr("Why is the CAN required?") + //: LABEL ALL_PLATFORMS + title: qsTr("CAN information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("When is the card access number (CAN) required?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'When is the card access number (CAN) required?' + qsTr("The card access number (CAN) is required when the card PIN has been entered incorrectly twice.")] + }, + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Why do I have to enter the CAN before a third attempt?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'Why do I have to enter the CAN before a third attempt?' + qsTr("A third incorrect entry blocks your PIN and you can no longer use the eID function until it is unblocked. Requesting the CAN ensures that a third incorrect entry can only be made with direct access to your ID card.")] + }, + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Where can I find the CAN?") + paragraphList: [ + //: INFO ALL_PLATFORMS Answer to the question 'Where can I find the CAN?' + qsTr("The CAN is a 6-digit number that can be found on the bottom right of the front of the ID card.")] + } + ] + } + PasswordInfoContent { + id: canAllowedInfo + imageType: PasswordInfoImage.CAN + + //: LABEL ALL_PLATFORMS + title: qsTr("CAN information") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("CAN information") + paragraphList: [ + //: INFO ALL_PLATFORMS Description text of CAN-allowed authentication + qsTr("The Card Access Number (CAN) allows to access the imprinted data of the ID card. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red).")] + } + ] + } + PasswordInfoContent { + id: changePinInfo + + //: LABEL ALL_PLATFORMS + linkText: qsTr("Learn more about the two types of PIN") + //: LABEL ALL_PLATFORMS + title: qsTr("Types of PIN") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Learn more about the two types of PIN") + paragraphList: [ + //: INFO ALL_PLATFORMS Description text explaining the PINs 1/6 + qsTr("Your ID card comes with a 5-digit 'Transport PIN' which you need to replace with a 6-digit PIN that you choose yourself.")] + }, + PasswordInfoContentBlock { + blockHeaderImageType: PasswordInfoImage.Type.LETTER + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("5-digit Transport PIN") + paragraphList: [ + //: INFO ALL_PLATFORMS Description text explaining the PINs 2/6 + qsTr("The 5-digit Transport PIN was sent to you by post after you applied for your ID card."), + //: INFO ALL_PLATFORMS Description text explaining the PINs 3/6 + qsTr("The PIN can only be used once. When you set up the eID function, you will replace this 5-digit PIN with a 6-digit PIN that you choose yourself.")] + }, + PasswordInfoContentBlock { + blockHeaderImageType: PasswordInfoImage.Type.PIN + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("6-digit PIN") + paragraphList: [ + //: INFO ALL_PLATFORMS Description text explaining the PINs 4/6 + qsTr("This is a number that you choose yourself when you set up the eID function for the first time. It replaces your 5-digit Transport PIN."), + //: INFO ALL_PLATFORMS Description text explaining the PINs 5/6 + qsTr("This PIN allows you to prove online that the ID card belongs to you. No one can use your ID card online without this PIN."), + //: INFO ALL_PLATFORMS Description text explaining the PINs 6/6 + qsTr("You can change your 6-digit PIN at any time in AusweisApp2.")] + } + ] + } + PasswordInfoContent { + id: smartBlockingCodeInfo + + //: LABEL ANDROID IOS + title: qsTr("Smart-eID blocking code") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("Smart-eID blocking code") + paragraphList: [ + //: INFO ANDROID IOS Description text of Smart-eID PIN + qsTr("Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device."), + //: INFO ANDROID IOS Description text of Smart-eID PIN + qsTr("To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation.")] + } + ] + } + PasswordInfoContent { + id: noPin + //: LABEL ALL_PLATFORMS + hint: qsTr("You can use the PIN Reset Service to request a new card PIN free of charge.") + imageType: Constants.is_desktop ? PasswordInfoImage.NONE : PasswordInfoImage.NO_PIN + + //: LABEL ALL_PLATFORMS + title: qsTr("No PIN known") + + contentList: [ + PasswordInfoContentBlock { + //: LABEL ALL_PLATFORMS + blockTitle: qsTr("You do not know your PIN?") + paragraphList: [ + //: INFO ALL_PLATFORMS + qsTr("You have not yet set a 6-digit card PIN and cannot find the PIN letter with the Transport PIN?"), + //: INFO ALL_PLATFORMS + qsTr("You set a card PIN when picking up your ID card or later by yourself, but you can no longer remember it?")] + } + ] + } +} diff --git a/resources/qml/Governikus/PasswordInfoView/PasswordInfoImage.qml b/resources/qml/Governikus/PasswordInfoView/PasswordInfoImage.qml new file mode 100644 index 000000000..2e0b847e0 --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/PasswordInfoImage.qml @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import Governikus.Global 1.0 +import Governikus.Style 1.0 + +Item { + id: root + enum Type { + NONE, + LETTER, + LETTER_PUK, + CAN, + SMARTPHONE_AS_CARD_READER, + SMART, + NO_PIN, + PIN + } + + property int imageType: PasswordInfoImage.Type.LETTER + property real scaleFactorCan: 1 + property real scaleFactorGeneral: 1 + + height: root.implicitHeight + implicitHeight: infoImageContainer.height + implicitWidth: infoImageContainer.width + visible: infoImage.source.toString() !== "" + width: root.implicitWidth + + Item { + id: infoImageContainer + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + height: imageType == PasswordInfoImage.Type.CAN ? (Constants.is_desktop ? 255 : 159) * scaleFactorCan : infoImage.implicitHeight + width: imageType == PasswordInfoImage.Type.CAN ? (Constants.is_desktop ? 400 : 250) * scaleFactorCan : infoImage.implicitWidth + + TintableIcon { + id: infoImage + anchors.fill: parent + source: switch (imageType) { + case PasswordInfoImage.Type.CAN: + return "qrc:///images/id_card.png"; + case PasswordInfoImage.Type.SMARTPHONE_AS_CARD_READER: + return "qrc:///images/phone_to_pc.svg"; + case PasswordInfoImage.Type.SMART: + return ""; + case PasswordInfoImage.Type.LETTER_PUK: + return "qrc:///images/pin_letter_pinpuk_red_bar_puk.svg"; + case PasswordInfoImage.Type.NO_PIN: + return "qrc:///images/material_live_help.svg"; + case PasswordInfoImage.Type.PIN: + return "qrc:///images/pin_person.svg"; + default: + return "qrc:///images/pin_letter_pinpuk_red_bar.svg"; + } + sourceSize.width: { + switch (imageType) { + case PasswordInfoImage.Type.CAN: + return undefined; + case PasswordInfoImage.Type.NO_PIN: + return 100 * scaleFactorGeneral; + default: + return 200 * scaleFactorGeneral; + } + } + tintColor: Style.color.accent + tintEnabled: imageType == PasswordInfoImage.Type.NO_PIN + width: parent.width + + Rectangle { + readonly property real leftEdge: (parent.width - parent.paintedWidth) / 2.0 + readonly property real topEdge: (parent.height - parent.paintedHeight) / 2.0 + + anchors.left: parent.left + anchors.leftMargin: parent.paintedWidth * 0.7475 + leftEdge + anchors.top: parent.top + anchors.topMargin: parent.paintedWidth * 0.4175 + topEdge + border.color: Constants.red + border.width: Math.max(1, parent.paintedWidth * 0.015) + color: Style.color.transparent + height: parent.paintedWidth * 0.0625 + visible: imageType == PasswordInfoImage.Type.CAN + width: parent.paintedWidth * 0.2 + } + } + } +} diff --git a/resources/qml/Governikus/PasswordInfoView/qmldir b/resources/qml/Governikus/PasswordInfoView/qmldir new file mode 100644 index 000000000..bfc911355 --- /dev/null +++ b/resources/qml/Governikus/PasswordInfoView/qmldir @@ -0,0 +1,8 @@ +module PasswordInfoView + +internal PasswordInfoContentBlock PasswordInfoContentBlock.qml +internal PasswordInfoContentParagraph PasswordInfoContentParagraph.qml + +PasswordInfoData 1.0 PasswordInfoData.qml +PasswordInfoContent 1.0 PasswordInfoContent.qml +PasswordInfoView 1.0 PasswordInfoView.qml diff --git a/resources/qml/Governikus/ProgressView/+desktop/ProgressView.qml b/resources/qml/Governikus/ProgressView/+desktop/ProgressView.qml index bd3c995c4..ec0fcda2e 100644 --- a/resources/qml/Governikus/ProgressView/+desktop/ProgressView.qml +++ b/resources/qml/Governikus/ProgressView/+desktop/ProgressView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/ProgressView/+mobile/ProgressView.qml b/resources/qml/Governikus/ProgressView/+mobile/ProgressView.qml index fef85790c..ff745ab2b 100644 --- a/resources/qml/Governikus/ProgressView/+mobile/ProgressView.qml +++ b/resources/qml/Governikus/ProgressView/+mobile/ProgressView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Provider/+desktop/ProviderDetailButtonBar.qml b/resources/qml/Governikus/Provider/+desktop/ProviderDetailButtonBar.qml index dcf006d94..569d822a1 100644 --- a/resources/qml/Governikus/Provider/+desktop/ProviderDetailButtonBar.qml +++ b/resources/qml/Governikus/Provider/+desktop/ProviderDetailButtonBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistory.qml b/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistory.qml index d58168f09..57bbe4b63 100644 --- a/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistory.qml +++ b/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistory.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistoryItem.qml b/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistoryItem.qml index 01c749b78..66ec310be 100644 --- a/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistoryItem.qml +++ b/resources/qml/Governikus/Provider/+desktop/ProviderDetailHistoryItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -37,11 +37,10 @@ Item { columns: 2 GText { - font.weight: Font.Bold maximumLineCount: 1 //: LABEL DESKTOP text: qsTr("Service:") - textStyle: Style.text.normal + textStyle: Style.text.normal_highlight } GText { Layout.fillWidth: true @@ -51,11 +50,10 @@ Item { textStyle: Style.text.normal } GText { - font.weight: Font.Bold maximumLineCount: 1 //: LABEL DESKTOP text: qsTr("Provider:") - textStyle: Style.text.normal + textStyle: Style.text.normal_highlight } GText { Layout.fillWidth: true diff --git a/resources/qml/Governikus/Provider/+desktop/ProviderDetailView.qml b/resources/qml/Governikus/Provider/+desktop/ProviderDetailView.qml index f5c0190c3..4a274835d 100644 --- a/resources/qml/Governikus/Provider/+desktop/ProviderDetailView.qml +++ b/resources/qml/Governikus/Provider/+desktop/ProviderDetailView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Provider/+desktop/ProviderInfoSection.qml b/resources/qml/Governikus/Provider/+desktop/ProviderInfoSection.qml index ffc4334a8..bd732e15f 100644 --- a/resources/qml/Governikus/Provider/+desktop/ProviderInfoSection.qml +++ b/resources/qml/Governikus/Provider/+desktop/ProviderInfoSection.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/+phone/ProviderDetailView.qml b/resources/qml/Governikus/Provider/+mobile/+phone/ProviderDetailView.qml index cfee595cb..a97370549 100644 --- a/resources/qml/Governikus/Provider/+mobile/+phone/ProviderDetailView.qml +++ b/resources/qml/Governikus/Provider/+mobile/+phone/ProviderDetailView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Provider/+mobile/+phone/ProviderHeader.qml b/resources/qml/Governikus/Provider/+mobile/+phone/ProviderHeader.qml index dee93feff..1e0318884 100644 --- a/resources/qml/Governikus/Provider/+mobile/+phone/ProviderHeader.qml +++ b/resources/qml/Governikus/Provider/+mobile/+phone/ProviderHeader.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailButtonBar.qml b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailButtonBar.qml index 05fa5510e..df759e248 100644 --- a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailButtonBar.qml +++ b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailButtonBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistory.qml b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistory.qml index 82864559c..2e47d6dd7 100644 --- a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistory.qml +++ b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistory.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryInfo.qml b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryInfo.qml index f53cbf40f..425747973 100644 --- a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryInfo.qml +++ b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryInfo.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryItem.qml b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryItem.qml index 8f24b1e8e..418c62d5f 100644 --- a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryItem.qml +++ b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailHistoryItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailView.qml b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailView.qml index 0e63bbfd9..35baf63ba 100644 --- a/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailView.qml +++ b/resources/qml/Governikus/Provider/+mobile/+tablet/ProviderDetailView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Provider/+mobile/ProviderDetailDescription.qml b/resources/qml/Governikus/Provider/+mobile/ProviderDetailDescription.qml index 420edaa5a..c44a554c6 100644 --- a/resources/qml/Governikus/Provider/+mobile/ProviderDetailDescription.qml +++ b/resources/qml/Governikus/Provider/+mobile/ProviderDetailDescription.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/+mobile/ProviderInfoSection.qml b/resources/qml/Governikus/Provider/+mobile/ProviderInfoSection.qml index 885813f44..752b7b58e 100644 --- a/resources/qml/Governikus/Provider/+mobile/ProviderInfoSection.qml +++ b/resources/qml/Governikus/Provider/+mobile/ProviderInfoSection.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Provider/ProviderContactInfo.qml b/resources/qml/Governikus/Provider/ProviderContactInfo.qml index 321b75c6d..9899263e6 100644 --- a/resources/qml/Governikus/Provider/ProviderContactInfo.qml +++ b/resources/qml/Governikus/Provider/ProviderContactInfo.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Provider/ProviderContactInfoItem.qml b/resources/qml/Governikus/Provider/ProviderContactInfoItem.qml index 4fe42ead3..04e4924cf 100644 --- a/resources/qml/Governikus/Provider/ProviderContactInfoItem.qml +++ b/resources/qml/Governikus/Provider/ProviderContactInfoItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Provider/ProviderModelItem.qml b/resources/qml/Governikus/Provider/ProviderModelItem.qml index 3c9d0de0e..30c6a5550 100644 --- a/resources/qml/Governikus/Provider/ProviderModelItem.qml +++ b/resources/qml/Governikus/Provider/ProviderModelItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Type.ApplicationModel 1.0 diff --git a/resources/qml/Governikus/ProviderView/+desktop/ProviderOverview.qml b/resources/qml/Governikus/ProviderView/+desktop/ProviderOverview.qml index e0e4ec4fb..6a4e0aa71 100644 --- a/resources/qml/Governikus/ProviderView/+desktop/ProviderOverview.qml +++ b/resources/qml/Governikus/ProviderView/+desktop/ProviderOverview.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -29,18 +29,23 @@ SectionPage { contentDelegate: content contentPadding: 0 sectionsModel: [{ + //: LABEL DESKTOP "categoryName": qsTr("All provider"), "category": "all" }, { + //: LABEL DESKTOP "categoryName": qsTr("Citizen services"), "category": "citizen" }, { + //: LABEL DESKTOP "categoryName": qsTr("Financials"), "category": "finance" }, { + //: LABEL DESKTOP "categoryName": qsTr("Insurances"), "category": "insurance" }, { + //: LABEL DESKTOP "categoryName": qsTr("Other services"), "category": "other" }] diff --git a/resources/qml/Governikus/ProviderView/+desktop/ProviderView.qml b/resources/qml/Governikus/ProviderView/+desktop/ProviderView.qml index 736ecd9c8..0607f503e 100644 --- a/resources/qml/Governikus/ProviderView/+desktop/ProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+desktop/ProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+android/+phone/ProviderView.qml b/resources/qml/Governikus/ProviderView/+mobile/+android/+phone/ProviderView.qml index 6939728cf..3dcf783a8 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+android/+phone/ProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+android/+phone/ProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+android/+tablet/ProviderView.qml b/resources/qml/Governikus/ProviderView/+mobile/+android/+tablet/ProviderView.qml index 8ae1a0301..263603107 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+android/+tablet/ProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+android/+tablet/ProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+ios/+phone/ProviderView.qml b/resources/qml/Governikus/ProviderView/+mobile/+ios/+phone/ProviderView.qml index 525bff648..a422feb7b 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+ios/+phone/ProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+ios/+phone/ProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+ios/+tablet/ProviderView.qml b/resources/qml/Governikus/ProviderView/+mobile/+ios/+tablet/ProviderView.qml index 095fb872f..3441f6a4e 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+ios/+tablet/ProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+ios/+tablet/ProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+phone/AdditionalResultsItem.qml b/resources/qml/Governikus/ProviderView/+mobile/+phone/AdditionalResultsItem.qml index 8cd371bde..1f9fca024 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+phone/AdditionalResultsItem.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+phone/AdditionalResultsItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+phone/BaseProviderView.qml b/resources/qml/Governikus/ProviderView/+mobile/+phone/BaseProviderView.qml index 91a0362fd..c6ce793af 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+phone/BaseProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+phone/BaseProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+phone/ProviderListItemDelegate.qml b/resources/qml/Governikus/ProviderView/+mobile/+phone/ProviderListItemDelegate.qml index d4d98b328..c70d02f62 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+phone/ProviderListItemDelegate.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+phone/ProviderListItemDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+tablet/BaseProviderView.qml b/resources/qml/Governikus/ProviderView/+mobile/+tablet/BaseProviderView.qml index eb9d73d2b..f401a015f 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+tablet/BaseProviderView.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+tablet/BaseProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/ProviderView/+mobile/+tablet/CategoryCheckbox.qml b/resources/qml/Governikus/ProviderView/+mobile/+tablet/CategoryCheckbox.qml index ffd89e130..04fdd04ca 100644 --- a/resources/qml/Governikus/ProviderView/+mobile/+tablet/CategoryCheckbox.qml +++ b/resources/qml/Governikus/ProviderView/+mobile/+tablet/CategoryCheckbox.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/ProviderView/AdditionalResultsFooterItem.qml b/resources/qml/Governikus/ProviderView/AdditionalResultsFooterItem.qml index 77d1ea611..4a2320ee4 100644 --- a/resources/qml/Governikus/ProviderView/AdditionalResultsFooterItem.qml +++ b/resources/qml/Governikus/ProviderView/AdditionalResultsFooterItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/ProviderView/ProviderCard.qml b/resources/qml/Governikus/ProviderView/ProviderCard.qml index ebf83e50a..b95c1a854 100644 --- a/resources/qml/Governikus/ProviderView/ProviderCard.qml +++ b/resources/qml/Governikus/ProviderView/ProviderCard.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Window 2.10 diff --git a/resources/qml/Governikus/ProviderView/ProviderGridView.qml b/resources/qml/Governikus/ProviderView/ProviderGridView.qml index 4cb36e60d..4efb23dd8 100644 --- a/resources/qml/Governikus/ProviderView/ProviderGridView.qml +++ b/resources/qml/Governikus/ProviderView/ProviderGridView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/RemoteServiceView/+mobile/DevicesListDelegate.qml b/resources/qml/Governikus/RemoteServiceView/+mobile/DevicesListDelegate.qml index a62c36d96..1693ad2db 100644 --- a/resources/qml/Governikus/RemoteServiceView/+mobile/DevicesListDelegate.qml +++ b/resources/qml/Governikus/RemoteServiceView/+mobile/DevicesListDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/RemoteServiceView/+mobile/LocalNetworkInfo.qml b/resources/qml/Governikus/RemoteServiceView/+mobile/LocalNetworkInfo.qml index 0df39e14e..9b4363820 100644 --- a/resources/qml/Governikus/RemoteServiceView/+mobile/LocalNetworkInfo.qml +++ b/resources/qml/Governikus/RemoteServiceView/+mobile/LocalNetworkInfo.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -19,9 +19,10 @@ Column { } MoreInformationLink { anchors.horizontalCenter: parent.horizontalCenter - + iconVisible: false //: INFO IOS Link to application settings text: qsTr("Go to application settings") + textStyle: Style.text.normal_accent onClicked: ApplicationModel.showSettings(ApplicationModel.SETTING_APP) } diff --git a/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceView.qml b/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceView.qml index 04bec6a53..b6bd1b3d9 100644 --- a/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceView.qml +++ b/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceViewRemote.qml b/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceViewRemote.qml index 1c6bfc117..a26871a0c 100644 --- a/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceViewRemote.qml +++ b/resources/qml/Governikus/RemoteServiceView/+mobile/RemoteServiceViewRemote.qml @@ -1,10 +1,11 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 import Governikus.EnterPasswordView 1.0 import Governikus.Global 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.Style 1.0 import Governikus.TitleBar 1.0 import Governikus.Type.ApplicationModel 1.0 @@ -169,6 +170,18 @@ Item { push(enterPinView); } } + PasswordInfoData { + id: infoData + contentType: PasswordInfoContent.Type.SMARTPHONE_AS_CARD_READER + } + Component { + id: passwordInfoView + PasswordInfoView { + infoContent: infoData + + onClose: pop() + } + } Component { id: enterPinView EnterPasswordView { @@ -177,6 +190,7 @@ Item { pop(); } + moreInformationText: infoData.linkText passwordType: PasswordType.REMOTE_PIN //: LABEL ANDROID IOS title: qsTr("Pairing code") @@ -188,6 +202,7 @@ Item { } onPasswordEntered: close() + onRequestPasswordInfo: push(passwordInfoView) } } } diff --git a/resources/qml/Governikus/RemoteServiceView/LinkQuality.qml b/resources/qml/Governikus/RemoteServiceView/LinkQuality.qml index 8959f97e1..42684021e 100644 --- a/resources/qml/Governikus/RemoteServiceView/LinkQuality.qml +++ b/resources/qml/Governikus/RemoteServiceView/LinkQuality.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/RemoteServiceView/RemoteServiceController.qml b/resources/qml/Governikus/RemoteServiceView/RemoteServiceController.qml index d44bd7306..005781765 100644 --- a/resources/qml/Governikus/RemoteServiceView/RemoteServiceController.qml +++ b/resources/qml/Governikus/RemoteServiceView/RemoteServiceController.qml @@ -1,14 +1,16 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 -import Governikus.View 1.0 -import Governikus.Type.RemoteServiceModel 1.0 import Governikus.EnterPasswordView 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.TitleBar 1.0 -import Governikus.Type.ReaderPlugIn 1.0 +import Governikus.View 1.0 import Governikus.Type.NumberModel 1.0 +import Governikus.Type.PasswordType 1.0 +import Governikus.Type.ReaderPlugIn 1.0 +import Governikus.Type.RemoteServiceModel 1.0 Controller { id: controller @@ -46,11 +48,24 @@ Controller { target: RemoteServiceModel } + PasswordInfoData { + id: infoData + contentType: fromPasswordType(NumberModel.passwordType) + } + Component { + id: passwordInfoView + PasswordInfoView { + infoContent: infoData + + onClose: pop() + } + } Component { id: enterPinView EnterPasswordView { id: passwordView enableTransportPinLink: RemoteServiceModel.enableTransportPinLink + moreInformationText: infoData.linkText navigationAction: NavigationAction { action: NavigationAction.Action.Cancel @@ -68,6 +83,7 @@ Controller { pop(); RemoteServiceModel.continueWorkflow(); } + onRequestPasswordInfo: push(passwordInfoView) Connections { function onFireConnectedChanged() { diff --git a/resources/qml/Governikus/RemoteServiceView/RemoteServiceSettings.qml b/resources/qml/Governikus/RemoteServiceView/RemoteServiceSettings.qml index 2585c71af..a419e9d8e 100644 --- a/resources/qml/Governikus/RemoteServiceView/RemoteServiceSettings.qml +++ b/resources/qml/Governikus/RemoteServiceView/RemoteServiceSettings.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/ResultView/+desktop/ResultView.qml b/resources/qml/Governikus/ResultView/+desktop/ResultView.qml index f054cad45..b724585ba 100644 --- a/resources/qml/Governikus/ResultView/+desktop/ResultView.qml +++ b/resources/qml/Governikus/ResultView/+desktop/ResultView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/ResultView/+mobile/ResultErrorView.qml b/resources/qml/Governikus/ResultView/+mobile/ResultErrorView.qml index 04695b80f..825e9dbad 100644 --- a/resources/qml/Governikus/ResultView/+mobile/ResultErrorView.qml +++ b/resources/qml/Governikus/ResultView/+mobile/ResultErrorView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -38,7 +38,9 @@ ResultView { } } GText { - text: qsTr("Error code: %1").arg(errorCode) + //: LABEL ANDROID IOS + text: "%1 %2".arg(qsTr("Error code:")).arg(errorCode) + textStyle: Style.text.normal_highlight visible: baseItem.errorDetailsShown anchors { diff --git a/resources/qml/Governikus/ResultView/+mobile/ResultView.qml b/resources/qml/Governikus/ResultView/+mobile/ResultView.qml index fabe2b024..6bc3964d0 100644 --- a/resources/qml/Governikus/ResultView/+mobile/ResultView.qml +++ b/resources/qml/Governikus/ResultView/+mobile/ResultView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SelfAuthenticationView/+desktop/SelfAuthenticationView.qml b/resources/qml/Governikus/SelfAuthenticationView/+desktop/SelfAuthenticationView.qml index b4fb4d7b0..8943a37dd 100644 --- a/resources/qml/Governikus/SelfAuthenticationView/+desktop/SelfAuthenticationView.qml +++ b/resources/qml/Governikus/SelfAuthenticationView/+desktop/SelfAuthenticationView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import Governikus.Global 1.0 import Governikus.Style 1.0 @@ -74,7 +74,6 @@ SectionPage { } PrivacyStatement { activeFocusOnTab: true - textStyle: Style.text.normal width: parent.width FocusFrame { diff --git a/resources/qml/Governikus/SelfAuthenticationView/+mobile/SelfAuthenticationView.qml b/resources/qml/Governikus/SelfAuthenticationView/+mobile/SelfAuthenticationView.qml index 5fce21858..c5d288826 100644 --- a/resources/qml/Governikus/SelfAuthenticationView/+mobile/SelfAuthenticationView.qml +++ b/resources/qml/Governikus/SelfAuthenticationView/+mobile/SelfAuthenticationView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SettingsView/+desktop/CardReaderDelegate.qml b/resources/qml/Governikus/SettingsView/+desktop/CardReaderDelegate.qml index 75b02db08..334cc8c8c 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/CardReaderDelegate.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/CardReaderDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -45,8 +45,8 @@ Item { tintColor: Style.color.success } PropertyChanges { - font.bold: false target: textDescription + textStyle: Style.text.normal } }, State { @@ -61,8 +61,8 @@ Item { tintColor: "#e68a00" } PropertyChanges { - font.bold: true target: textDescription + textStyle: Style.text.normal_highlight } }, State { @@ -77,8 +77,8 @@ Item { tintColor: Style.color.warning_text } PropertyChanges { - font.bold: false target: textDescription + textStyle: Style.text.normal } } ] @@ -121,7 +121,6 @@ Item { Layout.fillWidth: true activeFocusOnTab: true text: readerHTMLDescription - textStyle: Style.text.normal FocusFrame { } diff --git a/resources/qml/Governikus/SettingsView/+desktop/CardReaderView.qml b/resources/qml/Governikus/SettingsView/+desktop/CardReaderView.qml index 611b4de75..b3cc1d100 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/CardReaderView.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/CardReaderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SettingsView/+desktop/ConnectSacView.qml b/resources/qml/Governikus/SettingsView/+desktop/ConnectSacView.qml index af12f5911..0da8356f2 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/ConnectSacView.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/ConnectSacView.qml @@ -1,9 +1,10 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 import Governikus.EnterPasswordView 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.ProgressView 1.0 import Governikus.ResultView 1.0 import Governikus.TitleBar 1.0 @@ -80,10 +81,13 @@ SectionPage { } } PasswordInfoView { - passwordType: PasswordType.REMOTE_PIN rootEnabled: mainTitleBarAction.rootEnabled visible: d.view === ConnectSacView.SubView.PairingInfo + infoContent: PasswordInfoData { + contentType: PasswordInfoContent.Type.SMARTPHONE_AS_CARD_READER + } + onClose: { if (d.externalMoreInformation) { root.closeView(); diff --git a/resources/qml/Governikus/SettingsView/+desktop/DebugSettings.qml b/resources/qml/Governikus/SettingsView/+desktop/DebugSettings.qml index aff4b2f08..d3269efe3 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/DebugSettings.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/DebugSettings.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick.Layouts 1.15 import Governikus.Global 1.0 @@ -38,21 +38,21 @@ ColumnLayout { } } } - ToggleableOption { + GCheckBox { checked: SettingsModel.showBetaTesting //: LABEL DESKTOP text: qsTr("Show beta testing image") onCheckedChanged: SettingsModel.showBetaTesting = checked } - ToggleableOption { + GCheckBox { checked: SettingsModel.enableCanAllowed //: LABEL DESKTOP text: qsTr("Support CAN allowed mode") onCheckedChanged: SettingsModel.enableCanAllowed = checked } - ToggleableOption { + GCheckBox { checked: SettingsModel.skipRightsOnCanAllowed enabled: SettingsModel.enableCanAllowed //: LABEL DESKTOP diff --git a/resources/qml/Governikus/SettingsView/+desktop/DeveloperSettings.qml b/resources/qml/Governikus/SettingsView/+desktop/DeveloperSettings.qml index eb628ad5e..01fa608b9 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/DeveloperSettings.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/DeveloperSettings.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick.Layouts 1.15 import Governikus.Global 1.0 @@ -25,8 +25,7 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.useSelfauthenticationTestUri //: LABEL DESKTOP @@ -34,7 +33,7 @@ ColumnLayout { onCheckedChanged: SettingsModel.useSelfauthenticationTestUri = checked } - ToggleableOption { + GCheckBox { checked: SettingsModel.enableSimulator //: LABEL DESKTOP text: qsTr("Enable internal card simulator") @@ -51,8 +50,7 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.developerMode //: LABEL DESKTOP diff --git a/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml b/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml index 0fa5f4f3c..410cd3cb5 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -39,9 +39,8 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { + GCheckBox { Layout.fillWidth: true - activeFocusOnTab: true checked: SettingsModel.autoStartApp enabled: !SettingsModel.autoStartSetByAdmin && SettingsModel.autoStartAvailable maximumLineCount: 2 @@ -53,8 +52,7 @@ ColumnLayout { onCheckedChanged: SettingsModel.autoStartApp = checked } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.autoCloseWindowAfterAuthentication //: LABEL DESKTOP @@ -62,8 +60,7 @@ ColumnLayout { onCheckedChanged: SettingsModel.autoCloseWindowAfterAuthentication = checked } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.showInAppNotifications enabled: !SettingsModel.developerMode @@ -99,9 +96,8 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { + GCheckBox { id: customProxySetting - activeFocusOnTab: true checked: SettingsModel.useCustomProxy //: LABEL DESKTOP diff --git a/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderDelegate.qml b/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderDelegate.qml index e6f8c4e9a..63647b258 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderDelegate.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderView.qml b/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderView.qml index 7278c1911..57a6726d2 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderView.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/RemoteReaderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SettingsView/+desktop/SecurityAndPrivacySettings.qml b/resources/qml/Governikus/SettingsView/+desktop/SecurityAndPrivacySettings.qml index 432007d1e..75517f7b5 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/SecurityAndPrivacySettings.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/SecurityAndPrivacySettings.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -26,8 +26,7 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.historyEnabled //: LABEL DESKTOP @@ -56,8 +55,7 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.useScreenKeyboard //: LABEL DESKTOP @@ -65,8 +63,7 @@ ColumnLayout { onCheckedChanged: SettingsModel.useScreenKeyboard = checked } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.shuffleScreenKeyboard enabled: SettingsModel.useScreenKeyboard @@ -75,8 +72,7 @@ ColumnLayout { onCheckedChanged: SettingsModel.shuffleScreenKeyboard = checked } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: !SettingsModel.visualPrivacy enabled: SettingsModel.useScreenKeyboard @@ -98,8 +94,7 @@ ColumnLayout { FocusFrame { } } - ToggleableOption { - activeFocusOnTab: true + GCheckBox { checked: SettingsModel.autoUpdateCheck enabled: !SettingsModel.autoUpdateCheckSetByAdmin && SettingsModel.autoUpdateAvailable diff --git a/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml b/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml index 2969f73b9..bd7238ae6 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml.Models 2.15 diff --git a/resources/qml/Governikus/SettingsView/+desktop/TabbedReaderView.qml b/resources/qml/Governikus/SettingsView/+desktop/TabbedReaderView.qml index 8c281ddda..3f7c6d40f 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/TabbedReaderView.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/TabbedReaderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml.Models 2.15 diff --git a/resources/qml/Governikus/SettingsView/+mobile/LanguageSelectionPopup.qml b/resources/qml/Governikus/SettingsView/+mobile/LanguageSelectionPopup.qml index bdd9ad9a2..752f86068 100644 --- a/resources/qml/Governikus/SettingsView/+mobile/LanguageSelectionPopup.qml +++ b/resources/qml/Governikus/SettingsView/+mobile/LanguageSelectionPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SettingsView/+mobile/ScreenOrientationSelectionPopup.qml b/resources/qml/Governikus/SettingsView/+mobile/ScreenOrientationSelectionPopup.qml index 3a07cba12..f025bce9d 100644 --- a/resources/qml/Governikus/SettingsView/+mobile/ScreenOrientationSelectionPopup.qml +++ b/resources/qml/Governikus/SettingsView/+mobile/ScreenOrientationSelectionPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SettingsView/+mobile/SettingsView.qml b/resources/qml/Governikus/SettingsView/+mobile/SettingsView.qml index 52342fbe8..33a375429 100644 --- a/resources/qml/Governikus/SettingsView/+mobile/SettingsView.qml +++ b/resources/qml/Governikus/SettingsView/+mobile/SettingsView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/SettingsView/LanguageButtons.qml b/resources/qml/Governikus/SettingsView/LanguageButtons.qml index a6f615b30..79c8be09f 100644 --- a/resources/qml/Governikus/SettingsView/LanguageButtons.qml +++ b/resources/qml/Governikus/SettingsView/LanguageButtons.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SmartView/+mobile/PersonalizationController.qml b/resources/qml/Governikus/SmartView/+mobile/PersonalizationController.qml index 5a9869140..82713d611 100644 --- a/resources/qml/Governikus/SmartView/+mobile/PersonalizationController.qml +++ b/resources/qml/Governikus/SmartView/+mobile/PersonalizationController.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.AuthView 1.0 @@ -7,6 +7,7 @@ import Governikus.EnterPasswordView 1.0 import Governikus.ResultView 1.0 import Governikus.Style 1.0 import Governikus.TitleBar 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.View 1.0 import Governikus.WhiteListClient 1.0 import Governikus.Workflow 1.0 @@ -193,6 +194,7 @@ Controller { Component { id: transportPinReminder TransportPinReminderView { + moreInformationText: transportPinReminderInfoData.linkText title: smartEidTitle titleBarColor: Style.color.accent @@ -205,6 +207,21 @@ Controller { pop(); PersonalizationModel.cancelWorkflowToChangePin(); } + onShowInfoView: { + push(transportPinReminderInfoDataView); + } + } + } + PasswordInfoData { + id: transportPinReminderInfoData + contentType: PasswordInfoContent.Type.CHANGE_PIN + } + Component { + id: transportPinReminderInfoView + PasswordInfoView { + infoContent: transportPinReminderInfoData + + onClose: pop() } } Component { @@ -265,7 +282,6 @@ Controller { Component { id: enterPinView EnterPasswordView { - enableTransportPinLink: NumberModel.passwordType === PasswordType.PIN //: LABEL ANDROID IOS title: qsTr("Set up Smart-eID") titleBarColor: workflowState === PersonalizationController.WorkflowStates.Pin ? Style.color.accent : Style.color.accent_smart @@ -278,10 +294,6 @@ Controller { } } - onChangePinLength: { - replace(smartProgress); - PersonalizationModel.requestTransportPinChange(); - } onPasswordEntered: { replace(smartProgress); PersonalizationModel.continueWorkflow(); diff --git a/resources/qml/Governikus/SmartView/+mobile/PersonalizationLegalInformationView.qml b/resources/qml/Governikus/SmartView/+mobile/PersonalizationLegalInformationView.qml index bed16d879..34d2e3b3c 100644 --- a/resources/qml/Governikus/SmartView/+mobile/PersonalizationLegalInformationView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/PersonalizationLegalInformationView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Style 1.0 diff --git a/resources/qml/Governikus/SmartView/+mobile/PersonalizationProgressView.qml b/resources/qml/Governikus/SmartView/+mobile/PersonalizationProgressView.qml index cd32f5a02..10ca09719 100644 --- a/resources/qml/Governikus/SmartView/+mobile/PersonalizationProgressView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/PersonalizationProgressView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/SmartView/+mobile/PersonalizationResultView.qml b/resources/qml/Governikus/SmartView/+mobile/PersonalizationResultView.qml index 4f69d446e..dfebebbbb 100644 --- a/resources/qml/Governikus/SmartView/+mobile/PersonalizationResultView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/PersonalizationResultView.qml @@ -1,13 +1,13 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 -import Governikus.EnterPasswordView 1.0 import Governikus.Global 1.0 +import Governikus.PasswordInfoView 1.0 +import Governikus.ResultView 1.0 import Governikus.Style 1.0 import Governikus.TitleBar 1.0 -import Governikus.ResultView 1.0 import Governikus.Type.PasswordType 1.0 import Governikus.Type.PersonalizationModel 1.0 @@ -41,10 +41,9 @@ ResultErrorView { } GText { Layout.fillWidth: true - font.bold: true horizontalAlignment: Text.AlignHCenter text: PersonalizationModel.blockingCode - textStyle: Style.text.header + textStyle: Style.text.header_highlight visible: text !== "" } GText { @@ -56,14 +55,14 @@ ResultErrorView { } GText { Layout.fillWidth: true - font.bold: true //: INFO ANDROID IOS Placeholder (error) text if the Smart-eID setup finished successfully but for some reason no blocking code was retrieved text: qsTr("The Smart-eID setup finished successfully but no blocking code was retrieved. For security reasons, you should delete your Smart-eID and restart the setup.") - textStyle: Style.text.normal_warning + textStyle: Style.text.normal_warning_highlight visible: PersonalizationModel.blockingCode === "" } MoreInformationLink { Layout.alignment: Qt.AlignHCenter + text: infoData.linkText onClicked: push(passwordInfoView) } @@ -85,10 +84,14 @@ ResultErrorView { visible: text !== "" } } + PasswordInfoData { + id: infoData + contentType: PasswordInfoContent.Type.SMART_BLOCKING_CODE + } Component { id: passwordInfoView PasswordInfoView { - passwordType: PasswordType.SMART_BLOCKING_CODE + infoContent: infoData titleBarColor: root.titleBarColor navigationAction: NavigationAction { diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartCardView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartCardView.qml index 266749796..f8cdb5dc9 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartCardView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartCardView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartDeleteStartView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartDeleteStartView.qml index 9cd023f58..57756c939 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartDeleteStartView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartDeleteStartView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartMainView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartMainView.qml index fb94a5521..b829f63ab 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartMainView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartMainView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartSettingsView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartSettingsView.qml index 805032691..898b337b9 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartSettingsView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartSettingsView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartSetupStartView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartSetupStartView.qml index fd4ea84fa..a00517101 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartSetupStartView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartSetupStartView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartUpdateStartView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartUpdateStartView.qml index 8bbe5defc..d116fa71d 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartUpdateStartView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartUpdateStartView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -60,10 +60,10 @@ SectionPage { width: parent.width } GText { - font.bold: true //: LABEL ANDROID IOS text: qsTr("Please note that your current Smart-eID is invalidated during the process and will not be usable until the update process is completed.") + textStyle: Style.text.normal_highlight width: parent.width } PrivacyStatement { diff --git a/resources/qml/Governikus/SmartView/+mobile/SmartView.qml b/resources/qml/Governikus/SmartView/+mobile/SmartView.qml index 1a2f81675..fc2a8fbc6 100644 --- a/resources/qml/Governikus/SmartView/+mobile/SmartView.qml +++ b/resources/qml/Governikus/SmartView/+mobile/SmartView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -89,8 +89,10 @@ SectionPage { onDeleteConfirmed: { setLockedAndHidden(); push(deleteProgressView, { + //: LABEL ANDROID IOS "text": qsTr("Resetting Smart-eID"), "progressBarVisible": true, + //: LABEL ANDROID IOS "progressText": qsTr("Resetting Smart-eID") }); SmartModel.deleteSmart(); diff --git a/resources/qml/Governikus/Style/+desktop/HighContrastColors.qml b/resources/qml/Governikus/Style/+desktop/HighContrastColors.qml index f65a0130a..67fbec7c5 100644 --- a/resources/qml/Governikus/Style/+desktop/HighContrastColors.qml +++ b/resources/qml/Governikus/Style/+desktop/HighContrastColors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Style/+desktop/HighContrastDimensions.qml b/resources/qml/Governikus/Style/+desktop/HighContrastDimensions.qml index 9fcdc8d3a..15545ea46 100644 --- a/resources/qml/Governikus/Style/+desktop/HighContrastDimensions.qml +++ b/resources/qml/Governikus/Style/+desktop/HighContrastDimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import Governikus.Type.ApplicationModel 1.0 diff --git a/resources/qml/Governikus/Style/+desktop/PlatformColors.qml b/resources/qml/Governikus/Style/+desktop/PlatformColors.qml index 353e49db5..d22cd0538 100644 --- a/resources/qml/Governikus/Style/+desktop/PlatformColors.qml +++ b/resources/qml/Governikus/Style/+desktop/PlatformColors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml 2.15 diff --git a/resources/qml/Governikus/Style/+desktop/PlatformDimensions.qml b/resources/qml/Governikus/Style/+desktop/PlatformDimensions.qml index aefbbdac5..ca3350f3f 100644 --- a/resources/qml/Governikus/Style/+desktop/PlatformDimensions.qml +++ b/resources/qml/Governikus/Style/+desktop/PlatformDimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import Governikus.Type.ApplicationModel 1.0 diff --git a/resources/qml/Governikus/Style/+desktop/PlatformTextStyles.qml b/resources/qml/Governikus/Style/+desktop/PlatformTextStyles.qml index ebb90a7b8..3a6c56d3b 100644 --- a/resources/qml/Governikus/Style/+desktop/PlatformTextStyles.qml +++ b/resources/qml/Governikus/Style/+desktop/PlatformTextStyles.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Style/+mobile/+android/BrandColors.qml b/resources/qml/Governikus/Style/+mobile/+android/BrandColors.qml index d92007114..feb589038 100644 --- a/resources/qml/Governikus/Style/+mobile/+android/BrandColors.qml +++ b/resources/qml/Governikus/Style/+mobile/+android/BrandColors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml 2.15 diff --git a/resources/qml/Governikus/Style/+mobile/+android/BrandDimensions.qml b/resources/qml/Governikus/Style/+mobile/+android/BrandDimensions.qml index fdcfb5f3c..d997f4d94 100644 --- a/resources/qml/Governikus/Style/+mobile/+android/BrandDimensions.qml +++ b/resources/qml/Governikus/Style/+mobile/+android/BrandDimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Style/+mobile/+android/PlatformTextStyles.qml b/resources/qml/Governikus/Style/+mobile/+android/PlatformTextStyles.qml index a5c60588c..9fb1f20ab 100644 --- a/resources/qml/Governikus/Style/+mobile/+android/PlatformTextStyles.qml +++ b/resources/qml/Governikus/Style/+mobile/+android/PlatformTextStyles.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 @@ -8,15 +8,36 @@ QtObject { textFamily: "Noto Serif" textSize: Style.dimens.normal_font_size } + readonly property var tutorial_content_highlight: TextStyle { + bold: true + textFamily: "Noto Serif" + textSize: Style.dimens.normal_font_size + } readonly property var tutorial_header: TextStyle { textFamily: "Noto Serif" textSize: Style.dimens.tutorial_header_font_size } + readonly property var tutorial_header_accent: TextStyle { + italic: true + textFamily: "Noto Serif" + textSize: Style.dimens.tutorial_header_font_size + } + readonly property var tutorial_header_highlight: TextStyle { + bold: true + textFamily: "Noto Serif" + textSize: Style.dimens.tutorial_header_font_size + } readonly property var tutorial_header_secondary: TextStyle { textFamily: "Noto Serif" textSize: Style.dimens.header_font_size } - readonly property var tutorial_title: TextStyle { + readonly property var tutorial_header_secondary_highlight: TextStyle { + bold: true + textFamily: "Noto Serif" + textSize: Style.dimens.header_font_size + } + readonly property var tutorial_title_highlight: TextStyle { + bold: true textSize: Style.dimens.tutorial_title_font_size } } diff --git a/resources/qml/Governikus/Style/+mobile/+ios/BrandColors.qml b/resources/qml/Governikus/Style/+mobile/+ios/BrandColors.qml index ea4e1fd27..7cb633e97 100644 --- a/resources/qml/Governikus/Style/+mobile/+ios/BrandColors.qml +++ b/resources/qml/Governikus/Style/+mobile/+ios/BrandColors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 diff --git a/resources/qml/Governikus/Style/+mobile/+ios/BrandDimensions.qml b/resources/qml/Governikus/Style/+mobile/+ios/BrandDimensions.qml index 6adaa8cc3..c5471a525 100644 --- a/resources/qml/Governikus/Style/+mobile/+ios/BrandDimensions.qml +++ b/resources/qml/Governikus/Style/+mobile/+ios/BrandDimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Window 2.2 diff --git a/resources/qml/Governikus/Style/+mobile/+ios/PlatformTextStyles.qml b/resources/qml/Governikus/Style/+mobile/+ios/PlatformTextStyles.qml index 556d06be3..62c5a0683 100644 --- a/resources/qml/Governikus/Style/+mobile/+ios/PlatformTextStyles.qml +++ b/resources/qml/Governikus/Style/+mobile/+ios/PlatformTextStyles.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 @@ -8,15 +8,36 @@ QtObject { textFamily: "Charter" textSize: Style.dimens.normal_font_size } + readonly property var tutorial_content_highlight: TextStyle { + bold: true + textFamily: "Charter" + textSize: Style.dimens.normal_font_size + } readonly property var tutorial_header: TextStyle { textFamily: "Charter" textSize: Style.dimens.tutorial_header_font_size } + readonly property var tutorial_header_accent: TextStyle { + italic: true + textFamily: "Charter" + textSize: Style.dimens.tutorial_header_font_size + } + readonly property var tutorial_header_highlight: TextStyle { + bold: true + textFamily: "Charter" + textSize: Style.dimens.tutorial_header_font_size + } readonly property var tutorial_header_secondary: TextStyle { textFamily: "Charter" textSize: Style.dimens.header_font_size } - readonly property var tutorial_title: TextStyle { + readonly property var tutorial_header_secondary_highlight: TextStyle { + bold: true + textFamily: "Charter" + textSize: Style.dimens.header_font_size + } + readonly property var tutorial_title_highlight: TextStyle { + bold: true textSize: Style.dimens.tutorial_title_font_size } } diff --git a/resources/qml/Governikus/Style/+mobile/HighContrastColors.qml b/resources/qml/Governikus/Style/+mobile/HighContrastColors.qml index 78554a3de..349931c5d 100644 --- a/resources/qml/Governikus/Style/+mobile/HighContrastColors.qml +++ b/resources/qml/Governikus/Style/+mobile/HighContrastColors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Style/+mobile/HighContrastDimensions.qml b/resources/qml/Governikus/Style/+mobile/HighContrastDimensions.qml index f8bc6ad48..49902e99f 100644 --- a/resources/qml/Governikus/Style/+mobile/HighContrastDimensions.qml +++ b/resources/qml/Governikus/Style/+mobile/HighContrastDimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 diff --git a/resources/qml/Governikus/Style/+mobile/PlatformColors.qml b/resources/qml/Governikus/Style/+mobile/PlatformColors.qml index edab737a7..10cffce4d 100644 --- a/resources/qml/Governikus/Style/+mobile/PlatformColors.qml +++ b/resources/qml/Governikus/Style/+mobile/PlatformColors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Style/+mobile/PlatformDimensions.qml b/resources/qml/Governikus/Style/+mobile/PlatformDimensions.qml index 0d1c9cb89..4435138ec 100644 --- a/resources/qml/Governikus/Style/+mobile/PlatformDimensions.qml +++ b/resources/qml/Governikus/Style/+mobile/PlatformDimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Style/Colors.qml b/resources/qml/Governikus/Style/Colors.qml index 1d2b2b069..3a3ebd6a0 100644 --- a/resources/qml/Governikus/Style/Colors.qml +++ b/resources/qml/Governikus/Style/Colors.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/Style/Dimensions.qml b/resources/qml/Governikus/Style/Dimensions.qml index 31f5cf625..fc8a941c2 100644 --- a/resources/qml/Governikus/Style/Dimensions.qml +++ b/resources/qml/Governikus/Style/Dimensions.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ PlatformDimensions { diff --git a/resources/qml/Governikus/Style/Style.qml b/resources/qml/Governikus/Style/Style.qml index 5fd06b1e7..f2c3d6e54 100644 --- a/resources/qml/Governikus/Style/Style.qml +++ b/resources/qml/Governikus/Style/Style.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ pragma Singleton import QtQuick 2.15 diff --git a/resources/qml/Governikus/Style/TextStyle.qml b/resources/qml/Governikus/Style/TextStyle.qml index 17e81bd7c..e66133689 100644 --- a/resources/qml/Governikus/Style/TextStyle.qml +++ b/resources/qml/Governikus/Style/TextStyle.qml @@ -1,13 +1,16 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 QtObject { + property bool bold: false + property bool italic: false property color linkColor: Style.color.accent_text property color textColor: Style.color.primary_text // An empty string means "unspecified" property string textFamily property int textSize: Style.dimens.normal_font_size + property bool underline: false } diff --git a/resources/qml/Governikus/Style/TextStyles.qml b/resources/qml/Governikus/Style/TextStyles.qml index 2f076c96d..8c1cc9699 100644 --- a/resources/qml/Governikus/Style/TextStyles.qml +++ b/resources/qml/Governikus/Style/TextStyles.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 @@ -10,6 +10,10 @@ PlatformTextStyles { readonly property var button_disabled: TextStyle { textColor: Style.color.button_text_disabled } + readonly property var button_highlight: TextStyle { + bold: true + textColor: Style.color.button_text + } readonly property var header: TextStyle { textSize: Style.dimens.header_font_size } @@ -17,15 +21,35 @@ PlatformTextStyles { textColor: Style.color.accent_text textSize: Style.dimens.header_font_size } + readonly property var header_accent_highlight: TextStyle { + bold: true + textColor: Style.color.accent_text + textSize: Style.dimens.header_font_size + } + readonly property var header_highlight: TextStyle { + bold: true + textSize: Style.dimens.header_font_size + } readonly property var header_inverse: TextStyle { linkColor: Style.color.accent_text_inverse textColor: Style.color.primary_text_inverse textSize: Style.dimens.header_font_size } + readonly property var header_inverse_highlight: TextStyle { + bold: true + linkColor: Style.color.accent_text_inverse + textColor: Style.color.primary_text_inverse + textSize: Style.dimens.header_font_size + } readonly property var header_secondary: TextStyle { textColor: Style.color.secondary_text textSize: Style.dimens.header_font_size } + readonly property var header_secondary_highlight: TextStyle { + bold: true + textColor: Style.color.secondary_text + textSize: Style.dimens.header_font_size + } readonly property var header_secondary_inverse: TextStyle { linkColor: Style.color.accent_text_inverse textColor: Style.color.secondary_text_inverse @@ -60,14 +84,25 @@ PlatformTextStyles { textColor: Style.color.warning_text textSize: Style.dimens.hint_font_size } + readonly property var link_accent: TextStyle { + textColor: Style.color.accent_text + underline: true + } readonly property var navigation: TextStyle { textSize: Style.dimens.navigation_font_size } + readonly property var navigation_highlight: TextStyle { + bold: true + textSize: Style.dimens.navigation_font_size + } readonly property var normal: TextStyle { } readonly property var normal_accent: TextStyle { textColor: Style.color.accent_text } + readonly property var normal_highlight: TextStyle { + bold: true + } readonly property var normal_info: TextStyle { textColor: Style.color.info_text } @@ -85,6 +120,10 @@ PlatformTextStyles { readonly property var normal_warning: TextStyle { textColor: Style.color.warning_text } + readonly property var normal_warning_highlight: TextStyle { + bold: true + textColor: Style.color.warning_text + } readonly property var title: TextStyle { textSize: Style.dimens.title_font_size } @@ -92,11 +131,26 @@ PlatformTextStyles { textColor: Style.color.accent_text textSize: Style.dimens.title_font_size } + readonly property var title_accent_highlight: TextStyle { + bold: true + textColor: Style.color.accent_text + textSize: Style.dimens.title_font_size + } + readonly property var title_highlight: TextStyle { + bold: true + textSize: Style.dimens.title_font_size + } readonly property var title_inverse: TextStyle { linkColor: Style.color.accent_text_inverse textColor: Style.color.primary_text_inverse textSize: Style.dimens.title_font_size } + readonly property var title_inverse_highlight: TextStyle { + bold: true + linkColor: Style.color.accent_text_inverse + textColor: Style.color.primary_text_inverse + textSize: Style.dimens.title_font_size + } readonly property var title_secondary: TextStyle { textColor: Style.color.secondary_text textSize: Style.dimens.title_font_size diff --git a/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologyInfo.qml b/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologyInfo.qml index 61d4c04ce..e5f3439ec 100644 --- a/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologyInfo.qml +++ b/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologyInfo.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitch.qml b/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitch.qml index e55f062ab..1884c18bd 100644 --- a/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitch.qml +++ b/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitchButton.qml b/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitchButton.qml index 01b526a0b..03bf6508e 100644 --- a/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitchButton.qml +++ b/resources/qml/Governikus/TechnologyInfo/+mobile/TechnologySwitchButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TitleBar/+desktop/CancelAction.qml b/resources/qml/Governikus/TitleBar/+desktop/CancelAction.qml index d4c520332..85b741f69 100644 --- a/resources/qml/Governikus/TitleBar/+desktop/CancelAction.qml +++ b/resources/qml/Governikus/TitleBar/+desktop/CancelAction.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -9,22 +9,23 @@ import Governikus.View 1.0 import Governikus.Type.ApplicationModel 1.0 GButton { + id: root + readonly property color pressColor: Qt.darker(textStyle.textColor, Constants.highlightDarkerFactor) buttonColor: Style.color.transparent - font.bold: true height: if (parent) parent.height icon.source: "qrc:///images/material_close.svg" text: qsTr("Cancel") textHighlightColor: pressed ? pressColor : textStyle.textColor - textStyle: Style.text.header_inverse + textStyle: Style.text.header_inverse_highlight tintIcon: true verticalPadding: 0 visible: ApplicationModel.currentWorkflow !== ApplicationModel.WORKFLOW_NONE GSeparator { - color: Style.text.header_inverse.textColor + color: root.textStyle.textColor height: parent.height orientation: Qt.Vertical visible: !Style.currentTheme.highContrast diff --git a/resources/qml/Governikus/TitleBar/+desktop/Notifications.qml b/resources/qml/Governikus/TitleBar/+desktop/Notifications.qml index fbf8fcb69..82d8e195e 100644 --- a/resources/qml/Governikus/TitleBar/+desktop/Notifications.qml +++ b/resources/qml/Governikus/TitleBar/+desktop/Notifications.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/TitleBar/+desktop/TitleBar.qml b/resources/qml/Governikus/TitleBar/+desktop/TitleBar.qml index 04ddeba29..61e22e60f 100644 --- a/resources/qml/Governikus/TitleBar/+desktop/TitleBar.qml +++ b/resources/qml/Governikus/TitleBar/+desktop/TitleBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TitleBar/+desktop/TitleBarAction.qml b/resources/qml/Governikus/TitleBar/+desktop/TitleBarAction.qml index c25a9baaa..b8e3c3029 100644 --- a/resources/qml/Governikus/TitleBar/+desktop/TitleBarAction.qml +++ b/resources/qml/Governikus/TitleBar/+desktop/TitleBarAction.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -63,7 +63,7 @@ FocusScope { sourceSize.width: Style.dimens.icon_size tintColor: Style.text.header_inverse.textColor } - TitleBarText { + GText { id: text readonly property color pressColor: Qt.darker(textColor, Constants.highlightDarkerFactor) @@ -72,7 +72,7 @@ FocusScope { Accessible.name: text.text Accessible.role: Accessible.Button color: mouseArea.containsPress ? pressColor : textColor - font.bold: isLastElement + textStyle: isLastElement ? Style.text.navigation_highlight : Style.text.navigation FocusFrame { isOnLightBackground: false diff --git a/resources/qml/Governikus/TitleBar/+desktop/TitleBarButton.qml b/resources/qml/Governikus/TitleBar/+desktop/TitleBarButton.qml index 1c8b41b62..20a0f5f0b 100644 --- a/resources/qml/Governikus/TitleBar/+desktop/TitleBarButton.qml +++ b/resources/qml/Governikus/TitleBar/+desktop/TitleBarButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/TitleBar/+desktop/TitleBarText.qml b/resources/qml/Governikus/TitleBar/+desktop/TitleBarText.qml deleted file mode 100644 index 40fd2780d..000000000 --- a/resources/qml/Governikus/TitleBar/+desktop/TitleBarText.qml +++ /dev/null @@ -1,11 +0,0 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import Governikus.Global 1.0 -import Governikus.Style 1.0 - -GText { - font.bold: true - textStyle: Style.text.navigation -} diff --git a/resources/qml/Governikus/TitleBar/+mobile/NavigationAction.qml b/resources/qml/Governikus/TitleBar/+mobile/NavigationAction.qml index 112e0e8fb..87a7ad560 100644 --- a/resources/qml/Governikus/TitleBar/+mobile/NavigationAction.qml +++ b/resources/qml/Governikus/TitleBar/+mobile/NavigationAction.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/TitleBar/+mobile/TitleBar.qml b/resources/qml/Governikus/TitleBar/+mobile/TitleBar.qml index 05c0a0503..daae8b927 100644 --- a/resources/qml/Governikus/TitleBar/+mobile/TitleBar.qml +++ b/resources/qml/Governikus/TitleBar/+mobile/TitleBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -98,12 +98,11 @@ Item { Accessible.focusable: true Accessible.role: Accessible.Heading elide: Text.ElideRight - font.bold: true height: Style.dimens.titlebar_height leftPadding: Style.dimens.titlebar_padding maximumLineCount: 1 rightPadding: Style.dimens.titlebar_padding - textStyle: Style.text.header_inverse + textStyle: Style.text.header_inverse_highlight verticalAlignment: Text.AlignVCenter width: Math.min(implicitWidth, availableWidth) wrapMode: Text.NoWrap diff --git a/resources/qml/Governikus/TitleBar/+mobile/TitleBarAction.qml b/resources/qml/Governikus/TitleBar/+mobile/TitleBarAction.qml index 00945fd3b..85105857b 100644 --- a/resources/qml/Governikus/TitleBar/+mobile/TitleBarAction.qml +++ b/resources/qml/Governikus/TitleBar/+mobile/TitleBarAction.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TitleBar/+mobile/TitleBarButton.qml b/resources/qml/Governikus/TitleBar/+mobile/TitleBarButton.qml index 96ec7e546..8defc4afb 100644 --- a/resources/qml/Governikus/TitleBar/+mobile/TitleBarButton.qml +++ b/resources/qml/Governikus/TitleBar/+mobile/TitleBarButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TitleBar/+mobile/TitleBarNavigation.qml b/resources/qml/Governikus/TitleBar/+mobile/TitleBarNavigation.qml index 933beb554..38abb3581 100644 --- a/resources/qml/Governikus/TitleBar/+mobile/TitleBarNavigation.qml +++ b/resources/qml/Governikus/TitleBar/+mobile/TitleBarNavigation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TitleBar/qmldir b/resources/qml/Governikus/TitleBar/qmldir index ec8fc4f1f..e56c10eb8 100644 --- a/resources/qml/Governikus/TitleBar/qmldir +++ b/resources/qml/Governikus/TitleBar/qmldir @@ -2,7 +2,6 @@ module TitleBar internal BackCloseAction BackCloseAction.qml internal TitleBarNavigation TitleBarNavigation.qml -internal TitleBarText TitleBarText.qml CancelAction 1.0 CancelAction.qml NavigationAction 1.0 NavigationAction.qml diff --git a/resources/qml/Governikus/TutorialView/+desktop/SetupAssistantView.qml b/resources/qml/Governikus/TutorialView/+desktop/SetupAssistantView.qml index 8bfb17c2a..0311ba165 100644 --- a/resources/qml/Governikus/TutorialView/+desktop/SetupAssistantView.qml +++ b/resources/qml/Governikus/TutorialView/+desktop/SetupAssistantView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -64,13 +64,13 @@ SectionPage { visible: d.activeView === SetupAssistantView.SubViews.Welcome Component.onCompleted: setActive() - onAgree: d.activeView = SettingsModel.autoStartAvailable ? SetupAssistantView.SubViews.AutoStartSetting : SetupAssistantView.SubViews.HistorySetting + onAgree: d.activeView = (SettingsModel.autoStartAvailable && !SettingsModel.autoStartSetByAdmin) ? SetupAssistantView.SubViews.AutoStartSetting : SetupAssistantView.SubViews.HistorySetting } DecisionView { mainIconSource: "qrc:///images/status_info.svg" //: INFO DESKTOP Information text why autostart of the App is advisable questionSubText: { - let subText = qsTr("In order to successfully use the online identification function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup.").arg(Qt.application.name); + let subText = qsTr("In order to successfully use the eID function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup.").arg(Qt.application.name); if (Qt.platform.os === "osx") { //: INFO MACOS Additional information that macOS auto-start add a symbol to the menu bar subText += " " + qsTr("The launch will add an icon to the menu bar."); diff --git a/resources/qml/Governikus/TutorialView/+desktop/TransportPinAssistantView.qml b/resources/qml/Governikus/TutorialView/+desktop/TransportPinAssistantView.qml index b925a0fb7..824454109 100644 --- a/resources/qml/Governikus/TutorialView/+desktop/TransportPinAssistantView.qml +++ b/resources/qml/Governikus/TutorialView/+desktop/TransportPinAssistantView.qml @@ -1,11 +1,11 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 -import Governikus.EnterPasswordView 1.0 import Governikus.Global 1.0 import Governikus.View 1.0 import Governikus.TitleBar 1.0 +import Governikus.PasswordInfoView 1.0 import Governikus.Type.PasswordType 1.0 SectionPage { @@ -35,6 +35,7 @@ SectionPage { DecisionView { mainIconSource: "qrc:///images/material_lock.svg" + moreInformationText: infoData.linkText moreInformationVisible: true //: INFO DESKTOP Hint that a six-digit PIN is required to use the online identification feature of the ID card. questionSubText: qsTr("If you have not already done so you have to change your five-digit Transport PIN to a six-digit PIN before you can use the online-ID function.") @@ -49,9 +50,13 @@ SectionPage { updateTitleBarActions(); } } + PasswordInfoData { + id: infoData + contentType: PasswordInfoContent.Type.TRANSPORT_PIN + } PasswordInfoView { id: passwordInfoView - passwordType: PasswordType.TRANSPORT_PIN + infoContent: infoData rootEnabled: root.rootEnabled visible: showPasswordInfo diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialCollapseAnimation.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialCollapseAnimation.qml index e203b3a7b..b110ec84b 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialCollapseAnimation.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialCollapseAnimation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialContent.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialContent.qml index 30ec9341f..b00e6a5e7 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialContent.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialContent.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialExpandAnimation.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialExpandAnimation.qml index 4818b3cc3..e753d8bb5 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialExpandAnimation.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialExpandAnimation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialFooter.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialFooter.qml index c1b30b231..d54cbdb54 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialFooter.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialFooter.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialFooterButton.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialFooterButton.qml index dabe8b851..f36f35ffd 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialFooterButton.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialFooterButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialHeader.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialHeader.qml index 375ef1e15..e66b8ea56 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialHeader.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialHeader.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -49,10 +49,9 @@ Item { id: title Accessible.ignored: true anchors.horizontalCenter: parent.horizontalCenter - font.bold: true style: Text.Outline styleColor: Constants.white - textStyle: Style.text.tutorial_title + textStyle: Style.text.tutorial_title_highlight y: ((categoryAbove ? 0.575 : 0.5) * parent.height) - (0.5 * height) } } diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialHow.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialHow.qml index ffe0880ca..1e9680822 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialHow.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialHow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -33,12 +33,11 @@ TutorialContent { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.italic: true horizontalAlignment: Text.AlignHCenter //: INFO ANDROID IOS text: (Constants.is_layout_ios ? qsTr("How can I use the AusweisApp2 on my iPhone?") : qsTr("How can I use the AusweisApp2 on my smartphone?")) - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_accent width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -74,12 +73,11 @@ TutorialContent { } GText { id: noticeText - font.bold: true horizontalAlignment: Text.AlignLeft //: INFO ANDROID IOS text: (Constants.is_layout_ios ? qsTr("Many iPhones (iPhone 7 and newer) can access the ID card via the built-in NFC interface.") : qsTr("Many Android devices can access the ID card via the built-in NFC interface.")) - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -126,12 +124,11 @@ TutorialContent { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.italic: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("The AusweisApp2 offers the following options to access your ID card:") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_accent width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -167,12 +164,11 @@ TutorialContent { GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Direct connection via NFC chip") - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -189,10 +185,9 @@ TutorialContent { GText { id: numberOne anchors.centerIn: parent - font.bold: true horizontalAlignment: Text.AlignHCenter text: "1" - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() @@ -255,12 +250,11 @@ TutorialContent { GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Smartphone as card reader") - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -277,10 +271,9 @@ TutorialContent { GText { id: numberTwo anchors.centerIn: parent - font.bold: true horizontalAlignment: Text.AlignHCenter text: "2" - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() @@ -388,10 +381,9 @@ TutorialContent { GText { id: numberThree anchors.centerIn: parent - font.bold: true horizontalAlignment: Text.AlignHCenter text: "3" - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialImage.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialImage.qml index 148870da2..fecbcf120 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialImage.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialImage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialImportant.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialImportant.qml index 0f1443da4..b362aee50 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialImportant.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialImportant.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -43,11 +43,10 @@ TutorialContent { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Transport PIN") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width * 0.9 } TutorialImage { @@ -72,11 +71,10 @@ TutorialContent { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("six-digit PIN") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width * 0.9 } TutorialImage { @@ -153,7 +151,8 @@ TutorialContent { GText { anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter - text: PinResetInformationModel.pinForgottenTutorialHint + //: LABEL ANDROID IOS + text: qsTr("If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service.") textStyle: Style.text.tutorial_header_secondary width: parent.width * 0.9 } diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodFooter.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodFooter.qml index 73573a542..b5bdb3438 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodFooter.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodFooter.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodNfc.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodNfc.qml index 905aec492..577bd2464 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodNfc.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodNfc.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -38,12 +38,11 @@ SectionPage { GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Direct connection via NFC chip") - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -60,10 +59,9 @@ SectionPage { GText { id: numberOne anchors.centerIn: parent - font.bold: true horizontalAlignment: Text.AlignHCenter text: "1" - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() @@ -267,12 +265,11 @@ SectionPage { width: parent.width * 0.2 } GText { - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("Do not move device or ID card!") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -303,12 +300,11 @@ SectionPage { } GText { id: nfcText - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID text: qsTr("The correct position is specific for your device. If a position does not work try a different one. The AusweisApp2 shows different common positions.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.55 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -322,12 +318,11 @@ SectionPage { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID text: qsTr("If your device is unable to detect your ID card try to check the device capabilities by clicking on \"Check device and ID card\" on the start page.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight visible: Constants.is_layout_android width: parent.width * 0.9 @@ -380,12 +375,11 @@ SectionPage { z: 1 } GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("six-digit PIN") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width x: (parent.width * 0.5) - (width / 2) y: (parent.height * 0.2) - (height / 2) @@ -422,12 +416,11 @@ SectionPage { } GText { id: noticeText2 - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("This is only possible if you have exchanged the five-digit Transport PIN with a six-digit PIN beforehand.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacDesktop.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacDesktop.qml index 0eaf9fd4a..3b65a1442 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacDesktop.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacDesktop.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -38,12 +38,11 @@ SectionPage { GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Smartphone as card reader") - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -60,10 +59,9 @@ SectionPage { GText { id: numberTwo anchors.centerIn: parent - font.bold: true horizontalAlignment: Text.AlignHCenter text: "2" - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() @@ -173,12 +171,11 @@ SectionPage { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Both devices have to be connected to the same WiFi network") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -272,12 +269,11 @@ SectionPage { id: pairingCodeText anchors.horizontalCenter: parent.horizontalCenter anchors.top: greyBackgroundRect.top - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Pairing code") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight topPadding: 30 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -317,12 +313,11 @@ SectionPage { } GText { id: noticeText4 - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL IOS text: qsTr("On the first use of the Smartphone as card reader (SaC), iOS will asks for your permission to access the local network. This permission is required in order find and connect to your SaC. After the first request you can always access the permission in the iOS settings for this app.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -411,12 +406,11 @@ SectionPage { width: parent.width * 0.2 } GText { - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("Enter pairing code next.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -594,12 +588,11 @@ SectionPage { width: parent.width * 0.2 } GText { - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("Do not move device or ID card!") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -628,12 +621,11 @@ SectionPage { } GText { id: nfcText - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("The correct position is specific for your device. If a position does not work try a different one. The AusweisApp2 shows different common positions.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.55 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -647,12 +639,11 @@ SectionPage { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("If your device is unable to detect your ID card try to check the device capabilities by clicking on \"Check device and ID card\" on the start page.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -704,12 +695,11 @@ SectionPage { z: 1 } GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("six-digit PIN") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width x: (parent.width * 0.5) - (width / 2) y: (parent.height * 0.2) - (height / 2) @@ -746,12 +736,11 @@ SectionPage { } GText { id: noticeText2 - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("This is only possible if you have exchanged the five-digit Transport PIN with a six-digit PIN beforehand.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacMobile.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacMobile.qml index 66ea0827a..34e5f0478 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacMobile.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialReaderMethodSacMobile.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -47,10 +47,9 @@ SectionPage { GText { id: numberThree anchors.centerIn: parent - font.bold: true horizontalAlignment: Text.AlignHCenter text: "3" - textStyle: Style.text.tutorial_header_secondary + textStyle: Style.text.tutorial_header_secondary_highlight Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() @@ -160,12 +159,11 @@ SectionPage { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Both devices have to be connected to the same WiFi network") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -264,12 +262,11 @@ SectionPage { id: pairingCodeText anchors.horizontalCenter: parent.horizontalCenter anchors.top: greyBackgroundRect.top - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Pairing code") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight topPadding: 30 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -309,12 +306,11 @@ SectionPage { } GText { id: noticeText5 - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL IOS text: qsTr("On the first use of the Smartphone as card reader (SaC), iOS will asks for your permission to access the local network. This permission is required in order find and connect to your SaC. After the first request you can always access the permission in the iOS settings for this app.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -407,12 +403,11 @@ SectionPage { width: parent.width * 0.2 } GText { - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("Enter pairing code next.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -634,12 +629,11 @@ SectionPage { width: parent.width * 0.2 } GText { - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("Do not move device or ID card!") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -668,12 +662,11 @@ SectionPage { } GText { id: nfcText - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("The correct position is specific for your device. If a position does not work try a different one. The AusweisApp2 shows different common positions.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.55 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -687,12 +680,11 @@ SectionPage { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("If your device is unable to detect your ID card try to check the device capabilities by clicking on \"Check device and ID card\" on the start page.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -744,12 +736,11 @@ SectionPage { z: 1 } GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("six-digit PIN") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width x: (parent.width * 0.5) - (width / 2) y: (parent.height * 0.2) - (height / 2) @@ -786,12 +777,11 @@ SectionPage { } GText { id: noticeText2 - font.bold: true horizontalAlignment: Text.AlignLeft //: LABEL ANDROID IOS text: qsTr("This is only possible if you have exchanged the five-digit Transport PIN with a six-digit PIN beforehand.") - textStyle: Style.text.tutorial_content + textStyle: Style.text.tutorial_content_highlight width: parent.width * 0.6 x: (parent.width * 0.65) - (width / 2) y: (parent.height * 0.5) - (height / 2) diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialSeperator.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialSeperator.qml index 35b64bdf2..fb845a5f2 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialSeperator.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialSeperator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialShowMenuPath.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialShowMenuPath.qml index a9cf8fd6f..69aba71c6 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialShowMenuPath.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialShowMenuPath.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialSpacer.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialSpacer.qml index 7639f1b5e..7e9502025 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialSpacer.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialSpacer.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialStatusBar.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialStatusBar.qml index 3353eadb3..78d1c9adf 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialStatusBar.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialStatusBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialView.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialView.qml index f238b7e22..ed419555b 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialView.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialWhat.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialWhat.qml index c022b8c8f..153a37488 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialWhat.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialWhat.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -13,12 +13,11 @@ TutorialContent { width: parent.width * 0.9 GText { - font.italic: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("What is the online ID function?") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_accent width: parent.width Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -120,12 +119,11 @@ TutorialContent { Accessible.onScrollUpAction: baseItem.Accessible.scrollUpAction() } GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Mutual authentication") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -298,12 +296,11 @@ TutorialContent { z: 1 } GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("... is the provider authorized for this?") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width - 2 * Constants.component_spacing x: (parent.width * 0.5) - (width / 2) y: (parent.height * 0.3) - (height / 2) @@ -332,12 +329,11 @@ TutorialContent { width: parent.width GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Certificate") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width x: (parent.width * 0.2) - (width / 2) y: (parent.height * 0.5) - (height / 2) @@ -404,11 +400,10 @@ TutorialContent { } GText { anchors.horizontalCenter: parent.horizontalCenter - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Every time both participants authenticate each other...") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width * 0.9 z: 1 diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialWhere.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialWhere.qml index 1d1e20b2e..c94bf6810 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialWhere.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialWhere.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -10,12 +10,11 @@ TutorialContent { id: baseItem GText { anchors.horizontalCenter: parent.horizontalCenter - font.italic: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("Where can I use the online ID function?") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_accent width: parent.width * 0.9 Accessible.onScrollDownAction: baseItem.Accessible.scrollDownAction() @@ -232,12 +231,11 @@ TutorialContent { z: 1 } GText { - font.bold: true horizontalAlignment: Text.AlignHCenter //: LABEL ANDROID IOS text: qsTr("six-digit PIN") - textStyle: Style.text.tutorial_header + textStyle: Style.text.tutorial_header_highlight width: parent.width x: (parent.width * 0.5) - (width / 2) y: (parent.height * 0.2) - (height / 2) diff --git a/resources/qml/Governikus/TutorialView/+mobile/TutorialZoomTriangle.qml b/resources/qml/Governikus/TutorialView/+mobile/TutorialZoomTriangle.qml index 77b48d4e0..728484030 100644 --- a/resources/qml/Governikus/TutorialView/+mobile/TutorialZoomTriangle.qml +++ b/resources/qml/Governikus/TutorialView/+mobile/TutorialZoomTriangle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Shapes 1.15 diff --git a/resources/qml/Governikus/UpdateView/+desktop/UpdateView.qml b/resources/qml/Governikus/UpdateView/+desktop/UpdateView.qml index 1a95bc344..3f9340f02 100644 --- a/resources/qml/Governikus/UpdateView/+desktop/UpdateView.qml +++ b/resources/qml/Governikus/UpdateView/+desktop/UpdateView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQml 2.15 import QtQuick 2.15 diff --git a/resources/qml/Governikus/UpdateView/+desktop/UpdateViewButtonRow.qml b/resources/qml/Governikus/UpdateView/+desktop/UpdateViewButtonRow.qml index bda2a330a..e044467f7 100644 --- a/resources/qml/Governikus/UpdateView/+desktop/UpdateViewButtonRow.qml +++ b/resources/qml/Governikus/UpdateView/+desktop/UpdateViewButtonRow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/UpdateView/+desktop/UpdateViewInformation.qml b/resources/qml/Governikus/UpdateView/+desktop/UpdateViewInformation.qml index 9b12a6334..6fd3dceb4 100644 --- a/resources/qml/Governikus/UpdateView/+desktop/UpdateViewInformation.qml +++ b/resources/qml/Governikus/UpdateView/+desktop/UpdateViewInformation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/View/+desktop/Controller.qml b/resources/qml/Governikus/View/+desktop/Controller.qml index f5a5ec69d..b89a7e32b 100644 --- a/resources/qml/Governikus/View/+desktop/Controller.qml +++ b/resources/qml/Governikus/View/+desktop/Controller.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/View/+desktop/FocusFrame.qml b/resources/qml/Governikus/View/+desktop/FocusFrame.qml index 1f499e4e6..51619f259 100644 --- a/resources/qml/Governikus/View/+desktop/FocusFrame.qml +++ b/resources/qml/Governikus/View/+desktop/FocusFrame.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/View/+desktop/FocusPoint.qml b/resources/qml/Governikus/View/+desktop/FocusPoint.qml index 28014aff1..61d124c3c 100644 --- a/resources/qml/Governikus/View/+desktop/FocusPoint.qml +++ b/resources/qml/Governikus/View/+desktop/FocusPoint.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/View/+desktop/FramedImage.qml b/resources/qml/Governikus/View/+desktop/FramedImage.qml index 73e78ca91..58e2fc6c2 100644 --- a/resources/qml/Governikus/View/+desktop/FramedImage.qml +++ b/resources/qml/Governikus/View/+desktop/FramedImage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/View/+desktop/SectionPage.qml b/resources/qml/Governikus/View/+desktop/SectionPage.qml index 007a90a97..a26acdbe0 100644 --- a/resources/qml/Governikus/View/+desktop/SectionPage.qml +++ b/resources/qml/Governikus/View/+desktop/SectionPage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/View/+mobile/ContentArea.qml b/resources/qml/Governikus/View/+mobile/ContentArea.qml index 9ddae250c..efe19a5a8 100644 --- a/resources/qml/Governikus/View/+mobile/ContentArea.qml +++ b/resources/qml/Governikus/View/+mobile/ContentArea.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/View/+mobile/Controller.qml b/resources/qml/Governikus/View/+mobile/Controller.qml index e7d2ebc12..d725d518c 100644 --- a/resources/qml/Governikus/View/+mobile/Controller.qml +++ b/resources/qml/Governikus/View/+mobile/Controller.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/View/+mobile/FocusFrame.qml b/resources/qml/Governikus/View/+mobile/FocusFrame.qml index f4f16821d..3d3c128ac 100644 --- a/resources/qml/Governikus/View/+mobile/FocusFrame.qml +++ b/resources/qml/Governikus/View/+mobile/FocusFrame.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/View/+mobile/FocusPoint.qml b/resources/qml/Governikus/View/+mobile/FocusPoint.qml index 5aee1d39c..8b7e02186 100644 --- a/resources/qml/Governikus/View/+mobile/FocusPoint.qml +++ b/resources/qml/Governikus/View/+mobile/FocusPoint.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/qml/Governikus/View/+mobile/SectionPage.qml b/resources/qml/Governikus/View/+mobile/SectionPage.qml index 62bd5f524..ff8b43531 100644 --- a/resources/qml/Governikus/View/+mobile/SectionPage.qml +++ b/resources/qml/Governikus/View/+mobile/SectionPage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/View/+mobile/TabBarView.qml b/resources/qml/Governikus/View/+mobile/TabBarView.qml index 68f5e9a3f..34e31143c 100644 --- a/resources/qml/Governikus/View/+mobile/TabBarView.qml +++ b/resources/qml/Governikus/View/+mobile/TabBarView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/View/BaseController.qml b/resources/qml/Governikus/View/BaseController.qml index 4e2b58d1f..9c146dd2b 100644 --- a/resources/qml/Governikus/View/BaseController.qml +++ b/resources/qml/Governikus/View/BaseController.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/WhiteListClient/+mobile/WhiteListSurveyView.qml b/resources/qml/Governikus/WhiteListClient/+mobile/WhiteListSurveyView.qml index b9fb1b37b..1b400732c 100644 --- a/resources/qml/Governikus/WhiteListClient/+mobile/WhiteListSurveyView.qml +++ b/resources/qml/Governikus/WhiteListClient/+mobile/WhiteListSurveyView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Workflow/+desktop/GeneralWorkflow.qml b/resources/qml/Governikus/Workflow/+desktop/GeneralWorkflow.qml index 4fc3f4f97..070861af2 100644 --- a/resources/qml/Governikus/Workflow/+desktop/GeneralWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+desktop/GeneralWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -17,6 +17,8 @@ SectionPage { id: root property bool isPinChange: false + //: LABEL DESKTOP + property string passwordInfoLinkText: qsTr("More information") property int waitingFor: 0 signal requestPasswordInfo @@ -45,9 +47,9 @@ SectionPage { anchors.bottom: retryCounter.top anchors.bottomMargin: Constants.component_spacing anchors.horizontalCenter: retryCounter.horizontalCenter - font.bold: true //: LABEL DESKTOP text: qsTr("Attempts") + textStyle: Style.text.normal_highlight visible: retryCounter.visible } StatusIcon { @@ -173,16 +175,40 @@ SectionPage { } } MoreInformationLink { + id: moreInfo anchors.horizontalCenter: parent.horizontalCenter anchors.top: subText.bottom anchors.topMargin: Constants.component_spacing - text: waitingFor === Workflow.WaitingFor.Reader ? - //: INFO DESKTOP - qsTr("Go to reader settings") : - //: INFO DESKTOP Link text - qsTr("More information") - visible: (waitingFor === Workflow.WaitingFor.Reader && !d.foundSelectedReader) || waitingFor === Workflow.WaitingFor.Password - - onClicked: waitingFor === Workflow.WaitingFor.Reader ? root.settingsRequested() : root.requestPasswordInfo() + visible: false + + states: [ + State { + name: "readerSettings" + when: waitingFor === Workflow.WaitingFor.Reader && !d.foundSelectedReader + + PropertyChanges { + iconVisible: false + target: moreInfo + //: INFO DESKTOP + text: qsTr("Go to reader settings") + visible: true + + onClicked: root.settingsRequested() + } + }, + State { + name: "moreInformation" + when: waitingFor === Workflow.WaitingFor.Password + + PropertyChanges { + iconVisible: true + target: moreInfo + text: root.passwordInfoLinkText + visible: true + + onClicked: root.requestPasswordInfo() + } + } + ] } } diff --git a/resources/qml/Governikus/Workflow/+desktop/ProgressCircle.qml b/resources/qml/Governikus/Workflow/+desktop/ProgressCircle.qml index 53c3e4fee..2375c5b63 100644 --- a/resources/qml/Governikus/Workflow/+desktop/ProgressCircle.qml +++ b/resources/qml/Governikus/Workflow/+desktop/ProgressCircle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+desktop/TextCircle.qml b/resources/qml/Governikus/Workflow/+desktop/TextCircle.qml index ba04f3b65..f4cfa150f 100644 --- a/resources/qml/Governikus/Workflow/+desktop/TextCircle.qml +++ b/resources/qml/Governikus/Workflow/+desktop/TextCircle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -21,7 +21,6 @@ Rectangle { id: number Accessible.ignored: true anchors.centerIn: parent - font.bold: true - textStyle: parent.enabled ? Style.text.header_inverse : Style.text.header_accent + textStyle: parent.enabled ? Style.text.header_inverse_highlight : Style.text.header_accent_highlight } } diff --git a/resources/qml/Governikus/Workflow/+mobile/BusyImageIndicator.qml b/resources/qml/Governikus/Workflow/+mobile/BusyImageIndicator.qml index 005d73250..b035a4e6e 100644 --- a/resources/qml/Governikus/Workflow/+mobile/BusyImageIndicator.qml +++ b/resources/qml/Governikus/Workflow/+mobile/BusyImageIndicator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 diff --git a/resources/qml/Governikus/Workflow/+mobile/CardReader.qml b/resources/qml/Governikus/Workflow/+mobile/CardReader.qml index d5bd1ed58..7c624e120 100644 --- a/resources/qml/Governikus/Workflow/+mobile/CardReader.qml +++ b/resources/qml/Governikus/Workflow/+mobile/CardReader.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/GeneralWorkflow.qml b/resources/qml/Governikus/Workflow/+mobile/GeneralWorkflow.qml index e3053ce5f..f08536b74 100644 --- a/resources/qml/Governikus/Workflow/+mobile/GeneralWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+mobile/GeneralWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/NfcProgressIndicator.qml b/resources/qml/Governikus/Workflow/+mobile/NfcProgressIndicator.qml index e65baacd0..85b4bb103 100644 --- a/resources/qml/Governikus/Workflow/+mobile/NfcProgressIndicator.qml +++ b/resources/qml/Governikus/Workflow/+mobile/NfcProgressIndicator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml b/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml index 69dfd154f..bd34b7927 100644 --- a/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 @@ -45,7 +45,7 @@ Item { //: INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use SaK instead. return qsTr("Unfortunately, this functionality is not available on your device.") + "
" + //: INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use SaK instead. - qsTr("However, you can use a separate smartphone as card reader to utilize the online identification function."); + qsTr("However, you can use a separate smartphone as card reader to utilize the eID function."); case ApplicationModel.NFC_DISABLED: //: INFO ANDROID IOS NFC is available but needs to be activated in the settings of the smartphone. return qsTr("NFC is switched off.") + "
" + @@ -66,7 +66,7 @@ Item { } if (ApplicationModel.extendedLengthApdusUnsupported) { //: INFO ANDROID IOS The NFC interface does not meet the minimum requirements, using a different smartphone is suggested. - return qsTr("Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the online identification function."); + return qsTr("Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the eID function."); } else if (Constants.is_layout_ios) { //: INFO IOS The ID card may be inserted, the authentication process may be started. return qsTr("Please place your ID card on the top of the device's back side."); diff --git a/resources/qml/Governikus/Workflow/+mobile/ProgressCircle.qml b/resources/qml/Governikus/Workflow/+mobile/ProgressCircle.qml index 634ef17c4..a003661ec 100644 --- a/resources/qml/Governikus/Workflow/+mobile/ProgressCircle.qml +++ b/resources/qml/Governikus/Workflow/+mobile/ProgressCircle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 @@ -136,12 +136,13 @@ Item { height: width radius: width / 2 - Text { + GText { + Accessible.ignored: true anchors.centerIn: parent color: tCircle1.state === "active" ? Constants.white : Style.color.accent - font.bold: true font.pixelSize: parent.height / 3 text: "1" + textStyle: Style.text.normal_highlight } } } diff --git a/resources/qml/Governikus/Workflow/+mobile/ProgressIndicator.qml b/resources/qml/Governikus/Workflow/+mobile/ProgressIndicator.qml index aba15d60d..97314e090 100644 --- a/resources/qml/Governikus/Workflow/+mobile/ProgressIndicator.qml +++ b/resources/qml/Governikus/Workflow/+mobile/ProgressIndicator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/RemoteWorkflow.qml b/resources/qml/Governikus/Workflow/+mobile/RemoteWorkflow.qml index e69713884..2b152f390 100644 --- a/resources/qml/Governikus/Workflow/+mobile/RemoteWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+mobile/RemoteWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Layouts 1.15 diff --git a/resources/qml/Governikus/Workflow/+mobile/SimulatorWorkflow.qml b/resources/qml/Governikus/Workflow/+mobile/SimulatorWorkflow.qml index 8225ae6e6..47c6b033c 100644 --- a/resources/qml/Governikus/Workflow/+mobile/SimulatorWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+mobile/SimulatorWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/SmartProgressIndicator.qml b/resources/qml/Governikus/Workflow/+mobile/SmartProgressIndicator.qml index a81f2aa51..9a040a657 100644 --- a/resources/qml/Governikus/Workflow/+mobile/SmartProgressIndicator.qml +++ b/resources/qml/Governikus/Workflow/+mobile/SmartProgressIndicator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/SmartWorkflow.qml b/resources/qml/Governikus/Workflow/+mobile/SmartWorkflow.qml index 6fc145bc7..ce02c0452 100644 --- a/resources/qml/Governikus/Workflow/+mobile/SmartWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+mobile/SmartWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import Governikus.Global 1.0 diff --git a/resources/qml/Governikus/Workflow/+mobile/TextCircle.qml b/resources/qml/Governikus/Workflow/+mobile/TextCircle.qml index 59d082d3d..4dd022d98 100644 --- a/resources/qml/Governikus/Workflow/+mobile/TextCircle.qml +++ b/resources/qml/Governikus/Workflow/+mobile/TextCircle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -85,6 +85,6 @@ Item { id: t anchors.centerIn: rec color: parent.state === "active" ? Constants.white : Style.color.accent - font.bold: parent.state === "active" + textStyle: parent.state === "active" ? Style.text.normal_highlight : Style.text.normal } } diff --git a/resources/qml/Governikus/Workflow/Workflow.qml b/resources/qml/Governikus/Workflow/Workflow.qml index 27604f8fa..06ae95501 100644 --- a/resources/qml/Governikus/Workflow/Workflow.qml +++ b/resources/qml/Governikus/Workflow/Workflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 diff --git a/resources/translations/ausweisapp2_de.ts b/resources/translations/ausweisapp2_de.ts index b2b8e96f8..38c86e7ae 100644 --- a/resources/translations/ausweisapp2_de.ts +++ b/resources/translations/ausweisapp2_de.ts @@ -5,7 +5,7 @@ DvcsAttributes revision - 7488db7b6a84 + 52a5aa47f692 @@ -66,14 +66,6 @@ LABEL ANDROID IOS Ausweisen - - Do you know your six-digit PIN? - Kennen Sie Ihre sechsstellige PIN? - - - The personal, six-digit PIN is mandatory to use the online identification function. - Die persönliche, sechsstellige PIN wird zur Nutzung der Online-Ausweisfunktion zwingend benötigt. - No network connectivity INFO DESKTOP Header of the message that no network connection is present during the authentication procedure. @@ -171,6 +163,21 @@ INFO ANDROID IOS Second line text if a basic card reader is used and background LABEL ANDROID IOS Protokoll senden + + Authenticate with provider + LABEL DESKTOP A11y button to confirm the PIN and start the provider authentication +---------- +LABEL ANDROID IOS A11y button to confirm the PIN and start the provider authentication + Bei Anbieter ausweisen + + + Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function. + Die Benutzung der Online-Ausweisfunktion mit der Transport-PIN ist nicht möglich. Die selbstgewählte, sechsstellige Karten-PIN wird zur Nutzung der Online-Ausweisfunktion zwingend benötigt. + + + Do you know your six-digit ID card PIN? + Kennen Sie Ihre sechsstellige Karten-PIN? + BaseConfirmationPopup @@ -400,31 +407,6 @@ LABEL DESKTOP Processing screen label while the card communication is running af LABEL ANDROID IOS PIN ändern - - What kind of PIN do you have? - LABEL DESKTOP Title of PIN change start page. User is asked which type of PIN they have. - Was für eine PIN haben Sie? - - - Please make a choice to set or change your PIN. - LABEL DESKTOP Description of PIN change start page. User has a choice of which PIN to set. - Um Ihre PIN zu setzen oder zu ändern, treffen Sie bitte eine Auswahl. - - - PIN unknown - LABEL DESKTOP - PIN unbekannt - - - Five-digit Transport PIN - LABEL DESKTOP - Fünfstellige Transport-PIN - - - Six-digit PIN - LABEL DESKTOP - Sechsstellige PIN - Setting new PIN LABEL DESKTOP Processing screen label while the card communication is running after the new PIN has been entered during PIN change process. @@ -519,28 +501,38 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin ChangePinViewContent What kind of PIN do you have? - LABEL ANDROID IOS + LABEL ALL_PLATFORMS Was für eine PIN haben Sie? - Please make a choice to set or change your PIN. - LABEL ANDROID IOS - Um Ihre PIN zu setzen oder zu ändern, treffen Sie bitte eine Auswahl. + 6-digit PIN + LABEL ALL_PLATFORMS + Sechsstellige PIN - Six-digit PIN - LABEL ANDROID_TABLET IOS_TABLET - Sechsstellige PIN + Set by yourself + LABEL ALL_PLATFORMS + Von Ihnen selbst gesetzt - Five-digit Transport PIN - LABEL ANDROID_TABLET IOS_TABLET + 5-digit Transport PIN + LABEL ALL_PLATFORMS Fünfstellige Transport-PIN - PIN unknown - LABEL ANDROID_TABLET IOS_TABLET - PIN unbekannt + Received by mail in PIN letter + LABEL ALL_PLATFORMS + Per Post im PIN-Brief erhalten + + + No PIN + LABEL ALL_PLATFORMS + Keine PIN + + + Lost, forgotten, or never received it + LABEL ALL_PLATFORMS + Verloren, vergessen oder nie erhalten @@ -671,7 +663,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Kein NFC - Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the online identification function.<br><br>You can find smartphones compatible with the %1 on our website. + Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the eID function.<br><br>You can find smartphones compatible with the %1 on our website. LABEL ANDROID IOS Ihr Mobilgerät besitzt keine NFC-Schnittstelle. Diese wird zum Auslesen des Ausweises benötigt. Sie können die Online-Ausweisfunktion aber mit einem anderen Smartphone als Kartenleser nutzen.<br><br>Mit der %1 kompatible Smartphones finden Sie auf unserer Website. @@ -759,7 +751,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Gerät und Ausweis prüfen - To use the online identification function, your device must meet certain technical requirements. Furthermore, the online identification function must be activated. + To use the eID function, your device must meet certain technical requirements. Furthermore, the eID function must be activated. LABEL ANDROID IOS Um die Online-Ausweisfunktion nutzen zu können, muss Ihr Gerät gewisse technische Anforderungen erfüllen. Zudem muss die Online-Ausweisfunktion Ihres Ausweises aktiviert sein. @@ -882,7 +874,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Smart-eID nicht unterstützt - Your mobile device does not meet the technical requirements for Smart-eID.<br><br>You may check if your device and ID card are suitable to use the eID functionality. + Your mobile device does not meet the technical requirements for Smart-eID.<br><br>You may check if your device and ID card are suitable to use the eID function. LABEL ANDROID IOS Ihr Gerät erfüllt leider nicht die technischen Voraussetzungen für die Smart-eID.<br><br>Sie können stattdessen prüfen, ob Ihr Gerät und Ihr Ausweis für die Online-Ausweisfunktion geeignet sind. @@ -965,9 +957,9 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Smart-eID prüfen - Your device needs to meet the technical requirements to use the Smart-eID functionality. + Your device needs to meet the technical requirements to use the Smart-eID function. LABEL ANDROID IOS - Um die Smart-eID-Funktionalität nutzen zu können, muss Ihr Gerät die technischen Voraussetzungen erfüllen. + Um die Smart-eID-Funktion nutzen zu können, muss Ihr Gerät die technischen Voraussetzungen erfüllen. Check here if your device is suitable to set up a Smart-eID. @@ -1488,9 +1480,7 @@ INFO ANDROID IOS The new ID card PIN needs to be confirmed. Do you have a five-digit Transport PIN? - LABEL DESKTOP Button to switch to start a change of the Transport PIN. ----------- -LABEL ANDROID IOS Button to start a change of the Transport PIN. + LABEL ANDROID IOS Button to start a change of the Transport PIN. Haben Sie eine fünfstellige Transport-PIN? @@ -1566,6 +1556,62 @@ INFO ANDROID IOS The AA2 expects a Smart-eID PIN with six digits in an authentic LABEL ANDROID IOS Button to switch to a six-digit ID card PIN. Haben Sie eine sechsstellige Karten-PIN? + + Send CAN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + CAN senden + + + Send PUK + LABEL DESKTOP +---------- +LABEL ANDROID IOS + PUK senden + + + Send pairing code + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Kopplungscode senden + + + Send new ID card PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Neue Karten-PIN senden + + + Send Transport PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Transport-PIN senden + + + Send Smart-eID PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Smart-eID-PIN senden + + + Send new Smart-eID PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Neue Smart-eID-PIN senden + + + Send ID card PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Karten-PIN senden + GProgressBar @@ -1709,7 +1755,7 @@ INFO ANDROID IOS The AA2 expects a Smart-eID PIN with six digits in an authentic More information - INFO DESKTOP Link text + LABEL DESKTOP Mehr Informationen @@ -2566,7 +2612,7 @@ LABEL ANDROID IOS Diese Funktion steht auf Ihrem Gerät leider nicht zur Verfügung. - However, you can use a separate smartphone as card reader to utilize the online identification function. + However, you can use a separate smartphone as card reader to utilize the eID function. INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use SaK instead. Sie können die Online-Ausweisfunktion aber mit einem anderen Smartphone als Kartenleser nutzen. @@ -2611,7 +2657,7 @@ LABEL ANDROID IOS Verbindung wird hergestellt - Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the online identification function. + Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the eID function. INFO ANDROID IOS The NFC interface does not meet the minimum requirements, using a different smartphone is suggested. Ihr Gerät erfüllt leider nicht die technischen Voraussetzungen (Extended Length). Sie können die Online-Ausweisfunktion aber mit einem anderen Smartphone als Kartenleser nutzen. @@ -2628,11 +2674,6 @@ LABEL ANDROID IOS NumberField - - The password is visible. - LABEL DESKTOP Screenreader text for the password field - Das Passwort ist sichtbar. - The password is hidden. LABEL DESKTOP Screenreader text for the password field @@ -2653,6 +2694,11 @@ LABEL ANDROID IOS LABEL DESKTOP Screenreader text for the eye icon to change the password visibility Drücken Sie die Taste um das Passwort einzublenden + + The password is visible. Digits entered so far: %1 + LABEL DESKTOP Screenreader text for the password field + Das Passwort ist sichtbar. Bisher eingegebene Ziffern: %1 + NumberPad @@ -2674,8 +2720,9 @@ LABEL ANDROID IOS Lösche letzte Ziffer, deaktiviert da keine Eingabe vorliegt. - Submit, disabled until input is complete. - Absenden, deaktiviert bis die Eingabe vollständig ist. + , disabled until input is complete. + LABEL ANDROID IOS A11y text, appended onto the "submit" button text when the button is disabled. + , deaktiviert bis die Eingabe vollständig ist. @@ -2686,127 +2733,281 @@ LABEL ANDROID IOS - PasswordInfoImage - - ID card PIN/PUK on different pages - LABEL - Karten-PIN/PUK auf unterschiedlichen Seiten - + PasswordInfoContent - ID card PIN/PUK on the same page - LABEL - Karten-PIN/PUK auf derselben Seite + More information + LABEL ALL_PLATFORMS + Mehr Informationen - PasswordInfoView + PasswordInfoData - Change PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - PIN-Ändern-Information + What is the card PIN? + LABEL ALL_PLATFORMS + Was ist die Karten-PIN? - CAN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - CAN-Information + PIN information + LABEL ALL_PLATFORMS + PIN-Information - PUK information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - PUK-Information + The card PIN is a 6-digit PIN that you set yourself. You always need this PIN if you want to use the eID function. + INFO ALL_PLATFORMS Answer to the question 'what is the card pin?' + Die Karten-PIN ist eine sechsstellige PIN, die Sie selbst gesetzt haben. Diese PIN brauchen Sie immer, wenn Sie die Online-Ausweisfunktion nutzen möchten. - Smartphone as card reader information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Smartphone als Kartenleser-Information + Where can I find the card PIN? + LABEL ALL_PLATFORMS + Wo finde ich die Karten-PIN? + + + You set the card PIN either directly when you picked up your ID card at the citizens' office (Bürgeramt) or later in AusweisApp2 using the 5-digit Transport PIN. Only when you have set a 6-digit PIN of your own choice can you use the eID function. + INFO ALL_PLATFORMS Answer to the question 'Where can I find the card PIN?' + Sie haben die Karten-PIN entweder direkt bei der Abholung des Ausweises im Bürgeramt oder später in der AusweisApp2 mithilfe der fünfstelligen Transport-PIN gesetzt. Erst wenn Sie eine selbstgewählte, sechsstellige PIN gesetzt haben, können Sie die Online-Ausweisfunktion nutzen. + + + How do I choose a secure PIN? + LABEL ALL_PLATFORMS + Wie wähle ich eine sichere PIN? + + + For your 6-digit PIN, choose a combination of numbers that cannot be guessed - i.e. neither "123456", nor your date of birth, nor any other numbers printed on your ID card. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 1/3 + Wählen Sie für Ihre sechsstellige PIN eine Zahlenkombination, die nicht zu erraten ist – also weder „123456“, noch Ihr Geburtsdatum oder andere Zahlen, die auf dem Ausweis aufgedruckt sind. + + + You can change your 6-digit PIN at any time and an unlimited number of times as long as you know your valid PIN. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 2/3 + Sie können Ihre sechsstellige PIN jederzeit und unbegrenzt oft ändern, solange Ihnen Ihre gültige PIN bekannt ist. + + + Keep your PIN secret and change it if another person becomes aware of it. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 3/3 + Halten Sie Ihre PIN geheim und ändern Sie diese, wenn eine andere Person hiervon Kenntnis erlangt. + + + What is the Transport PIN? + LABEL ALL_PLATFORMS + Was ist die Transport-PIN? Transport PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS + LABEL ALL_PLATFORMS Transport-PIN-Information - PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - PIN-Information + The 5-digit Transport PIN was sent to you in the PIN letter by mail after you applied for your ID card. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 1/3 + Die fünfstellige Transport-PIN wurde Ihnen im PIN-Brief per Post zugesandt, nachdem Sie Ihren Ausweis beantragt haben. - Select <b>"Six-digit PIN"</b> to change the self-chosen PIN of your ID card or the Smart-eID.<br><br>Select <b>"Five-digit Transport PIN"</b> if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.<br><br>Select <b>"PIN unknown"</b> if your PIN letter is not at hand or you cannot recall your PIN. - INFO DESKTOP Description text of change PIN selection options ----------- -INFO ANDROID IOS - Wählen Sie <b>"Sechsstellige PIN"</b>, um die selbstvergebene PIN Ihres Ausweises oder der Smart-eID zu ändern.<br><br>Wählen Sie <b>"Fünfstellige Transport-PIN"</b>, wenn Ihnen Ihr PIN-Brief vorliegt (siehe Grafik) und Sie noch keine sechsstellige Karten-PIN gesetzt haben.<br><br>Wählen Sie <b>"PIN unbekannt"</b>, wenn Sie keinen PIN-Brief vorliegen haben oder Ihre PIN vergessen haben. + If you did not set a self-selected 6-digit card PIN when you picked up your ID card, you can do so using the Transport PIN. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 2/3 + Falls Sie nicht direkt bei der Abholung Ihres Ausweises eine selbstgewählte, sechsstellige Karten-PIN gesetzt haben, können Sie dies mithilfe der Transport-PIN tun. + + + Once you have set a card PIN, the Transport PIN loses its validity. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 3/3 + Sobald Sie eine Karten-PIN gesetzt haben, verliert die Transport-PIN Ihre Gültigkeit. + + + Smartphone as card reader information + LABEL ALL_PLATFORMS + Smartphone als Kartenleser-Information + + + You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network. + INFO ALL_PLATFORMS Description text of SaC pairing + Es besteht die Möglichkeit, Ihr Smartphone als Kartenleser mit der AusweisApp2 zu verwenden. Das Smartphone muss einen unterstützten NFC-Chip verwenden und beide Geräte, sowohl das Smartphone als auch Ihr Rechner, müssen mit dem selben WLAN-Netz verbunden sein. + + + To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone. + INFO ALL_PLATFORMS Description text of SaC pairing + Um Ihr Smartphone als Kartenleser zu verwenden muss stets der Fernzugriff in der AusweisApp2 auf Ihrem Smartphone aktiviert sein. Für eine initiale Verbindung der Geräte muss zusätzlich der Kopplungsmodus auf dem Smartphone aktiviert werden, wählen Sie danach das Gerät aus der Liste der verfügbaren Geräte auf Ihrem Rechner und geben Sie den von Ihrem Smartphone dargestellten Kopplungscode ein. + + + Where do I find the PUK? + LABEL ALL_PLATFORMS + Wo finde ich die PUK? + + + PUK information + LABEL ALL_PLATFORMS + PUK-Information + + + The PUK is a 10-digit number that you can find in the PIN letter that was sent to you by mail after you applied for your ID card. + INFO ALL_PLATFORMS Answer to the question 'Where do I find the PUK?' + Die PUK ist eine zehnstellige Zahl, die Sie in dem PIN-Brief finden, der Ihnen nach Beantragung Ihres Ausweises per Post zugeschickt wurde. + + + Why is the PUK required? + LABEL ALL_PLATFORMS + Warum wird die PUK verlangt? + + + The PUK is required if the card PIN has been entered incorrectly three times in a row. As a result, the card PIN is blocked. + INFO ALL_PLATFORMS Answer to the question 'Why is the PUK required?' + Die PUK wird verlangt, wenn die Karten-PIN dreimal hintereinander falsch eingegeben wurde. Die Karten-PIN ist dadurch gesperrt. + + + What is the PUK's purpose? + LABEL ALL_PLATFORMS + Was ist die Funktion der PUK? + + + By entering the PUK, you unblock the card PIN and have another three chances to enter the correct PIN. + INFO ALL_PLATFORMS Answer to the question 'What is the PUK's purpose?' + Durch die Eingabe der PUK entsperren Sie die Karten-PIN wieder und haben weitere drei Möglichkeiten, die richtige PIN einzugeben. + + + Why is the CAN required? + LABEL ALL_PLATFORMS + Warum wird die CAN verlangt? + + + CAN information + LABEL ALL_PLATFORMS + CAN-Information + + + When is the card access number (CAN) required? + LABEL ALL_PLATFORMS + Wann wird die Zugangsnummer (CAN) verlangt? + + + The card access number (CAN) is required when the card PIN has been entered incorrectly twice. + INFO ALL_PLATFORMS Answer to the question 'When is the card access number (CAN) required?' + Die Zugangsnummer (CAN) wird verlangt, wenn die Karten-PIN zweimal falsch eingegeben wurde. + + + Why do I have to enter the CAN before a third attempt? + LABEL ALL_PLATFORMS + Warum muss ich vor einem dritten Versuch die CAN eingeben? + + + A third incorrect entry blocks your PIN and you can no longer use the eID function until it is unblocked. Requesting the CAN ensures that a third incorrect entry can only be made with direct access to your ID card. + INFO ALL_PLATFORMS Answer to the question 'Why do I have to enter the CAN before a third attempt?' + Eine dritte Fehleingabe sperrt Ihre PIN und Sie können die Online-Ausweisfunktion bis zur Entsperrung nicht mehr nutzen. Durch die Abfrage der CAN wird sichergestellt, dass nur mit direktem Zugriff auf Ihren Ausweis eine dritte Fehleingabe erfolgen kann. + + + Where can I find the CAN? + LABEL ALL_PLATFORMS + Wo finde ich die CAN? + + + The CAN is a 6-digit number that can be found on the bottom right of the front of the ID card. + INFO ALL_PLATFORMS Answer to the question 'Where can I find the CAN?' + Die CAN ist eine sechsstellige Zahl, die unten rechts auf der Vorderseite des Ausweises zu finden ist. The Card Access Number (CAN) allows to access the imprinted data of the ID card. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red). - INFO DESKTOP Description text of CAN-allowed authentication ----------- -INFO ANDROID IOS Description text of CAN-allowed authentication + INFO ALL_PLATFORMS Description text of CAN-allowed authentication Die Zugangsnummer (CAN) ermöglicht den Zugriff auf die auf dem Ausweis gespeicherten Daten. Die CAN ist eine sechsstellige Zahl, die auf der Vorderseite des Ausweises unten rechts zu finden ist (rot markiert). - The Card Access Number (CAN) is required if the ID card PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red). - INFO DESKTOP Description text of CAN if required for third ID card PIN attempt + Smart-eID blocking code + LABEL ANDROID IOS ---------- -INFO ANDROID IOS Description text of CAN if required for third ID card PIN attempt - Die Zugangsnummer (CAN) wird verlangt, wenn die Karten-PIN bereits zweimal falsch eingegeben wurde. Um zu verhindern, dass ohne Ihre Zustimmung eine dritte Fehleingabe und somit die Sperrung der PIN erfolgen kann, wird an dieser Stelle zusätzlich die CAN abgefragt. Die CAN ist eine sechsstellige Zahl, die auf der Vorderseite des Ausweises unten rechts zu finden ist (rot markiert). +LABEL ALL_PLATFORMS + Smart-eID Sperrkennwort - The PUK is required if the ID card PIN has been entered incorrectly three times. At this point the ID card PIN is blocked. The PUK (marked in red) is a ten-digit number you received with the letter sent to you by your competent authority. Please note that you can only use the PUK to unblock the PIN entry. - INFO DESKTOP Description text of PUK ----------- -INFO ANDROID IOS Description text of PUK - Die PUK wird verlangt, wenn die Karten-PIN dreimal hintereinander falsch eingegeben wurde. Zu diesem Zeitpunkt ist die Karten-PIN gesperrt. Die PUK (rot markiert) ist eine zehnstellige Zahl, die Sie mit dem Schreiben bekommen haben, welches Sie nach Beantragung Ihres Ausweises von der zuständigen Behörde erhalten haben. Bitte beachten Sie, dass Sie mit Ihrer PUK lediglich die PIN-Eingabe wieder entsperren können. + Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device. + INFO ANDROID IOS Description text of Smart-eID PIN + Genau wie der physische Ausweis kann auch die auf Ihrem Smartphone gespeicherte Smart-eID gesperrt werden. Dies kann erforderlich sein, wenn Sie Ihr Gerät einmal verlieren. - You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network.<br><br>To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone. - INFO DESKTOP Description text of SaC pairing ----------- -INFO ANDROID IOS Description text of SaC pairing - Es besteht die Möglichkeit Ihr Smartphone als Kartenleser mit der AusweisApp2 zu verwenden. Das Smartphone muss einen unterstützten NFC-Chip verwenden und beide Geräte, sowohl das Smartphone als auch Ihr Rechner, müssen mit dem selben WLAN-Netz verbunden sein.<br><br>Um Ihr Smartphone als Kartenleser zu verwenden muss stets der Fernzugriff in der AusweisApp2 auf Ihrem Smartphone aktiviert sein. Für eine initiale Verbindung der Geräte muss zusätzlich der Kopplungsmodus auf dem Smartphone aktiviert werden, wählen Sie danach das Gerät aus der Liste der verfügbaren Geräte auf Ihrem Rechner und geben Sie den von Ihrem Smartphone dargestellten Kopplungscode ein. + To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation. + INFO ANDROID IOS Description text of Smart-eID PIN + Um eine aktive Smart-eID zu sperren, ist ein Sperrkennwort erforderlich. Das Sperrkennwort wird nach erfolgreicher Erstellung der Smart-eID angezeigt. Darüber hinaus ist es in dem Schreiben enthalten, das Sie nach der Erstellung erhalten. - In order to use the online identification function you need an ID card PIN. It has six digits and is chosen by you.<br><br>If you have not yet set a six-digit ID card PIN, e.g. when picking up your ID card, use the five-digit Transport PIN for initially setting the ID card PIN. The Transport PIN is contained in the PIN letter (see figure) you received after applying for your ID card. Note that the Transport PIN is void after setting a six-digit ID card PIN.<br><br>If you already have a six-digit PIN only that is valid. This is also the case if you reinstalled the %1, the ID card PIN is stored on your ID card. - INFO DESKTOP Description text of Transport PIN ----------- -INFO ANDROID IOS Description text of Transport PIN - Für die Nutzung der Online-Ausweisfunktion benötigen Sie eine Karten-PIN. Diese ist sechsstellig und wird von Ihnen selbstgewählt.<br><br>Falls Sie noch keine sechsstellige Karten-PIN gesetzt haben, z.B. bei der Abholung Ihres Ausweises, verwenden Sie zum erstmaligen Setzen Ihrer Karten-PIN die fünfstellige Transport-PIN. Die Transport-PIN haben Sie nach Beantragung Ihres Ausweises mit dem PIN-Brief (siehe Grafik) erhalten. Die Transport-PIN verliert ihre Gültigkeit, sobald eine sechstellige Karten-PIN gesetzt wurde.<br><br>Haben Sie bereits eine sechsstellige Karten-PIN, ist nur noch diese gültig. Dies gilt auch bei einer Neuinstallation der %1, die Karten-PIN ist auf Ihrem Ausweis gespeichert. + No PIN known + LABEL ALL_PLATFORMS + Keine PIN bekannt - The PIN is a six-digit number you set yourself and is required for every use of the online identification function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither "123456" nor your birth date, or any other numbers printed on the ID card. - INFO DESKTOP Description text of PIN ----------- -INFO ANDROID IOS Description text of PIN - Die PIN vergeben Sie selbst und benötigen Sie bei jeder Nutzung der Online-Ausweisfunktion. Sie können diese jederzeit und unbegrenzt oft ändern, solange Ihnen Ihre gültige PIN bekannt ist. Wählen Sie für Ihre sechstellige PIN eine Zahlenkombination, die nicht zu erraten ist, also weder "123456", noch Ihr Geburtsdatum oder andere Zahlen, die auf dem Ausweis aufgedruckt sind. + You do not know your PIN? + LABEL ALL_PLATFORMS + Sie kennen Ihre PIN nicht? - Smart-eID blocking code - LABEL ANDROID IOS - Smart-eID Sperrkennwort + You have not yet set a 6-digit card PIN and cannot find the PIN letter with the Transport PIN? + INFO ALL_PLATFORMS + Sie haben noch keine sechsstellige PIN gesetzt und können den Brief mit der Transport-PIN nicht finden? - Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device.<br><br>To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation. - INFO ANDROID IOS Description text of Transport PIN - Genau wie der physische Ausweis kann auch die auf Ihrem Smartphone gespeicherte Smart-eID gesperrt werden. Dies kann erforderlich sein, wenn Sie Ihr Gerät einmal verlieren.<br><br>Um eine aktive Smart-eID zu sperren, ist ein Sperrkennwort erforderlich. Das Sperrkennwort wird nach erfolgreicher Erstellung der Smart-eID angezeigt. Darüber hinaus ist es in dem Schreiben enthalten, das Sie nach der Erstellung erhalten. + You set a card PIN when picking up your ID card or later by yourself, but you can no longer remember it? + INFO ALL_PLATFORMS + Sie haben bei der Abholung des Ausweises oder später selbst eine Karten-PIN gesetzt, können sich aber nicht mehr an diese erinnern? - Select <b>"Six-digit PIN"</b> to change the self-chosen PIN of your ID card.<br><br>Select <b>"Five-digit Transport PIN"</b> if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.<br><br>Select <b>"PIN unknown"</b> if your PIN letter is not at hand or you cannot recall your PIN. - INFO DESKTOP Description text of change PIN selection options ----------- -INFO ANDROID IOS - Wählen Sie <b>"Sechsstellige PIN"</b>, um die selbstvergebene PIN Ihres Ausweises zu ändern.<br><br>Wählen Sie <b>"Fünfstellige Transport-PIN"</b>, wenn Ihnen Ihr PIN-Brief vorliegt (siehe Grafik) und Sie noch keine sechsstellige Karten-PIN gesetzt haben.<br><br>Wählen Sie <b>"PIN unbekannt"</b>, wenn Sie keinen PIN-Brief vorliegen haben oder Ihre PIN vergessen haben. + Learn more about the two types of PIN + LABEL ALL_PLATFORMS + Erfahren Sie mehr über die zwei PIN-Arten + + + Types of PIN + LABEL ALL_PLATFORMS + PIN-Arten + + + Your ID card comes with a 5-digit 'Transport PIN' which you need to replace with a 6-digit PIN that you choose yourself. + INFO ALL_PLATFORMS Description text explaining the PINs 1/6 + Ihr Ausweis wurde bei Erstellung mit einer fünfstelligen „Transport-PIN“ versehen, die Sie durch eine sechsstellige, selbstgewählte PIN ersetzen müssen. + + + 5-digit Transport PIN + LABEL ALL_PLATFORMS + Fünfstellige Transport-PIN + + + The 5-digit Transport PIN was sent to you by post after you applied for your ID card. + INFO ALL_PLATFORMS Description text explaining the PINs 2/6 + Die fünfstellige Transport-PIN wurde Ihnen per Post zugesandt, nachdem Sie Ihren Ausweis beantragt haben. + + + The PIN can only be used once. When you set up the eID function, you will replace this 5-digit PIN with a 6-digit PIN that you choose yourself. + INFO ALL_PLATFORMS Description text explaining the PINs 3/6 + Diese PIN kann nur einmal verwendet werden. Wenn Sie Ihren Online-Ausweis einrichten, ersetzen Sie diese fünfstellige Transport-PIN durch eine sechsstellige, selbstgewählte PIN. + + + 6-digit PIN + LABEL ALL_PLATFORMS + Sechsstellige PIN + + + This is a number that you choose yourself when you set up the eID function for the first time. It replaces your 5-digit Transport PIN. + INFO ALL_PLATFORMS Description text explaining the PINs 4/6 + Die sechsstellige PIN ist eine Zahlenkombination, die Sie selbst wählen, wenn Sie Ihren Online-Ausweis zum ersten Mal einrichten. Sie ersetzt Ihre fünfstellige Transport-PIN. + + + This PIN allows you to prove online that the ID card belongs to you. No one can use your ID card online without this PIN. + INFO ALL_PLATFORMS Description text explaining the PINs 5/6 + Mit der sechsstelligen, selbstgewählten PIN weisen Sie online nach, dass der Ausweis Ihnen gehört. Keiner kann Ihren Ausweis online benutzen ohne diese PIN. + + + You can change your 6-digit PIN at any time in AusweisApp2. + INFO ALL_PLATFORMS Description text explaining the PINs 6/6 + Sie können Ihre PIN jederzeit in der AusweisApp2 ändern. + + + You can use the PIN Reset Service to request a new card PIN free of charge. + LABEL ALL_PLATFORMS + Dann fordern Sie jetzt mithilfe des PIN-Rücksetzdienstes kostenlos eine neue Karten-PIN an. + + + If you do not know either your Transport PIN or your card PIN, you can request a new PIN free of charge using the PIN Reset Service. + LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN, are not known. + Wenn Ihnen weder Ihre Transport-PIN noch Ihre Karten-PIN bekannt ist, können Sie mit dem PIN-Rücksetzdienst kostenlos eine neue PIN anfordern. + + + If you have forgotten your card PIN, you can request a new PIN free of charge using the PIN Reset Service. + LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. + Wenn Sie Ihre Karten-PIN vergessen haben, können Sie mit dem PIN-Rücksetzdienst kostenlos eine neue PIN anfordern. @@ -2981,34 +3182,6 @@ INFO ANDROID IOS Achtung: Sie können mit Ihrem Ausweis noch <b><u>eine</u></b> Smart-eID einrichten. Weitere Einrichtungen können Sie ab dem %1 vornehmen. - - PinUnknownView - - No PIN known - LABEL ANDROID IOS - Keine PIN bekannt - - - ID card - LABEL ANDROID IOS - Ausweis - - - Smart-eID - LABEL ANDROID IOS - Smart-eID - - - If you have forgotten your Smart-eID PIN, you can easily set up Smart-eID again. This requires knowledge of your ID card PIN. - LABEL ANDROID IOS A user wants to change but does not know their Smart-eID PIN. - Wenn Sie Ihre Smart-eID-PIN vergessen haben, können Sie die Smart-eID einfach erneut einrichten. Dazu ist die Kenntnis ihrer Karten-PIN erforderlich. - - - Setup Smart-eID - LABEL ANDROID IOS - Einrichtung Smart-eID - - PkiSwitch @@ -3281,22 +3454,27 @@ INFO ANDROID_TABLET IOS_TABLET No authentication history, placeholder text.ProviderOverview All provider + LABEL DESKTOP Alle Anbieter Citizen services + LABEL DESKTOP Bürgerdienste Financials + LABEL DESKTOP Finanzen Insurances + LABEL DESKTOP Versicherungen Other services + LABEL DESKTOP Weitere Dienste @@ -3693,8 +3871,9 @@ Falls Sie noch kein Gerät gekoppelt haben, starten Sie jetzt die Kopplung, um d Details - Error code: %1 - Fehlercode: %1 + Error code: + LABEL ANDROID IOS + Fehlercode: @@ -4220,7 +4399,7 @@ LABEL ALL_PLATFORMS Wollen Sie die %1 automatisch nach dem Hochfahren starten? - In order to successfully use the online identification function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup. + In order to successfully use the eID function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup. INFO DESKTOP Information text why autostart of the App is advisable Um die Online-Ausweisfunktion erfolgreich nutzen zu können, muss die %1 gestartet sein. Daher ist es ratsam, dies beim Systemstart zuzulassen. @@ -4512,6 +4691,7 @@ LABEL ALL_PLATFORMS Resetting Smart-eID + LABEL ANDROID IOS Setze Smart-eID zurück @@ -4759,11 +4939,6 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au LABEL ANDROID IOS Kennen Sie Ihre sechsstellige Karten-PIN? - - Online identification with Transport PIN is not possible. The personal, six-digit ID card PIN is mandatory to use the online identification function. - LABEL ANDROID IOS - Die Benutzung der Online-Ausweisfunktion mit der Transport-PIN ist nicht möglich. Die persönliche, sechsstellige Karten-PIN wird zur Nutzung der Online-Ausweisfunktion zwingend benötigt. - No LABEL ANDROID IOS @@ -4774,6 +4949,11 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au LABEL ANDROID IOS Ja + + Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function. + LABEL ANDROID IOS + Die Benutzung der Online-Ausweisfunktion mit der Transport-PIN ist nicht möglich. Die selbstgewählte, sechsstellige Karten-PIN wird zur Nutzung der Online-Ausweisfunktion zwingend benötigt. + TutorialFooter @@ -4995,6 +5175,11 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au LABEL ANDROID IOS Sie können dieses Tutorial jederzeit wieder über den Bereich "Hilfe" aufrufen. + + If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service. + LABEL ANDROID IOS + Falls Sie sich nicht an Ihre sechsstellige PIN erinnern oder den PIN-Brief nicht finden können, können Sie eine neue PIN mithilfe des PIN-Rücksetzdienstes beantragen. + TutorialReaderMethodFooter @@ -5983,6 +6168,14 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au Fehler beim Speichern der Konfiguration unter "%1" + + governikus::AuthModel + + Reason: + INFO ALL_PLATFORMS Failure code (string) of current workflow error. + Grund: + + governikus::CardInfo @@ -6385,7 +6578,7 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au No driver installed - LABEL ALL_PLATFORMS + LABEL DESKTOP Treiber nicht installiert @@ -6398,6 +6591,16 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au LABEL DESKTOP Antivirus und Firewall + + Service addresses + LABEL DESKTOP + Dienstadressen + + + Not bound + LABEL DESKTOP + Nicht gebunden + governikus::ECardApiResult @@ -6502,7 +6705,7 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au Eine oder mehrere Zertifikatsprüfungen schlugen fehl. Der Vorgang wird aus Sicherheitsgründen abgebrochen. - This action cannot be performed. The online identification function of your ID card is not activated. + This action cannot be performed. The eID function of your ID card is not activated. LABEL ALL_PLATFORMS Diese Aktion kann leider nicht durchgeführt werden. Die Online-Ausweisfunktion Ihres Ausweises ist nicht aktiviert. @@ -6641,7 +6844,7 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au The device does not support Smart-eID. - ERROR ALL_PLATFORMS The device does not support the Smart-eID functionality + ERROR ALL_PLATFORMS The device does not support the Smart-eID function Dieses Gerät unterstützt keine Smart-eID. @@ -6755,8 +6958,8 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au Karte nicht vorhanden - The online identification function of your ID card is not yet activated. - ERROR ALL_PLATFORMS The eID functionality of the ID card is not active. + The eID function of your ID card is not yet activated. + ERROR ALL_PLATFORMS The eID function of the ID card is not active. Die Online-Ausweisfunktion Ihres Ausweises ist noch nicht aktiviert. @@ -7159,89 +7362,29 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au https://www.personalausweisportal.de/DE - You cannot find your PIN letter? You have set a ID card PIN when picking up the ID card or later that you cannot recall now? - LABEL ALL_PLATFORMS Explanation if the (Transport) PIN is unknown to the user on the Change PIN startpage. - Sie können Ihren PIN-Brief nicht finden? Sie haben bei der Abholung des Ausweises oder später selbst eine Karten-PIN vergeben, an die Sie sich nicht erinnern können? - - - By using the PIN Reset Service you may request a new ID card PIN. - LABEL ALL_PLATFORMS Text in Hint to PRS if the (Transport) PIN is unknown to the user on the Change PIN startpage - Mithilfe des PIN-Rücksetzdienstes können Sie eine neue Karten-PIN anfordern. - - - If this is the case please turn to the competent authority and set a new ID card PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Text in Hint when PRS is not available and the (Transport) PIN is unknown to the user on the Change PIN startpage - Wenden Sie sich in diesem Fall bitte an die zuständige Behörde und legen Sie dort eine neue Karten-PIN fest.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. - - - If you have forgotten your ID card PIN or do not have access to the PUK, you may request a new PIN here. + You cannot use the PUK to reset your previously set card PIN. If you forgot your card PIN, you can use the PIN Reset Service to request a new PIN. LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - Sollten Sie Ihre Karten-PIN vergessen haben oder Ihnen die PUK nicht vorliegen, können Sie hier eine neue PIN anfordern. - - - If you have forgotten your ID card PIN or do not have access to the PUK, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - Sollten Sie Ihre Karten-PIN vergessen haben oder Ihnen die PUK nicht vorliegen, können Sie sich an die zuständige Behörde wenden und dort eine neue PIN festlegen.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. - - - If you know neither your Transport PIN nor your ID card PIN, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - Ist Ihnen weder Ihre Transport-PIN noch Ihre Karten-PIN bekannt, können Sie hier eine PIN anfordern. - - - If you know neither your Transport PIN nor your ID card PIN, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - Ist Ihnen weder Ihre Transport-PIN noch Ihre Karten-PIN bekannt, können Sie sich an die zuständige Behörde wenden und dort eine neue PIN festlegen.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. - - - If you cannot recall your ID card PIN, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - Wenn Sie Ihre Karten-PIN vergessen haben, können Sie hier eine neue PIN anfordern. + Mit der PUK können Sie Ihre gesetzte Karten-PIN nicht zurücksetzen. Sollten Sie Ihre Karten-PIN vergessen haben, können Sie den PIN-Rücksetzdienst nutzen, um eine neue PIN anzufordern. - If you cannot recall your ID card PIN, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - Wenn Sie Ihre Karten-PIN vergessen haben, können Sie sich an die zuständige Behörde wenden und dort eine neue PIN festlegen.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. - - - If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service. - LABEL ANDROID IOS - Falls Sie sich nicht an Ihre sechsstellige PIN erinnern oder den PIN-Brief nicht finden können, können Sie eine neue PIN mithilfe des PIN-Rücksetzdienstes beantragen. - - - You can always set a new ID card PIN at the competent authority if the (Transport) PIN is not known.<br/><br/>For further information, please visit the ID card portal. - LABEL ANDROID IOS - Ist Ihnen die (Transport-)PIN nicht bekannt, können Sie in der zuständigen Behörde jederzeit eine neue Karten-PIN setzen.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. - - - You may request a new ID card PIN here. - LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - Hier können Sie eine neue Karten-PIN anfordern. - - - You may turn to the competent authority and set a new ID card PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - Sie können sich an die zuständige Behörde wenden und dort eine neue Karten-PIN festlegen.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. - - - You can request activation of the online identification function here. - LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - Die Aktivierung der Online-Ausweisfunktion können Sie hier anfordern. + Go to PIN Reset Service + LABEL ALL_PLATFORMS + Zum PIN-Rücksetzdienst - Please contact the competent authority to activate the online identification function.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - Bitte wenden Sie sich an die zuständige Behörde, um die Online-Ausweisfunktion zu aktivieren.<br/><br/>Weitere Informationen erhalten Sie auf dem Personalausweisportal. + You can request activation of the eID function without charge. + LABEL ALL_PLATFORMS Hint when a workflow failed because the eID function was not activated + Sie können die Aktivierung der Online-Ausweisfunktion kostenlos anfordern. - To provider + Go to Activation Service LABEL ALL_PLATFORMS - Zum Anbieter + Zum Aktivierungsdienst - Open website - LABEL ALL_PLATFORMS - Öffne Webseite + Request a new card PIN free of charge to be able to use the eID function again. + LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK + Fordern Sie kostenlos eine neue Karten-PIN an, um die Online-Ausweisfunktion wieder nutzen zu können. @@ -7876,6 +8019,10 @@ Bitte aktivieren Sie NFC, um Ihr Smartphone als Kartenleser (SaK) benutzen zu k AusweisApp2 error report - %1 AusweisApp2 Fehlerbericht - %1 + + Contact your local citizens' office (Bürgeramt) to apply for a new ID card or to unblock the ID card. + Bitte wenden Sie sich an das Bürgeramt, um ein neues Ausweisdokument zu beantragen oder die Sperrung des Ausweises aufzuheben. + main diff --git a/resources/translations/ausweisapp2_ru.ts b/resources/translations/ausweisapp2_ru.ts index 1bca12edf..620dd89f9 100644 --- a/resources/translations/ausweisapp2_ru.ts +++ b/resources/translations/ausweisapp2_ru.ts @@ -5,7 +5,7 @@ DvcsAttributes revision - 7488db7b6a84 + 52a5aa47f692 @@ -66,14 +66,6 @@ LABEL ANDROID IOS Идентифицировать - - Do you know your six-digit PIN? - Вы знаете 6-значный PIN-код? - - - The personal, six-digit PIN is mandatory to use the online identification function. - Для онлайн-идентификации обязательно требуется личный 6-значный PIN-код. - No network connectivity INFO DESKTOP Header of the message that no network connection is present during the authentication procedure. @@ -171,6 +163,21 @@ INFO ANDROID IOS Second line text if a basic card reader is used and background LABEL ANDROID IOS Отправить файл журнала + + Authenticate with provider + LABEL DESKTOP A11y button to confirm the PIN and start the provider authentication +---------- +LABEL ANDROID IOS A11y button to confirm the PIN and start the provider authentication + + + + Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function. + + + + Do you know your six-digit ID card PIN? + Вы знаете 6-значный PIN-код идентификационной карты? + BaseConfirmationPopup @@ -400,31 +407,6 @@ LABEL DESKTOP Processing screen label while the card communication is running af LABEL ANDROID IOS Изменить PIN-код - - What kind of PIN do you have? - LABEL DESKTOP Title of PIN change start page. User is asked which type of PIN they have. - Какой у вас PIN-код? - - - Please make a choice to set or change your PIN. - LABEL DESKTOP Description of PIN change start page. User has a choice of which PIN to set. - Выберите установку или изменение PIN-кода. - - - PIN unknown - LABEL DESKTOP - PIN-код неизвестен - - - Five-digit Transport PIN - LABEL DESKTOP - 5-значный временный PIN-код - - - Six-digit PIN - LABEL DESKTOP - 6-значный PIN-код - Setting new PIN LABEL DESKTOP Processing screen label while the card communication is running after the new PIN has been entered during PIN change process. @@ -519,28 +501,38 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin ChangePinViewContent What kind of PIN do you have? - LABEL ANDROID IOS + LABEL ALL_PLATFORMS Какой у вас PIN-код? - Please make a choice to set or change your PIN. - LABEL ANDROID IOS - Выберите установку или изменение PIN-кода. + 6-digit PIN + LABEL ALL_PLATFORMS + - Six-digit PIN - LABEL ANDROID_TABLET IOS_TABLET - 6-значный PIN-код + Set by yourself + LABEL ALL_PLATFORMS + - Five-digit Transport PIN - LABEL ANDROID_TABLET IOS_TABLET - 5-значный временный PIN-код + 5-digit Transport PIN + LABEL ALL_PLATFORMS + - PIN unknown - LABEL ANDROID_TABLET IOS_TABLET - PIN-код неизвестен + Received by mail in PIN letter + LABEL ALL_PLATFORMS + + + + No PIN + LABEL ALL_PLATFORMS + + + + Lost, forgotten, or never received it + LABEL ALL_PLATFORMS + @@ -671,7 +663,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin NFC отсутствует - Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the online identification function.<br><br>You can find smartphones compatible with the %1 on our website. + Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the eID function.<br><br>You can find smartphones compatible with the %1 on our website. LABEL ANDROID IOS В вашем мобильном устройстве нет интерфейса NFC. Он требуется для считывания идентификационной карты. Вы также можете использовать другой смартфон в качестве устройства чтения карт для онлайн-идентификации.<br><br>Список совместимых с %1 смартфонов см. на нашем сайте. @@ -759,7 +751,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Проверить устройство и идентификационную карту - To use the online identification function, your device must meet certain technical requirements. Furthermore, the online identification function must be activated. + To use the eID function, your device must meet certain technical requirements. Furthermore, the eID function must be activated. LABEL ANDROID IOS Для использования функции онлайн-идентификации ваше устройство должно соответствовать определенным техническим требованиям. Также необходимо активировать функцию онлайн-идентификации. @@ -882,7 +874,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Smart-eID не поддерживается - Your mobile device does not meet the technical requirements for Smart-eID.<br><br>You may check if your device and ID card are suitable to use the eID functionality. + Your mobile device does not meet the technical requirements for Smart-eID.<br><br>You may check if your device and ID card are suitable to use the eID function. LABEL ANDROID IOS Ваше мобильное устройство не соответствует техническим требованиям для Smart-eID.<br><br>Вы можете проверить пригодность вашего устройства и идентификационной карты для использования функции eID. @@ -965,7 +957,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Проверить Smart-eID - Your device needs to meet the technical requirements to use the Smart-eID functionality. + Your device needs to meet the technical requirements to use the Smart-eID function. LABEL ANDROID IOS Ваше устройство должно соответствовать техническим требованиям для использования функций Smart-eID. @@ -1488,9 +1480,7 @@ INFO ANDROID IOS The new ID card PIN needs to be confirmed. Do you have a five-digit Transport PIN? - LABEL DESKTOP Button to switch to start a change of the Transport PIN. ----------- -LABEL ANDROID IOS Button to start a change of the Transport PIN. + LABEL ANDROID IOS Button to start a change of the Transport PIN. У вас есть 5-значный временный PIN-код? @@ -1566,6 +1556,62 @@ INFO ANDROID IOS The AA2 expects a Smart-eID PIN with six digits in an authentic LABEL ANDROID IOS Button to switch to a six-digit ID card PIN. У вас есть 6-значный PIN-код идентификационной карты? + + Send CAN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send PUK + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send pairing code + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send new ID card PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send Transport PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send Smart-eID PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send new Smart-eID PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send ID card PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + GProgressBar @@ -1709,7 +1755,7 @@ INFO ANDROID IOS The AA2 expects a Smart-eID PIN with six digits in an authentic More information - INFO DESKTOP Link text + LABEL DESKTOP Дополнительные сведения @@ -2566,7 +2612,7 @@ LABEL ANDROID IOS Данная функция недоступна для вашего устройства. - However, you can use a separate smartphone as card reader to utilize the online identification function. + However, you can use a separate smartphone as card reader to utilize the eID function. INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use SaK instead. Вы можете воспользоваться функцией онлайн-идентификации на другом смартфоне, используемом в качестве устройства чтения карт. @@ -2611,7 +2657,7 @@ LABEL ANDROID IOS Установить соединение - Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the online identification function. + Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the eID function. INFO ANDROID IOS The NFC interface does not meet the minimum requirements, using a different smartphone is suggested. Ваше устройство не соответствует техническим требованиям (не поддерживается расширенная длина). Вы можете воспользоваться функцией онлайн-идентификации на другом смартфоне, используемом в качестве устройства чтения карт. @@ -2628,11 +2674,6 @@ LABEL ANDROID IOS NumberField - - The password is visible. - LABEL DESKTOP Screenreader text for the password field - Пароль отображается. - The password is hidden. LABEL DESKTOP Screenreader text for the password field @@ -2653,6 +2694,11 @@ LABEL ANDROID IOS LABEL DESKTOP Screenreader text for the eye icon to change the password visibility Нажмите, чтобы показать пароль + + The password is visible. Digits entered so far: %1 + LABEL DESKTOP Screenreader text for the password field + + NumberPad @@ -2674,7 +2720,8 @@ LABEL ANDROID IOS - Submit, disabled until input is complete. + , disabled until input is complete. + LABEL ANDROID IOS A11y text, appended onto the "submit" button text when the button is disabled. @@ -2686,126 +2733,280 @@ LABEL ANDROID IOS - PasswordInfoImage - - ID card PIN/PUK on different pages - LABEL - PIN/PUK-код идентификационной карты на разных страницах - + PasswordInfoContent - ID card PIN/PUK on the same page - LABEL - PIN/PUK-код идентификационной карты на одной странице + More information + LABEL ALL_PLATFORMS + Дополнительные сведения - PasswordInfoView + PasswordInfoData - Change PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Информация об изменении PIN-кода + What is the card PIN? + LABEL ALL_PLATFORMS + - CAN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Информация о CAN + PIN information + LABEL ALL_PLATFORMS + Информация о PIN-коде - PUK information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Информация о PUK-коде + The card PIN is a 6-digit PIN that you set yourself. You always need this PIN if you want to use the eID function. + INFO ALL_PLATFORMS Answer to the question 'what is the card pin?' + - Smartphone as card reader information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Информация о смартфоне, используемом в качестве устройства чтения карт + Where can I find the card PIN? + LABEL ALL_PLATFORMS + + + + You set the card PIN either directly when you picked up your ID card at the citizens' office (Bürgeramt) or later in AusweisApp2 using the 5-digit Transport PIN. Only when you have set a 6-digit PIN of your own choice can you use the eID function. + INFO ALL_PLATFORMS Answer to the question 'Where can I find the card PIN?' + + + + How do I choose a secure PIN? + LABEL ALL_PLATFORMS + + + + For your 6-digit PIN, choose a combination of numbers that cannot be guessed - i.e. neither "123456", nor your date of birth, nor any other numbers printed on your ID card. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 1/3 + + + + You can change your 6-digit PIN at any time and an unlimited number of times as long as you know your valid PIN. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 2/3 + + + + Keep your PIN secret and change it if another person becomes aware of it. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 3/3 + + + + What is the Transport PIN? + LABEL ALL_PLATFORMS + Transport PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS + LABEL ALL_PLATFORMS Информация о временном PIN-коде - PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Информация о PIN-коде + The 5-digit Transport PIN was sent to you in the PIN letter by mail after you applied for your ID card. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 1/3 + - Select <b>"Six-digit PIN"</b> to change the self-chosen PIN of your ID card or the Smart-eID.<br><br>Select <b>"Five-digit Transport PIN"</b> if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.<br><br>Select <b>"PIN unknown"</b> if your PIN letter is not at hand or you cannot recall your PIN. - INFO DESKTOP Description text of change PIN selection options ----------- -INFO ANDROID IOS - Выберите <b>«6-значный PIN-код»</b>, чтобы изменить выбранный вами PIN-код идентификационной карты или Smart-eID.<br><br>Выберите <b>«5-значный временный PIN-код»</b>, если у вас есть письмо с PIN-кодом (см. рис.) и вы еще не установили 6-значный PIN-код идентификационной карты.<br><br>Выберите <b>«PIN-код неизвестен»</b>, если у вас нет письма с PIN-кодом или вы не можете вспомнить PIN-код. + If you did not set a self-selected 6-digit card PIN when you picked up your ID card, you can do so using the Transport PIN. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 2/3 + + + + Once you have set a card PIN, the Transport PIN loses its validity. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 3/3 + + + + Smartphone as card reader information + LABEL ALL_PLATFORMS + Информация о смартфоне, используемом в качестве устройства чтения карт + + + You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network. + INFO ALL_PLATFORMS Description text of SaC pairing + + + + To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone. + INFO ALL_PLATFORMS Description text of SaC pairing + + + + Where do I find the PUK? + LABEL ALL_PLATFORMS + + + + PUK information + LABEL ALL_PLATFORMS + Информация о PUK-коде + + + The PUK is a 10-digit number that you can find in the PIN letter that was sent to you by mail after you applied for your ID card. + INFO ALL_PLATFORMS Answer to the question 'Where do I find the PUK?' + + + + Why is the PUK required? + LABEL ALL_PLATFORMS + + + + The PUK is required if the card PIN has been entered incorrectly three times in a row. As a result, the card PIN is blocked. + INFO ALL_PLATFORMS Answer to the question 'Why is the PUK required?' + + + + What is the PUK's purpose? + LABEL ALL_PLATFORMS + + + + By entering the PUK, you unblock the card PIN and have another three chances to enter the correct PIN. + INFO ALL_PLATFORMS Answer to the question 'What is the PUK's purpose?' + + + + Why is the CAN required? + LABEL ALL_PLATFORMS + + + + CAN information + LABEL ALL_PLATFORMS + Информация о CAN + + + When is the card access number (CAN) required? + LABEL ALL_PLATFORMS + + + + The card access number (CAN) is required when the card PIN has been entered incorrectly twice. + INFO ALL_PLATFORMS Answer to the question 'When is the card access number (CAN) required?' + + + + Why do I have to enter the CAN before a third attempt? + LABEL ALL_PLATFORMS + + + + A third incorrect entry blocks your PIN and you can no longer use the eID function until it is unblocked. Requesting the CAN ensures that a third incorrect entry can only be made with direct access to your ID card. + INFO ALL_PLATFORMS Answer to the question 'Why do I have to enter the CAN before a third attempt?' + + + + Where can I find the CAN? + LABEL ALL_PLATFORMS + + + + The CAN is a 6-digit number that can be found on the bottom right of the front of the ID card. + INFO ALL_PLATFORMS Answer to the question 'Where can I find the CAN?' + The Card Access Number (CAN) allows to access the imprinted data of the ID card. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red). - INFO DESKTOP Description text of CAN-allowed authentication ----------- -INFO ANDROID IOS Description text of CAN-allowed authentication + INFO ALL_PLATFORMS Description text of CAN-allowed authentication Код доступа (CAN) предоставляет доступ к сохраненным на идентификационной карте данным. CAN — это 6-значный номер, указанный на идентификационной карте спереди. Он расположен внизу справа рядом со сроком действия (выделен красным цветом). - The Card Access Number (CAN) is required if the ID card PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red). - INFO DESKTOP Description text of CAN if required for third ID card PIN attempt + Smart-eID blocking code + LABEL ANDROID IOS ---------- -INFO ANDROID IOS Description text of CAN if required for third ID card PIN attempt - Код доступа (CAN) требуется, если PIN-код идентификационной карты дважды введен неправильно. Чтобы предотвратить третью попытку неправильного ввода и блокировку PIN-кода без вашего согласия, дополнительно запрашивается CAN. CAN — это 6-значный номер, указанный на идентификационной карте спереди. Он расположен внизу справа рядом со сроком действия (выделен красным цветом). +LABEL ALL_PLATFORMS + Код блокировки Smart-eID - The PUK is required if the ID card PIN has been entered incorrectly three times. At this point the ID card PIN is blocked. The PUK (marked in red) is a ten-digit number you received with the letter sent to you by your competent authority. Please note that you can only use the PUK to unblock the PIN entry. - INFO DESKTOP Description text of PUK ----------- -INFO ANDROID IOS Description text of PUK - PUK-код запрашивается, если PIN-код идентификационной карты трижды введен неправильно. После этого PIN-код идентификационной карты блокируется. PUK-код (выделен красным цветом) — это 10-значный номер, который указан в письме из ответственного учреждения, направленном вам после заказа карты. Внимание: использовать PUK-код можно только для разблокировки PIN-кода. + Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device. + INFO ANDROID IOS Description text of Smart-eID PIN + - You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network.<br><br>To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone. - INFO DESKTOP Description text of SaC pairing ----------- -INFO ANDROID IOS Description text of SaC pairing - Вы можете использовать смартфон в качестве устройства чтения карт с помощью AusweisApp2. Смартфон должен иметь поддерживающий NFC чипсет, а оба устройства — смартфон и компьютер — должны быть подключены к одной сети Wi-Fi.<br><br>Чтобы использовать смартфон в качестве устройства чтения карт, в AusweisApp2 на смартфоне должна быть постоянно активирована удаленная служба. Для первичного соединения необходимо запустить режим сопряжения на смартфоне, выбрать устройство из списка доступных устройств на компьютере и ввести код сопряжения, отображающийся на смартфоне. + To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation. + INFO ANDROID IOS Description text of Smart-eID PIN + - In order to use the online identification function you need an ID card PIN. It has six digits and is chosen by you.<br><br>If you have not yet set a six-digit ID card PIN, e.g. when picking up your ID card, use the five-digit Transport PIN for initially setting the ID card PIN. The Transport PIN is contained in the PIN letter (see figure) you received after applying for your ID card. Note that the Transport PIN is void after setting a six-digit ID card PIN.<br><br>If you already have a six-digit PIN only that is valid. This is also the case if you reinstalled the %1, the ID card PIN is stored on your ID card. - INFO DESKTOP Description text of Transport PIN ----------- -INFO ANDROID IOS Description text of Transport PIN - Чтобы использовать функцию онлайн-идентификации, требуется PIN-код идентификационной карты. Он состоит из шести знаков и устанавливается вами.<br><br>Если вы еще не установили 6-значный PIN-код идентификационной карты, например при получении карты, используйте для первичной настройки PIN-кода идентификационной карты 5-значный временный PIN-код. Временный PIN-код указан в письме с PIN-кодом (см. рис.), которое вы получили после заказа идентификационной карты. Внимание: временный PIN-код теряет силу после установки 6-значного PIN-кода идентификационной карты.<br><br>Если у вас уже есть 6-значный PIN-код, то действителен только он. Это также касается переустановки %1. PIN-код идентификационной карты сохранен на вашей идентификационной карте. + No PIN known + LABEL ALL_PLATFORMS + PIN-код неизвестен - The PIN is a six-digit number you set yourself and is required for every use of the online identification function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither "123456" nor your birth date, or any other numbers printed on the ID card. - INFO DESKTOP Description text of PIN ----------- -INFO ANDROID IOS Description text of PIN - PIN-код — это 6-значный номер, который вы устанавливаете самостоятельно и который требуется при каждом использовании функции онлайн-идентификации. Вы можете менять его в любое время неограниченное количество раз, если вам известен действующий PIN-код. Не выбирайте для 6-значного PIN-кода комбинации, которые легко отгадать (например, 123456, дату вашего рождения или любые другие цифры с идентификационной карты). + You do not know your PIN? + LABEL ALL_PLATFORMS + - Smart-eID blocking code - LABEL ANDROID IOS - Код блокировки Smart-eID + You have not yet set a 6-digit card PIN and cannot find the PIN letter with the Transport PIN? + INFO ALL_PLATFORMS + - Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device.<br><br>To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation. - INFO ANDROID IOS Description text of Transport PIN - Сохраненную на смартфоне электронную идентификационную карту Smart-eID можно заблокировать, как и физическую идентификационную карту. Это может потребоваться при потере устройства.<br><br>Для блокировки активной электронной идентификационной карты Smart-eID требуется код блокировки. Код блокировки отображается на дисплее после успешного создания электронной идентификационной карты Smart-eID. Кроме того, он указан в письме, которое вы получите после создания. + You set a card PIN when picking up your ID card or later by yourself, but you can no longer remember it? + INFO ALL_PLATFORMS + - Select <b>"Six-digit PIN"</b> to change the self-chosen PIN of your ID card.<br><br>Select <b>"Five-digit Transport PIN"</b> if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.<br><br>Select <b>"PIN unknown"</b> if your PIN letter is not at hand or you cannot recall your PIN. - INFO DESKTOP Description text of change PIN selection options ----------- -INFO ANDROID IOS + Learn more about the two types of PIN + LABEL ALL_PLATFORMS + + + + Types of PIN + LABEL ALL_PLATFORMS + + + + Your ID card comes with a 5-digit 'Transport PIN' which you need to replace with a 6-digit PIN that you choose yourself. + INFO ALL_PLATFORMS Description text explaining the PINs 1/6 + + + + 5-digit Transport PIN + LABEL ALL_PLATFORMS + + + + The 5-digit Transport PIN was sent to you by post after you applied for your ID card. + INFO ALL_PLATFORMS Description text explaining the PINs 2/6 + + + + The PIN can only be used once. When you set up the eID function, you will replace this 5-digit PIN with a 6-digit PIN that you choose yourself. + INFO ALL_PLATFORMS Description text explaining the PINs 3/6 + + + + 6-digit PIN + LABEL ALL_PLATFORMS + + + + This is a number that you choose yourself when you set up the eID function for the first time. It replaces your 5-digit Transport PIN. + INFO ALL_PLATFORMS Description text explaining the PINs 4/6 + + + + This PIN allows you to prove online that the ID card belongs to you. No one can use your ID card online without this PIN. + INFO ALL_PLATFORMS Description text explaining the PINs 5/6 + + + + You can change your 6-digit PIN at any time in AusweisApp2. + INFO ALL_PLATFORMS Description text explaining the PINs 6/6 + + + + You can use the PIN Reset Service to request a new card PIN free of charge. + LABEL ALL_PLATFORMS + + + + If you do not know either your Transport PIN or your card PIN, you can request a new PIN free of charge using the PIN Reset Service. + LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN, are not known. + + + + If you have forgotten your card PIN, you can request a new PIN free of charge using the PIN Reset Service. + LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. @@ -2981,34 +3182,6 @@ INFO ANDROID IOS Внимание: с помощью вашей идентификационной карты вы можете создать всего <b><u>одну</u></b> электронную идентификационную карту Smart-eID. Дополнительные попытки доступны (%1). - - PinUnknownView - - No PIN known - LABEL ANDROID IOS - PIN-код неизвестен - - - ID card - LABEL ANDROID IOS - Идентификационная карта - - - Smart-eID - LABEL ANDROID IOS - Smart-eID - - - If you have forgotten your Smart-eID PIN, you can easily set up Smart-eID again. This requires knowledge of your ID card PIN. - LABEL ANDROID IOS A user wants to change but does not know their Smart-eID PIN. - Если вы забыли PIN-код вашей электронной идентификационной карты Smart-eID, вы можете создать Smart-eID заново. Для этого требуется PIN-код вашей идентификационной карты. - - - Setup Smart-eID - LABEL ANDROID IOS - Создание Smart-eID - - PkiSwitch @@ -3281,22 +3454,27 @@ INFO ANDROID_TABLET IOS_TABLET No authentication history, placeholder text.ProviderOverview All provider + LABEL DESKTOP Все провайдеры Citizen services + LABEL DESKTOP Услуги для граждан Financials + LABEL DESKTOP Финансы Insurances + LABEL DESKTOP Страхование Other services + LABEL DESKTOP Другие услуги @@ -3693,8 +3871,9 @@ If you have not already paired a device, start the pairing now to set up this sm Подробная информация - Error code: %1 - Код ошибки: %1 + Error code: + LABEL ANDROID IOS + Код ошибки: @@ -4220,7 +4399,7 @@ LABEL ALL_PLATFORMS Запустить %1 автоматически после запуска? - In order to successfully use the online identification function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup. + In order to successfully use the eID function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup. INFO DESKTOP Information text why autostart of the App is advisable Для успешного использования функции идентификации необходимо запустить %1. Рекомендуется разрешить автозапуск при запуске системы. @@ -4512,6 +4691,7 @@ LABEL ALL_PLATFORMS Resetting Smart-eID + LABEL ANDROID IOS Сброс Smart-eID @@ -4759,11 +4939,6 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL ANDROID IOS Вы знаете 6-значный PIN-код идентификационной карты? - - Online identification with Transport PIN is not possible. The personal, six-digit ID card PIN is mandatory to use the online identification function. - LABEL ANDROID IOS - Онлайн-идентификация с помощью временного PIN-кода невозможна. Для использования функции онлайн-идентификации требуется личный 6-значный PIN-код идентификационной карты. - No LABEL ANDROID IOS @@ -4774,6 +4949,11 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL ANDROID IOS Да + + Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function. + LABEL ANDROID IOS + + TutorialFooter @@ -4995,6 +5175,11 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL ANDROID IOS Вы всегда можете вызвать это руководство в разделе «Справка» в строке меню. + + If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service. + LABEL ANDROID IOS + Если вы не можете вспомнить 6-значный PIN-код или найти письмо с PIN-кодом, запросите новый PIN-код через службу сброса PIN-кода. + TutorialReaderMethodFooter @@ -5983,6 +6168,14 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& Ошибка при сохранении конфигурации в указанном месте: «%1» + + governikus::AuthModel + + Reason: + INFO ALL_PLATFORMS Failure code (string) of current workflow error. + + + governikus::CardInfo @@ -6385,7 +6578,7 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& No driver installed - LABEL ALL_PLATFORMS + LABEL DESKTOP Драйверы не установлены @@ -6398,6 +6591,16 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL DESKTOP Антивирус и брандмауэр + + Service addresses + LABEL DESKTOP + + + + Not bound + LABEL DESKTOP + + governikus::ECardApiResult @@ -6502,7 +6705,7 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& Сбой при одной или нескольких проверках сертификата. Процесс будет прерван в целях безопасности. - This action cannot be performed. The online identification function of your ID card is not activated. + This action cannot be performed. The eID function of your ID card is not activated. LABEL ALL_PLATFORMS Невозможно выполнить данное действие. Функция онлайн-идентификации вашей идентификационной карты не активирована. @@ -6641,7 +6844,7 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& The device does not support Smart-eID. - ERROR ALL_PLATFORMS The device does not support the Smart-eID functionality + ERROR ALL_PLATFORMS The device does not support the Smart-eID function Устройство не поддерживает Smart-eID. @@ -6755,8 +6958,8 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& Карта не существует - The online identification function of your ID card is not yet activated. - ERROR ALL_PLATFORMS The eID functionality of the ID card is not active. + The eID function of your ID card is not yet activated. + ERROR ALL_PLATFORMS The eID function of the ID card is not active. Функция онлайн-идентификации вашей идентификационной карты еще не активирована. @@ -7159,89 +7362,29 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& https://www.personalausweisportal.de/EN - You cannot find your PIN letter? You have set a ID card PIN when picking up the ID card or later that you cannot recall now? - LABEL ALL_PLATFORMS Explanation if the (Transport) PIN is unknown to the user on the Change PIN startpage. - Не можете найти письмо с PIN-кодом? Вы установили PIN-код при получении идентификационной карты или позднее и теперь не можете его вспомнить? - - - By using the PIN Reset Service you may request a new ID card PIN. - LABEL ALL_PLATFORMS Text in Hint to PRS if the (Transport) PIN is unknown to the user on the Change PIN startpage - С помощью службы сброса PIN-кода вы можете запросить новый PIN-код идентификационной карты. - - - If this is the case please turn to the competent authority and set a new ID card PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Text in Hint when PRS is not available and the (Transport) PIN is unknown to the user on the Change PIN startpage - Для этого обратитесь в ответственное учреждение и установите там новый PIN-код идентификационной карты.<br/><br/>Подробную информацию см. на портале идентификационных карт. - - - If you have forgotten your ID card PIN or do not have access to the PUK, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - Если вы забыли PIN-код идентификационной карты или у вас нет доступа к PUK-коду, вы можете запросить новый PIN-код здесь. - - - If you have forgotten your ID card PIN or do not have access to the PUK, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. + You cannot use the PUK to reset your previously set card PIN. If you forgot your card PIN, you can use the PIN Reset Service to request a new PIN. LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - Если вы забыли PIN-код идентификационной карты или у вас нет доступа к PUK-коду, то вы можете обратиться в ответственное учреждение и установить новый PIN-код.<br/><br/>Подробную информацию см. на портале идентификационных карт. - - - If you know neither your Transport PIN nor your ID card PIN, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - Если вы не знаете временный PIN-код и PIN-код идентификационной карты, то вы можете запросить новый PIN-код здесь. - - - If you know neither your Transport PIN nor your ID card PIN, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - Если вы не знаете временный PIN-код и PIN-код идентификационной карты, то вы можете обратиться в ответственное учреждение и установить новый PIN-код.<br/><br/>Подробную информацию см. на портале идентификационных карт. - - - If you cannot recall your ID card PIN, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - Если вы не можете вспомнить PIN-код идентификационной карты, запросите новый PIN-код здесь. - - - If you cannot recall your ID card PIN, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - Если вы не можете вспомнить PIN-код идентификационной карты, обратитесь в ответственное учреждение для создания нового PIN-кода.<br/><br/>Подробную информацию см. на портале идентификационных карт. - - - If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service. - LABEL ANDROID IOS - Если вы не можете вспомнить 6-значный PIN-код или найти письмо с PIN-кодом, запросите новый PIN-код через службу сброса PIN-кода. - - - You can always set a new ID card PIN at the competent authority if the (Transport) PIN is not known.<br/><br/>For further information, please visit the ID card portal. - LABEL ANDROID IOS - Вы всегда можете установить новый PIN-код идентификационной карты в ответственном учреждении, если не знаете (временный) PIN-код.<br/><br/>Дополнительную информацию см. на портале идентификационных карт. - - - You may request a new ID card PIN here. - LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - Вы можете запросить новый PIN-код идентификационной карты здесь. - - - You may turn to the competent authority and set a new ID card PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - Вы можете обратиться в ответственное учреждение и установить там новый PIN-код идентификационной карты.<br/><br/>Подробную информацию см. на портале идентификационных карт. + - You can request activation of the online identification function here. - LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - Вы можете запросить активацию функции онлайн-идентификации здесь. + Go to PIN Reset Service + LABEL ALL_PLATFORMS + - Please contact the competent authority to activate the online identification function.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - Чтобы активировать функцию онлайн-идентификации, обратитесь в ответственное учреждение.<br/><br/>Дополнительную информацию см. на портале идентификационных карт. + You can request activation of the eID function without charge. + LABEL ALL_PLATFORMS Hint when a workflow failed because the eID function was not activated + - To provider + Go to Activation Service LABEL ALL_PLATFORMS - К провайдеру + - Open website - LABEL ALL_PLATFORMS - Открыть сайт + Request a new card PIN free of charge to be able to use the eID function again. + LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK + @@ -7876,6 +8019,10 @@ Please enable NFC to use your smartphone as a card reader (SaC). AusweisApp2 error report - %1 Отчет об ошибках AusweisApp2 — %1 + + Contact your local citizens' office (Bürgeramt) to apply for a new ID card or to unblock the ID card. + + main diff --git a/resources/translations/ausweisapp2_uk.ts b/resources/translations/ausweisapp2_uk.ts index 234709354..c0d35f06d 100644 --- a/resources/translations/ausweisapp2_uk.ts +++ b/resources/translations/ausweisapp2_uk.ts @@ -5,7 +5,7 @@ DvcsAttributes revision - 7488db7b6a84 + 52a5aa47f692 @@ -66,14 +66,6 @@ LABEL ANDROID IOS Ідентифікувати - - Do you know your six-digit PIN? - Ви знаєте свій шестизначний PIN-код? - - - The personal, six-digit PIN is mandatory to use the online identification function. - Особистий шестизначний PIN-код є обов’язковим для використання функції онлайн-ідентифікації. - No network connectivity INFO DESKTOP Header of the message that no network connection is present during the authentication procedure. @@ -171,6 +163,21 @@ INFO ANDROID IOS Second line text if a basic card reader is used and background LABEL ANDROID IOS Надіслати журнал + + Authenticate with provider + LABEL DESKTOP A11y button to confirm the PIN and start the provider authentication +---------- +LABEL ANDROID IOS A11y button to confirm the PIN and start the provider authentication + + + + Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function. + + + + Do you know your six-digit ID card PIN? + Ви знаєте шестизначний PIN-код своєї ID-картки? + BaseConfirmationPopup @@ -400,31 +407,6 @@ LABEL DESKTOP Processing screen label while the card communication is running af LABEL ANDROID IOS Змінити PIN-код - - What kind of PIN do you have? - LABEL DESKTOP Title of PIN change start page. User is asked which type of PIN they have. - Якого типу ваш PIN-код? - - - Please make a choice to set or change your PIN. - LABEL DESKTOP Description of PIN change start page. User has a choice of which PIN to set. - Зробіть вибір, щоб установити або змінити свій PIN-код. - - - PIN unknown - LABEL DESKTOP - PIN-код невідомий - - - Five-digit Transport PIN - LABEL DESKTOP - П’ятизначний транспортний PIN-код - - - Six-digit PIN - LABEL DESKTOP - Шестизначний PIN-код - Setting new PIN LABEL DESKTOP Processing screen label while the card communication is running after the new PIN has been entered during PIN change process. @@ -519,28 +501,38 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin ChangePinViewContent What kind of PIN do you have? - LABEL ANDROID IOS + LABEL ALL_PLATFORMS Якого типу ваш PIN-код? - Please make a choice to set or change your PIN. - LABEL ANDROID IOS - Зробіть вибір, щоб установити або змінити свій PIN-код. + 6-digit PIN + LABEL ALL_PLATFORMS + - Six-digit PIN - LABEL ANDROID_TABLET IOS_TABLET - Шестизначний PIN-код + Set by yourself + LABEL ALL_PLATFORMS + - Five-digit Transport PIN - LABEL ANDROID_TABLET IOS_TABLET - П’ятизначний транспортний PIN-код + 5-digit Transport PIN + LABEL ALL_PLATFORMS + - PIN unknown - LABEL ANDROID_TABLET IOS_TABLET - PIN-код невідомий + Received by mail in PIN letter + LABEL ALL_PLATFORMS + + + + No PIN + LABEL ALL_PLATFORMS + + + + Lost, forgotten, or never received it + LABEL ALL_PLATFORMS + @@ -671,7 +663,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Немає NFC - Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the online identification function.<br><br>You can find smartphones compatible with the %1 on our website. + Your mobile device has no NFC interface. This is required to read the ID card. However, you can use a separate smartphone as card reader to utilize the eID function.<br><br>You can find smartphones compatible with the %1 on our website. LABEL ANDROID IOS Ваш мобільний пристрій не має інтерфейсу NFC. Він потрібен для читання ID-картки. Однак ви можете використовувати окремий смартфон як пристрій читання карток, щоб застосовувати функцію онлайн-ідентифікації.<br><br>Ви можете знайти смартфони, сумісні з %1, на нашому сайті. @@ -759,7 +751,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Перевірити пристрій та ID-картку - To use the online identification function, your device must meet certain technical requirements. Furthermore, the online identification function must be activated. + To use the eID function, your device must meet certain technical requirements. Furthermore, the eID function must be activated. LABEL ANDROID IOS Для використання функції онлайн-ідентифікації ваш пристрій має відповідати певним технічним вимогам. Крім того, має бути активовано функцію онлайн-ідентифікації. @@ -882,7 +874,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Smart-eID не підтримується - Your mobile device does not meet the technical requirements for Smart-eID.<br><br>You may check if your device and ID card are suitable to use the eID functionality. + Your mobile device does not meet the technical requirements for Smart-eID.<br><br>You may check if your device and ID card are suitable to use the eID function. LABEL ANDROID IOS Ваш мобільний пристрій не відповідає технічним вимогам щодо Smart-eID.<br><br>Ви можете перевірити, чи підходять ваш пристрій та ID-картка для використання функції eID. @@ -965,7 +957,7 @@ INFO ANDROID IOS The ID card has just been unblocked and the user can now contin Перевірте Smart-eID - Your device needs to meet the technical requirements to use the Smart-eID functionality. + Your device needs to meet the technical requirements to use the Smart-eID function. LABEL ANDROID IOS Для використання функції Smart-eID ваш пристрій має відповідати технічним вимогам. @@ -1488,9 +1480,7 @@ INFO ANDROID IOS The new ID card PIN needs to be confirmed. Do you have a five-digit Transport PIN? - LABEL DESKTOP Button to switch to start a change of the Transport PIN. ----------- -LABEL ANDROID IOS Button to start a change of the Transport PIN. + LABEL ANDROID IOS Button to start a change of the Transport PIN. Чи є у вас п’ятизначний транспортний PIN-код? @@ -1566,6 +1556,62 @@ INFO ANDROID IOS The AA2 expects a Smart-eID PIN with six digits in an authentic LABEL ANDROID IOS Button to switch to a six-digit ID card PIN. У вас є шестизначний PIN-код ID-картки? + + Send CAN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send PUK + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send pairing code + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send new ID card PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send Transport PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send Smart-eID PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send new Smart-eID PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + + + Send ID card PIN + LABEL DESKTOP +---------- +LABEL ANDROID IOS + + GProgressBar @@ -1709,7 +1755,7 @@ INFO ANDROID IOS The AA2 expects a Smart-eID PIN with six digits in an authentic More information - INFO DESKTOP Link text + LABEL DESKTOP Додаткова інформація @@ -2566,7 +2612,7 @@ LABEL ANDROID IOS На жаль, ця функція недоступна на вашому пристрої. - However, you can use a separate smartphone as card reader to utilize the online identification function. + However, you can use a separate smartphone as card reader to utilize the eID function. INFO ANDROID IOS AA2 can't use NFC on this device, suggest to use SaK instead. Однак ви можете використовувати окремий смартфон як пристрій читання карток, щоб застосовувати функцію онлайн-ідентифікації. @@ -2611,7 +2657,7 @@ LABEL ANDROID IOS Установити з’єднання - Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the online identification function. + Your device does not meet the technical requirements (Extended Length not supported). However you can use a separate smartphone as card reader to utilize the eID function. INFO ANDROID IOS The NFC interface does not meet the minimum requirements, using a different smartphone is suggested. Ваш пристрій не відповідає технічним вимогам (Extended Length не підтримується). Однак ви можете використовувати окремий смартфон як пристрій читання карток, щоб застосовувати функцію онлайн-ідентифікації. @@ -2628,11 +2674,6 @@ LABEL ANDROID IOS NumberField - - The password is visible. - LABEL DESKTOP Screenreader text for the password field - Пароль показано. - The password is hidden. LABEL DESKTOP Screenreader text for the password field @@ -2653,6 +2694,11 @@ LABEL ANDROID IOS LABEL DESKTOP Screenreader text for the eye icon to change the password visibility Натисніть, щоб показати пароль + + The password is visible. Digits entered so far: %1 + LABEL DESKTOP Screenreader text for the password field + + NumberPad @@ -2674,7 +2720,8 @@ LABEL ANDROID IOS - Submit, disabled until input is complete. + , disabled until input is complete. + LABEL ANDROID IOS A11y text, appended onto the "submit" button text when the button is disabled. @@ -2686,126 +2733,280 @@ LABEL ANDROID IOS - PasswordInfoImage - - ID card PIN/PUK on different pages - LABEL - PIN-код/PUK-код ID-картки на різних сторінках - + PasswordInfoContent - ID card PIN/PUK on the same page - LABEL - PIN-код/PUK-код ID-картки на одній сторінці + More information + LABEL ALL_PLATFORMS + Додаткова інформація - PasswordInfoView + PasswordInfoData - Change PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Змінити інформацію про PIN-код + What is the card PIN? + LABEL ALL_PLATFORMS + - CAN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Інформація про CAN-код + PIN information + LABEL ALL_PLATFORMS + Інформація про PIN-код - PUK information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Інформація про PUK-код + The card PIN is a 6-digit PIN that you set yourself. You always need this PIN if you want to use the eID function. + INFO ALL_PLATFORMS Answer to the question 'what is the card pin?' + - Smartphone as card reader information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Інформація про смартфон як пристрій читання карток + Where can I find the card PIN? + LABEL ALL_PLATFORMS + + + + You set the card PIN either directly when you picked up your ID card at the citizens' office (Bürgeramt) or later in AusweisApp2 using the 5-digit Transport PIN. Only when you have set a 6-digit PIN of your own choice can you use the eID function. + INFO ALL_PLATFORMS Answer to the question 'Where can I find the card PIN?' + + + + How do I choose a secure PIN? + LABEL ALL_PLATFORMS + + + + For your 6-digit PIN, choose a combination of numbers that cannot be guessed - i.e. neither "123456", nor your date of birth, nor any other numbers printed on your ID card. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 1/3 + + + + You can change your 6-digit PIN at any time and an unlimited number of times as long as you know your valid PIN. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 2/3 + + + + Keep your PIN secret and change it if another person becomes aware of it. + INFO ALL_PLATFORMS Answer to the question 'How do I choose a secure PIN?' paragraph 3/3 + + + + What is the Transport PIN? + LABEL ALL_PLATFORMS + Transport PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS + LABEL ALL_PLATFORMS Інформація про транспортний PIN-код - PIN information - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Інформація про PIN-код + The 5-digit Transport PIN was sent to you in the PIN letter by mail after you applied for your ID card. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 1/3 + - Select <b>"Six-digit PIN"</b> to change the self-chosen PIN of your ID card or the Smart-eID.<br><br>Select <b>"Five-digit Transport PIN"</b> if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.<br><br>Select <b>"PIN unknown"</b> if your PIN letter is not at hand or you cannot recall your PIN. - INFO DESKTOP Description text of change PIN selection options ----------- -INFO ANDROID IOS - Виберіть <b>«Шестизначний PIN-код»</b>, щоб змінити самостійно вибраний PIN-код своєї ID-картки або Smart-eID.<br><br>Виберіть <b>«П’ятизначний транспортний PIN-код»</b>, якщо лист із PIN-кодом є під рукою (див. рисунок), і якщо ви ще не вибрали шестизначний PIN-код ID-картки.<br><br>Виберіть <b>«PIN невідомий»</b>, якщо листа з PIN-кодом немає під рукою або ви не пам’ятаєте свій PIN-код. + If you did not set a self-selected 6-digit card PIN when you picked up your ID card, you can do so using the Transport PIN. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 2/3 + + + + Once you have set a card PIN, the Transport PIN loses its validity. + INFO ALL_PLATFORMS Answer to the question 'What is the Transport PIN?' paragraph 3/3 + + + + Smartphone as card reader information + LABEL ALL_PLATFORMS + Інформація про смартфон як пристрій читання карток + + + You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network. + INFO ALL_PLATFORMS Description text of SaC pairing + + + + To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone. + INFO ALL_PLATFORMS Description text of SaC pairing + + + + Where do I find the PUK? + LABEL ALL_PLATFORMS + + + + PUK information + LABEL ALL_PLATFORMS + Інформація про PUK-код + + + The PUK is a 10-digit number that you can find in the PIN letter that was sent to you by mail after you applied for your ID card. + INFO ALL_PLATFORMS Answer to the question 'Where do I find the PUK?' + + + + Why is the PUK required? + LABEL ALL_PLATFORMS + + + + The PUK is required if the card PIN has been entered incorrectly three times in a row. As a result, the card PIN is blocked. + INFO ALL_PLATFORMS Answer to the question 'Why is the PUK required?' + + + + What is the PUK's purpose? + LABEL ALL_PLATFORMS + + + + By entering the PUK, you unblock the card PIN and have another three chances to enter the correct PIN. + INFO ALL_PLATFORMS Answer to the question 'What is the PUK's purpose?' + + + + Why is the CAN required? + LABEL ALL_PLATFORMS + + + + CAN information + LABEL ALL_PLATFORMS + Інформація про CAN-код + + + When is the card access number (CAN) required? + LABEL ALL_PLATFORMS + + + + The card access number (CAN) is required when the card PIN has been entered incorrectly twice. + INFO ALL_PLATFORMS Answer to the question 'When is the card access number (CAN) required?' + + + + Why do I have to enter the CAN before a third attempt? + LABEL ALL_PLATFORMS + + + + A third incorrect entry blocks your PIN and you can no longer use the eID function until it is unblocked. Requesting the CAN ensures that a third incorrect entry can only be made with direct access to your ID card. + INFO ALL_PLATFORMS Answer to the question 'Why do I have to enter the CAN before a third attempt?' + + + + Where can I find the CAN? + LABEL ALL_PLATFORMS + + + + The CAN is a 6-digit number that can be found on the bottom right of the front of the ID card. + INFO ALL_PLATFORMS Answer to the question 'Where can I find the CAN?' + The Card Access Number (CAN) allows to access the imprinted data of the ID card. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red). - INFO DESKTOP Description text of CAN-allowed authentication ----------- -INFO ANDROID IOS Description text of CAN-allowed authentication + INFO ALL_PLATFORMS Description text of CAN-allowed authentication Номер доступу до картки (CAN) дає змогу отримати доступ до вихідних даних ID-картки. CAN – це шестизначний номер, який можна знайти на лицьовій стороні ID-картки. Він розташований унизу праворуч від терміну дії (позначено червоним). - The Card Access Number (CAN) is required if the ID card PIN has already been entered incorrectly twice. In order to prevent a third incorrect entry and thus the blocking of the PIN without your consent, the CAN is also requested at this point. The CAN is a six-digit number that can be found on the front of the ID card. It is located at the bottom right next to the validity date (marked in red). - INFO DESKTOP Description text of CAN if required for third ID card PIN attempt + Smart-eID blocking code + LABEL ANDROID IOS ---------- -INFO ANDROID IOS Description text of CAN if required for third ID card PIN attempt - Номер доступу до картки (CAN) потрібен, якщо PIN-код ID-картки вже двічі введено неправильно. Щоб запобігти третьому неправильному введенню і, таким чином, блокуванню PIN-коду без вашої згоди, на цьому етапі також запитується CAN. CAN – це шестизначний номер, який можна знайти на лицьовій стороні ID-картки. Він розташований унизу праворуч від терміну дії (позначено червоним). +LABEL ALL_PLATFORMS + Код блокування Smart-eID - The PUK is required if the ID card PIN has been entered incorrectly three times. At this point the ID card PIN is blocked. The PUK (marked in red) is a ten-digit number you received with the letter sent to you by your competent authority. Please note that you can only use the PUK to unblock the PIN entry. - INFO DESKTOP Description text of PUK ----------- -INFO ANDROID IOS Description text of PUK - PUK-код потрібен, якщо PIN-код ID-картки було тричі введено неправильно. На цьому етапі PIN-код ID-картки блокується. PUK-код (позначено червоним) – це десятизначний номер, який ви отримали разом із листом від компетентного органа. Зверніть увагу, що ви можете використовувати PUK-код лише для розблокування введення PIN-коду. + Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device. + INFO ANDROID IOS Description text of Smart-eID PIN + - You may use your smartphone as a card reader with AusweisApp2. The smartphone needs to feature a supported NFC chipset and both devices, your smartphone and this machine, need to be connected to the same WiFi network.<br><br>To use your smartphone as a card reader you'll always need to activate the remote service in the AusweisApp2 on the smartphone. For the first time you'll also need to start the pairing mode on your smartphone, select the device from the list of available devices on this machine and then enter the pairing code shown on the phone. - INFO DESKTOP Description text of SaC pairing ----------- -INFO ANDROID IOS Description text of SaC pairing - Ви можете використовувати свій смартфон як пристрій читання карток у програмі AusweisApp2. Смартфон повинен мати підтримуваний набір мікросхем NFC, й обидва пристрої (ваш смартфон і цей апарат) мають бути підключені до однієї мережі Wi-Fi.<br><br>Щоб використовувати свій смартфон як пристрій читання карток, вам завжди буде потрібно активувати віддалену службу в програмі AusweisApp2 на смартфоні. Уперше вам також потрібно буде запустити режим створення пари на своєму смартфоні, вибрати пристрій зі списку доступних пристроїв на цьому апараті, а потім ввести код створення пари, показаний на телефоні. + To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation. + INFO ANDROID IOS Description text of Smart-eID PIN + - In order to use the online identification function you need an ID card PIN. It has six digits and is chosen by you.<br><br>If you have not yet set a six-digit ID card PIN, e.g. when picking up your ID card, use the five-digit Transport PIN for initially setting the ID card PIN. The Transport PIN is contained in the PIN letter (see figure) you received after applying for your ID card. Note that the Transport PIN is void after setting a six-digit ID card PIN.<br><br>If you already have a six-digit PIN only that is valid. This is also the case if you reinstalled the %1, the ID card PIN is stored on your ID card. - INFO DESKTOP Description text of Transport PIN ----------- -INFO ANDROID IOS Description text of Transport PIN - Для використання функції онлайн-ідентифікації вам потрібен PIN-код ID-картки. Він містить шість цифр і вибирається вами.<br><br>Якщо ви ще не встановили шестизначний PIN-код ID-картки, наприклад під час її отримання, скористайтеся п’ятизначним транспортним PIN-код для початкового встановлення PIN-коду ID-картки. Транспортний PIN-код наведено в листі з PIN-кодом (див. рисунок), який ви отримали після подання заяви на отримання ID-картки. Зверніть увагу, що після встановлення шестизначного PIN-коду ID-картки транспортний PIN-код стає недійсним.<br><br>Якщо у вас уже є шестизначний PIN-код, лише він є дійсним. Це також вірно, якщо ви перевстановили %1; PIN-код ID-картки зберігається на вашій ID-картці. + No PIN known + LABEL ALL_PLATFORMS + PIN-код невідомий - The PIN is a six-digit number you set yourself and is required for every use of the online identification function. You can change it anytime and indefinitely if you know your valid PIN. For your six-digit PIN choose a combination of numbers, that is not easy to guess, neither "123456" nor your birth date, or any other numbers printed on the ID card. - INFO DESKTOP Description text of PIN ----------- -INFO ANDROID IOS Description text of PIN - PIN-код – шестизначний номер, який ви встановлюєте самостійно і який потрібен для кожного використання функції онлайн-ідентифікації. Ви можете змінити його в будь-який час і на невизначений термін, якщо знаєте свій дійсний PIN-код. Для свого шестизначного PIN-коду виберіть комбінацію цифр, яку важко вгадати; не використовуйте ні набір цифр «123456», ні дату народження, ні жодні інші числа, надруковані на ID-картці. + You do not know your PIN? + LABEL ALL_PLATFORMS + - Smart-eID blocking code - LABEL ANDROID IOS - Код блокування Smart-eID + You have not yet set a 6-digit card PIN and cannot find the PIN letter with the Transport PIN? + INFO ALL_PLATFORMS + - Just like the physical ID card, the Smart-eID stored on your Smartphone can be blocked. This might be required if you ever lose your device.<br><br>To revoke an active Smart-eID, a blocking code is required. The blocking code will be displayed after successfully creating the Smart-eID. Furthermore, it is contained in the letter you will receive after creation. - INFO ANDROID IOS Description text of Transport PIN - Так само як і фізичну ID-картку, Smart-eID, збережений на вашому смартфоні, можна заблокувати. Це може знадобитися, якщо ви коли-небудь втратите свій пристрій.<br><br>Щоб анулювати активний Smart-eID, потрібен код блокування. Код блокування відобразиться після успішного створення Smart-eID. Крім того, він міститься в листі, який ви отримаєте після створення. + You set a card PIN when picking up your ID card or later by yourself, but you can no longer remember it? + INFO ALL_PLATFORMS + - Select <b>"Six-digit PIN"</b> to change the self-chosen PIN of your ID card.<br><br>Select <b>"Five-digit Transport PIN"</b> if your PIN letter is at hand (see figure) and you have not yet chosen a six-digit ID card PIN.<br><br>Select <b>"PIN unknown"</b> if your PIN letter is not at hand or you cannot recall your PIN. - INFO DESKTOP Description text of change PIN selection options ----------- -INFO ANDROID IOS + Learn more about the two types of PIN + LABEL ALL_PLATFORMS + + + + Types of PIN + LABEL ALL_PLATFORMS + + + + Your ID card comes with a 5-digit 'Transport PIN' which you need to replace with a 6-digit PIN that you choose yourself. + INFO ALL_PLATFORMS Description text explaining the PINs 1/6 + + + + 5-digit Transport PIN + LABEL ALL_PLATFORMS + + + + The 5-digit Transport PIN was sent to you by post after you applied for your ID card. + INFO ALL_PLATFORMS Description text explaining the PINs 2/6 + + + + The PIN can only be used once. When you set up the eID function, you will replace this 5-digit PIN with a 6-digit PIN that you choose yourself. + INFO ALL_PLATFORMS Description text explaining the PINs 3/6 + + + + 6-digit PIN + LABEL ALL_PLATFORMS + + + + This is a number that you choose yourself when you set up the eID function for the first time. It replaces your 5-digit Transport PIN. + INFO ALL_PLATFORMS Description text explaining the PINs 4/6 + + + + This PIN allows you to prove online that the ID card belongs to you. No one can use your ID card online without this PIN. + INFO ALL_PLATFORMS Description text explaining the PINs 5/6 + + + + You can change your 6-digit PIN at any time in AusweisApp2. + INFO ALL_PLATFORMS Description text explaining the PINs 6/6 + + + + You can use the PIN Reset Service to request a new card PIN free of charge. + LABEL ALL_PLATFORMS + + + + If you do not know either your Transport PIN or your card PIN, you can request a new PIN free of charge using the PIN Reset Service. + LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN, are not known. + + + + If you have forgotten your card PIN, you can request a new PIN free of charge using the PIN Reset Service. + LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. @@ -2981,34 +3182,6 @@ INFO ANDROID IOS Увага: ви можете налаштувати лише <b><u>один</u></b> Smart-eID для своєї ID-картки. Подальші налаштування можна виконати %1. - - PinUnknownView - - No PIN known - LABEL ANDROID IOS - PIN-код невідомий - - - ID card - LABEL ANDROID IOS - ID-картка - - - Smart-eID - LABEL ANDROID IOS - Smart-eID - - - If you have forgotten your Smart-eID PIN, you can easily set up Smart-eID again. This requires knowledge of your ID card PIN. - LABEL ANDROID IOS A user wants to change but does not know their Smart-eID PIN. - Якщо ви забули свій PIN-код Smart-eID, ви можете легко знову налаштувати Smart-eID. Для цього потрібно знати PIN-код вашої ID-картки. - - - Setup Smart-eID - LABEL ANDROID IOS - Налаштування Smart-eID - - PkiSwitch @@ -3281,22 +3454,27 @@ INFO ANDROID_TABLET IOS_TABLET No authentication history, placeholder text.ProviderOverview All provider + LABEL DESKTOP Усі постачальники Citizen services + LABEL DESKTOP Послуги для громадян Financials + LABEL DESKTOP Фінанси Insurances + LABEL DESKTOP Страхування Other services + LABEL DESKTOP Інші послуги @@ -3693,8 +3871,9 @@ If you have not already paired a device, start the pairing now to set up this sm Відомості - Error code: %1 - Код помилки: %1 + Error code: + LABEL ANDROID IOS + Код помилки: @@ -4220,7 +4399,7 @@ LABEL ALL_PLATFORMS Автоматично запускати %1 після завантаження? - In order to successfully use the online identification function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup. + In order to successfully use the eID function, %1 has to be running. It is therefore advisable to activate the auto-start after system startup. INFO DESKTOP Information text why autostart of the App is advisable Для успішного використання функції онлайн-ідентифікації має бути запущено %1. Тому рекомендовано активувати автозапуск після запуску системи. @@ -4512,6 +4691,7 @@ LABEL ALL_PLATFORMS Resetting Smart-eID + LABEL ANDROID IOS Скидання Smart-eID @@ -4759,11 +4939,6 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL ANDROID IOS Ви знаєте шестизначний PIN-код своєї ID-картки? - - Online identification with Transport PIN is not possible. The personal, six-digit ID card PIN is mandatory to use the online identification function. - LABEL ANDROID IOS - Онлайн-ідентифікація за допомогою транспортного PIN-коду неможлива. Особистий шестизначний PIN-код ID-картки є обов’язковим для використання функції онлайн-ідентифікації. - No LABEL ANDROID IOS @@ -4774,6 +4949,11 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL ANDROID IOS Так + + Online identification with Transport PIN is not possible. The self-selected, six-digit ID card PIN is mandatory to use the eID function. + LABEL ANDROID IOS + + TutorialFooter @@ -4995,6 +5175,11 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL ANDROID IOS Ви завжди можете знову отримати доступ до цього посібника з розділу «Довідка» на панелі меню. + + If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service. + LABEL ANDROID IOS + Якщо ви не можете згадати свій шестизначний PIN-код або не можете знайти свій лист із PIN-кодом, ви можете надіслати запит на новий PIN-код за допомогою служби скидання PIN-коду. + TutorialReaderMethodFooter @@ -5983,6 +6168,14 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& Помилка під час збереження конфігурації до «%1» + + governikus::AuthModel + + Reason: + INFO ALL_PLATFORMS Failure code (string) of current workflow error. + + + governikus::CardInfo @@ -6385,7 +6578,7 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& No driver installed - LABEL ALL_PLATFORMS + LABEL DESKTOP Драйвер не встановлено @@ -6398,6 +6591,16 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& LABEL DESKTOP Антивірусна програма і брандмауер + + Service addresses + LABEL DESKTOP + + + + Not bound + LABEL DESKTOP + + governikus::ECardApiResult @@ -6502,7 +6705,7 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& Не вдалося перевірити один або кілька сертифікатів. Операцію буде перервано з міркувань безпеки. - This action cannot be performed. The online identification function of your ID card is not activated. + This action cannot be performed. The eID function of your ID card is not activated. LABEL ALL_PLATFORMS Цю дію виконати неможливо. Функцію онлайн-ідентифікації вашої ID-картки не активовано. @@ -6641,7 +6844,7 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& The device does not support Smart-eID. - ERROR ALL_PLATFORMS The device does not support the Smart-eID functionality + ERROR ALL_PLATFORMS The device does not support the Smart-eID function Пристрій не підтримує Smart-eID. @@ -6755,8 +6958,8 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& Картка не існує - The online identification function of your ID card is not yet activated. - ERROR ALL_PLATFORMS The eID functionality of the ID card is not active. + The eID function of your ID card is not yet activated. + ERROR ALL_PLATFORMS The eID function of the ID card is not active. Функцію онлайн-ідентифікації вашої ID-картки ще не активовано. @@ -7159,89 +7362,29 @@ To proceed use your ID card by selecting the NFC interface or choose "WiFi& https://www.personalausweisportal.de/EN - You cannot find your PIN letter? You have set a ID card PIN when picking up the ID card or later that you cannot recall now? - LABEL ALL_PLATFORMS Explanation if the (Transport) PIN is unknown to the user on the Change PIN startpage. - Не можете знайти свій PIN-код? Не можете згадати PIN-код, який отримали під час отримання ID-картки або пізніше? - - - By using the PIN Reset Service you may request a new ID card PIN. - LABEL ALL_PLATFORMS Text in Hint to PRS if the (Transport) PIN is unknown to the user on the Change PIN startpage - За допомогою служби скидання PIN-коду ви можете надіслати запит на новий PIN-код ID-картки. - - - If this is the case please turn to the competent authority and set a new ID card PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Text in Hint when PRS is not available and the (Transport) PIN is unknown to the user on the Change PIN startpage - У такому разі зверніться до компетентного органа й установіть там новий PIN-код ID-картки.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. - - - If you have forgotten your ID card PIN or do not have access to the PUK, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - Якщо ви забули PIN-код своєї ID-картки або не маєте доступу до PUK-коду, ви можете надіслати запит на новий PIN-код тут. - - - If you have forgotten your ID card PIN or do not have access to the PUK, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. + You cannot use the PUK to reset your previously set card PIN. If you forgot your card PIN, you can use the PIN Reset Service to request a new PIN. LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - Якщо ви забули PIN-код своєї ID-картки або не маєте доступу до PUK-коду, ви можете звернутися до компетентного органа й установити там новий PIN-код.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. - - - If you know neither your Transport PIN nor your ID card PIN, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - Якщо ви не знаєте ні транспортного PIN-коду, ні PIN-коду своєї ID-картки, ви можете надіслати запит на новий PIN-код тут. - - - If you know neither your Transport PIN nor your ID card PIN, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - Якщо ви не знаєте ні транспортного PIN-коду, ні PIN-коду своєї ID-картки, ви можете звернутися до компетентного органа й установити там новий PIN-код.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. - - - If you cannot recall your ID card PIN, you may request a new PIN here. - LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - Якщо ви не можете згадати PIN-код своєї ID-картки, ви можете надіслати запит на новий PIN-код тут. - - - If you cannot recall your ID card PIN, you may turn to the competent authority and set a new PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - Якщо ви не можете згадати PIN-код своєї ID-картки, ви можете звернутися до компетентного органа й установити там новий PIN-код.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. - - - If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service. - LABEL ANDROID IOS - Якщо ви не можете згадати свій шестизначний PIN-код або не можете знайти свій лист із PIN-кодом, ви можете надіслати запит на новий PIN-код за допомогою служби скидання PIN-коду. - - - You can always set a new ID card PIN at the competent authority if the (Transport) PIN is not known.<br/><br/>For further information, please visit the ID card portal. - LABEL ANDROID IOS - Ви завжди можете встановити новий PIN-код ID-картки в компетентному органі, якщо (транспортний) PIN-код невідомий.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. - - - You may request a new ID card PIN here. - LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - Ви можете надіслати запит на новий PIN-код ID-картки тут. - - - You may turn to the competent authority and set a new ID card PIN there.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - Ви можете звернутися до компетентного органа й установити там новий PIN-код ID-картки.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. + - You can request activation of the online identification function here. - LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - Замовити активацію функції онлайн-ідентифікації можна тут. + Go to PIN Reset Service + LABEL ALL_PLATFORMS + - Please contact the competent authority to activate the online identification function.<br/><br/>For further information, please visit the ID card portal. - LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - Зверніться до компетентного органа, щоб активувати функцію онлайн-ідентифікації.<br/><br/>Для отримання додаткової інформації відвідайте портал ID-карток. + You can request activation of the eID function without charge. + LABEL ALL_PLATFORMS Hint when a workflow failed because the eID function was not activated + - To provider + Go to Activation Service LABEL ALL_PLATFORMS - До постачальника + - Open website - LABEL ALL_PLATFORMS - Відкрити сайт + Request a new card PIN free of charge to be able to use the eID function again. + LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK + @@ -7876,6 +8019,10 @@ Please enable NFC to use your smartphone as a card reader (SaC). AusweisApp2 error report - %1 Звіт про помилку програми AusweisApp2 – %1 + + Contact your local citizens' office (Bürgeramt) to apply for a new ID card or to unblock the ID card. + + main diff --git a/resources/updatable-files/reader/img_ACS_ACR122U.png b/resources/updatable-files/reader/img_ACS_ACR122U.png deleted file mode 100644 index 1db843b443b6979deeb3dd9e68dbd0ee0a0a4df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63534 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 diff --git a/resources/updatable-files/reader/img_ACS_ACR122U_mit_ausweis.png b/resources/updatable-files/reader/img_ACS_ACR122U_mit_ausweis.png deleted file mode 100644 index b76259ff3f9bcd4f229fec805c710e6902798690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80982 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 diff --git a/resources/updatable-files/reader/img_ACS_ACR1252U.png b/resources/updatable-files/reader/img_ACS_ACR1252U.png deleted file mode 100644 index d16198c3f1a70efd7ad0f7e2eaf3edd67aa17ba4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105502 zcmb5U1#BG6^CrArGc(4pW@ct)W@ct)W{P8`m?36nhS)JPJLWiMX134o5B_(bbUNvq zozYbHJXQ5nca^l$J<&=El8A74Z~y=RQCdn&1pokkia-Di_~&h)glq%=03Wwj({j_2 zm*X*Yv}Z6jb2Kq$@UnOMd=3Ec33@pho7$SYflSOTtsVGDE;@TjK-OmbB%1854KDMUZW+Z|FAU-diPXqSmZpI)ldpieL9xr~9f7#{vl>g~wBmw;k z;%3WFBK(g-ke0j>NYv5A9K_DRN^i=<%nah-U|?or=ip$b1F7P#;OJt>$jr^n{f`Y67Wz*F zy{or_o3R(YgDdHOEr^-Bnz~p!xmi0pfc~*)Y~twd#!vFe^xq-aJITxck6{Pb{|waU zkTH50J25gdFfrQO{}b20(5`MO=Kq_<{}t`3=Ivz8sABHw=E{l6Xk z7iebsKR73M7rTGOX=ci3Zf9<9?%?M7Ns9Sjj6Rw3D7sjGPN1=!n4_utKToB__(_;K zn7PSAu} z=IEm4=xF!fEK#y@baQmIa&!WTs&as+G_4)X96epB|Cz%7Fg16v_Aob-aB;K;{c8?* ztp6|mnMAm_B*fXdIfdCI#5tLnxkM$n#F@CnxVYHFIaox5N&cg2_Wx(B7(Ypvnev$a zoArOvQq|n~Ka!obfV+dOgQKSdALBpi_1OmfTlzPK@&BXyFUbFqk^jYhrujeO|J2uK z<9{mD+~Knsn&&vvzUa#I@X19WC5Eja|$E|1L9Wdt=MbTr)QFb{;k7`>cI{ zlAM~jq>~&N5C{PQ0R{#J4i5g000bi>B%r0G{*-}0;AcN1B-FqAKbwfi$e*z6tW*(M z86r~BwA638IcW;&s{9gSEZp3@0s@gy!E_9a(h73;1cXFn1it?6vKm^_DrzE%N@5C% z?ED;bY;?+6+B`Bcx`tZVgg8P<%FH6dAZA8tZcZ!$EO`|TGfN{xOhiIb0tGEyXIC2} zEF>juU1(%zJVHEeBNK5+@yy)H&lpjVQBYA(5z)~QP*KoP(NWOR(9lqkP*LHKkJq$HGNl$5YY&_Fm~ zbMFW&EM#-XL__;nP3Hg>HflrnC^Z!o{ug`#5{lM=iBGa^y;Bg#a5Y^cZN1|}6x2va z&@fn^fgpjy!ZdbG)b|XbW8fg5!Pc}6cMVK6caAi443Ux3;bLPn^-V$|Lz2)?e!<5< zz`^MHIWHt6gocMRII==SNYc_ZO;1k`fq{TSLEQRt77HJLVs>j_ab`Ni8*;u#!oYl7uEG}-#$|{mGGousZ zGxH0r9o%4$({)Y!KD>B>M8(0UWrfEh0fRv?b`1?oESQ>H%&F)YT;5f)bSGgKn%Fq9 z3y5=#%%~rl7f>;>ws!Jx^ODiCDQFrnHZn~~&WMVN3knP??H*4oX`vNXh{~$e*3hY| zZ%fN5E30T28W`h{(#X%sFDoj$efsEb@6IE_==)42em4~bRe-2G4-zIm7z8vkjRvW) zZJ-hy!*un0_;GNh?<8@5`|9cL^3CaTa601g;IU#&@J5suO#lD@ z0i?x*)x3V6X6q~Bt>F!~wrH$9&*5QKO4c(Ms-%`BHdzA)Ci?ndSb@6>yK1=Hsu4O1 zMMY|^AcKSf*c}n_ep(ae%-D^H6aP8n8OIr9x1}IPw~O=Sg}0>%zQArk?ZorP(oKuS zB(kTCO~sLiy64GaNI>o4`YX7Urj1R9s-^$rhb)jmu9gz;x}3!}+}m)a+rt0@=s;(A zfxpoW(4SQAPdbuqM)~-dkSqZQJTLy}>|Hr>C+bC^%iIJ!O7th;egV^BG!+HNn%kim zg@2s@tBTzLm3;tdfxuuP5DE;$zix*zOtefLZ%hnq9Zx}k6=ay8k08J!G7QdUpitlC zJ2+SbGyvuE?*8`f_RB} zQtOxn1VT{(PpW#^K0NN0oK@$~6uioVh+)dsZkv}8)wXz*{a>UgA;8`qg6Z9tmM0{a zTAQ0UdIK*EzK8%cWIiDLCSQD89oX5}1TG@@jDpDWGXoC}HaS~bT3S63NFag$Z;?SI zyzCc_`aXhOE1R=dm;IqN(19lx*1^ql-Y|!DHl2nW4~UwZw)>v${Gxa`K%ko-LfhKH zJ$|O)h5zEKWuw&eeh05{wVRxf`}_P&mvddfmSKh~@(%IkUci%pJ}Qjzl<2oQ(g0T4o8 zjv-5jBN=}R{C>PYeIHLZ_oeu(txAt^e3X1cU=zNR+3%FId(434j+nK;;u|}-xrw|&jtIhxKSG;2>GtSCq`q*U3F=Sz z$`Bt0sj#)i?o^ief&QQX*?xGS&KfUa2BBiNQv7s${9C~3tDZV$__a?fcA<0}00-{) zdyp?47%~xm?z7N*8B)TYDpE6ej29YGBsNm~gcF+?0ubs`8-vxjR1kxk+MMOZTuc~L z*S*V@l`%crmyo;rZkGxl@rW133Zh8^)+-TH zI{VURolcd(vQdpLlTUY}Ax>^UOKW*jD2oI6&}${!BuGRWZSUTPOdK9q2x{xD3@@EQ zI_||4+Axw_zFg_0iTR24-bI97aRV4@Z)$AJ1_OQ-7TP*okyKYNM>sHWlGP@s-E(P= zi`!nqK!A*6MiGMWd#0lz&m~6oQiINCOMs2wRCy{kN1_oXKzDjb3Sz(jzsF33OG4=F zOCQJ0{goq7syn4s5)61l%Wn>C4hF=4C3j*9_vtY(QpC{xprQp!yQ}&g8EHhA?+E;D z192;mxvowdGJYXAtmj*Xq?LF%;=yKf5+0pE4C7_w!}6q}i~}u^<3O7|r9`cOaIf^o7qmg3doh9|hxeYj#b9$&9WChvN3CM~}5C z)R(MCG>}{fMY7%aeaC5TltoRPx&|e-{^8>09+eA=2?0#CvkVp?IXH-<0`3@!>l+1< zWj-bo0PJ^v5Ei&V8F24T!U_*eX?=~B;_#R17ks2IQ9;vri#J|V2k5B{-@S6AX0%S- z#%{X>$d=aUR#)fe=k?VU6)h=KXgSHZ15yF=E2YSoKC{E9bVd0*`C4*heAkKIubsA# zYzLj4FOek&L-O6Eq@<0Fq}}mQC6Uj*Af1h|dKo7_mH{%5vYF&m{ zl2Ps);+GLmCz_e6@E6*XY7SqjJcWbSIo<2yDVJla@E$Svqm)S#ypU3zKzOiZ%tT^7 zLLC&@J-TKpNtlN}hCVbwEZzHlA1H7S16Z+(gtYl@J&jG{w6#7A)f2?Mb03IIrtiJ2o0r7@nDfS6 z^m=M$=f4>HST`e7BL6Jp zWSS%l+32dWe1*OfL&NwQ?T;0UOOkoyMHYUV3sW8QJO(jyZ2=i_Q{tvs>1dKRy$E^= z2(=QlCQvn(b4X$I3^zp`*8r3^^Z9U_wr-qfB5&mgw9^bn9j zB(zcRP^(u7Es;g5( zHS8ZGTYtN8$~RW3--wp~?3&;e+-9FJ!WkN>HHNxpM+nQPf@W$F761*2q~QsL#7c(E zenZiA*0t6=H%FH}A*9`SPMrIj>CYemC=v@P|1?gD zR4BMHA=Y0srUDntjsp)!0V04u4P-mSOZe1Vd3QqibNb#j-W*Kz^z%Y~bZ`24eT?p{ zCt&#&^mJC13&4GMDq7R8Rv}$hfX3yfM&%!>lViewyK1l|_u$ZVlc#urkM8Do3=}aD z7w8+8)+P~PujCC*Mu`jz8Cz2ZRnxed4Lu583nOzQ3)b^GoP z!o=F;8xSF#q))#QU7&imYoFM!`oB(H7;f_;`gQko_q1T3zKR5Cny?%_Br>>n+B;^O zs_p7*M`$77@~M5FzrOZb=UETD%xAZzr}HylNFUDfn0IK^H0@_gNs?9w1Cy#3GV_{- zRu9o#cU>z3}Srz3TyL4+3b@EkpeWrtjVXP9x( zK&q@bT7P0s2M%POIG}+&f-EJe8-Wm9Heta%gHisJd#_|nuw_sYfJyw>*i^y}J>ey1HU zKtdxncYV55(kv(H&G4@_CtPCi{7dGEn0EoaFfO6qozlO8%?cfqhHxv=)@KCx+1Y;Ptmg8W8Xr_9JI0?A z<*ZjI<5VveGwtlBmWYXA#NlDw|EQ@zi$*VZ-VTw$e`KEopkM_j5)6tO!dy&tZ69G? zB0=_Bajg>(5#r;YZ>u<(o9DpgH?>HRGw~hdbYDhr3ubI~W;*(G8nnj0_&v$gZES3N zQIY;tQ$htlg_b(vz(hbv)X0J>9S_nt@4;bA{pr)rhgYtWRE`0bn}&TK|L(E>lq?xf z$j|NClv)-yMw;V+@GUtB;%Qe~R2L3SJ#M3GBUP%Gq_X~L{d~h_I6+N(L41-3+vi9d z-OClStBdXQ9n+k0^b!^kmM~)U#Rh zx51i2icC4*$XtU%?&{VY-Dy#SdEu<&o{Iym^ ztYPd&V+z@vu?@|tQx7svXJ%z%;w3f4mzT4q$aP0#crH&X7z}X;^;3h+$+u~95E>~sQyC< zUaNU#kVV`M@`vOClvN$nioi4?lze?wd5Ji0a30MVR0Uf8-ryl*hR{HCxwM$sbeJdn7B4L zu^tG*n;67YeZ_P#Vlox-It`7Xi@#?*hYgkl{ZXGR~X3A`Gpl1|hlT2g(rC^A(L?tK(gtgr%eWt`?bQ{@vfXI4VYiUcpYgOy8<8nzAU9+Fy#Zm5s-Q&m6WY_P^jhWIW?bFMQ6 zsZ%b#+Vz9&ICNGk%~L8HQXHX(2;k%+38|Q)QLu=bBG=oXr%B0+3;U>QtE?w8#>e-* zdNc%zauez{>)5Y* z>YKU;I1A7N$i}i|#B_9y^ClR$^F+V|-&XUsdT(!k|B5`9T9)jvmM^7{XV*^>&*bnV zS(Sq^+YQ?1x^Fo#@9eGsVX*6MEGVN!C&|Omzjqm{AtIob6eF9nW|A=@by9^1)z5L3 z3$dMw5mY%DGb9T;cqCxKu{~yfMbZ9R4Bd3;%9clrZt?W>!Q8BTjjdY#SPuDot5;DF z3F+SBe4~*rrXn&Dn$ivgh4Lg^mT&D?y1wy0AG<93L2264ZT zXap5JZN73bf|v_Oy;Ooyir8sK)U}2*n>045c{1*#$$MtN)M2^5{atYlr9oYt9hqB? z>*vqcJ|hQ}{wtV!c9@+Yc%Y*=x=LPr9jm#g~+k}a%FxxCc zh1Fj?x(OkWeiqG2HQlD*UiIs6c z2nN36^auI|B417)1i!0ca1y;=?YOk^$FFIx&E4itWz3XwBIh-3e{?(Cq#POQ{3!!# z&nXu{(fXqXp;wh43WTm=)tYl}HfBz5v`R3HlW;YLDIv^+nCcVfKp~0|J-1rqg~`$KYtW;aBx5x6<^p^F&Hyx!3~DLB&K|mrno%K zz&H(f%*q-ce<>;|qEC3A-|^!CcRafC_I*3uohEW{xL_<{XspbX6K%?rGYQ`}4EPvu zMSHYA{V*LpSAXzBI~%dZGS@F%K<*DH&j=#=+NlB2J00}0E{8g9USQo*?or+6EHnpM zeB#2F>D)OJ@yjaTGIVtw@HZul{c?>u52ml$AQ7&$j!;l(pu$kWaS$p zcAmwikR}T*>>%}c@%2+YW59zRpf~&tS+M(Yx7D)Rz??-IGNZLMU1}jzVGKTcBI6@M zrOAqEYbZ^_o!G{_r0A<716u6EL@M80^g&RJsa#bX6+0-w7U$RCELA46oPNt09R*z$ zrW?WcUIYaozF!fsan3Q4NYwWTL=mb8e3O3*^N>r$7~N{{QM!5E-ikM%I)#{ROO(!#ddyjG8yWe2=GN6evnbe2jB#DyH zPxfTZfHL;Ij0!mDO9z^}nG~Uwe|6&E)iyNj_3?Z4y4iv9LZ0aDEThw8V4ykk{?Wjf zmzS*$>l$xmlyVYu4wZ$8db$U`nBK(XPcqhhK&uWg7j)>}a7VRs=veM0H2G z^(1te&hNeD!w>UrAeOyoR-J9dmh`(ScaZIO{_YX8@vnjuADBYlg`-kcnc*LF2Vqu8 zR+^m*4$o!krDkx5HHpodqWGfeB@(aQrKN$`QAHKkI|@7ax$Pu~Waga5+JV`chJIH6Hj zqpB5V0mOBP&SAHK);Km6mLWEr6U)}CZDUi0jx2VTIAltQh~Ux41UvlN`2!EiD`)73 z{j7uKm%3Vl`-giQhdY#OmOgXq37jw5BR5E#i07e?rhwk>@-|CqO&bm>o@Nmz1jTp@ zp<^>mvs6d|f^H_TbT+|X5kp579n=$>td0VCnv-Cq$w45UlC)qM7x)&ru;!#N%oG-L zxJ1+iA6I_7t@SPbpI1)p@Npkjp0>7JdWMENct}MS$P`32jQT3``M1BU=sQ+@dgtY+ zjzoNniRFFx(PSAh{;cBR`|gFhlrPHA%6MP&eQ)({9^+ERO&m*3-&zy8G^~G*zGXC| z?)#q8%YIY7S!l!jtHmG1!)l~(2p4g9h@`P?*Bg-bW3;0xXs5MqqSOY9;n02<9S`2x@o0gzKB^VOZRAqn@nh z+S0RO?A`bs_~_;B@xnH>3K?nGUP*TVTGw=GzrR*tTP5(?S!rr)cDYI41))7_^y(SN zQ=qd~rHtQs(d7gYQ3!*%J=pv*@uBZ-X_+mjjc#CX)yq1RQY`qUb^dYG>3y(Kdn-Wl zwqxe&+o?AJ52Wf5pPVT!IN)B0@@Z$slV@l5K^b_ESD(XkW^!u__FV`D_8}d+0SQcW zDPcgnCrM;wUuCpB+|0U|-H@f7p;|3|^})M+BiGhfVwb0Y@kUBIzQYXTh@tTowCJ}R zQdDqt^qihz$lGs=H|*WiC%6c8p5EJTbn$C)e^xxNDQUI;i$FB*8hpl}grS=+gxo{t z5qm#Ui)%B8>`ax2M_Wjy0wAAS!W4%dY?BCG`GR~w`I7e*ppX6oxz3YLe!a??( zSN{&lU^Z`L*3rgg_mf1op=`dE5P%N`fF&;4kQ{`N9W~h=-Dmm5|4g01U{`oX4ivcz zoNs&ZUj$u4>FS2M)Sgx?v(o%bn5u>yxdV3`0Ww0;OHu|y+X+0J@AlW1Ttfcf%(0=5 zPq4vhOJryT%<+*yP#dq}uNkM5mo+JN%*;lRNU zmZPt=V9oqWUtys^rS2*sUDx!=Gm}h>Ub^ghDYHS%Yodjz1ob}dQ}3s?WM#G1?BvU< zPNj-L8?IUe%}@N8R~+f{QRa+|E7H(IZ|{vJSL8P z>XB~dF6d$jfuBELowhmK6iS94%3YCc8=#n;0KG^8$pBSwFpRxQ zf`Bv*;&=78b5C62H889swe?|owSJ$UI=fqIy$F20q9=R5TUF$5?uy?<+vVS{-sdTB=(xMxJ#Krxg4*rlG$}TyPs`i&! z&6?OwNqkVsfsKrN*SKi2R#$71%|bDak&>!Xg|;@)B=CsXr(g0T?^agul{{i%)xHV( z3tm0s4;e54%_;@e=`02Q9vkqa>7tBBhDTF8gves}O+st9MQ&`PR4+g3$jABvRK@f} zwID$L1TmqNztXMKw?Ut|LePttG6+M|h)S)gjKnNiOuaEjfwG@_f9iqgLeC!{`GNfC z?Kw>QUOFHu^nr5xwo|FeNSjJI{<4-jmX)7H^~RgC^2Z{C_@?C4GT$R>S@WvYXW1e)dFRjX^cNagnyla zh}!n{Taj%LzkqHM3fD>Wj1dC@g z5q4Tglgm0tV&~pKQ4!E_aDP86PyS+idh8!5)u+xqi^jBK6$>t56rHYu&~o5@9M0kU zFVmG4_Av73u%q{Bz{y4~Si;uWwVkXKy!_ekJ=Xh`#wN zww0iBo43Y*zy*gCyv)a@Ej9JdLsD%HboI(bv$*JJzpWQ_Dyu@E$b7ghV&;iVV(gh1 zLY=&hibUFv=?}Z;pB44{t%@@i=DDLrGW2#hg>fI3N?qGUfoHuR8=UK_S1qv{0XJr! zZ#XhAVfbi0Cuo;)p=^6=Za|2b3?^Dc_xCbL{f9pkkDW^hE?>%m5lhn|wyA)!ed%vx zz(_5}5izvOGo7!@{TlG_ZErMy3xo};4Q*P9q>y^5m3^6lQOEAu>4#RL3w=Gq4ga94 zT+%>y@ZE$1zT#KekwBQBnM^NNPb|_B1f3_O65J>I@C27@E?;_z zBLnE;A@oHBa_z4C0$%Gm0teuQ^5vOBk)yf*a$N!jgB^e6J7Ru{KvGtVoQjL}D_w^E zyzweQjvPLLcJ}M&*-S~WSs@u`8*bd5+%w<1yxZ8&72ui#KLtGQ@SifKr>E1VPM%Fp zzCHPg^f%B?N%%38YS3D*BIF}Kcaz?9rvC4@0Dg?wZk;lzdoJ9{n67wQ zQwh<)Ar;xduJWL05-pVBhnsJ@jw8Y2kaXu19Ve2dJyAiBJo&24h+t#N$0Wr@9BwC; zmR+Cmr!zeCJing^UU#=CwnEuPXs|#ySsuNa*m33g4!kUXOuGMUOApmZEZC=c63PdGzhBRTI*c#y@!}lY|h2Bx*sxP+E(=7 zvtH5uV#ljdXP@6;vE~hO(L?JK9g4cZ6Lp#QjH`-qqf&!Y>VZufq)fOSD8SVD8m?BI zUcez-Mu<7rU?48v<5DE@VWX=q`M5MZX0H?yh(9e&W za7kFO8HFed6}E}DB%4TNX!~%`Anh>tY6@E@47;O*O{_mvRh2=LlC`@3#J%AA?Pd6Z zNN|0lyQdR!&=YiLDE#N*j6c+Hb14T3MSVKUa_<^St+Kj*_SrfwmXFkNMVpSI5?F4_ zO`121^Ce1(HdfrY1<(YjHDRW(vcQ5<>Hlkdu$?{QC=t+1(_tOtMna*#i4j&%VT=Ny zRG#rmAxnOlxh~1ghQR#gN^L>}C*HELp8NS{=dXaftgXQAzvc=oNp@qo!vuU}o!FNp zu%0ke1gv#t^o}^<%)x(<;4T4LfRo@~;{6HJXTHRu_ zaU_BaQe?wruoE=ijUpK0Ntf{M2lH86Y2sJri*}OVm!!Hg)LR#_G8d(~8{*zhEx(wC z+T(|Sa}2Ts#t1=2s!35T0@X>_RNzR$<&_}GFn*BSqc+Nj!(}DoEo>LiSDVzi!>(0(jowHlL-@gmmaUmB@4-ymva&`Lt{%yg( zk^C_%028x^myhJ6V(hb3PLq1HIUH~F+@wlP8dqDKKccArwxGQIYf4 zN+H!x;QkC?=5Q3_q$|_J7mHBzb#+ z!5lUGn)TD93VM*F3sXB?d6fUF`*8+dvo zl?B)FnVRt1x>GyPhColpo6B_F`_=nB?djXq=n_K!VIFg%XHRo8zaf1(>|{Fc#<6(& z%e(x+pFf7!*f}B^@~NpMz+sis2FYM;acdL(MrMb+>nE=mh$iga=^hw%mg1z9!=t+u z2fU=+Q%InJlpX&cVtD$X=#pm2qUg0IWMskRKgMPI;J>kr^QSYBB2ilt<~%-4m50O94@G0`Ee`l2h#D z-W4ul@It3V67r_ZkuG9Oy>h2jXfebJ>1zy*b`r@PekAK^0g*66o-w4eB@3x)G|G#VJBm#YTGP)^;R0I(CW%e zh4r!?VA-3k4(|xJDv;PnBN-!ZV$Dr&j?Z6(~9~>qtd(+mr;(I5At-Nmx&wA z8W9F)7fgIP(c_*eSsk-xZ&u}ogS=sY5uM&3mk5xE1<#q1(axP&9J@%Vo+rOGBmR@- z_4cRK@Z(uU9B}pV(keSYu4R!DbYWQ<&2B2!TgI3!O66{QG%%&z*D-s_R%nN}Mi9|M z_Jme%5!Tozk7e4O;<$3h#~b_0_4l24WxA3mOm!5^9Qj%;@wHw-se7!SFa$3J(<9~Q z>H-9TlV@P3L9OziowI4hn$~lVJcVzo-x7{Jya**)c1?{ z2HTb^x;n_?1PWBesUl91>Chta&Bgj4Qi&AJ&aln@ZO|jb8q96dqhI`HLqY42ViZwl zDjt)Q&O`i&clGhU6{#L|D2ZBU-yTB+h=0Db)-xPpK2K0wt$K4}3C8P#`Q~~l7L3{% zaw?9BdE8?b{Ua)98r+deVzYF~V?JjRh>pLbQ4><_0oBIqcFq z;yR?QVh$gE+BwMnCHFB*vBbypxQGl}WJ^9q^#;A#MTlvRF>`uu87&prjzL|&yB~x^ zcLRcfJ@3!Mt2W$u!D~K2?t*aXQqZ)wpWmECl7NbTj$n{Frs=h$?Oy$a9=}>}QDut6 z;?>s#a!s(HWnED6$p&5FJWP`qFr0ZSFw3(EXimsmG|uM`v_0NEKOC$$a)5l6Cb`!- z1U|qG0$=v`?H;z>a>K5Llq(Saj)Qx^$d&3*YhKHgW>2PZV-PTxjyBL(mtTq0U5(5A z-8ZkjveUO2y)PekfoFY;<0f`V;-~b*$|HysLZEBOrJMBuEsg!yituaxxc~`l2~~{ zKd|&@U}`vtWd!$k25kqjYrTwMmluzZ70##UT$g`=QA1>!cV2~J$Zy=4a+`<->kjprwePpPisQ&awRclT z{bR_MQ)XOvYpt4RQs-HYzl$r;2C@)a5?_c@Lw^oG@HD!s}sYov!w|XMS zdM)J-ue0o$p9PO=N=lvSVjX^kULaX#g05$#J| zfz@yVK~SNK!O1j7(fojk1|w@Et~f3$Len3s`5}DzT|+r5%?7+$XGXAO+B^Vq69u$0 z@UZDR?fpRd^oka?p;E0zBjO8RKE#dQF^D%=!k{It;NkIG8gyV6tNE>~0-0A~r+jJV z&T3J#oe=vPuiKCs9(~A;AYfE{Ev2)nHgwecU1se;FK3p;Xgl12m7QTx_QZkNu9es_ z)4jx*5jV9c#?DL|Yb|`vZ2e1osbngL z!0SWXG0$a~^z(+5v-8FE_5QvlieI5uJeRSZk8}G{XDga8dNvpT=P(MN(Ony z8U=a5Fio){wTg-vbk@K9gPu!>7lKca5(dIKbLF^V`?uA3PeOgiEOLcw ztRY9i86Z5?FTVVg4LSvrk0N$?`Ft%DY^>yvGrzZoCj0|BPaKya=a);`TnWt#j|E*w zS_?3SYO2X$!IsR_8Zu}0{_#~uHe5KfWX(M zB(kuHY6AjThY8rMu%;&y!O5h57VdC?sg5-)0LNOj40APpj=-zOiOn5Z*FwXT$Yz3# z9gM^K9vtMATfol;cD%TGv^@B@K0sQ%UvHi)$GU~&g$UfY>U;tCj68qX|NT;nr|VWu z)0C#;64c=pvhUQ-r&wE_W?>^IS0yafP0?at!4p}BBeB3?0a=wNa$_4q2P`@ZEfqIl ziCdUTqt^65nmEowhCV=`@Kg-ghn&@S$ko0V`TP*$=KjAlUzq{q$4ZNFQ zjg|45mV%JMBD|P8P%7CZC7056Yh-^>aWtwh8`?-;3e@ochwjoY%ffdN)Yb0VdTnHV zz3qI0g1zls0S^}5Pm})D@0aiWk!Q2#WfjyBNV_;Pq zsoKEp6&m=TQ9YB^nPIP@;T%0a4(fl@c7+QSMOrgr+4W8F+QZ3yIj37cn(`#!xoSsP zHoYlDGT>vli);KyGD~&ouuuO237F9+B9`b(+vWM@?Zl?<{gSq+ybT7{N7Uob!&-Rz z2C4RRcScvKdzXRaxKLp?rmeR}sEVdDK#rs0NbytkugrR%DW`&}ibvMWEt^$zT`73Z zKsPqyl+?=XEPvtq>FTQoM{L+EnL)4foK;Sj-3I5e9a~noM0FZ11Ewn?BC%HAA|_W5_@EdNcyc{9h3a6c^z(1US0}vUWVa@%0j&Io-Wlml#O&?s z)64T`@Wpcm)Cb?#tj;!xdL6opUVd({zm9f*L)$%c2!Dp&0^V;Yci+Wvm~U@lG>~-b zYVe2XRx_7>KN&!XZmI5anc&8k7lle(lkKM{Ap%nM2K2tqH;dZ_#1=xIPoLMiPd4e9kH* zvO){E`SWs7JGGB$)|;bK5EXKisN4$r_?lT@yFMF~YivU_MuzUYb1=U6MHM%6^5E+J#dg||UE!Q)5pK_=XqJj;c8s;os(TfK=g|i8^9Q1-F4U7D%t~w397c9Z?S`OWb>RuwU9ulv5*~b z!qY^X{!h`*Y#hO_)46f`Yvn^O=1F&siAN6)59u-a4^JYhj99NN=R7C!;t^j*QeAa= zvS-)xi+|VuHdf_{1A8&?7!q0&K9!?Sb`yDe!N^_3k{f{2vjU?}NxF(01v3xbD(?*0 zXi22=S{r!p%f4^xV@N>OGGZoK-B63g808R;ah4lTF_$Pbm-wxf#(KSSDI5jfFJyw7 zz(C4{MS|m;kcAxjw?P_(G7`XTk75+`mR^0Z8jk~iKbj`iV7OfA^VY#r<)rCMQbf+~ z3W?*b?_-e7t3j!KfCA<}4>z=ns}h02gWM>?d%-JS7v7c&2bV$z9wl@Y4EWwhq(fgg zDP?h-dR1Pqlifs2fEbFG#ju767-rJSZ22B-_9o%%?Ce&ASq#^>+t{dUN(2daIZbrl z<=69@SFrbGXZPSi(Qs|ZFTmBxAg%fS#3x%#l<(WCF>}rIIsZFE({S6z_0jXo9c|Pz z<+3L=aI@Rjr{43TG`FH%>UiVjL9uhK^aFB!tCxD$ld!6)bxnLK4L%%LG*vqmtxEaA z57RieABGv$0`Xg+nkPNg;?FWpyFdbIF~++Lw;UG?ERIxOs;tFmJf9J3W8$8?D}UJc ztRFb95T_d{%4|0jC^kM5=#4hhNcG8!R-T7+gN@y1vN-XLoG#`-S<^ zwt+rgy03o&k%MZdISm+3mmN0^yWg4``}Ap2V~V5urPUE~`S8Fkl5xT=4i1(*FV0cN zUjqD1?|Pn(7mt5IZVR~U(`fN9q1HHSel zkt|okoIrV6euy&{JAIZoZ;^R~;y*lh2~%n)La2Ba=({u6kT9r<5F;a~@?NUwGGF2( z${VcVRIi84C>YXKxI>13^h_^GiP^S58)Ya0tFQSy%jIFl-h@pQe+#}3N=Q?I5ggWP zR<@|n;Y6RQtW5l&V6s*?ki^t2U?Z?0;#_uf(tur1j47d^Bd(YKrlGpe;E0(LQ#iFl zf0f+JZ2z(|wYYr1TO0rFzDKY7?b(8|#gPe@W>vNyFhWG&=FRuHjn7#lJw*%%Xn(m$ zKA}|9nD({)i_{XenVj>pzdxXLwyY-I;dbL$qddR;D-YlBG}K-gXK4Y|%k9Flb(PSK zcYo#DlZ7GtfN{Kia11M_d?tr7q=suZlUgGlRCal!95~1-@jzPrAi>;vgW(7#jt(Jg zlFtz*FMH+QVro1BowZKNCSSN{%mH$8+x+zIXD56M?($vc-CVNerijCMm zFzn&CJ1p_B_c`C`*M@x+F>_)4T8{|R%BIZWF1L9j;H2DSL~z++TIb8vJVDl&aQz@> z^Zkc2Ef2&85rA=1U{j0k+j;lvi^AE$)F z%-BmHnBuRyGUIA@PQPJsKX)qmnRZC6X^%)xnM~3rp2 zX<474sq@SIddkb=@ld;1#@2T2Z>I#~hP77s9-^uc#6d;uKM((dc1u~_^Pad zfxH?SBPV%VtQGUuFoe;83lT%cS(OSHu8i`+4#5?JRX8SJi|XHSBO zlI)9Ko~vHSoZd%&sF4!WotmS%dsdnCuacfL^L?Zt?IBfVnYI$O8SSeA0!=?n-PHr$ z%2nrZ4fK>FuF}rd0`9*QfOnUJUyJGKzVO|y?`UjJ7gqZX9pBo~Z2{stKhEclj@~`A zX@6ZkJ<*|=HTnkSH9}QyR!#6Z&{fmJ4+t5sd5so!cPb-R`Mcg2=eou%+9Yy*F4Lsc zr!|D6w5T7>BR~=T%@FhWHfyozb^2rEZzp{Wc4fK_&*g7;ba7eMU&&k^cD~)&j{>rh zdkvcNUUFJQw6rj^sb+`BVL9xj;FAlZ1F|&6!|P3;`(WxenBReQ`SP?g(Qhq9u511B z`}<_{Od6{Ge_>+V!~2b37u<=y?pJkuLoqc{p%k;2~Yt1`R{kWeZKnj@#}av+xYtVG&(h9`cPAZAz2?MG=uPf#Xj#2h{VPZ^r zN4=n|G2EG?o*IGL!l{N&=BG(Z=5!cE{;+WhR}vtmUM4}ebny(@V9UOesT43=Rb>h_3@Xh_n&rb za$6sIl988RsoFX_I0MORk;~uO{`U6aDbSwEIYPs*yOCeE*fJBT**>X&-rMyAxt8k{ zT82SFH>*I}j8gpQSpFI{nb<|^B8}KZ43Y3?)Q{S zO<|LXvb~y;b@HDfSx{cKEa5J1)45|m{&@d?%w6428`%}_Hc}%s?Nc9GRo#8)OIKPc zQl-9@`M5K_p0PcHJ>#jDDV}jOjBPM>7ROH5h2_Ipy2hKtz#0ciXa?{m2$YC~d?>4h zq)M_9NY$z#qDr@*h$ySA(uaygs+5wh^3KDD56*vG^(e(&+ti>`JOOwg&&9h2EJRwEv`pG5;b@qqyx zR|KYiw*BJutG$=I2M7E6|J&bv`Eu{ur;ogTM1l(eLn21FEi4HjC@FZEDDYBe(lr>Y zEh8%UP>*ot-F&3l3Fa@zY_fm$&@Tu!9pERwIDT_|ee*A;F5BGl<9q85pKN(mnJ7Ay zK`op9@!K8a@5OKD`XKn*;;mAzByyq{6vZ?oTfpcj&Tr5Zo^WnTr#$4`unyF|N}U-8 zuH_BFMS%q_WPsPp4({p@ zQG~Aya+VyGNpCEsfUqMLpgZmk$q{?&@AdX#fB!&E zGBl7z-D8m5S_27zPy1M6x!p`U$OU~=6car?kYEg&=3}*V)QtplhrU`2W#F+l-hBHe z0)hZs3G55_qQLOAyz20ITQI0n(iG5T)!yVt001BWNkln3sorw0Z)0P)AipKU$*Zg1zC zgXcr5*Wh*I;^^GU%F?B?m!{6GT)c6kajP-6w!8P@Sx0}RHzXJeHYp@w3Y11=&Ag&d z1~Zu;8-(Z38t-97M)L5#1;xm^0@E5l?A2np8+`1@FW=dmU!ULn>j%rgVm{hjfB5(m zFndsdH6T|uKxAvrK-}j`bhQ92vl2Vg!O>e82tI0{h_)#%!>A^~aqW^QBl}OMZLn)z@DsC8pd!n%Qb`HBa-rt*O0)(( zBS6sGHlFQK+Tjt;j2X+aPbQ+A$4%jGt=-9khQs#auBxg|-f1@kfE-0HE#Of$yOvj! zkd$akK(22NDC`*bww^qFwe#}e`G2l}?Qb~&s@%roZMXh^1=E0Y?RV;4fL1eZ}!T9S8FWBaIzunzjNVWy+}QiRZ}#tAR6Ee<{~gZ?RhSu~-iT1~0IXi#5Zriqs)0@7SUbPY^pc z%Tn8L+7$|4q=Fb{m^4miB7$N^BSBFZ8-w6x_)rLFyb_))r3C!a1n4nh{sj2(X`E2jF}?t%|MuVi-QBNW`uN%xjirr^ z6)^bV)X>mceR^$p_^Y*vp`oGrbiF=&cY1Jebfxjd((|1cUM1HT&?q{=%IFiAN}};Z~pqu{QCO6tADhKGII6H zpFMqiepyj?4rsd}^tKIP6TPmUKsYA(Sci#$Do-wYZZX1AWy}KQPN`4=k#5UDj!Ny0 zEk}S2l#7d1*4G&+03u_q26|>0s-MNJI#F;0&dkVM$_3gOtjgFV3Smt&xN>bHms|HD2M<%xCn;>Ld+;Qgz38Q-g9M{SW(OG z0}b2%y{;Sg?gP!+`DS;2ZDOvmdTq6F@!Zt8iTYPl5b({PiRrcJ52vO^SLQ}1t_)7x zh1c-#r_)n&jq3-mwksVM5}f>f8JR?)aC2c$kV?tut5o2YBCTB^XJo|4PG&V;W#wdi z{E%zGqd3CnjbHul=H|`ydv`v_=fldoClA;2@T zoN6|C0ygc`04r>VrdU}JLBcbdp*e&~TDcsx0E=1HF$5#j9#Vj>n^-dlsx29m1R5|* z6Eb!gE3T_mS!F=|EfxVhfvvHT3@hroHp4TrS1sbG2QMRMaBnb{&eRB=7NfRaQVbQ9 z2K-(I_rL}P)X!yDJi%mHZpDwn^+c|tJ*^h6m&aDCi+-R(>&MjT~WO#V^?%MFwxsB`3_qHqjN#ds1f+Prq zLWYZ4#9v6Of)=e*BAhSckNe)skCe1-tE7OlYX0$lTo62ZxLM$lw|@RMIKce9tEU!> z^5u_kIL7^jRM{xVTDiNNo$Yh6rxy0$#q@5fjtzOx*WzFcK&-EEoRB7)HY5W}>kS(U z&+uA#jDij$AoY}RSWtYVj9%4I#;KGMU2ogw6~?-Y0mXLJivq>gVMT%74j8Zk10quV5G9HtBatT3GBTNj zwrNGNS2J`hz;bL+acf6LWm_yQl}jUAZW^SqVJB%+BU76pjR6N3ge^gXw8&s&NYE@! zHY^w2da<3Ow92&|J))J`_+9>|zyR<5<6lp{-=1CuN0})4?NL#Pz2M=nKlR+-3X#f~qMep0)Qo@J=fA-=Ful#BgnBdYUhfosYpVDs%t8K^3{6R*2FuixN&u!eL^VzsqQv(NsJSR`xv(sYVmd)^om~W)vpqtN~3LUtkNu2+to^;RcZgP-2xBrTeViJwbN`O@>^T3J$bnK)y;Zpuv_`)!s92cwXL;c zwdniBTJhYaGk3qu=Wq-O!Eq8B!A2s|pjnclLWu;mw@VNP=Y+|(PAf4!D}*5edizf8 z?h}Go177^mt8cuv2}EGy@`y)EAOGpvwQJYE^x(Pjl6u;t=ty^zVPYyH0jNj$A2q}P z#=_+{8vF7DNdm*cW8f&g7fJyHCpUbmcR&o{NsBiFk;*zEs%oks3b=GUE_Rf|NVGbt ze|rG?d6tl4aomVwfygs4ma-?)vZ?@r6xG>TJo=YJd1(m`mDfp8Dnf(hX6M#C}fjpxEEL4=`_S8A<)t;>GFt@$o98`9iB*gOG1JwbrKx=+_*?-i?ADLBBVF0{rBn2=qMmfMQke|N(zqo2%iXLe|Evc5^cQd5+JF?Wabo0jV4v9dV&m$E@EOYW zx`h%CcuGUV{u_fcY#TdkB__skywwHlno0sw*Xp!HYq(M$n4*F5Eeal^VZ|T_WE!fs z;Zm{~NKsZtA?SetSK-JEp3pX^bcYInNom@HTtaIKZMbqSVM63%Uz&*2TjM0v5LwUQMsWZT*>XpXYPFY_ot8U{%zY|z5Pev^{bHb=cmt10L=F% zS~WB_n7jn`Y)ybOGz<9F_baV-tG2eh{ivQlHgq`F*LOgMOAhwrPe1<8f48deTkVOO ze`b06hq?R_S+{zRs3NXd4ajPm0DrDSexm7|s=Plml$_iTHzsHtW!hAC-|%mCF&BJZ z1AhL->o>kwTDtJbeu%J<%S%hwu73)MOF>B(p3fZY@H|FMCKWeulTh>tQnQfmTdtZ8 zu{=}+t`Uf`>;g;o0E_{K2d}_}8of6~k^mNr%_jt(@qkxfe)AThfE&LzIM;sb@`Y>HkJ%kuG*`_dBd<04>&V6NI75CwH}cR3`=e_=Q(~_tFi>05?vI z7?xpQ2PXLWQQLML2du5pu~4GFpEnv=LCEqfJbqT@Sr?L@VqxmTIRJ{PDzkEoPW9=! ztGumaOfZb+2?8%A06S`0DpM{GlPD|!sgooa&POa{sK( z`)KS|6U>gm58qeX$oqieBM>M73oJEvnw9nKA9{M;2ViNYO>7R+JWn6p^V!4Iu|fwZ zOiWx^U*CQ@myb9Os)(c$PCwo&p|g=}J(CfldxseA;9!KaZ72#Ufu>Z3-Q9ZfKY0!V zUw&-~UpL-G8LoG)Zf^eh&}lcsIvz5=uttOk$$+>cNl9fmo>8-PDEkygT8$u`PE$;0 zLpR2TQx=y~<$VND!w@5RS-^i3YVgo(IGZ|K#<4CTUVs{4s>uP%Dhr4-NSXzdAkR)I znx%o8^iB=r(x!=rzU$<09q0pxLuSsF^>_kLq2CBF&$zTGb1N)M#>LZMPzSh$zz z8C502;Iu})VRKxX8SNQ-xCj?*7I1-hzO;Jj!PlSVS)w0uAI*4o?s#S*(c2XvyHd2m zMnn53VrYmkM<%rh5G9sz`n_;|H|xnG4D6(Uzii-g;OF}r4aYq3(sxg<9&)*?6N)h* z0^+*Y4OCe%Oadjb-~rJH4b!R>CRt#0P^C@V1E6mL=vP%q!kG?f90tu&BE@kb6pl0< zC#$jj5<$^gm}QbVh6LjSe#G-(IP}vL^)5ggyrR1SZryWihBp9Ibml?*pSi2+ZQH!U zm%Z8D?gs2)`vpU9HVm*tk(6lBGHHu6=aiAfxQr}+)Tu1XiH6!1CB|@Ms&FdFG&$L; zVi`%$)J7dUQ7uJo24g`IARy8fEs`u=kRV>L_$FzvY`xhzOqcxy>&CK7>+78JoaZ_3 zdCxm9$HPM>rl*nVUHs<$jmJ-4{|m$&;{D>{`ag`~7w0w0YME~B4l{iV%R69i-G)%F zyM>;T4lrQU0rZg);*~B$U`DVDkTIGYuYMSsTuQve52#Xp*U_wXhG z_dstK0&efz-PyhRXIU1NQ`c|oUjKMpCTI|Ke2R)K42Xg-I(nAt^nxzTMF|GCWGGzD z?XHW{5;#DLQoLRUWIv#_Tn)Gd9l}r363+9HZ~$vkWtb5qS;;A4tdj&*UzJ6UjJP{_ zcqJ04NZkSz;nfI-j9*spXc-bY7Tez6KRt%>?2`viT*S|S=>hV;pDpGW3mBh%?uKMu=xuhg(&{DjAds*6xg<9SxwuvwPHatZZ7Tp_yAtzz3y~+ zEFDRYO&`B zaa|{l@XQhcR-Blah{w<5M4Ew58zd#6TT*1)-{I~VCve$}zBG9Bi zIs%z2JQNCtV=~o06rKyT2iWmTKm;S4@Bw`Cg~{I?-VVXHO7Pd111{hBgWMCY9lfx7 zWB0E!s){@CfCvzwP;9~-@6J#m${$fvq?hC=AImG^L`)R9Xp{m(P?9*ZK}`|3w+N*g zIDiLyh?H`%o;WK-ct+wqJyn??AvCai7sQ=Ek??!dcqRx@t(JLCA+Qq2ur(Uk1t)c& zz;EmS>g(rEU$vIj)~;=B=JN&6WK*SV)`sNmqByEM6ZPJkRUO-L=^e(tiKQRMwrrpS zc)5v|G+pFJj$qhzAPRNligly7w7$0a=;^a>zXQfGH2>9;=lchrEl%k+co)2wqiL;{ zUR+y$_|0TLNsGk%#97Hh=SKYjVq|cT4o2I1J0spiD%CgET{(IQnP`THBU!2!0fewg&t#=pG2yZe_TvLJCHOC>pCKKy1=B-n=V`Fqte4@ocL zkBgxENfytKV8gOo#AQdYA*zR96)>Bvl&s1h63j$1_u+z+r8%Om+(j zM+0(5Za+6KV_QD~qCnx&!(-EJ$J_cpzWdMD_N}eYw>D<=qONP2fl|(HnU>RPK_sK~ z4$LAX01a=*`Q7SW)|GFd0v#=5wh;8e&~^qr;7uW*)qscWtkyse(BMa7X?1mTsrB;p z-u~15m*(c`>iTTM#SZ+}lG!@Yi{~~TJ)1kxy%3wY7*n{8(Oiy7f#Y^|&?N1lJ;S|h zIWe3*d+I1QI*H<_cq|&9n>@S)!T&?R?UlPbH*Q}zqOdckuWoPO{<0?HkpKX63MErs zO0LGkcy2rEqZCyV*(xD&kxtSNsz)X9+yERQT8%55T49_LgB7YYTklawSb!lwudJHJ3QDAW+v zlmXYhI80KZJ0y;yA$8ykB4$*Oa%aKGSi%?2;n&C|v5Sk5(qkvDT>0CjZy&#MR<}N1 zUCf_vYIf;=dK@AiQahG(+&FhjI{@>|0(t}lc)c|RHny9{12we0ZI?>G0vb9P5*QyO zbG*EXc>(Wg_^V^-;2o&p-zyzp>Y^Dhk!fF1!@bJ62;k1;? z;Sm?dypi5PKLekdr}~17knUjUuD(PWk9K%Gkov=6krR4C^Ya&DF@_@(iIEf;DVM2ox$FgX0AVEJ{P?(B1F*qcR7SZDX_uq&ON)rI-=if$VGNqg~j0p7M~K&~?H)bE@J^Q52uzJqh*%?iM?otpRU~ zLBCzu-oaYHsifkaIlaBIa_9Y;%mf2HG|%^X>7Xw}Ni=qD5IjTqqg*AIi(!^y0t9mm zu#cyCj;7!XXvgRegb0S?MN0MuIaQ*4#J~ViWywzPkdYK_2O24pG(1rhvOg29hJ2V^ zWVSs>cL44Ch$gH2q=JD;BdJG_9~K^L%N{}pUtOMINBmgWHX~6KCdA+1-ST3lWfCdeC-qMtn z0hh{R-7stG*?I{e07M43mzK>gt$+XWhvO$ZdxDtdR5CT1TW z+|~88kzQf-sy`qXdsFqI+8+@0W~EBT!+bFIV9$VU+`z<)aR%cMCsg=@un7)hCawXq z3I2$&ixV6iK?JdhfyE(UnkbtHkRoritFGEA4MN&fR7r@kN?^5Bd(LE~{R<#u8H6$7 zea~~A=X}bMNJNigY&tq@v|)7g$c~Tts00B5KGiY;tC!DmiJkvG+0=toYa1R8fb%ld*?Ur*sAZHJjQ>Ou8c`|Sp=2o6I8=k8=p9!~N| zESX9%@N$u}-X02c{#BixF?OcDh|rSb})qm~^@$FfK&K~RL@er2;Ku^;~qd}5v0YJKxzrZwGhlkG%W7Xi%4G8`c4ElC^TB{7nvqMvt z7pEUQd>rX-wAz{tEI;H1ZP%<9WV1YpLsw3Nki)6E;PQPec5YHM%@5JEfgmhWhtbMl z8%`?a#YP>1xQb<3v_6%>2oHSbgKn-M5|-On;U47k9FLiPP*cRkOS-;4AAeZ|GJZ3c z+l+yS$3Si}jJ95l#Z-;6rPq{dr5cW5SO?I1Gc*?6j7G7Pe`y)S!kzW?_3sw$+=1ut zu&`V#7MGTmZZ4Heb8}Jf^08bxoCMvd69?$E{`t0U`zmK}9A%29y$5Fr=hG zK!7{Iq(UN*NGre|N|oLGz-X5=G$cuw#jsJ7mk6W+{bn8@&gEjLj*FwW^M!)55x4>m zTDbY*z)`Ib{I%90g25o5fzLL!?|t=+==S)51w47^GqR?aHwxz}9v|?)5|X!vpJZ+An_Gn#de}I6T}rI5>E7aB#S@bNJuGYHea`Yik*E#CMi~*_TVXTtZcH zDuR9mgGXTD>1q;wIg&_F7a$gsAUA9VoDniyZFkmpU+;n~5s0IW-D#2g<=9AwYLmIep z@68|&9hH()r$2FLkdO|Evrv+XBz2hTU zt)JTCp;)_A?@fU~Y#=c60JT4K4A?U#Tq)3WEHeRs9gTnKL&cov0w?@0I(!*g1GlMK-HVtJ0`7G zx~}(x;5#32=o!i?q-2}a($jH7=gEImf&c-3_!KU{#`M##z7bB45nutUmm|D`l=*%u zu3_m42CubHI7kU+u-RDxT)73??+Ml{M`W5bJ4l|#)8uJj3^y)O z+9ML)6aWVnbFxlf#3sQ#vINhy^yzvYJl`pSi2|xu2hmRh(|?6d03{tpcoP8niaMsG zM{bq=U0VM7>lZ)%@9@p{yT_kww-&svxE8|I>H7LQwH9C9CGAm%512@x3azUf@AuyR zbeNsk0*X;AmZD<`HI|6Q!eIIs>`7Jt;Xx>X1gN1dsKVc(3}OjsxC+-Ht0qIC45*3B z*saX&-{ZZ4(@KKtC+$}7^XT;gMx0tp8^CPpdh4ipzbMnqjdmIrCSC0O{Slof|4T4v z5zPL{(;FuvcKZ}c!3UrF>~<%`V8*8IM57z*)+d`uZ1_jwhW?wQ7_1FG&Dz*HeH}@2 z6xh5&pgGP>QJkqk5+12nw{H$>2k5>kJabFiexn z#=ffZR&sK**1_z%ESzPaBnJGs;JP%uc5 z0*OWZwCr$@U?(PQ51~n1Lj~@mXr(zl001BWNklzIhDTBhm!alAGaJx%~2P182;`WS|=d(-1Bc0^JslCsQo&rRyy`f2OD1cYey* zeAWhh7vM8^{iqg){9G9X5HP*Eh}D5#6f7S9jg{3$kN)DcTrK#WEFe4SparMMnK&wd zR11Z65 zcRHQJ9?{TtrB9dIeRs3CG%*$ewLOx6!^g^9IQb-|dDEEeO{<}~ySK{g3+0{ty<-=; zG_3D&x!O*^<#H0hxP3m5UpznFFWdXatqy%-W1AJo3rpK4&1T$&wR6 zcVPa(`{xHWEFGSRhH}6Qli3XTnreDbQPvc+cccPJCW&kmga{~wOr}~3g=5Lha&*@l zZyVRz-U)`V+StQ!nenfYR{R{!W{p7P} z*d(&JeWQ>U3#V3q63qHN|7Y&ne%eT{_+$ToNPVgL&`MQbd8kyWlCklOJsw{PV`dY) z;DP$ay~XPVy0-CUN^CsN24mw(fDHuVrNrC<3Bi~wS+rIhX_dW1M1(+CP-qg!Hpxaw zls@#FiPFD;v3LM`gza;_^PS)C`<-*D0IgH%>T+>{G$e4?8@&RfKSwDj6G0MsMEACE zkc1G=yl=}4Xb+5`H&>VpwY3bE@9E`IL&AjVkQ%ap1Ww-Og2o`z(P?cc{yZ^Tn92(% z;X~~%06oO}{v-fDlyby}2Yk3|m+riIdg3~ThXf-dZo5*ArR)hOrv^Z2)-~(8HO(Cz zojsrTbh_(1J3UqujP`W4yL)Oh%_^E<<%B8d9AW{OktYeQG7|H6Jdq!-Jp0ev5Fm-t zSSkt`pbz{n6UF1=l_)?1J|0LT4-kjl0GUQ`05AN?M^m}ocTKUup&`a-Qkad{%2K8< ze`?pZ$czp%b_y7+io~c3T~2~D)Ygy|_$IJg?AOPT4fxduKKM^%S8hWVfW<*3%K6W0 z>+3f^a!Si}I8I$bS>&~l^^&ZfRHM(ED4Et&QBk2H;G;ThVbXYnv$Dd(aZ;&8 zkM#nz=1);KU}U=)OF~W)CW328$N^af2g6Lq)vFuZ+1$i}FFOFy^)(*P;t4J?b;CT$ z_23bjngMLTy7TPrU)$06kp}Ik$t-sJqjXYzHyGI?Rsy}hV(qa951KZcnqo~&4W9Rv zffBH_*tis1Sg=wH1S_XSuNoN{foJVsls$bDEiJ;^7|RZ<#*s375VQDEI01xoz^Z9!}-4k~9?vBSK){eUN3PnAt5A?K5 zt*UY38V93ajWum;Z0!H?_;7Fg(W3*ncHrmH!K3ZH!^6kL{rg*6krD6(NoP+_M{@^l ztcH{TT$!S1O*`sME*GEteCJ^11<;>N!kSMApMNzcFyK-RFf9Ds^2ie() zzNmL~3HD#V-;XJvFg%RH4wUgH`RIJEF!OTzE;ehi#+nE?&<9DL3Bf66-Vhw08rqa4EO-nk$Y3KtB*H5 zlar%H*j1QTg@KR~G@-6P)uGKNe}3>)UV?vj$^b>q!MMegS*>iep1i@^6>98s!F( z;w-hKlq3`ssbPX)#vnF_BnYur3km=kV@qSr=RMZ(y`$-cnG|N;0gTa#6x7orDRP7SV_qLC1-9(Y#(eQMkko!89o1UJSK$&PN6-}j5 zV`HUxxUly}ZV_H_Z)PgF`|4m1++g#81bhFqYDgAmMOzFCvmIq%AD?*sdLD4WRQy&d zjfjBv#`$!>8v=LW`FK3KvXV~2rWB9g0uPxkyxNb9#AGS?J< z*N(g@7ga1-?1)$*a^7Vg>oBD_TcDuN~c4oY~jp=9E za2V$+8{l%eq+nO0MM~o|QKCYtHOUBrPT$`aCK|O`6ohdU&Sc^!xz2!P;YcBp28Eo& zHeUo64mUPJ;649*ZgFA?(rdxzAK>GHkRQnU{60v-AOybjtrVBGKUV<0g-;8*$6WrH+64jd+R}i91xGig01PrpS^irR&;yv3TT1v92UGzP7h> zw6F+aez7z*915j@$?aNE@G&i1>F z$q|poT~kStU_PhQS*vRWXS?wI^Vbg_mQvsW-gtaT$O{4SG$4}}&=pWunDwo~f6IOLcOK$uPvx0C2QodsPct)6M90YPDo!|x1 zaw#@!;p8q<09jbGk)&FxMs0)Puu)A|ESya1O5j}yS7ndH^kfAVTHlHfYc3G;r87}K zCfum#i+f?Y&b)bY)?@X!D*?fes!a~tpdCP?B(m|#_N#2+C$Ru3;j4FkTp zbRaG)CB1x7+^6|Gm=8=iEI^8ZOdli~nP@asnpiB%E{^RU9PV#Ltk(99I$A$uG?_TF zyCY_`Rxdw&J71VjMdJd$;^V~#fE2M`e1l2hel7I*t=qOvLzDYjvf~MxB;)k|f|do-#H$*dzrnQlW7))!N2tjVw;% z>1TCHhhsR&Ga6v~>ZUO%p;A*42@dpA>zq9h{)@SpOxWY`co!3B^N0h*4tRnI6k*)% zLaunUyV7D6wJBsWH8!qp&|u_$`sJyY&$E#2({Mlofk4Jnz939INWfq61U#hxK(=t($;E+p8pvDjMiyC7z`S`&p-qqve%XT)#Vk115hKgMRfHga9A{Hz&>*Dy!+Ux2|4Y zxyJJfCFe6%V`(Q)Isk(GL;b8qEMp8dje=^hSd4YR6mSZ!U3yv$S=HwwYwF7LrnFjJ zQf+L~vTV{PBPr4cfVs!|)!Sk*KM!Ga#G8Oeit;_ne^fVE`V4S(o%O&t?;jo&7xMo3`2j$J zy#o+FdgA~KduQJu9YA9WK*ZR>>Rzj>UIT2Grm>L@Lr^TKqX;=oYKEGc%>-F&dgK}AbQLl z@pyYj${pRxcCR=(LeLlhXZqWX+|<-0qCI>I?>08z_jEd+&-;NIOnWhukCdfd|7aLC z$7F7!IP%?(Po9PV4m8=&luRoWkZh`#ULO@E3w~h!f-n++mpieTzXFTqCK`w^Vi8Iy%M)8J67Jj2g`)*KbdtL-3=3Do(fatp=cOe!`V0J?z5TmU>Ej82!<(z#sr-`oHC zCm@bt7K_q2PGvG%MW(sKQgJes!SFP)I4Zairq0er2GDOFN3UQ!SV$i}c9~VAmW$$) zQ-H}5F+(XRl}@Q7JI}YAZ?T^bnGGGhoHo!9L3Jv5Wyp0B1;PL8!JpkhB5?2S?LLZ9 zUz=E7zWeAgtx|EYzz$K=T~y)M>j#=2wfzvmk(vMlierZyT7MMn zDvnbN#pzNBLO#IEuz(kai6GV@K~jN#I5WMF-y3vw6Tngd{A0xv0ATn*h?NSWt!PFB~PmRR+g5RH&^b0_q#y{+ zHY}Hux*;6r1)$buB!T|vl+L83#b{#{GCOTF5~MC^LFJ(7f{n7U4jZ;mmT_dK+z9Kx zH!?Mo3JB=HEqNf5M$qIR58{P?CSBb6&#UpSu6C1=FmQA<%G7s>LU*?pv5_kvd@qpj z*@P#KI&CVI!iEr~_XoSDCdOMs)(>tFKn~`f?oe0HW!IHvYyjUSDz}a5y8M@kJNt+K z4HhPWKCb2c{$N>uDu?#c^jdmhGPCpQZ!T+F-CqZN$t1^7#x_yt;{H*w7z+q^H2}FF zQZ7qMM0)4rfgs>jPayW~^Y4L7VtJ(V97$AG8L+*)R9ZaB#GG`FN!Dw5QKi4P1`~mX|ADx#I{4@)gf!>VIo)XuL`|xJbWHc z27PxAAjS$pIGdizzkKAfwkt`kf#UmEou*MF`os1B4#IH=AYS+y zz*r9c@pZ_AkEJ{^1`>z?+anK-Nl(|{2o+dyvzb2IL2wEjlEE`X>jy#b7blSkVhH&4 zz574~*CF>;k?Jod=GO0bNC^dnQkRZZ7#W@?HB{8z8Kq9^RTdmB1lSL=AL@M+P+kMJ z?xty*l%jOyu}kn=#>U39%~r_&Q!{?IfKM=y5W*QxAP6ig5r)K`-73D>du;7#Bn&iQ zF^+e(TSd{m=L@;5>}muE!u-21?vzNxUnovZB@XuIlBN*Gd9%4ur65%@hT%Alw@YcB z2S&$pJfAdTfu7H&t?M?OzSMf@Ll3z>R~#NgI>^n;#N6TkF?X#^X{1^BN8}&OAJ}}G zt*sJTx|_BEn@hJHV~+v`yrQfS$G9UmA+8}%M!*pmaHB%Vl!D+jrGv?gu3OQntz;4_ zsU)N0m`XNgXR|w#i?jK%=TNoDU$8$=WmQ{6@xJf#KIfe0JZBu+hzA4FU^pDl7E8DV zBA!|cgE>q=KY(B1x1~Zn9>5%*d)hQlgJbABNK~ap*(qh!&pqQFw;tKi)X=$@CruB;o z2G|@;XH3SXzN+1KceiutKqwZ?m2zJ1IK<}OKn#A{KzOcP*x$Wu?Nf73MluP03Z+7u z`wxG5IFs|G-LY{b<98s24+0>3^Xh0zgTRghObn9}thS0tHKO>gtwmt2ruZ(Ak;MKK zmV7wMX@alH(2PLU4NSPO^h0jGJPu`x<;65gJ$?z@cDvo7^xWLilJEKJN0CT_aA`Ef z`GqfCz$aE;#kZ$&(S$DtuyuQIJp{LZG@Jk)2*IRps(kQ1VpXS7DoI{Tqu;fXwumD< zN7j%+gN~(Xy2*haf=))?jU^S9r$d`s(J&xmk(j z6aEJoF$_7Bo245%%i!fK7fBqPLc-G=f`2~(s!|}hhH@;MuNzcpx)I!V<2;B~s zwjpdg*xRKmrQJ>z4XQJfL`7f7aWb759({vjz|)5_E*v8xBV7%wzA~oD!ik&-C(ZIB zBOdto%LSl@f_gUiv`J(@~o+FCm%Tvq4NdN#XVX(+;= zHGmCgLHx_-MU{Br&Amu7%K>u9s!5tUAtI!`eoB5;INd@rESuAu*OSd2* zUQ#lJ7LFPUiFvlpV5B&OT;y;%2$uqCAoEmRgZMw5@Kw5R65*gXk-iZc_r;LW!}>qF zwQTPfDH6>F8Q#;^y!&QxX?r`KSPO+>Se^}IfuLA8{?|oUmDR4)G!rJ3fq>U>yxWzp zTh$E?oc~dY0IU^pNafSI+-Gn0I4Y{;6#5aHm^M?B178~Y{@?#a$BB422=Lq6seV6|+9?k_5SiDLG*74;^_A!x&rOSoAN0Fx5M#+MS z4qn7@nEgO|42)h)@d_P9scQ&j=1)TmrSF0>Ln&lB`^3p>8UC0L1_-D)2%pIiTI>}3 z+uzR&)pk*4v)|9Kaz@I`o_DHnBA1quv+%)*EGe<|lwc%PSQlzkkSY`W4E=x+axG>7 zyLpGz`JZe#4J;}O>p8fNqN`vu=kq2LCGS)@eVD0o)bl3v0UaZn2CTNjabW8Z@L>x_ z43mZNc%eMJe|i?!zN1S|F)FDIm_@=*TPL49ehtricwWDLdhfxLCyy!` zz=*@4R-4hiLdu{Ig;HsUyTGyf^4*URmX@NvC|bva1A*cB{6^^+ppjV+{f!oXIoeGM!x3(D(Zj*Ddy;B=m>3->+7@1OIYA(`&i5g$A5q%FfTlZp85T zC$KUTh=#qDC%CwjhG^QORH{sV(Zt}=+}qyPEefR@8<>H?;pK1>ThYK^|c~Nx3{Zh%3gVWXQyK50!LBR z)pZSOI5$mwzdLdEQ6C`S)6+M1Ru?Mvp<}(XUu~i^NUAd!4Al(9Q?y27R_j?f`iuru zKs2ds@9iB^Py!rF76$;(N{tHbMG5Q_B8(av(a^ViGn@}%uWdzL8-Q>wh6=k}sT3H_ z7Y;j?JtIbyL{R>#6j1N2{iX60_WEKAa3~zOlUvN^kN;__vU=2VnTBZd!}Y`I&CPa9 z`gA;gvA2H^EfhC4^7&#hUoI4~g=`j8LHXj{jp9#pYX|##FP;LhMR5%rC)4<`cg?9$JN4_wwJqX{2Ls&-Xnj@BV+fU78xbl*U4L0JE_ zH8&uD+g(_KOQ2cJV~*UhU~d~ z^28w@En_}8bsfcFD__iJ2*c2Kn>WARI?vP@G`3!bA(TpG4NDW%q=nIFh+e|b)<#G+ z8_Dy$Xrc6CqfD-9R?>1bnO99}i0-;cjkW5lgW`NTS;@jjqfsof1P0S^kNSMWg~Hwy zYjYi)a%RSC3^`!6?j95i!>|^x12Fyz1mh3O>qoZ`{MG$hi%DuTSsJ-cxX7)p`|tPO ztQE_}d=YN*?Rb1<<{xY6bkG|tO_g%FXmk#RLFMvBaVhuf-irrcyR4pOqhKQ$0BFWS zH38gMufI&>m*(T>3K_Tqk=|N5n=d?n8j0w{)DXuo64^T8YJQu{XTxyr;f17c-4}I- zLW9XWgYIy6JL`M#gX?ndm>}R>TlBRQGwR04bx8mQu@1K@jTT@lZuXz#MG-psY(lL~%?(YioD9 zrHw1oY1(wQRkzJHZEdyLPOI~g+2^&hGy5l)m|&t8!0j&{wR|$_NY_v68q}sUoR9YslwQM}Uy&MXhghGl_)XyB@MIUtR`;K9gJ8csFG1IwjGba1aKKuaB(n z>;|5=^5XgHB>4P%GM`SQ!W`!xO@#eXz8H;qP=%2%zUFWD45$5pa=DPp{p;cD=iA>| zTy1ExWCL1t#9&pHegKtsb^(V5&`ipD{Fiu`=gNiTf8ISFYF7y@bq2cz$6AfuZ%T!7 z7)%$1f%VZSDh$I9fY@L%v-NDq)sME9ptUkm2CLW0#S%)_J`M3tTjQ*$wzXNLr_Tyx zGbU9~)=sO{HuR^%#szU&8Qh)y%H1CNZGTmk0v5Anxq(9Ac-q>Nqx8In`CB&=ZoHyC;EEvK+p;G z-g6urbavxAm#dYvGsgdlP5=NP07*naRB#`drpC5#eQPzDcNdXrM-Q6F4CHe&PaZ5R zG-_3>op2z10j5pWwJs*jwZwR{M*5 z*b@r|0yEjlYG!Nu(eyNSNiZ>tl+nmBsd)qv!Id}rg+dv=-YB3_?{YjAOXgm`03e{T z+YNRDLC~FDt?xe+l3Y449O&Uu9m@{}fVxNB!P!FQ`2*LO4(S}I55)8+RXxSjni?8S z6ya!UYL+=po;+zdcGjwQbXd-qeZIaLTi2m$4*9ht1VrEyAOe$f_iwB)?G1*{AspN} zZpT$EcvYjxq;uBS(3*Ogolw!LI>>i8rc_aVB!pC&PPY4D?x2W{qB-Fx=<+{g$;Qo!XIJ-Yt_TgBI6xi$sFG`|0#lH}ZAQV^YnQ6Yij!e9oaSh+B}-S28O7^G$-pNN=%m7*xPeOw_X zWD-3|XzS{bns`e~3$4R3388LpKXggpe;+?TSgtiON6f-{U65ZIV6lT4=+nq{zk;q57u=M@2A>)8E zL>gGi#~OSjc)#VxjU<3QG~HR`qw!MQ8xE(^^Yh6pDiGeS0357TDmjD<^7HfQ8E{*K z*}bLNiNfFaBDSU$0Z?SfC-~4VDhyZIj3V~sFPUs0;D&z;2YH^GFXz%v2VMPg*3Pm9 z0>^De{mW8eBIpJz2+oi29~Vv}0{&odwtRQ%y3tk>q5(2cEJ6E_fHwT*&{29T(7(=3 zk`4`6FZIHob&a*s6Edvv5NZhi9s-Wux`QSK@BMXraH{v%UjPwY7}p7Ookk-!0e;a_ z00(Ouq!`eCR)R|YNKA|{$T5tN(;=T+DUqwlgYF?>Ky>~?CJ+b)M*% zE!^LDm|F@2V!`DopBP;nb`ReUJj`ZRS96=e4?pj`eftXa0{ryT-u{OlHh~I&sh|PC zpa%j(_8a+e+~oax7rq@IGy@8_cJtoKIIgN5 zw-aJTM@Ov%t$J5tfXFl~hPP-O7#8XT60agy(rTsTI)<&MNm5=AS_lmo7hY!IfIab1aM);Zk>?7zjla2EmTIxgV2@zq z=5}z^FP}`TW+yoA;{zeUN&_OVZi7DhpeHG%^iKU`*Sdx$t)Gn z*g$^iZsui2e}i;zT#eokeaN?2)a2S^11z|c&8AZaeMSHw@1-{`;mbZYvd}WgV491nN|=I43lWJ zt$OBoFCo?{9JtQh&<@<} zRsOzf>@%kjqG>={^+wT;u}mHu%sUDm2smM)klFoG)YU)EXaoago>I5DL__!Y0IorL zkM}GC4hzO&fbWybJ8$mTPknq3L{CGmA^14Znl*~LOc#&5+Asf_8a})^ZEI^VnH!`X zRrnN8L4zQG6>A(PlwHOPyZKxSwW}go7_T>$&n&*^cR4izSr29+$cKz;dzlHyU8pm- z=l1PkxBH+-3_-1&+j=Ilso*R+qzbfLht^O!leD9uad1$rsBWvmWhZU@4Ofo$Vr|vn zLcpOhZTp`O*~swkDBzQ8SFfUB;jb?{WW@2~7r$D&c-pL2R=1l?BYirB4vEDRDzF0F z3>obN!%%2H6!@t`7I8%C(3_`~my6 zPo1>sCQUjdO-Lup(uOqI4g^87&=VLfawCeE3zuA!un9$CsAyqgL~$5`GeTH*V5YXv z8cPcCGRW%aqJx*&(Q&70&k4Kb{t3MB)YU-u`JMB9r_cGmxmRu!ynHn7(2!)(CH&MjciGe}-m0xk@8sDRyTAVY?|2!yn z0-y@A(xOu6EZD&d1k7;6)pp|G?k^8laZxy#toEs<3eVp}-A6@U6ht}K673}}uT`eQ z*am|CXT{?IOq&LRdpwdYRvvHIwJBVpwxHvYQg5}gJgqru)->DNdfFVMEgH2^@&IEs zIe<;q)az(lb!B)TE($^lxb@XMy#M*nPe^9-z=?D7^XCq-yjdq1aqL?G516B^YP8OC zn7Y~%WSyy|tFyB+lcOO3T)OP1C7J%gO@|j>hIX*T%Q+y5huSu*P(rTS1_Zsj*}bVC1;p?^~U% z6y7}>!WB=iv$@ftS5OQmb2Xh*%3`GJOhCvIs*Y~&p2dt-)M9dIW0bn1-NVD(XdmzG z&>lVvw>NVFB$%lE;LC@zGr`E(8k&t|^V!+TPj{|1Qxu!a32bKMkUjdWaBVOK+@kzy zu74#ROGhFRAR_tvbZO;{-OZ00S%E)-W3vt*gg8HYYV_2RIy4hYbTvC$xPeLj^l1fM z!|E+6b#!8%6@d>Z;CHt!e*+P)^u?!AbueUp@x}#K!|57v?w4v&Dx^fcx^9GmoX>~? zqm-x`#?_7sQYxCJIJgQoikf)vhZ)GdN|KZ& zH}SXCS-^iN$aWl%c0N{`dmr`IHv$aDOSncaF|<2{AaNlXgBlSFt`-XKUYsO|zTu`O z4a1xDW@|-Kh_6fv<^Ef6hWdlBwGATzC} z-Ng0XLUB5nT#Lh>?DGL@Sbww;Z5q|*P|=iBM~TF4X)22xCFb|#ef~ip4rh|-bTBwm zdaxM{@p_In26!F=pcMiDv4EcLs;#e~L`h)_+2lW_j7J!Xq(q)K*+TnFPyVA1DB#xF zbC)k)zJ2$4j-%y2-&k5)8oJQM2^7%&me!s=6P)*Ujlm*`2dq{Ftug{Lq^#_SLttoe z&+=PND4OizuQvgF;mkJxruZ7luT=?tWM=*KUHe3vBPXjkHfQOuJAbUqB!RU9&YK(;5}K=M*RKf(kjZ)CIQ#veV%y#;JD8Rh!Ak#&b_Nm8Vf@~ z!4LzYgB0p&A!iyCF4|zA6$*<**{v2o8xT=bx6{$u(`K`I_t|jBhZOM19uxfLiviI< z5Byo1ht^{NQw9lXw8lw^DO;1nHc^2Ll&qGe2Q=+n)Sez-r z)9J5@KH(U+-xu@40f)!6_2`~EG?Mv_r38|sdx={Q3qk){9OZnm!Fq8E4wM!bOhtxc zxSAGs0?$9nc7^e1&J;>-Z`%pygslNvkvJ40at9jNoXA5>=b1o&w#agd=N+vkwXJWs zm)LU}+qiQZ?FGy0TU-CAR4UUyJ>7IqoDQJ$A^a`~v*oqfvB9d8VA$hHW~U0T??$_o zLT*xKp%B>Y(H8~GLJ{0%@>ewr_h<@u5zERVZ&M3hwHiH7<9OL& zLsNH?+0xOWkUkqw9;oZAsdEUtsdc}Ziu@l6_!tL-zgk{8#?_n13pW;VRG4#Vs?wiQ zt(tW;;+Tj_Wl>4AhU{eYW}WerqsI#HA5I@_JQWBSoy4=!R6gyAL(MOTQPkD9;Pd-} z{@7~i`Sv}xQJxgZ26*-cd-TW36%_Ep%^j!!Q>9mL>=Q;69Dg~G($l09s&6rUJnx^I zi^qN0E0yBozq;*Sb%Romu7o*35a2Rako3GBC_V$wJz!QTwS8Wck-(XNjm^97??3r| z99Kt5Rj;v`nPQ<*d~i49gxAJ#W`T7K+wK2~%uc7#l>%jfF0Ia9yT8%fgf?noDvvMrGeDLl(bZY)mNY8pmX;QcvCrvL z3kP!tD3yW+fM6KzbDzeQ;g9xJ3i!?chyX4NF98uyTQ8jWe0lLNvZ~%3a6o>eYS;r^ zT?#|M!bvWdoRCvBE`&lJd$*xW9ibIaPUl$nK^(Gc1#WP~uy!9$WZ&y@~@fRO`6gN7sl2K;tEH3UDTfZu;|dvW>f^77}$WX^iw-2C$L;?M;p$?%x-Nw%#P z_kFcyTGh@aR1B?Yp;a2AS>&yZ%Y`dq?POh)IPuHP>`MQde=zQW2uOSS<7XfM%HeeJ z+S9A&0~{xEVnUL2y~O>>`VX;KyqvDeb9hSeZM(Nk=wvMtM~;j%G!yd=zrC0)$CBeg z-`JJX^wX$);yj54(n3y_^^AZ{wi(viKr)P>qoe!3%0Y)Vw{cwH)p}Jv=>++PKq5qjNhx0r5-VaR zvsxQ9sZ4N_jb-B3Y+@=~$?jHWGMm(HYWEzHshOW37Zewk1^u3n=Q-~=&q)59cUXhS1+VU>NIiwU1n26@o^vc_J(aCd*r!Xr=0a9<^#iAhn5(6 zUnvT9zyNV~2*98lMdl$CxcQabi_%mtc0!|YhK`BRa+=0XsFP|F!!-4ssUf=utk#}+ zCyo(A`jiC}HI2Q;Yr!Pm3V*BxeDd(lH(y`9{<)KB3Ve10qQReU1xSUu3y3Uf=;@L( zw5s3KZ<=H@Dvd_oiCCJeh2KmWjl(ejZ@pe(tFj3G;Y$l(0KT*@Zo_pAqQfz_y7WkY zd79CwNn@jQqJeP!dmT?V;_$(vEeplf{T*+s23OLs6ctE#ru5u@zr)6jxJ^i=@|nF| zi$#m#g!8k2@xTN)pd&J^R_iTUEL9DWbBSA!?ccmALaxta^IvhZP$>A)4itZnltVWi zCcMa$EAT$#*D~umhH6Y|B+e@r*T-tCkUd=w*C64eu|r~!VE|=7UJ(1BCre@ z`7oOf?>4}=w%p3|opW6>NemF1g?H_B)2do!3|K`>O?pmG>94-8+=bkoUCFP{?LE7kW<=*q)xr=@_Raz71vOAbyBo0yc3Rm5j@gD38c? z>9O95VtF+rB@3{u3f){nTGa}pv9GV492x@Np>A$BsYWI8G3)Wt5d0+s ze2@(J`refXhAz%|>CV-)OShc3FO(!bE%N%hMyU>apeJ#w7}kK56id;yN=DYw;sO3e zHWS*ncT-7+BO=c6{&Dv*7y!frlx>)M_BZd8N@8SZ12WD`4}ztn3ifoNES3e)!MpNH z5A8fHx>M_gAPwx*Zl}twb*KHDzyIN^x+1_4hU0wIs*w5U)@xsHGM{izj z=bx=sGO2}PaZ^Y;+;H@^NYu6wk3&pHO$i@vAn=d-d7yCV&CJ}3-Lb9&#hE#snU#zY zKOGzt(rIiCu-gS!E`Ru_WbI*fxZ5tKt~=NLJimb5VK<`@H}0LXgJIe2b}@Xg^0MUZ zfviL~F&s^?(t4WF(b`T5s0c}Q1+iH|tL^SiJeUmxmos1yuO8d4VsB_L4%>SzO&0Z*gk0aaP(7{?cW@xv#aY6@>2^a1MBmp z3kC3e2s?bFEZX96U)&WI!tlbaGB*Li^S>_LKdl>Cuy3Z>!E}ru+M+C*)ukYU?r6lmFF?z}AiHSPQtqN&{x+ zr(fM!`}P(~k?NiiitFf*bk)~OA;C?Nq@s}|YvelBw5pk=I~Wb4RI1f#D`LQM1VSb5 z=Ro~mn=cCf4>=xUCDE?oW_2?|XJ^iywVpZ5&n>@>`yBUuE`B+lTiqkP4XE7{pdeYs zWGx=B1gqtvB&21`YE_MneN6U**ZBBHR1Dkx{@MB}g8XpU6^}35#E9JyvX}ip=gJ~D zsL$ncB^R=(#SBn^WT8+Fh2nUZBZ>!^JxBth4Au}PRVPcOqx=GTH7=3yZ-f`}&v*0< zj1DL%?mpKNPYzdH0?=$cW zx6d0JS#^&=$27<(vXkzRO&HW>PNk*-!^447eX2>w1;Cb!3UB_TPR^!=V<>ho?V64$_luBGAY>8f)D&s1SiGiKs>~ONXX@yD+2AW z-2JYSioSh&e<2l)MBPyYZ}%gcl_Vqq6he>b7)D|xZf7&$GW;VPWw43K)ti@y5gm)N z#G06yv4DZ(T=;viaWTsC)!wu5aWT1=|4(T^!$2HSvYyi(k3pkB5fy_%Lg{o0g-T;; zRqHytwA$e>zmx?{)?SvCNt#Y*y}v(B8iK!S4XREG-ne&VNT!j@dzdWoeL@OzM=dw3Fc{PlFaV3?XKoJ> z|M?Hgi*WLld?uTMlP~!2n#LiDF8{bKD%#U_a8o{>EEeasS2FN-nS=ZPJbL-?e7E+- zy90rDVRIL57zftz=8<=xS%cLcGjo!de^=QIGLfFK?}b6S#I`EUxNxUpTwHz5dR8Ggvlt zlwl}!Uni|I#ZA1qhgGRq^mnw0G94@j=R}jLm-tsLAAbHEn*e1QE)$|^G;n29K@s3- zw6jjZ=$FWP8*yWSj`P$`aq3i3lI_jvp&FSoL8Z@*X44{c`r^(}Lm8w@oQOA3abh=Nv zX+sys@}d64#o5`}-y9|<@KZ+Mt!wMpD0b7W(Hl>n+Ja~7AmvAEblrWO8q#LN;bG3^ zZeW3iu4c*2a5y@Kqd6`PY=%11f$Go8OKrxRhD-Ry-JC2*g3_Byx=D}9t z+FlO0BJhQT65Sms7M8wn%%1W4EfTIGWPneY@$^yO{rJ_Rzdzo*U)U*ZqPD+WM1qN} z+h}9BJbXF|LNYBEi*wb5T%o+PvzK`J?URqT-?P1H85|h0MaDhEiEqo7m(nHFMnW5FkiS32W^hUH) z!d$PCkaH_w0E{1o4MDxb~0l1LPN0^DE221lX1=m$E>^QXlN5&@C?h`joHtbhl*mqxf_eLPy@ki{ zpLaOt<9%^EW7aczt)ZL6MjG6ks_qF*^f<>OT?VVw+F&_(QaICw%e1jR=!EMqm5IN> z0Ypb?y9q5|YmAksK^{n;M&ra}8$4vU&NyX}B$hRqC--yaS1s-ou*#wn1+tFy3q>g%N z#;9(0Ij%lY3J(rCfaa=l5=#OBO8{H|0I~|k>i`H+!Qjg3Y5@?xmaF~%*Z%g{|E_&6 zJSqm)mWu+8xz??@o~$k;0R59bSq5RK62N(GdVlDbK{mv{;WkX?%UlF?Wo5DkD608#E$5-U5O z?njLFIC8wn4Cx}yR`;rNa%p5FjiveC{QWQ2Y>jri*dZEc{1(l)<4-Tkh5Wr`xZQF( z7z`-5Rdh5wy|Gb&SK6fqG6CXn?n{s#NHjz zC}DirMU1_yEy#hGH;vn3lfjk3^cQQcsTseMkYHoQn04$(Vsl*hlUh=3xk6L&$ zD~jEKZDsgn*&^Uo3`bkX!lPHf9%b+WUlYR(tccY>Ap!FMjI+PLjn>q2teOH)5G;(& z1+UNA+iN-JW;8n5*}n)cu--L`S)oH13%GUX_O z;-F9L=9g30rI$=^RAT9+^wRP@AbRC;Zsmg)Pd>VKvh{Veptap*(=#n3*=eHuA&C{V zT?X21XK6BnFn$ZH&Zi{3xKwx~y0o18^b^OBQ3Ao)OI&za%Xu68qxNhcK3Cv8`=cFe~KTPo&ELUDHH!01Yo1s`|H1-XN@!GPTknvdT$=c zEe-%}1N;|219bE|`Ov|L;p8`k`fIEDiv=qFcJ+{MgvQQ@3HHK zotg^S8Od#N47{jS6G7h`_<^iEQoOwLDB|cbx-*N58ImNmj`o*#7vw9?HYp=B+W>8{vueN>sf69 z&?u3LRpjh+I+(xr<-X%g$ZeNIm!mGRmtR>4rqlA=T)vk3+A$z-22wN`Eq+ z-DZ804tEBy*gkUvK%vu+=?D0m0uvY_&gWK(QCUuUl|Wd*nQY0d4}1QW3g3L}8Q0Ph z!$|(nRL?N+>~0l!qAwc8LObt4pvcPG#r_b}87GJS%iPuWv~gwOAF+R-KcLb|yPt*` zX2x7*Y-VE5ctn}nb3tP;!G**l^Rf%(#SUv5tbpxFu-8V#1V}`9F$ts!BqTiN*O`FHQ$u`*PR;gPvA6ZK6#%rt~V9PACoBt=mqdv1y}iUm7@s92PE zjAL4udhe%|4e&`o8sU^KmCAdM{}Pxzt!Sp**f)It)#2TBGMaSr@NW89ad@C8GvNL) z)&`U?b${hrDm$_>GeSB-!1m9UN`>@fZfxWBH(Ns;L^Gurb1TS>I0UcD!wGIuE)hL& z03409%{v8YAl%i+^^fD$Rzu+hw0GhzpWF)|z!oup3f99F=o!%AhdfVd~uJ{ldlUf9`5 zU3>avrh&&|NGukowShiTH@=*LU04D?3RbtW`t!r#0RVxl&&20ChNx!;E2SmichNlA zERv)ng3tF}0k=Odl7^qYK;P-%L05yz+k2rmsF|{({hVmD&&~0YB}sNj6d8_=$Q&-3 ztZDjWS*F2`XI4t1+0jxKumwc)O_K8MiA}o^(J1`zhv)Z5*0}oPi!1(N0a=I$rz6Cg zQX8;@)#cH%g>*ih-u}mAmUIt5Kp4x--2Uca#;fpHicKfGC5a{a;hc>GfU=DY&(n3L zsgOb%XP<-zFD}}hoNOX;+ZMI<93d|FR$st8xh_s}0hmVPC&*ygMN4uHz#=oQdc+^A zCyE>VKvNSf>X?QwhfEVkn9u}e{c=zty6vS>92h?7_}WiH$X!}q{p#Dypk`TiL`1gT z>8BR+>udY_DcItf^7eLl0oHNLElEYX)}}E5h;5zp;u5u}vy*TDs@3a{?(Z)4yaxF_ z{?_JBU>}|2=08FCSd(o##F{E1eT#_WR7KTj8d#nd`rHN!HEp^jaPr0aflH= zI*_2W&K?~N!8b)gQW3Z_KfinPcb4ocj$gTPYxj?f0B6le#NZlTuH#dTqqW=XRe{kq zFi7^p z)M!@HfOsUqO+r|7prWL~OUYmyg4^w+6tkG>mzez z_)R(xi~wNZ{GC(dKKQT`^Kb$_o;%*bnLdejlEk0rQ{22P+p>=hnc&OdTP?|yoBF61 z2bU}Hv9UyHf2;r$zm$lkNPp-utn?R|Osi`ys1td=ZV0O2Yb&XAejiw3I+s}e>TiKe zC$Czv+O2AAIN<#L@b#?M_+%9L1RyrpnO332sT3t_i*r+?bPRx61*(o3g=hKr#=}Xrh#ZgSq;o){8D-5;0i1%irY>w-`<* zUlSYTkXe(VG>0K1Ra1FVySP3&vy(26Vb_KH=;YYO-LD^Rsal;ZNwH)%;66uVJ;Dqp zGGHeW-svWdOEeOA2n80~74Gp|95>xwkDcKgJd?cgQx2~A)3}1 z*M$ogrbIyhd>u`*-u77c2i?i6R@H^Tj=?p(cjG33G!>Fc?o#&c~Q$yj$X83VXYriTBo8aOpKHA~(6>-us$mmVR( zyOhWkzz3uWlP_)VJ$e{mi4L2Mc!l*-)OQD)Yh=Vzr7}{^f`yZN0|Pi1#D<}<{IR~k zv%`h*5{a}#Ii^zGeDWwW)Z(7QGC*#GRbZr2tXlzpON86i_9+I8*h1h491hOIcop?Hl`lwH<>qI>u58GHtFzASb|4N~wi|zf&16)6v`8>*oov7&Rrnw zqJ|-Gh~}AkWAIG3(`1_)+q}5H2ywW;B=h>53sy#SH8^Miya1MIPrdG`-5HT^DAYlP|GmDP8_Q?6VbAx$K$cR8 z==I4`JU#C3Y$^>rcUnw79W_t$NYsIFS<(f>!{P4j8N+a6s+mvf6GK1R-?d|1x)ePiI7(*-uWVs-uptxc|V;Lck2qG2; z%M6u~Z~zBH19nnd*wYx-on+jxV<+y^ohH-THqd+U3@^O_{71>Vd%92~FWcX?5uC{Y%fiYUh8 zoa)L2B`w0^{1vsI6Gn(P|9!C3#7Rr}*%B~lW@r2PM(nIw1*QaSKwR9w)5yYU1)jDb zMy6@a48*d&q}Oykb=Whs)okSfb3sYuw|7?mM0C3fJn!WsL4c?Mza3JTVOiE6iQr@6 z?6e6d;uMN>_&kzi8yaz{XZq<*n+0@$DX94T-AAWn`2Q&2@I_$j52saFfY&#_ZzRgP z!eN)C3#m+KDA+4G@bqX3SX)(aE;j|*>lm?B-+59lCGxdeGGA_IaVCDdsFzBawOfG8 zCulsHRGgc`&Eem<-FWZ48lEGO+0NHiR_mXBaW58i<=l!albU7^M1cc~*-|l&>kHcD zwTF!_Hv%V|P8xUo%7w-0(K&&e1MLVR-^(ACt$DpX#dCOGMpL5JTSK+qPe1<{T!i5nZUn`vb8D7KRkgB{k$ zKN5|a&zy(g1z|}XR0NZM{K#Ag{?7&c=gsOnRo)tfheNGwF%#WV6-E79XxW-xyYc z!QNhhQ&rI!BfhS~vesHSy#n^5y?W!x^U2})@xdVMucELqV(Z(3BCgC{DW}_Q*s2>} zeX`L9#16bwp|P5fX%)i&jr&!~6%xWeEVeK@3Md$?gcTpfxI*}Nj*g9u^^v z0x>v)XI|Z&X{B0Ajc-l{Y@Bz%BFl=2krgoR;=FMFY18(6ajEOe(0g2gkHjg{HwOUDi4VMPk&&|z^(LHj3 z7S0BI|2SCRZxxGxV+&0%k+u3)&xZpZK@wpleWWiCdwQ_8vVG;*v+_i{J^NO6=g$xB zZ*)0qHV8y~hs)*akt-EEuzU~?GRu(&HrTD;OjWbj34|(`X_E<2X0ygqwCo1c3I@X? z#Jex974>9o2G5vl*0RNGKp#VrrrHJoP$@G2g&YpzM#en2fM96aPkgs?3A|VhC!K)_ z)Nm?Nsg#9au=Mc*A{H0S1BelWgP~Bji)GzTjLD&8m&=5Z==5}Uun5EpGB})PhirUj zGj&`wXWYQ! z$>YFTrzmiu!l42$yKptI7dXyKNn@jP=fK-|ff}%$1EJ^?>;eY@ zf%OV@F8pd|cne4BSK=HwYGP$I3;nuH(sa^VW{YN~1FBEha1IxVafz>sk%lCjfoW#uZ_VX)cb0%z_z zb}X`c`a(aALarQ5dpx1}Bl9Zs@-E<25CYe)Ze72A^ZmR1UYk+7xVX2sw+qW`qG@F8 zq$Jn!vd!iuc^}0sYKom!b^_A2F9^f%mN;Qj@ZhUrc zGUSwSE()&h1{h%A4=%hj8WjEuDM`qOg%Rv%9e(lbk!|TA`zgxwvpiXUW-MsqiDoHuON8(p*790T9 zK0FU=jVH#_pq!XsXqfompuSpeZ|k*udKPz8(3`bn=#_))TqBu=P#{wt6xwYTaf!Mdpne6S>{?4agZrtzk zGBOXmKgZD!D=5tX{#~WRgUf@t3V^DL#UTKn!`NYR_e!dU$Cn>A3vgBMR>vp(eZ)so z4X}VxBE2%PUHcDnSK8FZeTP2;-=NcXebbrt?MjPwrPX~dJ473!Bf0=tGAI(>7$Jm& z5o=VCgk*_YOpqa%0Fn$?IDp3oj?3l5Bon|kK8Rx{p2qkZcia*?{r#bn<|DxHen7bTxIE&Lvu1_8@@NSSI?c}`QSo@Zts~mgGrx>Z zN0uJHZK~A!D8T$cZPEQ?u2!scA)o_Z${84&+=NC&2r(g238YG^(yf$KTa(E;^T)$_ zNu9zYQ`l@wW^nMZ+>Q9(6?v2bstz^McWVGr1mHmJ877^k zBQ$NI0Rb8kXCe+gA}Hwa08yXDaTgBN*CVkytcicTjbOr#-ULet%jgwEs&WLTRpgk5>II0Mf|8iaX%G`D{% z?%-NsvHUaUt+#0iczg}X8Nluq=h#>v;0!qRE=U9-(Gil?=`QCS`GJmnG+um+7+1zM%%**E zysyvFf*pUic44Nl0HC2iHqNJF@u~8wr}wask)~M|@=4|8`URj0@%AuMc!+04#4T%F`p(4O3Tv$b^d_U+s6-#@9; z3F|P;^Yxkh{CrPGTU)$8A73e#_9`uPXtu@WikLD1m#5nxGFK1#fQ{N8l`jCL*%u9I z2Wo>LE|NmX#iQk17v{APl&RIJRElMu?(T%HMn4uX)dT{1z0=_!Y)6DrZLLisHbnq| zb`ugwje;>4TaCI;kNFh6-HwbS1K`0KO#bC?NX`GICG*!mR!x5~clq*nH$EB`3w)oP zm^*u|>!gh&#H3j$B6ZwR9S12-C>0Y#H4^-GxRij!O(Cr1#o83Q6xw#HKNbakw-C7$)g;k~ z!3d&Y0NA3j{CKJS(+^26M^X3??oPvVSvL;h&qma0Pa>gK8x$tJwDDk>q~gA^x!n*P z4BmV4cw=dOeQoXGum9flN*aPeG?iLF&1iHN=zJa!>dqA`sUKopeSJ2YN~J>EZj=(Q z*S26c3gyCieqbQgjyOYrn%bsW) zO^K&QQxG;$09`9Nx;A?0q^(NyS3s^F?4w+pYQL_ju%GO%MUgy%|IB< zl-3T}`oap2zPs|NREi%jE7h zyxRKy!DcdO|9Ru_)}^WEyK~36P{^3+>l+K&|2a95jlH@!0H8jc;`vKU_wU(Hv8>xI zx2Z)MVZF$vrfIsj1*<&ydSoFFbu8ST3%3CwL4(Oi1*^RD6E4q!DbSqo68Q7F|J z#ma_0y~HFIh^qsG0f$1t$fP*xPjD)2lRzaXFp(}MotA5MBi~W+6s2=-6G%s^i6mm$1g1K zrIpF0CzT|LTCqYehNEF#9_fjM(U@_zTzpzdCK4)AF2^D5xDpYhU~Y0+z32#BtHtQG zTb}@RK#ISC)>VY@Y;J#jPA?W#QB-Y ztv&l-B0&%ub;Lk|3osN?{jy_w#mT~a&;04|XuN+Q8tsqf+E0V|M^m|xwViFd*J46C zk|dB2F%G5&w{%$Q@ak$@=?FOF!g>LPiy20t<&2F&fl#ZpRG%6fYp^yq`n$T^$b)Hr zI$iH?4OtFJSLk<&a^FnPp8e+X?1_)%LiO=uv)9jF|3C(npNw?Fuj~UDC?V2PJ&veP zZKH@JY4~@$Ls;S+6ahf?x7ylJWJja<{urN%b^y^UF23HZcsY`0wD6@XLC+ zR2VM+z+Oh8VQo_z~xQxd@1cQ&zJ4y_WKYD{$f5vWA! zGX_}_OWxVMlMIIJSKcmdEKaVitv~$r-OEle``eo%Q^nVJkfyA`U{f#|c-!A%h^L zBx1_uL#vS*je&_UjNB~=Vbf3qmSg)FARbRe^LZq-(0)4H4jwT1<7UN3vqN$qTLh&M zHMU^Bm+R%N(l{{e7#aZ07B^<@R=hN=5c$-=6<@54oF6#Y>~2ei3&o}T$)Hs2GeV)Tz#-zxcgt`uC6Vu?2KOa2lTGjy>I`( zKEOE#;eZ}K4xC{ig7|>OD4JmXnjoMUA32dKVjQsQGo>M1wQ2k}9vYXa*b(rABM9Fd~)wVry%w#frzq zJZ;8be9}u>IKUfQCD%A|VtgY$LIALU-{W!d3(at}Wxcm<-oDk_+bjbfNYk~aB?L*5 zJg*@{*hJi9l34)NeL6*XJ$~scBxYXCz^6*|MMfiG0S7$T|)^&HCsIGWqg)%PoVUhi#~WXmOmAVwAE%l!i7BR%rS+#>2tD}Maym6N6`h>S7K#sVe4THiX`bVC5~&rx zFKm`(0d#SKcW5{fo8N%iTUn_wmfd}_@%qj4HG}{Oo-Lfu zzZO7v;HK_Ws<^ifMWFN8Uf$_(+0ol{Dv<%!5srA{fp9pxxG{*Dw1Z;XrAsnwSL(5& zr>SJN58H$H0h%S^xOE}m?#6vALTdSkA<%#-(qO2QRaBCU#RpI?qFd_fL=w3{!&u2W z0(Vanm2h5~Bvnj(JwXy`b%&weU?5d8XPc95Z&!&#jAMXiEg%~^Pe{DrM+kT@H+>HW zN&I2$*9yy}JGXA%ymf_TEH$SaHI&(`)DTkK`P|Z?s+8f0_#iK90A?qXd(eeDTcC2W8y zs!Udo(AS}2HVmteS!@7LCE^5hZzKZ>axz^!M0q_`2O3W?Nb@SGTtsUakyI*CSfnD6 zlGD&k1xc!ChaUuC8Nu=#_Es_&2tqDb%T+eDr>RNR-diOykT$5Fe%*-6^Ru6vgd*_& z5HNTB*e~vPmnDp*{W>lJS4fiOYAlqr!WZPl5}Ma(wHhCsS3VdV*&DyMxEo{LKm}q3ARbwVlUNV{kIfy=eyMOfV;AsDE_o1#E zNRdiKX>?;M{v4d(&BFLNc9k3s0Qe?i%P$@w7fsj=M@!g8EWP{sa0sE_yibM^2+;nFQ4@y^x45;GFMpLJKQ-0s<6BIbls_RqC4)D@N8hX`-T^ErZApO zzXFL;!3X_16U(zrXy?mfHX#7&2ZSyGn@Izm>F@Gpgi!xNYJPv+-lXAy%2L4PEjqwR z9fMyTv1>M<7uV=;_(%Ft3uL71JywNqaNIT=OJ>{yWI zTqop0@Z(*;PaoX7e|v83`h|Ahs2MwZ_1@ik=WQa&G|*+p*6p z{5j?97%P=hxZPKJ(Qd{(Fca#E;Jl!j86h|SBtM}EdeH4sI+1{tn_u17$)oQ#v#BDG zd31NBI2DftzWw?2UZtmPz-dR*2aAiz^!)DD?y)+2{kVF>h4pF->(yb9CsD6AlPm5$ zw!4(U4p=!K0RmvY5Ee3-%xoai*V7+5o-D;y1mhr7=5IVg9!As1Sj2K{3Z|!7u8}55 zhBB#?N+nGI1So?+?5h~WIU7wcXvw*WUIm7f`n4Z4>%WFC%&*|`+hh9w8)YP77Fi{qcJ~qQ7MI0Ms zS(^4BJFN4INES)X*3be=I|DHwDvZd2O0jk7>o9g`C+dWDT`t+a} zO~hY({%_{4tvikLivE!Pg08-J^{IUrW?%*ehRXm0EEZE>pj>4H5)zVG0o@=nAXpZl zdxffNBo`qe>k`|NYCB}vl8mb;t!veeoz$saJBcrKn>fCt?fH~Gc=Z>E=XqhiGiUF8 zzH`p5)M`7A?%g{-GKXRVJGE7xo7?{OHX0pl^BLrzC9tMXzy9GrKfHbW^`)k;I~1cL zqA+&xb#)po0xv>(Ds`0SkW`p(Py%C!xm#b~I9KjYc4Rk)i=&`mk^|kDc?f{{%m{?p z!-6|R5C+KZ{s>x~LJIKpo8c$oD5Vk=eHA2)R*33VG8+(OWWz}iK%e2*En2hI7PBPK z4nf)EDPIGNYFU7xX;~kd0bn92Iz$)}~9@T?F6B^C;COL2##lQ=zN>!*6b5ol%{gv9?SKR#r%G z`GkTXnDIPkpaqwd)tF35em0TzIc(VAtDWV|7uoLlT*qj!IC5_L@bN}_6sW^@^-B5C zUmxGg)$7&D@bKQ++RnGlApH-vmny&&-Fa0tf3k z)ay~oKpH5az`7kDQUd;n3ZN3UQ`w&EaQ4M8=#N}SM;CIq%6-xUkA1Gk;!Zs;P=kKI zpVgQ}3d*L%ML5plBn@ET(>o~KEK@lf8XEKsgjntetswOd1@oN4rZb5`eGUGIOJZve zEQUd)mCUY76rj~SisTBkeMsLX=Nrg)~3~KAAfXtu*IdZOVw5vZEPFz z_~gwpql6CdE*CQ8V_DinacM_$JJ$57zP^`35ddeON+!|j&f#HH5g0=eaR2YO(6En@ zB&PH{19Z?JkW&FdFoCcb9Au=t5NtHej;HgQs2e+RP(9p4CAgkcHaRk~Tzm4FJ7(#` z!q4hUsl$iZd(Xc(I9Q)sE2p-r-(Z;b``UK(#{HXd6>>Jx06tk_6Y(R@koZJMrr=D# z$Q=c2@l|bkcXt!Ho8)#kH%BVf$5=cT9M7j6*v9jnrE+qtdvoCTJ*8x^Sn5I~c5Gl5 zh{o@*c85wVu>Qr%ywi{{MRmd883RuS^m;TxFIS<4AeBr`36LYts`N%k@k$4fKinT_ zHc~E;T;w;aB`3q-lXS0u#>i!MO05>*#=c{*H{#t(!K2QQ>lZHnsg-s0E?l{G?at*u zGfnh2h|E%gQJ_(Lg4Qr9F>ONDQ7$zFe9)(l0HDAB3RqUTm>B~SID(|WKn^WqEhWb? zE7L#(p8TueF2rKSDKyNh_ZWRg-Tlbcjl~(il#<)oLF7%P31b#G=yI;R8};L6&!2y^ z{Q#t3*jB)UYSM@n%wvd-0 zwKxO-WwHY@d|F#CXXcB!(PVKnyO}$x2p8n}MEXoSw(v=P4k!X)9vnWrwXsof23$PL6J8(B5Hw4&B1wzJf}BgG1RnrR&CzG z31Ga7Jcu4V`rF;Us1kVKer5fL` zoODDbYRcgV0iugkzn~Yx+RBc9!MVDs8Qn|Bm96AKwNdX`NR%cfK zaN)w$Uck*$3o{EJ2!h??@fm_#UUyPLdnek`94B$PC@~x$M-2u@0bU^GEVvO0Y(FX` zb6xYuu_4!m-gPdun??2aQtDi7=gH%{m^*CJxCFx6Pmm0&p;@V%HfSA2k8g@lF%jD3 zBAjve1`z(0tzt1bd_Fsn>_GRzwI9@3?J)PO=TB$6(!Qu)k&*jfx&EMCS zGTp^4WD?Q?NRjOU=-OWYY6F{y!PjlYAqS8OmLZHo!61jLk$h3b$SvvMR4m`6~Qi45>ef+2BSN}`sZxBHdD zizyRRDUZsBjA*$qtDXHDSAW=mC4`gUsVKDfJ*(p5{k+iU? zvuESj>6f*&a(N4_AzjIAji$Em!%100sOD6y{`vl!jSV<*%goag9~$~XPFtw6y*(7` z^YM0-OhqsR!y8Od%1W`OM6glkVnuiZ1enqde6czW;W?j~?kaArtjyK_dCMI;!;L3^ zVXSu4mP^@T0G*EAfo#XXXl|rdxmN&f=`niJ28YK$K%z2w8XLKUl9J%KR@~pOC!`_? zl}@CMaybs)x?_m5vQolpG#b$A&~#8MQYs>YxYF+R+9_=zNEJbKO7F6dHk%p``;y zJvk&$YT>`kUE5C^*%_Dm(m$XN`%?8`wGaId`ZO2MoVj^ykH=$AiM{sN*5C`+rkLe2 z62@k65Exi41{WyKCJq)slyX~0HY6g5lnsR4lxWo^X;)3NO}3j>S!ENoY1OFx4%=4k zUr=6c$z#p=&hK)*?|fgI+15s<#)b&u&&$_APm~JyOm?9>xxV`1H^h*XZ%n?rfB)nA z&$m9qUF321kjC7Q#}kdh+b5B#X@caI1djD2ycS|Pk1qwtoeJ1|o|sp0W(o1toqBnA z@?g6>Fg#lvfx!CwvkBR0x3~Ip#IvK#0nmSi5j-|*W@hb!<)i1VM2j5p(MH5`V)8gg z)F;WJ0CYgZj)%oJg(TCU8b02^iGIIjr7bGSdz$zt*^I>^V*Fa47IOPXE9c@~)Dj9s z`p$=Wo~6ike03#WITdB%-$1~(zW2tP-?_VSbz@`W{kMM_m@>otCuaeQ8+4T*sYn;V zsCUFwJVXR^PkgA!Zkn6}DRu}1QwNT2{^P^rd-rg4f3XJ_RrUY_)k?pZnH-+3 z)o(p|@e+7o0wj{A&&`DcDbdE641*ZP<EjlB>rGv`In#r z;}W>}ubw~KIg@Q}pd#Jf`FyrT3?wdGXmWTnnT(1WD8}ie1S65q5J&+-5?C)Quq;@W z4B1ZRalye-b-1_$L|-hdmDZQPemRj3hQpMcC6w29>a}ujZ*g`8SZjJ^b@@q>=#(u> zQo;(NSwV1x4H2He2p0gZ@RKNpQ7MMwVEapwYRM!+hIp1`ZSWBv@$pR#w~WGS79Sdf zENxuNwzvn+pAV9VHBv@KRqgTIX&5hfa!>5v)q$Vjsgm#i@Vv_v?mv6!^8Wsflvh`n z@o|@qJH|)+_>!Q>B$I+-r8U%^Vh|87PWMZImroxaZPtnh?;aG(g#zs1D%Ra#sz-{& zgPz%?`t@7)zIeGsoajCMOqQkw@@7<@Lt^E#10ey0lJs=3X5bVzxNY^KQ@j@!pdtkxP$T5T2Sr zN7Cct<9!AMlQpg*0jVxalGRMwvTU&2BuQmPVZT$T62t9}CEf>2M2c=V(j^DzQqK^t zkB?KWp}fDZt&KvO*HOu&-3p(>Byf6E!1v$!X!rKc#oPO5`z3a&zw6B9-TfN@noYJV zNKr_#-5E542y``qH$A5@Lej){u~ZJ zd}X^jG7Y@D3L)_OEuyp2mTXpG_u{kysC9~DacV)aLp1SGTq3+&TiV_(&JL6oN?`aN zKbh#{ZJ`jbeREdE=?D|a66G>Y!8@qynx;z(Vp&r_r~%a1I8qGO0K1kkyd2BN6JX$- zRwvQ=`e@~(B5|^300OhNy!s~)rj!}>c4O^%9h?BZ1~h$my!kXlbY?YOl_f0US}ACrTs z3gtVa^Yb8n48TB?OpPt(x=%q?=)WM~?#^v60#`4+6L19H>H5*lySwjw3S?!A`xuH8 zTe*PHo*Ek)YvL#q_FBL$=`J0C<6;oU@wBgz==$pDxL#YrEyRb1tF!n-V0L7oxA)4G z-csRkZS8P#4~GB{LB2ViNhHkRREnmhh~^E4O~$1lmnuq~#7}1SYE^uf9HjZewL)!m z^(B$xBe0kN?cS5S+!V*4utGLyfK2{$CgzJea9cY&*+AkxXAXLd*BFL^kVv+&HV4f+ zx^u)v{kT@E;$achQfZ}B-y8llkV|YZ;Ta-Qudwzk_pa3rj~+fFh}@{9gQ2g`sbn%a zMcLS}(`s^5WEJyo>y1oDZtkAdr1p(iE;|Fiu-MGB5v+>E#KaJDjxvopQ zyZdj?`$X0k;lQp(`4gW7YRKkE(y@-k#g3T5+5;eJkloI4b`Wqt19vu8s@n(C>*a;g zQW=;WP@oF(YT?Ig93_!7p%as&7(MWR3@@NLPw-#-@hh`~8VK~5D2WAKZ z@EVUiV?B;0N3@Z64jcty4>o!Mh@iB2>x&0?&h3Q&_?X@0)pE61{-A#6Zy&+>^5;}NN3627(BM3zE2 zvYaHKhO^mCA$K+#3U{?>ev$Wqq^h*q*zQwsAoxESflF6+c5Z)oCOjqSb7ycy;6^G% z>+s^aWRgPmF%OHV2uD-wNf)RNmi7b$JMs!h_X;!*=zjMvN6RZK0N~|?TDe@s6Qg@Z ziulGAuCcpTs(rAz`uNd{FCP#@iv@tLk9)m#yHig&;HPn}*-lRo=v_-PX7l_%^R_KDKWx!863hVnZwiUYrdIylcpv0>x7ALNH)5|U4?Hyp zKPo}767_Ndu6Cu~q6~nG{>~6)Lcwwbc;F0j)J}C~rqtTM|JBEq7|ZZcEpJ)=SMSoL zt*s~TSqAdWR7%%bP^nzp8W@D*(yi{KX-Hm4lm%x#)PxAI4TCl$s-Q(`HN%i1u|X0F zS?ytt@rScnzeem%zthh+HGf15CC3N*Z9Ewn=_g|oV?o;IG0R0G56{Tq&kFrdEdVfJ z@Aj=Xa7p*6^`?XbG$>nf|q~gH(4Z)ovETmz!Z&?u;T%ri{9kKug6wfhuA^Yxk zJ!ArR7pn_sw6b(^s=C{$mKIN9*Hx#|o@urAFZLdNa?s^BFj=U{RG>V_i#{LcJMSXg zkY(T-2%`3EyR)>=om#A}uiyXY?=AhgoTRX6MXnd&f8{WPmkIHdCdlwDsP*8ULG>#2 za=BQSa}bn3-BdN8!(qCjRvS+v$F4o;UFy#6%mNBjXJ*%MG~vOujN&814zxA>=(qcS z9kCQL5d%k2sJAc7xUlf0NvhS(fUpSaDoKwzi2!N7kqt9;Rc{(bnDsM&^1wUGMP-P} zTAor+p#fblhk%%*N5f&3vB&%j?;n|u`A$s~O;a`%uSad_pauUAK;T6R02+vkB(DGF zR3n{OUfno%?)~GZ5>k*T_2%i*HoMIx5W;|x(L!z&Tb%*rWJwJL<^u63q4i>YbbbJm zz~>;VfycGGo!#ACY!T{ofP0}AV7t@pb}PI4`&YMmcb-0ecHj$H7)f4m*nKWnC;+;X zas_M=Uau~KFyGk$*52-JZGCB(&j`h`8j@sI0j%)g`9lg;DezH%AZjDLD+RKQXw8Fe zeHl|kz-`6xQr!7BhW-D)s(!fLUf99?;MIk0WgjcT^FtzSSTmNwKmPsQZ9pba?XsY$ zw2ZbMa{-sz0njfxyQYHKS~3X{S~$ z8#TxiKv{FS950GSPKk}g{QT-N5Ju61!dG7b5IA%<@#iVvB}@T(=dPoR{KnBZ^>`Gc2#p2xuC$Vy(|um;`QCYq@kGO<9b<=s89siXr~bodSwVL0q3PYLj*qgpcM6>&WAvBx$eBtm5f?_q=RyEm?HOn7}*4&2*& z|Bbg2T$+zk4g@x=CQL=b$& zCb|v`)C@TYV6RYIDQ%4gb%1xNScbF!=}4q%UXvt+L)!>noN!d(@gaawxTJ`vWHe(z zORDzlPJ61lgm>4QSMNN&X33{gUM_O5kbW`=5mq)s0u!zUU1&xuo57&qNa8&Z4g0x1 zPuS10X1;k^_p%~&YN}bUtu&2DA+INs{mwK5rqc;8g^gjTh&KmJD4%RLCD9*qIL^9a zBL#YDwU);m<>RrkKKYAZ9=4bCi(0@>j~v; zT#h7qGg6)hS|B(=QC%2{}e|*29Ak2#@EP>Vh_;Pl}csi%$ZgNJ^RUkuVLr_^PE_$cqPf=H1(=>!j4k##wuah{_GhSIsZR}z5A zWZ;O8|MBK#sa>g@II~c#w)VF__~e;oG8(7A-G+uTd5DFSHBNA4MlnbT5wVIZU;#oj zB82)u)#1g1EQ+MzBLe4SsgN@aQ;OIEfuttbc^~5pLSnEpY|ex4NX{_fsY$l}etZ9* z+Y!rzm5J3d7OG@PaDkM}A9|bkk6xsJpB>rz9Zred`}Lc#f#d)HAOJ~3K~!7kZT7LT zmpAThtd3C$uW%$CVnT=HYPG6P*6Yow*1_=$9vc!hY#jgbXQOff>zYWFPx45(If8RI9BGJQ8aC{*+`<1PSbi_ z=3FE&H)kVO2OmtCa;{b={4h=a@KG0gfGg7{)+*K3=K7s)KeI&oC}mit4_$v)tIJCP zWn{09xYbA`$1>T`be3qLBzl4X(TfXVNrXsE+claC$6}*YsVl_pXbk0K@2JBx>uSuI zU^IaxY|II1UN;Pl&H9J5(|N-CGcjp(Vws8&QxQd;a$Mrn zuhOwoufB6{YxLm{3^4`&rAPX&O;_ZBz7PO+5Fnt!qS5;Up{&BdOtTr z2U=Rf9hQwHw6I@DcNa!MOm=6NwtlkY+>Gv`Y1)0pIV_1jhh{j3DZy^wEJ4O?j6lZ6 z$K#j-1PQI%>KBI>CB^SgCXc*mEjPZt`~KU%A5=z5Q`x~=Q=m_4n}z(=(zlkAqOJ<4 zXJmy$U{RG(1q`DYJm6|YJ^*b^GH1G3H(oz9gpoEl^`_}IF--9y1p`PR$g&b7cteYT zP}CBt*C6_5O@;%;Oa=QH;Es|M^iNEfy51a%Mm=*EWk!jJq6aY(DVRL&TcIOUNpvar zyN9>0p#kB~&Rq=I$@bshyL<1C=T6gPXuK^<*cig?b~hTXI40JeIDNG}MEXcFM1wTY z9d%AgK;1cAcgTi;<81V#rDOi*z3SHbI`WRqmb#}?sc8Uy_}({bnG7I7HV=BNRs(3* zK}oRk*ROuu+Y}j^_rBRYNiU6;0&-fHmCp*Cfo+2_^q;=$7EOI8G=z*)9i=e ztIZyIq*Y-XA`#P!^hKobB3?%YS;E8wLGft1*_rd}XRk`Edq_-pL^Bx7<$inoMc{uB za2u@&p}~-Ln^&8=bnoun6LY$V$#H@;aGT*K49tf+ha3M?hf_Wpim$F}5QGsB1(YwO zM}RH^G>7+xhi3rR;(gBjhCt zjUUe6$726AqqXGjeE$5^cL&d^yVdQbh2na-Fo>+r$I`$?zUrBp%C1-6?OU3)83)F? zUA?r-@d_PDdO1=NbxKeGa4--%P!z0$6Ld<%6cQrV)W$HJ)rw(+#5Peblaa#V{&2q; z^V$W9j(A1Pn(%^HXjO%A8^f~_ArSx}tUuupqPeKQ{miW z_U&t5Y#?Xh6GkG@d-lrxyXQ{aAq5SJyg+cIm0-w_&DMCPQA^Mv%u159*r&@n?F-33 z3_uclRfmo)2^#C`qiCo1;m=QZA6#EwFBY?<%}vmBg+igUT0~LEuA+CQ(`YAabP`fy zb*cJ~lbv3?(Lk@ZJltDaKR`X?$;ourE#PYhFDxBiqmJ{*6z%*l14vU06>lOP4vuox z)tkQN*ih{Jk)@<1_?J(fzj|}<@^N*0due%Xy|R{HUF{mp3}jckrYFm*U0u`DU4uK- zm3x*b7qBrl!KHiTkjF2osvM$Q51o`nE2;3Bs?($$qkt&@;EB4u4RpQ^@(}2rHLiFQ zqS??746g~~kYvCi&~#b@h_^Ojij}kS=uzPYcXGBrXwspkXfDT`olzA5i#PFxn{QLj zCy%=!_z?m=nV;X-_3ysSp4YDrO&QW!o*5~2^ zK8MaqNwj)>zT*Srzj*!qySLA(j~`c8w$^sg&tNKzpr&|hdU7+1=8nr~ogKYwSbbzk z&Vu5%85(MPqP0I&!5kx~k;hp*aLUosD5Q=qpO8wm>N1U-3siyN36I?;4neNi6HPYf zBF^xl?lKHY4k7aZ6(jvD?q?`BCb&ktLlX^)4P1bY=Geg8jMl340;_D*w298+ZwP*b z0F(gpzyvOwb%>7ki>L10e{^YFFnecI7t~*h12AJ^7?k_Ik=}?&7%n}5`lJaL$1pTQ zQ5?q@s2l5$<1IMLCed*`_0L~+A1p0b^2p6ApHCe=1A#_|Ga2MOG?mKdr>D}H{Myp? z^BcKXVz`k~fd@Wa$qc+LWO{Cv)1#UEGU^9*4*A*x7=D=vgg6|xQ6$%RW+K*n=sRmpE`tT5T0DtKDas8f{Pt&m6Y?@XMD83iEgbx1iBhJ6%5^ zCK9ch-DhQ3e4H~4pq2_R@fc?J`5Xb!+Zq9&;Nt$6zq$R>InaU49`Vq8ytDH+$6N&d zZ!X}l9XP*n<#Zq9SIIjvr|Yc|7cg9%W?9UkYnT9accOoI(KNjb3n1Cp*wEk{ zZfKxPo&tmrt)V(xs&~1>C^CT>c@LFfZ>dtr)G8neQ;-Nq7^cQDFVGt5v5M2(hE}(wk>`=%-j@LP;3OK|NN=`wL_$dF2mR1G3&bcj5m1jsFmL^~-5oSNtLR1bu?`1=xlCV0YPt-DMX_ z(1_JCh~+~-Bn3GnNJ6#j0c0W}ER1a7+9P(zu+;g#8`wgT&n2}}{Slx4fANQO+=g1jm!J))*xuOzRVqRcDnMwv6HX(A> zEFWgk;gE{P4ZB>1VACx&_yaA99GHPn&s-9Vc8%DjN6&BESnJ$rqAYPGU(M#LU;;n~ zwDMzxvdN@0EySZEUkKyAIf zv9Z0sxBuOu>5v~Z9P08>RFuHcVG_I!C1POJaUAoYdv$~Pu!UI3DwrA43@Q-wC@S0S z0&54-09oLj_Lj>SqZuQ{3@koru?p6tU^va@krC&JVF+fYA)pSDejm`6ciiVU|KWX? z&dZdnfRVOL9XJWRo)qjFfy?KA@z$_=0RrI4;=6sr3xK;S&SYh(S?(yS=Qa0b6Y5>k-^H?)msMPZ9c5`W?v$nIhckB5Nj~0he z?-@#WX`Cv9)?<5mSkggZqDbgG8%~BXoEE~Ool--ZiUAPyrwPYE=w~j&mRW?((VMtcDCtw2O0QS`f?@i_S1QYc@MqR%`(R zY_V%)=Io3x7dTut1_nKRPUbm+0iIwOju<8!41*{6?qT~I55K#&zuo9uSigq4H-QM4 z%(NJuI+irInjkW#T+l}Xs zA3eQf?><^C;R^4y6Cmmd3bsAmPZ8yCaE!w#+JbptJ9D7adji;sFqr;RU z^YE)ID~b#xaIgo0uOQ&+mBsVduK)?G4$m=MUsndMhJr?rwgS<6wNONen9Ve)hRn{0 zFvyY~Jv6d1Gc$nNsF5Vcaf(}Zh?qi=TrdvsDRSnsGiJ<_7()N=BmV*%Ku8Txov&6Q z3`!sgtIbTl)dHWkvHefe?6h4>qCuZOztsS$KmkxHl_m@AwF@uWLJ98yhsc6*BCl0!K(Cc*pU<58+zVzmD@g5%ona7UO0#LoA6#cp!%h z?m1P|LL|*;77N&Nl7!&km>x!?1ZNODF{P5^%nay3t0&q$n>+MoHwJ(V+D*`at@Rxz z@ag4pPE00~-J7CmivSAGiV9$0v2ltAwN7CG=u;z8hEcW*S~Z%MbX|z7jLZmw5m0$9 zmmsV}A{LzEf#+EX*UM^LLX58g7sLS%T{Oxa7)E4e%I~vUgsCZi!uS4BLXsp(3z`ML z5KNCA@SySkL%>gw5kLpRN8UIiD~{oFr#|}p?x%A}u}@YVZU=#*gljn2>i|jU=8`yr zVRnvTv~o~I#{(p)q@+oP6B)r`)>L3mxPsI|Di8w7xuFH?yRkC@9b=Y$_EN*!FA0l z_{YM{?9H)S=EQPqYk9ef<{6^&Q!QUxUs~#{fz-Qo@7u2*UT0peegA0M$7-4swm5Az zTsfQzs(p4MkPKT$0%wyn#j!qIq|qa*980370CGWAf-8bXITqznMG&s9tgL9bhY0IA z*@M|h&1GddEhzYz0H^~#m*ZGkbj!Rhc(7E8!g*@W1Bil2oGe+bHhL&A>w4>LhV@}w z+~v~b*mQaJfM?9UstfqzPp)5Dyn6A{`Ew#64!`sJ-(LOX(^Wz##)}IaOHrbXn&8BX zDATFvnr$GA1!zCGKr`vFJ9@xI!Cp#+Ie-F&QPo_Kgn&Q|CQ+j#A}o!g#Oxtc>hi-M zo}uSF8|`Zs)*%GyuzdCU`u3f>rtzTwoL7{ z;C>}4;WW*Pv<^@bw1Pau?1bcvV-mrqQanwma5)G^d#b2R!%r-o;1$I?l!$^1P3gKURDJ1VU)riKePM3r%*`|78GA08*u}$GjxXa2 zv55h%2u?~Gg#g6{!IA}|1ahMgAPJjnV6#a8HQ6pHYNS?e)v8EUr8ZHs+dk~7Rl3{X zAwg$gY-W7U{Jx*>IltfU9B#qr|0v+dk@@TE+uOJAzSC7GTwc1mx&G+qS7)4> zg2N_-BXAEe^pmCLfR(XxVHS8KmGAez1eK9%JsI~7duzxt}V94 z7ZpJ)F&uuNe8qI&u_+pKIaj7b zN@>5H6d-2|EOlRTwBq!JYa-UH(jd5NvLJZ41*7{R;At)!hW4N#=W7~UWr{5}OiAuR5n!lENU0katfq|R}&2q-`qI&SA^(ov-u z)^!JmE;CHlax_{P8yh06pW9N8UVi%3-Yx*$>Wv%s*VdL-|MIuClaeE*NDjw?z56Sz z7AX>$BCXt}z}3UhUm&|VC&jL<`@7S56M`k+`Li?x93fhgbuUB(PS-&WUkSAl{TszM`McO zYLx35wJ>eeXS;uN7MH*U$X=YzN6g8-?;NTKypD;*$lic zF{&EZX}zGbkD+I~t8Bk2SbvtkX1U^`&4@;`a+yrEGdu;F+lHk^MTFLll+wNtw61UyKw{ z+$smYQFhFtiEHp`Iz>A(nU;N-0_z-7qXi!E3ED^o3ynfKA5&x<{x2m-ykxk75D1d% zR?D3yPj+AIg5l5S-JI*zY)0+*!8gDD|3CrXKJsjRbNli3FYo>AGNX1Ky}rJA@8MF4 zll@HAvR*gFk!h}7;~)U!Qo1MOa4J+tlsUr=iMmFikQE81z!Lxkl16}JmwIlnYw}pz`rg*u2&pXC82<5l zH>XBO8~2Uj;lF<{JUnvlT>sPxfaCK08>>%#_jCv3{^i}?(SrlxEBVgM!a^gH&Ek|U zh7gYFu^7KSj_hmF`xMOVsVljY?rY;S;2G=00LFZuBL>sAu)Vj(|j0l3aLYZCsPvO zlCM+@QyH!I4fM`5BeI|H!AgLs9{b_94l_gW?GP}(2@dYi;j_m#fBk5BX`+e{ z>y?T=54J^MDJ*t`kVwj=X~)4BMay6Sn4~0YI+ApqON9V;Ls^gSu>6ddRRvz0;8k7^ z%cPBTh^M&@r)Vm?WzWuzjU6QJwAFj>e*W3ZdfjYStnQ&%vL&#*INX2c+{VVn%J><= z0OKExi~!|-+*+Kvb!&f7Z+BAo6ZiDnv@rkkgjRi z9LP>i`V{5^+cT(?QzTdmf7A#-$!$RZATN~$OHPxl^Ar_dHb{{;1%uoyrL!TFqZApg zUy0SsScYLGsz$p&_A(;`>9i+-I!Y`rQVGNY9d+rhuG63@astS(3nf`bWl=JzO8H7; zra3xVC;4Gv+3TL{&MpKho0a9fs=BD!tWboK`^i-@Bo<7L{=!o85MbIkm>GD+dMf{OGq=Uz#@z; zH5!G2p5jPLdC%inaL}DSZ)QPH%x&j5(N@cyZ5O}VT7!`v{$O~6w4J#y_lv3in=7|& z{dSpPKDdYvU%hyCedgeU_0G;jB_=c$G9Hq$;60I=2CY_*ngl-8H7@LUA`vT4BbIjI z;Vb7{xBx^)Oob{Z5=O07EGbgCO3Ru?^Q;6ctJ8|i*qOANtCp)(&PW)(L36yoN|jhC zo#`{1H7y6>!v#hFc+`9$2!eEXrl2M%TCiD`r9|vH$ilp&GAsl4nnYb##)!00i`vmBh@Wjs00Lr4mn|@fp}04h4lzJZVVQ}C z%}_@duq4AIJ3ISkXJ-N041{c^;NfZ#tl;hzaA0fr<8!Su2b8~j|H%`AdS86{e0`dF zgZZ5xrXcl_&o;=)6GSD?9E^CjH8`s20Ej?$zYxcfVIW-7xvDN}RB|YYlD0BD;X4V$ zis4PORD!AD_C<%r)IwCnHLSv8X}DnH1(lU@xw0S>a$q1(m0cKuP_G8j!E`$9gDQjq zm{Q*U8X}zx{>$98^fqo?;bnh7_T99LF1zhwcuC%SdHH@_l4a>gGzE=bmZ*^&X-q_c z7KR5EypS}2yy;*X*F|6h6U@Sc8Zl5LK!YZLJ2Oa^ZPB7l5wt)NG(gcsP#`^5lWBj# zWZ{ir(WLG<=lj0H^9XzGa&Z!mbR$T8SzJZ5Rd5cBNolnnwolp`!&KCR;e!X3VOfz9 z#}uda`Kx^^^nVuc(b?6__2v85NBgMhCT|~|-(0`9)4+@&4BoC5g_Kr~V$-0CcH+3x znra|;Nm2}tLx=*Jcw8znWbh|8PY6&e!3C)(AI3UdMl{(U9&(UVz>H2o8zJ~5^@H^q_(|$x9Ri%D z1mjd!;BX`)Sq1IOBW&bF(ws;E_xfS4r%}DJk`1ep>UF)|(Cq2MhdB>?q&Ms^oVFGa z48&^&`{Lrlo@g3Q;W|J80BekTR;Qcpa5&U{z6 zzk2uGkDou^s(XNY_ods<=QB{=I+pErYtn6(uo0T?dT6sQ2nl_@$$W2q%<+x>n%$&ALjzAHsI>|NMZ7|V)fSL}8mO65(D%1M9 z7$LadbQ};5-15`9-nf7Jm6nNb3xu~U;I%Ws0>sL_&rF%nymBub_dOi;^$aYm4uit?*PVq$ErQ zmxa*iGJ=R<=eXZBJyE2udWtBgz%Dn6p?H)0pRYdo%_m=e1#o}#@4 zf-_N)Fzs{}@QFpa1~9H+LqgO5c53c7^+Hr?F>~S(U1y^7+uK1-lKNIQSg%RKD=r43 zYntdZA^xxo5Qw}%IoobfA9cYf#M~DE0~};0?bcwBB#UwpSY$mY2azyzz_=#yc1Zz@ zzSV(G1&g(sk{v?`#ldpC=Wxq1B;uq&CP_)P9M|QYz46^TySESWG_W!PnsRS%E_#K& z2_fL@^5*jTOt1hv**yB-{POzzp6l{L0V!l8N01W$03ZNKL_t*Xb=huX5YWa%G|b`{ z2s8wCk0D9&4OQewfo~Bs9%q(Ca&VRiBOiRdUf1l6Y|FGe*)UOBh86pia}TLaqKEP- zY;{1NNgj*i>GZTGQf|tY8t&b>I$DcY$}bN8{{7<%dn4BP^yTQmVSw50E;GT^qafji zi6oLw+xEr@%1$c;nDGq&da8|3UKGFy20WJ)<|50=_Ix;4%V7|xR|-Z(X(6;%l}k9- zK{f-<=GQ5;bXf;g7|3=k27<`% zw3;vHFMw)!n50@gl^iFvW;5TZtPEnn{((0Vt&W8ApvdFx1i4pV9r(SEwu@!YZtfgF zRNg##^VzfWAMW`62pE3CEfP&Z&Zc6`@WiVTpn5b(fCfS|F8HLY^R?RDOoVl8Q{*Sx zm5N;iT0B$4^z|;1u-HK2f>u-z6*HKqkQU)_PjOV!q?%T=u;1-=sn%XDU&@1RMz`)G zqhYU3?Ve~@S5|RZRXVj#O{Lv7nU27w6ygw^S-|5#wMl*j%9P3!q0z*v%CZ2~9at8l zwmm_h|HW%<+wNW1$Wg-Hu`Jkv5dijUc9#@j=5;-9#Zl3K`%JUt0t{9PNSczuw~!d1 zg0*(5puqhb21pFm)0rn_*1Oz-@bNreR+BF-qAg`>22OQx;lUMQ~1s|UK1WNh&Tr_6D1V{ zT8RMWcN3Rja>z4F>h_~W*&TtCg9$Kf8KPS{VNR+tF9G;)y$K@Lo-|2)W`flu4DT2~ z`xKq7dc8Q~Ob%D8UYHZdn{=s1vgK?x1g94}j0}R1BS~Idoa7iINs(JQ0Xt}eMYdzc zq*S7mdZ{1998o3)8W3mWr3lWul`FcpF>P#EsbnbjDwHwCJ=>Nw-4N~k@S`+k>g<7c1!^WUepZa3N(Kw@EKGkv6|!$xB^9Nx#Tzpa9>P z`qtOEfNzVs05L=S!<%2f^PoAIeDIT->-TR?70*jtRpJX?!IO8Aq|zlIT21hE3bIex zWxD7bPYyZ7aMXb2tipX+F+mm@y2yj!} z)6>p0HwcsEJj!DOdy~FNEY3xd9zsol6HRco8q@WN35dqAf(dXxF&jd&?bS36Wr6NQ zBAgJ*@J0!ndSR53?Wh#Ws&D{Tm;;4GO-1q zP^5|v3PBZG;YC}_`e`&ER@f9(9Bw)XZ1l%@UJg!X!|mz+;jf?m>Cb=r%YTWxzUC&b zEB=@dKtDyNPks0PyLWf*)vmO=TJ3g`W35(|C9P$PNRA9jO?hzQjwWP`VGwiz6oW&} zID|BV>4by=CKFr?WttAuPzWsvq0OY7%%m?#Ui!OE8|WwSn`Wf3r9Jol{+xTxxsTWG ztgWrxz4O`7=zf5o%O@S#EqZ|eimkv3R$kmb+2r~BzSEErDRcL1Wv|fx6$oG0yijcW zEW$H;>Xi#8*B9-;>d0xuhzsIsq+&53P{4Y*ns)86v3$iYl%;M}ZcC1=2b2rhM0t*? znM@!kSQ%FI#ARkR+Y;H+0c0UupfwTtk?V>+6G`2-FiyB%@Lg&qbz;))=4ja<7Sp8* znin1^LxRQyvr085t?0wUgc%CSIZ`vLW!t($xt;`y35GabuZ%As!ZJs2`V)O0YEATb z0=r~g&6KrlnXyzFkw^w;3{JNsRRx5^oBuDF!?$aBk>o~_mhzx6)1%CoPJA^m6dNv4 z&yM&7&Zsy#)U4d&*#zc@^D{P(_nxUu$lZSC!qGb?YL+j!^V+M|D;e^3I~ z1hATk<@r{#WR^=i_V12oXQgHW6A}}c32N=x!ZPvap7sb_`|cir^;b?+8LLii|Lq6s z+sn4yDyX)S0T5GbVy>Q;Z9NVewhH1kEia@pV4F!M$ae%E$%%npQZ%l(uB7UC?a6J| z;xrMtgS^5bz=Y1Qr<+o*7fDeRacD^~i$E_+x~Yr2040W@6g@~!N2``InZz>-1r0Q^ zNzM6jyQb<)m$KEY9LY2ka*rzc{DPtejl2Q%7N_v;Vru9_t5qBH`z^$nl(A{&ijthw zVlh?3YKn|)1ysNdU1f&Uvs!)2gItRwXR`-La*g_{b+P|97k~g4i+7!BHOmaQIJal> zssfSBo|`+id#L;Idw1?!ee3Mm6U)nQoVzX#EUw-?clrE8rD6n73%2a0?Woh4&ow)p z4xKgQqSx!uq&}E{We}wSTU93h6as!ErUqTRy}tCq@lbOnXFn7r;-)ReM*?TVwCTdq zTUjjrgk)4T>4~N(5(63QbFF^ML*y8DS?rsVt%Nx}5SK3aJ~d@dVBD4b!lG!!&yA#+ z86OI`$E_k@w^3tE6rT<|J$NI(*UK`w+vQfrl1Ci)ed765O;=Nx%V2PJQS>7IuLt@5{?VP&yGJj7wI&*4 zmzRHk_?@#CA78z3>(-51H^2FC$m+NjTync@^{kTH>G)+Pve*5YVO3l-X4j{{Hglst z{=t?xf#;qr5Ee4$)!VD5x2gOLyD9RGsX0Dvmf*J&0A+`_#Y-Yp=Thh)bs$BsR;kCqj*t=dK$itnA zss3HpCF8H2J`L3;d6MYzusjfXzM-%k5Ral@&BzaDOk(J z#i^G@MMi_+Z{jCZf}|)W4-EacM*ZGj{_*5*8;_pcI}a#$c=yrr@=?)~^48T`fBoj` zFF*g+M<F*EiU5qpx^isG_N;Q2&E zMh0`ICOAaVb@*P+2uzfnuZjCtgGg#ZL@gzNPD_4@QUXuiQHO-qGbld-rbq?(>h9vYUmFf*$&fg5_y29x4{JluV1k(kg(U zS$@9ix-R2>4)Qv#?>@GLr$WyR5#M&@57#c8Tz~h)$=nDrMX%_o%VkdB3bZVzpi6^A zGPf)qBj~Vf^hnsB(eRMPIk3ePY!!`G!`4K9-tuAJCF*qBcz$Ebu&ITupn!D{@o@(8 z11T1oF(g`uNKy{1WMpaD1<9I*TJ~55q$`Q}o1p*@S?l%0L=*?R1jCrcM(3C)lAA0pE`0WJ0jMq()X=a+%VMCs1UaqQFnS! zw{1hU$7RY(SYFJq>%g5c9f5Q8cH8()=Zi+vhoTt~I{(bd^}~l(Zl3$a(9rmao7Ybq zICNm|(Tz`@$peh;+>x+i&j+@IJh58vj!o9?c1xXNvAnCQNrvtC6MicgOz+&nQ=z8? z!rLxgS~_{@(uJj;3_I1_?5@|ZTv>hTO;R#JhE>6VLBZ=q5ikJax}bHt2Xmq+L|i1n zbA`H{AImt7GbvduF}X+Tg}!gbKnbH#Ys4|Dwfb;bF4eMO&t-ZX5`~1JXQ`U*0_P+JQqa|NP~% z|9tq_C*S_*&-Wh;eSdOQ%trovYYrrujoeZcRnyLnk~F)kN<^J~EG#E<;19R%ROp#Q z!EIt>$c6P^y-A$h>`Sk&u3lNae2~x2z*)I*tzJ_TtAzce7h9)E<0*c?e~1|j42 zE99d%gq~i?8yf9nIRITD>e^1NFMwE5aak^v!M6~BgHvg*Y097|S#KQq@HHe45KH*| zZm$rF?erA}PjyLzV%g3Rwih=z1j0?J+72KKkCjTbYTLRF&mtlMf>=edu&WD*aYKx& zL?V_IF}(rP3F3-jV5+taIsKE{4?*O$H>T(2MjMUB%IJXuqklR)jVBv>JZ~OYoj!B% z@bK{PYG7s2@i|miSQI<%0TjE z%Me_#SK@nh1z&9WVv5-B`S9*P*4LZUjp0UXuHJ06;q8?x?+(8|@x`4lak5|hc(vKW zv+IW&jn)?n3(aNRvcB>6``9VD8|X!va65y!oS|22TS(=y*<9@Rufc70WTw-q4=&&CJZ8lC2=feU!K<=DwR0Cw^w7mX)a9rP&|vB2l~7F`{7T%7f7mx zkb00Sdv4vi*`Ax2X-%xuab?QP`zzPxX5Sj08JL+{es}{DzR4$_t+l7IH%g<`7#}|~ zIy!rDq1j&Ec=+HJvNkw~3`sJhok7B?)vWGc|7^QJ;Kilj z8?V2P4}{NMJ-?$6jrj_v00NeF0S&}Q=p4lsi@CJal?fn|MUqA^Aw@O=6sx6*xiBpu zf0$N+3^v`s6*pM>vzB1OdI{lBC!r=mp83p3Ptt@1>`}BLQj-BZ>BUv_JnU(j0jY$C zY)OJVb0t(IgKr4t6!GQ43NkBS$eo~NiO9l}q znurClA4nfOc-&I(8MMS@%b?<(t^Tb~?%mzG*WEqRLAtV&I9jU350%Q#i5uF=Ho18H(WUBL}daAxI2phcnLDPE;HEJMlG2p z1cH=h)r4bL%9V2YxuFcKJ$4t^SYG|{ofDozs^W$eLC=?d3XJa_+`fPR{?^umdtYH4 zC)y^J^kk-&XJ=;K9++MD^U_bzacQMKb9(PbdmHWgWzX&s{`SJ+*Z+F*-|w%jt+m(I znkOeNj*pK|w3_RW|LWMs!BzFhiXZ5ie$n_0xc*;!<@lnvci}Qk^#>K!egsM zfE#>@U#Zm+PQ<|u&Ah~O$*BOxBgYY={vOIJF;t*K)uRI9ycPi*Q4E7tU_>#}L1i+m z0x7^33g+{=^GpMK!bjk|ZAIt|^txw^i#zWFVldemK3 z&9dhY%gxc@fdl*BYCe8egO0=Hc6)r{@Y|C$9jGI z3Z7YYvb}uQ^I_%bNtzuo9nh6|c?@Nii;h z4cZaoLxsWLUS9hA^RqlNG$i{NK0S4`FKJl=Q%ZP| zAM>;T71es#;(L(V1>JQW&~O~(H+8v++vFV!Q5+uAolAvCA(BvqC?o{PB|#D26Da~B zQ*@Ay%1T5IYJ|yg>42I@@V#<0YFhA}mStc|KhX?y_;ICekYQ7uL07{DpRPn_C>G_) zFI+{^U;Y!;9yHu4_7Iz$7{vokHh=KMMY(FjXEHx*;Rf`z=G@%$!t`vb)vABCzKKU6 zXSKZNY<;=$?nhVl4$rmjy#R=MV+(9qn&#+d*$LghX;mF zu6~^IoYL*@Q*WzVi-L{5^DBN0%{vQygq^IyHT%_-oGUoL(yc>zzA z+&4&v!<~ammo6>sC@^ZRrnp2LlO;lNc^)xXFk=t-2q3+I13&{dj%&wzyofO^%SEQ+ zB$H}FAUWfI#9i-G6L%Va*+0O!m-p`efWEvpyPM7a$ZmGS?y^ZHUFwF-B%~ogOfY(> z(Kv(BfaMS@IqoW)4W`OqAS?lz4ppc%c13uS@oz)=P<&S;i*S zsa~ItaVtCXc{@TlPEnyy99crcQ=LlKBTC(q@6N}SdVkuCQ3UV3<6Tn&dnCd>5N@}*wcB?834=aAJMt5i_ZMRAT-g(m_ zuxDfzl?GirzyB<7>N6i+zIgFaCogj#+nfsTR%uvFj%gq%0;7Sgf6fIsuQ#cNlnGwJ&NlU$tu@Q#RmT?_8z*txV2%k-L zqw23zq-Eu&A2w^qKW?!wor5r*9UIF|9vwqX$;|Ne%{FXPWYlsoEKC_ zII?>|;0*-qLB?Ug1K;1@&@7(ae|&aj<)Z<~=BGKzn@D)9K;K}UXureigrHJVoD}Qffj*MMInwE}1EX*?)%!R}$TS6$q>YY7 zEl#(apk$el1RwUrc(qzZmUTtb%q@2hjltnRk{&Y)Yums6{BZtH;e)4j+!_vC*j}G5 z7R_-pUtX=OZoGWCQO={$f<0z_b@K*<{Dat!<;C%dp}D#HY1G{e6t9#6!Dj-lY|X<5 zk~-C3SF}jrIwD#@yi}}f;M<*wXgUsW`{k84?sX z5PvyJKqwH5jK$WckRZ5Fc1C0fht*1fF0{K8L7{28<>W~?*2rs%WC$ybdu#+<=T7j1 zRgyK7TZpm<6J*WX)vB~+GQGXXkBKIDSG{$~khvQsLN$k*Sr2x|0Oi#eUFJ{Nm>7Kv-EuAhs zob7ydQWN_O7snpP_JDjtEoW<6j~|WfON1^yUYnj6I&x&t%zu9uO}M}U&&|cs#Ia*( zl<%D|&Ej}&dU~N;-g+cK#1C^MOVaKbcDsb&rn*>I03tCsIXPt33YGHnnLw()d2}=w zF$~!o3}%LRjt(OOM{Vy!b!eI3fgO%$MD*Qi7=3dW@Q3Ro=VzxzF3ui5LlaW_=bv7_ zbm>!+TmkjZvh}=~V^z>)TcguZc{DhSV9?|~csXaIUsVOy&g4PlxG%V^ zD0$CV>=ur+Nff~mwrCXAi^4s~i^~v{CNyKwM!`X^4-StuxA=(=Y#lKg-pk1j30e3> zQGzxeBH|n}c*g;7cwP3$x?JZLKtM8hG(Iq}H!Q&Jq{OCR0Q<3m7@t`ymGTRPLUC-U z`{+3UfZIDfZKl6JMLV4tA2KO?vA&IJ&=0;UL&g$M)|SVzJ%HegH3$NSfz-`D-dLXO zo;>%L?%X*1JHU$aKc7s!YH*YzNiC+e!UlLzEtKGi%h{}194nRz)oT9n2=b-^m}B(> zgt8DPx^#_~V_X9hi^cdeXKaenI-F_EXmn%97y0Awf45sf;QtV?=i2#^`KfEi-*2Q| zZ-C34QXH4Vw7;&4=OXYfKGx3AeQt-$Q9P;yP#g|qBmxmw;Yc4EtZTP95(&P!nW#%B z9*}_o0ct^J7?J}KLAaf0Y(tdb0T)O%nBl`X1-pdj4G1qSMlz$+`4eGT@q*yPyI|$ znyMx|l$|ny!zT_{y!`0|EGX6CWf_;j@tL-rA}mFanYd*2kOV=sFi0>$z=ojBvZ9P8 zDgr%61v-Lkm4N-xiiQ&|Zv*ckY+hENRn3q+3ALlotvcc%E_h(H9lnMs$Xutx=Xi9S8n8Ax6Y0vZ%497S>KoBrrezEqCttZc?0P`QNmCW?9 zo})eH;=gZU{Q_c?A_1F}^+n#k|NHuvpYClwy^l=p)2DiJYoOx$Jr4NDyJa)IlpZwS z{czvwrJtEO`Ss14U){WQ<5kutfL+PIfKaju@UXoFkkYv`1Nm@&(CH3?R5c7vXLUn~ z#gfUe4sth^N+qPuMj3WRh#)krDU;m2hS9em;Ofd(paiddvA^N0?X$Cgo*lV#`9joQ z2fB{~?au^HjE;_y|0C{No7y<9@W=ju{E2?_AK2Ap?^-QdX(d$=WmmgF*98>GMY0k( zf;#qau`P@X#U0~`We9i_kSv2TaiZ}>)RD1O#&{xw)0n9p475qGO>Hu9#_f55WSn2X ze$;4YHG0o^&hwn}o^v=askjJ5b*8*_J8|Af6Qqy=DIij9a3}_+n{-6z7G5P$cW&6K zSydi4qZ{!mi{moR*@hsh0OWIMTZ6`0z(jaZ!*+A()TvVv$C^S8h?^G&nr&?n;7<&h zifOtY-?@(E_a6=_mLbGJv?#v-03ZNKL_t&&gfI*IQ&s}5po>zSKCd?#m32Yj9M*n6 zcIAgF@jcHDZ!gS@egJ+An3yOa0wEleS3EGj0`LAwnK701> zmoKjzOa5{vAUfC|NpK!LCTp~Y#sxsoqGc~H>bNH!*Kwc$EEVfC+uOZC&8qF&hS4|E zfpa%+BPIC9=4Pt-;73ON}LUU0qK8d#zZJoNo<`Kcu z(Lx=j)!yrN25ApY1Op0(1fr%$r=%3Y(h7stZv$-%hY3P4q7pG3i8u(Hqd>chgb4Q1 zM6y;Zy2CRtaNg%sOleK!Q<-FWFRfE<15|G3fm~W_q)JB;=Mw0rpst)u((gyroNP+c zH94~f&q=h@-E*u%2egiYPC3< z>pRi?!RguBN*Rmmacr>;S}>n4JgU_e8o(OSQ!Q31MFjV?<=ReNaOZVc5=-v3GRo;V z1V7rOgj^m2)vuvdHg@E6`wRrm|$_2bX z_Ta(LQ0u{)b8{!hhFFs|Vx>C6IHg4>mgjNK6-c;379et*86q=oAwbTHjI+1HF1VYd zUaxdSas~pSpoL*@+=(1JWxx$F6RGs}a&4@t5Gbz%oWW!yIEhF1#aNaLqrNl3YPAfZ z`Ew%g&GG=1dwx84^2_hmzF*q9UyjC86lhR}M1?*f75!~j4wlg~X;sXC|3&F`Zy0Sh zdRm{(<=00GrSXNW2<8u(oB~L5!N8iDTT@Bw>n&9A1qxSOsNenH=H}FFA4q|&nPLO2 z9*_H@Pr(AvD#Vfb()jFjX?kfIo)Rd?nURsw^xX!k3xfTD1^7W3X1q~WRRf_8FOXxx zrGTaO2aV1SyVuKmT@g*A*f>Y(aZw~bX{IQa6LnBEY)m_x+@~?3Z{z|FTzDVN3%Gak zlc6Cv+mCNtpZpkCU5)`O;WncN0NyU4%pK25O$-Zk9!*QY4XAz4Fl3Y5f=6h9@ZR3u z%kxguV=f3RONl%QQUG^Y6~04qH>oOxW_EQNX^yc`v;wihLlCN)()tsjfe5Y0>7X1( z>D;|*nD=(mx%GOZzPtwN+e@H{93UtJeJ9_qef`zO<0ortPabc4^9Dbd_a zm_h*;;3DXzSd4ZJ1L5ybv)SQuX<6mtanUBo(WvP2k-QAyff78b7~P#Ey-yafR}olT zocs*+2z>VTu_I2-cl7er%kLeufB_893hMGvoE=VrWk?Y9B+`Zhflx0)0J9Sf1kI^5 zL77}K$tWgPHZ(PvaS}c@wvoIYwcBwht&5|(z&x#4+aiF597{(WsMtg(N(V=1=PzFD z*L4KvyY6hg_v+!+&e>NhAni+)>gu=HAdSX-wcFDO-?3{OJGuVl`Z9VN&(~f(K;3yl zt54z3+G@w3AA4D^UYh9oA~&-$o-ireEf$(pvmL!s){m{cu9WhlT@$mFx!so@`r_`$ z@iX~+snS?01EK&Abie$$*aJ!+KR>^{z5Vm%=2LjKrwjSM?$bSmYHbdaMVG?(3_{pI z+Qa6duuNG%FsuEJeoYifk@tjI;HY$z<^Tvpku~-oj%LZTXC)U9s|4yZl7`P6MppxV zx33Vec;W3EAO$Di`O^`j)%Wh??Hf0bH8nA$iALpFC#QPdZi3-cc9K*~R)?b>t&y~I zD3hnj6b|~`!P;=f&Eqx>L?OwmEM)-$037gm@mRRiV4_;g9?|581g$1gG$ZsE(P+&k zl591%DCu9yIRCu9v9`6ox?Hanr)KA8OSkg*+-Tv^^1q^fjcrMB9DqOO|8{K&<$Ei$ z8jUjXq&1j?{FmKjp$8&${&gIAJE9G)j7L7)W6JU(YV$qR$ zsnp#)F)=kl?M0CT)$y5J?ozH$1mWmUtB5B2SS|du@AT)@hrf<6$A*4f9qmRds;6K7 z2aAHv6`B~-yZ{n~r6~g|djpB!#r}&4jx_U}*#o-Q8jI~TN8vIBG$5n59y(~!f{9Ql zjph$~GyByr`bI_It?M`Eu3q@`4`U$IG?<;7+15$0CUXnW`3@(CT)=D3@&=D6aSY3fIJ))E;f#PM67bhp+u9hk zme`H!I%$WPj7IOENz>Ta^$nEDN8=*UQV8(RLVkU{FthY%b@}z3lUPtS5K0<6d+f<- zqdHY8z&q_zMz7q*u)~2P7VtS^vlC!`@@{pyaJ(;o0FFlzO@*a=A)vW6$&+R;K6sx-WgvHM7un4U6(AKeo}R6h1ujVWGD22HjYxWrBvF|$t_Mt@TgIEsdd|Kpuz6LI9D$xpA(-MH4qP%<32Io8=33)2pQ1#Teqp(wNX2+TE(ejlb$cSo$X(cSMFsP=A7?2 zpU?T8^Eujn4Z>4?<}Q0jw7qT0ihFYrqXl<~#*fTTsVGtm#N&EV#EtxJlgiE`Ydjve z)3)v-hh}DMM>-8O;6?!E38=f_joa&2R)iS^$X zLkX9;>vV9|OMJ1@sFmv@BZGs*e6Enom6U8MHJZ$ntbG#=c$ zC(Rru9_;3m6BkcqtD7(0^%$Ie`11bdYNev=l5B_#xSR%t z75Evf5F4AFkMYL9%$SaIb1!)6$RfB*V3IhK-vA_@9Z!vH7MjiV?ezv6^X$Y# zJ(FwfU?pNsH8wvrWz&)o;@qn>Kyl-%ic-eYyOBwj|5PGNoK?ZMS*$hC3z`Kiw^)v#AlKSbhH0ix&^S!rLpFfGpv~+SYoDh=lNH zOt&pa`3G3wJ~A%|0S71g9f3)_aym9<(vhUdgc-ZD+pP+FKHHhlzQn~i; zN7s*DzWHo>EuS61i^|Gd|GG!a#@gEVP8Sb}5oK0qG#?L z7o7$NKnRkml-R!{@D2t1=+4r+5CHHV^$lIUy>w=-4}w3#n(fF2XIrOp{&LK11D?ZZ zD64g9s?)?#h~*_Utr7J;$o2@)y}q!PVLCgnbgGcWC~IlN8k|PFMK3H``c<7y7t+)H zB6%7~49QwMZN_Oq2oAJoEs8+1bGfx99=yy}D&vExY~dwt+>|9(NJs0n+TNao*IjSs zN8oWb-F(WtjmvZ2tW}j!fcu%k#+MkrsqvI>JkGa^0lDm{lM^SB`IW!@2_m+q13+Mq zCjsNP)*IDgQBks`Y`UJQ=2jYet!I0CPg^%X_5x?n2V)W9((krv5GXR4ys}xvI}9@U zd=xb2rQlHvjBdTEFE1M zT8Kgy^Us=Y!fp^TD`@B(3pMPGtmRY$Ee9s@X26>*32jHAvT5puH zJC)UBF}H!&l?0{(9Mbs0Qp8Iv?lqb#wQ{+7zpY5R{n!IP_D+vf2JR|?W6r&4Hkv>W za1kiCUc;RwYkS|^#nP4Dke0?;vV6>;g+L(74o5)ePPo-B2Txh>f?`@{>KSvp-8$1) zx09Wm3gK54g_7UP~vAl{K5D4vlf8MfeY8~eD=xD`&d4H zbm->7&7om~igh09KA=aa1975}!7cg0K+sMiEBraNi*>p%s{-b$yJ7;OM`Fooy%T~0 zt5q4XvIiUO>ayeFfin)70Su40um#8@L_WPW5ERV5>n}KbZ9mKJ}@bTi3u1;s_ z?I(>f2n7qzUN;*JFnnVRzxJ$k)!(jBhPvHSKcX0?Eyh@Y%m74k#5e%H@LhZZz~K#a zI(HA=GUpzfw=wWIHo!^lZqy}(r10>EeIeN>`Z(EP7bGe1llS%m2mW6z;FCXmcK!O& zv0<>v$47^jmM@(-Ks!}e=I5s@{rx^TI2z8c5rVN9CrfFtj)aT1(j9`}>p{HcR_qwSJDi;Sws&Jx-gefR=fhiwvm6g>K zic-So{P?8Sr}0>N)mHrgLA_cjjwCNmB=kPtOWi3EHu3|((MdGe&ydixp<5CG_D8hG7*iM!t4Chjx-rc=cq z&`HxYX>TTNdxci1Z>Ia<`{BFuo#VTl&m3ks=PcV7JBf`ijg6;EU51j9gvrD#UfP8W z5<*~ZViTM&mC+VbO@U&fpebNrXbnjNOo$gKqgqwA=j+mH-9Hfdg=Og^>+bp9^L#$f zkI%!$4XHKE#^Y3Px@mgSh06jN2E->5gdR_aU9qznEv#8?HxGQ!WR37}*n_81S$Xe% zKnlPc4Vgh5ZEyVGwOy~ix^pPtr$7X5oS!;>;mqFg7Bw(F{tm#v(>-W|UV@|zqnBn0 zpALZEZ&@84MvRdp#C|G*CioSFNvhpRU^t3ux}_rA-piqktR1x2_?@n!XDzr_5&}7` zX*iV*r{o|?`XcpToYH05_HTYEsW$WO`TC9>7<0^*ZJh6x*{s3>O1(%gpL=EVUIfF~*xl4{WI6qCuMnF7bqGmdVa=pSH_ zeCV(h3kAha8;HP8xPbp{4cgyaE4u##$3(_|)f^Tcz)fC~1SJ`ZWh^VEl}apt9YXg8 zz^`kum?mi)gQH&xT;a&Md^VN+Zk48_3ali>{3;)AWm(>I4BO6r_lXv4S+;EhI1=G& z!((~O{;FOX8oM_3?%UVu0PG!aBtTJwkMjdJzgb_J1p0n(=n`Ufws&-NR0cC&pS?Ep z7dRHx`VGto1X>ukJEnPDUweni86-zOz4GuL)|Vi8FGK4(C4?*oX+UJ7#bPm^w}Z)~ zD9~C-Q3C`)u*iAi1Si;bK85DTiha?(Y~HanF=*?YX_ovP z6KH>FqBPiDKuuq49M^+Eh?+tg^*`dBK>!Ns_@QLpE*d=p<7S#*Sr3ipbea75&%VEF zhjRfJ`q8Lp|LJyL8=4dQrjEp1=+Mkg~GmG{7V`cgrT39q)ZEP*}@r>dPcw8=AR|H-RDz;6y z!mXB+?)49f0$PdNLI9E#?XV0^L{>W9p}SBJRi~ILrU&*O@&XthZxMw~ zTl>Y2UfZ?PE@01vsq>$n+4E*Q;f)+PbLH}1-#@jFrIBJDL7SH5a_c$)j?Syg3K5UP z(?L01UoTDb;P{({4d43m{`Q|Mn+Vd^*VbNaVa2>RBJd$LP5D@NvyiiR3zc}QsJ^y& zsr>B0-9=#N4jup!ftG%FA<{>m)|-9!Gl1PtLr=JijYLot5&q@O?Dg95iwB1$D{IeC z1*kIzECTytX=Y~T*ump-jmL1gqAE(PqeCJ|cN8T9ZUcs2TB^Ue&MwB8k$``np9B7t z?jkKx#v>fuAIq`;Tv`HtS_0@kOmeu_+s4QSfdrD{Zb>3}8C9aW7Rtx9#x%ESl^lcO zO&6L}hzO;UfX69a&w;%OB&mvXY#Q)@DDr>@Z9N^=Wu!UH8W8oGSpS?o_k+ zvsMN!c>L1x)}5D8{N&YY?cCclwc6~92iT&UrWnCN!Zoc4VEj*C)Ylq~)qj8Wz? zpc=%kQc@9mUhMx zx-Mx}D=mYGfyjGvg^3AMkaONn+0a5-$`rg_3b#d|eg>bGm7uBdf~W+88gH1|aM;xo zu~R9#=k$p~9UUDp)I^s!`T7rE*^wCVt%C6Gn^XNCOnvmhnf?LJ*WNyG`I9T}e0)k# zRoV>t1%`FG4H=DPGAUiV9%(AnZkH?b)y8(Q zFLBhOR4t$)QQh}Hhl{Gy)3wU&T5Y~ER<7KhTdi+y!#No?OK$RHM=U0}fe<{dFPuAA zzIdcESp{z2H_Z6C_7;I@0mLUiUs;$dSFZl1TwQ*)fl@__cej@>%|pN#n_jM8#%zH_ zDl@s9-x|(LWU>C|VEc~_G?$wewBba;gz%ihDIcLUzc~(=jLx9VhbqC+40v%j0EAM; z1a_BG!HR|Eb}z8b-D4P{&7?j@Lo>vD|sxsyRx>lP^-c5sG-~nD&thjhv$~o9)9`vsFPH= z-bf2l`33s+pOxB7dF*%Z4b9cJ78mm)R8ORxpnPb{#1uqzw1uu*URYj#^7;L(&(=3< z=Z+n#OhTA{TEuKq0yBytPP?>Nsqn4TSF|r*P(z53$;^L=yT0Eh@+1DzR({rjbo0n^A)#d6k*mk7_fgL9=-n`y@pvM)zC!sPdWa@uy?p$f&dWbr%ckguY z()Z+iz20bbp8SW(#>io($fh`_4Bx%cU0t3(St!g`TTh=+SEHUJ!?2N5DT1vYTiaKb z3-wB&UAw#qP-C-orClvltB;;`zerLRykG$(3&1=hX9narHVz`qn;kSPo$-@?;OmE- zjAoudq;3|m%U>h0Nz*a_`(wGotlu5g%-&N}2w@>T7$Ww) z_8aD;X6XXYj1GoEya0zlc)x@i34#z@CXMvPni){S*6_HtyamCEyKsV=-`efkuURH)O|j zkaOY&7AA$X@7WWGz_s>Twc2d9Zg;x9wT=(gXL`Momf}gIQhnw)b^7*BtN!w#Kd3-CDcSUYpA|cblp#<4y}aty*cfn>g85uhklW^0zy$a@ag38oogkxwqSGeF7)M!&9@fJg0|4;qa8e z`T?w?E~Gm)19nstBFBKXWl&0}vaQoN9sZ*!!9!ug7V4xf`HP+?PH3b|Xs=@j2 zGBli(k_0e&XJ;kftH(7~wzppHe!n;|{(tGTxZsK;N(U9iqIQ35)f?C6D~;CbiwnKa zKYg{`YGO6N(ZWjJECG<|mzdJ9J4-EXZLJjwg_D1--^M=8g|g}?31VPyPy#Hm^kS=X zyR}kp)WGMKA3ehHozC|3w{dVdmPSpXK288;MmT_IZbmk^p#uQlG*O7)9J(WtN(pq@ zokn39INZ1qj!2?kPM`5h0zVoAh+ifooxxW1ARocaz?wx|k^}&d5hR1?5{3ksFcRuP zy4{MDfzypjumm77j=#ptaxn@Yi+}*bN6RL`Nl`&ifi9wGAWa6+*8U?OJv_@Y4Qa*2N}I-@UbQ?UNx~wE$Q!?dr4f3{4RIJ6)XUazrA`35(Ld z=&t1N<=fS2dv&!}ChOg-WwV*07L`VAKCdU094^lus&uf-m!EE6>-A6Sin-SvKmzqj zWx3S_D{G=tAreHG0ga+|J7C+nj|=U}X7eU>d~&#yQbn)NPy#5|y!hQ?$TGKATTgK3 z^iFsC@pm_(c&EU50H+8zpqPdO?qS>q96;zer^n3)0!}W$^I%3I8v-9yf#8S|VIm?y z6$FPTlHlxM^QoZZ0NO?jzTeInK>0MF@_O1$0|sDd3GC?;I5_BzxJpYv?1ThX{tVen z6HNo#Y7nj>!eBT9X`#Pg*UDwXi}L~S)&v#hZfqQHkP|1^Kc2mI?fi&WD|&K!=m778 zfEzd|c;~Y_8)Fm6;ZhP{;Ksv`h6EALk%MO43@tXrco2fRRwOhRZ!$P%<@*d+>+KW1m zw9W1dXWmM*oS7IK8#|MJI}$P*N1Jb-Q_kpRs{@6d1tE(YjL6zn4It`ma1t?zJzh5yzB z+I@i5fkH?EtHd%oA>pG2fW=}=6!=UzbaVvrT3V&;yr4#D8C=HTgA3VcI&DePsr8LJ ze=3QN0yV5kX zpZd5nyPM7aV3$qIZhqiq@iy!tS(2E9L?A4#k4COQ(Pm1@Ta#QDHd8QouV< zemG)b%&EQp(5dHL$M&wBX?r)epKtDbaQz412{Q}~4ByY^{dvE>KRzFl;&{zsDNPb6 zg5yo}<|P72Y#EMPAIEb-B;Op=M9s*m8aPcQiBA7xxC*r7Q)N+uxM4MjCXXbUl7?P2 znPx6J*aAiNw`c1cy8YwJZ*1Gb0C*_@JGalC`D!oV)SlA~9%0ZwJv}{s0U+3EulCX= z-KuIrCI%VSjrv47R1Ev~>S&?oNC5=^WOmj~*%8fiFOPg4KKSBsf0JRRuum$JLqo?- z7NOpMjKzVpTx}{?$dwzw`$N6O8}Q?CToPzIQwtcMY{HgT?iR2A{Oxmng-c7HV*Q+= zG6ZNh4W(48wHca-UWX;Stl>k$sChhqiA?jLR1C1W?qKYw0&B4t@QZ^r49=7wr*YJb zBp2foVxWe`Rj6trM^b`}ra@;7L=B8D91c4e%i$1tAVdp2kPjR1SFvFqP=Faxz+4J? zINP5E&QJwDV1#vEiAEJ17GFuCvtMu;M&5^qz&1E#)O_0JU{#UiShu07aSJ>IM<31{ z?r6L>bAdY0(UKldzxmqM1;97D23={Ko}GPf=G43O0h(^`k55mxQW{mipQ+&$f(Mu5 zF>!_i?E?h1*a3^* zYHJ$KzWe_BGaJi|4F|gY>G5&!fZzSj)&;=JdjUJQ@7S0*h=xiYgc{(Ig^u*}^smPl zt~Q`$GO?T>tKif*hi+(GbyRMk3)=-Hpin55%H>N-8`yArb1)d>rD)R!@1Tp6cNXq0 zRQ@^Dbf|hV3%EGcSGav`_4gQ-l$q+TFMPE$aqHIg!ku@frs7W2p59@r1vXA$>5F$R zPTs$P`ux3E#Nz0A8m|CW17=~W?qh%PMYG9I8E@G{BYhffYD8w zNHCD+fM5}v1qorYkc&WsoTx^SyO%6j=bV(wd3c76bMPY$mJ=Wf6?Bd#z^{QKptBs% zy-4uY4)C}j5RxU+9URu(Ogc`l&G#7EDp<_Lxbs(U@x6A9#Oz(CLCd1=K`5n zG(!z^H#D@4buQ1XZEVba;P2@6`%wh^@O#w&*kTFT_R}4Ui@#Vy&x8&h7}&S_K=)XB zZf^cUn^%hlsDZ=)$Up?AX_3dBu9_N1!X!4fvT_xGt+!Mht$c({#ZQbJKY!fr#HL?V z7ACJwPL5t%dGdHFm8|;u(nR4`z2(tMAPQJ2S8eR}tWuho80vXCxq0$YKa0k3)}R}< zAvvDHp1r87qK*$=eliEfvH6Mg-RqE)d2Vc zmL+5|ndphZ6N7`@V@DsXtz9_-z;*NHeCOESJ+S`%@$?(7ee2b&*$Mn+*Pxx-*VpfT z^-}QYg|lRRcN%q!=&Z{e&bZn_{9$iQNQ&t26m|E53}!e0_R7W4iJl&?flGgS4F29; z+fEM1Skv>$jmhF=z`pY4=TlAbIMjQP^tXGD9RW#y`t@52?BQ<~N|(>|^%TmLKVm5b z{^Jt8&m}5euh4}NfBWzAXJ=YuoE|)Ux}){f%zHN%7r*$y?3puQuF{>|7g`(l`u*Sm-u&?^uYP;$0^p?t zyuR%xyVkGltu_&F*;{Y3oo!v4o1g1EoynXSG?kc#_j&^qK~b(6Nsx$8g5yA_S5`{5 zZj~1uIe=-9+0dYYBWrLe9qE0;z~zZ|-Z8m<53@rRE- zeDLSb7RrU8p`M=dLS+}$r3CB*Pqg7$u06<$U0?TM#F|nmOG9{XSor{L+U*?pagG5o z=6Uq|-sL20ibT8JSqBk;^aDNviI6!U_N-vLQJ9o zqimQZ9eO^P4+5-76lr7)1Dssg9ZukA&sR`Xog_KR2tq7q3=#|#UGIQ+aD>@fQnLh8 zkfJziS)ve84WmCUJ569#S47@dCwc2ncQnqdE#KT&T%28BoSUCdcliBdNB6Yu^|$!< z9BfIafAsn*-`|?k!2g$k9qa4UGu6vseplOwyS{OGe(vblJ^`=>V1Q%Wn<;|upt(W< zAXgMI_}^ErT`l!a6pN)xn;&ESX3Yph{csbyjn#MV`qS&B$xQ&iE+_(>|AB8UmQEfi zjxKCIdHUJ?rA=7>p1$5v`QnS`O-(9M2l`30g{WZO2MdhOaljY=o(mx~tI}Z$htXE9 zJ%kgANYI2}#~~{<(?h#8!K48AWlfSKI+RdxXSGj@DkdN~!8X>$jJ$^PdX}V=oGHVX z+|5D5s2>Di*TXiF)q^MiMDV#06^KuafM+wj1cwwJ*86|No!d_v`4z|2ed~7nl)iMe z(yCInFO~Yzhf0+^`2dUmXPbH;iDrFL3VdH(xtU1o&D4UIz*I@zL$6+~U;K?OGt!I&E_T zplmFqOHP}sfg3gboT`FK@}ea2B-L1gG$5VJzd>0_RhZ9K9Yj_I|5nu~|d^}%{SHSII%chWxB`8tC zIxL^mm*_1t2kbkT*!eVclQB;BFXpY1AynI|vdQI6$Cln>A!>2a1bjHnUwHgzx#ExBLIn8c;l=+|3OKT|Rl{TC zYr$4~lRZ+ZEf;g`(+u6ml4c|&0`AJ#8nKDQ_QLfJ;8=Kh{P-{yWv)Y{Pq-B=62Y>L z{TuUO5Qb09uRs62Wx${4u+&~`-nzaAL7#)G=V$H%Kkn__c(A{T8-2!Ft)MC#$h$yF zCbszIy24?>P0_5MhhMo%)4=jcU`7=f!Hg>(k0+C=DgufP#W?~5U0|&YLsKD^h3oxY z3d2zZOLKxE$UyWm4-Wtr<{{srZFbDL@0|BVmWd!gNj3y!H zM@B}PogCb`T!1sS$Vh}#qaOGlQ=HvS5S+7-ifiv$Qcu_KeSY$n!*eI+pM4B;r}t|1V>;Gq zes~^?{P~6X*~g#4Kb!1tEc#~;_a8sIF?(ZgZf_RX@vf}z??1%z^*VYP+)%1T`zt)r zgzY{s8zk7SzMh^0YkHjxzvu_?jq|a%==XOytl==2fCNdhlfoAf<9yw%NiS zj|)H$XAW$vU;^snxjx-Ck{9s=#U4(L@kByM$~+#3+gOb>n$?MkU~p+?3q}8nwUuid z8#wMU`sqij?LNr)Mj&J4e1Ys>HW0|B+9m?U;@NlJdhPXZA8H2pZ)woC4kX~nVr^x6 zWusHZe#%EtXsMm}>UfR? zy||hWsW9|;uRu2S^)*?oHdQd~BwJD4Zs0p?P$b1T7evF_TtAo4O%QM$_(3e~!hL!A zF$lY#1gk*nkS=6iqPv0YLO_y)gBgR5V&HEoM}-u%(%D~d;)zEd7ZX-!S`re}kSxQ) zpvD;n#Ge3x5Qt-NKR;TaK7!z7KjjEj#x;#iuu;idC^S}6nNn%+?gt+r>A~yv#?9K< zy2;Cwf)MpgaBy%ihs>AD;_F;0k}5?q#ab~30&v(F;8h9u$^;nA<8R;?2!mNW*K;~e`8^C^88ginEm5Vo_u{~|J^gQKO3IB zIy`*l`u^WP>gYA$caJ-Airats+l#NheDMMcM;Z@~<;T?q2S@q|U`;(K#w#8z6qBVU zL2Qcxp2?DgZr(Hr7}ufrP`q3LE(g;{$oO-$Xxd1#%Ss3wF5U{PF6aWug+h)txE?Dx zL|&20WnL6zH>HMw-Wis*o8D0o^dug~%>V)o*slRY@(Po1ffOk+Z?Z~=#@vDZZ3KeS z0T5Z1VYG6r&L0)2MQv$ooo-7FE-mdWu5ClMUt8ND5aqO74udP6U0qTG1$i033P-I4BQ2kbt8rD>Xbse9;J$-g8Du#@(AYYZIxy zE*{XIpa`CTk-&0*Ycapu?r;L$8~?1=>JI?)^E7u>5;`$-MLDs-oTQdn@2pK_E zlQM7t;gqq&i8q1nbe)$tR`ZBryag;nIFWEMg0AaWyJ0F}xMwol&8p>cIS&d{0ql$q z6-Gygs6utZSlZgTxeKAchOu8PE-eLvzHAl|A9>FgytE2B-`hWWC3UR)-VY1aUSFG#LJP zy$ub`A%4KJjJvI|fzsr{^~(=7Hy=M+$GZQS`;&9Oo!fgpw|C{`-bcNrAZ6WoQm$LE-($yb4-03O1rzEliY3tAk4$ z%PZU4Q=s{4i(5;N+H)|*A3aL9`?3MVJ&*w-i<3R2iF7($XpPbk{zvWbI(;^m_O<(r z+7G`A0&u9aK>sHJU_*;2Ys+qahf1D&h+x|-2Q*67O` zeRxJQax$KgWNGx_M3x~BMskg*ofsSnHY4# zR^nsL#p_MSla`ijYA=;7U1tc_XcXCC5w4oPC|GkJDMZrdVyvn;S|r9xquH)RBN8p* zKD|y2MQd_Q)Qvh$<4-|%6@HiMg*Zp!sV;)z#~Ocxcx8tv=w8twT1eLMKSr6aN;b|x zk*J}LM$;tlCmv++MbH`S1Pmh+@MQ+cRzBbDCiB^PzFSWv zyY0%`F96_`FMyYf0Fc1!!y{}TTF;37%%HWu-*2UI4!B?jn2?YLkp;*sUFERLqmPs? z{&?fFQ#_}4_tx#(KY0&_E&dFA-g|fd`2GV3{^_%S99+G)BKs4gKH;%NKFIn&^6@;5 zk_(4D5j)C9N~IM|F@h4|6rAJfcvL152sVjeOm3J44y+FNm}ZCzhX9;4CLDG=%bvPX ziV)&?zM#dT)59Zsn(ldwj8A%S%|cp55Rpg-?1L$QL3F}?K?6F`#)(6?5Ya`cAT+^t zP)l?eYA5V;`g#Nm9%IVQ5*R_77c{1JWn-h$>CJYZ%ltsOX zKt2dOko(y@Zt$c)33PHfeVgIc+zlRFo)dRpcjKGgR zdWem~4*JRSDgRgw2a68txwQam#0@;vXf{hRPLl{>8Vm`KjY)Vqc>Al<$DjP-{k^^0 zxVLi~4~Rbip?~`9>66h>!K$fx(Wxlq=cmVW1jt+RbMeK+8!K@^HACTs$}|;$gE)yQ zEUu8yXawCLQT0)=2mJZmbWBOuOTnO}&rxdd)hZ~)7>I^+Bo3M|0hR!ZZe|+mxQqgS zfSG8j_#A+Ob!^_3FtJ@U!@CwT1(l?-g|q0@f(AODfkl(X!k&{NO&=`$vzCwvX1?1Z)aDv@oyWc#)4M&QEHIyMeF?w)T2#y|)5huvS_ z+!7fDdsm34?83tFthlxA z)n+rXCHjg%tf&ek1hxwMM5J+xO$NFaBvy`05()LYXohrfJX2*g?x;74(TsWkm%^Ap#+Qb^|*ofy~(5HI+;6yyLo% z&vC;l;pS=RkuhUsuTg&AJxYJi(Ud|#Xz~VskKRit4fdIP0 z{(gV>{qKAY0I$IU_|{9?fgknTckUb=4C|fA$xg4*?w@qCn;Q|SERHK?aMzY6Msj^3 z#87PE6L$2`li|(%Cpb>;i)YWCef9Loiv!{pf39G8`kvV`JkuPnNLM$7&iaLufz*0vO9e#IO_7CL}8(OOgyWT=G1Scw#{fx**md z|0yf$>LkZ`kn)P@00Zchno3DY%YZ0UXIZA;vn|tFwRi$H!Lq1fm?BQQp)Qqh8iih9 zL<^fbmr9XXY!QWiZU@xcGUh$Lj*jjCEG8?d{LOqF!Vh6h_7)(Yf&S6<)gj)Sx!Oi; zFzEFUhDz94)K3k1zb4UJh*pnyWi?e z)`0ceCnw8;&Ln6eEi&#GZG&!Y`A8_l39J?5BjaJuan$njQ+gM#R;&N%0stbvT>f*B zNFds;*+jH$i{*q+sVVuQRA<5*6KOIWCoWl{$MP}`ftOVQXKe!ymtB@L91!)eCP0o; zQ)S2m7s47XM|52m!m?b5#SLE7godZ%BLN(?wo-9l$SY_P2zh+`M@i$HvJemA0IPI_ zOcV+l$U6rVrU(~RiPZ~DgHo`OKpmVQ$LFUq^Yfea-omG!o{jka(WB#Ij9CS=T?$P7 z;i#mOg2hmo1(OeJBDDZ3qE=g*tPSeW&7UtNxxDHuhlB4*2(Y>hdbd$7|d9RYZCX`wcV(JO(J{&L6g~HG1OG% z=JeIo|ITE+e7UOYCfrxn$6IXNxCDvqb6wXXM35{XY>_9t9Fql3PEcAb27RL6&ow-b z<5@|aGp9|%ALcoY@Sy5cvB*jaQ^28nF+oxUUIqt&C^QDfAM8Fi9-GDoa2ZC@v28n~ zH+3ytk!2;Oq?PLvYQjxu1#mA65lqvNBXR(vI5|5UWc)^SDz4)G&!w5& z-Q5}6W<{Q380r(p#}{wR%p|B~l~(~pO$v-meTFHBPNN~nkqGBFoL~f5oCY(!5@Bf~ z9#=r2<0%la0WV6$2FEp=h9u*laF7?1p^2~}o0NKDKm@CnmJ>LYH+H=lNo06k6R;0U zQvoxnsa&jdBVo_!pb7!Vb(7^qRdh6+4TA(Mm8KI?AeaDiU^2RDf^#s_JTIcx*8wn8 zULr<<7skdmHZjTo`H=Vcb&RE)etQ<_9v$Az^M5mUEw62?SNsoXyYi;(rWDGhv{3G@ zyLo=2nbGJmH7X5{hc8fdIQ~CArE3hAm^Olr9k z6jeHCWaTWrsHtvFSBjdb={zMsdRuNeETg*KewAeyHT@ARz51s5!c}1JINr(ad!AYE z>GDgue@mqZYKE;Bd70;odQoOZ-SM`ouZ3REARVd8MDLto89H+8G(6?W?-gmc?@u>i z001BWNklG}MDZ%x_HR~SZtrPz+J|{32;UeEL%P3+=I8Ud4~b9FrTWJ=QOe-Y1)x8T06+w^ z2QYvd90b=3Xu#ECb+m#2T>R+|&x`=V4EUuT_}8_c{NVik`_HSwMLt^U4i<~s$ID@2 zvx88v!~q?zi+OZcoFXcMAk#WU%Yhmw3sL;fTCO0(Tvroe&X3pSWUHkx-gJ7N%Q*8z zmEPBGh7Uz6vdkN--V)QAE-NzKxg9I-2%Ao%yrZc6*)}~xQuORhDy2CL*dRuV)WFYq zUJjDYv@({(7%KW~pB}5$+@=TQ(9ibAHYo(o6ct(^%NcI5Sfg`VG&~0B7fl0nKc7$W z!yi4~UemhXr=MtJ3ugalRDj6uUjp+Xfl>XF00JN+e7`+xPfMu!;SjdJ;`>1SjnL+0 zed+|j3|^A>ClyGY-~i;m+r>{fsnx^7!)#fZK?NcMo|^*v^+e#$fBEtD>hb>5{q?S2 zDygM;@cH&J3sZQC4CvGp0JkDXMbA@JuGl(dj6sTRZc-nIc5LkgiZs3bcKzM)yLTcA zO_LKg$MJBCjwuMbVboFoqStdcSb^_EVgqD3!jwYkex=4UY6~} z;pgGhMOD{95aK>?zePkLOD4QO@<(!RvOkB`TcBPCg{2QMN1Fc9Ult0NG}sB}y4`tutF1=c^Dg`#2b8xUC^D;BL`Qlw8G>I|@lGZ(C1$sfsXWh!CzF{3Q#h2gNe79{ zmLg}&_2c6mebdxAmarXO5T#^Xbw#>LRY3x|wv|Xqyrat?Y>6{_^vD#jMB^BjR3cnl zir4AVa?XaE%Yi)v*u%8OP8xfV9nG;WF+=B1J1x^-lwY}q%@v)D-D6sWnMeR3uW85x ztw{Iafv7Y2P41I51{Q( z{llyIH036T;B?gba=9Gz3G%aHgQpPA0gw}f_E|FhvkK8Z;y*wFj2>3A1@V9Q36;QX z6)M2zMgae-0{*_X_N7hhp?8zvX{Q4t5ZvDl+o_Zgi^@8SLs}m;?aawZgSNH2jKt~d zf-H)$SX5Q5J&W(>xu-?J;-aQ`;oFi$Q%#)McE+eP ziT1Q;5ksCK{%c*r*PHw!HtMmHa7#Spa zp0}RfvuuvnG$yt1(P}Nm?8AeDROH2U+Aj1LcX!ZwK>b^U{`NY^4k|Yz6g??9DE!dg zQ4a@y(H*uE?JY^2c4@*36}Y=m@E=Af^8)h3Crd!Hy~!fjMZBrmJ3zhnC;bUnAb>s? z_)7}=3g1Ln0AN@wW>4W1_;=3@0DiR>uy#HV$O%67Z`z&YaASd72-@^o>?!ZWImK&2 z;V~Kv4(E6S{>LrlcQf{Wu0yrf4g3FjXjPF&rT)5Bc?{r z!s;0YTfdp4GZ`A~^>7L#Tix`=XVr4GYBa|C&4Y|Xudnc?nNF{ZwCUGq(19h(Fd9S! z^d7m)_3U(vF6;%}^Qvbj;!fSLdcCdr6qujCx}kRdJz2baRQ=-uS}#igo~8LMYMRD* zN2K{^p7-@4-!8c&B80-X9gkfS1C^tS|4kFDR?zqW3Vb<$NeJj$00XN@KaBNmb~d23 zkN)b25`aFFAXv=)Mnj}$paY~#Fo8V;?;jmymk+Z-cNfxs z7Eb?&8D`nlDwGAY)goAYewGUGdlj(uaTuJ3X9U{7z^#qz+q=i?v{zJWIk-64ZIXe` z7~0F@SFh4$Cu!(vET&psH73wy!ioPfcRjyp<5~Q$*OjKL>}5`S+CB8Jsx*hyUTm>t>;kr{FVa18){NkDcR zz&Nl8yzFKbC5ja-?W{f=jfSRZ19C+Xj`ePXY zfq?G#GbiUXbO<(%z5oaKh5(;n0{C?Zc=2g61{CmlwV3{AdV1RMZ*Ib1Tu)$a9F-e& zuPDb}@?~5pUP#1Z0-*(#H3%TQS8}byqz?AAmexM*_tQ4sJI}`e-6d5bWi;DPZ%QJZ zT>f8tjJ51!az{#7oBJoPDeN~ENku6r6&k`l1@WE}MS*4|37hk*w40S6$JjRBAzyka zTbtsW3RlUt+v|#eH{F(9JGH*9rAT4D4(Yow_`3S?A}ZxP+|9xu0Hfka4nlXcnbS=G zavfCes}KvO^^A6~pXoNI4LH|;2)aGU_DJ-a-~g9C;QGY^89pR;@F0D0d6`3fXn;Wh zm>v>6z51By0TZAGsLxDq3Ev97vA}52@%+2LfB!TQ;O|ht+Q_+jf4f>--jC1$06NWQ zQ#qX>Y>9)Y%N*89DsA`Q#g%O;A5*rK8V{I`AzWOpMFky8z^h~9dsc-ZxG%{9sGw;F zxM+>o6m3*en*w1IT+K>~7Q3~jB`dgpE8BN%yqS^|7^6ZJ3W{MI(iMX;sFYnS9vu~n z+u$ZDdf_2nD$H^<0jIdKZ_hvMwfEqCcGhnC`eHG|$&6e0H+-GX!+!^0`RFuPy(UI< z%)a><|DVi2QK=!?UM}0Dm_lur?U3KD~dx>NK|4 z0`>*W=e-e0k;KdN(Wb@GC011=(Y9G4ytNbC1#(yt#1_Tw_4~bpxw0Imgc7*HjwtXp)^IWz zis4?zH{7($(>Ni@%JM7h|4*L4$!EFP*2{II_wDwu*){zo#Qa-$|Gb(EW~jgPuCH@B zoW^n-;Bs(2oe)br)!cMiCmLM`;tz2=V*TANpn@?bgj|3jz}F$CW517%px^gG_)R@r zhA8s;s1gQ&!0vA!fal$;?glfx3OU?yuvqV4)!xAt zeFW){@f)L2y|8Vl-R9WyP}vJR$O9Yjr_&tk*x?lhdQ{WVJ7etj(sLffhal8Z6^@WV z)aj2u5aS(S6ef7l7*GBz3^5t#fHrj}QUV|v05o|1eS`p?W&-$iMc~DkdH3oH_XRYz zuv!w{e7*_Cgr-ZhXr=Qft_arLDCY&LL<>Al;L)n_+C4hzA0xK2cR1B{-&$vud*lK$ z;|0T@X;D6Tbx3RbIAGe!(2^u+5-x88cqbjaJ%bdH;AeUc-2ebx(1T14W{-^R0ltq^|1nnm zJKs3k0lu{-MaxhLB*hNySh!;A0G7N+tf?yJA|T6oXE2oT@5tvL#D)As=wS zA92$(%L>wd|3E7p9x^JMq*R8`fExrsv%vw_L&hkfUt}fQP1_n(It36=*%9Lc>Hw_8 zzs{#m@?|-l)>@f17IV(J0LNx`H#cjy58$w$=V1FV#5146`P&@OGtY@IIj}r{dd=P4 z)6+UOc;azhESzXlLp2fvazOI{?|nmTe&95#SltZ+cq5|sbY%1p6{1QHs=a7q;P?Rb zA<`o*1UR5~I;a-|@Hep;zy}(rhqC}Y5AFZQKRi_g_q}Jx%hRh4QEGP2`MxhuLxFAPp z#$Z%Q(`>wV7(S;7gX>*5TiUj4O~V_a4zZ-XuFx@_V{2S&FHxYABw;5}*2|aq6F1Jb z&W1%i_H{UzUs2lun16M(T24B?7ilzO6z2iBLD&x=OzWu8nA7R#;^Ja7ZJ_Oa&&NXV zH5T-8(QBGRln^<<0GU2y_i<<9!{P5;hhgqf09f=OQJ`GtV~$5iFb*827Y02YMPY~& z;S9^boz7r!35G|l$*jT`jlIVGU;g>*yQeAv{J&x07i(Mo`?cHE%&e2GQMcQi!2e`7 zlfa=p!Z5UNg%SdpR`O0Z<${fZF305T>W{Mg4CESaP6ZlnyuBqfC^%jH^45T$61 zE+B(^`Q(JBnV(oWzaevsWf76aijahHfx`70+^Y_oolXcC0DyjhjbB_e9AI<}(|5472OIm)Pmm5g zR&n%5?FDwIn+WEbC<9^ihtLj2bxa>%f4KAj)q{EAY!4vOn}gsQ5T55F2Usq_x3C)E zR0mNU2_SpGOV8CC&wu#ypT2wS0(hzj@V8?^YqQbMxIeaI7Pi?fKu6(nIaUF<0|`Gp z{V#P_)0;+?MU@`)Xf)I6nNiOoy&Cl-t%;O$CX1G4SB0T~!hE}op)k$2jP1luVagU% zd5556wNz;@%%&`X6;yIc>{vv2(AZXI zIrpCXAftvzdslICTJ7yEcF2P1CGYQIJO_MTN3Mj3A|NzC4+}-#!cU>~;(9LE*$6)5 zy!3s(McNPuJz8JKKmWlCy`(-o1N=>VZ6u%0Rz6O!g}y@_}?A z0A+n-;*Sl-F~{ToPMv@K{oAkq^4CBA<^uSX55WIZ!0lmwbaHZXc3$dxqWNW2fBDiJ z9L-lmu9{lg7Tp4ur9I3-I>vhf@m!G%w(e9a6<#Xj=AU#{7b?Z-c6FQiyysR5>9kiY zRth)~(J+W(Rg5*HLV(tE#KP7ZPCzxA<*DBz`qq7}D>_hmM)jN_`i!ZVkh;?`sDg&mZ=By=GsXT)srk z|KBe!PN45wRHL<)f*7v@&Pisrl8H=>&sp!an~ST3em>t*2~|ArP!BMv*n_cS*hUHP zk*v=UTSuwx(j1Vr3Frt+Shrs>A^Od3#-tYFq}yT#MVl>swdlx@-?yYDA@wtC>k9+` zCjb?LZh(>1X@BZ`ckj;KTmSs}Zw!9qf7Sx}!zYdZl`BJD)sBDunR)@Wa>PGSb;v9G zU|W#lfrXu&l|We9i$IRij^7$5ilNZ_YR=Dx6FbkI%{9^ukiA${z{8=rTp$4OT_RQY zU}|j*EHRvd^xNDBHUgq+-sQ`=V_bYw3TC&E1iT@-3Lw%vT#EQ>?Ot29x}&p;i?3e4 zIyrg%{FtU~3V8gOIW`nz-7a}=nOQff)(#Hb`#mDAQwX3P@PGv;^k<0&c&&C&TXr1{#uTTd(#g_GeV;lG#vsE`E0M2*O1*+CBAcd~>?$&eJ-WgHYMIQ1x+8_zkd(d6ZkXq z3I5M+{1N&88sPs?FW~mur?um!uU}uBn|35hcbh8UK14egZ&b)avoEYB0{%cH;i1goO3;l9Vj%sb5R?$>o09a9_s@xm zTsB*+3PL=%*K9PGU4zv;U}~Mu=6J&wbm59_lLfb%q`sc6t5bllQO-wntL^p=?#R+& ze!wQYpkXA-GO|q~Pm^sNfedIli{mbyBtECn%-$NYu1?F+*l>U?@Rjhctr593FdUkOgks9 zF3!#Yr%joBz|dtNA?g?<2aNKdzbpvuwS(HAkAjaMa5f!eU#+up4ft&Kml?-_>O)%S zlB3fcO&l5kP~XazXlcjncf9K2^M0nCV1-&oPhsdaQoehgs zV?065|Hr>s+_S(3_6&T6{tZ-r2LE-y|Kk*J`=Wddx;;FGk{0-KwAQ2j$6izNbE#@| zyBrAy6F>f#*y17r&li0nAD1LIFD%7UE)OsGIZ&c^Pft%t+uN#2dly8~>hcE~CaZP3T@H$_ zIe*P=Q$q$qJu?PEMDiU7Ll)VDF)@W?l6G~-@dM(<+ISOlOi!AuMo`yo;+U4w${2Wo z!fHMQp@s4<19D3%O^6R5`jITiB?2{xtluB>oC&MSNfcBXMalDCHVq+O|u1%M*)vJ;l(oXA9tiUVd%6x)$OeB#IrSP?o z{`HYgvpXCpYV&~EWo*&}NFEkg9=p;-P8x>7+Ix5tVga<_tJB(tPCW<9Q2T0TJia`; zM_ljw_w}AZPuR1_|Kc-benS6x!GGn-kOwD=-Qn;A%)1tKNAtZp4gk$w+GTL`xZrj9 zim`CGu_UFl09^baPj>{W;G%s-cCZ% zp(c+^!##~AdCr77{YdQ^+s(!iFh?UmiHc6DU_$)@GI1n9D>C49qgIl-{svADN`t{P zp);Lyp#f*!j}jdrs`V`8JK*_u?%cha^WS6tCBvS;r`Z4f=Sco6`(G3MuULcL%7^rg za&KDga+wyU+ZmjJUhgnpLpkWp|H|Ff{IroL(Un%am(}hZIPB~kvpGb{hjNHCHwfQf z8$QMfO%EL~>1-e~fjDtz)YHFN&B1cF&`8Y?iCo&+b`+~+wS41XHJ3D2>^WHSAvQu< zW^efu_BNM&@7E+DKt^)~A_WDoky2H!>Q%j}esJgM4~wZAeYbCnEPlDMG5#GFco$dJ zSEuLa`|eJpQfsTJfys%PTxz`k`e6Uex8p18E2;5k%emaf%uH&dShT$cs(g-eUTjrs zW!}_^neACyNkXkTj7`L1EASb9C7lcUo zozh#(mvR3--_!I5fiELphCX7S=08Q&|4z7m3sc?Qqc?MF(*xb()4ANr_%shWjSdWqPmSDpJUz{OOlyE| zr2JAPcHElm=2NdH@2hc!TjD0Bfqc%rJj)BHz7GvMo3#h7&!uhHJ=F6e<6DYin5HdP zH|1F-WC=~UvCEMRkw2eD!uP`vNUkKBZ->Kr?)WnSuz#aCobs@jBdm-B{)}uVI_&HT z&)suT19JVx;_0UnjPLtbx=zCUx2As=_(|l`_@^uQk5&O!yX+VRdDE}VO>SlZ$eI(V zcD9n9AP}I=Dy)C^3`rj);po)J&==nuoCwCDheFOM{%{&QkS*8DoMiyzjVz;*XI@s~Y8 zT}%Eb>>%RZ6qV&Z+%>*@<;sO~()NEl9`|oep9KDg#y@4&KOzur-Y>u0YDPxo`J68D zitrr~lz8pZw%MaCroIQ~zjbGRv*&A+`R0xR;t49~m0zebP7ksCN`);zj|c zhXWYdtP(X^JG*iF8T|{1tq|%UHApO z&ta1|a01j6ftjw@L445HyLL3+ABOw`%ztnD1LL1Q>mP-HqRl6Xu$AWPQMt9%^vjW! z)$Au@BezyIa)tS!N2Al-Q{Ch1E8YDI!!s-E_m&qnW<~~=md3xG?e6Kz@sSzD((^g+ z`xeLdyWn^*exrf-=5amQ!leWgsNRuhRyAP$=H}#N_aq7r1hFaEHeABAxsRvAMj1g( zhhTGu=GP3@YY6goI)bicWCjpi-eL);$x99Rwgw8Hx01yjp-2@kI3EJvvIqlK-g5Tp zAqqjq4NIlK?9?w`I%w+titXQGK5d@_{wX&8F$kDy@`5yK0~!Lh`H>qy>_7}cxv5WJ zFZ&>cvLg??#@AIPFBftE?4ClA4ko=C)d0T z=`bq2Dd1j^8NkoNdh5!u=FTTaK>tkJ{#X_8I-TCGMjk3^-)lFwUv|B|3g))k+5zK^ zHMgceoSmKL0jTMoyF~_majj5L^MV9l&T^{qxSlH8bds~9;M0X^Q=?%Jl`CWYW1E%0 z6B)tzEV2#B9rtzcH#>p4V9k#}4nsI1tGWz31VYzTp#i&5SUO1Tirxu%q60pGqHdp% zE@U03Tb%JB&F}5)qw=oG z6`$}HI;S&=Z1@MNC+9Y_y@=ojy6gqHcm?5Km(9VvurybycaZ-*E0BjCf?_s^JI_0N zmk-7LM~c1U9Pez}{`f>dD>kEuT4}(3t+utb%gAm;?M93sZFj{_(`4)Hj_-T5SG=dX z-E1~lhATXn>BJP^>uPdSF%z(Kqf&EtaJ>S??sL&fk&V4%pPM3FR4J7Ds9=*^?By9hUy8*1j1{m`Kxs$^8G&LEO*6G( z(WsQPh;{zwztYfu-`n})*{Sn?`$XW{xvMYks^y3SaL;SBTFqva(cSiiFu?1B?N$jC zO%*kG#V^0?Hn*D9GUu_e!v$=U0_srbgkIBB?o0s-3WXc9x9x0&;tbGn*|U+te1i-5 z8pnAwEgU7!E}Yci^Bn}72L+y@L?V0*A_9 z;)(nj%`DoKZ?M+8bn)Uz1phB5#{D7N|L&}R9D;zZ@?*1{FE_k~qwva6b-TJMg(zd5n`)qtDr%JiZ{fr&$jv(x*;@+CWw1PA}VpFus&`qV5OFAOzqY zoH%x*U!mMLjZMxP*xb2v;l#$?p{DN1wmeW3f;sTx zKo4+Fs!xK?B{~YRnen|wUTS?6i?{ZKMiUFE>+%uihD_`YQU(jJ@$h}F`_nP>x}v(2 z^m{H`A=Jq^<($~87?rtFEc5+^i`Ra8bLXt*`;S7vAN~vo`0KgzFWRMl-ITX(qjGzH zzwLr4@5N51H1>d%Umy>p;=j4bVZ27Qj4Gv=b$+-RVPrSQe)#J7^%Bbe2y_goxT9xG zsnY~O=N1Q_s)Q8rfA+5DMULYN69pTAM1qk)iIEMGOtd13$YCL%OA-kAg%w2NP}@=k z6c;#=9oX@13s1TXKA7&h)nP%W7SxCxnx>iCfQH(OT1&cp80bT0#2(gvOy2ietDm#$ z6_G5VoxMoxYUiL=_3C@?ec$)ISISfD2(bgO5l&Zx`)y?+Hs+u!44A4Ljin&S57 zy-w^W)%FAy^7Nddi%X^Y>ec=&0(n%?NdeM*X`SG3x$^A%+*1$~g3EdttwiE^Sy?Ltzyby;?lu-PN0aTl(me4{i)(no_K%aL|!3TZVE1 z%pQ$ouAsZMq43T*BXPyipw)D{3*-y5bkQyfCCK^Q`lWZJ2APL0cP1ozHZsS@K@Dix zx|ga3$sX=KO8dC?k2Q7QnpNN*dEFZN&o2dB`1zgTINwaxZeNQC2GBcz{(C^dPZI9f z2N|bu3PZr!Sk>!ax%Kho%NJJ%rAc9w2y9kCOoMDp&>x(d0@GKj@IlDc+_;wzTGBn% zz<{kquVz}7kfpIcjp4&30>wHl!J9gS^AhY4Soae$pob?!)1en;S-;;Ogu1>9w&sHZ z|E<~0omuz(AjkgE6maOo@l*d@ALV%--&p(dVnPpr7ublEF+Xe-BbzMlWNaoz|Mg#e z_|GpcfAHH6ul6LGF=-luU4`h&1S0@2`yF^2fa{hXeP;gfgOGyHV;JWvn)Z8LR$m~B-J5^8{P%x+@z*N@aQ8a~ z+^PuAb{3#LC!@%rWe>HjPor2n3o{)RQu^=&1Zwbcv0oh>JtPLfBO9jZ6F^M)Jkje< zS;j-aFNLupjx5!PU~qInQVRRu3zfaXK3mke*GHy&oKoY8#c|vd*^+2eR*wp z<(GfzB?(=9bAvKKC+qfZeg*%A&#td#Aq5j&>6-nxBxZMA90Cfw_YhF(oUId}u!B;E zwHaC?DWs_g@stx-;OJwT=Yb93${KfAl|dyYnB8%#41F?qJVFwx=!LSk+LP1DKV|ZFPiP5rN%}N`TUdvXv7NL<3lFAxkD9G6>~=z`2++HEm;VP`oMsw8-~F7do%Wq z&IbDPd%y1!u%i~gGhAQ4yODQXrC75O!vh0E3PRq~!r0bOg{nKA$}!o7{dAeAgHe!g z4f6>`XfES)sv~5D_`V~Xvd;QE%D9z_e*d(fkF{*$Q-nd#u4;lr$6&%(PN&Mx7~ntt z-tPhS=D~fIk%cMJ zx>nwY3126Wm=B?k$4hmb)9lVBI!a~)@+4TBK^Te2 zdG8+qdvCn1%$@Hp1uWbd-uchQa5&0S50Sj?1O{e&N-(#_vVF4lh!db5os(2|qS&*0 z79oL@sx@?Q3HgNzTbbfki(#q4XHT6-JNivmpt*yg64ic&iU=o_)q-C8qAatd*Y6hv z8u}pWKCRC9!NYrhHw7GD*uXluQ8T7ufO0!~BH~N%G9)SyEs!97;`6vQ%a0i= z7L|rltA-IrO_e^XKgg|>p}Jo|ZjzY*Lu5F#DJP)wV;N6|P6B-Tuk@!=*exwEdE-Yj z-}}88d-LG`zbN47J4gW=V;q1H0Re*ce&Q+T<2_))nAW(*6^yazhZWj5XzkDeFznh^ z!G9Aw)VWK5SuxH-iiy9lPGTVs=6NjSrj(Ilc~g`nSwbJ%oL_+b!Yl>;WAFV8WzIbG z&o2cu!{J6VnKYwOjQF>SpmHgjqtj*2TU9n402p&g;q|s7sJN&)xojmP7>nGpWN0ch8u;XS89 zK!6CE1M6eOA|QVn5j4biShs~vPh>y>Q8JF$&08qU`~ulcVBW9j-Y=ZmvEF#H#`_j^ z#ym6hi!BZ|EJ#r`0vGhVqAFdS1E(2N=?0Bwyn z4zJ3^Y$sRYvI`Oz5@mg-~al zdoav-d!IRf&f0nvQoy12-d(sm9*>#^7C&%s&g&>v#WrZ)mKE6!(_#<0pI}+1mK7C# z8GP2z?72_gIJ0++w+nG+9{ZP{0#2McKWP91=mdCzey&bC!fw+Es2pVgz(Fk0)UaDL z;Dllo_W*b=V^P*mPw%G2+%xCTWB{)a$j3k{(;x4>DFW4PMkY;~#elDAe2C*>vitWuT*0c(zyHD`SDYyfKv5wC%}kxp_{x zR66V+kDMQY6d=dK7njZM&qUq|aBR7c>$vjgH2Epx>V2-q`mA@PM^!w#?C9^%S560WSiI<+9B1D*E%AKIDl# zinihz0Y<){V_>bg=ZQV`c48UFlc6b*B%xjY+?cZ3Lt{22DHR2}&!@cqC7FTU9ojyoIY5Pg$^seF%=t{yU*u7>m53Z5As{iJ z5`q5G{u+-`-GqdIHxQgl5S*6Ex2oN4Z+<41b26LhsXCP|9fB6 zeYfgOZPoVde7gHHJ>9!ovm2?ZEQ5;l0SN#ApvuWgssjK}?;;cc0s8&aQ$#fg06>q} zXy`z6loa{R9qpM-Ega3j%%1j6@8bY~popiFskto}0x|vT;EBt{fp5%bAA;UoA(7YwUcx-cl&2lPEv@1 zjhl^^i=9WBjhma3Pl{WNjaQ0`lUIzJSBg!Hm6eO4vroUf-L`}*LxrIZ|UC{mj9RTzaalxM*bK3p636E|5IP@ zo&Tv&u)}*N>zspR{-qh+n*Gw(EoQJ@I@3jw5 zRn(A@aZ-ebhll!CgMop0mywW=XlbcoU}2#D)!s*dKp+4JghzlUAR^AnNMT}O6IE1T z+LBhNXW=Y7-(3y*c6l$UVt;Ls82 z>FG`nrk`$(g@i=Tb|!9aZY~a2u8x=9-rmlSHV?N)ug`bzh>0oaKJM=Ak&sdz?M~hu zEn*Pho$M{2?#$ia-?Ol=93Sr7Umac@%s$_p^YigOKVEMywIA%QpPVl5tq*eY3SV6w zo}cV(?T#YiqCGu5-Rw>hQ`6n=&(P5_OG=0x9L+JXa_t=a#m7R~Uhhe@(OTOY*x6ng z?`y`T0Nvl79c<67&o>g%QQlwgSV%J*otz)6Pi$^&hdSxFY6-o)K9u|0&@nT~$jZlC zsM@M>eKVFH?5ZE_s5-mY)EA=6b=3aVSke2tA}PpbWxY#BOY^(8d6~P(;cEBk#$a=V zTbRD2h`4lspO2lL{pQ+CjJw|AN-NmH!e2v3f`M>lb=Aj2a(1Dfivri!&~S33iX}{qytlQ-8-tb7P~wMl4PJY^=b#?W% z1+nP~p)Rs)Qe3q5`f`89a~(gM7%K~R=0tQ4C!}j?q}enQzZVP_L|yq4z*G7&zPb@K z0y>!xCoOXnx?5Ml<1!gbO4;kwX>|4NnVINW$LY#JhwAOt(qH#)x4oVv6?o5Bvj6}H zASWrN;kkHhu%t{Zhegu49Q_TG(lsGBJ!+qO*Nh`QEva&t#^!4{MD9hEMc-F6H~G-? zHHXRq@dg{+|I~OPUF&+G#ly9~3LDeGg>;#)5}^Elod{6RH$ipdSOiL!9W@%m z+F(deHg)GSI&~*IfitYrM-$kIF-u=RX?5V;8OJU%r#ez<3uS=2rF$|de@!PA0V1sL zg=bI~HvE1U_VqJnawi?#I`W}oOTgpv!}Ig=R3U7;BxO#Zqtn~*LS4(n#YGEP8HzGD zkY$r}Iple0sI)XPvUF}F14dd5khAJ4!n01g9r99BgU@0_++nmyrRql3%=&cAeCpUj zdujX(SK(L-^>Gd9k6>ChQ3u)G`fA-9nl-5lVTm^_uTUMQh?mT(BQ(at*=)#$-JT07*dHlk|={L(*5Y`D@IO-R@F&WEpEjl9l&q>`NI3^ z`@_qlfBt07ebvn8yqZC+>S3fDtUxU%f7hLL<}>Wq8EZFwF4}rteL)LY4MA8@!1#A< zJP&wNm7q1CnXN${L`Q(vz!Fx2A2t@SOOp%OBxPlXQ@-jZ$jxIE<~4)W&;cewfdVgv zk}{i8T26RPqZ=BhzPi$?!a!8bVKwysHCmdKdE&oZqZ|yu_qbf6l(EpU zP&BhVMyHv(gFv~wM0$WZE|z$z7!cX_XIWKX%}k09t(0ye7>6D!utD0EB&-C=msNFx z{ahDF#Im-EvkIRW2clg6vL6XTb=TGfCS}1df9mwv`Vu`{uor#Q`zMzOMWU@~SVm$- z6F?0-gQ4x8#cxtUGEY?3V_*-iNpcFdX|3sjho0ev8sBroJtuDzmnX3~ux7N5uO00^ z_DevA`{)4M21P>$-`lTS>c+Vb$HX3tHuVJ^uFL^;Z?7MoZ=D_f=;LtW$7ey&ZuolW z0rQQ+y+G$-pum#tKJc5IMu7>GDyDZE2;pzEjClSeO2yf4y;io_JZKCwVSpT<%9_!) zQ#fZ>bG;qvkwgP{&H{xU;*Y3ZqPeRBOmc)f#aSQdb_(8yD=113^1GWBUnVe%c zLQR?YdmY{EZcI)dO4lt2dd}H7R1iBlFx4QC76xkLv$=Gr$)kLSjfK@nK7N(_*%|vN zLGfzRq*j%yt2D)_P*0GoabU$O#MnojeH@Q0Wg z=``iOHonl+zM8ssOgHObt-E}7f$ob*5}D^E9c;zUEcrzOdbD|JCkz;5v}|x6H_h_k z8&JPlT1Aa>kvnT*G(x9fprVI)ZDN?m4N*OHIOiVe!L7bOWG{w|Q^yTchJ|272SP^_fJ^sS~PKi?D+ z=BA?oH?_U|nju7Kd91Cl@~FZL2%RPp9WyMG5` z4+WI9vUey%;i`OFgD_ufPSCbbP@d+4u%Ob~=Mttf=;}Yhfa58KhSdqM0;vw9`4w%I zv^vdk0IQQIyoj*dSkE%L)AzRNT?eLx#W{CL?NkaWMdSwlfMA6Hb*3atS$WR}@WZxGXxM z5x(%W7#C(tFH9}TU!Y%{gRSa0!}r9%>A?GeCJQH{EpV6&-TH~9L84kwth%8hor+r~Z-5s70ul3<$P z5Ure>OR{wRk(l(x)de5bjBG9U+3!=n7}ormz6&ysIhj5r=%{Jp4MphHzsFA2w$eUdou}`Jc-{6&SAgB?lmacEA0^XkNwq zG-q4S3Kzaw1f6pI+@W&}yfG$SC^Vgx9%b;(PoF4ReA18e7CPLK3{=t7m5htrs*8$> zd5NmyU|l=J2_@uw@cJ$(hR%VV`;iJOoC~7ky!4{K5A^S&8ia;>fx=OH#B`pnw0B~; z4>IAI{d zkWjS9co$0LP0-L-05yV1vC6iL&P|cdB~00asiQsb){YI8tceZ?+Y|Bh=r}PJZ~j_J zES#+UWv1r1^7}zHCcCvhIscU%|C>RG+dLso7`vSlIU_`r4k5GGtcUcg?^svUJnWh} z9TmnPy{aPWpWJF61flIj1s1<754&1$O7ix+wc>L=nf}Goo#6PBe--V^LBS``rFO#X z$8ygoQm1cMJgmNQ6nLoz9ZyGtB~(BU$6yHql2F+z1&MG2sOH=70W z$3jI~wGoPQ8dB9JSpV~c>`EtgC(bm8_>>WNy$*f+F`Y)6+4$*3(_oLO^{%oP(GZ$< zd^T@SXYT{aj%2)dlzBhGa<|!FRMr`LwAk85heBC(9AJTmQ~RI1j)u4MuE_-2a9Y|J zvJT#6eK>f44=-JH7TU( zSZ_ZbL&MM@f_CACrt0dv%a@UqfE!?N7Ky;5t6gCd^#y{e40gy|5AfVGb=cWcL2dfG zn1+?w8q?u1V3CyTawyOE^jJi4nr!l#HU>SLScuoNxxpH)eYdo*461FQi5-C=?y`JZ z4s-vbR$xdYlVVP+7Iz&|XzsR^0`tAJ=y_`a)YnSqUEWA=N1Q_92b}z0LwyX;Y#yc29f)Y91pfMbPd7&-SH2j^t_* zKN+J6Pa7NV{bWK+Y_%V9pRv_gEwSf{bQm#-rCsM|q72n^d7?cxeLZ$jQ{qY1d;;J| zNEn>yFWkx1b`x$3=f&Z|yeg%jU;~BCJ2HyB5jWrJH5Pbst0{Ft7`18CdTw6S9OBjJ z5pszQhjLZrhMt*i&IEOrKZG8XFU=p@YH?uJCZOBzPHe-;z@aDzEv9osjEiDpgQ+Hd zJzCR_2A}5j#1MJRVrF6Af;mPlYkb&>w}@(^(W1YpjYBa_5ihGqiQ*@;(NpR#``wSX zzF;ACl>F`O-{D=yY?ST$u{37h4&CIW6VLXsxEc$(tSpiDQKAnzLInh+geLCPkRmLVRVW>$FY9 zz>Inv?r#MT=WX!6rUd{y&3b*P9tB@SKR}=m_$)_vuuEp0g+{?Pw}cOXG6ByI318yV zR2pHuq)`ow7}$jepwfDoBuR}B>$VPiZl{K*$YR#hD@6{sn;%}a0x&E9K(@?yug>Y8 zg`oRIzjRmfDva->10{w&H>7eO;f5`PE*Yzrs@`jMLil*e zb`Fvxi@$1XwTCW#m~@;9E|k^@v8tT2K^Jh51^d=!)>GtyFvm7#$+~9reVg z7jkjw2iFJT?tR8440jQ|Kt5t|_o-cp!JO#Fa8nFY&FdaQRg~tw*8ouP|`mOhp?liWh57|p`%a>2zgNV){v z{h65Tv6Qq#X`k{Uyr^CuSd!`2k9g018;&?Nwa^8q~}7I9Z+eaX&PbAo>bqufw&rFu?E zT7ipy`HlJIJ|cEpI@-H{7Tgq%hkANK{Cu>1Hg4SR>+A{n4X)MgI<2Luo;aGdWx3!F zq+fLxI~Ty;;$v-#-s`-Mq|E0_miR~ug}Nt#D(2Tt+)+YsRq#Bx5~gv|{ME*$6b1K1 zoKO@|m~za*Hl@RXz7@eG5ycmKYNrHW@nI1zO1 zRd?bwwo5D*Ab2TxgzSfg$S@OMl*l&k<#fN(*5P+sT&z-cmYI3`=k`|k>BtnZN_Dsz zcR2X;d-ElnTqH>kmA@@)mo|qN*0r*FdX^WNlQJtmmQS>SL6EXkyFOW+OK2DL^_7Z( zCR(2WyP$*K=AvnG&PNNG%l9#1W61Dl(H(*zI%^D z`XlP_vl)1j1)lCXfqS3CC1@{b8wQCQGTC?Bx5{_i z-aR)rV;g5@%X(|eMjfH!53{YW$Ej`5hhg6hEnq4}g*_Jz^f}1~L)=9wE?%e)rswt; zfR`w*an*yoRht?IaU<`WG9d)hmtc39&mt0S&AfqkhvEQA{#*af&hElto1z;W8TlZA!3o@D$($>jq%uvTy4r$oPX#~VmBUOob;UGz+BF? zeXkez<7YyxT!KPEe%{_!2@MSmZ4IltyCn1ePg;(39_A-ot0y<6j;@|t<1tIufZy^< zx2^5hn7nSOG>##ldonSV*l^=q;?nQ9M4TudlC79^EDA!|omH_#D}DW*q`mCVvI=++ zR3{@v1cJFajeidGXMNz&0O#v2#U=FVQa?X964qH4d8$rLBuC#y0dQ(`ryP1NBkuh> zDt>mblb)TPa{u@SfOJ5QQ11JE{NC94)a$q=A3d0U3j^j zi@5T}$*=a}LJu8weYgJ{PIyIUi2zNd0|sl_vH*uTNB@bX7$Nie&0D-0?Xesmo<%Wj z#e!@4@p&2+nrxPt;MgvqhW9nS^~lS9tFwE+KmuK9Fc;z~I}c9J;>@q%oSaV%i<8ce z8)biF&fk-3&GBy z-c;-7D|*6uFVDDe*cTBDVCRMxFoufSGG+wTd#Fv{A#P*p>dFS_0sTGC&iN?6sqdh3&1KYf;0TDY-jx5wXdrUX;DUId#GT>M^P z-i^B9_WK(#t`18_Q0iN0=qDJe9`bShd#F5$c+DmSSXj;(0se&=ecR8VGP7GyDgH(0 z65b3NxOIT?RZtOuo+KE*F#+)`Bp(sx$)MZj7(F5JVwe5$S$1WLgk!v1908)_Baw1vjIP z`ApFity_G*y97=)eluXMyzz$hw$T%`vU8u> zevlM=!G66^MI`7O@SQ<-9xM(&6M+-b&$@j1l8wPf2q(b4K8EyFSj!S;Ipn)bNY;!l zJ8TmUmw8(CV?Bd3-{h8iY$YYfIc%h5ESQ(Qzro^>eUoITy+P0D zS8YuVOo2ADc^8b7NKj>5CH7!?Cwbt-_0*qpi#;P@So0!A%?70&cHZ*?=u7C465-~g z-*rym$LS;F3**caj)~}-B3Y-=MkIE$-L2`{xZ7CUz?lK;PO@KFh=W_EX*wvlKtY0; zw@6MH7Nf_lZzI`$ZX_oegD{0pIaK$scz+WLdwh>mvfp45p8Q4sx?`^W8blMFm24fy zg^~6yIhmgWgu!=>cZw14OX>PYMUqJx{H_{rHORmv(B9mO-pDS=$;AHXSQDLn^o-ko z_vM&@ZPSCC^9E}x@kGH>kor@rsORa5nAP>>bt5=ohsnECuBR4dDXr#6s#Zidi&!kb zY0=KN2vEk;DvIF5>dC6G%#xB$68*7+Q(hFXdr5OI`3(Q*aUI<8iu@+niLNlSZ#2;rK* zXhDlXfG><+9EqglNYSz5LJk6=j9|Tr&=wvqz=i zfed=QuNu(tEn)$xN3Z;XB%{4n-^4^(I`9|#*|R-`NW9j{)j}gag$|-B5$1AUzh4-zXqZBuJm+B0{?<@_B>aR>hl3X%nGe(RyQ4hc@OXjRB zrgui$Myz@*PJlARoPbIUm`h~w=Pnt37|ahu1}I2*J$v7^KSmx8$j8*I%xaYr=Vz#x z8q+ieaHMB$H#oq4Ca=oG&dLy>@(h5e6s9(P(t0BMk^j>+tj3d!>O%m~kQMvKUK7hh1IH-C-`6+V9z(4Dh^}5? zmlX|PsKQ)+scb;YtI4`sbdB8Q+(Y@2A@ee>_fLfDkR-Iz8S7mgX;2d^n@f$yU;^2L z{+NSEawU&37@B`6Ytm#yH0UWF?P*Qn-0c+VFxHEmnVF;9i07tPOvQ3!oI$I5g3lJ5 z?l{v9Z!$DkG&#p^z1vnx^togVslGZE+ll*x+1S9`(O;D}su?%gPvuPq9P;df%TJJ@3z~8t`IyEmu)nU0!^y(K~LFg^68Q z27L_-eiKZXFwwIE(dMZ>P7W?@e8ur3S6)Q45_wu8QF#2(mS@)*NS*Hm_t)Eg(OC7BcqK%$1`GB>g3R ztSc-1UP{O{R=VJBKbhur?{~LkZgrtHM%TL)k`U7Ka1iJEG_?P+vAW#)d5yTTU1b0F z>4_Fa;X~V>b8yFAAQ@GH{m;3ySQth;cqsAa=}}I@um*oRnDKJn?e3Y8xl=R#D3@=u zBw6SE@rG?0@otk6(2UJ@^c(wWw^{mPvIxNt?($G*P|B6a<`p(M6%qyx?(Y=b_U_G| zTezla*o^Ni-_(@X^meqp9inj46cljFu5&NGsnR89Dn>iEqdN)E=2>W?2{;;O>~d}H zTX>lW7I@8UFFIiU-ZRl=qSduuYSgN$mwJp}to`-7q-@|%ep&~l)z;RwyM)@6?5gO%2N_yLNfP26hw%tRlIGANm%d*L|RO@Cr){ z)Jd@t)D_LK6v01K>FxF4f28t$OJQ#WqQ?tUAtMFdntU-x#z8=Aju7__DNmi?{25+A zD9C8^SbNqsJo;urU7&=*z3sQQ=O=uojd1-fRg?S|dVv*EE5}7(!M>oXRo040F1`0C zHi7dMnf)e(Y0QZc{qaFpu5!pi1q;m5GR#OTZTGxoRDXB?R^q6xu?G#-gKzi7IZJM1 z$b>m%GZ|0lUfCU4)%46LSGUkPpA?p))8}=s`$XWMy@Z{lU`7SOSU-Ab6XVgxFBL4b zmD^t=Ucu$?yIKsmz7y**N`2*jhrvSyK<6`wd|f{e{ndS$s@tl=yC6kTf%3NU%xBME zz{5>Q$JC*F*F%0HC!@b)CKAq^9mijf&BYCviHZ3w12V45>nBO!7n(SE(^RRFCY|WV zT37)DCgRZUBBjT_B7V=wT9xa>cwan1<{WBFA5(UHN}<;*x_ZnmD7IuuIvbHW{6m}9 zHd0doT-mb+LRr5^7-uRSgI+Qbn*zKMwZEoYT1{T!X_x4UyzKnO1;fhku|~6W;&@3# zLY2UiZ(k*jnd^?8){2wEORnK3-S3l&KEWoWX9sjVHNq#uE#*HE!)G%g^-Iseb$$esv8|Rx`b3e)GE2 zXzuhGd3&2quu|h3TnP9XQ#tBe^z+8j8IAZzZZ$jy(L96cK+p(1JVZD_# z5jjug!>vU(jq=r%SC^LN4mQ(z&`YzeYX${8o&`0=e&N7aYDuH+hKUbK^X;F&wBxje zGg4#m^P#DZ;%-n|w||Vl_k5j_+X!etb*nW z@Scr8_0rV%ZJOqH*NHoS&w;PeS)WvLQ~Q=ORdNx1n!v7+p3A^SN5ew3o&evLT!0Pn z&CF_LAjyYl#*y_kwriK>PrX+66%=%vUo+G^g+XEwd(>?31u>X+wSW7bPZc7rabFH6 z3STV)P@u129Gx(x@j%|}gu1?6ZjMKe$=|1MU-kA&_&nT~ci0c-9;L79m#u|~y=Ww! z;!aRf5_f`$6_|0(&KY17FqgM5~$#iATorWBlyr@Dmpe>G8pyq=8xRcPx0KZHNpd2eGU0z))N@ zOIKlPE6n4SG{K%`Lp^qd`|)@GWs2hXonIMQaCUg)Pv{gxAn@{!j`>I?ZK zx<`(uMF2MQN+$5feF-*t6DsjXe=&V0uD(5iHOmFhqQpGyo8|m6V zWyQyz#G*In%lRLPz&q0x%f4`m81ni7csLy4cww!uJ7qKNTlghiH%*PMUkS3ai17`!-mG;wH)G6#Q6jYe<#^U(z_@RAqJpipfksEB1}ZM(P_8?>|GyaJqF z3(_@M#E8yYJ)XB-Ha03<0_NNqhGO1B(fK60SOkV9fzyUq_Vk$Jt-g8JrYS)TM zX^2jT95fhTkcJ2deHxk@TG^OwA>1ccEe;BV!}zd{|9GIPkHtdm!Dp-%?JIb)#wDU% zaYq*Y?J6={sB!++b#cnLzHy9j_O;x>Nt)r7`bUM9?eIyL(BEka zaAp^X^)dpmp5F0lKeFw-JvTdxsvgL!Ot?tCN8ZKps>*(!K_3!*hLX8c0^s(Uy~}32|RJdiz9LVtoS? zN`wy~I)Uqg`V*?htZgKj@5|l|XC#GO{H?C;*Q1U3>B!1!k5~><@hCxES-l{g3g>o2Hji&ytCK!YVgO~1MAr;prs`b0s1g(x` zjjSE^H?6Jh;>7m-6)Nc$b`zf#ab+XE9HKUKhwSs25TL;hQYcacE<6AL53i?gMj`hd zwbyL%Wb#FwV^#=osl75!hdk=;S{Z<~L6nd%@@?tm(c&hXy{U5;87R$sE53!7-e+B{ zgUZ}75TXCR-BEw%tQ6G+yx&;R5+uC~mvFVsKgZsA_@=Rbmj^}g=eW2;UUr7q4&g_4 z<8MI&YT~+r3uG&(qXwN{t~8f{FU{dg=-JU}1(~P=%%qjxiG#KbQfhR8QCD`#$pt1_ zNb-d1cNoXWK6xr%KYj%vof8)blZ~nwV}nto7=vzFr$ixQCxs#EthjYMh7? zC5}L^tT2Rx1U+u-N(%tDi?uP~&qp!1G~hp6_8JPacBCr040)a2-mbm0jLY*wd{8VwyaE>-)B4*fR~&(-^h*i655x)r z@%s?YR0=_+1q2KElMkZMTs|ML7@t*6n=?nu=mCkGagxz3zxqIpL=lR8g%cYM`Vpeq z89ZUd1_ijF459_E)rGSd+hMP!ys50*ycE<}T@0N1E$p2LFQ>GhSn^n6U%=-D%1-=& zz>#6VA=JTs=vqnz4mCJ9ROPuXg_o}Ueg9b_)tM;VWKr_xMQ&sQ0reb_8EQo?sF_Gz z4&PgwlfhGp$WSI z@0Nn;fS8ttR94xoGAh~w9lK6(-f2HfbPn^|h(&u@;TvzQOv9;0+i%NX5wOsGXIeZS z?k;%>OG_18_BfYbSp^~Vi<|k{-)_-Hfz~HX{vv7mvwxvJn0H97m}&c8%&=5(3-ym4 zeKSoN;hO!~5z~V=q=9F*LYxe1k3*3I9a`nptu&7grU@?~)%L7J6Wb-o)hC^lB#UY&0aS;!F`GzWCbDwW zf^^;fs6OjFvi=tg%lCZ&Pk-@VVu*A%X8G0a$btt|Ag%mwSuD@tys{IgKXikD+B{h& z=uKqn5v+Ya1V99ANi#|?`PLGqgJ--&urPZ_bP5_0h5R=Z5BW>zkL%z}&LiyiS01%O zcKr%FJDRX>Jt9R9zU&Q+558Ol6-E`Q=Tj%b=6FoVhAbb?D$qorY8 zTmDV02EyiOWw{cxp&uK0mR_XARYa`R01ev_eVN)h6QETg>L;i1uSlZNg2T_0n%1>qC>C*qeFDF*yTv z15)=W3IfzOIiqG=hp1l<>1*xEc?ol>X0;adb+GqZVCuTU2>n1h6L@x~K>27pG}^+i z5N0Mk42^A==E!{kCkddW7>zSY+<#$F=d&xAUc0gt zZf=z^sz?zghe)rv2rsdnnaR2isF}Pp9K)-s}?Pi8J z9``($wHOKuSfIq(#*hf0i^OI>qovu*n!$CWBd0EjomdeFZ=*=}2p4mNX%dT_qog|D zjd)N*PFa*vrJVDQXC@?#B+0iB3ukX3ds47a9mrt9n5!{^W)cjAa}Z$1gh>&aqZJmR z`gIuPV1JjH?9-b50QmO>z!1hJsdkPyb8c-sEPlT?(Nyd>b07h5s9GMR#(zAktfbcV z;igD`NeZ||@g>5m_9xZ}EX3-!{M(;5gLXs6>Kqng!J;O9KCBG_%oRx!pZIr_x?;hY zw2!E$2eggd`OKV++SQnUlYu{leSjA`BNMjEwjKa}{lI!7ZSHs{OQA_0DYIc^)8DVY zTw&Ee^rf>o+0j#@PIiy-9eL0r%24YkVbr11~zP>xA)II?iEPz6nrv8bI!6%O`bc6|y{ zAGt~_Z9p|XK5~RmFJdQVUB=y?{c-^VQ12XZdODeF+BB?xQ3207)5rA6q0+_t(yYsD zY+aSY(Otf*=V&Xd4PPBup1<**K15x7iIq{;O zpQnY^xtZJnw)$?~8F?WghSjD8nrEGxJ{Q)r_+H74MVU1K6+x=6j|qKH{=$yrX+-h8 znV6&Eyw)5`737Pf`XTFET^FBk5!MGW0UOU8&!8MDD<|Sv#QoypaA)40(#rO)1L#{8 znf)p%7dXa7Mq#ecIIF-jL1Vr6+X+hmAr3nTsqbKI6fUk+uzI7`66;>zfckdI(v9$mv7Pn1_pyS_3WUkp4kFd2QPE>J`Z zv1w5sB@B;UHP!b)<85W_8S<1;eW1=yrRu4J{+83QM0iM=b*d|@ zCljv9?PKeEaceO887RygK>BLPTf7%JE9d$Ek{=V%^FDA-t}QNxX?A&pFT%S~p>+}r zuLj()N5_Z*?`Il{aB~1}vC3=0ZJQt5_uUGfRY;EWCO1H^f0+V%c)jaC4ZQuK8(OMK z{Z{Ce9phL(x_s5FYgaa~5+9pXXfGJk$B%J`sXaj)t+&P==iFp&T!=DBzakvl{-RT5<4Va1ym3=8lUmCIqakNqJ_hpIRwwd%oWeGneJs*Z zbOZa;eX_O$iN`0_7h+`6OgMR84{z<*(|QL{N8NA{$&>`l8c^n;e>^QcIW}&flyGa1 zs>FRjaR#%^2U#0sQNKy=vkyilBoQ&ex>0n?tp-doj zc?z=KgYhWb04Rxbs7y{NWRJ_uKZ{{Uyj~e4WK}J{;BWup&=$^etNVaY20!!$wLTt` zZG`CA1nmjU`V#g8S}N7emJl9u91w-v~kzE!mV*bicerexOAf#xeXw32^K4putv zQllOOto7k21a%5s&33mw_UE*c0qRe9BA7`*h=AMh7Iaix_|kdlh55C$SE!fn1X@}Z zWuxD`UKa;_=+(;p_g_@9jWRL>U!EVX+CL)6qF5`V9le21y#p5ctEx4Ajup6(asN~= zQd$hZo%)5YMvX8^<5m)R&U%2FU}k3Lj4Of56Df%Dtuvv>E;pLOYv?nwn7VigG0}qh z2WUL8tP@TQS~@y$Mr@ACpNQ0WG`XTwSQwIvR~ZVAJm-(JT`kI|u7A9;Tu+~}JSeeI z!gygp*BT>ly4nXuRGhhxS3Z+$0nTKYj@Yp{|c*zs=4PHu#!x zYVD`9c;;nQ1~|n?e)@Jippk3Ef-&6r>(?ZQtCE#2+?M=jrx&)%_A+8N2BzBD+0PD+ zzvlmTJ0RZ=Vz$mKlh?U!Q=kwSf33@vDsYd- z9XSGhKd^BjD&$0Vz9r28cq}Jo4T>ClDi7)sLxgwXWetn%uKogL@kK&iHuw zKt=2`iD&btjmd`ns8I0A^-fEu!5;_rlG28YxJi6ITrqPmrUSOo(Na6IUa5StVuNac z5z60#W|zimkU*@f|Cdu9pLS65*?`F70nyW111hA^?`Frea`>orL6B@X*wH>9`3L*1 zw_TnoqRK|p>7!n?D$RneC?0=@`O#``M$6B64DA0<(|Lj z!GJ0k2zhZ~jO}NP7K4GQSm&!1P)1Qw!ww6s4w9mWKTZxIMk}t9XkfOyJXM)V3+k4p z!yer`nKh_p;Hy1WKuvV<&N+%@=4fK@AN}mG&`IGGnx!4uY%&e9-I%X)7$3(d06uSr z+%aWNmJ}ZKSUz8==;Xkojr?Uv!!c4Tno4rb^fdfitfBA(^WZ44%afL*Rk-3UO-+=l zscDn?bZqxw$n|4AfdS0QDV$DVwpZwO)}5;Kp@793g+mR(L}uQXsePmA-^tfjQO)MP zUok&)V{Ob$+`+r6(VpFLC}S*c5TNONNsYEnmB6}AK;lG;9PpR{+JT+~DO2LbCB$Zd zoRrjv^FOuvmUWIGWoZp@4RI#k1$Eogo_k{2ANQ1n^joi<<^26k>|bL~FI)_@`R`hA zYw<1D3cm022}LuNqu5a*kyw|-qG|c~JFa8-I7TTD%nFHgCF5L z3K!BFaZB=+22QzrS4P{P!4ovL(;WRH!XtW7`W1<3e_zRmr}ikWec`8DG8m7%{UIZc zF~A%w6>|N61QD_DX6xouf&8ZP=rp1t>gCj)6Bn835HwZ1QEIb%^DhxHMRb8O?`1_t z(WEyIrF;q;=%%HEqqaHr`H5aEi*U4nS^&4UksH?;n+P+`MeNM!zYIlaLUKf+u(yKT zaHuyps0ul4c9^Y2ueuJ!Qp&oXv`vSAM7+5Wn7xTb|eq9aCzQWl=1Zf!-Azb;yn z3lcKgEpysY&I}z*Ys+u#p;YVqdd?FT&%@m72amROkj(@<-s94uDa~K%!c33mqK{1@ zWf`*>d5{bRzqaPMKE6|EUVZ%#fw(=!?XTmG)*D8b&lHpo8f#cRK4eaCcz(}nmtIam zIUSN*6HNt?0ZbKMAOAKvi1=V+#k(&d<+Fwi+yLtcnG<23ZQj^}(}@ivSE;;D8s2OobfTf6d!a%LIe z@xLvH#v?*mr_9eCg$#nPbeK6uNEeIw=nGJws@1Dp3j=+8TC0Ao7-W9(6*le}s(Jnd zbA@0rd(KMCkp6A7AHK=bLkkn8_e{49{{E=Ir{6iui&aQb6ib-q8guBj6YhTL9;Xlh z&3$8%@kjVxqVtUQ+`sH4viD@EskJpOWt|I%+{{9W@&5o{K%l?SBtbxX;~$L2Xai6f zQW{{HKx}|&Q@;5{=1yuT_%!5YEeI(>=wDX5vjaN7ek3VF0jzWv6B_98)yzZ)rN)dk*1#r5KAtkH_iO zG58u{EhFt#|KKVuAcI^VahYr{^iGe5oY%A*+*(RJQrD9*5U_`<3sd7ofQNfy5Z=I` zC_exX*t@&C3A<=O7{<%j;}&i&Uj}|K0sMM%b#RI{5R(eyu;d%F5C)&s)(D_shUM_K& z@DqD65vkqqzO}QunMlyXfiu1Z@jb9g=*uecCy5DQ3)ne`djG9kw{G6NcC}}6a$`HmD`H@B+GkN zRo(8s%`lv}KR6Y;4uF@Kt7$bF%59J^u`WW26*cXbjZxtV(vtJXcGW(f)}{6j!|4Ne zoG`N9BrRXMwdjtlUd#9bt007%*MRoaH6Z*lAW{C-&8t1vuTK`QJb18j@7}9duZ7^1 zVr+_*xVoC?zP&lCeS20*JtMK%?JX9Iwj?cB&maf{7o}GGwD*`|M^Nvu-dONnxG-8s z|9#CiaCdxue%Y;_PrEu(1zUQ)D*V}6)%3FA!q}X81bMHu5khbp3b2M7mFg;thuJx+ zp6j8x&hd92?B!f=ANTQlbN@RB+ByepZ6}ZjfCHkOA}-CE4{|qk?(kBfKOFLX-tKIv zRjj_=7YL<0J2LOjC1W1Y~zSM;L|)K4QVrlE5$M6MVQmzPVdN zzMIZZ?8)so77*^Ce{)>9GCbLHb$0e@Pps#bpS16PNfVd^{@Pgi=G%MszP-1y@_=!N zHh_3?JF&UC1)UO+>rHrxNTAsfHh?xjO29mTa|FFj)vCK%bvSOg)5&l$9A2LL)0643 zwG*ynuiF{i4%@<+^xdlYmYFBM)Uwydj$(~xo0O&_?RP6Fnwd727*BByZH2aAzJ71F zkCHq9A>bF5C`sV=%?8d6?DSk{X5)jJ)7s8BY}!`0t*B~sD=+&g9r<)RHMIC*eQj$8 zVrz*f8yXEMI^=j2PDw*Z$m|AVU??Bx`YW`xXlv9E zei&4A(Js2Ft{Smvwu(XrG+PS+lReM-Vdr1)rP`*UYI@Fj&htF)`<=Ix57w589=9@x zBJH_rE$F3h2dO_4mn8Y|Fk%wSD zUrJzi0RA&x6nvs8%qSq3UGo$G03ZNKL_t*Ua>fi{{(zuL-_p_1*3qW79oB0!zWo!$ z_DjLi|Kzz{?Oj_)cYo^q<(skR;ghwHss7a_bHLT#eQLD-`xemvp%OO=$f{+Sdy8jk z1=9YjeK@3ir~9=}`gCr$S#ujh{U`(a9#-LCI4h7-7s=C{I_Lqyf z)17f!axfVl-`P1WFcIb)AO!G0i%~8h2|y8!XUZgC2F^b3*-&eMGMouy=OcXVF_*4f z_r%>`?D;vq<~QO`si+s;K8+&-CS3Ge)Jh59-D+%Bt6J4*c2eWf>G|oq z*XiM*GXOaOF2x#O88@zYYKk#}}L`GN!fCR)YVrT=dV*t|#_=-g& zq6Etl=1))uC^(AL!V39$$^!HPf`NB1gm8MijjfK3!6$bQ*K$77PVaPRdS`n{cepu8 z)Zod<;ZQQ9n+_>D|2eD3sPw!ctgf?TYJgNCsFX->B^{fQg6mSmSA3p4PXm8??Gxw# zo#wB13sZ@g8DP~+u_Rs>ef-$g1yE-QIE#KZ7I{ELpJF{$G)rn-jlNYv{dv=>9Gd;V# zU$@&;6wy~)8r*Gd#h6)@wnrasl1Tac1Yidd28b&_pA5o=tK9?`4gBTx4ADTdsi_K2 zf!}v8O+C1Q8UMJQMT~2l1Oky_R^6k=pqw7(DFU}9h?!ifRCBrOqM>mmFid1Qn|5z)7fK6Y)mo>KTJ{_E>o7x=h{oyA?& zKsKU~2eTYu0Y^;0=~+x`Ud^kL)?yAvipVUlF+I^;w*}eLFb}6(Ly4j%ndso+ZX7*Vzr@s5U z?(XsJH!r^avVF7eQ>Kqq`p;j%{uj$CL=v&AN+u>DO&DMhDjTo#_^2`sy!NrioN?}4fR8JRUJJn-&INWSO$NP^W7d~05fQz*(fUcvKdD! z;NVYn!US|AoOnwx!Zbcwb0k8-PZZ1sI4s&INT(*Dzmlw}WnzgZHOUr&T7-T# zL%6r~?(UPJ!)aeJxmsIMZT4l%W4r&_JZ#EnLO*N{=46yi6`dK|W?j41_>EEjozWid zl;RL|qf{)dtiEF)C0I-3L#b?RkY3>vf(P>TavZ`Bi^t3H<z@S-WC!8lWo0i zEvlue^H-m3x7kSToKG)hZ2K*?(Bb*vbaGsx@EyKbHg5j5-Hu~1M$*TvH75cQZpEqq z4Y+X!vvF}9sz}h^@T;ra1j8DhX2gs3^4&GlwgVN+>}pu5#~c8CO{Ezj^nZp`S8mlCD!*T z{49iCD<6M!{;eOwe{gg}7_b#vm?)V|I`?eIEK|%!<5p)W>mil7=%?fxjgDHaj6x8D zh`)_}@C4ri1U!7=A^g=y0k99G;XL*e=@Z`!C=m*K@CEs~A@u6~c6|1k&-dnU%RaZe zTDErEtnIoNE@nEHibFa@?q&F7)z`GNT!*M2A2#kPwuRaRc!CK zOopFz&W6HaodP!w$~2keE`egJR!@?!X4xbmx{OiMB107(nZp=S0#Tt|tTkgDL|q^TOR&xCclq7B%GTdL!jPd#hSC7-q8P9{(BtBmAfEAACrFBmU2z0t?jlJIxu> zY|boDWTR29)8q8}IcogT6z5HW0y6r4d^}2Dk!ZpD_X7ib?OP-`+9k^L0; zJga^FWI-^PE&iXm>-|Y{zv6F}+;@AiY;X2v$&zMo_F``k5OGQ$mZG4H7sVeukqx~W zdK&|Ez13#MY^rj8b&5osv$ptjM*DKb;Ww;AArnf6vsy3}{W1H=q z^L?oI?k^C35Q)B!bI#|S&*z-)_Z++!j|~Qg&X_HDV%!?BLk(~=?T^(R{qE8J1;BpZ zzOuTXonDSzdc2z5i46_^X}mBD#8|J>o7=Sc94C{=luEotRN263WO7_wPOB_VFc&O~ zLCZZf9a!1HDRDp;NMVOkj(0oL?jKwjq^gb$o6ojf1TJ8<#$tnoK|g{(>EFdUjCx{a zG^?5V(8H%0u064dFH<QYccfFS_gP=ohXsGN&{{PXje{;?Q%gFm2H z`0nbfpg-m>=)m^Yh-)+@%LAgSmaoMz*yPUrKGX< z3SzZY3d3}(&W<~lfDIJ3$AKgbZUYG*)pd;Z=y6UL=Q0ro2>Eep7cHQ|w|&e#f{cHO zLci<+^j$0fGv7@B$5~)&BeV5BDWqRLe*Wn3>bsO19KhxCCejHniiRZ;{)&|T%VID? zg9K^;ZgH3Z7vYcqwTK-eBmh7Lk0Aj3;p$-!`-1;6^Su#!WMF{LPxWQjjJXHd9>>Dr zi`A)zn~j}2-NwG2?Q;%=p~9e^o>8w2>(1D;pV=S}bgnoQ(yEFY4ZLl5L1qQJDHZP! zJi&rsSq%DdpULsefr4-aSB(e7KK=t>fD*5Rq@}4BJro3Sa35U)-*~4e@}unm?4xrO{$%$Ae4y|bC=&oy{Uh#g{l5!rZN%e3 z?wg0t-;RuWJ=7!&3(2%A;0aUZM_xcoP^e>-?ZdnIE3%3}FEl7AU8ErhZyv1bc~P_?5w$8SzdE$`pT4o<17zxh_Rwx(8% zZ)ySm&Du7zuJvAnLN1jkE2Txm@{#kzI#*3S`sNwT;)(vkl&2QkyJ_dej z9)(^K;hA1b*7ru|d}Z_p69Vjm-Pb+f0j@A(02#D3eSO~pP!UK9;pE|cukUKwgDE2% zPHw$VlL81|LWx=cWjR=M0!R;c7(%5O8AKtXdj2$4|D*=eYm_7!=HCDhz>5X^1+&@0 z+uQ8+f&ACa3)d%?{p0GRzttIcxo7#`OsqUP-E0aD&!`=JYB{HI+<1T|BajXb>mID) zV2BhaX>fI_QYO=A@Ge=|2|g|M(FX`X1n9Z;1#U;KH98!VmpQqz3P_-`MkA@O>aVIY zaQE^TZMt@C+qsL@LZPsmEES7@v`eGdb(<%F7Yq)C;9VzHTV#7w_@k)w_p!YjEgeDVZbo)SQR5&i`JI=QtW1j5)bhOe+k%>P&j zkQaQY1Vj{I1b`;WC;?#jGwYK&0Y$(;4tU^0zkjIJVu?&d?0n0>{?y|~tJ#%(5XDVn6Um0Sf1!gz~1 zc*HMH>S?jE7<6h9%RnR4fl{fY!Fc_8U$q8rLYD%L;qAyWnZj^nZW9j$4sXA`|MX4~ zV+^RaQ?1a*6e@-D?w*_J{lEui%Ylzp$8v9O)>pPacJKv3NCK{}d%f5I2#1*ngerij z0)LkeVsW^;;SqL|E}RSi_Ysm%8^!}ZZ&+*qgu|E(j{5xRz z5h>t2vpkVO5(c0M2o6FS7z@VQIw#KcS|%(OyLD<|vMx0EAh`1nGoR-z5kB(e;hIrC z^=bY}?DoT#*^sf}`QOhs+HAI##>O+7{z{dGR?EvP@CG@F6vecf3Tb_l?4(WzLJs)B z4+#RW40LpV(E&-HyJni~Y367VEdD>zDjW|qaQ=K7;9a{}Yb(sTN0*AF^qo0(N~Ttb z)0!#jzug^!$R|op)EvVf(msxLc}4VJPkX506OWe!*J~eo0BZnZ3m}t8GBtREkwUUR zg8Ih$jd&t)GeO=%-jWeq(Wna%0I?sENg@Cb`WA3`fgwWlr&4dI7-1X`Z0&T4iU838 zRt6$A?A^!FfZz@PcFfY!Yw3+x`3w4$g_`B*>ELF*5l{g>`Cc@J4qQ;K?C4O^a#4vySzq6zKC$=7m&Kq{rf$de$;&^j<(yCj z7$+x}>egSz~z&!4zSb3f}iEPyVO z5yC(S0_k)~jC-sO11?gS0DYpfnEyp4NO@_o0R>?cg#f1ZL{S)?A$tK4%+X00sI#$eVXE*^|=B8Z0uqPlKH*x9K~?~*6=3?7fUzD+~L5i z+XwMW7DpnG$;6>H1b<*of-egA0sg|Q?1A4+W(X?)95&*f0FDLV@`f>eg3 z*-=ptT9lOsPQepY=nB<~%~%LvJpiNtp61QZG+8v;34$B-{l4Jfee?+F*fI46#(Ad>_aaRSYtqA3KYLG4_W&Cj2H zLxv|ofFyxELV&?o>_%+G&hrDjJ)$>H^gdr*Tb_yKEp|Q2O9kn2P6FM$Kh zj=m;skd1mKFyW`y$^HSCZ}#=r>;F;{7{VGee`X!<128^L7{JOpvOVh*z9)HbgFWCm zgI=-jNfiIb+|@lbonGO~{sY^a-nUo1=>?Ds1Sx`*C1P}@B?6gWCi%GolGIH=OTckh zrH*9EN(+-A8wrHvYa}EAVF>F8W&?yapb6b#(FHmTiy!zsBas0nJi1z15)Bt0%Nq`AS8tR)y;YGjX9n9qs( zmWRdQ*cy$CAqmkG?$uc8%Iegz(V{8;Qu(e$w06-5pYEi{v!hVg}j0JUN2cS3SDUGk@62g6A}6s1z8{uh;W)f z<>%)z5J&-MA$UMa6mVZaz(Ps@loAN{k;!Ab(1*rYCGs}*0V`xSwy}z`$L2fz$m$z@ zr1z~pzVq%~=T4)Qo*MtIYixAr<~D!&-{{U0&uyfY*F6gJ-nja3kL`|ksi9B_9e%l;2swyB@eK}0g}OB zGAXQo00WZ~xaMzmb8Rrhve1-7gx(g@C!fKhaERrDNQj35qTaA8dVtp{6aWy~kpdE| z4~Gx%Y+<1SRFE+LbS55ub ztfx;|eR^^Wozc45R<-6Cdpz~Hf9(%{Y5n)s+>)#@m&;~@EMIzAtiUbnIlNB3B#-Y| zz$wbX=8&Tq0#e1GJ0rDd3f?|O5v%g^($106ulU=)TFfisvXzSL!aX$>{)> zpJ3dFn42;_G@9fPc7}g2L2sg~t1BQnJ`Ct^ViC3x0g~P%Ie<43V)L_!Bk{!jper8Y z=dkqR;YaC51Y8kRka56r>PaMo2*a8H)`q$Ip5q&EQVL=)2qDtVNtOao_W#6^&^?|N z>>vl&9mKwX4Xm@EMBrH~^ZATwI`rz*y^>d@wXfE!MxBnxA;6$-dZOt@#XoCIKfZi? zr?fIVe}aIqTDH^?6S&o|MF3Zneqf|7|D6PpKa#J|2e?aFHjC07U>uK)JQ=1XQPx z9(o-T55M1qHc&Ddh65!1DLb>JR1O)xh_4G}op9lv#;mbe%H*0; zs~_hR$o*W%^&$!MxkU)Dqx=USn4$CMOwjQQy2H%%Q#hXDIynHL#$?=;BoFBGrUU#U zUI`;saBoQ1o?Qm)5cFX%%-zJ47@WS|0f&KQ<`Lu(i##9@5iKIP06|UGk)sN{zwhj# z01)F%RZy^X(3AHosm(SF13fJ|5Pv+ZCjIJ@Z>&aJ72cZFHnsd@Zeny{c42z! zasM7MOy$MdAHI-C-dQ#NkF|0Du8~Kd^$QPhC%4C4AqRU(`TxL&+q_Tvl9x)c^n+b~DQlGF$Y=&SzW&clXf6R?{bPNt*VBkHc0BkEJ zF6h}FxLjs44-@q_8c&=uOJ!zTm9ffU!yiUjW8JElYP!3%G&WjLsC@U+taA2`mn4Hp zHW}2CMjlltaaD2#0m0wray1ogVQi5+nq8rEF=)04>cINj#|X6)9LKo$bs~k(2Nz|k zxFet_d`J0Tu92Y-Uhfvxj|0(z_aWu-Ag?>s>K7nja4RjpO}>Cw%ttp(3!eqn9@lO@X!o8M{b3nmf-az`>EgMPB83uniPT@OCI`UmD=rX#3*@6CKun;HsDRDY zM@EeU|JiZoVSA{&gy;vPpYWhNn3$iOrySr-1pqcRg?d+aHWH3Q6aB)2%pnk~D zUoFhjVIe;KeSG?(C;-1cSYM_OUb_hKKaINZk5ImeKI`GeaVigx)A0EZaj_Zt5tJg^ zyJ8)@tA-#Sy*pz=yl;4r7YPv?_<(hGo}PhiY%Is(^0h}A-D#b4L1#0<`enmal37Rg zHQQ_sn`Z59MP=vI^ytEuZLJPTZ!sB621zm)B*PV{t-nA~ti=VR**ST+1uAX{WU6@i z=I@Ro7d$Km{qnPlQlNl~xx`vjlmsfSSLWqqD2h}WIay*As)A5}UTx;#*t#As9e$ku zKB3QMiMANm3Zv4Cl1$hgNX*Z7b<^MYx4}*h!;*8l{@q{APIN6G##pcoExbrr~^aegDVUGHYoeAV6o|so`D{n-t1Fr%vE?dTPP10S{)9_WOB%|!F1_w@9s=3 ztQj3r`H8lgnlGovEVnETSN_~^tKo_~)|syqqqW*%?2W**EshVwAxE(wcvuVq3aDtR zsK1z7tt`s>{6>BKufD#D`%yDRHvo^qJ!@N;WL3*Gma-l`{oUOV;wA#z`|lQYAy-J0 ze4<_g;q8<2PCHM10@|eygI3Z2PQmFQcFV+uTPX^u*t_dyQ8Ux%a(5vO^+KU8TnLZ=(uPi&mFX{j z6`OW9qv@ys03ZNKL_t)LA*^N~1O-NM2II<*)v)JzZ$Wqe0(uoeLrOg7ea>^vd(Lwb zVX}V|v+3zA46YAlqv4@sa%%@;YfveJOwC^Q4Wa%WCKv%4*sqL?*EpR{2L*onr*@mk z`3I-yah`XI%?{q<;lF!*aeRGtNo)u`3a&4WTMR7=cUwI~1jz?%O_@@Ri$Y_evd(B= z%lH0t8q3DZ%8p_|FrNt$1ay%DbdB9=F=A4%-inoS#0U+j-xwx0pQP(7@)v0GWR;I`kui%-7^KwzGs4gUAn>9bo+; z$e+XKqhCH>vrnYY#q)N%X?Z-=m3nC(zld_csZ(64-0mrFEibR8NO0k)PLKN&Eu>?N zCIlG%X;lvi?IZnQ5bSCoYrg67hpEkn9VhghK9E1 zIP?*8fCK{UCcY0B^sM2FB0ehm(y(`Q7croZC4veBC?y`^f%Lbz@8JRMyOH7P{Iwtj zifJU42~>|6_~&Ch`?i(oX({{S#fyp5jT4;4pGai8-$ny5#D7*UV&#T3V<4;=JQ_~F z+unY~)ML_*w;&xGj)oyB4}n4!OZEr=V0IXP8FHue$Yg){j+0V9vDxWkX+X2{YZ0Cx z(&K9u9c{DL)U~nompbl&yioqyz&&l^Z612;ZqKEPR2jjgst^q|6a?62F#?5>g32Q) zAN9T%)MaTT9(b#>woqj#YOz?ZS&9r84^Ux=hzbR+Vq^d3Ci9u|rgJxIOcH|rXoQXF zvu+%3kJ7Ujn}!pxk}n`&X1AvgZJ@D(5--`6tlZPHkEY;#!hqdy!2 z6+Ijj_#Pc1BZ;>+Uep)Y4_b8GH^eQH{%lr4&&V``fAS!9)eL6R69_-v-hRxKL&975 z0I9%aQc(>;A%ICpcD%_D>eKOGRxp6lfZ!eMF#5qn#y&@<{=7(rw>B)g@{jH*U6@F)aLrx$R!Q>w^`6hY9=955gSa zA-nSdiZcl4^}_>{0*_MKrEEyED6eh~3IHP)rHsl2Q=NH;OA$0+cR1-lJr- zYkaUu#}$JHWXb>1%H0tvjo^Mn{8&1!A@h3;X`Ok(sqC<~&c5wc82AD)05rBnw ze>}(zJ|^Gg%w({C@=kCqIAsFrJ4C_e-~}GmcYe)JiGSpY26`?`&d<-Mp4soKFe`Rr zwe>rA0G@xigofE-9UMTb(^u9OVRN>Mtz)Agsyl)~0L_615C9Lj_V>DiLPKd4efFi1 zl>^BE3N>tLZgFX_?L5STYaI43B*cEN(g=Va4)Opt=|yJD<*)sSsS^w6g~W%_`K6py zdZmZaIfhF?a)6l#%ulcMVZ|7k;rk|Wd_u|M#>)1<-Y<>T`l|Z+VvZa@@&*D~Z<@Y? z!p`*e0rZddY@uZ!sSj>Ii3}NeTc^Hy&UWAZQBzdu=Ta;YdaTwf&G;&n(1W&knBMwFz#QO>lWC zuDd2UjaEynNmr&fmKxM32H)4Et zma!W0WbWrSOvHX_GCSIy6ANUmAj53JL&}i@VAh}59lQNw$B|`%Xcz;gGvyzp*GuW= z2?X{>DUbN3H$coSmxd3F9JGml&?3I^oF1ZpD;v`z-o3rO|IE*(xUV9KG(mtr;+0~s zKXLy)?;D->aDc0q!2;j_%8ZXB;Y@p#n;*u8&>VyiCp#>d^@K zK>Mh_V>8SaR1FOc5ct#af3qB<2NKsZu)lwKSPG{4w1NDNEGPs zhkSyYz<~Ziw8bZG434iZTDijUdhY2GH+HhAqWWa@SwZkzy0EU*(79J@v<3RwQ?;lI zsY(pcldr5if(60DDtJCunZd>q|-sA%HaN9-uzQJS2gdE=7Uf9_Aq9j*_~ZleILH9GfgJ3Ymlt^tj4tvaLIQEh<#yYI+oE_=bcbxW zc}fCbu3H!9)W%1P8tX!eyMNc_a#fcLS8W6Y6J>0ts1~c{jSvkX8VC&4l$}0$1;PA? zz;Ayy$XbJ}mM{NWt2VIKpq7hdcqqscd};LsDot@!s0ob$=g!nzxhzE#20(m|J`f5d z0)Yg(B^()1k};SCa?bu}ppV__q?ISl+5>Y+hcF#|Z+kEDLP7_8|qbfKTp9>N%l;tU>=nL^7!9#)HO|CE%fq~&mJt^USGI$U8t@ocM%cfTNf?GTCHA<5~|u*TB1^61DggrMaq7E^cGAWLO^QF z(uf9OCg!S3gun?C z!z>~5E4{%?;5Cug|CBxu`DDZ|J=`-&v1Hh*ObY@6HvVT|cx8jl2~NL@K?q37&g`-P z;&1myy%hS}VSea`cM}LetT2fMR8TRe;2(u@_0Y}^;(r+U-?8%}u$~wn@P92Bm*qG) zfV?aN6o>+3G7A~Pg&?5cC*Hg*c+T3$_&ix(bc^otifTa!*%wn?`4dkPKeMBMPJBFnJ z%E?kVhQ{853p89J0Y;a|avZGoKBE zFk&LkMB?QC`M`0B4-o!ZTit!KESK>cY3X!93Qd>6f$ zB`0u`9*d`dd0Xhb97+ZVe6s(Lfq)VqgV4P=Gy3dxV$nOCxitdn5Yu*Z3+cb=_jnwh zV8U*8xwuEX7yMxcvki<3^*UEM7KfB}g;%RyYGsd2c?6Y0BSwB!vvdxumGtz=q9gR5kn@fh`~ZvUVTgG zPyS<8u-DG=%-J^>I18HKt!ySk2tUmNf0hCE1Z)v*vK_z^B9L8Wo1gp&PslBou-*a7iPM!(~a-2V&88>BSNx zV0o5K4l%?qf$`GZ2$F+WV-(~~PTgMs{QsIF>pwZAO%R!Sw?*Jz&*gJltoED$Y()j^ zQL_I~e#!$7^>{$*D|c_3R5D`k079Dpp|^T^>CBB zziB^skMyQqn+==XCS8U7_T}?*bo+zBj(-#2l>EgbgJJFrKvM{bfMA2rdPETgphECH zJs<)LSgDJD>=@>%ab7s&>Y_nG96?C}*AY)I6{|^?G+*&ziSmD#m~e!0Off7(<0{2G zNm20!t|%UC!9!&yCt?2SNzOl=OH-6r$RYSgyiev}i$Va#I~$E=NcE%HTpB0cx7eLj zzfQ^?IYeIHS*s`kNs^OoPBj^nL+9u3KHJ&J__y`?(OXSe6kPK=|V1- z1Jrb+Gi>nF>8FG~go3WP3)g7$NsBCnLbBxWD@mm`Ne+NM2ihfy^g^;fnO9bGJAw45 z)l@l}c$O{H`aDiQ-RIu|Y>;b& zAp#3z1$gAkkXWn})x#R>TuvD09IiMK2Cg8+P9auu4M;R6*iO*jrS`_TEm^~Ve4Nnd zNt0rL7!MRA{CVjQ!vo*E+Xejeh~~1{0vQ4VJVREW0M{Hp3_upBN24qYlni9@ii`{} z#D3rJPy>>z&?gcL5(vdxNc_+`dOH|QZl3fFdv_}PzxGKUIp}G3di;HvhAJaUs*R=! zk^tTluwW)rugg_-6@pq}$j`-&zzi1%_u425n3);41lp+6R#Z7q7GpM7HRS*H`y-z< z2Yro4n*Ta6O_BVBzzFMt0gaNwYIkh6sF5b~dtuSqd{d=lypGcfsXm$aYtpG-cP zb`5A4dd(1MM^O^Cw9nZ^P6QwU6acn_6bb|b3gSVI59jBlwe8zGoyYyYPSvq}mQVWw9=o znFk3#04l0pKkjTiH z+!AK;Kw$*pMV66BBrKRF#6`G__}=)PdsQ`dBXfU}(`V9hOpOy<^|P~AnY4CFSpP}V z{pV!Z(>Vq{LoXBsq}j;B_80N~e@UPl(;O9CUu`4&$>A&hKmf9!geVJ4wj{~dQ#RQ0 z@|L@2C9h_;6DuS7nwpBYURjp>0xwA!YqFnGqL$#s8%)NpJgR%TL1dAr% zlYQtBz$C#|z20(g|AD4~-yO6WO=h#rX4KiZHmvGUez@*vU0p}#**fn-gzbd+izOBS z^3-tGu?f+st2GOkjQx*HK`NzT%qXL#G|mE2I^w0PCJ^{}kDNYJfL9qW%#FY2xg}U^ z7WA~3PbQ{^YTA$ME(LkH90UN$p9ZuP1?C|SA0g+U52;`DI=;*na@W%Z{$(*qK0t9e z6u(0W5afiul2j#Gb~;G{)b)Y2#G~z#D};Tud)-~rn)gYy{#r>^CDoTcVDIg<87k~{ zmjx3>%@*z#(&@^tLaFOHUZvpisc`u#l5<-D+$LC-8 zyuPDHoBu+9Pj5Ux1<&*b>;MOFv0}TZz&`vD=kSk&poDTN9{&jWPmUp`|J3G3i}{g8 zkQ016w(va@L21)UFjzQ*drn@S;Lqd=r1xb1)44(+Cth=`;uQBo|JgmT z8DQ(5DbOv8i>s?iEd3+{s>h+q0qg@n|CNA~RNO-XAS-LT&(`l|@{eBT=AGWn#O+O= zsyZCx0-O%DeH$h92JRKolLQ!DCcVK@uh*OHW!ExXEDyzw07*a(DZW)#kF|iNb0-YU z8;Dc}tuH2f<)*jeY+d7To9ixjJeN(qCEtF z(?Te?rsgS58;8VCJS=XmMD%-4u)W;5gTazRJgJ7sDfjr(m^MKkTYaefC-ncb`yBZl zVNd81;81=D157|BM>?MscAu}=;tRQpe0p&+uo?=qQNk}v0aA5}_y~D&0y4eUDgjw` zNO&6v=DSAL6QcpI*Bg|BO6KL;TAw7fJ3Lam0eWg&`CM>UGvb=LRrY*sN#vXtNE|@yr$W*Z=Hn{5b8g~j{ zPaaXASP}^H84=FEXv3lFC4Ju;+vC`642X;MBF!M+M`n2`;V%Y=QphLJ=K*0?cmY_v zA^gSUa1?yJf#-)}X9{!>))|IAmtpTOL?EBfP%4-esbMhyNEa68Hx++NsEw69AXDxy zEA24;;^9zhWuyQk3S&gQs>mWLP35dY*MQ=(O?TNSq;0T4 z1VxNo0?W0}9W1dCs}_p2y8cd5sDv zCxrt&$ENUnKOgWx0#Kt+P~$+dRe~R~{R&6@xCcDNb;I!i1OLInvuWgfh zK^Q1fg9iy=C0~VN5X(YH0ZT>{hEXH)G{q>M`*cr4F@@Pc!1$A9_h()^{0n?ECs^9 z&VxTqr6%+zEZ;wZ{~1CGM6PTRe$4)ra=liD>|e(SP_KXi01?c?=kn9FdbK(iQwFam z08hr)V8X;_ooV3Z8j~^R$K*j%R$?)LRhPxs9Qe1cF;xVp^CN2uYioMRn*}ad*!H@M zy@0<6pO7>~$+`t6c2FG-XZTE*ZxZ*@7}3+#5Ik83pqLC60!}c105%3~g3sj-w_*%) z!vCeKrdw%=L-O1d`$ft^r`W8fJGmY{z@%huAu)z zoQF3c1XPg!=P~`~@v&ZmE0;>>gF0k;ok=o-us#RQetGU#YcuYz#VzAd zQvdizrz#1&2?1}-#^bZW;7D7mtvPfv3Ps_ikR7=TwgOy4Yu%-*eaTP${FnEQ_s@N9 z5q~}<26ubX%pg2AFu_?I&TAw;hZ~f0vmh3@Ui7jcczSvwFQXC93Hvw-5114lQmdC! zK3wf1xvCTBBliR1_xRxXF0%e2x;#YxN*xzI1-iE(Lz748|@3h}WsQ zi^s&{90PWrb^|RgTN1%ufy;F~Ty}Wf z4zG8V6MCrX1y3a65xP#Mgg5sj^gvQ^-0P=~F0M?&^~XuA2qQnXZ}assnLrT@fY=}6 zT_FxwIf7o5CCJmj(*>IpQWh<5%=l4A*<=*=(C9vzL=qT^FUD z_|j6NchZpS*+Ar-Xr^v3O;aSu0t(Yg4u@dJKA=D}po!*2;9yzzDXRso?V%U~f{`HV z2)ymG*;+dS!P$6QI7AbVn(?@}!wwFe=^Pxmntbi22Z*?(MpCZP?pVF`y8T zC9DLMYS8WQ!>`UR2+e2CxLi;TVowFasQZ-d5IngefQy2WpM?C*Ru8a%;Bd&(1Vj)O z#_gn->uz~;Hre^h5+=fIzm zlOJAq_r}Lq`D6CSXChVCk zN;TFgSGG&p>{_-h+E8Vt8u@q9wh!{X zD#I74?43qqt)BHp%XLGY^+u`&Sev3i5RjObg+dpDzPk(j2?M~W4+<=otNXMGOj;q} zhfoN_@wj;4Qn=aH>S>8UC4elzKQz>g``ZPl!wD>)|Lo;Y2m0EtbhiKF{yi%6xK78Y z4=DY$|LyNS-hF=f9rb5s=Eq57$SU4RV8l|DTcmE!BGrA|94Iuv-6~(_Jr4bdJ_0{K zGmayEF!As1K7)(;Ir)0MXf=DN`2zvJYBF?pMd8sN=oz@YNH-9m6{bq?6^IL>B+r5S zo3y}VV)IYW0qr*viR3^s2?n5>U;)J^TlLyT;Yn{VnvtY!-3$aF2f+7JRcS9!$ZToq zLbKPiXY4GL=|f}zj47$Ko6ZK8S5L9z7g zZ(J$#XU1Q(DzB-g{x;jd+!!+)dO@d4`&`9?Ed%b{rzwD_h-I)x%e8O zT3Mf;n3|Zfut&N12efpz^7H|28k~4BMlHcH9vG|(-DSp?W1IWtjGWPAbc32Y4h<+?N z$V@B4HyW}5l^_Nm#;}paA$RF+-6t z2#5@805Ab?QAvR!ABuWY)})z$P)Ba$?N+;^wWBQ#MPYcTduRyN*z$yR|;E z`}N-*-TFUsSNGD!n#M2BAF${0ECMcm8`(Gq6QwAv_jCpjF& z)_D4IsO=UuQrV-8DGl~m+e*AKiIO&9lO-gu*j&Pb?UL2JizAzG!JyT=y;Y!A zpxJ!TENnd}{89|Wxe?UjTj)nJ_ypm{YktW8UI6;7H_t1ybYrPK_l*fLFEHd_pBWI0Igf8+&P%u%a55dBzt2 zw$G)tq+Hf?O)sZp1&l(a7(Hi*63{?~5z0}cZ04n`+dbCNch1QBfM5#fc)-mFT2ti%AsVTMWP6%&Y{T+_^Ycp2!Q=Jyme5Cw<>xUi{&_dsZj%5uJ^LstxaS)u_4 z{4rLlkDQ@q^9(ovS1-=uazRjqGbD$<{`Dzx0-pncuZr`2oE(Nj#QXbu=|wS|eAi*? z9tQax81C-w?vtk{hVD(?e0XR2r{LPpxrNgH(Z_d#gH!G2Ypu5nt=0DXDnNH&?G>{e zdIX!bcj($FT=Wd*X#s%GJO%g*w4ca7QsdsV2ye*v2$P&mCS!F` zZRj`paLsI4#B>nmn>dze0|Ud>1i3ET;Gok%7tMD%u6H_4*9^hW6@j8<0z8+;u3vF= z^xmKK&SGbX?RJ;_Q%&3bhx(sKgVR@kxO#OWm@BDol4os$?`kjqQz|XwavxUPE2~Rw zEZnTq-4g2uw0CzYlG)kVcztpx3XNr;XYMYhCj1_ucF>tvtFdAg#+$ywgrSyQ`En)NKrey=b3ZMX>6f_^fgYNvo{jZVL6O%#L(F6Y2?6L8p z_40`lm;t*DbRL;Jf-azEN0@2y1pwlZ;sYHZM1pV+jXaA_Sn*z1Wr-+&WKi)?!Je1( z@fuH5uS~#A=-#P!hQtD%ET3-}nq2hDS|b%z2`G7(7nE4mR4PVUhNFrM&+qM-5GhE& zI6<5$iJFnfE3#fmbAqp~mD3Uu5BL|B1wr+9JBDp8paEx`E*E%F%&J{?I_<;muYdK; z7pE@}_%ePATf{vhz5OIJOK(hl>|f`y*tPOs5}4)BEqmDVZhFF>9Ax(=i@PxNC+2- zh#EB{LDc3INi?P!gb{p6SspP(lmKZj9y2PHxGsuJJVB7@0j&rd$%I@s@`ju!SBQ@j zRjrR0SL`plxU8X`gw5b!0V`Qr_LV3d`U#kXR!c?_*o+4%gN$w?A2h(Y!v-r z5hQ>BDfEe2Dhw}^O;+R*Wfs1t$fG(8QB_XVGi6)QTtzZ%u| z^r*JXhzVDsCpD&vm`&gssk8BOI*DNc~o?ScOR{E>Hpkf!?RtQcTV_OWs6qJYiT ze|uoq?f%_qasr=*M}A5N{$mVRh~Wg`AIGks)uQEW>4{or`DoyoMTZS3M(sb;X154$>_W@uty zr%7x6w8w8{<*4-}S6aOKFmQ2lG8CK%3hYc^CdgRfHL5%icpB7W%0)_zBaTT} zP=AJnIGu>KzEs{AOX^Wi)-Wh*q@_TKN$J#8h=f&41z12@OUS*3$Z$SJP#^#lm_}X{ zM8kwgfb${GOvM?2tz^^irk*nI&h_&qq{FL zIx$LqxHNI;>V<0yqm8rj+~VVMV)OXfLA!cl@llm26QI5Tt@=u#uu{cr-sa}vN)^X9 zVVaM+0NhE7>K|EofAoAI#PVS9g~`x%C={5v8DMF)ZieRwi%gy-a(Uzd5`kDBv>wzn zAaFjK@@J3{azOu(8rF)bciFJ0`v+qth=+hZdmt=g9>gKNXFz11iWb4sOG@;HTmx1I zVIR1KiYSU<#jGV_1`9I5gJ;mZK<oGts znPrxxZ6Sz1cpRf2uLj_LNr!8E95+i@Q~8~aQ#C{Im)4-T$3IVV0WO=fx5pEYd&gZM zxcxw3Adt0nI~?w_O7QOV&B^l<6W1p8Yn~5xbNb<%4@*m%FJ4f!rb%4d#AB6o+o15P ztC-QnzFq6$?#8B-6`+^;GON`MQ2YJu#fx*3L5}|)bJz3JHlD?g^JnaNk9&ZSAu!n_ zl|`v~sBI;wB9Gi3GN{OLB`Aet@BzvxU2-66f@)RmjM|JjB~I5`GvkpWQmrEkA;nP^ zC0a$DxYDvHB`9GRO;_6YzG>C{697&maLD()&-;Ad`+T1f^szrLm8A@^W-c#CnRJ@t zJ}G+qWLW`{U%(wbw1B^-NQWP*1j|ZohUWy4vlF^L;146oxuhb~pxY5W7>1`hnq@fS zx~sTV9nsqMYe7{((nsZLgI-CuruA;Ux!D$l9EIe;srKrfVozk+6~GaSH=fx>6X*kW zmt}9WA~LRPL~Mo!g$XPa2p|z1SdR2tKC*RnGBgpKj*#tpK&OeMxH<`fw_|h7hpz?ZcHnuiSm|-R;*}uY7U#{?*R*et&pz`FtO1IV$=i z?BtNvE*AC6{BxY??17#?9}dr3EqvHF-se5o8xDuB%UI4+3k%CxO#3vQMzcm1Z{-rF z265_063ZjNGbjWEmIGQWX$+dC|7I0xgttLkAqt4U>i>rv#3x*-mM|<$wWp9Mlu~ z+28GZc>?~4$w}X*{`PkN zczF5q-}2ANjh&rB;b^DdDjXmje8i>>)b_o?9!k37;qbq$e*y@!S^)S@%aHF3FP4{O zX#wZ+nDN;xv1gTuH=md_G7uEY5-TF)i!6TX2WMbb(XwlMR@enX2oTd$8@%i;dKA-KchT*O zS^%<|5p&o@Xv94cB&5@E5*02-%0}h7p}=dNAD4#Uf;|T~D47b=Ia;pWL@z*ad}1=T zb|2&w-~n!9^#ua4-(8(6!(ZBg>INvm#A5vGAk_UxauImoT5N4<25Ogo%ugOA5;}W$ z`|podR#xWkrOL;zhx^<4^Oq;uf40&6@x%5`py2ce}P@0J?W-4FQ+{U)eC6jXGN@8gX4ffxzLA5HN#N?5N%7*`*F}2b2^& zOONY0CdWuJrKv94P@}qG3>N-#J(dzBo5pCJH*Ky(wNU=rPd zxIZ+yxOv|fmERaYK=T)-htk(R9l;O;Z#p2G3q%g&bWe83u&bpuy;t z!mvWqI91y`ixdH5!gZ_aba}oR3dciXeUQVkGfiv>+^>RqZDMu;7sv+u!J9$Q0Rgf= z2ru7Xord6-p`e=BOcd2bd^!mHH4Sw_tMh6)SdJe{qXJH zLF-@5#Si=Vyrv&O$Xy&?{C4r`=O?l`B>Fk{B{m;;c-gJ>n!4oz0F~lu$Ux@-{7<=VsH<8Hz@Y&F z((c+;4+Sd+Y!C{J+{8yPK@kXn5{Lw+$Zg9p-`Z>-7PvZ38U8;Okk~{P@a%eUYHDUW zxv`l1Cg{WEfor~zt1U2jtF*KwrIwbK=2J_Vvk#YrH~H;$u#5R?`zY6BK^B1l8~deJKOrYRC^t%10){k>Cs( zgo9ISvt#~P?8-C*zxupI9$7#V0w5ZW%*JLT@#Ny-*AK8AxE4c`+ZgDW(5>kP&rlpE z-^t3{#U-#k+zj|UfAHqKb$0yp^^4c|%_ZHOBAEYU?rK^a*Us>+zu+#~+x~;DZO6n(oev}8fuUFuj=>yINJbfEkX5dO z2g@_!l1yfxZXE`M+Av}kSzWDa9T$OGR4^!1MtEZxEh+}lSgQ_R+|i}mzOQoI-un-t zfJtJ-NqpY(ywCG~9Y##su7eIkV=&l*jsR?CRkv61l7g!bJE_E}vFFvdV-O}B!}1R8 zdo&Z0T5a2F!UNoOpR54JO4PWuS=e}mWB0H;2#2s?>-_-^lYaDI0)qdAfS&^k=%NF60*Bc=Y*?VcfohF@tqRINK=R|Xjt?LH4BUTu3)j`n8Bi?c zNC5(Ps|uJ6M|KdB%nLI7!zn6XbcX zhd2vc>4JjvpH@8}`!hjhgsfz_fq;@wbg=D*RV_0V!WA{C>1DtMh+~_dJbxJmH0WB6 zhKrxm08w}DIA@t9mhIAnLA7TYcEn4n29!_JfF{6gp|0WH*H8%((X?4Xn7T`%Ce0Y| zW=;LR>0n#}oW{)P2W}9~rrP>R&6tJjshVd6u@aRCDaHZHAO*2P@T6MCuu2iDMu7(W z^Z_}6?;&8^M<>w#)d{$(;%WDye|es_Id7H9SRYV%b=Y|C5al<@==kaJ=&Nu4{_j8i z<-;HU@a=d1`uNvd^;)<&CbB$u{mpCOd(zb(If(=DWzf{OBW(X&r3;CWmDjnL2|Om|@Gkij2Q!r zGmF#@<=d~f=3&^syTguz4cMmH&+go{1bt`uQjmkrE0{0N$;nbjU z`@TT9__*0^Ue@t&@#6jU3Y$cpgn-8C%`w(j4NxAvczq;G>dU92(evZuBYyY-7yJ3` z)qrDrJyyN>I8m=|L3v3EA%lSoZy7HuJQHV2+2KXdOAO|G`0J?=Nm6>@*^v+wX^>i( z#OWXdc+B<_%k{0bwZBk>MK=XAi@Ihr0X@$#jw2$+C#eS5N~5t^-8n&7_^7;5 ztYS3a!DNMg00Hd|CI#QWdvd62GH_BP> zqoh7PdVK@j0016WegOaf@Z%LoB3V%;lZm2&SOaxDP*{1H$!pUy?CDug?*zu1* z09HfdD48$SBm#T4ZP?dhK>c|(a{vJt;!yZ&gHYg>^OTNH8#UM?oWx*#5=RKJ8;4*3 zh0R8#ytM<)^=)CJQrdci6XYJu+=w3w0kDEE-&KpnXFIKC|GZw!31FdoaDaTK+-Nzl z&PpCm8;nMZ^5(Uq4ksfO;9h|(4r@NVJ%UF?RzTHH1`?Sl!^xS7of;D3`{{Pm-0rMa zYk$V}_@UjOow01zHIk?vu%S=sMRyfb>NU+-UYmn4Ig!=(51aAX3XyTp3IdQgL$3)VxA4ud>fk?vYbgk?3TxT^lP7*)zXN1u(Gf52^1@Y_@ zoIqn|+^Kn7zW-4Uu+p;Az-Ryv|Bb@_UUg%)03z!V4q$0C9!gf|e`m@3;*0i^{>8X| z{`Ip`xw^gAY+u$-4hkhaNeril;SiLXrIMZki>ZSAg6rl;xf%3&sx)~a^==ha;$)ta z2a{ed`#41z-YV>HA_IkDBz^mn*9`W2P-lh}VtAjA+CEV03vU(~G!(M7YkLcocBx?| zF@bf>BRIT}wn7Ob3sN{;r!l8-wwKy-iP6RHd7yX){v0G8gEy=IHrS=z9Q%$i54^FP z5xB#F3m(L976n!i1eDs8W-23zz&gwz;n-aLvvEXSO8v+S9Q-j6OA!Uf9j9QP!BWL# z6_%^SHn3li;nfAT>-D*A*Y=ZGRM(re#+?3Z5{mpC-`^6Qh*R&oEd)qMZ%WWQK0p$owI*BI8^3%@!dm}A2p zYH1_`Di0?;MHo#KKzMAo1>oxe`ICDStj5caR~b%#`@`Fqd384plGKFtLlo8tSy(i1 z-S8UIGfbF_>n3&PE;WO63R*m06U+rzb7rxQz!e9P;R0ok4R7CIaIfcnAK_iovnaqD zBG;V~kx$P(vpbFY+x~x;yPDO;l`Q-c^9u6_PVDiuZ`yGX>4q#)D%4>_ftu-7pa;p# zI2dfvTEsN7Fk`qN3PQBHJMAn51hw$OpoNU^#xmY`A!xZ*jW(?Zm~$%J?pH`if3R zhNT01eOLjUQr0Ckj7qcbr@1(0eo}B1vNA+j1k@G_0|?X0MEPpe#{$;Ma^^gPBQ9ddo`ce^)bp}ii*Y0k_a2n+xQa*kD_Vkkrv2k8MGOh`Cg_!|rN z3n&d@2v!RCzOf&3i1Gk5O|>q|G+u^5&pvXrM>T5O!S@oSBdV1{K8T`&@a2?*`_u%G zGLgM#0CMMIczycz?dRX#;%30@DT*v{9AoRG-D|#-s?c8{0EdWcQ-7-c{_6DPvVV@# zgu5+3000D}wizn|H#=~Fy9uH)!*x)gXJ|K4+NVQG0{h-ffap01GRygMHTyg46O@p{*#W{%1Ld6p(+}0}t~9 zl!1hH1~>tCc}001BWNkl{S|vAXH4Z{RUE^m9p}V&*rr7p>ff`1 zV`ndJ_bSgb7?^Qb4j17uPBwbw>ARg)@4DIly)OmB zs1a;5Uye-tR|r^WkFqG($4OCrdp!PvJ+7zN--IGJNCZ7pTQgaE2c$m-*k`!(X+R9} zM6q{=&L}qHDOg%19Gg18>r{Y^l(}jZCF4c1;Z-u$B86g!T`42rec7=*poX6nC%*PN z+)`17%ZQ`1afwG8cOd&YpPT{YJ1SS7I`e-a^);s#D6eZl2*9ZU z5d9kv1po{FcKuSSLO=HclE3MX&nN&)v?V(Q&(Au|x1RySJ`av-H?LDzOKiV^oDS4( zh6U3nI&cB+DJ~>-`~qx%saugvS}J~EK+#akXO!7d*Tm*_VcRS0r)0Q8Qz2lPAyNVd)qyTL-DceCBPE{cuVWitF0udn8Q-lED1|#r1cm-=6he;Rra8N?NkD{RuX#=AT;ta6D z+!V4+D6BRIlRdy2sr04298BndI%H1fb6L-D-oeitR-a7fxLGoHDEw>P?@7^E`=Whv zb#)?7nQL4^ME(3?Wa58?fWIgH5Oo2MfBf%br*U?#;juE8jTR=ZQ&@Z)Cw~3N4Ms<^ z(FEx(PTO%+i#~yiJCqFusL)d=gO!72K{b{MAr^uJpa2fH)G+b0+$w{imZ_H1^%3R~ z1pE~1@^DK%?5mX?2aELz7#~J>Ma?-ddn5rxc>sGt=ViMnc${vnA6UA<&3jXES71Jw z)-S{=n!;M=OMQHn8sEt% zaWG3(E$N_^;C;yo^WHR|g;O6|F z^M|yDMWM51uLl;;KWj*0-DtdNzU{q`B=Cy}_;PL(o+Hp|HLmP0=gmn}?SahTsWCuKe8i)-Tz&Z>2^uYgtTXUSNK)JL5&vf16O*~CjA`AB# zGAh(os0Io@J=}fwys!1Jn}p;r{^CdJ25`2l&T~k-S^(Z^K>!Cj4=(Sn?XcYJ1Y$ef zzQx_2MFyd%(h6Xl?@Ms+YH=Th2dlP+{%wUXqI!aR2pTwqdjyaeV9*x0U@ibn2A70c zjmB}AC2>iRtDpgJwh6QBCfP$=IO>r(w>JLtDwq*GIS4+15w5+1Di#W^4>#oz!;k@- z`Q&coU*nmQofh^Az3TtB(SdAw37=-;#T+&NGX$VIPzNG#a|OKr^4uOTv=3*klTN48 zIF+Xgwwt{hVW@xrT{5>^Q60#HxCB;s1pEm6e_+Z6eFZysu#<~1if#R>XIWe|jDxS8 z*cDqv(fu%IQmLbqH6&S2>T*0Q9oirKoP^8eurSduR4SW>NBp{@K;aWfli7b}I3JLshP1@jag^SL? zBg$D6{4T$8X8y>JN11Z>S|?jqmgzm)ywl;JcGrozzO*XUYvmyi%sjAg^wu(^n|%26By=K|a_<`c%y7_;L&u*_$JiJEZ(2br=*;;ba-32bl{^6c=m7u$CO`>% zSKyGQ1-NC!o|lbyj#eRTFa1^Ej$_FEyXO;wk!9C4+M2;j&9XC?&ChuLOg7qWgV-AekEn zZspbrfV_jFKo;2<)7D+{XF8@BX*#NbKp z*LBESA}toYQex*$QNuGPJng|2$>Y z_ra%GU@!*Yz5tKCSQXT#3Rqkgs=~4QM5)5(ib8BJ8ls^*eepuRc?b@$lfYfl*#{S? z#M`&I9EQ}5?fh?l|I7OX0l&Dx8G+_`Et5?o$u*(#*V!D73GO74JL_d9d0$eol8-?i zy`VCU{b+S9f$eD=mBVQamVAo)TfhY%tOCL#6XaNZS!(v}U|O(;-6n?Y~}0XmY!gnW2hfJ<4#V4{0*eq!Z~z&=gF({5 z(r0dGw^W|CSxDgY)~K)Ye0Vquo$fz$p(-N1Gg{u@bF>QLdZ-wWR9U{%j-NCx#V6vW zOyFNW_*#&KBk@ubSV27y|8}Ga${&#p8c(CtHa6DrXu{4(8dB<1YI6gX!l`=_1b%{m z&JA9b#Ov}8cGB6a^Iq?p6RfPPkJ$k*Y2FuduG3d1&Dgl$hc{Z$NUKpY11;d=ujyC#cl zP+{6)>`eG}4M90lL_s`OMY;QMePR|q zPSdBG-~dPj$b$Lb+>5Tze<1+x$`&va{NlR@Cnu+;-<|i)A8)4c{>jcp>VjMq%$I)n zl9gY+{7Pn?zmrh_DVdNIB14|77^w}2Z>|eCfXUKg0URD>K`6PV0f#5cLBV6EgXWEM z&Evo|MGZe@^HL{WcO~nt zA%K`aSrMHWd}mrm8oC+)U`#39^}78fnfaq+7quo-01jZ`8fcY#81%}scf0Z#Jg{f& zU>SLzhRd1V@A@rO7FfAqS}oRC)(6v7%mna`8YBoXI6LS*Qm;vd){(L3WC^ZN(R;$9YDnx06liDq(TrYfROZu5%v_IINKRfovNzkI<-)&KNNm2uV zDfqZQ?&EScc>y#}CatsRt*U z>pQ)eTy5{&51IJ?bOD_nDF+ttq+BAGDHRH}XYht|s1^kWKw*16^WoiJzJ2xQM)lRJ zhQv{og|0)gXG+sScRra7M$R$-OrRGFeEdyHmnatU29(pA70z|+`e?4ZAN@gXuq0AW zobZwu&YdrpKqlRA=5;*&y5Ns+r4MfYhlBvkOjFAlj)F$^d!ZFa%WyWc?S8s6Q8e*bMy~U5rUC(RV2o^rhKd{F=>_3rAOr1=cNh_zRV>goP7&}rV zRMc%`TTboKG!|7h4W$PyHd`D+s1I}Lf?*aS84NnOU~oXjxKK-&9l{{iatRIRmtU3Yw zo~Q{4LP9QJbAY)7h;MKR*Jvk`O`pa_Zjy3>c74n088$ltqL}d#r~Aq0dVh3-d=AGq zAi@WQJaU$q(!fF!0_`?j-NG*ent(z8GtRVdKAc+cPdMt>5B7orMbYMh`bj|)}v*R0|i5Ee%N zDK=XL`PTaI$a4&nh2URRL>azNwmC7YaEw@HKncPJ&oPA^GTKURE^KYhEn-SwZFMwA=am-uw zGP>8TQ$Qqo9l>rs`T!!a-{>`yojzuMYo-(Q+2qt5TkkZwtSUHN8|yfk{P(k*fbC(y zBnj^F1W#%k*6bW49*6+}V8^xvvp>R4V~vnn5KZtnSj%kTu!^E6pxSwW{+GkH-W)h3 z4uX5h&iuxu)1{J1%IE)QjHR~tF`UVvEzhP#~8r+ji&4Q)_7)uEbykr zU^X=IbO%9!I-qKa8t!$hv;9ze{CvuucRELT7fGNhWCpj(mRNS2x7ltpV;nWk$DMZ5 zMFj|q-9`kUYLx0XjIM7P;6mq=K=<>VP~&&t56B>OK6Se`0dj=KgCRKerGc$&Eg^M1 zV1lEHX4dg4kk)cE+my{R_&|l{q7bLqpL$mtMW@76;?a}Kajar?FQOFcsvE|1M6;?hn_7cemtb)^5TrrS zd5v>*uF-4gv$1hb5#SjKK#z8B#O4U6>rLA(krM_@c#5rAKKW+ZnqUqH=ew~LgVa~@ z5Qg2pjY9(zsSZ8=JcsGv-_t*)0Ko<+BW1e!v`di??r{gWCSR;&uI^pX6##xSI1AQl z+1RfrOF9c=i+j zBoYz1&wJZ(F%}ben!*A+Q+^5a3-EKrY}y$N*L(DnXvG!qlykL_)*< zU|@Fejz666PdlF88wiv{fQ1QLa*WPVbLe?^J4OrchJpQYLy<(v3Z9jcWfM)Af$Evd`VS7d~ z2{as_!1w*B>zlzM2bx9_NDKWD7VxRg2R+{&o!788#OXVL1!T}tms7peVDPrD+6jud zsR=BPxfC0sz00LoX< zjN(;8AL2A3uA<_!vsUXkS4ynteZH{0poMo<`YCr+1 zKXb=BrBbXaGYX)^S70cRgo+YZn38obw6G8g z(m{(G%X15%@M{o*cx!&;E+hoM3IRvAV?s;Ii=nyYC9DYGF`32N!|0*8;IeQb2Zo!_ z!epX>B9JK|0Yq>zv0ZCOs-O!=2RJi`0hOKDUBj4-a#$^d-$@WPlCXVO@3ebXF*6%s zh7ijNbg+7Xrs$gLH+%VgPtAFq-e3d}e}kER)4^5)9K0hbDNzn~0G8^#b~`i5kz~1C zra;r@SY>u7W7V4tfo1|2co-s4+jK$MetgR-z_gRlzr=4upS9Ad@$> zerEqP;}fZdx71eE1kU#px1GJU1X+RjUqVc&l$BCqeAP&0T*Uqg&MR?+llp9+j~g3D z&E7>pkyS~>n)-?PV?A=-R=CJ=o65Z6+rfD>drY34NYjonrbUi2eMrYJ8+v89r z38fbv94IpbVZB%uvM{g#e}FI-1_BBOF_4VNmh3^8n2S)Ppm)95_qAQN|3NFF2005YbPjKVh z-}x*DBPI5#w-8=fe!^d0O9eGLJjY^8$DL3_XhpQX05 zTg#4B(1LSsXRc=t00IWV%YV6oDolDgYPq791zu4m6HU44RL8?X5A78dnAR}#jaFl9 zCSBFg_C;Pn`-NcMZ0g%BGe6iWr$SmXfxT3O}54w6vAKZaVU2)4Cho{fJ z;t1bvbM6AJ1ONh1&p$X4WzsC?Uh%OUktGTd5oIWexCLAepezAGkP$MzOmz_pgB-S{ z&BgiU^;zc~D66&CYiJ(yhwlager%y@5Qu@pm-7ow=gd9w*-y?n$IR|B{J{QTadGo+ zXS>k^i9!H~0fjFdq%++u% zm&bu&Gn=hqeZ4EGU0=_3^l%p;4}j2Yj!aj4ynVF(Q{^I=!0j6zt>RrX4<9u4*IX_v z)yc)<830~Dp}+CES48rU6?(1!VUNYTYPU8R-uB|D{>N7B$T{K#ktao3 zr!YN<$WcuGxP}X(%X!;1{X_QTD&nKmOYgeXlYi>9(sBGG)O*jt>}NQJr%{f!#VC1B z7{q(om-e2fccR``zyxsq`_em}os~3zK#l=6$oe+k0XXak0xQtw;;bliaS6g;*$J06 z+$MCOm-Kg#1pdDkP^pAw4#E#t(LVG^7VAUj7xo}wy?z~@8Hn1Js{fJOyQ-2CEz1fV z97I8mD{+Vb>q2jKs@+Csnt;KdOb`bwbKGrJTGb2GgaGC-tx|rtJdR&9y4}__9@YU6 z9>)%`U_k5YRU-)uQ!xyq2Z|4?^031*Ve(kZjdj2<@DL~xJS4=R*{#;Hcf}l5=mEns zO)=8ju8jwwqq|O{d!Ne)`w@Z4{sgHHJ0C**W5U;|NaQ*X7$B=EO$A-kDuK|7>EF>o^m`d%j%izd*?y&PbE&c+@Uf(^>HlxJn`(V zME}aMmkANz*Ib8bkXkoY2JpVwh#e$?DXch?-fEJ@H>Ej zKmJ&$V4F}D&k>kk1qi61hqQAZ?Lu%#5JO-y^&3MAlEujo0Q@CW7t>tA3QPb4&PRjW zX{UMA93lC)tXOhlK{7DM`eCZk!&=Kk^1NH_4lmICHJC7OuwF;I824Qu3KRY7T6uaL zoS>`^CIjbpJ?`}3=9B}^^o67-HHSPBzq4T zNN?Q;bt0iXjl|w(_4|`w&t!_&&&e{NzKoBY46kLDc*%EF^Af9smfg*$Z|TUSjA#asTWoX^@$RL2*_*0?ywJ&{&2n3!yKR~Nl=OW zaoiZ|Pg=K$e3H-Wd#QVJ0)Yp&BGG2It@m^FK^0B*KXE&G`+k&~~>Cjx@dVYe@S2fIRFLjc;yZ-*YeeE9%qz{6B1wd@4W8ixOOZEv=CvH7OI8&xl( zMN4c4@|Jj7C?ph^>WZORacz|9_Wj1N@>ri@D``Nn@`;(-voR`f*DiwbX*qk?=(`4~ z&|ey8%N5H{w>$kovo^ZWjB;1OUA=^+7|m=g)hYV@TCS*I5m!;ucp!gLNkXfsda-U4 zg+VB^)yZc70&+PKxI7_vAfSG`Ut&onLqu8^DH1>bLjV9E07*naR1vXas|1r=rZ9Li zkn3}~ zbdHlCFgQs@K`8kkbr4k&We@v)|I^b!yu=X?%fYvEKv6Sn=`6GaJZb@VhUZWV+HGrd zHX9(TZRtDc75aKp@JqAs-ol)7`SDgL_2eM}fCG0j=aB`3H>)cObHKUyC=UZH?;e~M zVZ^LtOoK4c%1`ahv8nV&O&zT?CzCi<{soj+JTdJ|gRx|%(yZtSqgLx|jpF%0@Hkd2 z_v6|Wi$ex6#V|43n|`C#?PN!OKFDjDCMAk>c(aIhMFP9OPe5YB^t@?QyXCuIb7Gyx z0)0_ryrS8^z3olUZ~FBjD-d~hQ{_5LbBb&ZUcCaMk9&C@2n9wUg!LdQ)T2yC4~5RI zDC&7;g_Ci0hk}r!gi|H*yySgRD6kR><4;fL z&ad!K5QruT?v!OB_Rx zfPxYtB#LxnH?o=>LXZp<29{j*eXDn8*uS7B3ZY_RLf-d%e!TbU`^_1>O3s+Kx7xZs z8F+e)YU8dlMW=Uq%ARt0Cl`r>;UC;hs_C=M3%#1|&S#Rx8yU3gXy=K_$=!U?D^I;i z2Uy1V(7#@6_2S;Bj0~Vh={Tgy07MnT$XQv)I?5GQ7`F6aV%CK4fu%Pe9NR3eb#HZD zZ`?O#Da7{>b!6mt-n;5=SXQP_FZ7S<4vFr7D-|4y$itQKpQU^2jP052>q^DGXwfTbEX zv~TFblG|-@ZagzPLQCkVW{cbXyWf6x68PB&RQ>5{(f<#0f8fIU>Z`rIN9$-4IamQ- zp}PbSi(N7WRqMyNY1tD^PN&gWfm98{$VIEIi+IGit2Y{YOP>!0^LYinUNI{0G{6}c z;2tBB)ve{=cu@1#w$>+6o%K2lWIc}p3E9k>9~w_Hkog)= zfySXFL7^8J8c;w8)DEu`x(kE##F$(GUhf+^;3LCi0V4_+mJ;%$i{jWYk*Bu>lA#EY z{JTtu2-%I@ty5LNImWy?~Mld=qx zIcbb)>7l?gXd=^8cq-MrDPG;{t^08XOg-c#dVxUdAH*LJcou0oSP8T_(xHKdlVt|^ zIF9Hv)>hkRLbj=BZ%G2{hfAd0F0!N#BkcjZh!Jc)mJ&&V3b7%c!AM{aHjIUMoG3gM zsN~gbD1SIVc%LU@+VwwKLcj$~2xDxReUW0>z`^xb?k5k?Ipc2k@`iJHX<=dU!7`-O zGRT0>UJ(2V0)BH?Oz(jfOsrW!_y4aJ0Bgbe=_o8D1KjnUX`#(8dk3@#u?rd;**cjyEJKz^{XiOA1Ah!covvxHdJaK>_ygZ9p&Q_|C5Y0OW`un^A-` z=ZNc8>)Fkl<0egO5MI!4kjw}mc#a1|08@_go#!;pEC>P(NNBo;LE}BHceT^%*6{(3 z1JskG&y~XL0g(_2d77j!f+RAoSSk<_NLnOmjwMTgCRCs2pYjD>-KP4K zFDnKJnkLu~%e(BbY=OMOw{GzLE6#^D_e1BWljhL@Z6+&x_JZI~5b*opA({;fCbl-5 zOHS+h+Nn@lh={- zX5?0|-5y=+0O>0oCMh$Z011L%A*%u`6~n?bn;PHLZo89SmW4D=N=U$UI_%lmIc8?L z3M8(A26#zxAwcvniEACqwDlani|7EY4HZY|L32s(E;rL#8~3bRmT<}a`R^4%9fAL<0K@@Bv|oUA(YpR8)E54FamDEb z)AH$TyeAf0mn={DLSED$^h!BCEpzz-uZTYsZ@S}NtJ39{374gkQ{Sj;Uc* zj6epUohGJZ;0yiBSHa6!PxfXr!)^<088Moj%D&8 z7)7xdJlHJ5OL9_83Z0AbyZY!m0`gpIA`izB;LZ`=Ga3#?jShhZWPE`XOLa!qb$|O! z2IV`>sUe&|dO)MmWG|oe2t*)qtk=@3uMg}He7il6>K6oz@G+A1Qqwq*9)hXsRse_LNcV`1Mepw+qr5Re#7 z9r=7LWK8k?OEd)>0vQ;Mkstr{qrUMtQ42nPeA7zYs2}>Y!siQxkdllQ3cO*+d=x}M zWRRH0jb62Sy4t?TN{XB*DdVGTMu-d=?c&TKNl~!%?8&UBZ(V25ATFxg!vhE$Xxyu+ zGDvXIBo?&IPFvFuKucFETM|V`Zd3JT%zPw(%Ec%Onj^M!va9UD+ zsWv;RhA~P~mXX$Xxz4Yv_c!%U3d4jzs^lVLK7!)4ryr5V1ly>+Pp-llg2asT7h=!e_xF?PPobgnnnUY|qea}-Yl1W{r=k~C+71C zY6?h>veE35L^5;bwk|DN7X4fGVW?jaD-zN~3fIr0Z|@gkj%nE_$Iph5_@JFWO-v#T zmv$6y_A)rxl%@X=cYUpCY+L+u+{?Y(hx-{$8VN0)G?{2KlNr;~F*=$t zMo;QwrqLObiHV$u^^_j)kb&R?q&|c~4hRjX1414Y3Jw?~!o(nvL zTiZ2Q2&$~gDj$bfsmSkTg?soHROY;ticUu_K2|)gV*O5sZ*-7@tQyldR8>c2@VbqL z7i@Ym?^(0nMb;SyO_LbiOiGj*g6$9ChwRR(x*(DaBS{h?p_XEsL<9t!MF1dxd^8R% z(^jW-B7eXD8$7W@<9jSlv76{ELQ#=yIyH$d7WxTRz~pN1@wj;~yJf;+8DE%w@L8en ztwFi_%f;7z4UXBz>@S@l1cJfe7Ep)qs#y_&6yQ9LClm-SWPad*e7e7w*;fS~gu%ge zy;puZm#TaXcdpoef2P@7x$TQdud*)yQ&ji+a#&kwonMyogWj5_ak4w}BK$mD36@Kx z!Rg1aF|&0;$K%`K8Cg5+73=N8R!f%Ay<%n$j@f>LUhoe`#4VCe-F)oT>s1z&Y*Z8_ z!Ib>K`9bdy9g1fab>y1L*M{nseA&5HSA41-Qs8T^9@BNN&Ic3{!cUT%4_m*8=0{Zr zP(XkInqZpZHXj4B0BG;!c@dmHGk?H)0nph1YkK>)xb_^9z>ovB#(|Y)6G*q^!`HqNw2h(1zfT?m+WSL3EV}>Ia{C zx>Z08!e&u;cJ}RCG~GDwY`w}T9GAe;3S@Uallg_$0S5Z}`eJ5Kx;cA(R(j_Iq1SGI zZ5<=K2rYt@+v6s1flz;?ko&dLtFG1#pgH*9wU%q~`_0Qny*q9aF zBx4^#{?)`}`&D0UlHQdUNlp~Q{fy9*GsyLs>GzlXqekOou~qjtOZ7JD5^oPKTkr)u z#U-26%rT?gIUDtQ@pEHX%AcL5<7w%9c%IcxKDQf{eEzPwW7c@%sQEJB4+vq!?74s+ zQ?;A*SqQ$L_40n^;=1T6x8gE9#hWG%u3nU{D~;hrl{Y#!HLa6W>rbAnm8#0f>YPe- zJ8DP>b-e%+u|K-HH>PU*_I83G5+X(b5JU(HOGGe|!w3RC=mbScjQ|JqE~$Ki6%Ch#8oHjqa20-iy(r(UnW2~;@dvSsJbS{ z&BE}+yyfS)F_Qqy&RP%{Jov28-$lWH{L7Pbt`$HIy3he<)@QHZ6y5}bV;} zsG(urb-ts3y6eZA2~M2Ju*e6<+*0DqAV1WY#gE1I>EbVgVs2}|$(Mt6y;1M=zG_Ka zPOq?uB=#+3u{J*L589*^Seg8ohlbUAGWI1QtARz75+ZxD9^KI!<`>l@Th+S z`MCfBup{IA2i`cyr)q|3t%xvJ)E^jICMZrKF#>1+ zLHkH7Lfi07x7(KRx!r*HHaVm$W1=AXVtA-~T9x)#!V!T*wdoF!Y+UMm8J}D*hb<@3 z#Zss@$UKn^&ECyFFbI6N1OHn{twpy01fE$}AFT#ozS(lVerdIv2gq9PiOb}CF|dLh z-Z<=ORTh&;jz89#P47x;n7=O9d;e<}a$RF*<>F6orY~KETPMA;%UR#=r;n0c=b})n z6}O7}y;?0_Nz-gN>}Ni|Igwz?;5wrfDsg{TPz48xasaZ#vR@5Qfh*(cs*~J{;oPS=YcW8D*iay}$-?^h{XOp9te{Dex3deNr+=EW zk3UAI$C-3+e*QoIerOQ5PXXxQFoXfo*FjhStHF1kf(KTBIVWVX+ffFXn0Hkd(Nuu1 z$jw4GkV>n*3w)|J{X;epTU*4}x&yb&xj6v4@Fdc2FK( zD1@T?pSi1hX(M05|H!#KH|O$PsFkR=e#Gf^#+jrwF_}zfOvc)o&KNWK>X@vCS+|@( zdO9MGP}Ym>0cCSAU=j$FLxhD4WGM}#N>rLq8qGyEl(cDu;>~$~>AC3n3%Z~tk%w9Dp%&ol#U1 zAVAeskaBt;NYj`DOOOPHDRejtY9HjFNUWHrhMqKV*)0nZHDC*pB!;0YpM-6ggI;$~ zERKU|!P2b2{BYLlcC&4@s^H4w(sb9&3%G>)a0-72P{Fw&2n?h93Rx!R*S?z?K=?l} zFgnyHg5P*n=<7*AKdJ~ky0`e?*2wszb7S|>KNnF=2rat&@qCh4tq1gn8Ck-Sxld{eD;~ zo-NSfmFN~6*7nKEa<`C9w`1tEquP!v30{LmurDDPh)NA3?qvzlifObX!SZrO_j>8- zQ}Yaj15Y7k01m)9;(O(6?W(=E*LqRhZC4^z^LnaS%HrY&kb+|^K#L^MK=@(~00Sgd zH4R)c1TZUs@!}S$|Jtlb3t~ai)HhFMAN*B8RyTcCg5xL=3kL$A2QiGWkv2u7p8($n z>*IotHbc`xv$GSfEB*X@f$~rMQjG}@Weyi8hJ_$O2d_pT@T1+~cKaIAg2R>@!$a^J zAcOY5|LxBK0lT}QM{w+&_YnO@JER}oyAPretqVbOB4~G@-F3X)oQw9F&Gi|XjIZ1= z6s;27@roLAk=@@~STJ&jpCiqkN+n}>wTj&Ap|Ze|l{pCfC*Jgf2m4l)qp@7x`7M%e%=U`i5MJ-MiLyP?qgm%n@t9oc-5!sPLg5Pr0}dJmqV86o)GXx|aA*z#RAlR{x&Cc52RUXCY}=uR`P zNi(ks&Qf+SzrKLY#S`%!!Ut()duM3{d;p|EN)tux$#KzHxct~Vesy$NYrS@`JRS@N zl$62C2Pl6JK^}G9P{<3Av`>6sScGBen>hp{Om}k<)&|G60tEw}_6T5rO$N_#PSRFAw??K)_%B za@fxWc>MRiyE!~CJNe^bY4tw3u{${YYdKe@ZyoIxd@=9~e?{Mnmw zxj5-5e>^hoHmSNOs?Vcr;vfoF_L@sfrIOHh*55b_V?Vz`^Wy0;ucIg*W3iaNw3Kg{ zW>k-;UKtn6yaAD2O660a|70&i@`~mlM1{1Hl<1&siWX3)74~t_pR7;gQj}`pN^)c*L_DY?Nsk7>SXYxAtwr&W5Ae#|Emf=0gh-z~1#$?h=`ua{p zsVej9rnz}~x_PPs^Ggb{+vgS-LB#_k#C<{u^VR^SXtWi;h_H%JNC+PpCE!qfbi`%( zm;fPY?Cu+^+k;U2mDrvMl3JCVZH=Y&x zsx`=i^1&hh?9|QCn^Uu)-PN(hso}v<_^`J|htZITW#WBZywkjUC#G*NH=DOpz2)XM z$^{&!2eWV9UA)UVo$1`0_A}whZAnJ;Vr2g9JWh(N{(Ncqb?NZO)yr48`?cIasN5hx z^Y>eD^%aTDo4Sg7W!;Q;SxV0DM44DW6UegO8ObYJZCj)$I&8!iW~BhbH>)qd4_R`Q zTZeFw$0Wn*c>2=QqEzPW-wih@U$)8A%1Zll$5Z30AEryYt`?5#jE?~sh#Cb2i14P4 z%be_EB8F-JG^i0Za*&A#NkK{`RY7&DhEMP@@~=8Z@ccTR5W^Y~NFeYh_#k>NIz*0B zl#JU~ZFky=J3%S+`qTP(yV}w|BG%n?J2YmfEk#mC2V^qCBdUq(U{n)7sZV+XR8+SJF~}ZoDkSA zhPEX0R_~5}>e^PjG9Cfr?>@`eBxxI?sj3u=Ao#wWjS=yEocT!iS@?7+H zv|25l%e`rR%4jl>zm#Mw0S5G%s4Qs2woB>DV)?Go8TXH!Rb@^5f4BBTslFo-gOB6ZV?o;RIp`wxH%-|!Lnob#OL zIq!MT5uCh}6cTSD4Uz9pVUmS~P?k?rO6abpy+C4yND>nXs{{Igb2qja(Lpsrk^>2k zsfD-Y&2)a_>{Dy6eEL(z%kci2~M? zmQQzPeM4iOfq~#glO`lk0g6blav&!j9X{~no2byQ--QmoOH=eGo9k> z&ilo={SW1$_kQ)z(Gm&1kxun#;HsuVLI79zTfJWUaYHNDi%X|50W{r$$O%bO*0XOM zhfzbWWq5wM?Kp~KO1iEPylLvd23YvB5dSQq2M#Oo z@MI=kGNALuBSW z`|-H8v;VaSs9nlJ^mjo8Hc~rV$vpsA9*qF@FAm-%|z`6i7PFCz3 zpM+#UEI7G^1x?07Z){f3O^8__0Rg}Q(-qKxuio4*R_ozi(lT;nTGU*pV`6*Zb?x^`YH);=9vE``@$i#piZ%=4_S6GX-}O+Xwr^A}`vRP*B{1{g=p)5)TO z&>x%tHIEQ9L3d`yJ%ea9qiZj{gXkU*u%HHSLlD;fgl9_yIA(V-#Y*va4#Hu zb#J6U`4V+8+_^J6Jv|t>PKp8}L$bvw4+ZvVad zZ2RI(JpQPArI%2x@F`*eS6NMqptkGm%A@`57u&NJ6_CvHy%58rKxfFLrr8fGl`YrS zvUU_$Ax#THiWcykoD*b66BKYT$0Fk@uyx+GL%OB$qT1Xjo)1Lb6b>IxqYI;Gwb-B!Eg7ChrJ$jq@1{Msn*=^Xz^{J&#TTeK z>_za^323fVqVKKKljE&Ni@^Q6PglB&51&p%fCc~yT&+Cqs_MJz zcb(Syi<61P37~9^hPHY&VMjnF0Qg7vbh@&#xN>o^_lL_!<>Z4C=L!pgfl@sWRKRdn zDz4daWkHLeJ6Jr)YnqTGA|d;!rX%|+jF8X>#|{Bflmb{9i${9(%kbgaQ3`%@%hgSZ z7Ru|Fho|M*KZ-l84;_a{e1A|2R_A-iv(ILG{$ATq9F}$R`Ao)PdB+tTWNRLDpDAS& z3GAI$z!kv!l9?wgOUe9fa8VM&M3NK1_M`|zlnXFGILNp`Mky*C?E?bNq{YI`c+ozR zt=+To`MvScPf42QM1n7n1&RY1Ku6oHF_iN?(~t%3e(CEE;u;1iID%G9-EtD>L%?r- z`*~nQ@Ri>SCV%`DaDw37yCVbO4yc#0zfCBZU7PEoRWj&csM|$L1>@bTE5}fi7v5m& zdi8qm$CJ)cTh$!R;nkFeu7^xz^>kVX$+);$pScq*%WJ~>v(`?zB7n8gAuHetGH87lWSS=08oK7;I2xl;6oaeHlb1{3ZPWtxlrO3$Qe5{UjDbLIPP| zM+2GqZqPpt(6SMyemqx1`J#0K&H! z-YQX4j>2-HSO6VJ0uJOL^Q)jam;wgG0Ov@V!eTT-|+C!TbIP zLqlHgXmB<->Kz^)MDt=sP*3yVAh3X3Ql?1~kHvDa02y6eD=ea+F?^%_y7*yr|N6)E z^7YBiv3{f?)bE#q8iJr_C#J6E9h{7zL5PYHP0K#)|AgJ0-A}**B0z{hI_LZ@=YJz-;mm8A z6BlAJ9LHij$$?tG30ngvvo+WNP7S5yXJh$rn88>)&4w{~XLGGQe+ckk7<^I`3t2#S z+mJcMe{fX&SdI)mmUVZ({H)w^^;d@<4-ZdUr?&l_Zh!JDk#Gdg){)$ojHqkd8@2^6 zw%}WlGdR~GaaPN*@MmxuaX(p9aY|FMG;9Un09bO8lr^vhERB=^3BShdGy(bccHmuX zJb2|RMIx#cg*buHD0E2B&3&*^1ECPA6X+a56D1I@_Mzqh0|S5f-Twgu{Ju>BpaKTZ zJ4P&^2yuVkdHcu?G!Y987pDp|Ey(n2JQ-JG9G+png7w!Z$~aDe=>Bl>+ zQ?9`i*K6ygNq97KT;uv{R8hFU`m#oU*sTukPBfJGO(#vlqVq@#xRa;`$vvt?g;pj_5+xQz|!2l)Tx)y-J`J43}p=OpbDzC~Y z2teXt9A`6{oX0VWBr(tdWSGHCHKS5EP6{jz(lC#2gBsk?{1?^3)YYDzP^z^@5X3aF z4G%U!1Si0kfdo22sFgH4^!Ih6R%~eIEF7%gUSJ#1U)zVSv~$DS*@2-@Ah0mA5E=Ql ztFO1K6E!)y@~^yriHYl3fkOSVW59qJ21LN(@ar01tF~J61EWVLiATHjf#BKVm&uB` zz1WTiRdSTFR2oj4tgj3nPaW>J>Z9e=aaV%d4G3SfMX?6GX)rRis746{tCZ-#A z=H@=xu->h+`cPeqx}GOKMK<5EB^?ohYeg*y&ON&KL2rg=8Bg!zQ6jJ@r&(MhVcEe5 zz)y0NiX-h0Rsh`wVDO9pJAlD3M$Knb*$mI_kM{J2rp}(X_V=d-_KT!SquW5~p#+;C z-$bbaD6WEr41V!hJK3)5N*9U=pt(Z7xkw23ca6Z4$P5Y!e)er36zUG7A~UxG-*x~1 zbcD`xntQJWpW`$tu~bP~;br>PIK$oov$v#d?@8sU>eiE)wYLu@m)_Jz51P50nLz7b zQYf>MEiFxyPR6!UXRvH9cFU`QlplALSfMTVl01K*>w!8Y=$;K{S{H4Hh-$gJ)1n7{zjFU)$u#Ef+P3HF zR?}Y_Nv*#4>kHYnJx7FBz=i>tXDF8KT4LpV2N?Pt%bF9-FrYe^zg)Zs8z7Sgx6i8W z(g7SaVS0Hv%`zYXG)!fI7t-iD0Je${j;{toYw!F#aKX;_Vru9rG-jww*J%B~H*D7+U>WZ^<)fzVeKK?x zJYDm}rL(_H9iDkEEVK7X*FDd*MNR}ouwi?aZbv16e(PZo;GQ9iB(OjHcWe>lPP>Q% z-2qb?D1TUa8e9m75sJ=-ae+<4*T4j{%97<^b$qYbY&Lgf>&-}TKdsT|?9)<_D$-yK ziSj^iPam2p)7>4o8bU^}^UvJ~Tn8>RHQ?78ft8ii=*s*|>hpe-7jX4`tu=qoEC2!|vq@o^=E9XE@Az==YmP4J4c+$}o4%un1=s~f zLj?1Os`mvvqvAl@j-?xWk4MY9AN_m-w7qLhOU~Tl+|&ATMK|r#@t)PX^wTy-JDV#= zo_+eu*;?xTE1j@BPoMicP=>BYEqlYVfg(KJih}bqG@J?N%si?Zz?h6+VtJC4f%5S% z1HL~49~cXW&!$yOX2_fxpQXYWi89Gp6~~+3-?;RBX3>AVzdAn@3>-TGiZe(osyQWv zhaxX*rmppZz(&<#JwsPRC_%jEN_U%F2QD%-;6J?spR9~V=0OE~egpjf(B<0;paTE` z0H;tj!yf^`dV?d4FflefNtvd`$E5gjF*9B|Nt9lHsWh9;?!sUyQm#HP54M_ocG7XQ z0_rTcBmo^Po|MMcOFveRSKh~#A4O7;&NmrHn3WWjkJBjMo=-{~tq|Ep!}B*l2Hf$z zh6^BISi0Dd;IwHu8I|u>bfj-=0)M&8P)X~+wB1v;|_uPZjanm+8SB_oR{l~nf zd%*Ar@!f-|Kx*ni)3xXB0R*_V9uSLH3PRn>&%}{uzeJ4m!Y>C)kw#(8nKCWoA8qds9z|6OX0q7?+Q+Q2XKskCe1-Wvhq7-cP!_-GAUhki0;M-1l?c*L6SlOPchlIoi$v z4a|w2vf603)sos)DF9j&oCPqK$g6EWkWqz)>%m~X!D=Y0qt=j}Bd5i3t0kZQ3YM+c zOS+06fBrFi^zr?No#N$t7GNKA0U~`5mLBUDKms5}u!g|{8)Y2sEFD(_oC9COa2#bF z$_`AS zk;55}-8JKq!tLOVTem)s5bU>D`pl@{2GoFQ;JWE58%F;J0@j^V$&hnp2z0>U@c4b_ z{owd;Pj~ad07?i9z%SpO9rcku*&d~Rb2h91N-zdeP>fDXhm(KlY{#BeHh+Hp-JT#2 za^q~mUu~d0kJGY{i01QuobbPMI_sNns+~|Vc*(b;b1A{R*D>zYw+ZG)jNkAFGo zY+i0wYOJ;d=8tGb>6gpm>E_f&U3}7Co zK@4MS4Pm<%n@yB{kt1S{V z0L!>gDY=~{_fH0IK{V|;z?kJuU%#mb^k5%gE1<&FjS>AaI}kMshkymFSOy0N$1K6s z9p}R2ASw#z>o&KWZ<(zt&pAS*8Q(M`&BBvdEL(`3AsP^9=5{B0SKmE*v$Nr8?UhTB zhA7KwD!)9D^6bU&(R_aEuJ`87f@Ng=dH8rCm^|lb52~=Hb98P_%r*re|T=h4= zY?4-uqs(jrFgy~`GgLhOJrF{ar?&^tjSaYkn)rB{Ts?4s{nZjsdlh0qnO!>EECSk} zKRUcj9wtzoADr^|fu+y+X}Dt?@md!zKnv)auA!uGgiNEWT?JkHLgbfmv|$Xjg-bX= zh0_j+15dyxC8j_i3cKO_V{VF~!UYPGu`tpNI8ut?f`sGYzZLtf=E>8}!O4qVYqH() z&^*c8XW-BGE*HaeP|x^a-v}ZD!-I%h0j%D;hbjckzyHJk0R)7;>P`^8cDwKT*x0yp zYGL8ecg(;7ddE;XBbs=8<6xi8*h#cIm8Ng{vR=gzJM&L0k0ug{{rt-*Yj1tCKlEba zSt<_du-x!Z+)U-~V|{$Uo&qE&b3Aat+IL57 zy{!W)*9?|xA7wPXtm=kL@$)R0U)50YmTnmHJSe$lapbq= z8;Aj1QV0PD{pSXEpimRJLc|jch1y6Y4DOBmX(%du%GfH{Ae705IlkKYC8-8@U zkSuOIAN9*%e|GC^BDLK}Rd41~iNs!XE9Fo5z24}XcW>dCCJ)0LF4H2(F&IOOl0X9- z$bnkTc&x9jwQD7gUs^NP)JRQRQZs6ajd(P4fv+1nyo_iX+d2uo?{pXs#B#*zH6y~7 zipfYT!g@3y`<>t`87$4KhM~nh=cgmX^=*$d9Ebml z0l7h;yDkD?9|tO+xU+E3-IOGtk^nR}0uTT=Ddv`O8<7ywZqzpdKHxpJCewwcl5Ms2 zTj_IaFshIW&e>fqG&cg5$-+}hw^wN7#)xTb9Nh|;KnHX)ZCANm?#l#WG(L1{9Zio! z)Xx(9<{Re_K-GY$dm}u6_^NeRp$T79<|d*XMsu!QS_$9%)96-pbSoz}UOk-tY4^#` z{<%bg5Xy}xCq}CNt>xut+?L2yGmS>z!9Oaez@USzP8kmoni-5fW;#rp0bbTJqI;+FM=UeCF&Y?;|FSB6&$BzLx;vXg} zt`?AeT|ZBr#P@WbE$OufYY+)O1&=!)HEkZ~LN|hF=$pZ$gaknxjE*yIur`$ya0O03 zA=n%VB=Ld$gO3OV4%|>cj*oW-3xQB1!VXY_?t}nQ0KLV8rK0tvw-8QGzc{{hn#U?x zY{um#S&m~Ei6>=}+}|DP?=koE-1s~m`5*UnJrD@%VDsCxcg$95yw_Q`Xz%-r%c8NE51w%Zh3@%p!3k8X*rS3#?D_r;ry z%ZE)NQ&j~}2UWD|sU68ht5p%C!5&k0ZWJrKZ(kfAT-%sljMAR+3>_d*bro;tX_a%k zX5_SruJ}DPJ72qK|BJXQY-wZ7!XNJ+*iZXu|3uYnlHRN))9KwzXU1x5XN)s-Vz)EK z>Lg}#w5hYXQFln(7(%@e+7E7_#lQrbh6obkQfNRZ*F`MGKte6se#i}%Shm9Ivg|o2 zZ2J!sK^zj$yzl#*=Q-y&?@3FRu34Iy$MUU~j;_Mer7bMpm8Ij^iu;L%>kqh~AvX|P zPui_?+TX~(Z+$v_FZt7E6yt!TwYEoZ$3JWEKr_>t4(y`FvP5`^AmC_2z*lKH<)g_Z zH5R56HG@(Rq(_+Kcvi^(OAO!@f>a7(1P_ow`dE?5#%OqBEKE=U5Wapa^CvqqhegcAE>UYc}^i7r<(F#3X#U_WsLj82t(XaQbIQ zM;E4l?{+#IllN{aQ{hX$8T3Uidws1F`pVv4^%kSqE%;cbQ1V!(a zb*uI%2U;*U-7)6u$Lu_y8AN;_EsPQ1EpFnV3pcZGwm%`!5otuZrYdii>q4Rum z@6Eechw?^oXGh;Z^*?b3Eo+r53?EI_e3n9@<0Pfk;IPi@Dl9{^LS@0 z)%Ae#0BS&$zY!t^EC7x^sRA*8|Cum+6qA)LKXOHW~ zz{<$NiW@bc9gP7tbToKIc2s43C>0a~K_Q?9AB;00*z=KVaL)bpvm5>K4}0y(&q<*C zRe~_~A!O(G6)S;b9E+guvd353r)Rqd4QsE^Osqbb+bTE9rMXo&{PPl1?OgZR-0uDt z$8`Y{f1H$%YH7}rYNnFcLAz^ylzm$oXgGiZ-MfJnk36u1G(-(ES~7J}u{6urd~#}~ ze>rZIEgg@4+5~hc#4ERFTe?+_roP-42il(@Y099ea72X-fxb^z?-;4Fp#0br2trW) z0RVc6hV24i2V^loX0TYmqHB1GGDx1qodK+ofKP#h*RcVHWDoe`izn{s?cIz&5Xi{$ z^BjW^AoFWCJa&6;w*+v-%m=9msZ+>pMdxK`{r)@@BhiQ zD<6P9V7gZ$CDS;KpS9kvrOj0(M!@O;2ViL6@+1`^!|)q^@jjkZG8{IAM_>>5NW8Sx zpc$M?)YXc#LXn23lDrB#Lgm#Eh1ZNRR3wtkVupYuluV<3&{%zY{BFD7<7v;Q%&061 zUIx@47vPxKJ4e6Wh9jE$an88i)-~Yw_5HE$*5x&fe)sjtkQXc6ioo5!PP&|v6W@=# zSXh~GIB^0R<^*jx{b-~}jgO6c=N>GL1%qg zQ>cgh@VRj^diK&f%SITpmNwz!Z?G0V1K77pAP9l|!?zByzJ_~2OY55*V1O@=K0eo_ zkj7!=P+)0zdF|+;b8+$SR+cwHtU@RX9l#6_&3AhMQQnDCxs*6RIXOQ8RVjG|+82o^ zB(Kms?gqk#`2fH>k*4rk5zH5&TbTEWR5*n`a-WY9^ts)Sh4z5U^Oxz$(LZ0^Uremd zM@xVJf*7EAW?9I2`mhva@9%>k;B@plda!Q<1;MRLvj%+IDfqZMTlx=^lf9EJyg+v3 z``*d!BwSk$j*_``%YHQ4N(bSfs<<4wwyRZpL8`i*^*h-WVPwxc&8@G*Aj`s$qkCV&09lL8Y zmY?$T5<`jpS~_~9AFluaAOJ~3K~xPu zPdB+|r=S039f4eEHMy8s1oJ|mzVkCwUH z&DW7R!~>2X$hpQIUv-8FLo;%m0vlWg9^idE-mT0&eIT3NGPH|7)18% z*Uvuw?3uX()nxTZ2nonu>Mg^s5j3Y4Ni0vl9Un`Ljf?^fOr5!bCN!mnGyu)(JhkC+ zpCRDo+ROrcp8Oeg3>+Q3xt=ZEOr0G^^Tm-n47CfGet&I)U%Yhf+QVWIR6ubf&lQ)K z!s-&qUcdD356=((`euJ?yDbn}?CxBy`JlvVZW2%+rNb!l^<=A3IzBu+F^t4F&5mht zUEi?PW<2=*hkt%Tp8vyYuSy8I0BMtLNRW9+*lLs<2u>16lw8$7_j}zC!^JA9>H)|* zRI}hZ=(M2f_!_B@A#!^Qj@Or2(Cx5!3v}p3Z?-S2ZEqc2&mcb!5PXaT3MZRbrX0iO zx9g#oG#FHmX{PkDk zbUXr>n#2W&CqVL0aH+$PG-xwC*L!-t^5VtYjSMbXOao&wD66YH-7F`+_U#qP^Sa#* z#sjeoq-ul;2%hFfgCz244Ag$Zl1K)}^EgBDvdTbQN#qKo5lX>jNEt~Yh7OGdiD8m0 z*D%U8*VSI_zl%&x3y9WA%XMg(Aav?cb{g4iu3Vfx3rYZ8zPxvDZe;H4gH!A!{TTv| z*Cw+Ie_wd=)s5LR<5M%G?E3w4v$JT544Q#AGQ@z_WFC|9B2h%sbZ>LwwOh*%7de3_ z7S-FY)Sd7Db+Wzn?6DJRPStaLfIlN3{K#+x3({ssbU)2hvd8bD*cYO%;dMm~&^D@H zuMPSudMxUkSmm`(m7^v{hjIfI>XE$06`5hEGGp-=nFGw{%9y1FkOQ{aY^s(S+B_3p;JWY!;wlK1Tm~es@AMi6 zx~|)Xtsk9F?bZ}b*Cf_(YX)jKpX(g~`ycy*225R;8XrT0=7)Zvv!~ZJ;ETp#ckaWs z&whPlZek)eJM-ku`uTISqyM|rjLN~tAgs1pOLBgxA;@{blym-Ly%6T-?e-#2cy*=a zGziZSBu0J=6i-WxD2iMg(9twQc*p$D+s{kc6MzQYO<gs|U5cX)Uzgjn#pL`E(%GDAra3+T89 zi9CsF;uz>Sw)u3jGIQ=@v(8|0M#-QCfp~`DfcM*2w;yyQ-S#z*lP;i%;re!{MV{H| zYFd8)457-B8AVZ=EaE#P&){qW4VUl7@p*j0P=>6pd?3e09bAeUrA)d5s(x+@;YG`Rh^O~ z>i6wd8DfUSAtS-V;H=;;us{w0Q`Aa2D3k z85nx*WEc7k+`)bs`(Z}++~1#b?mb6jWL%x?l3>ajgkgw`D4Qycd75Q8f*~0o0Fq}| zkox$%cU$io-0-yi{9yORS9d|a;rb73X>B}3Qen0w*z-jMpF55rULkG)y)=l0FwEQp z;3W)4U=8z3Fi7440YU2UHFIzZ2&7-;!Z(9|&N484!lbtU>EF)k%WG#Z+s_Va`wc%x zNVA!$Ek6?kgWh?JNdWr*JYRAFcM~jKeRnjVS_2aJ$@v-<@>uVlw&1cdx$~A=qPRQS0BAYKxomwQFx|UrhzYEu>cDI!u?M zjt}wbmn+rfYI)(-Liyq!-%XVPq+Krm=DqWTfM5RN=TEjC{s;l3(!%QIy{$jo!p$PU ztd!<)E}&9ddD;E#$E{DdP3?B;w!N*?X&R&^_<{&XZ9V9ZVbg;JYT^uDq5y=V zel|`_hS9nB?cv_()6)_7zZj&!falXZ3%=T1d~5gJ*B9Uami_*;bMQ71n=E09>juxV zG($ExT~>9TBM4Ks+9nOWPT&(fVA0zqhtKQH-oX8R8RCHjh=EUc6Lb&HAp`vgph1go zb~|f_3Lu8r=DnWEgwwH`7KPSNahN(O2$n(Gj8t#X%miW`lzf6BHw*17HV1LyXwi6z zGe+=}jWSJ<;*23d-~~DIeb;F#k*jSyu5LQk&e6-W{Z4)IrHoY7>D%l;)oyH9TF46g zjgtzvYkcvxTK?TFoD43NXRk`-ywXAcJ6!zXO6SSF&o5ubqeQN)u54{xn)QvU%#H`n z`URW~*Y9j=ZLQz+1ACj5-N66E76{v=D2d*YC5V7V%O4>iR7rYdG6ZNh>V)P%w9G*y8DRK_D{73XZsfvB1$Sa{sW zQv_UKd!k6|u(AV?115<@9mnG)&r(kW-wo!$!0|y6L_@?-Ko05p$v5@g+YJuLg5hW? zn@*dFY$G?z;nOrp!wnOja0<{WNEyHC8HE#K7$fU?Jn)yj3;J*u)i_u*yO zRi)W6fgkRSpA!lESQI>1S*@=?q={*u{&x;Md1|F2%I0Ra}l?DQm6iQZSz0hp)4BZ zBUt`X9-v_3vq@)lW%4~`Dt?NO(+Yyb;*RYiuEOFJjMwg(jA+fe_R#?2Bp6GAQ%TYD z@O>Tz-{kCZBr8Igtkd0Dl?Q?VbRhXa1wH_(_~*gt+SgsqB)J~R$spmKaZG@Cg9Qc_ zNIfrfbWkonug68((?em9hLOTXL4X_~$h8!_XF8yov1FQ9A_C?k*A4v@1_fu7e89ShlKE%t5WIz0RkSa zeYkaRtq%SVh-vBC>gL0nAIz7oUbuh#{{2}#@M5KWCJWjpcl)lR5LBOaR7Wysc3l%p zwI??PiZ)D{>^A%n$iECWlM)x>2qY8A9PI17-rl9o>SE``Q83DjA~iuLMQG0>NVCm(YL{V5kaS?q$=TUG#-mN1 zkZ4Y)ak2-`iDE4Pd)A{b!cJ=_D6T$C^^aU1bD2T(bIc!iy48JQn52 zAa-q2597p>vIGbrid;VkLS4#yp`FILAX4xaxc$h1_|aHP@Yj1}o3+yct@<|a1rbG? zpY5G=PM*H`Q{M*HV>_wjw(L-& z?&^ssx3Loh6WCxFOJ(RD9{51=93zA9BXv?HINZC05n=7yI;jH#VDCtfG>AbUe_Z1= z_yO2sK z%D84#E?vEP9~T9yha%M!SW0F!MFwz{Wm={vk^p+#2GmxfjBT*ohMz~-sM%%)i4z0- z2jKQllngw5_-5hsaPpUFp(v>&CCyP3L|u0}_JvnZJ13LJ|0V8vUgO5E_@#&BUg)Wm z_R{vyLl5x}>^QTN8KG$;OY&hRmLjY~a*1TNgCx(aw5}SV_!}YAps2bH>%$`0pnwE5 zLAeMA77|Dg9hkPnYj9vf;)C(QDI|2qW$F8lPyGwb;IT*c;F)>v`#zt~`@Zjc(s84{ zx?JD0dlFvAZOt%TQy3CD!|FJdtF=Mudo-Xsm>V7>1fYUuXc}C_H9FY*CSyuOkI-CT z2_`Mkp2oFJ-5k8z*?WETk^|q!CgUtFm;mCx$opAgnh@SRUry-D~hVnsEj2%paMf8%EC+<+9(XaNDmH!ljad(N6D+^6V*j& zs*+3|u#pwYQt}FzAFQxCP6%QxI6pgk-l22$mw*8m8UlX2)46{>Ss3>Yy!)VY>(=kq zYxA><*iWaM!Z%koUy2kUUqs2G!SjkG$6~^=NR?GdAsN=VGoVGf*R#eG2e)VG$7MXJ zs>vi5ho0xThuM=aU+f)+Ap-gr?~fg;bhfHVmVB6NUjI*Hp&_n8_v?#1fb|^JRS8c*^U2Q1*@!1eqUr`99BSYSwpM z@YR0iqfiCvi)hs;n4S_88ksny+LIiFs6MRyZ#qxjzpY+3jz_)G=;_k@+fkZYAr{Yu zvSm5J;q&YDx%%9dg%x~Ua0wS(v|23yfrT4C`{_?EU2F(A`Rla~J}Gz&w>NDqf7SW& z{(5a={_3=Y@XW%^Mey2BZQJ)zvc^*?(zjHK7K3yvb9f$ED3kSQjp~`g0A+TW6^83d z{aCKX!1-_qe_W1(HxuW;d0T}s{B~&Am4DBljFJ4`=4+LH^I^5Q^!n+a&zd`b1o%!o zR>3`)Bo>$482Ds{q3IGH;xWXXqcot0_?zA%6NTn*ch|NqNCb#~1NZ#r;1W25rb*0@ z(;4pd>dyA=(fg<4j}x^I?*ij{Ai9K_6*S;_6(B#us=jhi2q7LhpaVs|j9oXkB|)>p zK%<;6aOI5Bxguu;0)htJ zn2y3Qt#B*p`P#;`d(`#i)^xNaZq$Br<5$19e6i`k7dsDrKV<>9ci>zD?+N{7eRggR zmj&UD5x8H#=F3Dh^gEx6GB43ArAQbMXock^#?lk{&LbIAc`wSq#FcIDPjG4wKFBJ_ zRnc?7bp5v}ftv?`LDiTirX&M70kLxj} zt`V%p5uD)Razv1bZ7u;`$mj-f+i;@@Z_oj0!1Y`auIAO?XHtoJKrRT{C3N~A+3jxM z+T3|nl}^7o`gI*kIxF%KO7pA z0_f?p-~*YTs-nTFYNW`LzP85Fipi_wV5=PO%SACPihLgg-w&}N4qeUjivIB5t?eh< zr>74OjXW!1#f9T><{W&xx^$F%`>eV2_2bjM({ECqz)Ko8WWtTwbd2S0J0eWd0OgO1 z^+6GMOq+`|P9Kt*OX7OJ$P{#i0UAIXIwwR47xjAh#79I*I;il$KToGX%B5@tMW zfqPJZ2q^;Bu}}cI5CAe6S&yC{@1E}NepDiVjlRdPZAF&FvW`u&ThTvO7Z&G$SJzio z>T`|8`o@ioS$tyrPaD7a`HwDLY&!78iw@ot>|SeJt<`Fc`<+hb!TL;XW_EE7GXTs4 zAOwh3S_TSRh;rz&3M<*ApIVMJFcyF)U>Kqw)pt3Rk z@2+cxV`B{`{Q&jBie;e%s^*Sm30ZM2`#9Mb_948BtW)+q0u1gA9bajymakI21*;$K ze9LhxWE&7MKosp>;}9%s7nxZ6^RPyXN8jj=_xqCJT48GS*Xtg->x-)2P`hkt$zj%aQULE1Gl@Y=fh-bSKt*c zFRebfe|P4*gdHh;qZ{}4L36d8d^(AV5(>z}2a*<~ zezU>#_nkZU{_$L}$oK2>C9r){jzHRcF!XpY#RNz} zCZu7AWkNWfM`=5WSc2I7; zdYKKgxv;)^>(TpGRa4Kis2$w z5&%>n_A>fO^{9LF{J|`ZW)l)4P4`12X#V|wI-I3wJ4cmwKY#jhrF(t9VR8+#&sZPB z!8nj4z6Q$A;>V_m#hT3nM+DhtY3_6a1|Ll`_yZ9uLSS_Wc|Of13<+TR(TpV``O{Z_ zefj$J&K)4JemtVQtx|%R_)m4nUbeL7^P#H_a$kth7$H&5PzO;-CH`0mqv$e2f?}j$ zZwSVOO9oJgfF{r4I6*PxO^?c-c231CT<%@%6fc4FHMOPA>iBQDt5k4793P ztrpH*-TLM=HkNg{e4%xs0QgS`csTDAe8^@4my=#kwQ}fCoHr@o3z+qoS zQJhARhy;UriD62Dydh|sLPLSKYYqX1&3g0lYy|eFDh4bBAf)`sG)KdOXUE&y+uiLa z2^fvUhM>xIy;=Y9QEBIr;x`ZeTw49*C8JyUYyjix#0P@MVHI*aFV^d(-N3wU z*@?w<%vvKF&A{V-PCP+CV7=aOVEC@Dx~l6ADQh72(Lhzu01d|n%Hb!+$G#gU_vR0m)nl0YW#(iDP#C+=`(PH&sE*$!O=N%m%z)65@Gh`f0oW&ne{MhHz;g3*nN6*^y2uj!-}$r zDri`?Y+rWnx7P0M9^l=ba^-OM;OWwtoqbc%MDVV<$es-IP0;LMc^jKHXWAmhCJ4P0 zJbW4_mO4OeaMWP07mUY)LC!=7tLTBZhHRePpqKZC;|?VMXVZHRMnr({5@w!G*??ie zC21q*wVgBrw~b4!zF)hWAktGq z9sB?QAOJ~3K~#2xunl-gf$b^X$A$=uCOJx>x`quy*rSx%&R%n}t$u3R({PF5;UK zxT|K#7*P_n1y!N({ER?!+8OY^aWEXC-gE-aI2?|#(F14Cfj~{*v+$^Uqx9$joxrVE zWvu_os_Sxn_g-oFvwKgTcPp(YyZe_94?hI)E?KO16N?Qtr@Q0yaU&7g&^}fg05spG zlj$t`S#9hNB1*6%1?gx6io>KN_Ju%%P%j`;B?M_EByEUFK;XR8Y?6_R>zG0^&$5vC zk`W_50X`agIfSn;$~}1X;>e>c#S;>kh=BNX2Ou@5A_d%aBhfK%y#}X%pL1&XBV9od z??cCnf&Up6CjFY8ChZ8=f#db-cXocgT&cV{{b%)6>*Osg0Gp)6^zx}ln z1i=3e1-tV$q1M&2|}^;8b@c*h*OqY3eQnGmSx1w@$c%csvGU%9R+268n?5m@g)WnrQ6 z!$*(%vTohoH+4?hOlmdJV)9?&`G8IDGbN5=&ADuwha^mA6K``crD}(B^DI($Nfma?EhM7a=dUG5W%VvhU;V4)zyB5IY9Fu=#$!pC6B& z=lgZ4)!&69OR5KgFtj_K3(9{;CO3c<7pPrpLJ&wzeSq&|g9PJo4@1ZM=Zn`B&Wja^Mrs;G=D_7_WH5zt|Lw{s|{-h<> z^g>T2>-nZ0g1y(trVYUuOZf4M4(K>t7CFici;Zj-d!~TNt`3wjt!|DFK@Tc$lWsl^ ze9Se~Vjn~83y>C?3&~?x6tFrHRRe&XG7Yorkd>gaLRR_>*L6+!&o#gqc%f^U4%_Q- z_|=m)pP!c^H^~LzUtV6meLFUNeQ{A1C z*E?N5%(dupRqV29sl`^y5}j#eGC9X#f&1w!n`<%YY+4_^v)BE8H&yJAr}Ume9^?V~ z>xyo;00pL@VgaDQEK8oJn*xVGp8}eIX_j8;OODt$4n+U#sQ!;!DYRJYH!3^5>VYTwnrx2LT^~3ON4#K3NOc zB!gukJNIg}{SC5Ou{bj^xjo*}82j6)FL4y2C^B+a&`26Es0ebKV;vh@Sifm?hI-f$ znzGa&SJ0Hh4%rLb?Au<))<0i;d;YX@SVlrI&6NX;0}ijD$5>zn_`$!=p8WY0#~${2 zIgzerK_<03Y#PRFIE_kks3FW(-o0|;`ShXP?)&rL$vK;J&b_eqTA@$o8#Yz0p2ASklJA+WVW%nG<7fp^2KYe59u5pmbKu(1cB+cz@XBu`)f0&D zw@gh_bd9X>@Q&u1Avj*Z2DsY*3CIhGcT+6aV!Q|6y#9POKJ~xQkAn}|4`@HKu#nh# zcx`{bwt955T3g+}wY3x{SE2BWpIy3gQ7eJ}4*};d+wI-e)!lYlez#jffHeiJ-^ zPmcQpVAQMOzn&&n-#lk144ESUxbid@0ZI@be7Up?XgM`sI(c^XyqB$KQy}@c6nWO~ zAeKD$702U!;RTOIUbWeO1cd7nPvS7Np47`m6$Eof>cwL?oki+xt$_~$K8BS;-8fz}bq_+Vk4$oBJ zE(Ox1Y8bq$8SHuw-TTWouTOT9v2pB|Z;UG+Kp%pCa1eoVif)3-KE8T%L>600g?Msf zE*g!;K@9%tgZF;?gCAY^SkWJT_|un1t8;nCfKq&EW^!_SZa=@Dk0&Ds2MdwdVq|)8 zaSDXsKPkawiZZrWR!j_rit+B(;jEGy(2DO7A)b-E!2DkhE1yG=u?(*XdyL|%1- zJRob+U?5Z6!wh4Pt^JAtzd^fm2f&@eMM{<_TD5$iU_8jXyF8cSu_|TmnhHfDQ*#+s zg%sdf##9d12f}kQOE zkLPM*sZ7Ny4<9~P=|z&<^IqMZ72NWix<0Z z?okYIzrq9vqMv2gsKK{4PmIB7Z{=z1P4$zn-p;>X&t=lASeL|<1E!FJn6^?9Ls~Yc za^`Sk+>_I(K-IyoSv;hHkZmyF{ZkNn&%;Gg6s-_JLLwa`t4Q{9suYp_g#6)6&8AeW z7PD*Qd>62Xq}*}tC=@089O5({hzT(~B5mj?r@Ep!RS z!0#d85iKH&NkX?F7_g-njKD8?sSgj|aA zbp^BQt*RS#Y*X%xY!gbpV_UdUZ_r{l=y<~pmV-bZ>9*~ThJd~-#_XDc6`7OBYA{6w zgR>hi*umiN?#a!k<@Mg+)dL_^S^^cog6-on9M}MGfLXABnQTTMjdZE6gSI2|?+Ox# zb_xUoubWIc4Id1HVT(XSij)O~3SZCyjcyQY51s%aWb4&5>*%&3U_#}{Dm$R)Rm9<} zhACF`g;pga`x&lp zFn4_~Zd_Lw3ND0}LJ55-__28??c@H^?&`;mR?NyXnvox*>dsCy>pR-|PMj>7St&EC z4xarXPs9+9g`kCH{SXEk#vp;4pg<80blEC9C5nkkh0RqQyuwfVEe=sCD z519W@G6wkCM;%~aSKlMx0({cP`#BcieV*+KZM@I-awerz%&F+#SY%UGe>=2Q!VC}s zMFMrn)`_4pJ>o63IS~8rQguM8wys+}YroNY@UL&by7%1To!9%NiO^qIm|vKiS*+dM zKA5C^c?;Ndw*rixDI_wPOaUSwQNS4BlKEsJQ-k90)|(ezvjljB0`9JI<-2=(5&B(K z?Lb)=0z$*_sP8!O*l&!V4gHR8(a4fmTVS@s>?*JT?VUc^m|vbx-uv)GlBK#VhH9>8 zXgomg@kN7I>UxP6l^(c&hT?$JAbq~&vVL`j?yV$X1 zzaROa65GD7Xdo8@i??j1Gg+k&MFDj|B$c8!wY$d)Dy!1L%i$)rrv zOmEQr@SDHgTg@(9ej)SE6Mu3{G7DO-mRQGn5Ad&+A@4bk1DrEAZvxpv&4>KwQmJJA zYCc)Wr_%6+qLg~4z%9MM5D2DkyA!H(e>JBKQ3Hhr6oj{E)NQ2?xbHg-pC zQ71a?aTf=w-l2q7ZAwm^@4k7!zyU&vEBk9}``7`V%hl_KVPU&31VPC#O1RF)dq2{> zZdGxxq03hddElr<$pJZc=m6K-ljFel1bX<{p}+_>rI7G#Dj5drbkv@y*>-r%)ooul z<@a=fwn_JvC99(D>icq+S{77Cg)$6`w9Mkm>lrV;d6>w z{@`5e;qXn!n*^G?LN)`a7ZQo>?RBn@O0DPfTs~jO0{ZDJl!esqE?)TAFJ5~9Oeo;z zKmn6I0_DjYfx-${*DMGBrONp>!4EFY%mBm9EiL^Uq;?w&n7|}64s2ae25Q~99*poc zV0SnM0T8+P1nk{@|1ffn@$LBFaHj;yd_nSqnfO`{k7PV}fnQ|NIzd(q{UukI$*|#Vaq^e9L6QqTr z8^%fT%Eyn6eqiw?A837?{kDL!pRR7FDw}tK^Wodvgo2MHKFJlbg-q=#2Rx8UY-9Ro zGWn~u^wjL7MUaOnlm(ywUbhE$5dhCAU=RBO;0Kq?PJ;;Gc5jq7(rJ*iA6&w=5L|?` zy!R=nqC-6G?fP2l?CdZnNrUb<_T3mIKz!UC4o9P)9goK`b4P52(#b4GmaJEC|5#;w6N?mVhq> zags`;xXN$e{3S}jH(opbFDc+Rx9{#&HYY})wg~@TFale<`5G>lo}QkXOcI{Iya(w| zG?4^;M5P7|T;aN+w8pVJ4!Xy{%;*A#$CMbJXXJqSo6WOvr#~>w!{!LPvY(x~$B`&1 zvP?CxUsY9E?`VvklD*}7Up)Nyv-#!nU-sAjxwP@e{ZcQKc6N+T>jz74ix;!r01!{S`A45#@2-MSJC3_0-nhX zR{)N$!JptupyZpdK(_YI;@k{Q;;f}oh zXJP@!13K!0EHrkUp?}?fb~f^fEHv7I3PsRvhFDj36tD(B1OgDg+#FIw95bECBEt(_2m?9*VXET%A2nxqeaAF3Frcn# zNRkVGkw9gLBHJazcHL?<3}r^-Mv*|;x4u60uKoRsCr|%VnfgEFV*uc(9*%TbSxILz z+rI|v@mz1KTt3+4lBxeOcRjC-<5#@U($dmP*`9{>*lp>3;>3x6#U7zJk|ocA5=&97 zjAUaulNiadE3H;Li5-nGE^!^h9D;HvI=NuO&J-;a)1GDydziqKVbg^S^}^1f%%Q#P zAq%DNeVulu&_5s!u@##n*zbMb`+VN_ecv};0efe1SlZ8KvsmK;J4Y)J`g5SAVhE!Y z)_pPTmlIih9xe;M4-)XZ^8j!Y9N@n~;OSEw83H^ICx@+(gGK#REE$`x3a>0LlGY$0 z0A?);MN4#TS)u!Ndb=N9OgM@{z+-Ek*PD%I7lScq0&oDJ0i$r*JU^dY&7A&p3Xz}} z07O+~!Z2#l7I(oFF8{gujkdl0hod`h-sDzqAAR{nURLTfr*MMAQ1#On_g_8#>eHii@6Onuh?KAe_a)VH*hu zUMK{7zg#}vi2(XA-Au!NLO>L>mXd z8;=K5cRCv30Eyn^SjQ>Po{IxP zx`S~uoOQ4oe02eU$5{`Y0FhXo&TPgWw@iEB&PL!YQ_ru9<>$H8 z<;;^;0{6v>?S|Q^vXqHqy0|Ky=^_~oKz|iSLy5YxCpM`@-*v4HK%X%rRdX!H?by4f zXje_QgS!|YH<+H~c%qJ7J66XFzypd(A4r5|H2V4K;MMP5KYm(EuKuU0clWxqvx)j1 za(6OySSIy+1pbDfh!ZrYDwPU`{7MBi9scC?IOSes`Bn2-0SyTFLXh6DXKZK z7>W*5gSUs5&z}F~kHV$Nf$pcOLZ7emyusnI9yDF83+E=dfkbnH;r1N5*>$ndFKUk7 z?SSm>IMzqJWr=|Isd2j9fA;0q-yGE<*HrI1 z<}Z_y?&9qj(tOPK*SN2>+l6#0g{FpFki{jv#GL36>w_y)k_h|~#QZWUz%*9=2m-(lzH?LT|272tyTC^C%9sJaF`kJfpW8NN6b1S!vQLVidq4XpgLT)m#hnUOTD$%0|xS${><>l;mo z`HgzFX=*bDB089|zC}4m1#>Y7DzuHF4fB&a*26$r};GGcgW#ZuC9|HexaRQD5%u}uEP-*}T zFwVI;DGn?50Ppg|gvfG5%%TW3(yGa6%I-yW6-$UlJRuzmLfO{q(U#ov4R{HrHt zh1i|9TyMU7zr09bpDbm|*a?H?2i*H$HAHumB=qBxInRs7GXQ6}-+@~R@&qJ=Tn=A? zu#jzM%Ou>-zY~dh(T8{eNXB&8#|(fB@FpdIcZI;u&d$-t8zkX%|{ zkAMR#;BFxh0*}n5($l5Wq8;k2+-T(YdNa?PhTZYG-0ix!9xz58i2hJ*olnNytC=^N zcDol7aF5=!*XcXGzzZR*omEpDOxLv;7~GxU1a}AocP9jQ%i!+rt_co7g1fu>5FpqM zgWKTl5?lt}JO|%D`1)j@c2`&J-PN_$x(rl({^>=icUd^^$?!YtLY5CPiByj&+^E-? zMgB&XV#Uo$ zzY!bc^loEcO(eU;xSQ1S>P6p)W2hg)Hbk^Yq??hR@s0IAwPI$&P0Zd{*VWObTor8O za7-kGf=A6Q$H<40I+)>pCOR+Lp+agy-ym=&iLF5y$C^z?l6-J4$R_TF^XzL6 zJSX43suD!yy&XY!t>Q*I@#asQ(bJqsrC^UP<4oNM>dQeYS=oJa;Nz1& zKRe(R@*SKA(TJoKk*79Tjiqz9-KshNV(S?C6+_>!`vRTIQoGHw-d4#R6IswnTBScJ zw2LZk;4S3dC4v#j%pv2DRye=w#UNOQ>a}>A(*;@}RvBo!@UZ zZ5&XBN096l#shANwLixb$wX8YXwipXhxPr5p(qd4mYlv8!Pk=%mk=!o<&EG}C%l^o z=J6Kox82hfDW~*bO??l6VV^DIX9ETkxU4c=KW@XxQCgb->Bus&{?x|_pGuvtN&FYleJ*eF^l#>TkJd16*&hkPx&ZUE%Ow z4@dkjU;6GR>bV;T^}EYn9;6cqNq|px+cfaOu5Inm8hbjZB81osapw}{i*TbKNm?Rb z5EE4_SD(CRMwWOP!cnl#D`663RRWA9BTk4_0*~4f9yMv&I({SiFJ+4K6a3>CrVYY- zFyYmXfVc%e;_=Hmid+oBN$99fk_y}gp@q`LMUQW(^;{T7puxN)ZC$qdE|~Tq-)rn~ zp#d*X3PcAa@pjdo_;_OtX^`>RHc?kgzuFq-p@Oz8ebJC~0TXeXtq?*#1V=Q=Fu}3qU>ei@H=|TE(yr-g-{z7{Q z2@br;27wHFyzk$p%EWitdV1tc_cHXbGmiT7%SVT$dNl<^n1pbAXbzM_zqknWU_R@s z1wAnJ#Y$nsZRLlHl!>BH#xS_B@G?AtKZJ7S=3Q|O+XvJy(K3VWl|0}zs5T`YZS-FL zpB4cAk(2Oh=7&_A#g?lmxv6l;VD#i5^*4MY<8P*#0PhQYAk#~cCx_);#|(3sB4QGA z{#4IO=ck!#KiUl~!ThA8!88R&vr0NxS@U&F!q`GU+`tU?@y(3&{qJ$nlw!fs%+tf2 zF1j(Z7LdErZxwyc!oQb`GL|OuC2oq;6$74yxgFjRUhQ%X9cY_Ii?A$fp61GAPSXn2 zaPZq*eP8g~j*I=xdT*R^e;|aRt&Qmt{b=``vN*CEY7qfheIWN1?FbF6)$0I*MN<+T z*f-_SiSuPNaK43fhJ=8&!e_zsdNW}kpOMW$J<=<0O{40$j`EFt(y$F0hjz}k@k;vFfq5k5*MSzD?fhZR#@C3mZbo7rOFK}zg$NlLx{NkW?@j%AOT`ixK zxcm}o&65AwWoZfJ1|N{})YtFKmu=w{JFM78sMn_Xy1Yh7M-G$n#a=5O!hSp#6~dxP z@ku)bUf>Sp&9!9meT@`s@r4&@5%WR#$DEyJR#8Sn#xM){3O5!)ri1XB&$4y)@%IL< zfDETkc+Qqq;#3d zNy`}ama`B_b9W?Q=FT_=Yy@*+pX%&w{wcUm*=;xj_^->r{e@>H8s)8 zR9Ml{Z<|V02N2$EI%HqlL?=VuVnH(YYw20}E~xWJ;`mv4A}4X-Yq#@H%IfoJ-5xo`oXb14)s;c8PAV2psRI+_C_BRN zV-oy@W(0RreoVoSIpM&}a_kr|%O?uUpd*QdZZH2(0)gDaZQS2?B*apquGD@?g}|Nn zHh4HY1>eAvC@LMdMH>t*MFlJu+g@in9iXxD`LJfBvFJRb}lSZ!1zL2{N$paCu;?-7L^v&?ByT~d`1wb}9NC0IV}I{Pxec|R_{$8p_UCo$f> z7Wb&$5h%TybVf1vq%39C;-bD7>48lrg)wr9(Wx)%efncTJEg}LMsbGSy@80&wDwHo?Ch-o60&4T z7KzNN6v6uJ?{*yV^eg`!duhp)HXWWyS~Xu4h)=Q~)@#m__lrnky3?iio4n7d07?%L z`p^;Z)@4qjDa++ruq@ zN9B5$W~TFh4)b?csz380f-JkcnmEfLhJRvncrl92SJC0UdX5(z_49aOOFyepKCmrZ zDZr7KEK-+tkd*IcWMqUnO^V)ZH5wncP|#Oz++p2h)XlaiY*@)kdk^9tO-IPeLSj@U!giGNZ6l{2TRthC{4dgKq(_ z3+xy;V+kanXA|1l!}AEgE+9yN6i6$f!}SwoV?%ERE!DoxJoF6BslQ=Z-CJzMUykKJ zO^#+uo>XpC2gbuz=-lwaLVy{C{yK+kNES~vU)RkI-oB@DyTNYOq3LkNoY(wK`s=9c zD#dJQxH{`bA%0S^%a1>yiUdh)opqVa8N)$-d%OjN`LMrK?`0Q$Qqa+QuCZCD7sA-Z zFgtWmivP^1uynL(WHF9m_LonQLPEP9rTmH9S1XdSY{JuJ%`vIiKjV5I%2>6>3vqJh zB!0l-`Lx><#@sQZM`{e*<5*&s3i3v)eeu7my!5BFPQ579m5*L-lyBSi5AJ)|cnIo` z23g7EZBfQw=%T*+Mu|z?Rk5jg<{#**2=($?;-IX}(C88|GzUo10oA96Jt@Ktk9|H> zGJR4PmL7g3N~}^$rBp*Pk0lF2*+=WezsmN?wHI0rF=I;22nhfy1BbOL=J|0LkBF;e zwTt>=^%$2zx#>buNB96e4YV%r19e#g+<#O4ldks@YBpB=TldHYViyxvWusPCX1i@( z;skZARSA3>yhhr0@E2j){pI~JY;Yuc2%!~_B?EPvST$%{tHT;Ock2u;&G+t|t>>EQ zH>`ZFbqYFuW;`@hl6m3yc9u8=Qjvu7voyCoR$*Ndc(k9M31pZTG4mtl`WB#x$S>}(Do}&DXaFJKoD2&2fHHGGuc2m0| zq1Z3)QLJn5wsMG%fHy$<;2jB=AA_8BkNNFw&mzRR$}SlL$#Ms3tx9f=^eBD~Mt)%c zF$23o}5v<5kgxIoR@ z{T1Szx!4T%4bHz1AuFUDz7Wu{wTqK(&m*yKUXe{r)<)&uP=bsHaramei{5nQh0!Zd zGlTFOcZq%X)~H&P2|(4RPVp!&562f zF-XX$-v%Zpf2Jc^{%hDdJd3&^BXHa+Sq(;QQM6wakOc{I6;uD5@jc@Yx16 zi4p&eLP}?^59{Ee&2f%1`H6-FlUW_52bxH(%4h2KvJ`c$@YrUGg6AD5G|7yCd_`S~ zqRAV4y8%({`P*wwkMJyx9}4p%Jn@!}Q>m{X*;TB{Ul6#!L-zt6$wq<~pL9xhyrGsx z+v^jHI&wO(5XVZP1b()Rs*8?{$@|rGOYQo*8aHndy}zRMC!WyWlm&NYguOO{TBEVK zbi5~39UY>+CqMeTnQ~RC4Q!q3jeIt9_Tu*T@mwYcD>YjKjJ8Yl-G#;kM&wzCo{lX| zvs?ZpLZ=Ivv6#wVxQ$hcBJp3T6^F3Vf}H;TWlL=MM90)y3inQj=q}A&8G{WBGQ)rd zdOq_rtSEQz!Q>+%r_Iq6kP_gigWHcOvLQU#6()jg4LorsPhRWbU|n@~2;m0UQn3 z>;J@+%i~!^F~O(#4{hFa(4MGjm1hqwIL#JEY8sb!EQHCGC$2^qH4}=mm-lEFffKO6 zs+f))Epw@HT(tpJHPwgAT_j9z=Shr&a@!f)b7o~d-qzVw&ie@wt-_6?;E}o#NfbR> z?TEWOb_psj=6?X(4nD&N|A60~yz8AjpIq-vpe!SyR?(+) z_{X=UuQIdgt$*KT#G=w|3=TyQxmj?lZwSi+Q`g@$hnu#0%z2XzdYKmLDBVrO>r|c| zvTQ8mT(a%IyIk#U${)Y!59PObNEbp2hmSjAYje*3d%I`o^(t(~*|phS#$fo%!MhAE zK`(ALds{)I3NiOt`4{mH(r%(xwi5R-&00wNYab=;JXhQ82umK{?xfU zioBG#L~=UjKY1czYn>VA0pp5yJ51gs2gyS-)WMn&1@FNXgTo-dI5Ve6@ozEVGT{DmoU+`cC+Py@mDqb6h3 zW()Lo!=kEBgme!+Iag<+_}+i?8WH@kVR6v*ulSepIl85Jz54(l(cX0ix%UVEq zRZvklVXb&od`lft1ptM1Q!>Pc(>Y^Wx zJRQHBaub~wc=1@^8XL$s{N$3kA1R66fsgcfP5~qKf66+iKDa5tzO*i?2d=uj0saN` zLnNig!8ab!7Qjcjlw6;Otl%1!)WRtMSNEPUio8Ul4xDlj@qd@G$EBfqct-0<9e*+`=o}i@B^e$PM#{^XmDx^u z$}Dj{q*{g{DS~ul@GoWmL_wP@kOQ!6OPqj~ffRg_iV{1x!ExPi1L=$m(YGEH1cigJ zk0f9Md+``CDI$h!#qW=4SA=BCgV(D0Ss{=k{8vU$Am;14CHNhRb9Hfw?eGC*OJ(5b zmiK2E3y34y*Tp8;Spt;z;y>`Wg>Cpza)4q5rVf25@qSayE4dB-3l+6Go60E zNboQ9t@z&^J+k>DqiPM-nO02BH)@24S#jk-jodx+bLTd=7+Ctt)M)2&KOD%JfEdQ~ z=+^38EQLQfno!g7-1~gn@@lL&^>G}Ok}m>*_xo_Y9el+3S2Ydc7Z`eo=D(^dxX?}{XJ7SGiQ!)Z|%$=>X|1z zE%8gs{0OH|C;Sj4Qm6}@xRIRz9B!O$MUde(gK!T^8`DNJbWMTi=M*2oE07e)B75x! z9IczxQ0!6tU2Nzi+%9Z9pYGBAA10tt<1O1=@IB-_`3VGTtO>69FIbKE%I2(OH~zXI zp%N_`R;((hL{plu=pgAlRuli`dkw3t&0cEr;^TkPyZVRGUh8px8CaNvK8U@(O!mL( z?)RB{wM1Jg2Eqqk>|CRnrav&O4bHPg1OMq_&PY1R=ZUx&@c@iMU%MsC(Ef!mH{#l$ zBR(h|x_8Kj=y>LSQ~8o-E^78jDoW9ZOgXPMp_+QiDjTP#8oTdKK<4%QAJLz$JVKaN z!379ZbRR}f3%aBI@1|Bd-dB3gRXsyDKfJe6(L7qd?V7&}+9sXem_#@sKQsNtRf01r z$lpG^^5j#q-}Jh~MpGTJvH^i|mHeb%nY zNz74>#k%}lxnnQ8w0!f`OGxHmWBDK2ucI&Yf7ql zxr%4pbT{N9zG?1GJlB)6o=oI#VN2>SsP8}uahT^Hg*EUvvW(wxARc7 zB1QuKCx5T6$AT(lV&}Ef$VebDL%B99CAf75&u2bfx7$J#VXt+oEuIP1mN~*Rdq-g% z+K*^lzik^9XJ|fDpRy#DI9uq)Q`ns7&Iy+36*uuO3A7KehnZWwSu<~WmV_`t3;5Vr zXHXbqWjo_E;PBvrF2>jq?^aiL9wG02?+cefp8oHq?W$av{->H*8Sk4643>518kBJZ zI(MiCw(g33mZ9p0wJvdMOOV^{;^f%S)CQLQSO!`UTCBY}1!LI^&@D-4@S7INDO)lmRt%#LU2y3)v&)ZXu&rMr>ko-Id6G1E zt8d}g<*rYs3ql8fng7a+kth(0waymqq@&vTv6DH^@ghIYw*V+Op|%}@LowQFMh3+> z39G5kLYh8i-wQ#Z9q(g>9l^&EQ|)cyi+{wwBFo`Y;iGjbSntzli<{n#QwG+j@1C=;BKs>V&Ixg#YDx)nDLLPWitdHHC8F%AR@dS@) zX#TUMx_g)1NV81-nosol$=dpYI$MW?WfvuIr=2cfST zC(M#$0I3xX``S~h8E+%5-~%R`4OblQE8(>E4{g&`Ru~711-69oo=9}>D=vOuYJ<2x zY>Z?1BMhpm%$<57{_AJm;CCk|mHRH$0sQwE#vy3}xjd}>_#x4#s}@`I`N&z&H&JH_ z2~NxZ>Ns*hdftmm^&rmdqF)}Ij9(e%l~M%h!|i^p5v16m4G&@)fdkOmu0l<;4`r#h zESUff;{wgC(t^T+rLd0NMvci?k1PV4{b^=+gV8yK01 z7VvG1q0etRJE#f_SF>Y|u#;O^td3$j1RrR0Za23tS+4W4;U)Lu`t_G2eGjK$#qA^Z zA>Rd~m+UW|v|juD6dktGfXqIQp2ibbw@kCjP-W*Jzwt77wC;X5T<1u<4@(Ivak`nH z4SlQ3NNj>(s}`LfYJee|0k^G}iSh~^QSHgm=0b47?PFfK#9B6)3zlN>J#ilW%jJB* zfxVmZd#mbLg0Ok}j+9gayA^zXDF);UHTPjj<+eQ++wL|cZ7v-xE@_znBj)Kl!oz{!K4W zn+8HZ+S;K46ygf%zPnNIktjdvG7nrAhW^bHgSSj^V;>KBNG&gh1`~p z@GPIyh3xQNGa#PTCY}Z_fJ@RQ^VJp;InxH3;NI1iizLan!j5Ev2D`%xuJBOsHTM@G z$I|>m2eH@o;~VtgC-jw0G`}5PTKF)csFC8`$OWRCqDRFU&T9MsLKmO|&g`D9k|vv7 z=(8uv-u}KPuu(kO{fG;63DL`w+JNh5Y}f>srLrRoNQM!Fe=_%joWN!z-cg|aZbi!C z;7mRPlDtT=#L|BH}R%D zA?2UlW5(`}I$3l~JQj6j-WLr%yC%Kw1L%$~(#%_D$MGgx<+SV_?VgkC)qMFXH@_cp z(Gwa${W z+R%(^@X3C0OfPZKMzA-U&+hFvL#!MwN5j1C^E*Gm;j1}2gY?oldBOr?BV|j0YE#I* zS5l2FQ$E_K;Nw}(x=h3)dZUZ2LTm*O9ZXCiQdfTvt>Q|>%-WsZ`A4Q}o zOy%Yjo90>s2k;t+(U;b1G;i{wKrSSNrU>EaUVibkVS^LPv{y4)aedI_(w{T)8oMlH z36isJ&p2uF6MLgw8QW=#dx|M)M`D^YSyR6oL0JRtNYu(`L$-jjosFKhwSJ!jx7!Wh zR`_$>q-Io`@^WZz4=8Dq(W8cGq(<#p`h`4^5Z;|9ze>6I#zChV_eg>^vDK{s0r@N5 zIf7f42;vv+;`qa1vd#Bk*LO1pSTSknd#m?dkE4+iL7Id3aua)I0>Ij`QvDST5wOOj zx{A_mkgRMYAxruUZ|B<>g2q>)A+lwLkj~cD_lEn7`vl5zw_=VZu#~-ANwAo*#h8di zhpaz|xE~ykqq_p8mjwh?{{>DwbEiQ>e3#eJ8JXT0N6!h66VralpeYwY))7lKY#NHzyiP_C$tXsoQ>ox6Nf(imC-y&&Bw#eyYkikX zUdr5X2)>4=tU!OfDY;ym&ZVR{_u@IE74iNvWar`&XGMBnPs6}ac)#>;DSk#l-jg8% z64M%65Viot-rco)k&`8i+j6f_lY0vZ*RLl~v5LRCNa5Jp{o|70&rj!i&ouJuRGw3E zL)V5-1I*)Xl88}oAS4kAn(%)2GH2N0{OHW4?tU2T1=!5pHu_Fx6)oQnlX_CCFja`B zphFip2*WVH-M-k^h{i@n>3mFnID4Z$s=f~^u@u~Cd-yrRf%Q{Iq4WFb0V@UGr(mt^ z)-=+%`Arw?#O`O&r}usFrDqNctQvKYxgK0}MBYU~ocZ08I9ujc_PO&Ve2@=1_x_PO zO1gOXaU=Q{4l&puK!&J$9ptKekO9j_wv;^eDW6@5th!RS8j&5{?@)2b6iTT5WmMiY z`d(UN&UA=8xx!@@;j}#l0-hvb)BF2Rsb3*iVP;VtAq1BskvapEUdk>v0^S&320Q>% zg}pm!|1Jdst6{cLzA&a3wjP+b{0uqXhAZ;TX_vCq_N6Q^zW*yHtf<>Wf_oBGjX6xn zy~o``tjXuQ*R3+NkYQ=!RI!)XV{`P9NxPKiCZe~Qgc7>%oD`APLn9VkR=D}g_AKjv zN6Q;P>=8r|4T#B>?+Dy=Me(M3=_UbEDum`+N-BD1u~eD~<3o*JTY7(yeqpI|bGYUi zZ~n$4!s)DnnAwZ>$ZewqBXWI8K!2x{1nnq(ZwNIgVgt|p)KY!xv$OW^>vUHxa&GJI zMF-QMeu=)XOgp-T|AO|*Dq0Ffv7$;%!+@tG;Ga#jvWz|}$DXu_1S-voX@5sCd4;|{ zID#aG7kDWgx#uLv{CH=P(oGqeF4PrvF0hnbfz2ZRScLfZRj4yacz0E1(;=9Z7;N|{ zX_W$V04(tvae>Ws4rhCOPLV<@dsvfSlCkx5>!yqmETyblV|>OWj*puAT4+zOa%K9m z%v_o?m@dZPZM%vt(zS>JC$ZlcV$w|DYr`OS{RF+aeq-_9Wzk%62!>W(o$6W#Z>hCK z03bRbhOuBlrkRn*ptgWkF^wDz-(9G=7+8jr^30Usa?gA_3a15RCp|3o-6K7_gI*cR?z2H?3k{a_+z|YuM2r^R1aGG`BA||G{u7#4jEwE9q}kl<4IRE0_Ay<*)NERc)~gopF-iNREP9%WD`3JOA$1 zFj5I1_gJ{<5X$JPVW#6z{mB?3JIz3O&Tw>=-N^6)49<)x^m$wZG$ukRh;A~eyOc^s z)JtecNKi|7r;h-EhVbF(2%h1TR?-wUTnoMyoY7cg)+t|0`P;;L zv&`GxXF0aEf7}a4guDr0MH4-K-&>8~DkPx+aBvqVLY2r;C_Avg z^VSS1nx1)^Dqj{So9Fr;0!LT#25h%Ys8KM7*U>?RihUYL40$R*YjJw5v$LJ&bMO8W z$o%7#+3uOQK`@Hzx3O2ZZ;Dzc#4(Q@3CZe4xu*}SuZL3%z%+N8IwAmhFTqNfR_qaC zm5Ojz49+#SX($9VI^ExsWu6by%|a1*e#3;=(e5VVe$F1>r_I~_WOlOe{q?pn9LZ;iafrDr6q=Lo;<#L_hbf zyybfU=un(*o(a7icKD+Y0X6E8SEOj_(Ducguk=`tgG zM0>0nrZF!{(ZfcZ688KqIbwusWf9*>eVoI4y0_pv7(Bc_kz$IvOT;-1T~OqVq=Hz9 z;K%@u zMix4|Dn=F1Qhu{S=vSDKPJ4`Bot2wgwx3k8|MstwjCK!lnAi(rjc5QzX)8Kgw+qMP zOO>aAg-{J2$S$f{+6Anuv`%i~q9!#wd2E4Ej&=HA}ay%BoZ zhcBQLuLLT5qK@GyCsZ8fADv{wxgBKw=e~J}g4Q-z(|1d=FJ$rgc_PEm@%kP- zp*q1zYI_Rx2UIuQ`Pl~s!ou2lmX;0C6xa9B;e7!1*w;WE!@1SBkC1ldwNf7dWJzZa zRV1Z8(9^T+PqwL}e$TrO2%KsS$*-%e5$TB_G(TgXL7!&4()#=I^RvYh-4Q3#-!srD zSr9ySo(S#_@$&V2{p5BJ)ez?`@OG45hr3DEQ0jZ%wBn0V{ z?rxa5{J!sxyY3(Nti9IRan^aye%F4UXYcdA(b}5Iq(lrv0059aQBl+Z0Pt-U48ZVi zZ|#NbJ-3ZxZFN1R|9T0CDXHm*NGU-0M7ITeTL_5ADX9Lp`M*8?w@yGz$H*ciA||h> zprfZHEP_-}l-JPKl97`%Fw)V`dJ-J$Z)9SusH`Y0^RS}>!_0E`v5I1RT)2#^q{@@W zhR=-jpBXhY)M@Kz@(XaMro^NqN7K>MJdnJvuBpbvOrP);Ehx-W{k=+DLfF>9(ZtL+ zB{_4L&snOT{s$q}(}Z_`twKfHgN zn)>cTdTdHk1R0!+l#GO&f}DhmgqVbg;tqv{wYjOK*)y|e#ug?fmL@{Nf~FQGcc>`M ztj%ucLP0^!C&)`kOlW9gXlQ1XmK<$l{><3?nYpF8zNx{7wAkdta1pWlR5Vo2Obsn< zEU`FTYHG9ql0PXSH0^dYDM~<)KP@T3*vvToE&Aj8x1T=5Lt#*JD-*E?Vmy4@2G0zl zBLhUmMH1tKb&d7t@6t;>lnM*+d7m0hLq{VgkGh@F14(fSDG4@5`(6*@ax zWaMQ0{az?NR?5nFmz|aB_r}-G$)>O%im!glEpYR3a(ZT*+o{lwj-|<*O zc26#5=BA_G#smZfx_f(uM@Q})?yYXFC%;dx{9dJ_^F&@joLM^VOZity;Yd+2-l>1< z^IK;vzZba`lLx0aKa~AeG|zSl_(Ci6#`u|b#HY66`blxkI1%knhHm+OarIwndksA* zIUb@@@><-(zcqA^=sSE+F-y>TYGh^SVq*P#V7lGscHOIb>uBl%P*O_qdwNJ(Ugjsy z9?57j*t!P^hHbyfdSu2~n0&O^SBIMF`T6K!=#8$BOu zz8rij&TbmaP0zAmlHdS;FGjxQxG(D_hJzV0Tnw{73U=!2pD;HveZn`Pn)H`KPLN#SfA^x9dN95gNOGwAN>2 z@fgU6k0yTEUsyLx#X1SOYi1PkA^_FfmGG~LClEsWVTOe@(d9_a3nw}5!PtEv)HvMV zWA7Fxk{F?U%FN7{uJz)sCj}kKd=apJV^6tu(3q@KDx)nXT{iUb?sd>RW5XsvHrqrixSD*_&bu%!&KJC;d)Fx zkd^K8>xQwHN|q?!M_XNONZDG61JBnND-Xy-S(W2fkD1Sc+~K}?k-w~r{9e`H)MIys ziIo(iV2$4s<<`GgZu-r2Rn^g%TU_h!1!$-w1{*_rI^2k7Dbms2M~@$*wp*{Xt~};@ z5`s$RR3uS>>Of}#Cuc>sDHF}J(&=L#iD38o&uhPPS~%OX-y4!;eemU1IZp<;(>G9DF*Jy?1X4NKD8l+;Tg* zd;7pWH{anhn4DB+=ZTqP^ti z_^gN$AQS+KA3Tq}wf*+N_Z?d!l0ktMvkizM5XDdU#)%ww66W{|P)W)`-`)G!aBC!a z?wpqI?2DWfQxfJannWRolP&+RETVw@C>~w;-5ncM8d75A7HIttD`)Z*t<8g;d}aw! zWmSFRNdu4`QpmHhQa+f9Jgw(_PiB8&!b8J1_`Kzzg&0zV2p*{;9Qib4}S zdH$h{@ufZzANw_MXJcN$oTHK!XjS0`I7)l8DG-#otVk8(%X6A^bl_Uti`oZrB6sYs zO(crKtPNav5-HiI7^BveO7vb!pGfNzM{BD>0+QJ;N6FIB&8r_~wM_Zrg#-h3zpJcx zsw(xXRvOD-@uH&`WrEH({i`o-{^pfjsHn7aDc-D(6fH~y8bU7L*I&?+#~!@#KYC;t zbfdEJK6vdtH3GpJ@;>|ZVbiOh+T5cbi3?~c`c=_$5g0{;hf+?^j%d6K?{#RvBFv)*(G<%-e1Brha@!U))*41vY zGPxT#cVoo*(&up3b~IU6m3tbZLX@k1;s2*GanK>I+OV)9Ltp};K5I)wgyO+(E$W~S zZrL`|aJ#EdMP0ebf}l~^rr;Cjw+x3PSSh;RfpX7WM1EYdg$fK#5WS_o`|umxv<;$U ziyQBPhQhWOqYB=EPD} zj0yRCAAH}?Qo*Ei)d-AQ)Ny;)Bi)7-HE0=T4c`_DZ%__Bh}ET{YNuPBgK2l2u12dkNQ9x`1T-tOX;vdY3LShD9*y)XOHd1sU$O|vWjLVSg;x%|INLdiXbOfnda&5uAer@ zi53`ud>%aXn2vc-i!N$P;8)cLXC%A$t+~pTJeuN0n7)rxqvHLAFTvbP8U3N z=tAue-yB3$5s894TeaCX-Q31hcZBMMQexLUCm5eGkr>R8N#|}5l+9P9(bCE_&0qQF z?W}Y|D!U_PXhN1jquDG5us{$RhNM!J^TovHoaEel`++5GXBomYuOzUA#V zh#mh4dTN5Z>+f2zxiak+!7Ocg?W&y-k6Vt{>FK^}^RE)fTJxPj_O>KaMh z9RLU>z|xLM2MGu35*G$hZ0?OGkH~b$S)4Tf=%RE6J^{mmxmSZ-bk32x6*g$VH}6t6 zqM1xJ^jLclYd?6hZNL$-VVP!PQ{VdauO0$YcxS0~k8RY#%}pr#tdW;_6i~=M&5GNv zo!vcc)Jeg@8p^M?LGkw$<+&f}Py!Kp5iw2#`~r%ellBg%?&-~KuHGB|3R}NYh}ET)S{{MEs3NyZCdS47$Lw+cOT~ZUV!kr(5o}S91uc9RFvRMHq)y%61R`?C~q-Ec}y2JYG9ns66 zOe*enni-}t_E3R$PT+KGtWrL%cWf+o+Hth&V()ba<-dx>dN@w_%^58tj$2KhfC$W5 zOTuasB`1Z}(}}Q72_pzxu)~%mnOmR_cTM7c9%icG76XDGsdnn zphn7txCT_SG4Ee-;frCV>=+gqK$y0XAdy_b@XfL`b1zE))nj#Pb)I%vQqV)4LV=85 zR*y46?!n7qHHj^6%!L$gZr1ni-O%F*crX)7A96Ow-eVKbqaHj%(;(wz6a?`txzU{# z^ydmn_z2SL+~R`kn#Y7n2s|Q7t2)LfoLiytf^hH%VB7-7{mPz`o0PLXb2#>^V@E%b zC-lJ$bSM2w&<-gPvcy}st{cgwR+U7A7=V1~|4{Y)Yk&~)+x34vAzLKWPwI7v;aiIK zzI~Z4i2tVg$^!R#cNok1Zw~Psq43q)2+Vola7JEzcxRvk*G(KbJbCG_5&d2~7{V+2 z*-eq+)i0v(IBh-EaC79y#!vIV106M#+zynf{EWfA2uK$1`VI0%@j8-?yO!Gd zt@G*_5g_kuT*&7-IYk^bxYrGKl=eb6C8cjT-xt}n(d$eFWGHKnrY zMeaUuV>xDGJ)xUW%taowc0ddG+jFS&2#6Kl>Qu&ebu{?o*Q(ZDHXO6PA>{Dzp>ns@>D4D_?O;6an9HPzf*_$Wx2oItOXn7%(e>2fc@KxeCVm*W;$u>@PV*iJsf7~gXKpu_oBwc;fp z_O=cJ?_A;rXKY#YLcCjm%@zv>V(MyXdwqTVx+^(UE24bMfP-urk!M~+vLD&!8PJ||r0 zDPEf_7oH`mX+WmR^qXl{TF(pd3Cenjp_?Gr162xa&_VLm^gT-n#ck)Gc*tvhP~7mT zy86cI-u|*YgJbP{_is!8rQY95M@LKZA7%GKAIqoXz?%A;+RXg0 z!@OSz1EQHY<1;OjDs8LEyx9?<1RU?)cd+7tcou_Kg7@(Q@Yhn}4)K5M&L8|K{~=0# zHrlk7<=)z*BhtIXG;+7*lP)9%0i{;L_7&zm6yKN)gKa~Q0I>U z)1dZhmj1V78Gatec=fMENg>C?!C0iq*O%XeZGuFZ!29`_NASkJ*YjO6nFQYzdrV@Q z(;1-oI0R0|9oN28=w>s|C&A2D2X!0+A(MfBL0lrssNEU6R=(-;QeBr3d9&itM;kR%@KKGG{ z+1KOzBzycU82ysXQdK!PZ|d5V9OQy)yKD3d7fXfm}F(y?L20+->ozNMg`;jX^C0Tw-DKn}{8#e@+YUByWrNBHq}9yi z%!2G8Xxu}0O587phrI`}ODwNHK}cdnO*`f+K!q3noE)I9FmEOMYjAynm>giSuZ4fq4budQ9_%S zELI5k9|&AM9I_BfO6UHN)`b9|fURI4QMombA)_LHR}`p~A9HdxdRiAWrNq3Kl9o_o?F7hW42wn~7!Kxn2X(R9FwNm6GwCO;^t!7o;jO3HUvOvA#hNWu zz~7IA#NnO>w_XGI$wGulF#2k+C65Am*;>z_d84^O0WjgM9z{mRz1!Uk!Os@iNG9F% z!q}n{z0Y?y=@Gt@1rvCWvS>NAt)8Cfr@68X5r+@$sr_oLIX)m)BjX7c&HpwaPaDCx zY$es9W@Yp}gKzDDPg*w{8~n2{1OOS%d+(U}wBS}riWi2?yLb1#643+M5QS0?-}i$x zrw^>D-psvvf~S!l2Z97zRFc^4to>Bk_V_u!^4Z2~ILQ`mjPvL{ZzWpvOEyA=kvpoa zs1yJ|?(!6E4J85@3U}4XTU?@omDbXQq& zVxydDy2n%jcgrPr#506akT@1j8dgzb`33j^rq0>Mld!B#CL+=xI*;FXd%{AC2}#ts zf4`1WuhRTuf5Cm8K|G+39h~{wTU3ytJdEBZ_>;LR&vM@Qe)1?yUq#nwvf z#*l&aUV7%HDeVekGbqhp5BwcBc?tSuGd(}1m(X-i_XFI&1gt`seZ_yWU`42aQJc2D zhiT=~eFtOb7<2EY912$}cmivmz?PJ)u~KEY?kzXn(un#)CCr~&ZR!k|IOkI9o_(>C zN2C=w!m0M5eO4S^`P1HODAq6YdEyhvsD_60>o<$qu+g6h?&dEg?lP*FU06{A?g8&p z_Qkx=;s3N5Fk$!Ic}V7>T!Tiz;J#;db9e+O2++K#cnsL=^uTVTBPg-sGIj`!e=doluX+oJny9 zhoN9N;!gbTf22<+RN$y}YA_(2s|-PMrS!GwnDefPtu-}ew)cAt*R7X?N1z`vO92#^ zy|w@>w%4QfS;aAVq?RTdL7Dff2Y2PR-MD+2Zz$mofo69MHD|`Q2bFdb43p$c)j$NW z!G<3xIruu?$Wn|iTYr#~NX+Y`@{M9Vwdvt1D~+3)5AWO@o4$XA zFV?#CqJAenviat)X*_M_v%mYd+00U5VBskk*!*pWSokx8eN3^tR@lw=1z=HGKfx{8 zyJ4$o$yKhy66^>GwI?m{X=? zlguuU=N(ex-on`Qi@@`>aJ8Kaw;!=w(9S&KBkFwMbxQ;yQLWbJDarMZ=Ji9Z(Br|t zcO>@->cY?i;A_X~gQbUsaL!L{5v*ouU=q9+jQM~G6CG+bk`UBw@>s`Rg99o?Z7Z|R z;qIBp6?Mn_RYmnbC0#bwDIT!6;LVBJoffS3x8uRhaKQ|VHm`3XXO~7--QsY}g#|Ot z_wJSXVCZ}43*|54M@=Oz-(emgQnVPl9Vx^E#-j;nyCHHTSVFJhLC*m^#-ucgY6&(p zPAq*PJE@Pei!y`CWNuPjQ4yh@$L-6+fOjT_y?p6o`}%5TP>pNk`q6NufpZd2>>wWG zB2@I0jCV*zdg9894$BlNZJ`^)8)&5O`?sy4!nA|}VOc23uSN$-v|=v^fB8($RGtd+ zDV2(*KkBPS?dnr#JjVj=+DKL|$?3D?D7UgMTka$e*nHyVXbHg)b!rD#F)w5g)oH@X0d{jHU~<}U{E zwZZ5e`v?di4L7J5@B5WG(AP7A4TBXw0+z!c!zpm{o=^MaAl|B?m1u|+_+$0M0ld)f(C`1~M5l!-)VP{}&lK6_4#u$Y>pC7leq6%jk@NaNAy5NkH zL?N0#sS2M=Qyyfxpsa+EN+b}tN9YR3f|~$84WH4dvNbNxo;ST6gJeZJ4Oc&_7?S1x zAE!Eb?SD`f3i9#e@@Z^}vbJu8NIJ2`@~M%qC;A^^1;O|D zDMGvsnd!_%Zu@6LS~K3#Ht}RZE4}Y_lVtR2is27z;`c%=Mhhz|dC6+{p=?}?8ZE9j zxc%}w`}cLvnTH#9pedk#g7;*Knka^OC@imZPYO!Ik2k!f0esFkg|BTAQ!$qJ>F=Fs z^|6~%)36c;Q;>Ag2>n=H^D<9vk;{bMp`+&uh3VaD#PVpH0wz=I4FTk>ItvT#=&bkB z^ou5sWs)h}8xbBl^J|?<@Ebk!xR zq;o~n;FIcyY~ZO=I&BkB*vO7K3vZD7X;2e0WkDca0kf){Bdiaiu)s&vU|4>#HeOw*gqf1Qb;>}QXs+F)uG4zn<2;Yi>q9zc%$pzq zdI0nu=Rci~C%;jEK;IW4L;#opmW!J)E1A1t}S)(L8=~{YHUPWFG)@|O>pw5rlPpk29HD8 zwRe}2_nS8;C`A*M!i7AXKnT)^C#0rY0PuPCi+lqA!dX#lFQc72qu?Z?7%?APCBHu} zNx-!X1$>*OHmLqV`Wgx|Aby3{9EQK4d6o}>)MdA>XokGW**==hr*b?BRKDLM!ca#B z25GlWFef-y_af)>mJ0T%n0D)yVYc8pJ1PzA0?n*-`94f(le<(3zjmrCJ&CLy6bu7NQL5uY2uT4E&jz-wn4;reQmU zQG?&WJ^Z+*5b>B43pGR7Ju?Act>@%<>@eotNjcfv4YEBpDuvhDPsOxws{-w4A z`I%~VaCM*AC^yV!BPduWxT7)M7$&d~z#DAL9nK-Y5U&PzbbZV2M0Jx%6j;o!51}<( zddgNznf|jSmAG_7Dc!!}Mu;#NW}5F22>a7YySAl{FAvEfT;SDht2ZxrUaA?b9Q=Fo zvLa;ofD96>aSD;UFT>HhpYnN${w%IY0ui=f(=8toI;usaF;C3!j191En>8l2LQt#y zGnH(JrrTIx?<3zpI0v{JDfk5c z!M2l585yepqn1>vetOTJw@HZ_(60#OoUH7NARpY4AAJq0dZ5eFXEykPUXe%nYnq=b z*Y(q(3PO~qM!6U)I=s{sH1zHq3WJSoJ&{OjogFduXH4l^AOmv5@a1PPbj(WPm~ado zt)6?+kIsMEVMq+o)5}sFpOpT<%Pu02nlKxB1A!0HBhdVja29mE;;idxk35M6K9NGI z2A0{iAPaD~MAj^G87`FM7z1T;#Cq5MYb)>BFq6~6y?;C0crDmI^e7l93=oLALB_P4uoeD{Rewn=}p)?Ln zBL!e31GXup16pF#K)3;#xxCGqMw?*5(D=53f8ZTnsiG@=_?xlJgih*xk>5QnZ^#Qlx<9~UD#?l z{b=FpbyzJ$vB4=-8$m&9L?GKC2_f&9KduMKJi*`3G)$zz8dza z(s9I7(WW{6KA!wjE_JLel&VcD~YiB*qQOxaq*0riZWEQl>_Jy)672IC)k|A}2h^L2uC*sbF$WGKvKK8QN20@E7stQ~7QHc#&w8My5NRuM7Bx2)#g@1) ztzXoZ^-Yox$ey5v7Psc+dDm4u6Pk|L6l4_VEGK^OVEs};78ikw5cgCQ)q9{WOW@!i z^I>CF$P#r?tyGaP2a|Wq2?4nbvid9&Gl4A5o)25VdYeme34)gEN z#ia7o+i3(s$e-s2^IT7H4%tX|Fca7CDZ9nP$aQ5%D@z{qu7o*T(>MqGL(yaU1_@z}0 zui!^f9=r;@ro!ZGm9@NN0=?X@oJYXP;@RD}c8hKc<~^)$f;W=r$JeJc9ek5a87X}Z zI}$KN!&ScZnT2WnCuz`aR2k_RbWMo=QX4^u*=l3Y|M8~+op(Xx@DQ-SykH1<7V6btk`kZxcD|GNK)%vgS5e?M_!p|%Bgi0J#>Hju|m zhbBTYG3J;Y^Xv7WQwLGCy$U%&`cIPd!*hh0eZu6kii-CVC;j@b5618$6X||_8fbrI zGQL+>EoFz01~X6GbGFS@S(0c5y?^4uf!1`m9#?&sr4^l>Z^89; z-*W7CoxhI^Dfz08$2j?;dBgYEkW{dE{8PsJ+tidhp~jRjl`5njJLI!xf#`-o?SJd^ zF$BqUz2M4@H_M+C+`^1yc$L&DF6~BY_#s*TL7&Cx@4`oE%4>Kes!1f9%u9_nq0MPg zyM1Tjg%UZbNpw{<&i~Uk(Z!4v~ z8<_p_fj+Hd16NFWZnnn}LV{<5m;)!bmf=7p0R(Ak_n9yXvr?i(f!W1RSYq*)k+_)L z2<|YS?p3E;ufqQFb5&+vM+Hr}4Z5u^x=c`h7T8bx8!fg=+!!pZavzFW?9TKiA#LA~ zwrgb+2{9`7AAPoS_ZIi*WZ$IDJKJv_Wa^0LFzVSbqE%=~S^)BMP36%V}k;^W`z}fvY3}1g4sCYZV3O&vfIr?v*PGE8rLT@bs)i{+5ON3 z7pdTq?%6#e{$7pF@TE=I(0=8f-wF0_K;Xm1=QXPnucO>*YYk5ngT|mL0cx}YT*s!J z3ZFgX@ogrXj5qnT%rZ(vytv zA!#}1BTMdcBGTNq(@2o4!>^WzmDwzSgnR#L0qkCGlAT!-G3d7DFjC!o;1JtcR#W%E zT%i0Bbnt@x7RWF)<{I}qCnLX%SYf=*Pdi-iRW85Y_{Y|Ai;Hhu@(Ype?Oia~`2jW; z+oNwC^r=&zo$n!(<;ISaaATM^hx6s}zC?tn?VQmL7n zGj4nJvP_7Kre&7o(PC3RtPPp6(AG@}i2Q7!R>OamAuAsG?Bc+ zP;Z$k-mPyV4k9$52O_#E(9*oaF)|pCk-fP1Vk0@PwfACQ&+Ab!YaADlvIG9>0`*#y zdHbgTJdBF;VU5C3!`*4eJop-$KV0l|YRtoUA)@23?Ab>ihIwxRItjF{R!vJu*ZoNa zeipG0#M-o~@j^eVwu|`K_G1JJWM}9QOf$+-zLUSbu(UeTi+74-in^4Q^VS*sp?CVW zB#jXeiRCbv!D@Y$=^LK!h$~&r4C_uglNl0|ulpawZ#U>K+{!E53Y$Zw-#od5o)Hs8 zb93fc^t%gNGP-XzZ1ox^;)A&flZYPoI(kyr-O>)VNesf>S3+e8s{FhCCU#c>&-DkT zTBq-j7v~5g09r}&>uSn*zjN+izxyjaLd`YjX#I41d;9cNpjeaHO#KVru|qRg&7#;& z{b@%h7-+r^)$HB2H9tTe=KLv=vG=D=o3dZ!xAaK_Df^wbImD0dJSQl9HEif28G>1S zN+u^xFB|Y?NT%1;xkjCrhEGpNV!leW3RavaFy!lD;6K5#{X9T>P=Cr3l;~I6Qum>@ z@F=ip{w!O@`R3+slHB;ow5#EjxDx~{y@`tMcp!(n7|E8ipf9-H<=}l9d>K^n_MbL~ z#@SjPrDxmmRBw*15p^WiZqGPqia)RJao*#W=Zyiw6`Y)bqR)?$qX~zM9d%0|S$z5W zLv-hps*uN2Zk$_)Qj(L$!XKDg`c^lzs_2jqlr?xJ;sJ9CB605700}0rH5vLRK z_1dg=@nVxjYiAi=fh}HHURVceCpu+U?uiR8t{xPwA6*qL9%wn!^5MuaPLbd-D{OQm zK$|`m$4->no&E9QzEx47wlM#lZU@73L4Lt-YSPaZjYt_%4(-9spcIbg@Db${yoL}-C`lvf=ZVX!0sNU*Y@-e~w>+iVjs`&vW(rl@T;vi@nz}Si^T+_2Gn;!tsEDR(VUTF@_ zV!asb!N!K|e23zCNQ?ZgMdo8s?UoG-<6}H-5`YR1M&zlqK5go;hfGyvn&W?=d6nu$ zkpk0Swm!~mOzlPx@;y;Nx+{d@3q^j3#^AnEk}kpUib?AS%9u>N?p>S)6YCThAl<>^ zYPOdAlc^M=<&xwIfgv@@ z4?e88HH)hf751d5mLD~KJP}D~W^rU%V2dPaCi96WX{vwg$nCWhqO*>7Zud}qySqc5ZsYk&_PQxKJaT|hnyeB2`XA8|{*)hh_TDBr7IFT&R zOP9pcLtOboHXJ-|LdxdDI$1Fm$$7beeJZY^Wubcc_h6%bl8#-$`sNiF-~d$ZdT;iW z*^Z8Q?1Ofwu%?u$uc#kC`CFY{OuD)6mrU?6u~j3}8l;L}X74Qe{IYI}Lx+%WME*J5 zpgmXx|0Z3?2M%V`#$z&WZT<8+0MQCZgy1F@3EoFVj*^lEO4Gm4iRo2(I(oHa?eg-~ zYq4D|&YN|L?kbT~xDv_}*V{UiUF&|Mdw05F{8jC3Y_L?hQ@*zNk#(!>V-@frK~?g& znx zsdn?Ezu+HP4cI)xC??Y84r{oA>BrsJv#YB@L!k(zW1_@quITq-ppEOIv?F(%JGRAQ zl9wt5I$o<=^o-Y6@S5P2hA1mp&!p6s%kP7VcM3!e9uz)VT+zl@BhTV9E^|J@^tyJh zi>w&EkyksIZilIXYfp7)G3(B9T9&AK3Sl&D1|AC7Z0G$*)|=&5xoQzE`yGa*1+UQ3 zuGs?w!r!UfbdW9NVe9Xf$6!%}Vp zW2;s1QrKK*y!vd8Xp9K`787(}ZTeW9#TE`m6kL-qs!F{Pm-zf-^`iTx!a{Chl4q3; ze5%8PSQs;~x}R_Ghw8rA1<=o{8|x|^`3I=T4Ynqj%Mm6F5%V=aI~gH2pwRw7B>J`; zYWwuA!pr^TXFhBIGhn4%N-e?F?W7q@@>a8>B+RDho2)kK4hBK~AXflYL8LKweYuqc zdkGY29%sS9??uBtTxq?#n&)9Oot>ZU#RKZ|NCQ$;XQ%q?x}6RYcO}0DB%IRrSu=C> zQPLsb9(<e9tl131ogPK)Sc1O zR509Kk(E^}=v>*$%TTA#<_I=<%HvX@opn%GBOpsghUsM`s2kZE6(9TlL)F}`xDSe} zQXP%7=(qh@Ekk2iMC@JZR!&=Eg+ND&^TQr{<#65EVIq6Vg%lYh>JMpRX0e{BD8vR4 z05X1{QDEh?;za{)q$o(vF=E9h&;i!7S73Qm;;a-Yfv3MtIrUBu#TDe5N1I3mui5wiR{CEd)B_5W4P5}@|9D$gHcwd9LLm1M)z?B-4Y;Dqf@RjoUy!kxeeF)=rVfl-dS3f>5ey^QW|M8(? z+lj+9KXRk8o$Xp5eT7l>=Tv8yH!l5N{#eIE_vpn|sXpX-oL8460x`6@2@{cWyq*ar zV9ib-Qj~Tp*tB$KR5F)(d8&-hul=pN5o^NFT>PRM!!oBfxI#QmeoHvajN5E$MePHw zW)1a9Yb+n+!uTxHKK5@HE2M+*m(SpbOa|WO;HSN+Zp9 zRsVO4yM(ngb*d+;xg`euO+Q~YV~6=XXK5t9nrnQ3V~UmNt`k1@An^n!W@@O!YDix7 z(9PdppJ!EM=hmt$^*`4$@`hGHseE+lTab%c-d4+?0{9U|Tb;{Lmn@3)gw)76z;t%8 zOIN-Jcu|DpylS&gZpOaWaLtP=8$Rur)raU|R6~Hjk&AfWbhCZFzbt$6=2ab66hCGy z@3)+NUbht^ht&JG)6@_^>NPC1Y+Z|`79XXEUxzbYTwRn7$HmQi>{hm&oSg9CtKxZJ zkMDW`zkjt{RuzPN1dqCHI>xRL`uD_H=ZuFqEZN(#+&J%zs%~w%V@Uv=X^}HM{Z=BQ zdfA!T-w=>tx7%Kj=-7xe{}Tm!Z(=rT82kQnTQ=7sR?sUcf7Nq+ZQS-NHvDt>b2q8^ zzl|^X@Tcpls(p;C0~NvKXR5onv(W3d8KO7!mAv9Pl`~ z>9ATe*SzQKBBt}|8tG)S^XPW=ZGEImlda{<4qRVCy9E=@NYHp}1c{tcifCi}yu7*Z zn*v`*s~3T?RUwTx**#_lZ#aK%7;)2OVe@G zJt(p`<2L0je(T@dtF86Xp5ni@NV@lAPRm{KEzZd*Fo4o2j|$;?*~|;ZR;j|k2@VZE z?|;;!)rUUv(zSxKMb>$&SSTR@~ZkvNkKMTtGM9IjgocXyCMVRZA6^8E7dUvst8DM2E@o8{Hyr{GGlOxyS zCzq#HyXS;Abr0cD)~fjaENw^TbNxqp?>xJ;#KoI+?uD~!t7-m^%=Lw!#EGTOJ(Q;h zTLJ{)+4;$`xSme%!elLD(Seq8mJh88!XRw9B$$DZe0DMBlyl z_qj&yI2vup&JI%{1lQ=B)v=wrwM%?PoneZ~69zMGUhn8>HN5)_)Wj}@4!1g14!RX} z4eBi6c9<=3{hrvq%Yfyg>{sMO4-MDGpMdOV+-&f2B$__g$~aXL?IY{V#v(WzVQgLd)+l-b!H_1a8~18@I)q5uV> z^D>3X?!&_ns1A$x0ohf8P5qJj>$&RZQb&IKEt>M0ep+PNH$v!9?u&Z&&@qgZZw9{YR4{B zq)ue{m3@REOA`@8fB&XxNJyEnOeef~-%mnU2P+z-44+-tB*BHdOKy9C0~4q)4?8CbdKQ1DY3I zOueo^j_ztB3`t+ZNbl?EFC6IM-*sq|%lwS3A-t9=5eK{Ft>q-Q zOodyqS^B`!z4llnt#v8T)A3G~qDZv4o4Q^qL0Aq5Et)%_%}fa|e`pp^2vjJKjo;%q za66hg?=O4FDn~1a%>w&a6a^+5qvjr#6Ok@m3uhCNhd6p8UWULrq})$HU>F<&hGQDc z`B-xzbmYT8)5$)w7szW&W`fLX<-fc`NHVT{SIpl@0!RnvoyUow&C!(%V~|6bUgBnZ z0d0;V)QQdXQYT9?!1Q{0)&dbG5hMy(mdTA)F#W{3d6m7 z_cX3m-OENm^AGS2<_QBc4iakTprFEC{a)CH$N3>*3t(+X6q)qFcfHG@yo5$$QYdw9 zCu~m)Mkue}F~r%g-qEfA;9rLGY=m zJVyq*un{@s6oeI|XsfX!D2dHrqu_7={6~jI!07DFeA9v7T=5b)%ttcdnQGB%j{*My zudM1u<7Cq$Rw4|Tz2#f+&?rOd@?n6)1ib=!V`1@id6GwvMi|MrG;e(YLei1_moOX+u z7me=F&Gs`2qO5Y3*C+agq4%I?M)0h!sZu&(^3bBka{&(t;3^=Nu;!tEr@eQcb!OuZ zx{q=o=`9z>?Z>Ns`ez(B8oZjc<%Z=3JvFi6IeT-(tyi*zVudN%vM?Go~4m zMv@qi7zTJ<%mSmTUuc#|OaGa31pZ)J(q#hL1Y?WmmmfUMH#v-Jf2hq8SX_~?fiUb< zOe8zSFg-+%dKZsx4e|DrysN#6#lIINqazyfZ`13|9u`HM(};gqaojd@+2GadW5}89 z8#Bp537n(N2Bl8|wq5!0P^Y-U0fLtgT_i5;$ZUgCU;dCP{YutSqk#K)KNKX4sT@Dm zLGgm`_O}bAfB#zYmV9?UU-ZHWzptTu&;(!~C+@Taam`gC=!?g~B9zI-jeIX0n1UI8 zDwY+KFtTX5laR1+DkPFLCNFbWB7#uZ+)cSmO`)%6nQu1fbCk>l`**d%aQ7zngX-wt zC*+XJtov^r%YSktM`rx|cww{565=i;@Y0CQJ%F(nB}SS9Spjm|xF|>VJ`-=p3e8p(nY(;<8ESwPxa^G;2p-P%X=EaG6{o2nR=cCyTdvm0Wz8ycFmHmYG#nU~85qieXZ^^ik!%h4z zayaL5f)Rlu-+H!FeX>;Ixr?8_VBP1CJ@t1!i4-RT!5ScgQ2qo>%w(80Jd2V@a!W%P zL(+xZpPj2e6-t|iXk!3lk?(UzGN#)f_o7qn=k;b8XkQ~On{_(Zd%uIbP}zd{wcN)K zzIk8T+SuZ9@q7B)Y=JOLJ)PUzFONBao7!5r;fGo~4t6e=Jx84qIBwj6;7IbwZb}UXGdnf= z9=$m#E!llLoDTuC{{^!ayY)VjR~ev1pt z?^6zFv&{b;#kN)>n8vb4w^#t32=eTcGFU2YTDkeOu{fu$oRep=c=8b;3Ic)~4z&}L zwjw;V70Sr|fah5D0+K&SUWJi}`RcEe*<_Ep2YJ-w;8j~KL@UStpT52-s;%ycHwhXv zNRi?$rFem&!KG+%_d+QYcS(RyN^xkB;#S-#?p`SN;qCS&>k>Kzg%fbdVi3U1t=#TpNr29A zttq+QI@`gp;YKQ1tTg64>>VvOgJsJJ+VpH`(@Zd;uQTqW=!Cm_#= zA+!7QHsBo&3q!-keLRymtXX#E}5yt-V!Q7)p4T@y(Og#?mvomK3&-ij=q5a z3WSc{=T<@@AgxQlPN+8KpLto_Yon{$9uVy?4iJCTYu2LD;99m!bJWlPZ2kr2@y&Mc271E+J7f;2Dkhe}9rTTd8jcH=f41nPC zQxD(Z%X(NoMOgML0`6v0>kh24u&6Wgu=x_M9|-gjVP~WSU^_ynIuY~9Xh@IbVln{8 z{3t4XNt+{v_`UW+*$?O1b^@m#vU3Ei!_T4@v938j;pWyGwIgj|;D_G2sf8NBPLB0{ zEqgi$YAD(2iqU%91yyNx?|r*CD*vX|vVr)YP+Z*e2SLv@W+EwNPE*w5^^D!@HbJNP zFG@gsl7S7#DUJi|ZtO_{6%uB?ZYPo>01#P^zr!bi*2>}Wtf>YxuLBNi;Xt2+lWiCd zc7$K<2fx{>qG>(^@diR{Efe+I>1ay*Ch^h>#=RliYxHz zyq%xzNrM|P&iEMf~Lh;;#qC99NwPrjNNEr znZ1iJ&U4iBkKrXgV%!i=Rr?NzlffH2&zHCmv*N%7&VACR3!?tjJ(IVS5y(wTOFu~b zL(GYGg)RIqp&U+F1#(7gAxA!ZsFL+A@4+fTQl@ACBpQ~`8+`S0 z7FnYex1~d&5@>jYK()+8nj2c5 z6-{S98JIQObH)b;WLXGjO2C1qghWLiu-p>d`$!D<2F9jky8nao(N(G5$?wPLPU^?&c}O8%>!+M@MNm_?41@dT_vv5gj;^c3$5d`9teE2$_mup-TlV4hM#w8C7BH!&WOGm ztGN63(>M$Pz-Cg%b$NwtYCl_Rz`HkfI_8}Dk}qckjtbs{5OzC90@I%P zJmZIxNOx17kNBhPmzYgr)ek!!j%m&{t)AR06>RYrmY=X3^O24emEBVg+*Txg;WhB6 zMTMWu>@g2EOcPQ!R1z|Z|GMz1EG?rBEad?2LIMfB#jetjHM#SciVWt)wW=>RPjxRE z;LPc|%L1LkPxYguWEX678tSNA_kI8-uuabT5`euGuaq-dZ7_nLhnD-ia;QJjeg`^> zn~6*$%9iBUlei2$XgNp}HY@unxw&cQn%biKEjR-J?aj|i_D7=*TGDSli$xp^4$ytlsZ;iPub8pZ z#@<;0SaNeo4xq_{6X4!3<}~T(rUcmok}f{E{|FDHAZ~vw61^WE-js3!Qmp|ga=}yq8yM^pgY>0w z9a5t6xypMt8P04&D~9^d0@eH(qBI;z!GAX}p)5bU(TC2|s&9U7N4{oshL&fEXRV0W zo7A-m8)xHTw#q5}?ILmAfsw}!W8H#vs8w=SY^xefxiWqzZKGX0>ND+=cS1<0EsGUn zF#N?#(OEKHN+0IeB-YZ`%3gcB{um2+_iheuxJ~1VU)fv<=4Rei=i!j|E9FtF2%im- zI_6;`RcF92yzf7$y}$z+tYC-!@Ms29Fh)Fc1CcMS+fH$;Xp)C0uIDU(;ImdP4@$`y z7v*Q0XF|KB?35s>iH_m>^xO1*Dwtz6Anb^mMA+Ch{4?p_r>270+g?O(dL%F*b3QVi zsLIQLmv@dYBzK%AcBTga!L$NBqqw|ep{DZRzTE6doJy2;Jjc0?B(CWNTqixw;_pl_ zlZvsP{<^oQ)-^X$_=nE`y`Jz4kZMVnet4W3_pr3ef0|pt(optvfL^%n-SE-TZA*XNuU~i9r_p?a+_@TIrESQp1PHeb^ir_>j-gj32(8oVPA_+n* zw_W$AQO@GGBdMsyf?s`s-C$DOE#83ZfYVZp`S20G=fP74T92tN=!ewD^7rp=dXYkh zl&-%~nPq2Fb^(XZJlRw^(({D3hLRH08>)r^KxezZILI#a;F4huy0z1iBoCu|-LDP- z6(d)4U?i4dTYkaK!P_h|fqSGL?AKo>rbqMPid`J%g#}c7NdNLdp@?{m;SkH1_s8K- z0x>tL{R^k#W_SDs!FAM;rCtaw=!|d^mhbxB)6*l!^L%AWm+zCFPwdIQTcq)>;5kBf zgV1DM;_R0L#^|05T?W3gUIQQk9?4_}!h`hWlAda#RlticLFx$%v`gvtr)myviC5Mz z=bhN+0dPFWrcWPG-><|_R5w=RhS<6_#x3aLI3dMez-2Y&7rS$wD-3Iz&-J+hHGEme zF~r5mrUH~iO@kHgS>n4ahi}HnfWl5D%Z4FHKPzi%tIda>iFz~=@+HB<^zF=u&~7wV zhzyviRsl2&%{U=n2Fn2`5-RMx`RxLT>cfBXx%CARCiNf(Ld_psUh>@U15qvrVBjbL zGq=$`n-{n(IXg%B6%ESxF{3Kta)59hCAen_>ue2`lJ?mGu_rDrd% z7-ePB$6aZSzZ$Y6Sd>rq)%2#)54&S~bd6Eqp6fE9TA(+wu%Pd*)MKa|dPP!SHdVo_ ziYdZ)bXJxZL<@7WfC365_Q^&(<-XFTF<2Z(Jf7DM4BX6W3@Ha1QI(Xw;mq9s!~fEt z4(B%>f9`w%2%gS-iNPXU;?`g{9Sper)Ck08Ur;a$t>8{HJHdAEX9F0&v0<>Ph&a+mr=iy#UrCZ5fG( z2H)L4EZ=--Njy%!*6W3>(3?l-Y2=~hlC7hw=ede9b&| z%ssP)=jHMf5;n4yxb%h9bD*pT3SZ@O-g2ZHs1-fCq7t4BeeAQ z*XkD#gZIBHP@F4Mwl8wBEscz%(S5`@_O3Z556;w^8};~y<;S0`zL0>-s@UtJMhj=0 zRFi(O@un2w19;&2JO7te1dNjhMv|w!+J%e))B{$;5%yVgMxGjkhB60-e)s@>08V(N z)KGkS!{W7!&ZADdl$0nf?60$U#}b_*Uetd%)M;xhtx^ksPdO^f*;gk`d1%*rxAUj) zV<-)0r>T;3&13MvlHEe3bvR^5Nq*BnRYNnau!bTl3^JbZWzJeRB#bI)JHn>Gj7>M{ zp8p+ALGzLRrH@;yE{)WWCL;x2$PNXBC)`OXePiq_hEzhPF1c&r;cWcz=+Wuj&5BnL z_l9TQ9geZgf($c^oQ-npc2zEP19_7&r81r zXJ=_efI%~EiXed6V{+00G-+=hEbFnvALo@o;RgAcXRG7D#2fhX_xRStb zXd-QCF)Qw-G~n$=uK2=P%BNSO~S?R zbHwLoW;h+$DFL4;m+~a-K*ovQJhCTOjcmhL<|7jcDu`RNOiTc-!IU?_b+gKU7c3js z!}6dwkI?ka9uvCVHDY#$X8hk7QBslF6MHEJ>}Mn@ufSv5?ijc4SMa9p$llYL+yRgH zvXD!AqwDWdC(Uo&0l250N|+;FIB2?jz-X8>;Wq8n*G2av=0LzZ5gf>y6&|WNd$zMDXm~eFK#WP zz|hdlS%7L~;dzw0+m(7qj~DODjdd^n^thG+4@TZSbP=E}%UrpfhvGUE(*;ZkX(>UU zpW}?#vZcePI+t*6*RhZ^`kQezASTP69^xQ@<+1MuffGwN%eke}hN zZCx_Lj@s+jz36j?b(d`vc%*vW8TRS(>6~a+N;c#Jcu1tzC!Q0xMwh&!V1e$x!E3A5 zU_As^kfB3r9HVH^>Dt4^&(J47ce@kL?F4EiyQiF9O<-h=?Wt zdTviMmXStsbdWI)mnpCif8#GC!jkkb9P_B)p%}|81QNgV>er6%F2`q24P43gHZCjY zSne$Hum03T2rLy7SJiL!jw6M;8-N|+03^DxQ?OpJF@@IjPKfy)BumE>%nI3IkavNioF+rn zR8>MvY-To(fv*Fwprkv-Jx@e%eG?&JMqUmXIvrSB zT~!K1tF^Y5gTrMYl<`$~?klr1c0SXfr6mh5idtyt^Se(HToXIBaHT_zKp~J;F|NdbEU^3vqwuo z@Ys&RkcDGc)>LKsg;|m?G;x;F0?s4)sDMG*LVDs{s}WVtxPkto+czEjLI|ihJfNwA zx76pT>;)hITc|4G!>|1xgk5tZ@!@Msh1h30UcQ}z3AXsn=R}sNBgAQuYwF~-n-_|Z z?%f=Bi~-SM?Jx@}z#>pHP6yc# z)5bey3atW%;sj|hxdJhy#yiXyWxp7_&zIl8Q*m&z@f7z5{i9zsuFJt@G?I)9&w)zE6fO+>ttAmyd2#fTbC&yBtW9EY7JGNJF0lBsGQR!RPWcokW}fxVo-$L*38eWaez0*J^IUkAm^0cK zu5c5*v7z}bbM+|5gk=3FL-UsTou8WlI#*2q70$@Zxlwigl05_;{S`JCBHh)lehsVe zDv*&DYt2Tno}oF@Oy`@!<$p2&A!#+kBC`lt=@ z5B|Aj?6^#f#r)9H=sAquesHwOzRX2c=5&bjKY#TSCLw}jZZNFRM# z<)q?AfKNk9IAhq&*tgxo2~%*T1$Z(maYv~!tiCqjtA+l;Z~pFpg?@Kp;$vEzzfa5$ z60n6QK>4l1An1(+LNc-~1UMX#Pr!o>F(hgHI!vu&ibdYSs?*;lEUBQEEn4a5I`hMj zGhfmb@(cq3RpG}{s`z;XV%W&jqLYy35-s_VgER^}*`{TCy1(AzVvDc>hlir+8)?O` z0X_URJYzk%hrXlVt_`E7?sH?y#>?cIDGGq8Jp46RlD;=vOMF%!*!{n~^#K$tFu>z_ zsZGn`;m2mJ4Q_9*^&8@nNHe}K@W#Z8(6*ZKRt3KlG>0ajNUnrjn309}nHEjYaJ~IT z_5+I=z{`b>)XD~2hqq$gMgM8r=ydqk@N)@M(H{lL_8O!$Syi@wy)4WpWnDY&c3g+C zI*H^q=4IA{JVLgA&F(f)S`Jy<2R2apV2FpK7&I?2SgBV;e@s)0vA2hOkPjSrA!TPH zHm+nImpAp#Bgwzl#`y<_nQR|Me=tKmFV+bw;=BEzknN4} zYFq`Up^gK*QE~M4tx~tE*rOU9`vJJuGT$Osf;m*!9y@ax-$u+*ZsVBqvrT>a?YoW) z;jtgY&2*@-tO^|rN`e*F+xp~z{i7lxidTNL`P`NeQebXJC9%+LSMz(0SHGS7{N}gz zOwgHgMI&f(0-&*M|97HADB0&DY^DKXXst%TOGk{*VxaTd3GBEod?+2 zS{0*azS^ULK#$)Uq@aT1f7x*qIWNm!nM%{8He?VkXH|k_zQD{*V7E>C$l~F^su&Ah6v#C8H&R`pr0^SOJx|udG!^U*icA8K&lw&EK_H;{*jz26{(dwO> zX?jnnBg20{qClPhG-WyLu@vx1%*YLAV+=*Upr%$nC@gK4BWEDvbG!?9&NWkv_J5;}$1W|FJENjl+rJdMZ?|G}R# z-ui(7pP_aB;&dI??mM$8|Jr(!5%4_`ai64pcY)H*RGfWtFu+@VB9@Etlwp7)k*kr0 zzH{&`n|R*(1{ms)AaSZ4B{4wa%C8~hW~n2T?HQ|rqsTl7l!Y{scI6knbNZa+Qs>Q5 zw7&_aGCG(hwpfdm%x`!3U@PYDpL@eZK)?1Ek=I0jHguOxEdAKN7r;*+15ATxyQHn^ z6D`$YO2?6!_Nyo{OT+>aNWzpBr_zzEzH9m_P~L4P%Ba8x*=jPw0!CbMRl|%sJdm>M z3o0=og~+nT?2p%RhSLL^eM|(Q*H}J6(d*RM3MOfmi`bj-rMKdL`}jV#&ss_3iRHPR z1IPiRRxi0zVRQv{KmN!dodVEXxQv9F&pEdWdP#<}NdMw&`y65Gkn53I?mL8Aq%{b* z^D|asD(aaOYUbKZ7eij_QkC5GGb&b^@!Z|e+4%Oc3n{mu`=M(546{E|Ta z(oZ{6ZQ|3M`_$p|6fP|V54bF_J3=VM(oODe_VZ`bFZbKhY>c=^cFJkf1fR2PXNlxr zMPabtwtw!K`xQ_dfKHcgN2R!>tW(BuxZDTue(N+ts}nb`ovykXMou3nTYX)1n*DZA zlTLB1iotlA3{LpFsWXSNM$ktZ$&qoWt5E2489DQ1Jh7-+>Jx}KJY>>6SciYdN)YJg z6GSGjnQko*VWhRz+G1he*|m6+a66T}wU4J4SVDX^M{!&1XVT)EepRN8x*LEd3G3bUrj~eMNlhJMtyPNw=AR(m!sDP5sC4EVI z-FP&5cYJ)yy>3rKc_z3ZzVEWuZkE$^>pl^^$|H*Kgi(D4H8SC3cH9?stgNgD+1=E~ z6E!kpK^hUcbocx`mq%6@oHjA9v&fw?FLfGoAR+vTWmp8|ZdezUBrUdcQDG+k!7(wf zHFqr`1Qb!}6t*5Ko=OfpOG$119t|d0bn4DpXW3r{o^Qu-Jl}Box7|x3b++P}G4F8l zPpY#p$x4mNhmrOHn-!4BuqZ>uczm~o@p%WpD!F+u@46-(q6ldm}z>VSCiganSX*41#vpE%5s_=fx^jd>5{ zvJ;;$V_4qGl>)xDg;19o?>Yc+Jv}f#y_uF{3*B`I_K%W6So--@IOZ@Y~)F#9uGQ`J~-y6t6w0C*?-U5tHpL4O9=Mq>I#GSAN~dj+;9Bcu5{We+Jwpc z1;F?`F@EM?{u%5$$qBF#S$^EYhlIA*Y@oFrl=w)J#{uIO$0})R3xj&Mk4Tp8ck-ClB@W~P%AOIia2$&61g`KA6fQ{fkEA0|(zb?deu|ZeE!*%DqV%Qjihuj;tH^v^HI_^*b z(k8T0T{0h7E*x-}V&FzH2BAy5$ZmdG+w$5O}j$_ukjQ8 zs_dE_2G@UK%HsiBBZc-ELrOLxp5&gIMTVC6IS>!4x496rBjTqjP9`SZ;in)IoIGeH zfdDigbs(M@I(p|NZb{b(g6o`5$x-Dt2#~|e5G2=%BzBBWeF8CktI1N;AMNP!ow0UI ztt&992GQOyCCm~JZD~LfE}Pk#U7Ht)naiJ+IvCe#^DxA(HC6xQ6tEgyPAZ2#3vZql z?gxmKG&j?<2h@GnEH0Q`ROSnodCw6}WdTnW!G)4GN(3~Y`aE0ATe>p*81y=vor`4d zZ4{~YCv&DB<6XQ~=^U%}VN8$He{>WPWh^{SSe_qgdd07DF?t#6f*t)!OxQ5?6GUGu zIjv~3H3{Cm`_aAlk>{0L>-Tu2>8UMe*AEL{aKc$BSk$??qkrxQY`~6pFK99(XwKOI zflB;aBOrIVXsuh_K_)_`c4HBQ1Z_K)!<5b0a9;Zdh5ztEbJzQ--WG=ctoJp^aBw7+ zCHTia*duh-O@q&@ef=&_bS|2NyvNb|a%qjnE15Nv$_jAL8YNM`IeKg=6+9%osZmA$4cOUygIN$DG!ot4VF@hGdjrSk|_CXMRcgfKLZ&h9h`e|=Ogy1 z05~NfTdqayrdx2b2lbV%PU+VsF-jK)84OjH5|589$las+oqIRQY#z%ci6CETOY^m$ zAgiKb@%KHH{E-O)?UVO|`tp+(%+I=suMCt5GSyTD{7V+B#4N#nHH6^(<4cZY_gB|1 z1d+qjj8B8-m(Hn9 zNi4IG(dS!^%otNum6<`CX%p425rnLE;w+Z+JUpA_18O~*6_^YWv9S~=;!4TA-?3aS zW-cDc^Y4h4lD@~=D;dAmk4eD6rj!>N@@kwv{=DBb<5>v^)=Ah}asH`>`TY*F+K<#VG2cgd{GJMxNg99JVki|EaU6Ln;^alO@6S%$I1DYG2+fi2xV$Xr)*i@p0nmQu* zlUn@Ixgd20`o|0eoHLL6(%P8szU()B^}9PktW6et_)M%e?hoV8327ZsT;emthsj`^ zvvX{}QM9qazs`GibWb=(^`uCnI=xh{`N0?GPtQAU@mpF**3>+rd5dVi-;l316*5x9 zDiWDVNp{Gfnz)#*K3Aj^BK~Y#>7L7)jjAFlyXSUJU8`LCA%E}e%4?15r zIh|B*mG@*>U;Wa^=OU5VX)%jv31SJS#Q-hhf;D72JVVx>pzU%IOY~p02S09dzj5tb z0Ev$)zK1_`8BrO8s`SwK@x_H?mXC9^vP5kbw2j#j)136>#gpWec8mRThw0(c{CS5B z%^&aC-M$_v1SGs{7h!!{L#XfLi)BiDRyW-%U5cOooJ_vAGJSNMJ{4a?+_En|u4%8KDRk8dk`bgrwnKLBK^a4Ef#?(aYSex+N zYY!41u?DCM>o6u6>#g`~6gUy?E4;6E_UiL{7>#fL167uzL^`4LUuKqsw42m2fRB_4 z2;gf(SvGGx??qfqCn0-7HdOt9YA9zET zN%56#=cJmIY^l@i5AlPO``#J1@9RIXDkWKGgvlQ|C`aiRtbkEv$%HHaP@W2W#+R+y z<>A}(^ne+)GmoQ)s-{Mayx&6waYnDxv=j`6TS-YWyfiF72_@rD*}wRz-L$`K?;+X% zY;fDu>6(@6e8kWs5v>i=+|~xz-Z$?m;^EcudMJI#HV8G@Vtn_2#Yx-Ng26%>V@jc$ z_Ceb)@zVyc{e9DN#8V3D>=%Z!qLNyPv6ppm2vr%D$)nF-OrtWxVKT^@`*&BBflvc% zxR|`3O72T4Wxwu-O%j1J+}slk5|0AJ&ONgGI>YEQWH~&~ySe6A0GoMqC~wiZbu97? z#}8VoH-c~FDEG{b`06K9q7@qza4BWZ{5r7cH2|ou zcxw8XKS`7bxblp@A~qGhXo6fmv!oyxk%309G~(~N0`C_>`;vhRaWP*fsrh^3&vGpC z_-iynS&Hw5Z>UhWIL*5o0+#7NWRpPG_#T<*%P zr7GcB%EViB2W#?DvqAq%Bs|A9^EX2D+q05F>z@t|!~3W?Gm4kwB-> zPhKn1ADNE&M!3~QsZ8;Xh;J|Uv1J%pti~BB5;oPbKTf_s zYQk1ALV`7>`OzQ7Go{^~w*Za2ENnBM*ejxk%o!%R(lDf6MQ~2&ngCX)ySe6b#>g+D zDL`RwiF5(Vfw@lbzsd#ze>5GoQVz`g-fPM}GSPH9>7n_rOx*y;qUnctx-{DEYx_ck z+A%>t$#8iSOB!b;6Maliuq5E`0~jxiYnwk>Vx&P{rA^_<@d#} z&TgpoK2K801K4VXyFFC6!c=Tt&>nE`h#~x@F*r`%R_FMn-RFG}nf;kehC*u&^5#_> zLc#jG%z?KR!#x)S9b3O3WA#QxxDEuTnB()9f5l$P((_+U0ZJZ-+*+F6SeTtBya_Wv-89vnh!E@n;8++y)lG`kHYWSVH-k*;Viu z??peVosnN0#EqZTeEUSjmw;S766xD$ld85y!*D2N|yb|^~1s8;6hZM$G=4AWb zOF`ycS8+9W4!+YsvKWs2pAKqgOO`X`@Y5wF3Gg5og!D2QinFR_K`w@t*h&1n;1 zAXZpD`~ZyWhq>-H50tx_oG5+k?7iJ?w0__ts==v{i8WhQ%fKFk?+_>`xjR zS42-*XP=oh5k<$_pKYFD2l4dVsEM+Xx3lGjY%b2Tp~=)`?O9Xo(u#Ksl{SD#SeF34 z^it*=ptIBSHT*PL6u6LM45wnRDS>qAcyTYRQ@3@}OS3+#Gd6NF*=M0=o2|9YLwf{j zzfkVWQ015mr*Ca1@zDaPgk&|*X%e5YkmX9i$>gpD`u8B@~xZHN4rBJQ_1}1ekaK zAq+YCoVFXWpHtlQ_TE>XiYu?F8d2VM;l5n41Rku-pWGq1J9F;<}N*Yd$l&7+VJDT0>2 ztQ}PHga^oI7P<{sJAM7Qhv!ZnIrORLSrOXad~-8c*sI8H8@~*- zk^fwV%|CH}fF6P$+Mwvh49)Jw2igI2e_+=zDc}Hr{D*}DC`;lVR5cm0o>Gj4i%Cb8 zCBK2<&9pjN>5KszoU1{QXTGuyvwfD!%FhklCk(={{OAP@I_$eI1mrWiAE$cf!d!yA zXO-{wWb4plw&kRx-=1|QeoHYHdKf*Fd5>m3q&W#T%G!lPow?$hf|`4aGv*gWhB3rM zGMSKvI1&}r557#uz|8-;o~&Fu7uMUFU;psz<0EG*2wD9_FG2zen zAU*0{Tv!1OLtnRqJ~|$5~2NjI&pvs(mne>ba1Z$8|#N3nkOxn-s=u-iAkj;ruD(cS(-jtW@ z5db=(m6;NPRdZVrtOKR4zjrs!uTfDq0;D5D-(e%`9}H$HgqPkX6WT^VJ$!H1%h&fFAh ziVHKy3E86b+OfN$=tfhmH>-#2?dos*$lHnQ`Q5fARb=hZLZ;|dQ2t6TUiD9%=#Pri zJK>72H`=--0tOOggJR1d5>RK1y;Ykv-k01mOvn@6`>s8ziHv~ih6o(JrO!WZy?c_k z{3KajjuLU6I}FGwDzN3(GD6!Fa$y7THFRs23CGpYnr*TB@0qfzL4$Ww`+> z5`bf+l*V6_;BMge`l~$Qy@Sf-gtgThFqf(KK>mO461|01j?^z|q7t!{mXqIR`T+BB zjF{nTCz<g?i3sqy>1$uuB`FVQ-KLYmfSD7$>;BH_Gh$D~! z_wH`I&S?957!l4B3ykN<{foYluEs1_8r%;m<}9NfxfWigi#@5|4h6QM*sIXr0RqccRVUVWR3^37bO~tqGf$0yW`wQ?$#HOyL?kOU~ul6 z%k?~4THZ%l$JA#k*m`pf`#7;Q=yxfcaIuZZ3AS>yTE>1?-;m$hjDi6#-}BOj#Ie7k zQ9b#ac{Fr;m{nUxe9@5#XgZ8RRY9`6e|0Vqb4ok^h`*Bz{mZ!o@NW2K9EM2g^?;M^ z4~?J*fUcaTU)SU}66-kJn=h{H7<~-yTny^(MW~-Xfw;J98#pO-9i>?L59e*iCPH)rA>v)wf`Ic2<^>45i0y}aQn0> zqWrsvq1vyC7a^W6AT#S}_h!|}PdlznXT4B#N~N?=;ku~GnpTyQSyGzWg`c{v7B6ZI zMbW9L9JcSX>d7rKe^@?#t7@D|aexlUdM88o;>k7X5S*?1S2*Rw%ImnTC}9|P*3DaA4*Bf}c61vLF}f#mtg}L2 zvA%*m)l3lIGQMCrXBX?v@9f08)Owmo7~>*O*3zsus5ef8Y4YgWv)5XflJt+@Zi(Z_t4CfFg9Xf1fyFR2$z_GA}kK4q_TJe(e{au}hek8-9# zNud%qA7w%=_oud(Z^ju4Pfunbk{hUSiM_p>@re^jzknBu=p8o-vyC}qu~yDnSI%$P zcQJfv0P95#@A!Dq8M+n+2lT&R%R*7rvAJdcztMn$!}`B3!%$rxm2>~^r2jqszrlmK XGlc5NCvh_R-z!x`O@%5stFZqALK6rv diff --git a/resources/updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL_mit_ausweis.png b/resources/updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL_mit_ausweis.png deleted file mode 100644 index 7421eab30fa3d96fc4ebd3b4df9b511c419baceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54625 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 h2qAJsto6002ovPDHLkV1j%os?-1g diff --git a/resources/updatable-files/reader/img_Identive_SDI010.png b/resources/updatable-files/reader/img_Identive_SDI010.png deleted file mode 100644 index f8a35e70543093cf29b06a25e1a944840e294353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99211 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
QW4|Zo}=4vf4{=MyHvpu&wKQvRF%$Km*pH7z{ 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 diff --git a/resources/updatable-files/supported-providers.json b/resources/updatable-files/supported-providers.json index b9bc1be2f..b21d54fcf 100644 --- a/resources/updatable-files/supported-providers.json +++ b/resources/updatable-files/supported-providers.json @@ -1305,6 +1305,26 @@ "https://www.fp-demail.de" ] }, + { + "shortName": { + "": "Stadt Niederkassel - Online-Services" + }, + "longName": { + "": "Stadt Niederkassel - Online-Services" + }, + "longDescription": { + "": "Im Online-Services-Portal der Stadt Niederkassel finden Sie diverse Dienstleistungen wie z. B. Bauanträge, Hundeangelegenheiten, Meldebescheinigung oder den Urkundenservice." + }, + "address": "https://www.niederkassel.de/eServices", + "homepage": "https://www.niederkassel.de", + "phone": "+49 2208 9466 0", + "email": "digitalisierung@niederkassel.de", + "postalAddress": "Stadt Niederkassel
Rathausstraße 19
53859 Niederkassel", + "image": "StadtNiederkassel_image.jpg", + "icon": "StadtNiederkassel_icon.png", + "category": "citizen", + "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)." + }, { "shortName": { "": "Niedersächsisches Ministerium für Inneres und Sport" @@ -1338,9 +1358,9 @@ }, "address": "https://www.pin-ruecksetzbrief-bestellen.de", "homepage": "https://www.pin-ruecksetzbrief-bestellen.de/support", - "phone": "+49 180 1 33 33 33", - "postalAddress": "Bundesministerium des Innern, für Bau und Heimat
Alt-Moabit 140
10557 Berlin", - "icon": "bmi_icon.svg", + "phone": "+49 30 18 681 23333", + "postalAddress": "Bundesministerium des Innern und für Heimat
Alt-Moabit 140
10557 Berlin", + "icon": "BMI_PIN_Reset_icon.svg", "category": "citizen", "subjectUrls": [ "https://www.pin-ruecksetzbrief-bestellen.de" @@ -1358,9 +1378,9 @@ }, "address": "https://www.pin-ruecksetzbrief-bestellen.de", "homepage": "https://www.pin-ruecksetzbrief-bestellen.de/support", - "phone": "+49 180 1 33 33 33", - "postalAddress": "Bundesministerium des Innern, für Bau und Heimat
Alt-Moabit 140
10557 Berlin", - "icon": "bmi_icon.svg", + "phone": "+49 30 18 681 23333", + "postalAddress": "Bundesministerium des Innern und für Heimat
Alt-Moabit 140
10557 Berlin", + "icon": "BMI_Aktivierung_icon.svg", "category": "citizen", "subjectUrlInfo": "Using service from Neue PIN für den Online-Ausweis bestellen (https://www.pin-ruecksetzbrief-bestellen.de)." }, @@ -1669,6 +1689,25 @@ "https://eid-prod.connect.verwalt-berlin.de" ] }, + { + "shortName": { + "": "Serviceportal der Stadt Boizenburg/Elbe" + }, + "longName": { + "": "Serviceportal der Stadt Boizenburg/Elbe" + }, + "longDescription": { + "": "Die Stadt Boizenburg/Elbe bietet auf ihrem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.boizenburg.de", + "homepage": "https://www.boizenburg.de", + "phone": "+49 38847 626 0", + "email": "stadt@boizenburg.de", + "postalAddress": "Stadt Boizenburg/Elbe
Kirchplatz 1
19258 Boizenburg/Elbe", + "category": "citizen", + "icon": "Boizenburg_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, { "shortName": { "": "Serviceportal Duisburg" @@ -1707,6 +1746,44 @@ "category": "citizen", "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)." }, + { + "shortName": { + "": "Serviceportal der Hansestadt Stralsund" + }, + "longName": { + "": "Serviceportal der Hansestadt Stralsund" + }, + "longDescription": { + "": "Die Hansestadt Stralsund bietet auf ihrem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.stralsund.de", + "homepage": "https://www.stralsund.de", + "phone": "+49 3831 252 110", + "email": "info@stralsund.de", + "postalAddress": "Hansestadt Stralsund
Postfach 2145
18408 Stralsund", + "category": "citizen", + "icon": "Stralsund_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, + { + "shortName": { + "": "Serviceportal der Stadt Grabow" + }, + "longName": { + "": "Serviceportal der Stadt Grabow" + }, + "longDescription": { + "": "Die Stadt Grabow bietet auf ihrem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.grabow.de", + "homepage": "https://www.grabow.de", + "phone": "+49 38756 503 0", + "email": "info@grabow.de", + "postalAddress": "Stadt Grabow
Am Markt 1
19300 Grabow", + "category": "citizen", + "icon": "Grabow_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, { "shortName": { "": "Servicekonto Sachsen" @@ -1727,6 +1804,25 @@ "https://eidconnect.egov.sachsen.de" ] }, + { + "shortName": { + "": "Serviceportal der Stadt Ludwigslust" + }, + "longName": { + "": "Serviceportal der Stadt Ludwigslust" + }, + "longDescription": { + "": "Die Stadt Ludwigslust bietet auf ihrem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.ludwigslust.de", + "homepage": "https://ludwigslust.de", + "phone": "+49 3874 526 0", + "email": "stadt@ludwigslust.de", + "postalAddress": "Stadt Ludwigslust
Schloßstraße 38
19288 Ludwigslust", + "category": "citizen", + "icon": "Ludwigslust_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, { "shortName": { "": "Servicekonto Nordrhein-Westfalen" @@ -1783,6 +1879,101 @@ "category": "citizen", "subjectUrlInfo": "Using service from Servicekonto Nordrhein-Westfalen (https://servicekonto.nrw)." }, + { + "shortName": { + "": "MV-Serviceportal" + }, + "longName": { + "": "Serviceportal Mecklenburg-Vorpommern" + }, + "longDescription": { + "": "Das MV-Serviceportal ist die zentrale Informationsplattform der öffentlichen Verwaltung von Mecklenburg-Vorpommern für Bürgerinnen und Bürger, Unternehmen und Verwaltungen." + }, + "address": "https://login.mv-serviceportal.de", + "homepage": "https://login.mv-serviceportal.de", + "email": "support@ego-mv.de", + "postalAddress": "Ministerium für Inneres, Bau und Digitalisierung Mecklenburg-Vorpommern
Arsenal am Pfaffenteich
Alexandrinenstraße 1
19053 Schwerin", + "category": "citizen", + "subjectUrls": [ + "https://login.mv-serviceportal.de" + ] + }, + { + "shortName": { + "": "Serviceportal des Amtes Neustadt-Glewe" + }, + "longName": { + "": "Serviceportal des Amtes Neustadt-Glewe" + }, + "longDescription": { + "": "Das Amt Neustadt-Glewe bietet auf seinem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.neustadt-glewe.de", + "homepage": "https://www.neustadt-glewe.de", + "phone": "+49 38757 500 0", + "email": "info@neustadt-glewe.de", + "postalAddress": "Stadt Neustadt-Glewe
Markt 1
19306 Neustadt-Glewe", + "category": "citizen", + "icon": "Neustadt-Glewe_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, + { + "shortName": { + "": "Serviceportal der Landeshauptstadt Schwerin" + }, + "longName": { + "": "Serviceportal der Landeshauptstadt Schwerin" + }, + "longDescription": { + "": "Die Landeshauptstadt Schwerin bietet auf ihrem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://serviceportal.schwerin.de", + "homepage": "https://serviceportal.schwerin.de", + "phone": "+49 385 545 0", + "email": "info@schwerin.de", + "postalAddress": "Landeshauptstadt Schwerin
Am Packhof 2-6
19053 Schwerin", + "category": "citizen", + "icon": "Schwerin_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, + { + "shortName": { + "": "Serviceportal des Landkreises Ludwigslust-Parchim" + }, + "longName": { + "": "Serviceportal des Landkreises Ludwigslust-Parchim" + }, + "longDescription": { + "": "Der Landkreis Ludwigslust-Parchim bietet auf seinem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.kreis-lup.de", + "homepage": "https://www.kreis-lup.de", + "phone": "+49 3871 722 0", + "email": "info@kreis-lup.de", + "postalAddress": "Landkreis Ludwigslust-Parchim
Postfach 16 02 20
19092 Schwerin", + "category": "citizen", + "icon": "Ludwigslust-Parchim_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, + { + "shortName": { + "": "Serviceportal des Amtes Stralendorf" + }, + "longName": { + "": "Serviceportal des Amtes Stralendorf" + }, + "longDescription": { + "": "Das Amtes Stralendorf bietet auf seinem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." + }, + "address": "https://service.amt-stralendorf.de", + "homepage": "https://www.amt-stralendorf.de", + "phone": "+49 3869 7600 0", + "email": "amt@amt-stralendorf.de", + "postalAddress": "Amt Stralendorf
Dorfstraße 30
19073 Stralendorf", + "category": "citizen", + "icon": "Stralendorf_icon.png", + "subjectUrlInfo": "Using service from Serviceportal Mecklenburg-Vorpommern (https://login.mv-serviceportal.de)." + }, { "exclude": [ "ios" @@ -1816,7 +2007,7 @@ "homepage": "https://serviceportal.schleswig-holstein.de", "phone": "+49 431 988 0", "email": "dataportdigitaleplattformens-hsupport@dataport.de", - "postalAddress": "Ministerium für Energiewende, Landwirtschaft, Umwelt, Natur und Digitalisierung des Landes Schleswig-Holstein
Digitalisierung und Zentrales IT-Management der Landesregierung
Niemannsweg 220
24106 Kiel", + "postalAddress": "Der Ministerpräsident - Staatskanzlei des Landes Schleswig-Holstein
Digitalisierung und Zentrales IT-Management der Landesregierung
Düsternbrooker Weg 104
24105 Kiel", "image": "ServiceportalSchleswigHolstein_image.jpg", "icon": "ServiceportalSchleswigHolstein_icon.png", "category": "citizen", @@ -2050,6 +2241,44 @@ "category": "citizen", "subjectUrlInfo": "Using service from Serviceportal Sachsen-Anhalt (https://st.buergerserviceportal.de)." }, + { + "shortName": { + "": "UVO" + }, + "longName": { + "": "Unterhaltsvorschuss Online" + }, + "longDescription": { + "": "Der Unterhaltsvorschuss ist eine staatliche Leistung für Kinder von Alleinerziehenden. Er hilft, die finanzielle Lebensgrundlage Ihres Kindes zu sichern, wenn der andere Elternteil nicht oder nur teilweise oder nicht regelmäßig Unterhalt in Höhe des Unterhaltsvorschusses zahlt. Sie können Unterhaltsvorschuss mit diesem Online-Dienst oder mit dem Papierantrag in Ihrer zuständigen Unterhaltsvorschuss-Stelle beantragen. Bitte beachten Sie, dass der Onlineantrag Unterhaltsvorschuss Online noch nicht in allen deutschen UV-Stellen verfügbar ist." + }, + "address": "https://serviceportal.gemeinsamonline.de/Onlinedienste/Service/Entry/UVORSCHUSS", + "homepage": "https://www.finanzen.bremen.de/digitalisierung/nachnutzbare-ozg-services/uvo-108593", + "email": "betrieb-onlinedienste@finanzen.bremen.de", + "postalAddress": "Der Senator für Finanzen
Projektteam Unterhaltsvorschuss
Rudolf-Hilferding-Platz 1
28195 Bremen", + "category": "citizen", + "icon": "UVO_icon.svg", + "subjectUrls": [ + "https://idp.serviceportal.gemeinsamonline.de" + ] + }, + { + "shortName": { + "": "UVOJahr" + }, + "longName": { + "": "Unterhaltsvorschuss - Jährliche Überprüfung" + }, + "longDescription": { + "": "Viele Kinder Alleinerziehender erhalten Unterhaltsvorschuss. Die Unterhaltsvorschuss-Stelle muss jährlich prüfen, ob dem Kind der Unterhaltsvorschuss noch zusteht. Hier können Bürgerinnen und Bürger die notwendigen Angaben machen. Bitte beachten Sie, dass der Onlineantrag Unterhaltsvorschuss Online noch nicht in allen deutschen UV-Stellen verfügbar ist." + }, + "address": "https://serviceportal.gemeinsamonline.de/Onlinedienste/Service/Entry/UVOJAHR", + "homepage": "https://www.finanzen.bremen.de/digitalisierung/nachnutzbare-ozg-services/uvo-108593", + "email": "betrieb-onlinedienste@finanzen.bremen.de", + "postalAddress": "Der Senator für Finanzen
Projektteam Unterhaltsvorschuss
Rudolf-Hilferding-Platz 1
28195 Bremen", + "category": "citizen", + "icon": "UVOJahr_icon.svg", + "subjectUrlInfo": "Using service from Unterhaltsvorschuss Online (https://idp.serviceportal.gemeinsamonline.de)." + }, { "exclude": [ "ios" diff --git a/resources/updatable-files/supported-readers.json b/resources/updatable-files/supported-readers.json index e78590614..98e4e5a39 100644 --- a/resources/updatable-files/supported-readers.json +++ b/resources/updatable-files/supported-readers.json @@ -810,42 +810,6 @@ } ] }, - { - "VendorId": "0x072F", - "ProductId": "0x223B", - "Name": "ACS ACR1252U", - "Pattern": "^ACS ACR1252 (1S CL|Dual)? Reader(( PICC 0)|\\(1\\))?$", - "Icon": "img_ACS_ACR1252U.png", - "IconWithNPA": "img_ACS_ACR1252U_mit_ausweis.png", - "Drivers": [ - { - "Platforms": [ - { - "os": "win" - }, - { - "os": "mac" - } - ], - "URL": "https://www.acs.com.hk/en/products/342/acr1252u-usb-nfc-reader-iii-nfc-forum-certified-reader/#tab_downloads" - } - ], - "Information": [ - { - "Platforms": [ - { - "os": "win" - }, - { - "os": "mac" - } - ], - "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.", - "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required." - } - ], - "Internal information": "Unter macOS funktioniert nur NFC A. Reader wird als unterstützt markiert, da zertifiziert." - }, { "VendorId": "0x076B", "ProductId": "0x5340", diff --git a/src/android/AusweisApp2LocalIfdService.java b/src/android/AusweisApp2LocalIfdService.java index f77ff91ac..e63d45533 100644 --- a/src/android/AusweisApp2LocalIfdService.java +++ b/src/android/AusweisApp2LocalIfdService.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/android/AusweisApp2LocalIfdServiceConnection.java b/src/android/AusweisApp2LocalIfdServiceConnection.java index b9a514c87..d9ff76caf 100644 --- a/src/android/AusweisApp2LocalIfdServiceConnection.java +++ b/src/android/AusweisApp2LocalIfdServiceConnection.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/android/AusweisApp2Service.java b/src/android/AusweisApp2Service.java index 32a69516a..8402097df 100644 --- a/src/android/AusweisApp2Service.java +++ b/src/android/AusweisApp2Service.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/android/LogHandler.java b/src/android/LogHandler.java index 6a9980e1c..d28ee2da8 100644 --- a/src/android/LogHandler.java +++ b/src/android/LogHandler.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/android/MainActivity.java b/src/android/MainActivity.java index 0953a41cf..b4d2d6002 100644 --- a/src/android/MainActivity.java +++ b/src/android/MainActivity.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/android/UpdateReceiver.java b/src/android/UpdateReceiver.java index dd2a42383..cc7868077 100644 --- a/src/android/UpdateReceiver.java +++ b/src/android/UpdateReceiver.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/autostart_helper/main.mm b/src/autostart_helper/main.mm index e65531488..1a0e5fcf5 100644 --- a/src/autostart_helper/main.mm +++ b/src/autostart_helper/main.mm @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/src/card/base/Card.cpp b/src/card/base/Card.cpp index 3efaa654d..f3682c1e7 100644 --- a/src/card/base/Card.cpp +++ b/src/card/base/Card.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Card.h" diff --git a/src/card/base/Card.h b/src/card/base/Card.h index 4c5859048..cd65bdf49 100644 --- a/src/card/base/Card.h +++ b/src/card/base/Card.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class representing a smart card - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/CardConnection.cpp b/src/card/base/CardConnection.cpp index 090560e12..983bda2f7 100644 --- a/src/card/base/CardConnection.cpp +++ b/src/card/base/CardConnection.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardConnection.h" diff --git a/src/card/base/CardConnection.h b/src/card/base/CardConnection.h index fb3083d0d..41849e4e1 100644 --- a/src/card/base/CardConnection.h +++ b/src/card/base/CardConnection.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains a card connection object - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/CardConnectionWorker.cpp b/src/card/base/CardConnectionWorker.cpp index 2d6f00c9e..bb159fecb 100644 --- a/src/card/base/CardConnectionWorker.cpp +++ b/src/card/base/CardConnectionWorker.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardConnectionWorker.h" diff --git a/src/card/base/CardConnectionWorker.h b/src/card/base/CardConnectionWorker.h index 89b78c86e..a5aec83c6 100644 --- a/src/card/base/CardConnectionWorker.h +++ b/src/card/base/CardConnectionWorker.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Worker for \ref CardConnection that will do the job in \ref ReaderManagerWorker - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/CardInfo.cpp b/src/card/base/CardInfo.cpp index 9d765bcb2..04cf34c85 100644 --- a/src/card/base/CardInfo.cpp +++ b/src/card/base/CardInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief CardInfo holds smart card information, such as the type and some contained data structure (currently only the EF.CardAccess). - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardInfo.h" diff --git a/src/card/base/CardInfo.h b/src/card/base/CardInfo.h index 522c870e8..219f68fc2 100644 --- a/src/card/base/CardInfo.h +++ b/src/card/base/CardInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains the CardInfo and the CardInfoFactory - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -70,7 +72,7 @@ class CardInfo [[nodiscard]] bool isRetryCounterDetermined() const; /*! - * The online identification function has not been activated by the competent authority. + * The eID function has not been activated by the competent authority. */ [[nodiscard]] bool isPinDeactivated() const; diff --git a/src/card/base/FileRef.cpp b/src/card/base/FileRef.cpp index 39e56b0d0..4de0c5462 100644 --- a/src/card/base/FileRef.cpp +++ b/src/card/base/FileRef.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "FileRef.h" diff --git a/src/card/base/FileRef.h b/src/card/base/FileRef.h index 4271336e7..85df433e5 100644 --- a/src/card/base/FileRef.h +++ b/src/card/base/FileRef.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Reference information for files on smart cards. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/InputAPDUInfo.cpp b/src/card/base/InputAPDUInfo.cpp index 3cf364abe..b0b90e939 100644 --- a/src/card/base/InputAPDUInfo.cpp +++ b/src/card/base/InputAPDUInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "InputAPDUInfo.h" diff --git a/src/card/base/InputAPDUInfo.h b/src/card/base/InputAPDUInfo.h index 8078e0583..19b824c30 100644 --- a/src/card/base/InputAPDUInfo.h +++ b/src/card/base/InputAPDUInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Holds the data of an InputAPDUInfo element. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/Reader.cpp b/src/card/base/Reader.cpp index a22a3fc32..f2a63b6b1 100644 --- a/src/card/base/Reader.cpp +++ b/src/card/base/Reader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Reader.h" diff --git a/src/card/base/Reader.h b/src/card/base/Reader.h index 9a7fa2721..9e4fe781f 100644 --- a/src/card/base/Reader.h +++ b/src/card/base/Reader.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/ReaderFilter.cpp b/src/card/base/ReaderFilter.cpp index adaad08a7..16ba4980f 100644 --- a/src/card/base/ReaderFilter.cpp +++ b/src/card/base/ReaderFilter.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderFilter.h" diff --git a/src/card/base/ReaderFilter.h b/src/card/base/ReaderFilter.h index 3a690e6f9..f953111b8 100644 --- a/src/card/base/ReaderFilter.h +++ b/src/card/base/ReaderFilter.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief A configured filter used to retrieve readers - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/ReaderInfo.cpp b/src/card/base/ReaderInfo.cpp index e1c8c97bf..11cef4b02 100644 --- a/src/card/base/ReaderInfo.cpp +++ b/src/card/base/ReaderInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderInfo.h" diff --git a/src/card/base/ReaderInfo.h b/src/card/base/ReaderInfo.h index 72e3efcfe..aa64eed98 100644 --- a/src/card/base/ReaderInfo.h +++ b/src/card/base/ReaderInfo.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/ReaderManager.cpp b/src/card/base/ReaderManager.cpp index b4cdae176..90ec06528 100644 --- a/src/card/base/ReaderManager.cpp +++ b/src/card/base/ReaderManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderManager.h" diff --git a/src/card/base/ReaderManager.h b/src/card/base/ReaderManager.h index f7698bf5e..88dc21c0c 100644 --- a/src/card/base/ReaderManager.h +++ b/src/card/base/ReaderManager.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/ReaderManagerPlugIn.cpp b/src/card/base/ReaderManagerPlugIn.cpp index b180304d5..0d174d68d 100644 --- a/src/card/base/ReaderManagerPlugIn.cpp +++ b/src/card/base/ReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderManagerPlugIn.h" diff --git a/src/card/base/ReaderManagerPlugIn.h b/src/card/base/ReaderManagerPlugIn.h index 93fdf18a9..a023f5f73 100644 --- a/src/card/base/ReaderManagerPlugIn.h +++ b/src/card/base/ReaderManagerPlugIn.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief PlugIn to control different kinds of reader managers that will be used in \ref ReaderManager. * If you implement a class of this PlugIn you need to register it in \ref ReaderManager, otherwise it won't be used. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/ReaderManagerPlugInInfo.cpp b/src/card/base/ReaderManagerPlugInInfo.cpp index cc73a196e..897abcfea 100644 --- a/src/card/base/ReaderManagerPlugInInfo.cpp +++ b/src/card/base/ReaderManagerPlugInInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderManagerPlugInInfo.h" diff --git a/src/card/base/ReaderManagerPlugInInfo.h b/src/card/base/ReaderManagerPlugInInfo.h index c3104e4a2..805735c79 100644 --- a/src/card/base/ReaderManagerPlugInInfo.h +++ b/src/card/base/ReaderManagerPlugInInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Data object providing information about a reader manager plug-in. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/ReaderManagerWorker.cpp b/src/card/base/ReaderManagerWorker.cpp index 6e4d6d530..ddef92760 100644 --- a/src/card/base/ReaderManagerWorker.cpp +++ b/src/card/base/ReaderManagerWorker.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderManagerWorker.h" diff --git a/src/card/base/ReaderManagerWorker.h b/src/card/base/ReaderManagerWorker.h index 6e134500a..470edd34a 100644 --- a/src/card/base/ReaderManagerWorker.h +++ b/src/card/base/ReaderManagerWorker.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Worker implementation of ReaderManger thread - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/SecurityProtocol.cpp b/src/card/base/SecurityProtocol.cpp index f352b05bb..256bd58bb 100644 --- a/src/card/base/SecurityProtocol.cpp +++ b/src/card/base/SecurityProtocol.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/card/base/SecurityProtocol.h b/src/card/base/SecurityProtocol.h index a62954e50..3948c1b83 100644 --- a/src/card/base/SecurityProtocol.h +++ b/src/card/base/SecurityProtocol.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/SmartCardDefinitions.cpp b/src/card/base/SmartCardDefinitions.cpp index 7371e4e30..b44c81fb0 100644 --- a/src/card/base/SmartCardDefinitions.cpp +++ b/src/card/base/SmartCardDefinitions.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartCardDefinitions.h" diff --git a/src/card/base/SmartCardDefinitions.h b/src/card/base/SmartCardDefinitions.h index 4132ebd36..09817bc7a 100644 --- a/src/card/base/SmartCardDefinitions.h +++ b/src/card/base/SmartCardDefinitions.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/CommandApdu.cpp b/src/card/base/apdu/CommandApdu.cpp index 2e796771f..7ad0b9b28 100644 --- a/src/card/base/apdu/CommandApdu.cpp +++ b/src/card/base/apdu/CommandApdu.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CommandApdu.h" diff --git a/src/card/base/apdu/CommandApdu.h b/src/card/base/apdu/CommandApdu.h index bc9ba536d..7f4d69a6a 100644 --- a/src/card/base/apdu/CommandApdu.h +++ b/src/card/base/apdu/CommandApdu.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/CommandData.cpp b/src/card/base/apdu/CommandData.cpp index 62c372e13..3f456e399 100644 --- a/src/card/base/apdu/CommandData.cpp +++ b/src/card/base/apdu/CommandData.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "CommandData.h" diff --git a/src/card/base/apdu/CommandData.h b/src/card/base/apdu/CommandData.h index 1e06fae93..a78cadf01 100644 --- a/src/card/base/apdu/CommandData.h +++ b/src/card/base/apdu/CommandData.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/FileCommand.cpp b/src/card/base/apdu/FileCommand.cpp index 3592d60d3..28da923ae 100644 --- a/src/card/base/apdu/FileCommand.cpp +++ b/src/card/base/apdu/FileCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "FileCommand.h" diff --git a/src/card/base/apdu/FileCommand.h b/src/card/base/apdu/FileCommand.h index f5bb281a7..39b49a6ca 100644 --- a/src/card/base/apdu/FileCommand.h +++ b/src/card/base/apdu/FileCommand.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/GeneralAuthenticateResponse.cpp b/src/card/base/apdu/GeneralAuthenticateResponse.cpp index 28d002c6a..f3387601d 100644 --- a/src/card/base/apdu/GeneralAuthenticateResponse.cpp +++ b/src/card/base/apdu/GeneralAuthenticateResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "GeneralAuthenticateResponse.h" diff --git a/src/card/base/apdu/GeneralAuthenticateResponse.h b/src/card/base/apdu/GeneralAuthenticateResponse.h index 7bf89a435..e8c6955f3 100644 --- a/src/card/base/apdu/GeneralAuthenticateResponse.h +++ b/src/card/base/apdu/GeneralAuthenticateResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of GeneralAuthenticate response APDUs. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/PacePinStatus.cpp b/src/card/base/apdu/PacePinStatus.cpp index 4c3c8c266..167be6f54 100644 --- a/src/card/base/apdu/PacePinStatus.cpp +++ b/src/card/base/apdu/PacePinStatus.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "PacePinStatus.h" diff --git a/src/card/base/apdu/PacePinStatus.h b/src/card/base/apdu/PacePinStatus.h index 06494b0b6..6c24cc867 100644 --- a/src/card/base/apdu/PacePinStatus.h +++ b/src/card/base/apdu/PacePinStatus.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/ResponseApdu.cpp b/src/card/base/apdu/ResponseApdu.cpp index 6e2af8bb0..70de2e5a2 100644 --- a/src/card/base/apdu/ResponseApdu.cpp +++ b/src/card/base/apdu/ResponseApdu.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ResponseApdu.h" diff --git a/src/card/base/apdu/ResponseApdu.h b/src/card/base/apdu/ResponseApdu.h index d50e8d0a2..3314bff50 100644 --- a/src/card/base/apdu/ResponseApdu.h +++ b/src/card/base/apdu/ResponseApdu.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/SecureMessagingApdu.cpp b/src/card/base/apdu/SecureMessagingApdu.cpp index 3b80bf15e..035f82510 100644 --- a/src/card/base/apdu/SecureMessagingApdu.cpp +++ b/src/card/base/apdu/SecureMessagingApdu.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SecureMessagingApdu.h" diff --git a/src/card/base/apdu/SecureMessagingApdu.h b/src/card/base/apdu/SecureMessagingApdu.h index e3e607c69..73f4b584f 100644 --- a/src/card/base/apdu/SecureMessagingApdu.h +++ b/src/card/base/apdu/SecureMessagingApdu.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief APDU for SecureMessaging - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/SecureMessagingCommand.cpp b/src/card/base/apdu/SecureMessagingCommand.cpp index e25d3de50..db64d8fc9 100644 --- a/src/card/base/apdu/SecureMessagingCommand.cpp +++ b/src/card/base/apdu/SecureMessagingCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SecureMessagingCommand.h" diff --git a/src/card/base/apdu/SecureMessagingCommand.h b/src/card/base/apdu/SecureMessagingCommand.h index 603a183dc..2757f9227 100644 --- a/src/card/base/apdu/SecureMessagingCommand.h +++ b/src/card/base/apdu/SecureMessagingCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command APDU for SecureMessaging - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/SecureMessagingResponse.cpp b/src/card/base/apdu/SecureMessagingResponse.cpp index 621728991..90858eaeb 100644 --- a/src/card/base/apdu/SecureMessagingResponse.cpp +++ b/src/card/base/apdu/SecureMessagingResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "SecureMessagingResponse.h" diff --git a/src/card/base/apdu/SecureMessagingResponse.h b/src/card/base/apdu/SecureMessagingResponse.h index 277e55ff1..2188ee12e 100644 --- a/src/card/base/apdu/SecureMessagingResponse.h +++ b/src/card/base/apdu/SecureMessagingResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Response APDU for SecureMessaging - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/apdu/SecureMessagingTypes.cpp b/src/card/base/apdu/SecureMessagingTypes.cpp index abfe23413..017d360c7 100644 --- a/src/card/base/apdu/SecureMessagingTypes.cpp +++ b/src/card/base/apdu/SecureMessagingTypes.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "SecureMessagingTypes.h" diff --git a/src/card/base/apdu/SecureMessagingTypes.h b/src/card/base/apdu/SecureMessagingTypes.h index 0b00eab5c..09d4462d6 100644 --- a/src/card/base/apdu/SecureMessagingTypes.h +++ b/src/card/base/apdu/SecureMessagingTypes.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief ASN.1 types for SecureMessaging - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/ASN1TemplateUtil.cpp b/src/card/base/asn1/ASN1TemplateUtil.cpp index c6fb94340..ff1c7dff4 100644 --- a/src/card/base/asn1/ASN1TemplateUtil.cpp +++ b/src/card/base/asn1/ASN1TemplateUtil.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "ASN1TemplateUtil.h" diff --git a/src/card/base/asn1/ASN1TemplateUtil.h b/src/card/base/asn1/ASN1TemplateUtil.h index b8aa78e0a..1bcc31c94 100644 --- a/src/card/base/asn1/ASN1TemplateUtil.h +++ b/src/card/base/asn1/ASN1TemplateUtil.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Utility template functions for encoding and decoding of ASN.1 types - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/ASN1Util.cpp b/src/card/base/asn1/ASN1Util.cpp index 6de7c62d4..1cca7cf73 100644 --- a/src/card/base/asn1/ASN1Util.cpp +++ b/src/card/base/asn1/ASN1Util.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/src/card/base/asn1/ASN1Util.h b/src/card/base/asn1/ASN1Util.h index 07926cc9b..c7ee7ae7e 100644 --- a/src/card/base/asn1/ASN1Util.h +++ b/src/card/base/asn1/ASN1Util.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Utility functions, templates and other ASN.1 related helper stuff - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/AccessRoleAndRight.cpp b/src/card/base/asn1/AccessRoleAndRight.cpp index acf682ee9..1e4ddebe6 100644 --- a/src/card/base/asn1/AccessRoleAndRight.cpp +++ b/src/card/base/asn1/AccessRoleAndRight.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "AccessRoleAndRight.h" diff --git a/src/card/base/asn1/AccessRoleAndRight.h b/src/card/base/asn1/AccessRoleAndRight.h index f2ce0c938..185d1ce1b 100644 --- a/src/card/base/asn1/AccessRoleAndRight.h +++ b/src/card/base/asn1/AccessRoleAndRight.h @@ -1,3 +1,7 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Defines the AccessRight and AccessRole enum. * @@ -5,8 +9,6 @@ * this header must be included before (also indirectly via or ), * or otherwise they complain about the qHash() function for AccessRight not being * found. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/ApplicationTemplate.cpp b/src/card/base/asn1/ApplicationTemplate.cpp index 49cd95389..2f739feb2 100644 --- a/src/card/base/asn1/ApplicationTemplate.cpp +++ b/src/card/base/asn1/ApplicationTemplate.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationTemplate.h" diff --git a/src/card/base/asn1/ApplicationTemplate.h b/src/card/base/asn1/ApplicationTemplate.h index ec4719b7e..85ec5b03d 100644 --- a/src/card/base/asn1/ApplicationTemplate.h +++ b/src/card/base/asn1/ApplicationTemplate.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of ISO 7816 application template - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/ApplicationTemplates.cpp b/src/card/base/asn1/ApplicationTemplates.cpp index f350c3a78..acc043f78 100644 --- a/src/card/base/asn1/ApplicationTemplates.cpp +++ b/src/card/base/asn1/ApplicationTemplates.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationTemplates.h" diff --git a/src/card/base/asn1/ApplicationTemplates.h b/src/card/base/asn1/ApplicationTemplates.h index 080e546f9..1d0a8db5a 100644 --- a/src/card/base/asn1/ApplicationTemplates.h +++ b/src/card/base/asn1/ApplicationTemplates.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of the ISO 7816 EF.DIR data structure (set of * application template) - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/AuthenticatedAuxiliaryData.cpp b/src/card/base/asn1/AuthenticatedAuxiliaryData.cpp index df01e853c..3d509ca77 100644 --- a/src/card/base/asn1/AuthenticatedAuxiliaryData.cpp +++ b/src/card/base/asn1/AuthenticatedAuxiliaryData.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AuthenticatedAuxiliaryData.h" diff --git a/src/card/base/asn1/AuthenticatedAuxiliaryData.h b/src/card/base/asn1/AuthenticatedAuxiliaryData.h index 63fd544c5..6a47d5e41 100644 --- a/src/card/base/asn1/AuthenticatedAuxiliaryData.h +++ b/src/card/base/asn1/AuthenticatedAuxiliaryData.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of AuthenticatedAuxiliaryData. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/CVCertificate.cpp b/src/card/base/asn1/CVCertificate.cpp index 12c718be4..59e87ab1d 100644 --- a/src/card/base/asn1/CVCertificate.cpp +++ b/src/card/base/asn1/CVCertificate.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CVCertificate.h" diff --git a/src/card/base/asn1/CVCertificate.h b/src/card/base/asn1/CVCertificate.h index 8266fb1c9..b5134ee4d 100644 --- a/src/card/base/asn1/CVCertificate.h +++ b/src/card/base/asn1/CVCertificate.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Card Verifiable Certificate, CVC. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/CVCertificateBody.cpp b/src/card/base/asn1/CVCertificateBody.cpp index 9c06b9399..e606e5023 100644 --- a/src/card/base/asn1/CVCertificateBody.cpp +++ b/src/card/base/asn1/CVCertificateBody.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CVCertificateBody.h" diff --git a/src/card/base/asn1/CVCertificateBody.h b/src/card/base/asn1/CVCertificateBody.h index 4e9cc1321..3324f829d 100644 --- a/src/card/base/asn1/CVCertificateBody.h +++ b/src/card/base/asn1/CVCertificateBody.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/CVCertificateChain.cpp b/src/card/base/asn1/CVCertificateChain.cpp index f0078398d..bd559a8fb 100644 --- a/src/card/base/asn1/CVCertificateChain.cpp +++ b/src/card/base/asn1/CVCertificateChain.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CVCertificateChain.h" diff --git a/src/card/base/asn1/CVCertificateChain.h b/src/card/base/asn1/CVCertificateChain.h index a34302986..e98a2f155 100644 --- a/src/card/base/asn1/CVCertificateChain.h +++ b/src/card/base/asn1/CVCertificateChain.h @@ -1,11 +1,13 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief A CV certificate chain is an ordered list, where the * CV certificates are ordered by the holder to authority reference * relation * (The holder is equivalent to the Subject-DN, the authority reference * is equivalent to the Issuer-DN.) - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/CVCertificateChainBuilder.cpp b/src/card/base/asn1/CVCertificateChainBuilder.cpp index b978a44ba..baf058d1e 100644 --- a/src/card/base/asn1/CVCertificateChainBuilder.cpp +++ b/src/card/base/asn1/CVCertificateChainBuilder.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CVCertificateChainBuilder.h" diff --git a/src/card/base/asn1/CVCertificateChainBuilder.h b/src/card/base/asn1/CVCertificateChainBuilder.h index 5bc09bdb1..34ced642f 100644 --- a/src/card/base/asn1/CVCertificateChainBuilder.h +++ b/src/card/base/asn1/CVCertificateChainBuilder.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Builder for CVC chains. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/CertificateDescription.cpp b/src/card/base/asn1/CertificateDescription.cpp index eaf8f2dac..c98e37d1d 100644 --- a/src/card/base/asn1/CertificateDescription.cpp +++ b/src/card/base/asn1/CertificateDescription.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CertificateDescription.h" diff --git a/src/card/base/asn1/CertificateDescription.h b/src/card/base/asn1/CertificateDescription.h index 845af5487..302e48fb4 100644 --- a/src/card/base/asn1/CertificateDescription.h +++ b/src/card/base/asn1/CertificateDescription.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of ASN.1 type CertificateDescription with OpenSSL - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/ChainBuilder.h b/src/card/base/asn1/ChainBuilder.h index 7fa24e92e..c35ae5178 100644 --- a/src/card/base/asn1/ChainBuilder.h +++ b/src/card/base/asn1/ChainBuilder.h @@ -1,11 +1,13 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generic implementation for chain building, i.e. building ordered lists. * The ChainBuilder is initialized with a pool of objects and a (pointer to a) function * that decides if two objects have a parent child relation. Duplicates are filtered out. * * All found chains are returned by the function /ref ChainBuilder::getChains(). - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/Chat.cpp b/src/card/base/asn1/Chat.cpp index 334885076..1da099ded 100644 --- a/src/card/base/asn1/Chat.cpp +++ b/src/card/base/asn1/Chat.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Chat.h" diff --git a/src/card/base/asn1/Chat.h b/src/card/base/asn1/Chat.h index f5a60f020..29c2dab31 100644 --- a/src/card/base/asn1/Chat.h +++ b/src/card/base/asn1/Chat.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Certificate Holder Authorization Template, CHAT. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/ChipAuthenticationInfo.cpp b/src/card/base/asn1/ChipAuthenticationInfo.cpp index b68675be0..f09e82860 100644 --- a/src/card/base/asn1/ChipAuthenticationInfo.cpp +++ b/src/card/base/asn1/ChipAuthenticationInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ChipAuthenticationInfo.h" diff --git a/src/card/base/asn1/ChipAuthenticationInfo.h b/src/card/base/asn1/ChipAuthenticationInfo.h index fd730299a..80f8b7359 100644 --- a/src/card/base/asn1/ChipAuthenticationInfo.h +++ b/src/card/base/asn1/ChipAuthenticationInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of ChipAuthenticationInfo - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/EFCardSecurity.cpp b/src/card/base/asn1/EFCardSecurity.cpp index c1728fad3..0bb6be897 100644 --- a/src/card/base/asn1/EFCardSecurity.cpp +++ b/src/card/base/asn1/EFCardSecurity.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "EFCardSecurity.h" diff --git a/src/card/base/asn1/EFCardSecurity.h b/src/card/base/asn1/EFCardSecurity.h index 25baafdeb..a27df3717 100644 --- a/src/card/base/asn1/EFCardSecurity.h +++ b/src/card/base/asn1/EFCardSecurity.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of EFCardSecurity - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/card/base/asn1/EcdsaPublicKey.cpp b/src/card/base/asn1/EcdsaPublicKey.cpp index 1f15df14c..64cd2d9ed 100644 --- a/src/card/base/asn1/EcdsaPublicKey.cpp +++ b/src/card/base/asn1/EcdsaPublicKey.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "EcdsaPublicKey.h" diff --git a/src/card/base/asn1/EcdsaPublicKey.h b/src/card/base/asn1/EcdsaPublicKey.h index d0a89ea88..c03d3a929 100644 --- a/src/card/base/asn1/EcdsaPublicKey.h +++ b/src/card/base/asn1/EcdsaPublicKey.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/MobileEIDTypeInfo.cpp b/src/card/base/asn1/MobileEIDTypeInfo.cpp index 4cbbe6ed9..d67ebf307 100644 --- a/src/card/base/asn1/MobileEIDTypeInfo.cpp +++ b/src/card/base/asn1/MobileEIDTypeInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "MobileEIDTypeInfo.h" diff --git a/src/card/base/asn1/MobileEIDTypeInfo.h b/src/card/base/asn1/MobileEIDTypeInfo.h index 0f1240f26..b0d24a8e7 100644 --- a/src/card/base/asn1/MobileEIDTypeInfo.h +++ b/src/card/base/asn1/MobileEIDTypeInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of MobileEIDTypeInfo - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/Oid.cpp b/src/card/base/asn1/Oid.cpp index 5755b8db0..9980e1e25 100644 --- a/src/card/base/asn1/Oid.cpp +++ b/src/card/base/asn1/Oid.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "Oid.h" diff --git a/src/card/base/asn1/Oid.h b/src/card/base/asn1/Oid.h index 0bae52808..05a5b418c 100644 --- a/src/card/base/asn1/Oid.h +++ b/src/card/base/asn1/Oid.h @@ -1,6 +1,8 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany - * * Known OIDs according to TR-03110-3 A.1.1 */ diff --git a/src/card/base/asn1/PaceInfo.cpp b/src/card/base/asn1/PaceInfo.cpp index b8233fc55..54a23b3d8 100644 --- a/src/card/base/asn1/PaceInfo.cpp +++ b/src/card/base/asn1/PaceInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "PaceInfo.h" diff --git a/src/card/base/asn1/PaceInfo.h b/src/card/base/asn1/PaceInfo.h index 726bc9f8d..741be8de5 100644 --- a/src/card/base/asn1/PaceInfo.h +++ b/src/card/base/asn1/PaceInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of PACEInfo - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/SecurityInfo.cpp b/src/card/base/asn1/SecurityInfo.cpp index c5f1cf4ea..ddd4220ba 100644 --- a/src/card/base/asn1/SecurityInfo.cpp +++ b/src/card/base/asn1/SecurityInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SecurityInfo.h" diff --git a/src/card/base/asn1/SecurityInfo.h b/src/card/base/asn1/SecurityInfo.h index 3d45f6e82..20ca0ec07 100644 --- a/src/card/base/asn1/SecurityInfo.h +++ b/src/card/base/asn1/SecurityInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of SecurityInfo - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/SecurityInfos.cpp b/src/card/base/asn1/SecurityInfos.cpp index d4d78518a..4195fcc8c 100644 --- a/src/card/base/asn1/SecurityInfos.cpp +++ b/src/card/base/asn1/SecurityInfos.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SecurityInfos.h" diff --git a/src/card/base/asn1/SecurityInfos.h b/src/card/base/asn1/SecurityInfos.h index 8c3ef007d..95499f1ea 100644 --- a/src/card/base/asn1/SecurityInfos.h +++ b/src/card/base/asn1/SecurityInfos.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of SecurityInfos - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/asn1/SignatureChecker.cpp b/src/card/base/asn1/SignatureChecker.cpp index 71ea4e785..e64675042 100644 --- a/src/card/base/asn1/SignatureChecker.cpp +++ b/src/card/base/asn1/SignatureChecker.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/SignatureChecker.h" diff --git a/src/card/base/asn1/SignatureChecker.h b/src/card/base/asn1/SignatureChecker.h index 148834813..884e0cf95 100644 --- a/src/card/base/asn1/SignatureChecker.h +++ b/src/card/base/asn1/SignatureChecker.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/BaseCardCommand.cpp b/src/card/base/command/BaseCardCommand.cpp index c4ef4a64b..895b14a3c 100644 --- a/src/card/base/command/BaseCardCommand.cpp +++ b/src/card/base/command/BaseCardCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "BaseCardCommand.h" diff --git a/src/card/base/command/BaseCardCommand.h b/src/card/base/command/BaseCardCommand.h index 8fa1c287d..1c638ebb1 100644 --- a/src/card/base/command/BaseCardCommand.h +++ b/src/card/base/command/BaseCardCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Holds some basic card control commands - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/CreateCardConnectionCommand.cpp b/src/card/base/command/CreateCardConnectionCommand.cpp index 87215d94f..a5bd68269 100644 --- a/src/card/base/command/CreateCardConnectionCommand.cpp +++ b/src/card/base/command/CreateCardConnectionCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "CreateCardConnectionCommand.h" diff --git a/src/card/base/command/CreateCardConnectionCommand.h b/src/card/base/command/CreateCardConnectionCommand.h index 526bab0e6..6aa29b671 100644 --- a/src/card/base/command/CreateCardConnectionCommand.h +++ b/src/card/base/command/CreateCardConnectionCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command implementation for asynchronous CardConnection creation - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/DestroyPaceChannelCommand.cpp b/src/card/base/command/DestroyPaceChannelCommand.cpp index 5ff68a480..e28902b38 100644 --- a/src/card/base/command/DestroyPaceChannelCommand.cpp +++ b/src/card/base/command/DestroyPaceChannelCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "DestroyPaceChannelCommand.h" diff --git a/src/card/base/command/DestroyPaceChannelCommand.h b/src/card/base/command/DestroyPaceChannelCommand.h index 1dc0d4cc4..9162d0e7a 100644 --- a/src/card/base/command/DestroyPaceChannelCommand.h +++ b/src/card/base/command/DestroyPaceChannelCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to destroy a Pace channel. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/DidAuthenticateEAC1Command.cpp b/src/card/base/command/DidAuthenticateEAC1Command.cpp index cb8d20b1c..b201edbd8 100644 --- a/src/card/base/command/DidAuthenticateEAC1Command.cpp +++ b/src/card/base/command/DidAuthenticateEAC1Command.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DidAuthenticateEAC1Command.h" diff --git a/src/card/base/command/DidAuthenticateEAC1Command.h b/src/card/base/command/DidAuthenticateEAC1Command.h index 0b7994791..5118ce2c5 100644 --- a/src/card/base/command/DidAuthenticateEAC1Command.h +++ b/src/card/base/command/DidAuthenticateEAC1Command.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to perform the DID Authenticate EAC1 process. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/DidAuthenticateEAC2Command.cpp b/src/card/base/command/DidAuthenticateEAC2Command.cpp index 2cb458826..b4936f8c0 100644 --- a/src/card/base/command/DidAuthenticateEAC2Command.cpp +++ b/src/card/base/command/DidAuthenticateEAC2Command.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DidAuthenticateEAC2Command.h" diff --git a/src/card/base/command/DidAuthenticateEAC2Command.h b/src/card/base/command/DidAuthenticateEAC2Command.h index b044ad31b..e1fe2103c 100644 --- a/src/card/base/command/DidAuthenticateEAC2Command.h +++ b/src/card/base/command/DidAuthenticateEAC2Command.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to perform the DID Authenticate EAC2 process. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/EstablishPaceChannelCommand.cpp b/src/card/base/command/EstablishPaceChannelCommand.cpp index 89af8e723..493a0990e 100644 --- a/src/card/base/command/EstablishPaceChannelCommand.cpp +++ b/src/card/base/command/EstablishPaceChannelCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "EstablishPaceChannelCommand.h" diff --git a/src/card/base/command/EstablishPaceChannelCommand.h b/src/card/base/command/EstablishPaceChannelCommand.h index 86e0c9edf..49f422843 100644 --- a/src/card/base/command/EstablishPaceChannelCommand.h +++ b/src/card/base/command/EstablishPaceChannelCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to change the PIN of a card. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/ExecuteCommand.cpp b/src/card/base/command/ExecuteCommand.cpp index bd77e06d7..fb3ec8dc4 100644 --- a/src/card/base/command/ExecuteCommand.cpp +++ b/src/card/base/command/ExecuteCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ExecuteCommand.h" diff --git a/src/card/base/command/ExecuteCommand.h b/src/card/base/command/ExecuteCommand.h index dc3cca56c..04e9aabf9 100644 --- a/src/card/base/command/ExecuteCommand.h +++ b/src/card/base/command/ExecuteCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Execute function on ReaderManager-Thread - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/SetEidPinCommand.cpp b/src/card/base/command/SetEidPinCommand.cpp index 46e532021..1028a8359 100644 --- a/src/card/base/command/SetEidPinCommand.cpp +++ b/src/card/base/command/SetEidPinCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "SetEidPinCommand.h" diff --git a/src/card/base/command/SetEidPinCommand.h b/src/card/base/command/SetEidPinCommand.h index 12ae9f045..0fb326027 100644 --- a/src/card/base/command/SetEidPinCommand.h +++ b/src/card/base/command/SetEidPinCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to set the Eid PIN of a card. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/TransmitCommand.cpp b/src/card/base/command/TransmitCommand.cpp index 6bc61a20b..13219cb6a 100644 --- a/src/card/base/command/TransmitCommand.cpp +++ b/src/card/base/command/TransmitCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TransmitCommand.h" diff --git a/src/card/base/command/TransmitCommand.h b/src/card/base/command/TransmitCommand.h index 5b57f210d..26be31cd0 100644 --- a/src/card/base/command/TransmitCommand.h +++ b/src/card/base/command/TransmitCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to transmit data to/from the card. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/command/UpdateRetryCounterCommand.cpp b/src/card/base/command/UpdateRetryCounterCommand.cpp index 87fc76089..e5452d8a4 100644 --- a/src/card/base/command/UpdateRetryCounterCommand.cpp +++ b/src/card/base/command/UpdateRetryCounterCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "UpdateRetryCounterCommand.h" diff --git a/src/card/base/command/UpdateRetryCounterCommand.h b/src/card/base/command/UpdateRetryCounterCommand.h index d81ad6cf0..c75c2a052 100644 --- a/src/card/base/command/UpdateRetryCounterCommand.h +++ b/src/card/base/command/UpdateRetryCounterCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Command to update the retry counter of a card. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/CipherMac.cpp b/src/card/base/pace/CipherMac.cpp index dd5ff82f7..5ee07d43f 100644 --- a/src/card/base/pace/CipherMac.cpp +++ b/src/card/base/pace/CipherMac.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/CipherMac.h" diff --git a/src/card/base/pace/CipherMac.h b/src/card/base/pace/CipherMac.h index 4b13f8114..dbb21f593 100644 --- a/src/card/base/pace/CipherMac.h +++ b/src/card/base/pace/CipherMac.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief CMAC implementation to be used in PACE protocol. See TR 03110. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/EstablishPaceChannelCode.cpp b/src/card/base/pace/EstablishPaceChannelCode.cpp index 8ec2b97cd..7b864cbbf 100644 --- a/src/card/base/pace/EstablishPaceChannelCode.cpp +++ b/src/card/base/pace/EstablishPaceChannelCode.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "EstablishPaceChannelCode.h" diff --git a/src/card/base/pace/EstablishPaceChannelCode.h b/src/card/base/pace/EstablishPaceChannelCode.h index 43ddb3226..d60b4d8a4 100644 --- a/src/card/base/pace/EstablishPaceChannelCode.h +++ b/src/card/base/pace/EstablishPaceChannelCode.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief EstablishPaceChannel error code definitions - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/KeyAgreement.cpp b/src/card/base/pace/KeyAgreement.cpp index d40ce51ed..d0d4f9ba3 100644 --- a/src/card/base/pace/KeyAgreement.cpp +++ b/src/card/base/pace/KeyAgreement.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/card/base/pace/KeyAgreement.h b/src/card/base/pace/KeyAgreement.h index c9c560187..0428ee0b1 100644 --- a/src/card/base/pace/KeyAgreement.h +++ b/src/card/base/pace/KeyAgreement.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief the key agreement protocol use in PACE. For details see TR 03110. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/KeyDerivationFunction.cpp b/src/card/base/pace/KeyDerivationFunction.cpp index 378abd391..6c4dc00fc 100644 --- a/src/card/base/pace/KeyDerivationFunction.cpp +++ b/src/card/base/pace/KeyDerivationFunction.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/KeyDerivationFunction.h" diff --git a/src/card/base/pace/KeyDerivationFunction.h b/src/card/base/pace/KeyDerivationFunction.h index 67ab0ab7f..b1efef7fb 100644 --- a/src/card/base/pace/KeyDerivationFunction.h +++ b/src/card/base/pace/KeyDerivationFunction.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Creates key according to TR 03110 Part 3 chapters A.2.3 ff. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/PaceHandler.cpp b/src/card/base/pace/PaceHandler.cpp index ff50f4dd0..1df3938b2 100644 --- a/src/card/base/pace/PaceHandler.cpp +++ b/src/card/base/pace/PaceHandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/PaceHandler.h" diff --git a/src/card/base/pace/PaceHandler.h b/src/card/base/pace/PaceHandler.h index 08afb803f..5ba90274d 100644 --- a/src/card/base/pace/PaceHandler.h +++ b/src/card/base/pace/PaceHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Handler for the PACE protocol. See TR-03110. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/SecureMessaging.cpp b/src/card/base/pace/SecureMessaging.cpp index 7bb9bf30e..dd1a91e04 100644 --- a/src/card/base/pace/SecureMessaging.cpp +++ b/src/card/base/pace/SecureMessaging.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/SecureMessagingCommand.h" diff --git a/src/card/base/pace/SecureMessaging.h b/src/card/base/pace/SecureMessaging.h index f2f280760..042a46adc 100644 --- a/src/card/base/pace/SecureMessaging.h +++ b/src/card/base/pace/SecureMessaging.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implements TR-03110 v2 part3 --> Secure Messaging. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/SymmetricCipher.cpp b/src/card/base/pace/SymmetricCipher.cpp index 43e0f3da0..91346d2e4 100644 --- a/src/card/base/pace/SymmetricCipher.cpp +++ b/src/card/base/pace/SymmetricCipher.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/SymmetricCipher.h" diff --git a/src/card/base/pace/SymmetricCipher.h b/src/card/base/pace/SymmetricCipher.h index 02ad308f9..40c042578 100644 --- a/src/card/base/pace/SymmetricCipher.h +++ b/src/card/base/pace/SymmetricCipher.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Symmetric decryption method used for PACE. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/ec/EcUtil.cpp b/src/card/base/pace/ec/EcUtil.cpp index 5959bb644..415813b9f 100644 --- a/src/card/base/pace/ec/EcUtil.cpp +++ b/src/card/base/pace/ec/EcUtil.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "EcUtil.h" diff --git a/src/card/base/pace/ec/EcUtil.h b/src/card/base/pace/ec/EcUtil.h index 1c4c531a7..4f88085e8 100644 --- a/src/card/base/pace/ec/EcUtil.h +++ b/src/card/base/pace/ec/EcUtil.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Elliptic curve utility. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/ec/EcdhGenericMapping.cpp b/src/card/base/pace/ec/EcdhGenericMapping.cpp index 3cbab4e92..6aff2bc0a 100644 --- a/src/card/base/pace/ec/EcdhGenericMapping.cpp +++ b/src/card/base/pace/ec/EcdhGenericMapping.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/ec/EcdhGenericMapping.h" diff --git a/src/card/base/pace/ec/EcdhGenericMapping.h b/src/card/base/pace/ec/EcdhGenericMapping.h index 4d5f1d557..e8b5f2c05 100644 --- a/src/card/base/pace/ec/EcdhGenericMapping.h +++ b/src/card/base/pace/ec/EcdhGenericMapping.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pace/ec/EcdhKeyAgreement.cpp b/src/card/base/pace/ec/EcdhKeyAgreement.cpp index 72c99efa1..48899e84a 100644 --- a/src/card/base/pace/ec/EcdhKeyAgreement.cpp +++ b/src/card/base/pace/ec/EcdhKeyAgreement.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/ec/EcdhKeyAgreement.h" diff --git a/src/card/base/pace/ec/EcdhKeyAgreement.h b/src/card/base/pace/ec/EcdhKeyAgreement.h index df08dde9a..af7b9d9f4 100644 --- a/src/card/base/pace/ec/EcdhKeyAgreement.h +++ b/src/card/base/pace/ec/EcdhKeyAgreement.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pinpad/DestroyPaceChannelBuilder.cpp b/src/card/base/pinpad/DestroyPaceChannelBuilder.cpp index a6349d35a..56cae7658 100644 --- a/src/card/base/pinpad/DestroyPaceChannelBuilder.cpp +++ b/src/card/base/pinpad/DestroyPaceChannelBuilder.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "DestroyPaceChannelBuilder.h" diff --git a/src/card/base/pinpad/DestroyPaceChannelBuilder.h b/src/card/base/pinpad/DestroyPaceChannelBuilder.h index 82dc310e3..47ba9e344 100644 --- a/src/card/base/pinpad/DestroyPaceChannelBuilder.h +++ b/src/card/base/pinpad/DestroyPaceChannelBuilder.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Data object for creation of card command DestroyPACEChannel - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pinpad/EstablishPaceChannel.cpp b/src/card/base/pinpad/EstablishPaceChannel.cpp index 511d53351..8850e0326 100644 --- a/src/card/base/pinpad/EstablishPaceChannel.cpp +++ b/src/card/base/pinpad/EstablishPaceChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "EstablishPaceChannel.h" diff --git a/src/card/base/pinpad/EstablishPaceChannel.h b/src/card/base/pinpad/EstablishPaceChannel.h index e1bfa9c30..7212c0a22 100644 --- a/src/card/base/pinpad/EstablishPaceChannel.h +++ b/src/card/base/pinpad/EstablishPaceChannel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Data object for output of card command EstablishPaceChannel - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pinpad/EstablishPaceChannelOutput.cpp b/src/card/base/pinpad/EstablishPaceChannelOutput.cpp index a15ed6bce..d2e66356b 100644 --- a/src/card/base/pinpad/EstablishPaceChannelOutput.cpp +++ b/src/card/base/pinpad/EstablishPaceChannelOutput.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "EstablishPaceChannelOutput.h" diff --git a/src/card/base/pinpad/EstablishPaceChannelOutput.h b/src/card/base/pinpad/EstablishPaceChannelOutput.h index 89b232a99..bd25d51be 100644 --- a/src/card/base/pinpad/EstablishPaceChannelOutput.h +++ b/src/card/base/pinpad/EstablishPaceChannelOutput.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Data object for output of card command EstablishPaceChannel - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pinpad/LengthValue.h b/src/card/base/pinpad/LengthValue.h index 9e11656c4..bfab53abf 100644 --- a/src/card/base/pinpad/LengthValue.h +++ b/src/card/base/pinpad/LengthValue.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Functions to read and write PCSC messages with a length-value encoding. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pinpad/PinModify.cpp b/src/card/base/pinpad/PinModify.cpp index 386cb62a5..d5320bd26 100644 --- a/src/card/base/pinpad/PinModify.cpp +++ b/src/card/base/pinpad/PinModify.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PinModify.h" diff --git a/src/card/base/pinpad/PinModify.h b/src/card/base/pinpad/PinModify.h index fa6816f54..fb3d1959a 100644 --- a/src/card/base/pinpad/PinModify.h +++ b/src/card/base/pinpad/PinModify.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/base/pinpad/PinModifyOutput.cpp b/src/card/base/pinpad/PinModifyOutput.cpp index 0d06e71c8..a0f89b503 100644 --- a/src/card/base/pinpad/PinModifyOutput.cpp +++ b/src/card/base/pinpad/PinModifyOutput.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PinModifyOutput.h" diff --git a/src/card/base/pinpad/PinModifyOutput.h b/src/card/base/pinpad/PinModifyOutput.h index fb16d4957..0e21ed008 100644 --- a/src/card/base/pinpad/PinModifyOutput.h +++ b/src/card/base/pinpad/PinModifyOutput.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/drivers/DeviceListener.cpp b/src/card/drivers/DeviceListener.cpp index 64033af37..01bd1e81f 100644 --- a/src/card/drivers/DeviceListener.cpp +++ b/src/card/drivers/DeviceListener.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "DeviceListener.h" diff --git a/src/card/drivers/DeviceListener.h b/src/card/drivers/DeviceListener.h index 8cd7bc12c..d1606adbb 100644 --- a/src/card/drivers/DeviceListener.h +++ b/src/card/drivers/DeviceListener.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/drivers/ReaderDetector.cpp b/src/card/drivers/ReaderDetector.cpp index 885a2d823..2eee65953 100644 --- a/src/card/drivers/ReaderDetector.cpp +++ b/src/card/drivers/ReaderDetector.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderDetector.h" diff --git a/src/card/drivers/ReaderDetector.h b/src/card/drivers/ReaderDetector.h index 54880bed0..af1d13390 100644 --- a/src/card/drivers/ReaderDetector.h +++ b/src/card/drivers/ReaderDetector.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Interface specifying classes that can detect the attached card reader * devices on a specific platform. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/drivers/ReaderDetector_generic.cpp b/src/card/drivers/ReaderDetector_generic.cpp index 9a7c73eaa..d8ae0afa7 100644 --- a/src/card/drivers/ReaderDetector_generic.cpp +++ b/src/card/drivers/ReaderDetector_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderDetector.h" diff --git a/src/card/drivers/ReaderDetector_linux.cpp b/src/card/drivers/ReaderDetector_linux.cpp index 5c4220bc3..cc4f193fe 100644 --- a/src/card/drivers/ReaderDetector_linux.cpp +++ b/src/card/drivers/ReaderDetector_linux.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderDetector.h" diff --git a/src/card/drivers/ReaderDetector_osx.cpp b/src/card/drivers/ReaderDetector_osx.cpp index 3b9741817..9629666a7 100644 --- a/src/card/drivers/ReaderDetector_osx.cpp +++ b/src/card/drivers/ReaderDetector_osx.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderDetector.h" diff --git a/src/card/drivers/ReaderDetector_win.cpp b/src/card/drivers/ReaderDetector_win.cpp index 5732a9172..5733565a5 100644 --- a/src/card/drivers/ReaderDetector_win.cpp +++ b/src/card/drivers/ReaderDetector_win.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderDetector.h" diff --git a/src/card/nfc/NfcCard.cpp b/src/card/nfc/NfcCard.cpp index ce00ad0d3..eab0c56dc 100644 --- a/src/card/nfc/NfcCard.cpp +++ b/src/card/nfc/NfcCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "NfcCard.h" diff --git a/src/card/nfc/NfcCard.h b/src/card/nfc/NfcCard.h index 5aa51add9..e92dc846d 100644 --- a/src/card/nfc/NfcCard.h +++ b/src/card/nfc/NfcCard.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref Card for NFC. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/nfc/NfcReader.cpp b/src/card/nfc/NfcReader.cpp index f1649300c..10853f8fd 100644 --- a/src/card/nfc/NfcReader.cpp +++ b/src/card/nfc/NfcReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "NfcReader.h" @@ -97,11 +97,7 @@ void NfcReader::targetLost(QNearFieldTarget* pTarget) void NfcReader::setProgressMessage(const QString& pMessage) { - const auto& info = Env::getSingleton()->isUsedAsSDK() - ? Env::getSingleton()->getMessages().getSessionInProgress() - : pMessage; - - mNfManager.setUserInformation(info); + mNfManager.setUserInformation(pMessage); } diff --git a/src/card/nfc/NfcReader.h b/src/card/nfc/NfcReader.h index 0a8088784..658f658c7 100644 --- a/src/card/nfc/NfcReader.h +++ b/src/card/nfc/NfcReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref Reader for NFC. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/nfc/NfcReaderManagerPlugIn.cpp b/src/card/nfc/NfcReaderManagerPlugIn.cpp index 8083dad79..f874a1d0f 100644 --- a/src/card/nfc/NfcReaderManagerPlugIn.cpp +++ b/src/card/nfc/NfcReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "NfcReaderManagerPlugIn.h" diff --git a/src/card/nfc/NfcReaderManagerPlugIn.h b/src/card/nfc/NfcReaderManagerPlugIn.h index 21ae394c5..51198847a 100644 --- a/src/card/nfc/NfcReaderManagerPlugIn.h +++ b/src/card/nfc/NfcReaderManagerPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref ReaderManagerPlugIn for NFC on Android. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/pcsc/PcscCard.cpp b/src/card/pcsc/PcscCard.cpp index 5907d9f8f..9eb45dd7b 100644 --- a/src/card/pcsc/PcscCard.cpp +++ b/src/card/pcsc/PcscCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscCard.h" diff --git a/src/card/pcsc/PcscCard.h b/src/card/pcsc/PcscCard.h index 1a11f19a8..e7d17432b 100644 --- a/src/card/pcsc/PcscCard.h +++ b/src/card/pcsc/PcscCard.h @@ -1,7 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of card object for PC/SC * * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/pcsc/PcscReader.cpp b/src/card/pcsc/PcscReader.cpp index 4f211a343..2fc096812 100644 --- a/src/card/pcsc/PcscReader.cpp +++ b/src/card/pcsc/PcscReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscCard.h" diff --git a/src/card/pcsc/PcscReader.h b/src/card/pcsc/PcscReader.h index 257712c6d..85af8313b 100644 --- a/src/card/pcsc/PcscReader.h +++ b/src/card/pcsc/PcscReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref Reader for PCSC. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/pcsc/PcscReaderFeature.cpp b/src/card/pcsc/PcscReaderFeature.cpp index 80c66b070..994d467d0 100644 --- a/src/card/pcsc/PcscReaderFeature.cpp +++ b/src/card/pcsc/PcscReaderFeature.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscReaderFeature.h" diff --git a/src/card/pcsc/PcscReaderFeature.h b/src/card/pcsc/PcscReaderFeature.h index 57d08148d..d6bdc10ac 100644 --- a/src/card/pcsc/PcscReaderFeature.h +++ b/src/card/pcsc/PcscReaderFeature.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/pcsc/PcscReaderManagerPlugIn.cpp b/src/card/pcsc/PcscReaderManagerPlugIn.cpp index fb0a60f8f..5928495f3 100644 --- a/src/card/pcsc/PcscReaderManagerPlugIn.cpp +++ b/src/card/pcsc/PcscReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscReaderManagerPlugIn.h" diff --git a/src/card/pcsc/PcscReaderManagerPlugIn.h b/src/card/pcsc/PcscReaderManagerPlugIn.h index 999ea2b84..b69a5c39d 100644 --- a/src/card/pcsc/PcscReaderManagerPlugIn.h +++ b/src/card/pcsc/PcscReaderManagerPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref ReaderManagerPlugIn for PCSC. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/pcsc/PcscUtils.cpp b/src/card/pcsc/PcscUtils.cpp index a8da4e3f8..ab06abe17 100644 --- a/src/card/pcsc/PcscUtils.cpp +++ b/src/card/pcsc/PcscUtils.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscUtils.h" diff --git a/src/card/pcsc/PcscUtils.h b/src/card/pcsc/PcscUtils.h index 929936279..992156aca 100644 --- a/src/card/pcsc/PcscUtils.h +++ b/src/card/pcsc/PcscUtils.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief toString method for PCSC_RETURNCODE and platform dependent * typedefs for PCSC types. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/simulator/SimulatorCard.cpp b/src/card/simulator/SimulatorCard.cpp index 60853b85b..98a6707c1 100644 --- a/src/card/simulator/SimulatorCard.cpp +++ b/src/card/simulator/SimulatorCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SimulatorCard.h" diff --git a/src/card/simulator/SimulatorCard.h b/src/card/simulator/SimulatorCard.h index 54462521c..4331aa3be 100644 --- a/src/card/simulator/SimulatorCard.h +++ b/src/card/simulator/SimulatorCard.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Simulator. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/simulator/SimulatorFileSystem.cpp b/src/card/simulator/SimulatorFileSystem.cpp index 1950c31cc..57063e4ed 100644 --- a/src/card/simulator/SimulatorFileSystem.cpp +++ b/src/card/simulator/SimulatorFileSystem.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SimulatorFileSystem.h" diff --git a/src/card/simulator/SimulatorFileSystem.h b/src/card/simulator/SimulatorFileSystem.h index 04c49b0e7..efd84a98f 100644 --- a/src/card/simulator/SimulatorFileSystem.h +++ b/src/card/simulator/SimulatorFileSystem.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Simulator. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/simulator/SimulatorReader.cpp b/src/card/simulator/SimulatorReader.cpp index ea2c9673a..3d4889f7f 100644 --- a/src/card/simulator/SimulatorReader.cpp +++ b/src/card/simulator/SimulatorReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SimulatorReader.h" diff --git a/src/card/simulator/SimulatorReader.h b/src/card/simulator/SimulatorReader.h index 41a160485..f5786e94d 100644 --- a/src/card/simulator/SimulatorReader.h +++ b/src/card/simulator/SimulatorReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Reader for Simulator. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/simulator/SimulatorReaderManagerPlugIn.cpp b/src/card/simulator/SimulatorReaderManagerPlugIn.cpp index 1479682c9..43afb959a 100644 --- a/src/card/simulator/SimulatorReaderManagerPlugIn.cpp +++ b/src/card/simulator/SimulatorReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SimulatorReaderManagerPlugIn.h" diff --git a/src/card/simulator/SimulatorReaderManagerPlugIn.h b/src/card/simulator/SimulatorReaderManagerPlugIn.h index 2e5bef088..62138a6eb 100644 --- a/src/card/simulator/SimulatorReaderManagerPlugIn.h +++ b/src/card/simulator/SimulatorReaderManagerPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of ReaderManagerPlugIn for Simulator. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/smart/SmartCard.cpp b/src/card/smart/SmartCard.cpp index f11764b17..1e3981746 100644 --- a/src/card/smart/SmartCard.cpp +++ b/src/card/smart/SmartCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartCard.h" diff --git a/src/card/smart/SmartCard.h b/src/card/smart/SmartCard.h index e43a205af..2abb6100e 100644 --- a/src/card/smart/SmartCard.h +++ b/src/card/smart/SmartCard.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Smart-eID card - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/smart/SmartManager.cpp b/src/card/smart/SmartManager.cpp index 2f333e5ca..06e7bcb14 100644 --- a/src/card/smart/SmartManager.cpp +++ b/src/card/smart/SmartManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartManager.h" diff --git a/src/card/smart/SmartManager.h b/src/card/smart/SmartManager.h index e32ce6e92..0fecde10a 100644 --- a/src/card/smart/SmartManager.h +++ b/src/card/smart/SmartManager.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Wrapper for calls to eID applet interface - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/smart/SmartReader.cpp b/src/card/smart/SmartReader.cpp index 4ab6018b0..6808550f2 100644 --- a/src/card/smart/SmartReader.cpp +++ b/src/card/smart/SmartReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartReader.h" diff --git a/src/card/smart/SmartReader.h b/src/card/smart/SmartReader.h index 7dca568cc..7cfc42ff4 100644 --- a/src/card/smart/SmartReader.h +++ b/src/card/smart/SmartReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of Reader for Smart-eID card. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/card/smart/SmartReaderManagerPlugIn.cpp b/src/card/smart/SmartReaderManagerPlugIn.cpp index 58b610a4f..1d375a765 100644 --- a/src/card/smart/SmartReaderManagerPlugIn.cpp +++ b/src/card/smart/SmartReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartReaderManagerPlugIn.h" diff --git a/src/card/smart/SmartReaderManagerPlugIn.h b/src/card/smart/SmartReaderManagerPlugIn.h index b8ab6bb5e..273a4d89c 100644 --- a/src/card/smart/SmartReaderManagerPlugIn.h +++ b/src/card/smart/SmartReaderManagerPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of ReaderManagerPlugIn for Smart-eID card. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/CallCost.cpp b/src/configuration/CallCost.cpp index 09b67b617..fc7c62ffd 100644 --- a/src/configuration/CallCost.cpp +++ b/src/configuration/CallCost.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "CallCost.h" diff --git a/src/configuration/CallCost.h b/src/configuration/CallCost.h index 23501b3b8..4055c2e49 100644 --- a/src/configuration/CallCost.h +++ b/src/configuration/CallCost.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Phone call cost representation - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/LanguageString.cpp b/src/configuration/LanguageString.cpp index f3f48d0af..78f9a566c 100644 --- a/src/configuration/LanguageString.cpp +++ b/src/configuration/LanguageString.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "LanguageString.h" diff --git a/src/configuration/LanguageString.h b/src/configuration/LanguageString.h index 8cc1f6805..43203cdb5 100644 --- a/src/configuration/LanguageString.h +++ b/src/configuration/LanguageString.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ProviderConfiguration.cpp b/src/configuration/ProviderConfiguration.cpp index 0a65923b6..d923f1b87 100644 --- a/src/configuration/ProviderConfiguration.cpp +++ b/src/configuration/ProviderConfiguration.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderConfiguration.h" diff --git a/src/configuration/ProviderConfiguration.h b/src/configuration/ProviderConfiguration.h index 3f89bd920..227302ac2 100644 --- a/src/configuration/ProviderConfiguration.h +++ b/src/configuration/ProviderConfiguration.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provides information of provider json. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ProviderConfigurationInfo.cpp b/src/configuration/ProviderConfigurationInfo.cpp index 3be740cc0..590f77904 100644 --- a/src/configuration/ProviderConfigurationInfo.cpp +++ b/src/configuration/ProviderConfigurationInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderConfigurationInfo.h" diff --git a/src/configuration/ProviderConfigurationInfo.h b/src/configuration/ProviderConfigurationInfo.h index 8e21e04c9..c7d74973f 100644 --- a/src/configuration/ProviderConfigurationInfo.h +++ b/src/configuration/ProviderConfigurationInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to provide information about providers. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ProviderConfigurationParser.cpp b/src/configuration/ProviderConfigurationParser.cpp index fc3c687e2..647b20878 100644 --- a/src/configuration/ProviderConfigurationParser.cpp +++ b/src/configuration/ProviderConfigurationParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderConfigurationParser.h" diff --git a/src/configuration/ProviderConfigurationParser.h b/src/configuration/ProviderConfigurationParser.h index 9e43617c4..0d0b0d17b 100644 --- a/src/configuration/ProviderConfigurationParser.h +++ b/src/configuration/ProviderConfigurationParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parser for provider configuration files - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ReaderConfiguration.cpp b/src/configuration/ReaderConfiguration.cpp index f792a8b18..01e44302d 100644 --- a/src/configuration/ReaderConfiguration.cpp +++ b/src/configuration/ReaderConfiguration.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderConfiguration.h" diff --git a/src/configuration/ReaderConfiguration.h b/src/configuration/ReaderConfiguration.h index c9acabb6f..274db1d85 100644 --- a/src/configuration/ReaderConfiguration.h +++ b/src/configuration/ReaderConfiguration.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to store configuration data about available card readers. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ReaderConfigurationInfo.cpp b/src/configuration/ReaderConfigurationInfo.cpp index f90fd33c3..51471f4f9 100644 --- a/src/configuration/ReaderConfigurationInfo.cpp +++ b/src/configuration/ReaderConfigurationInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderConfigurationInfo.h" diff --git a/src/configuration/ReaderConfigurationInfo.h b/src/configuration/ReaderConfigurationInfo.h index 3754da58b..4887f016e 100644 --- a/src/configuration/ReaderConfigurationInfo.h +++ b/src/configuration/ReaderConfigurationInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to provide information about available card readers. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ReaderConfigurationParser.cpp b/src/configuration/ReaderConfigurationParser.cpp index e1c430ad5..e81f9be64 100644 --- a/src/configuration/ReaderConfigurationParser.cpp +++ b/src/configuration/ReaderConfigurationParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderConfigurationParser.h" diff --git a/src/configuration/ReaderConfigurationParser.h b/src/configuration/ReaderConfigurationParser.h index 5fecd2867..9cb73b581 100644 --- a/src/configuration/ReaderConfigurationParser.h +++ b/src/configuration/ReaderConfigurationParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parser for reader configuration files - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ReleaseInformation.cpp b/src/configuration/ReleaseInformation.cpp index 2f13da358..411f88fcc 100644 --- a/src/configuration/ReleaseInformation.cpp +++ b/src/configuration/ReleaseInformation.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ReleaseInformation.h" diff --git a/src/configuration/ReleaseInformation.h b/src/configuration/ReleaseInformation.h index 53de37b60..fd2671070 100644 --- a/src/configuration/ReleaseInformation.h +++ b/src/configuration/ReleaseInformation.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provides information about the App release - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/configuration/ReleaseInformationConfiguration.cpp b/src/configuration/ReleaseInformationConfiguration.cpp index 3a496b191..09405eb9b 100644 --- a/src/configuration/ReleaseInformationConfiguration.cpp +++ b/src/configuration/ReleaseInformationConfiguration.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ReleaseInformationConfiguration.h" diff --git a/src/configuration/ReleaseInformationConfiguration.h b/src/configuration/ReleaseInformationConfiguration.h index 80c9e9407..3ac5bfa51 100644 --- a/src/configuration/ReleaseInformationConfiguration.h +++ b/src/configuration/ReleaseInformationConfiguration.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Handles updating information about the App release - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/core/controller/AppController.cpp b/src/core/controller/AppController.cpp index c94ae923a..aabb35b93 100644 --- a/src/core/controller/AppController.cpp +++ b/src/core/controller/AppController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AppController.h" @@ -156,6 +156,10 @@ void AppController::start() connect(readerManager, &ReaderManager::fireInitialized, this, &AppController::fireStarted, Qt::QueuedConnection); readerManager->init(); } + else + { + connect(this, &AppController::fireInitialized, this, &AppController::fireStarted, Qt::QueuedConnection); + } connect(this, &AppController::fireStarted, this, [this] { if (cShowUi) diff --git a/src/core/controller/AppController.h b/src/core/controller/AppController.h index e99b7920c..a54552a67 100644 --- a/src/core/controller/AppController.h +++ b/src/core/controller/AppController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller of the whole program. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/ContentItem.h b/src/diagnosis/ContentItem.h index 47e54255f..0bdf80f7c 100644 --- a/src/diagnosis/ContentItem.h +++ b/src/diagnosis/ContentItem.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -11,15 +11,23 @@ namespace governikus struct ContentItem { - ContentItem(const QString& pTitle, const QString& pContent) + QString mTitle; + QString mContent; + + + explicit ContentItem(const QString& pTitle = QString(), const QString& pContent = QString()) : mTitle(pTitle) , mContent(pContent) { } - QString mTitle; - QString mContent; + bool operator==(const ContentItem& pOther) const + { + return mTitle == pOther.mTitle && mContent == pOther.mContent; + } + + }; } // namespace governikus diff --git a/src/diagnosis/DiagnosisAntivirusDetection.cpp b/src/diagnosis/DiagnosisAntivirusDetection.cpp index 7bfa97607..4883c22a2 100644 --- a/src/diagnosis/DiagnosisAntivirusDetection.cpp +++ b/src/diagnosis/DiagnosisAntivirusDetection.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisAntivirusDetection.h" diff --git a/src/diagnosis/DiagnosisAntivirusDetection.h b/src/diagnosis/DiagnosisAntivirusDetection.h index 3a6332d8c..3070927ba 100644 --- a/src/diagnosis/DiagnosisAntivirusDetection.h +++ b/src/diagnosis/DiagnosisAntivirusDetection.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class for retrieving information about installed antivirus software on windows. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/DiagnosisConnectionTest.cpp b/src/diagnosis/DiagnosisConnectionTest.cpp index fcf16d799..b4f1be915 100644 --- a/src/diagnosis/DiagnosisConnectionTest.cpp +++ b/src/diagnosis/DiagnosisConnectionTest.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisConnectionTest.h" diff --git a/src/diagnosis/DiagnosisConnectionTest.h b/src/diagnosis/DiagnosisConnectionTest.h index 0d4bc29bb..725ff34c6 100644 --- a/src/diagnosis/DiagnosisConnectionTest.h +++ b/src/diagnosis/DiagnosisConnectionTest.h @@ -1,9 +1,11 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class for retrieving information about the system proxy, pinging the proxy, trying * to establish a connection to a test server with and without the proxy and providing the * results to the DiagnosisModel. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/DiagnosisFirewallDetection.cpp b/src/diagnosis/DiagnosisFirewallDetection.cpp index 38ef05388..7436515e7 100644 --- a/src/diagnosis/DiagnosisFirewallDetection.cpp +++ b/src/diagnosis/DiagnosisFirewallDetection.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisFirewallDetection.h" @@ -157,7 +157,7 @@ void DiagnosisFirewallDetection::parseFirewallProfileInfos(const QString& pFirew bool enabled = false; const auto& lines = pFirewallProfileInfos.split(QLatin1Char('\n')); - for (auto line : lines) + for (const auto& line : lines) { const QString& trimmedLine = line.trimmed(); if (trimmedLine.isEmpty() && !name.isEmpty()) @@ -308,6 +308,9 @@ DiagnosisFirewallDetection::DiagnosisFirewallDetection() void DiagnosisFirewallDetection::startDetection() { #if defined(Q_OS_WIN) + mDetectedFirewalls.clear(); + mFirewallProfiles.clear(); + QString powershellCommand = QStandardPaths::findExecutable(QStringLiteral("powershell.exe")); if (powershellCommand.isEmpty()) { diff --git a/src/diagnosis/DiagnosisFirewallDetection.h b/src/diagnosis/DiagnosisFirewallDetection.h index e203b9cb0..c1402a99a 100644 --- a/src/diagnosis/DiagnosisFirewallDetection.h +++ b/src/diagnosis/DiagnosisFirewallDetection.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/DiagnosisModel.cpp b/src/diagnosis/DiagnosisModel.cpp index 1db5bbc65..bb2f13a68 100644 --- a/src/diagnosis/DiagnosisModel.cpp +++ b/src/diagnosis/DiagnosisModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisModel.h" @@ -7,24 +7,49 @@ #include "AppSettings.h" #include "BuildHelper.h" #include "Env.h" +#include "HttpServer.h" #include "LanguageLoader.h" #include "RemoteServiceSettings.h" #include +#include using namespace governikus; DiagnosisModel::DiagnosisModel(const QSharedPointer& pContext) - : mContext(pContext) - , mAntivirusSectionRunning(false) - , mFirewallSectionRunning(false) + : mSections() + , mContext(pContext) + , mAusweisApp2Section() + , mTimestampSection() + , mRemoteDeviceSectionRunning(false) + , mRemoteDeviceSection() , mCardReaderSectionRunning(false) + , mCardReaderSection() , mPcscSectionRunning(false) - , mRemoteDeviceSectionRunning(false) + , mPcscSection() + , mConnectionTest() + , mNetworkConnectionSection() + , mNetworkInterfaceSection() + , mAntivirusSectionRunning(false) + , mAntivirusDetection() + , mAntivirusSection() + , mFirewallSectionRunning(false) + , mFirewallDetection() + , mFirewallSection() { - reloadContent(); + mSections[Section::GENERAL].reset(new SectionModel()); + QQmlEngine::setObjectOwnership(mSections[Section::GENERAL].data(), QQmlEngine::CppOwnership); + + mSections[Section::READER].reset(new SectionModel()); + QQmlEngine::setObjectOwnership(mSections[Section::READER].data(), QQmlEngine::CppOwnership); + + mSections[Section::NETWORK].reset(new SectionModel()); + QQmlEngine::setObjectOwnership(mSections[Section::NETWORK].data(), QQmlEngine::CppOwnership); + + mSections[Section::SECURITY].reset(new SectionModel()); + QQmlEngine::setObjectOwnership(mSections[Section::SECURITY].data(), QQmlEngine::CppOwnership); } @@ -34,84 +59,134 @@ DiagnosisModel::~DiagnosisModel() } -QSharedPointer DiagnosisModel::createAusweisApp2Section() +QString DiagnosisModel::getSectionName(Section pSection) const { - QSharedPointer aa2Section(new SectionModel()); + switch (pSection) + { + case Section::GENERAL: + return QCoreApplication::applicationName(); + + case Section::READER: + //: LABEL DESKTOP + return tr("Card reader"); + + case Section::NETWORK: + //: LABEL DESKTOP + return tr("Network"); + + case Section::SECURITY: + //: LABEL DESKTOP + return tr("Antivirus and firewall"); + } + + Q_UNREACHABLE(); +} - BuildHelper::processInformationHeader([aa2Section](const QString& pKey, const QString& pValue){ - aa2Section->addItem(pKey, pValue); + +void DiagnosisModel::initGeneralSections() +{ + mAusweisApp2Section.clear(); + BuildHelper::processInformationHeader([this](const QString& pKey, const QString& pValue){ + mAusweisApp2Section << ContentItem(pKey, pValue); }); //: LABEL DESKTOP const auto& title = tr("Time of diagnosis"); //: LABEL DESKTOP const auto& content = tr("Initial diagnosis running, please wait."); + mTimestampSection << ContentItem(title, content); +} + + +void DiagnosisModel::updateGeneralSection() +{ + mSections[Section::GENERAL]->removeAllItems(); + mSections[Section::GENERAL]->addContent(mAusweisApp2Section); + mSections[Section::GENERAL]->addContent(mTimestampSection); +} - mTimestampItem = QSharedPointer::create(title, content); - aa2Section->addItem(mTimestampItem); - return aa2Section; +void DiagnosisModel::initNetworkSections() +{ + mSections[Section::NETWORK]->removeAllItems(); + mNetworkInterfaceSection.clear(); + mNetworkConnectionSection.clear(); } -void DiagnosisModel::createNetworkSection() +void DiagnosisModel::updateNetworkSection(bool pUpdateTimestamp) { - mNetworkInterfaceSection = QSharedPointer::create(); - mNetworkConnectionSection = QSharedPointer::create(); - mCombinedNetworkSection = QSharedPointer::create(); + mSections[Section::NETWORK]->removeAllItems(); + mSections[Section::NETWORK]->addContent(mNetworkConnectionSection); + mSections[Section::NETWORK]->addContent(mNetworkInterfaceSection); + if (pUpdateTimestamp) + { + mContext->setTimestamp(QDateTime::currentDateTime()); + } } -void DiagnosisModel::createCardReaderSection() +void DiagnosisModel::initCardReaderSections() { - mCombinedReaderSection = QSharedPointer::create(); - mPcscSection = QSharedPointer::create(); + mPcscSection.clear(); //: LABEL DESKTOP - mPcscSection->addTitleWithoutContent(tr("PC/SC driver information")); + mPcscSection << ContentItem(tr("PC/SC driver information")); //: LABEL DESKTOP - mPcscSection->addItemWithoutTitle(tr("Diagnosis is running...")); + mPcscSection << ContentItem(QString(), tr("Diagnosis is running...")); mPcscSectionRunning = true; - mCardReaderSection = QSharedPointer::create(); + mCardReaderSection.clear(); //: LABEL DESKTOP - mCardReaderSection->addTitleWithoutContent(tr("Card reader")); + mCardReaderSection << ContentItem(tr("Card reader")); //: LABEL DESKTOP - mCardReaderSection->addItemWithoutTitle(tr("Diagnosis is running...")); + mCardReaderSection << ContentItem(QString(), tr("Diagnosis is running...")); mCardReaderSectionRunning = true; - mRemoteDeviceSection = QSharedPointer::create(); + mRemoteDeviceSection.clear(); //: LABEL DESKTOP - mRemoteDeviceSection->addTitleWithoutContent(tr("Paired smartphones")); + mRemoteDeviceSection << ContentItem(tr("Paired smartphones")); //: LABEL DESKTOP - mRemoteDeviceSection->addItemWithoutTitle(tr("Diagnosis is running...")); + mRemoteDeviceSection << ContentItem(QString(), tr("Diagnosis is running...")); mRemoteDeviceSectionRunning = true; Q_EMIT fireRunningChanged(); } -void DiagnosisModel::createAntiVirusAndFirewallSection() +void DiagnosisModel::updateCardReaderSection(bool pUpdateTimestamp) { - mAntivirusSection = QSharedPointer::create(); - mFirewallSection = QSharedPointer::create(); - mCombinedAntivirusFirewallSection = QSharedPointer::create(); + mSections[Section::READER]->removeAllItems(); + mSections[Section::READER]->addContent(mRemoteDeviceSection); + mSections[Section::READER]->addContent(mCardReaderSection); + mSections[Section::READER]->addContent(mPcscSection); + if (pUpdateTimestamp) + { + mContext->setTimestamp(QDateTime::currentDateTime()); + } +} + + +void DiagnosisModel::initAntiVirusAndFirewallSection() +{ + mSections[Section::SECURITY]->removeAllItems(); + mAntivirusSection.clear(); + mFirewallSection.clear(); //: LABEL DESKTOP - mAntivirusSection->addTitleWithoutContent(tr("Antivirus information")); + mAntivirusSection << ContentItem(tr("Antivirus information")); #ifdef Q_OS_WIN - //: LABEL DESKTOP - mAntivirusSection->addItemWithoutTitle(tr("Diagnosis is running...")); + mAntivirusSection << ContentItem(QString(), tr("Diagnosis is running...")); mAntivirusSectionRunning = true; #else //: LABEL DESKTOP - mAntivirusSection->addItemWithoutTitle(tr("No Antivirus information available on this platform.")); + mAntivirusSection << ContentItem(QString(), tr("No Antivirus information available on this platform.")); #endif //: LABEL DESKTOP - mFirewallSection->addTitleWithoutContent(tr("Firewall information")); + mFirewallSection << ContentItem(tr("Firewall information")); #ifdef Q_OS_WIN //: LABEL DESKTOP - mFirewallSection->addItemWithoutTitle(tr("Diagnosis is running...")); + mFirewallSection << ContentItem(QString(), tr("Diagnosis is running...")); mFirewallSectionRunning = true; #else //: LABEL DESKTOP - mFirewallSection->addItemWithoutTitle(tr("No Firewall information available on this platform.")); + mFirewallSection << ContentItem(QString(), tr("No Firewall information available on this platform.")); #endif #ifdef Q_OS_WIN @@ -120,6 +195,18 @@ void DiagnosisModel::createAntiVirusAndFirewallSection() } +void DiagnosisModel::updateAntiVirusAndFirewallSection(bool pUpdateTimestamp) +{ + mSections[Section::SECURITY]->removeAllItems(); + mSections[Section::SECURITY]->addContent(mAntivirusSection); + mSections[Section::SECURITY]->addContent(mFirewallSection); + if (pUpdateTimestamp) + { + mContext->setTimestamp(QDateTime::currentDateTime()); + } +} + + void DiagnosisModel::connectSignals() { connect(mContext.data(), &DiagnosisContext::timestampChanged, this, &DiagnosisModel::onTimestampChanged); @@ -141,7 +228,6 @@ void DiagnosisModel::connectSignals() void DiagnosisModel::disconnectSignals() { - disconnect(mContext.data(), &DiagnosisContext::timestampChanged, this, &DiagnosisModel::onTimestampChanged); disconnect(mContext.data(), &DiagnosisContext::fireNetworkInfoChanged, this, &DiagnosisModel::onNetworkInfoChanged); disconnect(&mConnectionTest, &DiagnosisConnectionTest::fireConnectionTestDone, this, &DiagnosisModel::onConnectionTestDone); @@ -174,8 +260,8 @@ QString DiagnosisModel::boolToString(bool pBoolean) const QVariant DiagnosisModel::data(const QModelIndex& pIndex, int pRole) const { - const int row = pIndex.row(); - if (!pIndex.isValid() || row >= mSections.size()) + const auto section = static_cast
(pIndex.row()); + if (!pIndex.isValid() || !mSections.contains(section)) { return QVariant(); } @@ -183,10 +269,10 @@ QVariant DiagnosisModel::data(const QModelIndex& pIndex, int pRole) const switch (pRole) { case Qt::DisplayRole: - return mSections.at(row).first; + return getSectionName(section); case ContentRole: - return QVariant::fromValue(mSections.at(row).second); + return QVariant::fromValue(mSections[section]); default: return QVariant(); @@ -227,10 +313,12 @@ QString DiagnosisModel::getAsPlaintext() const #endif QStringList modelPlaintext; - for (const auto& sectionPair : std::as_const(mSections)) + + const auto& sections = mSections.keys(); + for (const auto& section : sections) { - modelPlaintext << sectionPair.first; - modelPlaintext << sectionPair.second->getAsPlaintext(); + modelPlaintext << getSectionName(section); + modelPlaintext << mSections[section]->getAsPlaintext(); modelPlaintext << endl; } @@ -246,26 +334,32 @@ bool DiagnosisModel::isRunning() const void DiagnosisModel::onTimestampChanged() { + mTimestampSection.clear(); + QDateTime timestampValue = mContext->getTimestamp(); - if (!timestampValue.isValid()) + if (timestampValue.isValid()) { + //: LABEL DESKTOP Timestamp, formatted according to the selected language + QString timestamp = LanguageLoader::getInstance().getUsedLocale().toString(timestampValue, tr("d. MMMM yyyy, hh:mm:ss AP")); //: LABEL DESKTOP - mTimestampItem->mContent = tr("Failed to retrieve date & time"); + mTimestampSection << ContentItem(tr("Time of diagnosis"), timestamp); } else { - //: LABEL DESKTOP Timestamp, formatted according to the selected language - QString timestamp = LanguageLoader::getInstance().getUsedLocale().toString(timestampValue, tr("d. MMMM yyyy, hh:mm:ss AP")); - mTimestampItem->mContent = timestamp; + //: LABEL DESKTOP + const auto& title = tr("Time of diagnosis"); + //: LABEL DESKTOP + const auto& content = tr("Failed to retrieve date & time"); + mTimestampSection << ContentItem(title, content); } - mSections.at(0).second->emitDataChangedForItem(mTimestampItem); + updateGeneralSection(); } void DiagnosisModel::onNetworkInfoChanged() { - mNetworkInterfaceSection->removeAllItems(); + mNetworkInterfaceSection.clear(); const auto& networkInterfaces = mContext->getNetworkInterfaces(); for (const auto& iface : networkInterfaces) @@ -281,7 +375,7 @@ void DiagnosisModel::onNetworkInfoChanged() { //: LABEL DESKTOP Interface has no IP addresses assigned interfaceInfos << tr("No IP addresses assigned"); - mNetworkInterfaceSection->addItem(iface.humanReadableName(), interfaceInfos.join(QLatin1Char('\n'))); + mNetworkInterfaceSection << ContentItem(iface.humanReadableName(), interfaceInfos.join(QLatin1Char('\n'))); continue; } @@ -304,18 +398,25 @@ void DiagnosisModel::onNetworkInfoChanged() interfaceInfos << tr("Unknown address: %1").arg(ip.toString()); } } - - mNetworkInterfaceSection->addItem(iface.humanReadableName(), interfaceInfos.join(QLatin1Char('\n'))); + mNetworkInterfaceSection << ContentItem(iface.humanReadableName(), interfaceInfos.join(QLatin1Char('\n'))); } - mCombinedNetworkSection->replaceWithSections({mNetworkConnectionSection, mNetworkInterfaceSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + updateNetworkSection(); } void DiagnosisModel::onConnectionTestDone() { - mNetworkConnectionSection->removeAllItems(); + mNetworkConnectionSection.clear(); + + const auto& server = Env::getShared(false); + + mNetworkConnectionSection << ContentItem( + //: LABEL DESKTOP + tr("Service addresses"), + //: LABEL DESKTOP + server ? server->boundAddresses().join(QLatin1Char('\n')) : tr("Not bound")); + QStringList proxyInfo; if (mConnectionTest.getIsProxySet()) @@ -369,15 +470,15 @@ void DiagnosisModel::onConnectionTestDone() } //: LABEL DESKTOP - mNetworkConnectionSection->addItem(tr("Proxy information"), proxyInfo.join(QLatin1Char('\n'))); - mCombinedNetworkSection->replaceWithSections({mNetworkConnectionSection, mNetworkInterfaceSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + mNetworkConnectionSection << ContentItem(tr("Proxy information"), proxyInfo.join(QLatin1Char('\n'))); + + updateNetworkSection(); } void DiagnosisModel::onAntivirusInformationChanged() { - mAntivirusSection->removeAllItems(); + mAntivirusSection.clear(); mAntivirusSectionRunning = false; const auto& antivirusInfos = mAntivirusDetection.getAntivirusInformations(); @@ -387,12 +488,12 @@ void DiagnosisModel::onAntivirusInformationChanged() const auto& title = tr("Antivirus information"); //: LABEL DESKTOP const auto& content = tr("No Antivirus software detected."); - mAntivirusSection->addItem(title, content); + mAntivirusSection << ContentItem(title, content); } else { //: LABEL DESKTOP - mAntivirusSection->addTitleWithoutContent(tr("Antivirus information")); + mAntivirusSection << ContentItem(tr("Antivirus information")); for (const auto& info : antivirusInfos) { @@ -405,37 +506,36 @@ void DiagnosisModel::onAntivirusInformationChanged() //: LABEL DESKTOP avInfo << tr("Executable path: %1").arg(info->getExePath()); auto antivirusName = info->getDisplayName(); - mAntivirusSection->addItem(antivirusName, avInfo.join(QLatin1Char('\n'))); + mAntivirusSection << ContentItem(antivirusName, avInfo.join(QLatin1Char('\n'))); } } - mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + updateAntiVirusAndFirewallSection(); Q_EMIT fireRunningChanged(); } void DiagnosisModel::onAntivirusDetectionFailed() { - mAntivirusSection->removeAllItems(); + mAntivirusSection.clear(); //: LABEL DESKTOP const auto& title = tr("Antivirus information"); //: LABEL DESKTOP const auto& content = tr("Antivirus detection failed."); - mAntivirusSection->addItem(title, content); - mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + mAntivirusSection << ContentItem(title, content); + + updateAntiVirusAndFirewallSection(); } void DiagnosisModel::onFirewallInformationReady() { - mFirewallSection->removeAllItems(); + mFirewallSection.clear(); mFirewallSectionRunning = false; //: LABEL DESKTOP - mFirewallSection->addTitleWithoutContent(tr("Firewall information")); + mFirewallSection << ContentItem(tr("Firewall information")); auto installedFirewalls = mFirewallDetection.getDetectedFirewalls(); if (installedFirewalls.isEmpty()) { @@ -443,7 +543,7 @@ void DiagnosisModel::onFirewallInformationReady() if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8) { //: LABEL DESKTOP - mFirewallSection->addItemWithoutTitle(tr("Third party firewalls cannot be detected on Windows 7.")); + mFirewallSection << ContentItem(QString(), tr("Third party firewalls cannot be detected on Windows 7.")); } else { @@ -451,7 +551,7 @@ void DiagnosisModel::onFirewallInformationReady() { #endif //: LABEL DESKTOP - mFirewallSection->addItemWithoutTitle(tr("No third party firewalls detected")); + mFirewallSection << ContentItem(QString(), tr("No third party firewalls detected")); } } else @@ -469,7 +569,7 @@ void DiagnosisModel::onFirewallInformationReady() firewallInfos << tr("Up to date: %1").arg(uptodate); } //: LABEL DESKTOP - mFirewallSection->addItem(tr("Firewalls from third party vendors"), firewallInfos.join(QLatin1Char('\n'))); + mFirewallSection << ContentItem(tr("Firewalls from third party vendors"), firewallInfos.join(QLatin1Char('\n'))); } QStringList windowsFirewallSettings; @@ -492,7 +592,7 @@ void DiagnosisModel::onFirewallInformationReady() windowsFirewallSettings << tr("Enabled: %1").arg(secondRuleEnabled); //: LABEL DESKTOP - mFirewallSection->addItem(tr("Windows firewall rules"), windowsFirewallSettings.join(QLatin1Char('\n'))); + mFirewallSection << ContentItem(tr("Windows firewall rules"), windowsFirewallSettings.join(QLatin1Char('\n'))); QStringList windowsFirewallProfiles; auto firewallProfiles = mFirewallDetection.getFirewallProfiles(); @@ -500,41 +600,49 @@ void DiagnosisModel::onFirewallInformationReady() { windowsFirewallProfiles << profile->getName(); QString enabled = boolToString(profile->getEnabled()); - //: LABEL DESKTOP windowsFirewallProfiles << tr("Enabled: %1").arg(enabled); + //: LABEL DESKTOP } - //: LABEL DESKTOP - mFirewallSection->addItem(tr("Windows firewall profiles"), windowsFirewallProfiles.join(QLatin1Char('\n'))); + if (windowsFirewallProfiles.isEmpty()) + { + //: LABEL DESKTOP + mFirewallSection << ContentItem(tr("Windows firewall profiles"), tr("Diagnosis is running...")); + } + else + { + //: LABEL DESKTOP + mFirewallSection << ContentItem(tr("Windows firewall profiles"), windowsFirewallProfiles.join(QLatin1Char('\n'))); + } - mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + updateAntiVirusAndFirewallSection(); Q_EMIT fireRunningChanged(); } void DiagnosisModel::onFirewallInformationFailed() { - mFirewallSection->removeAllItems(); + mFirewallSection.clear(); + //: LABEL DESKTOP const auto& title = tr("Firewall information"); //: LABEL DESKTOP const auto& content = tr("An error occurred while trying to gather firewall information. Please check the log for more information."); - mFirewallSection->addItem(title, content); - mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + mFirewallSection << ContentItem(title, content); + + updateAntiVirusAndFirewallSection(); } void DiagnosisModel::onPcscInfoChanged() { - mPcscSection->removeAllItems(); + mPcscSection.clear(); mPcscSectionRunning = false; //: LABEL DESKTOP - mPcscSection->addTitleWithoutContent(tr("PC/SC information")); + mPcscSection << ContentItem(tr("PC/SC information")); //: LABEL DESKTOP - mPcscSection->addItem(tr("Version"), mContext->getPcscVersion()); + mPcscSection << ContentItem(tr("Version"), mContext->getPcscVersion()); QStringList pcscInfo; for (const auto& info : mContext->getPcscComponents()) @@ -550,7 +658,7 @@ void DiagnosisModel::onPcscInfoChanged() if (!pcscInfo.empty()) { //: LABEL DESKTOP - mPcscSection->addItem(tr("Components"), pcscInfo.join(QLatin1Char('\n'))); + mPcscSection << ContentItem(tr("Components"), pcscInfo.join(QLatin1Char('\n'))); } pcscInfo.clear(); @@ -567,35 +675,33 @@ void DiagnosisModel::onPcscInfoChanged() if (!pcscInfo.empty()) { //: LABEL DESKTOP - mPcscSection->addItem(tr("Driver"), pcscInfo.join(QLatin1Char('\n'))); + mPcscSection << ContentItem(tr("Driver"), pcscInfo.join(QLatin1Char('\n'))); } - mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + updateCardReaderSection(); Q_EMIT fireRunningChanged(); } void DiagnosisModel::onRemoteInfosChanged() { - mRemoteDeviceSection->removeAllItems(); + mRemoteDeviceSection.clear(); mRemoteDeviceSectionRunning = false; const RemoteServiceSettings& settings = Env::getSingleton()->getRemoteServiceSettings(); const auto& trustedCertificates = settings.getTrustedCertificates(); //: LABEL DESKTOP - mRemoteDeviceSection->addTitleWithoutContent(tr("Paired smartphones")); + mRemoteDeviceSection << ContentItem(tr("Paired smartphones")); if (trustedCertificates.isEmpty()) { //: LABEL DESKTOP - mRemoteDeviceSection->addItemWithoutTitle(tr("No devices paired.")); + mRemoteDeviceSection << ContentItem(QString(), tr("No devices paired.")); } for (const auto& cert : trustedCertificates) { - QStringList certInfo; const auto& info = settings.getRemoteInfo(cert); if (!info.getFingerprint().isEmpty()) @@ -603,35 +709,34 @@ void DiagnosisModel::onRemoteInfosChanged() //: LABEL DESKTOP Timestamp const QString& timestamp = LanguageLoader::getInstance().getUsedLocale().toString(info.getLastConnected(), tr("dd.MM.yyyy, hh:mm:ss")); //: LABEL DESKTOP - mRemoteDeviceSection->addItem(info.getNameEscaped(), tr("Last connection: %1").arg(timestamp)); + mRemoteDeviceSection << ContentItem(info.getNameEscaped(), tr("Last connection: %1").arg(timestamp)); } else { //: LABEL DESKTOP - mRemoteDeviceSection->addItem(RemoteServiceSettings::generateFingerprint(cert), tr("No information found for this certificate.")); + mRemoteDeviceSection << ContentItem(RemoteServiceSettings::generateFingerprint(cert), tr("No information found for this certificate.")); } } - mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + updateCardReaderSection(); Q_EMIT fireRunningChanged(); } void DiagnosisModel::onReaderInfosChanged() { - mCardReaderSection->removeAllItems(); + mCardReaderSection.clear(); mCardReaderSectionRunning = false; //: LABEL DESKTOP - mCardReaderSection->addTitleWithoutContent(tr("Connected Card readers")); + mCardReaderSection << ContentItem(tr("Connected Card readers")); const auto& readerInfos = mContext->getReaderInfos(); const auto& readerInfoNoDriver = mContext->getReaderInfosNoDriver(); if (readerInfos.isEmpty() && readerInfoNoDriver.isEmpty()) { //: LABEL DESKTOP - mCardReaderSection->addItemWithoutTitle(tr("No supported reader found.")); + mCardReaderSection << ContentItem(QString(), tr("No supported reader found.")); } for (const auto& info : readerInfos) @@ -654,17 +759,16 @@ void DiagnosisModel::onReaderInfosChanged() infoList << tr("Retry counter: %1").arg(info.getRetryCounter()); } - mCardReaderSection->addItem(info.getName(), infoList.join(QLatin1Char('\n'))); + mCardReaderSection << ContentItem(info.getName(), infoList.join(QLatin1Char('\n'))); } for (const auto& info : readerInfoNoDriver) { - //: LABEL ALL_PLATFORMS - mCardReaderSection->addItem(info.getName(), tr("No driver installed")); + //: LABEL DESKTOP + mCardReaderSection << ContentItem(info.getName(), tr("No driver installed")); } - mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection}); - mContext->setTimestamp(QDateTime::currentDateTime()); + updateCardReaderSection(); Q_EMIT fireRunningChanged(); } @@ -674,24 +778,18 @@ void DiagnosisModel::reloadContent() disconnectSignals(); beginResetModel(); - mSections.clear(); - mSections.append(qMakePair(QCoreApplication::applicationName(), createAusweisApp2Section())); + initGeneralSections(); + updateGeneralSection(); - createCardReaderSection(); - mCombinedReaderSection->replaceWithSections({mRemoteDeviceSection, mCardReaderSection, mPcscSection}); - //: LABEL DESKTOP - mSections.append(qMakePair(tr("Card reader"), mCombinedReaderSection)); + initCardReaderSections(); + updateCardReaderSection(false); - createNetworkSection(); - mCombinedNetworkSection->replaceWithSections({mNetworkConnectionSection, mNetworkInterfaceSection}); - //: LABEL DESKTOP - mSections.append(qMakePair(tr("Network"), mCombinedNetworkSection)); + initNetworkSections(); + updateNetworkSection(false); - createAntiVirusAndFirewallSection(); - mCombinedAntivirusFirewallSection->replaceWithSections({mAntivirusSection, mFirewallSection}); - //: LABEL DESKTOP - mSections.append(qMakePair(tr("Antivirus and firewall"), mCombinedAntivirusFirewallSection)); + initAntiVirusAndFirewallSection(); + updateAntiVirusAndFirewallSection(false); onRemoteInfosChanged(); mConnectionTest.startConnectionTest(); diff --git a/src/diagnosis/DiagnosisModel.h b/src/diagnosis/DiagnosisModel.h index 7677594c4..76e824e7c 100644 --- a/src/diagnosis/DiagnosisModel.h +++ b/src/diagnosis/DiagnosisModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -12,6 +12,7 @@ #include "context/DiagnosisContext.h" #include +#include #include #include #include @@ -25,6 +26,7 @@ class DiagnosisModel : public QAbstractListModel { Q_OBJECT + friend class ::test_DiagnosisModel; private: @@ -33,32 +35,47 @@ class DiagnosisModel ContentRole = Qt::UserRole + 1 }; - QVector>> mSections; + enum class Section : int + { + GENERAL, + READER, + NETWORK, + SECURITY + }; + + QMap> mSections; QSharedPointer mContext; - DiagnosisAntivirusDetection mAntivirusDetection; - DiagnosisFirewallDetection mFirewallDetection; - DiagnosisConnectionTest mConnectionTest; - QSharedPointer mTimestampItem; - QSharedPointer mNetworkInterfaceSection; - QSharedPointer mNetworkConnectionSection; - QSharedPointer mCombinedNetworkSection; - QSharedPointer mCombinedAntivirusFirewallSection; - QSharedPointer mAntivirusSection; - bool mAntivirusSectionRunning; - QSharedPointer mFirewallSection; - bool mFirewallSectionRunning; - QSharedPointer mCombinedReaderSection; - QSharedPointer mCardReaderSection; + + QVector mAusweisApp2Section; + QVector mTimestampSection; + + bool mRemoteDeviceSectionRunning; + QVector mRemoteDeviceSection; bool mCardReaderSectionRunning; - QSharedPointer mPcscSection; + QVector mCardReaderSection; bool mPcscSectionRunning; - QSharedPointer mRemoteDeviceSection; - bool mRemoteDeviceSectionRunning; + QVector mPcscSection; + + DiagnosisConnectionTest mConnectionTest; + QVector mNetworkConnectionSection; + QVector mNetworkInterfaceSection; - QSharedPointer createAusweisApp2Section(); - void createNetworkSection(); - void createCardReaderSection(); - void createAntiVirusAndFirewallSection(); + bool mAntivirusSectionRunning; + DiagnosisAntivirusDetection mAntivirusDetection; + QVector mAntivirusSection; + bool mFirewallSectionRunning; + DiagnosisFirewallDetection mFirewallDetection; + QVector mFirewallSection; + + [[nodiscard]] QString getSectionName(Section pSection) const; + void initGeneralSections(); + void updateGeneralSection(); + void initNetworkSections(); + void updateNetworkSection(bool pUpdateTimestamp = true); + void initCardReaderSections(); + void updateCardReaderSection(bool pUpdateTimestamp = true); + void initAntiVirusAndFirewallSection(); + void updateAntiVirusAndFirewallSection(bool pUpdateTimestamp = true); void connectSignals(); void disconnectSignals(); diff --git a/src/diagnosis/SectionModel.cpp b/src/diagnosis/SectionModel.cpp index f5a4c7a77..224f84d05 100644 --- a/src/diagnosis/SectionModel.cpp +++ b/src/diagnosis/SectionModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "SectionModel.h" @@ -25,24 +25,24 @@ QVariant SectionModel::data(const QModelIndex& pIndex, int pRole) const static const QLatin1Char endl('\n'); - QSharedPointer item = mContentItems.at(row); + const ContentItem& item = mContentItems.at(row); switch (pRole) { case Qt::DisplayRole: - if (item->mTitle.isEmpty()) + if (item.mTitle.isEmpty()) { - return item->mContent; + return item.mContent; } else { - return item->mTitle + endl + item->mContent; + return item.mTitle + endl + item.mContent; } case TitleRole: - return item->mTitle; + return item.mTitle; case ContentRole: - return item->mContent; + return item.mContent; default: return QVariant(); @@ -67,71 +67,29 @@ QHash SectionModel::roleNames() const } -void SectionModel::addItem(const QString& pTitle, const QString& pContent) -{ - addItem(QSharedPointer::create(pTitle, pContent)); -} - - -void SectionModel::addItem(const QSharedPointer& pContentItem) -{ - beginInsertRows(index(0), mContentItems.size(), mContentItems.size()); - mContentItems.append(pContentItem); - endInsertRows(); -} - - -void SectionModel::addItemWithoutTitle(const QString& pContent) -{ - addItem(QString(), pContent); -} - - -void SectionModel::addTitleWithoutContent(const QString& pTitle) -{ - addItem(pTitle, QString()); -} - - -bool SectionModel::contains(const QSharedPointer& pContentItem) const -{ - return mContentItems.contains(pContentItem); -} - - void SectionModel::removeAllItems() { - if (!mContentItems.empty()) + if (mContentItems.empty()) { - beginRemoveRows(index(0), 0, mContentItems.size() - 1); - mContentItems.clear(); - endRemoveRows(); + return; } -} - -void SectionModel::emitDataChangedForItem(const QSharedPointer& pItem) -{ - QModelIndex itemIndex = index(mContentItems.indexOf(pItem)); - Q_EMIT dataChanged(itemIndex, itemIndex); + beginResetModel(); + mContentItems.clear(); + endResetModel(); } -void SectionModel::replaceWithSections(QVector> pSections) +void SectionModel::addContent(const QVector& pContent) { - beginResetModel(); - removeAllItems(); - - for (const auto& section : std::as_const(pSections)) + if (pContent.empty()) { - const auto& sectionItems = section->mContentItems; - for (const auto& item : sectionItems) - { - addItem(item); - } + return; } - endResetModel(); + beginInsertRows(index(mContentItems.size()), mContentItems.size(), mContentItems.size() + pContent.size() - 1); + mContentItems << pContent; + endInsertRows(); } @@ -140,14 +98,14 @@ QStringList SectionModel::getAsPlaintext(const QString& pPrependString) const QStringList sectionPlaintext; for (const auto& item : std::as_const(mContentItems)) { - if (!item->mTitle.isEmpty()) + if (!item.mTitle.isEmpty()) { - sectionPlaintext << pPrependString + item->mTitle; + sectionPlaintext << pPrependString + item.mTitle; } - if (!item->mContent.isEmpty()) + if (!item.mContent.isEmpty()) { - sectionPlaintext << pPrependString + item->mContent; + sectionPlaintext << pPrependString + item.mContent; } } diff --git a/src/diagnosis/SectionModel.h b/src/diagnosis/SectionModel.h index 61e41c898..f617b90d3 100644 --- a/src/diagnosis/SectionModel.h +++ b/src/diagnosis/SectionModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -22,6 +22,7 @@ class SectionModel : public QAbstractListModel { Q_OBJECT + friend class ::test_DiagnosisModel; private: @@ -31,7 +32,7 @@ class SectionModel ContentRole }; - QVector> mContentItems; + QVector mContentItems; public: explicit SectionModel(QObject* pParent = nullptr); @@ -40,14 +41,8 @@ class SectionModel [[nodiscard]] int rowCount(const QModelIndex& pParent = QModelIndex()) const override; [[nodiscard]] QHash roleNames() const override; - void addItem(const QString& pTitle, const QString& pContent); - void addItem(const QSharedPointer& pContentItem); - void addItemWithoutTitle(const QString& pContent); - void addTitleWithoutContent(const QString& pTitle); - [[nodiscard]] bool contains(const QSharedPointer& pContentItem) const; void removeAllItems(); - void emitDataChangedForItem(const QSharedPointer& pItem); - void replaceWithSections(QVector> pSections); + void addContent(const QVector& pContent); [[nodiscard]] QStringList getAsPlaintext(const QString& pPrependString = QString()) const; }; diff --git a/src/diagnosis/SelfDiagnosisModel.cpp b/src/diagnosis/SelfDiagnosisModel.cpp index fe3c43072..b36ee70c1 100644 --- a/src/diagnosis/SelfDiagnosisModel.cpp +++ b/src/diagnosis/SelfDiagnosisModel.cpp @@ -1,11 +1,9 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "SelfDiagnosisModel.h" -#include "GeneralSettings.h" - #include #include #include @@ -19,6 +17,8 @@ SelfDiagnosisModel::SelfDiagnosisModel() , mDiagnosisContext(new DiagnosisContext()) , mDiagnosisModel(mDiagnosisContext) { + QQmlEngine::setObjectOwnership(&mDiagnosisModel, QQmlEngine::CppOwnership); + connect(&mDiagnosisModel, &DiagnosisModel::fireRunningChanged, this, &SelfDiagnosisModel::fireRunningChanged); } diff --git a/src/diagnosis/SelfDiagnosisModel.h b/src/diagnosis/SelfDiagnosisModel.h index bd6bf954c..935f51f35 100644 --- a/src/diagnosis/SelfDiagnosisModel.h +++ b/src/diagnosis/SelfDiagnosisModel.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/context/DiagnosisContext.cpp b/src/diagnosis/context/DiagnosisContext.cpp index 6234fc0bb..aff7e1da1 100644 --- a/src/diagnosis/context/DiagnosisContext.cpp +++ b/src/diagnosis/context/DiagnosisContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisContext.h" diff --git a/src/diagnosis/context/DiagnosisContext.h b/src/diagnosis/context/DiagnosisContext.h index a9a627cb2..edf56e5d1 100644 --- a/src/diagnosis/context/DiagnosisContext.h +++ b/src/diagnosis/context/DiagnosisContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains information collected by the diagnosis functionality. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/controller/DiagnosisController.cpp b/src/diagnosis/controller/DiagnosisController.cpp index 1401a3be7..3957fc022 100644 --- a/src/diagnosis/controller/DiagnosisController.cpp +++ b/src/diagnosis/controller/DiagnosisController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisController.h" diff --git a/src/diagnosis/controller/DiagnosisController.h b/src/diagnosis/controller/DiagnosisController.h index c5d9daa14..54de24c18 100644 --- a/src/diagnosis/controller/DiagnosisController.h +++ b/src/diagnosis/controller/DiagnosisController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for retrieving and presenting diagnosis info. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/diagnosis/controller/DiagnosisController_generic.cpp b/src/diagnosis/controller/DiagnosisController_generic.cpp index 74ef1d7e6..cfd3a3221 100644 --- a/src/diagnosis/controller/DiagnosisController_generic.cpp +++ b/src/diagnosis/controller/DiagnosisController_generic.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generic implementation of the controller for retrieving and presenting diagnosis info. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/diagnosis/controller/DiagnosisController_osx.mm b/src/diagnosis/controller/DiagnosisController_osx.mm index f160d6983..da693253b 100644 --- a/src/diagnosis/controller/DiagnosisController_osx.mm +++ b/src/diagnosis/controller/DiagnosisController_osx.mm @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mac OS X specific implementation of the controller for retrieving and presenting diagnosis info. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/diagnosis/controller/DiagnosisController_win.cpp b/src/diagnosis/controller/DiagnosisController_win.cpp index 1c894d327..e2b3e7021 100644 --- a/src/diagnosis/controller/DiagnosisController_win.cpp +++ b/src/diagnosis/controller/DiagnosisController_win.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Windows specific implementation of the controller for retrieving and presenting diagnosis info. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/export/PdfCreator.cpp b/src/export/PdfCreator.cpp index c3dec5bdb..a72fcdc59 100644 --- a/src/export/PdfCreator.cpp +++ b/src/export/PdfCreator.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "PdfCreator.h" diff --git a/src/export/PdfCreator.h b/src/export/PdfCreator.h index 8891f99ab..44b0726a0 100644 --- a/src/export/PdfCreator.h +++ b/src/export/PdfCreator.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tool to create PDF-Documents. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/export/PdfExporter.cpp b/src/export/PdfExporter.cpp index 16d9fb675..c22ccd03f 100644 --- a/src/export/PdfExporter.cpp +++ b/src/export/PdfExporter.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "PdfExporter.h" diff --git a/src/export/PdfExporter.h b/src/export/PdfExporter.h index 3d926e861..80744066c 100644 --- a/src/export/PdfExporter.h +++ b/src/export/PdfExporter.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tool to export data of history or selfauthentication result. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/external/smart/mock/eid_applet_interface_mock.cpp b/src/external/smart/mock/eid_applet_interface_mock.cpp index f9f47aede..90cc2b0ae 100644 --- a/src/external/smart/mock/eid_applet_interface_mock.cpp +++ b/src/external/smart/mock/eid_applet_interface_mock.cpp @@ -1,5 +1,5 @@ /* - * \copyright Copyright (c) 2021 Governikus GmbH & Co. KG, Germany + * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "eid_applet_interface_mock.h" diff --git a/src/external/smart/mock/eid_applet_interface_mock.h b/src/external/smart/mock/eid_applet_interface_mock.h index f9a6e1a65..be2132123 100644 --- a/src/external/smart/mock/eid_applet_interface_mock.h +++ b/src/external/smart/mock/eid_applet_interface_mock.h @@ -1,5 +1,5 @@ /*! - * \copyright Copyright (c) 2021 Governikus GmbH & Co. KG, Germany + * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/file_provider/Downloader.cpp b/src/file_provider/Downloader.cpp index 4f21b8ce8..3599c105e 100644 --- a/src/file_provider/Downloader.cpp +++ b/src/file_provider/Downloader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "Downloader.h" diff --git a/src/file_provider/Downloader.h b/src/file_provider/Downloader.h index 317e30d3e..ca985f1cc 100644 --- a/src/file_provider/Downloader.h +++ b/src/file_provider/Downloader.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generic class that allows to download files from a server to the * local application cache. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/file_provider/FileProvider.cpp b/src/file_provider/FileProvider.cpp index 1a2a6b061..6f2af2a76 100644 --- a/src/file_provider/FileProvider.cpp +++ b/src/file_provider/FileProvider.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "FileProvider.h" diff --git a/src/file_provider/FileProvider.h b/src/file_provider/FileProvider.h index b0e597b0c..f90e445e4 100644 --- a/src/file_provider/FileProvider.h +++ b/src/file_provider/FileProvider.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class that holds a table of the UpdatableFile instances currently in use. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/file_provider/UpdatableFile.cpp b/src/file_provider/UpdatableFile.cpp index 5db12b981..8c37694ce 100644 --- a/src/file_provider/UpdatableFile.cpp +++ b/src/file_provider/UpdatableFile.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "UpdatableFile.h" diff --git a/src/file_provider/UpdatableFile.h b/src/file_provider/UpdatableFile.h index 18632a5a3..0cad5791c 100644 --- a/src/file_provider/UpdatableFile.h +++ b/src/file_provider/UpdatableFile.h @@ -1,10 +1,12 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class that provides access to a file identified by a section and a name. * The file is looked up in the local cache or in the application's resource bundle. * This class also handles the synchronization of the local cache with the content * provided by a server. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/BuildHelper.cpp b/src/global/BuildHelper.cpp index eca15a60c..23e5f2176 100644 --- a/src/global/BuildHelper.cpp +++ b/src/global/BuildHelper.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "BuildHelper.h" diff --git a/src/global/BuildHelper.h b/src/global/BuildHelper.h index 3f6a916b0..ff466aa1e 100644 --- a/src/global/BuildHelper.h +++ b/src/global/BuildHelper.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Helper to get build date and time. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/CardReturnCode.cpp b/src/global/CardReturnCode.cpp index 7bc431f5f..047d811fc 100644 --- a/src/global/CardReturnCode.cpp +++ b/src/global/CardReturnCode.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardReturnCode.h" diff --git a/src/global/CardReturnCode.h b/src/global/CardReturnCode.h index 825b3bfdf..a9222ff2c 100644 --- a/src/global/CardReturnCode.h +++ b/src/global/CardReturnCode.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Global error code definitions - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/DeviceInfo.cpp b/src/global/DeviceInfo.cpp index f5550b2d9..a3ee59ccd 100644 --- a/src/global/DeviceInfo.cpp +++ b/src/global/DeviceInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "DeviceInfo.h" diff --git a/src/global/DeviceInfo.h b/src/global/DeviceInfo.h index 18294c1a1..e6193f268 100644 --- a/src/global/DeviceInfo.h +++ b/src/global/DeviceInfo.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implements a wrapper for different APIs to get * device information like android device name. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/ECardApiResult.cpp b/src/global/ECardApiResult.cpp index d2e7ceceb..dcf829505 100644 --- a/src/global/ECardApiResult.cpp +++ b/src/global/ECardApiResult.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ECardApiResult.h" @@ -67,7 +67,7 @@ QMap ECardApiResult::cConversionMap1 QMap ECardApiResult::cConversionMap2 = {}; -ECardApiResult ECardApiResult::fromStatus(const GlobalStatus& pStatus) +ECardApiResult ECardApiResult::fromStatus(const GlobalStatus& pStatus, const std::optional& pFailureCode) { if (pStatus.getStatusCode() == GlobalStatus::Code::No_Error) { @@ -78,7 +78,7 @@ ECardApiResult ECardApiResult::fromStatus(const GlobalStatus& pStatus) const Minor minor = fromStatus(pStatus.getStatusCode()); const Origin status = fromStatus(pStatus.getOrigin()); - return ECardApiResult(Major::Error, minor, message, status); + return ECardApiResult(Major::Error, minor, message, status, pFailureCode); } @@ -451,7 +451,7 @@ QString ECardApiResult::getMessage(Minor pMinor) case Minor::SAL_Invalid_Key: //: LABEL ALL_PLATFORMS - return tr("This action cannot be performed. The online identification function of your ID card is not activated."); + return tr("This action cannot be performed. The eID function of your ID card is not activated."); case Minor::SAL_SecurityConditionNotSatisfied: //: LABEL ALL_PLATFORMS @@ -481,19 +481,20 @@ QString ECardApiResult::getMessage(Minor pMinor) } -ECardApiResult::ResultData::ResultData(Major pMajor, Minor pMinor, const QString& pMessage, Origin pOrigin) +ECardApiResult::ResultData::ResultData(Major pMajor, Minor pMinor, const QString& pMessage, Origin pOrigin, const std::optional& pFailureCode) : QSharedData() , mMajor(pMajor) , mMinor(pMinor) , mMessage(pMessage) , mMessageLang(LanguageLoader::getLocaleCode()) , mOrigin(pOrigin) + , mFailureCode(pFailureCode) { } -ECardApiResult::ECardApiResult(Major pMajor, Minor pMinor, const QString& pMessage, Origin pOrigin) - : d(new ResultData(pMajor, pMinor, pMessage, pOrigin)) +ECardApiResult::ECardApiResult(Major pMajor, Minor pMinor, const QString& pMessage, Origin pOrigin, const std::optional& pFailureCode) + : d(new ResultData(pMajor, pMinor, pMessage, pOrigin, pFailureCode)) { const bool nullWithoutOk = pMajor != Major::Ok && pMinor == Minor::null; const bool okWithoutNull = pMajor == Major::Ok && pMinor != Minor::null; @@ -513,8 +514,8 @@ ECardApiResult::ECardApiResult(const QString& pMajor, const QString& pMinor, con } -ECardApiResult::ECardApiResult(const GlobalStatus& pStatus) - : ECardApiResult(fromStatus(pStatus)) +ECardApiResult::ECardApiResult(const GlobalStatus& pStatus, const std::optional& pFailureCode) + : ECardApiResult(fromStatus(pStatus, pFailureCode)) { } @@ -549,6 +550,12 @@ const QString& ECardApiResult::getMessageLang() const } +const std::optional& ECardApiResult::getFailureCode() const +{ + return d->mFailureCode; +} + + QString ECardApiResult::getMajorString(ECardApiResult::Major pMajor) { return cMajorResults.value(pMajor); @@ -677,13 +684,25 @@ QJsonObject ECardApiResult::toJson() const obj[QLatin1String("language")] = lang; } + const auto& failureCode = getFailureCode(); + if (failureCode.has_value()) + { + obj[QLatin1String("reason")] = Enum::getName(failureCode.value().getReason()); + } + return obj; } QDebug operator <<(QDebug pDbg, const governikus::ECardApiResult& pResult) { - const QString string = pResult.getMajorString() % QLatin1String(" | ") % pResult.getMinorString() % QLatin1String(" | ") % pResult.getMessage(); + QString string = pResult.getMajorString() % QLatin1String(" | ") % pResult.getMinorString() % QLatin1String(" | ") % pResult.getMessage(); + const auto& failureCode = pResult.getFailureCode(); + if (failureCode.has_value()) + { + string += QLatin1String(" | "); + string += Enum::getName(failureCode.value().getReason()); + } QDebugStateSaver saver(pDbg); pDbg.space() << "Result:"; pDbg.quote() << string; diff --git a/src/global/ECardApiResult.h b/src/global/ECardApiResult.h index c8d6c2b74..3586647e8 100644 --- a/src/global/ECardApiResult.h +++ b/src/global/ECardApiResult.h @@ -1,11 +1,14 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Status representation according to TR-03112-6 "eCard-API-Framework" - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once +#include "FailureCode.h" #include "GlobalStatus.h" #include @@ -14,10 +17,13 @@ #include #include #include +#include + class test_ECardApiResult; class test_UrlUtil; + namespace governikus { @@ -97,8 +103,9 @@ class ECardApiResult const QString mMessage; const QString mMessageLang; const Origin mOrigin; + const std::optional mFailureCode; - ResultData(Major pMajor, Minor pMinor, const QString& pMessage, Origin pOrigin); + ResultData(Major pMajor, Minor pMinor, const QString& pMessage, Origin pOrigin, const std::optional& pFailureCode = {}); bool operator ==(const ResultData& pOther) const { @@ -106,7 +113,8 @@ class ECardApiResult mMinor == pOther.mMinor && mMessage == pOther.mMessage && mMessageLang == pOther.mMessageLang && - mOrigin == pOther.mOrigin; + mOrigin == pOther.mOrigin && + mFailureCode == pOther.mFailureCode; } @@ -126,18 +134,18 @@ class ECardApiResult static GlobalStatus::Origin toStatus(governikus::ECardApiResult::Origin pSelf); static ECardApiResult::Origin fromStatus(GlobalStatus::Origin pSelf); - static ECardApiResult fromStatus(const GlobalStatus& pStatus); + static ECardApiResult fromStatus(const GlobalStatus& pStatus, const std::optional& pFailureCode); static Major parseMajor(const QString& pMajor); static Minor parseMinor(const QString& pMinor); QSharedDataPointer d; - ECardApiResult(Major pMajor, Minor pMinor, const QString& pMessage = QString(), Origin pOrigin = Origin::Client); + ECardApiResult(Major pMajor, Minor pMinor, const QString& pMessage = QString(), Origin pOrigin = Origin::Client, const std::optional& pFailureCode = {}); explicit ECardApiResult(const QString& pMajor, const QString& pMinor = QString(), const QString& pMessage = QString(), Origin pOrigin = Origin::Client); public: - explicit ECardApiResult(const GlobalStatus& pStatus); + explicit ECardApiResult(const GlobalStatus& pStatus, const std::optional& pFailureCode = {}); bool operator ==(const ECardApiResult& pResult) const; @@ -151,6 +159,7 @@ class ECardApiResult [[nodiscard]] Minor getMinor() const; [[nodiscard]] QString getMessage() const; [[nodiscard]] const QString& getMessageLang() const; + [[nodiscard]] const std::optional& getFailureCode() const; static QString getMajorString(Major pMajor); static QString getMinorString(Minor pMinor); diff --git a/src/global/EnumHelper.h b/src/global/EnumHelper.h index aaa56a2a7..b3147f819 100644 --- a/src/global/EnumHelper.h +++ b/src/global/EnumHelper.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper class to provide a QMetaObject handler for enumerations. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/Env.cpp b/src/global/Env.cpp index 8fcb59ccf..6afa4caab 100644 --- a/src/global/Env.cpp +++ b/src/global/Env.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "Env.h" diff --git a/src/global/Env.h b/src/global/Env.h index 1f49dbafe..08329806d 100644 --- a/src/global/Env.h +++ b/src/global/Env.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Runtime environment to create (mockable) objects. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -318,7 +320,7 @@ class Env template - static QSharedPointer getShared() + static QSharedPointer getShared(bool pSpawn = true) { static_assert(QtPrivate::IsPointerToTypeDerivedFromQObject::Value, "Shared class needs to be an QObject/Q_OBJECT"); @@ -329,7 +331,7 @@ class Env QSharedPointer shared = qSharedPointerCast(holder.mSharedInstances.value(className)); holder.mSharedInstancesLock.unlock(); - if (!shared) + if (!shared && pSpawn) { const QWriteLocker locker(&holder.mSharedInstancesLock); shared = qSharedPointerCast(holder.mSharedInstances.value(className)); diff --git a/src/global/FailureCode.cpp b/src/global/FailureCode.cpp new file mode 100644 index 000000000..168a25351 --- /dev/null +++ b/src/global/FailureCode.cpp @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + +#include "FailureCode.h" + + +using namespace governikus; + + +FailureCode::FailureCode(Reason pReason) + : mReason(pReason) + , mFailureInfoMap() +{ + +} + + +FailureCode::FailureCode(Reason pReason, const FailureInfoMap& pInfoMap) + : mReason(pReason) + , mFailureInfoMap(pInfoMap) +{ + +} + + +FailureCode::FailureCode(Reason pReason, const QPair& pInfo) + : mReason(pReason) + , mFailureInfoMap({ + {pInfo.first, pInfo.second} + }) +{ + +} + + +FailureCode::Reason FailureCode::getReason() const +{ + return mReason; +} + + +bool FailureCode::operator==(const FailureCode& pFailure) const +{ + return mReason == pFailure.getReason(); +} + + +bool FailureCode::operator!=(const FailureCode& pFailure) const +{ + return mReason != pFailure.getReason(); +} + + +const FailureCode::FailureInfoMap& FailureCode::getFailureInfoMap() const +{ + return mFailureInfoMap; +} + + +[[nodiscard]] QString FailureCode::toString() const +{ + QString description = QStringLiteral("%1").arg(getEnumName(mReason)); + + if (mFailureInfoMap.empty()) + { + return description; + } + + description += QStringLiteral("
    "); + const auto& keys = mFailureInfoMap.keys(); + for (const auto& key : keys) + { + description += QStringLiteral("
  • %1: %2
  • ").arg(getEnumName(key), mFailureInfoMap[key]); + } + description += QStringLiteral("
"); + + return description; +} + + +QDebug operator <<(QDebug pDbg, const FailureCode& pFailure) +{ + QStringList keyValue; + const auto& map = pFailure.getFailureInfoMap(); + if (map.isEmpty()) + { + pDbg << pFailure.getReason(); + return pDbg; + } + + const auto& keys = map.keys(); + for (const auto key : keys) + { + keyValue << QStringLiteral("%1: %2").arg(getEnumName(key), map[key]); + } + pDbg << pFailure.getReason() << "[" << keyValue.join(QStringLiteral("; ")) << "]"; + return pDbg; +} diff --git a/src/global/FailureCode.h b/src/global/FailureCode.h new file mode 100644 index 000000000..4b1a1d5ef --- /dev/null +++ b/src/global/FailureCode.h @@ -0,0 +1,186 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + +/*! + * \brief Status class that tracks reasons for aborting a Workflow + */ + +#pragma once + +#include "EnumHelper.h" + +#include +#include +#include + +namespace governikus +{ + +class FailureCode +{ + Q_GADGET + + public: + enum class Reason + { + User_Cancelled, + Card_Removed, + Get_TcToken_Invalid_Url, + Get_TcToken_Invalid_Redirect_Url, + Get_TcToken_Invalid_Certificate_Key_Length, + Get_TcToken_Invalid_Ephemeral_Key_Length, + Get_TcToken_Invalid_Server_Reply, + Get_TcToken_Empty_Data, + Get_TcToken_Invalid_Data, + Get_TcToken_Network_Error, + Certificate_Check_Failed_No_Description, + Certificate_Check_Failed_No_SubjectUrl_In_Description, + Certificate_Check_Failed_Hash_Mismatch, + Certificate_Check_Failed_Same_Origin_Policy_Violation, + Certificate_Check_Failed_Hash_Missing_In_Description, + Check_Refresh_Address_Fatal_Ssl_Error_Before_Reply, + Check_Refresh_Address_Invalid_Ephemeral_Key_Length, + Check_Refresh_Address_Service_Unavailable, + Check_Refresh_Address_Service_Timeout, + Check_Refresh_Address_Proxy_Error, + Check_Refresh_Address_Fatal_Ssl_Error_After_Reply, + Check_Refresh_Address_Unknown_Network_Error, + Check_Refresh_Address_Invalid_Http_Response, + Check_Refresh_Address_Empty, + Check_Refresh_Address_Invalid_Url, + Check_Refresh_Address_No_Https_Scheme, + Check_Refresh_Address_Fetch_Certificate_Error, + Check_Refresh_Address_Unsupported_Certificate, + Check_Refresh_Address_Hash_Missing_In_Certificate, + Change_Pin_No_SetEidPinCommand_Response, + Change_Pin_Input_Timeout, + Change_Pin_User_Cancelled, + Change_Pin_New_Pin_Mismatch, + Change_Pin_New_Pin_Invalid_Length, + Change_Pin_Unexpected_Transmit_Status, + Change_Pin_Card_New_Pin_Mismatch, + Change_Pin_Card_User_Cancelled, + Connect_Card_Connection_Failed, + Connect_Card_Eid_Inactive, + Destroy_Pace_No_Connection_To_Destroy, + Get_SelfAuthData_Invalid_Or_Empty, + Transmit_Personalization_Size_Mismatch, + Start_Paos_Response_Personalization_Empty, + Start_Paos_Response_Personalization_Invalid, + Prepare_Applet_User_Cancelled, + Prepare_Applet_Status_Call_Failed, + Prepare_Applet_Installation_Loop, + Prepare_Applet_Installation_Failed, + Prepare_Applet_Unavailable, + Prepare_Applet_Delete_Personalization_Failed, + Prepare_Applet_UpdateInfo_Call_Failed, + Prepare_Applet_Delete_Smart_Failed, + Insert_Card_No_SmartReader, + Insert_Card_Multiple_SmartReader, + Insert_Card_Unknown_Eid_Type, + Insert_Card_HW_Keystore, + Insert_Card_Invalid_SmartReader, + Insert_Card_Missing_Card, + Initialize_Personalization_Failed, + Get_Session_Id_Invalid, + Get_Challenge_Invalid, + Finalize_Personalization_Failed, + Check_Status_Unavailable, + Check_Applet_Error, + Check_Applet_Unavailable, + Start_Ifd_Service_Failed, + Process_Ifd_Messages_No_Server_Connection, + Prepare_Pace_Ifd_Unknown, + Establish_Pace_Ifd_Unknown, + Enter_Pace_Password_Ifd_User_Cancelled, + Enter_New_Pace_Pin_Ifd_User_Cancelled, + Write_History_No_Eac1, + Write_History_No_Chat, + Verify_Retry_Counter_No_Card_Connection, + Update_Retry_Counter_No_Card_Connection, + Update_Retry_Counter_Communication_Error, + Start_Paos_Response_Missing, + Start_Paos_Response_Error, + Redirect_Browser_Send_Error_Page_Failed, + Redirect_Browser_Send_Redirect_Failed, + Processing_Send_Status_Failed, + Process_Certificates_From_Eac2_Cvc_Chain_Missing, + Prepace_Pace_No_Card_Connection, + Prepace_Pace_Smart_Eid_Invalidated, + Pre_Verfication_No_Test_Environment, + Pre_Verfication_Invalid_Certificate_Chain, + Pre_Verfication_Invalid_Certificate_Signature, + Pre_Verfication_Certificate_Expired, + Parse_TcToken_Invalid_Url, + Parse_TcToken_Missing_Url, + Extract_Cvcs_From_Eac1_No_Unique_At, + Extract_Cvcs_From_Eac1_No_Unique_Dv, + Extract_Cvcs_From_Eac1_At_Missing, + Extract_Cvcs_From_Eac1_Dv_Missing, + Establish_Pace_Channel_No_Active_Pin, + Establish_Pace_Channel_Transport_Pin, + Establish_Pace_Channel_No_Card_Connection, + Establish_Pace_Channel_Basic_Reader_No_Pin, + Establish_Pace_Channel_Puk_Inoperative, + Establish_Pace_Channel_User_Cancelled, + Establish_Pace_Channel_Invalid_Card_Return_Code, + Did_Authenticate_Eac1_Card_Command_Failed, + Did_Authenticate_Eac2_Invalid_Cvc_Chain, + Did_Authenticate_Eac2_Card_Command_Failed, + Maintain_Card_Connection_Pace_Unrecoverable, + Generic_Send_Receive_Network_Error, + Generic_Provider_Communication_Network_Error, + Generic_Provider_Communication_Invalid_Ephemeral_Key_Length, + Generic_Provider_Communication_Certificate_Error, + Generic_Provider_Communication_Ssl_Error, + Generic_Send_Receive_Paos_Unhandled, + Generic_Send_Receive_Ssl_Error, + Generic_Send_Receive_Server_Error, + Generic_Send_Receive_Client_Error, + Generic_Send_Receive_Paos_Unknown, + Generic_Send_Receive_Paos_Unexpected, + Generic_Send_Receive_Invalid_Ephemeral_Key_Length, + Generic_Send_Receive_Certificate_Error, + Generic_Send_Receive_Session_Resumption_Failed, + Transmit_Card_Command_Failed, + Change_Smart_Pin_Failed + }; + Q_ENUM(Reason) + + + enum class Info + { + State_Name, + Card_Return_Code, + Network_Error, + Http_Status_Code, + Certificate_Status, + Ssl_Errors, + Paos_Type + }; + Q_ENUM(Info) + + using FailureInfoMap = QMap; + + FailureCode(Reason pReason); + FailureCode(Reason pReason, const FailureInfoMap& pInfoMap); + FailureCode(Reason pReason, const QPair& pInfo); + + [[nodiscard]] Reason getReason() const; + [[nodiscard]] bool operator==(const FailureCode& pFailure) const; + [[nodiscard]] bool operator!=(const FailureCode& pFailure) const; + [[nodiscard]] const FailureInfoMap& getFailureInfoMap() const; + + [[nodiscard]] QString toString() const; + + private: + Reason mReason; + FailureInfoMap mFailureInfoMap; +}; + +defineEnumOperators(FailureCode::Reason) + +} // namespace governikus + +QDebug operator <<(QDebug pDbg, const governikus::FailureCode& pFailure); diff --git a/src/global/FileDestination.h b/src/global/FileDestination.h index 97d897759..e425a3f9a 100644 --- a/src/global/FileDestination.h +++ b/src/global/FileDestination.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Little helper that will abstract pathes of underlying systems - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/FuncUtils.h b/src/global/FuncUtils.h index b8db5fded..96f810ce2 100644 --- a/src/global/FuncUtils.h +++ b/src/global/FuncUtils.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Template functions that allow to map and filter over QVectors. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/GlobalStatus.cpp b/src/global/GlobalStatus.cpp index 1a9ac5034..53d0b6e14 100644 --- a/src/global/GlobalStatus.cpp +++ b/src/global/GlobalStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "GlobalStatus.h" @@ -201,7 +201,7 @@ QString GlobalStatus::toErrorDescriptionInternal() const return tr("The service is temporarily not available. Please try again later."); case Code::Workflow_Smart_eID_Unavailable: - //: ERROR ALL_PLATFORMS The device does not support the Smart-eID functionality + //: ERROR ALL_PLATFORMS The device does not support the Smart-eID function return tr("The device does not support Smart-eID."); case Code::Workflow_Smart_eID_Applet_Preparation_Failed: @@ -309,8 +309,8 @@ QString GlobalStatus::toErrorDescriptionInternal() const return tr("Card does not exist"); case Code::Card_Pin_Deactivated: - //: ERROR ALL_PLATFORMS The eID functionality of the ID card is not active. - return tr("The online identification function of your ID card is not yet activated."); + //: ERROR ALL_PLATFORMS The eID function of the ID card is not active. + return tr("The eID function of your ID card is not yet activated."); case Code::Card_Communication_Error: //: ERROR ALL_PLATFORMS Communication with the card failed due to the specification of the TR (Technische Richtlinie), diff --git a/src/global/GlobalStatus.h b/src/global/GlobalStatus.h index a91b36d46..56c9624a7 100644 --- a/src/global/GlobalStatus.h +++ b/src/global/GlobalStatus.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief A global mapping for errors - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/Initializer.h b/src/global/Initializer.h index 19dd07429..0f4193349 100644 --- a/src/global/Initializer.h +++ b/src/global/Initializer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Initializer to register a lambda that will be executed if QCoreApplication is ready. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/JsonValueRef.h b/src/global/JsonValueRef.h index 4ba53c91e..f03e330c0 100644 --- a/src/global/JsonValueRef.h +++ b/src/global/JsonValueRef.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Compatibility helper for Qt5/Qt6 JSON stuff. - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/LanguageLoader.cpp b/src/global/LanguageLoader.cpp index 0bf63b0e4..451dafcc5 100644 --- a/src/global/LanguageLoader.cpp +++ b/src/global/LanguageLoader.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "LanguageLoader.h" diff --git a/src/global/LanguageLoader.h b/src/global/LanguageLoader.h index d3978b6f4..78bf41a21 100644 --- a/src/global/LanguageLoader.h +++ b/src/global/LanguageLoader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Loads translation files for different languages. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/LogCategories.cpp b/src/global/LogCategories.cpp index 11f4a734b..808509317 100644 --- a/src/global/LogCategories.cpp +++ b/src/global/LogCategories.cpp @@ -1,8 +1,11 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Definition of all logging categories. * * \see Q_LOGGING_CATEGORY - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/src/global/LogHandler.cpp b/src/global/LogHandler.cpp index d42476915..090a0ea04 100644 --- a/src/global/LogHandler.cpp +++ b/src/global/LogHandler.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "LogHandler.h" diff --git a/src/global/LogHandler.h b/src/global/LogHandler.h index bb1392a89..c96c7460a 100644 --- a/src/global/LogHandler.h +++ b/src/global/LogHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Logging handler of QtMessageHandler - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/Randomizer.cpp b/src/global/Randomizer.cpp index 45b9f60ea..8952c25c1 100644 --- a/src/global/Randomizer.cpp +++ b/src/global/Randomizer.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "Randomizer.h" diff --git a/src/global/Randomizer.h b/src/global/Randomizer.h index 2d3709406..038515218 100644 --- a/src/global/Randomizer.h +++ b/src/global/Randomizer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper to get a Randomizer. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/ResourceLoader.cpp b/src/global/ResourceLoader.cpp index 27f0a0046..9e62d177a 100644 --- a/src/global/ResourceLoader.cpp +++ b/src/global/ResourceLoader.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ResourceLoader.h" diff --git a/src/global/ResourceLoader.h b/src/global/ResourceLoader.h index f1f646c4b..50fd2c3d2 100644 --- a/src/global/ResourceLoader.h +++ b/src/global/ResourceLoader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Handler to load and manage resources and resource files. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/SingletonHelper.h b/src/global/SingletonHelper.h index bf420c70b..86708e626 100644 --- a/src/global/SingletonHelper.h +++ b/src/global/SingletonHelper.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Helper to introduce a Singleton. * Be aware to use this helper in .cpp file only! - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/UsbId.cpp b/src/global/UsbId.cpp index b5d0f935c..0374ff079 100644 --- a/src/global/UsbId.cpp +++ b/src/global/UsbId.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "UsbId.h" diff --git a/src/global/UsbId.h b/src/global/UsbId.h index 26bb312a5..45904e1cc 100644 --- a/src/global/UsbId.h +++ b/src/global/UsbId.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/VersionInfo.cpp b/src/global/VersionInfo.cpp index b343de0fb..ae1735479 100644 --- a/src/global/VersionInfo.cpp +++ b/src/global/VersionInfo.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "VersionInfo.h" diff --git a/src/global/VersionInfo.h b/src/global/VersionInfo.h index 4d32dd095..93920e2c3 100644 --- a/src/global/VersionInfo.h +++ b/src/global/VersionInfo.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/global/VersionNumber.cpp b/src/global/VersionNumber.cpp index fbda894e3..dd5072958 100644 --- a/src/global/VersionNumber.cpp +++ b/src/global/VersionNumber.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "VersionNumber.h" diff --git a/src/global/VersionNumber.h b/src/global/VersionNumber.h index 28b2c7658..4ccd77d8f 100644 --- a/src/global/VersionNumber.h +++ b/src/global/VersionNumber.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Extension to QVersionNumber. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/ConnectRequest.cpp b/src/ifd/base/ConnectRequest.cpp index e78e684ab..c87093224 100644 --- a/src/ifd/base/ConnectRequest.cpp +++ b/src/ifd/base/ConnectRequest.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ConnectRequest.h" diff --git a/src/ifd/base/ConnectRequest.h b/src/ifd/base/ConnectRequest.h index 9721faf32..26affe5da 100644 --- a/src/ifd/base/ConnectRequest.h +++ b/src/ifd/base/ConnectRequest.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/DataChannel.cpp b/src/ifd/base/DataChannel.cpp index 26c7ccd1d..c77afd6b4 100644 --- a/src/ifd/base/DataChannel.cpp +++ b/src/ifd/base/DataChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "DataChannel.h" diff --git a/src/ifd/base/DataChannel.h b/src/ifd/base/DataChannel.h index ebe81a14b..6ed4d37ac 100644 --- a/src/ifd/base/DataChannel.h +++ b/src/ifd/base/DataChannel.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Interface modelling a component that can send and receive data blocks in the form * of QByteArray objects. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdCard.cpp b/src/ifd/base/IfdCard.cpp index 9a3bb5789..61c23a660 100644 --- a/src/ifd/base/IfdCard.cpp +++ b/src/ifd/base/IfdCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdCard.h" diff --git a/src/ifd/base/IfdCard.h b/src/ifd/base/IfdCard.h index cd1bc72cf..8b48e5471 100644 --- a/src/ifd/base/IfdCard.h +++ b/src/ifd/base/IfdCard.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref Card for smartphone as card reader (SaC). - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdClient.cpp b/src/ifd/base/IfdClient.cpp index aedd0762d..c655be0b1 100644 --- a/src/ifd/base/IfdClient.cpp +++ b/src/ifd/base/IfdClient.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdClient.h" diff --git a/src/ifd/base/IfdClient.h b/src/ifd/base/IfdClient.h index 97f5da4f9..19f4db493 100644 --- a/src/ifd/base/IfdClient.h +++ b/src/ifd/base/IfdClient.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief An interface for IfdClients, meant to omit the * dependency between card_base and ifd. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdClientImpl.cpp b/src/ifd/base/IfdClientImpl.cpp index 2b81006e1..2fec99e1b 100644 --- a/src/ifd/base/IfdClientImpl.cpp +++ b/src/ifd/base/IfdClientImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdClientImpl.h" diff --git a/src/ifd/base/IfdClientImpl.h b/src/ifd/base/IfdClientImpl.h index 722e658da..73a854749 100644 --- a/src/ifd/base/IfdClientImpl.h +++ b/src/ifd/base/IfdClientImpl.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdConnector.cpp b/src/ifd/base/IfdConnector.cpp index eea1e819e..79b5ec096 100644 --- a/src/ifd/base/IfdConnector.cpp +++ b/src/ifd/base/IfdConnector.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdConnector.h" diff --git a/src/ifd/base/IfdConnector.h b/src/ifd/base/IfdConnector.h index b570b9ea7..99d391adb 100644 --- a/src/ifd/base/IfdConnector.h +++ b/src/ifd/base/IfdConnector.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Module that creates and manages connections from a remote client to a remote server. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdConnectorImpl.cpp b/src/ifd/base/IfdConnectorImpl.cpp index f954ec7af..a910a266f 100644 --- a/src/ifd/base/IfdConnectorImpl.cpp +++ b/src/ifd/base/IfdConnectorImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdConnectorImpl.h" diff --git a/src/ifd/base/IfdConnectorImpl.h b/src/ifd/base/IfdConnectorImpl.h index f501b8104..fa1456cd5 100644 --- a/src/ifd/base/IfdConnectorImpl.h +++ b/src/ifd/base/IfdConnectorImpl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Module that creates and manages connections from a remote client to a remote server. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdDescriptor.cpp b/src/ifd/base/IfdDescriptor.cpp index 2714a2f11..dc1e76226 100644 --- a/src/ifd/base/IfdDescriptor.cpp +++ b/src/ifd/base/IfdDescriptor.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdDescriptor.h" diff --git a/src/ifd/base/IfdDescriptor.h b/src/ifd/base/IfdDescriptor.h index d0c899d77..db9129310 100644 --- a/src/ifd/base/IfdDescriptor.h +++ b/src/ifd/base/IfdDescriptor.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Information needed to display a remote device in the GUI and to open * a websocket connection to it. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdDispatcher.cpp b/src/ifd/base/IfdDispatcher.cpp index 0320be28f..f76821450 100644 --- a/src/ifd/base/IfdDispatcher.cpp +++ b/src/ifd/base/IfdDispatcher.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdDispatcher.h" diff --git a/src/ifd/base/IfdDispatcher.h b/src/ifd/base/IfdDispatcher.h index ecd83a4f0..cf195160e 100644 --- a/src/ifd/base/IfdDispatcher.h +++ b/src/ifd/base/IfdDispatcher.h @@ -1,9 +1,11 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * * \brief An interface for Ifd dispatchers, meant to omit the * dependency between card_base and ifd. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdDispatcherClient.cpp b/src/ifd/base/IfdDispatcherClient.cpp index 229d91e9a..d72f78678 100644 --- a/src/ifd/base/IfdDispatcherClient.cpp +++ b/src/ifd/base/IfdDispatcherClient.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdDispatcherClient.h" diff --git a/src/ifd/base/IfdDispatcherClient.h b/src/ifd/base/IfdDispatcherClient.h index f4649c7ce..d0a1a008e 100644 --- a/src/ifd/base/IfdDispatcherClient.h +++ b/src/ifd/base/IfdDispatcherClient.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class that dispatches incoming and outgoing ifd messages. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdDispatcherServer.cpp b/src/ifd/base/IfdDispatcherServer.cpp index 241ee3b86..631df85f1 100644 --- a/src/ifd/base/IfdDispatcherServer.cpp +++ b/src/ifd/base/IfdDispatcherServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdDispatcherServer.h" diff --git a/src/ifd/base/IfdDispatcherServer.h b/src/ifd/base/IfdDispatcherServer.h index 4ef5ab41f..ab3d598af 100644 --- a/src/ifd/base/IfdDispatcherServer.h +++ b/src/ifd/base/IfdDispatcherServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class that dispatches incoming and outgoing ifd messages. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdList.cpp b/src/ifd/base/IfdList.cpp index 86a5af1fa..45e6108f9 100644 --- a/src/ifd/base/IfdList.cpp +++ b/src/ifd/base/IfdList.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdList.h" diff --git a/src/ifd/base/IfdList.h b/src/ifd/base/IfdList.h index 332caa1a4..1d5034d44 100644 --- a/src/ifd/base/IfdList.h +++ b/src/ifd/base/IfdList.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Interface for IfdList - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdReader.cpp b/src/ifd/base/IfdReader.cpp index 4e1c7b2b2..ec43fd048 100644 --- a/src/ifd/base/IfdReader.cpp +++ b/src/ifd/base/IfdReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdReader.h" diff --git a/src/ifd/base/IfdReader.h b/src/ifd/base/IfdReader.h index 2f94a96b5..da826a2a9 100644 --- a/src/ifd/base/IfdReader.h +++ b/src/ifd/base/IfdReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref Reader for smartphone as card reader (SaC). - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdReaderManagerPlugIn.cpp b/src/ifd/base/IfdReaderManagerPlugIn.cpp index d73344233..6f1a77690 100644 --- a/src/ifd/base/IfdReaderManagerPlugIn.cpp +++ b/src/ifd/base/IfdReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdReaderManagerPlugIn.h" diff --git a/src/ifd/base/IfdReaderManagerPlugIn.h b/src/ifd/base/IfdReaderManagerPlugIn.h index f64ed4b40..97774b0eb 100644 --- a/src/ifd/base/IfdReaderManagerPlugIn.h +++ b/src/ifd/base/IfdReaderManagerPlugIn.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/IfdServer.cpp b/src/ifd/base/IfdServer.cpp index c04539cef..80eb0da12 100644 --- a/src/ifd/base/IfdServer.cpp +++ b/src/ifd/base/IfdServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdServer.h" diff --git a/src/ifd/base/IfdServer.h b/src/ifd/base/IfdServer.h index 84c5cd205..c736f9402 100644 --- a/src/ifd/base/IfdServer.h +++ b/src/ifd/base/IfdServer.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Ifd server service to offer smartphones as card readers (SaCs). * This class controls the advertising over UDP as well as the Websocket connection management. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/ServerMessageHandler.cpp b/src/ifd/base/ServerMessageHandler.cpp index 9ebd01033..8c609bf8e 100644 --- a/src/ifd/base/ServerMessageHandler.cpp +++ b/src/ifd/base/ServerMessageHandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ServerMessageHandler.h" diff --git a/src/ifd/base/ServerMessageHandler.h b/src/ifd/base/ServerMessageHandler.h index 402b228f9..f08fd50a4 100644 --- a/src/ifd/base/ServerMessageHandler.h +++ b/src/ifd/base/ServerMessageHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Handler for messages on the server side of a smartphone as card reader (SaC) scenario. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/ServerMessageHandlerImpl.cpp b/src/ifd/base/ServerMessageHandlerImpl.cpp index aeaf66b41..077963138 100644 --- a/src/ifd/base/ServerMessageHandlerImpl.cpp +++ b/src/ifd/base/ServerMessageHandlerImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ServerMessageHandlerImpl.h" diff --git a/src/ifd/base/ServerMessageHandlerImpl.h b/src/ifd/base/ServerMessageHandlerImpl.h index 108d76529..b6f21a250 100644 --- a/src/ifd/base/ServerMessageHandlerImpl.h +++ b/src/ifd/base/ServerMessageHandlerImpl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Handler for messages on the server side of a smartphone as card reader (SaC) scenario. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/TlsServer.cpp b/src/ifd/base/TlsServer.cpp index e9a5e1316..b369c115e 100644 --- a/src/ifd/base/TlsServer.cpp +++ b/src/ifd/base/TlsServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "TlsServer.h" diff --git a/src/ifd/base/TlsServer.h b/src/ifd/base/TlsServer.h index 047b45192..4df443c36 100644 --- a/src/ifd/base/TlsServer.h +++ b/src/ifd/base/TlsServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief QTcpServer with necessary TLS handling of remote device configuration. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/WebSocketChannel.cpp b/src/ifd/base/WebSocketChannel.cpp index ffb85e3a5..855d29832 100644 --- a/src/ifd/base/WebSocketChannel.cpp +++ b/src/ifd/base/WebSocketChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "WebSocketChannel.h" diff --git a/src/ifd/base/WebSocketChannel.h b/src/ifd/base/WebSocketChannel.h index 84552514b..40214b8cb 100644 --- a/src/ifd/base/WebSocketChannel.h +++ b/src/ifd/base/WebSocketChannel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of DataChannel base on web sockets. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/WebSocketServer.cpp b/src/ifd/base/WebSocketServer.cpp index 18f1833e3..e16232423 100644 --- a/src/ifd/base/WebSocketServer.cpp +++ b/src/ifd/base/WebSocketServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "WebSocketServer.h" diff --git a/src/ifd/base/WebSocketServer.h b/src/ifd/base/WebSocketServer.h index 1ce62525b..4d91af571 100644 --- a/src/ifd/base/WebSocketServer.h +++ b/src/ifd/base/WebSocketServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief WebSocketServer on the server side of a smartphone as card reader (SaC) scenario. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/WebSocketServerImpl.cpp b/src/ifd/base/WebSocketServerImpl.cpp index 00dc4f1b5..882ad1b88 100644 --- a/src/ifd/base/WebSocketServerImpl.cpp +++ b/src/ifd/base/WebSocketServerImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "WebSocketServerImpl.h" diff --git a/src/ifd/base/WebSocketServerImpl.h b/src/ifd/base/WebSocketServerImpl.h index 9e522ed55..08d2c55a8 100644 --- a/src/ifd/base/WebSocketServerImpl.h +++ b/src/ifd/base/WebSocketServerImpl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief WebSocketServer on the server side of a smartphone as card reader (SaC) scenario. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/Discovery.cpp b/src/ifd/base/messages/Discovery.cpp index 6df415247..2fa707d58 100644 --- a/src/ifd/base/messages/Discovery.cpp +++ b/src/ifd/base/messages/Discovery.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ @@ -129,13 +129,13 @@ void Discovery::parsePairing(const QJsonObject& pMessageObject) } -Discovery::Discovery(const QString& pIfdName, const QString& pIfdId, quint16 pPort, const QVector& pSupportedApis) +Discovery::Discovery(const QString& pIfdName, const QString& pIfdId, quint16 pPort, const QVector& pSupportedApis, bool pPairing) : IfdMessage(IfdMessageType::UNDEFINED) , mIfdName(pIfdName) , mIfdId(pIfdId) , mPort(pPort) , mSupportedApis(pSupportedApis) - , mPairing(false) + , mPairing(pPairing) { } diff --git a/src/ifd/base/messages/Discovery.h b/src/ifd/base/messages/Discovery.h index 47375b2de..51195660c 100644 --- a/src/ifd/base/messages/Discovery.h +++ b/src/ifd/base/messages/Discovery.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -27,7 +27,7 @@ class Discovery void parsePairing(const QJsonObject& pMessageObject); public: - Discovery(const QString& pIfdName, const QString& pIfdId, quint16 pPort, const QVector& pSupportedApis); + Discovery(const QString& pIfdName, const QString& pIfdId, quint16 pPort, const QVector& pSupportedApis, bool pPairing = false); explicit Discovery(const QJsonObject& pMessageObject); ~Discovery() override = default; diff --git a/src/ifd/base/messages/IfdConnect.cpp b/src/ifd/base/messages/IfdConnect.cpp index df7946559..482d4f99a 100644 --- a/src/ifd/base/messages/IfdConnect.cpp +++ b/src/ifd/base/messages/IfdConnect.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdConnect.h b/src/ifd/base/messages/IfdConnect.h index e362ab38d..e72e8a2f1 100644 --- a/src/ifd/base/messages/IfdConnect.h +++ b/src/ifd/base/messages/IfdConnect.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdConnectResponse.cpp b/src/ifd/base/messages/IfdConnectResponse.cpp index f2c53d773..983da1b26 100644 --- a/src/ifd/base/messages/IfdConnectResponse.cpp +++ b/src/ifd/base/messages/IfdConnectResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdConnectResponse.h b/src/ifd/base/messages/IfdConnectResponse.h index 89ceee723..bfb8f636b 100644 --- a/src/ifd/base/messages/IfdConnectResponse.h +++ b/src/ifd/base/messages/IfdConnectResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdDisconnect.cpp b/src/ifd/base/messages/IfdDisconnect.cpp index 553cba143..97f052fdd 100644 --- a/src/ifd/base/messages/IfdDisconnect.cpp +++ b/src/ifd/base/messages/IfdDisconnect.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdDisconnect.h b/src/ifd/base/messages/IfdDisconnect.h index 47f7ee660..fb1f26057 100644 --- a/src/ifd/base/messages/IfdDisconnect.h +++ b/src/ifd/base/messages/IfdDisconnect.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdDisconnectResponse.cpp b/src/ifd/base/messages/IfdDisconnectResponse.cpp index e5420f4dc..1bd4c259e 100644 --- a/src/ifd/base/messages/IfdDisconnectResponse.cpp +++ b/src/ifd/base/messages/IfdDisconnectResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdDisconnectResponse.h b/src/ifd/base/messages/IfdDisconnectResponse.h index 3fdf94cfa..20d2fb5c4 100644 --- a/src/ifd/base/messages/IfdDisconnectResponse.h +++ b/src/ifd/base/messages/IfdDisconnectResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdError.cpp b/src/ifd/base/messages/IfdError.cpp index ce52e8676..2d2acd713 100644 --- a/src/ifd/base/messages/IfdError.cpp +++ b/src/ifd/base/messages/IfdError.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdError.h b/src/ifd/base/messages/IfdError.h index 9ddc33b34..7c30fd680 100644 --- a/src/ifd/base/messages/IfdError.h +++ b/src/ifd/base/messages/IfdError.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdEstablishContext.cpp b/src/ifd/base/messages/IfdEstablishContext.cpp index e3e272d28..f73477cc8 100644 --- a/src/ifd/base/messages/IfdEstablishContext.cpp +++ b/src/ifd/base/messages/IfdEstablishContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdEstablishContext.h b/src/ifd/base/messages/IfdEstablishContext.h index 121c4ebfe..523c92943 100644 --- a/src/ifd/base/messages/IfdEstablishContext.h +++ b/src/ifd/base/messages/IfdEstablishContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdEstablishContextResponse.cpp b/src/ifd/base/messages/IfdEstablishContextResponse.cpp index 2c1155415..b28634eb9 100644 --- a/src/ifd/base/messages/IfdEstablishContextResponse.cpp +++ b/src/ifd/base/messages/IfdEstablishContextResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdEstablishContextResponse.h b/src/ifd/base/messages/IfdEstablishContextResponse.h index 1f68c4898..8cc42adae 100644 --- a/src/ifd/base/messages/IfdEstablishContextResponse.h +++ b/src/ifd/base/messages/IfdEstablishContextResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdEstablishPaceChannel.cpp b/src/ifd/base/messages/IfdEstablishPaceChannel.cpp index 1253cd81c..f1a3a8bd9 100644 --- a/src/ifd/base/messages/IfdEstablishPaceChannel.cpp +++ b/src/ifd/base/messages/IfdEstablishPaceChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdEstablishPaceChannel.h" diff --git a/src/ifd/base/messages/IfdEstablishPaceChannel.h b/src/ifd/base/messages/IfdEstablishPaceChannel.h index 65e60cbd1..caaa24296 100644 --- a/src/ifd/base/messages/IfdEstablishPaceChannel.h +++ b/src/ifd/base/messages/IfdEstablishPaceChannel.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdEstablishPaceChannelResponse.cpp b/src/ifd/base/messages/IfdEstablishPaceChannelResponse.cpp index e8c8487d1..60982d874 100644 --- a/src/ifd/base/messages/IfdEstablishPaceChannelResponse.cpp +++ b/src/ifd/base/messages/IfdEstablishPaceChannelResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdEstablishPaceChannelResponse.h" diff --git a/src/ifd/base/messages/IfdEstablishPaceChannelResponse.h b/src/ifd/base/messages/IfdEstablishPaceChannelResponse.h index 03bf3a939..e6214bbe9 100644 --- a/src/ifd/base/messages/IfdEstablishPaceChannelResponse.h +++ b/src/ifd/base/messages/IfdEstablishPaceChannelResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdGetStatus.cpp b/src/ifd/base/messages/IfdGetStatus.cpp index 317a805b5..2802d323c 100644 --- a/src/ifd/base/messages/IfdGetStatus.cpp +++ b/src/ifd/base/messages/IfdGetStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdGetStatus.h b/src/ifd/base/messages/IfdGetStatus.h index 9eb6ec130..b2e1f3fd5 100644 --- a/src/ifd/base/messages/IfdGetStatus.h +++ b/src/ifd/base/messages/IfdGetStatus.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdMessage.cpp b/src/ifd/base/messages/IfdMessage.cpp index 0baa9261c..827d87946 100644 --- a/src/ifd/base/messages/IfdMessage.cpp +++ b/src/ifd/base/messages/IfdMessage.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdMessage.h b/src/ifd/base/messages/IfdMessage.h index 0c3531525..97b9de6df 100644 --- a/src/ifd/base/messages/IfdMessage.h +++ b/src/ifd/base/messages/IfdMessage.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdMessageResponse.cpp b/src/ifd/base/messages/IfdMessageResponse.cpp index c20621719..0aba5afb5 100644 --- a/src/ifd/base/messages/IfdMessageResponse.cpp +++ b/src/ifd/base/messages/IfdMessageResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdMessageResponse.h b/src/ifd/base/messages/IfdMessageResponse.h index c4b7570dc..f2acd107c 100644 --- a/src/ifd/base/messages/IfdMessageResponse.h +++ b/src/ifd/base/messages/IfdMessageResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdModifyPin.cpp b/src/ifd/base/messages/IfdModifyPin.cpp index 8ca7dbf58..a3f870ccb 100644 --- a/src/ifd/base/messages/IfdModifyPin.cpp +++ b/src/ifd/base/messages/IfdModifyPin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdModifyPin.h" diff --git a/src/ifd/base/messages/IfdModifyPin.h b/src/ifd/base/messages/IfdModifyPin.h index 863c290cb..e111767f3 100644 --- a/src/ifd/base/messages/IfdModifyPin.h +++ b/src/ifd/base/messages/IfdModifyPin.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdModifyPinResponse.cpp b/src/ifd/base/messages/IfdModifyPinResponse.cpp index 3faad8967..3133a0835 100644 --- a/src/ifd/base/messages/IfdModifyPinResponse.cpp +++ b/src/ifd/base/messages/IfdModifyPinResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdModifyPinResponse.h" diff --git a/src/ifd/base/messages/IfdModifyPinResponse.h b/src/ifd/base/messages/IfdModifyPinResponse.h index ff8b0e464..a0d2c063a 100644 --- a/src/ifd/base/messages/IfdModifyPinResponse.h +++ b/src/ifd/base/messages/IfdModifyPinResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdStatus.cpp b/src/ifd/base/messages/IfdStatus.cpp index ec4bbd1b1..6b33e1e3c 100644 --- a/src/ifd/base/messages/IfdStatus.cpp +++ b/src/ifd/base/messages/IfdStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdStatus.h b/src/ifd/base/messages/IfdStatus.h index 6fa6072ff..885db639c 100644 --- a/src/ifd/base/messages/IfdStatus.h +++ b/src/ifd/base/messages/IfdStatus.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdTransmit.cpp b/src/ifd/base/messages/IfdTransmit.cpp index ba956e7be..dbc798446 100644 --- a/src/ifd/base/messages/IfdTransmit.cpp +++ b/src/ifd/base/messages/IfdTransmit.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdTransmit.h b/src/ifd/base/messages/IfdTransmit.h index 0fd6656e0..eac127d18 100644 --- a/src/ifd/base/messages/IfdTransmit.h +++ b/src/ifd/base/messages/IfdTransmit.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdTransmitResponse.cpp b/src/ifd/base/messages/IfdTransmitResponse.cpp index e1360e7d6..1c70f0e65 100644 --- a/src/ifd/base/messages/IfdTransmitResponse.cpp +++ b/src/ifd/base/messages/IfdTransmitResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdTransmitResponse.h b/src/ifd/base/messages/IfdTransmitResponse.h index 6aa4da272..28b97ab5d 100644 --- a/src/ifd/base/messages/IfdTransmitResponse.h +++ b/src/ifd/base/messages/IfdTransmitResponse.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/base/messages/IfdVersion.cpp b/src/ifd/base/messages/IfdVersion.cpp index 527690b14..6e0541a37 100644 --- a/src/ifd/base/messages/IfdVersion.cpp +++ b/src/ifd/base/messages/IfdVersion.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/ifd/base/messages/IfdVersion.h b/src/ifd/base/messages/IfdVersion.h index f58abe276..c81f6a7fd 100644 --- a/src/ifd/base/messages/IfdVersion.h +++ b/src/ifd/base/messages/IfdVersion.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/local/LocalIfdClient.cpp b/src/ifd/local/LocalIfdClient.cpp index 69c350cd5..a98b2ba51 100644 --- a/src/ifd/local/LocalIfdClient.cpp +++ b/src/ifd/local/LocalIfdClient.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalIfdClient.h" diff --git a/src/ifd/local/LocalIfdClient.h b/src/ifd/local/LocalIfdClient.h index acac7c6b2..5883e5bce 100644 --- a/src/ifd/local/LocalIfdClient.h +++ b/src/ifd/local/LocalIfdClient.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/local/LocalIfdReaderManagerPlugIn.cpp b/src/ifd/local/LocalIfdReaderManagerPlugIn.cpp index e00369f7a..3a43d5f3f 100644 --- a/src/ifd/local/LocalIfdReaderManagerPlugIn.cpp +++ b/src/ifd/local/LocalIfdReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalIfdReaderManagerPlugIn.h" diff --git a/src/ifd/local/LocalIfdReaderManagerPlugIn.h b/src/ifd/local/LocalIfdReaderManagerPlugIn.h index 8a62f7218..ea816126b 100644 --- a/src/ifd/local/LocalIfdReaderManagerPlugIn.h +++ b/src/ifd/local/LocalIfdReaderManagerPlugIn.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/local/LocalIfdServer.cpp b/src/ifd/local/LocalIfdServer.cpp index ec8134a7e..66c2c4403 100644 --- a/src/ifd/local/LocalIfdServer.cpp +++ b/src/ifd/local/LocalIfdServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalIfdServer.h" diff --git a/src/ifd/local/LocalIfdServer.h b/src/ifd/local/LocalIfdServer.h index 81fcd31f6..082d784bb 100644 --- a/src/ifd/local/LocalIfdServer.h +++ b/src/ifd/local/LocalIfdServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Local Ifd server service to offer SaC to localhost websocket connections. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/local/LocalTlsServer.cpp b/src/ifd/local/LocalTlsServer.cpp index 13ce9cbc7..23e1c9350 100644 --- a/src/ifd/local/LocalTlsServer.cpp +++ b/src/ifd/local/LocalTlsServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalTlsServer.h" diff --git a/src/ifd/local/LocalTlsServer.h b/src/ifd/local/LocalTlsServer.h index d8989cbd8..b76eddb4d 100644 --- a/src/ifd/local/LocalTlsServer.h +++ b/src/ifd/local/LocalTlsServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief QTcpServer with necessary TLS handling of remote device configuration. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/local/LocalWebSocketServer.cpp b/src/ifd/local/LocalWebSocketServer.cpp index c17aba05e..d8bc0b1b4 100644 --- a/src/ifd/local/LocalWebSocketServer.cpp +++ b/src/ifd/local/LocalWebSocketServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalWebSocketServer.h" diff --git a/src/ifd/local/LocalWebSocketServer.h b/src/ifd/local/LocalWebSocketServer.h index 94e400482..30f03d292 100644 --- a/src/ifd/local/LocalWebSocketServer.h +++ b/src/ifd/local/LocalWebSocketServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Extension of WebSocketServer interface for local PSK connections - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/local/LocalWebSocketServerImpl.cpp b/src/ifd/local/LocalWebSocketServerImpl.cpp index df7cfa737..3478eec82 100644 --- a/src/ifd/local/LocalWebSocketServerImpl.cpp +++ b/src/ifd/local/LocalWebSocketServerImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalWebSocketServerImpl.h" diff --git a/src/ifd/local/LocalWebSocketServerImpl.h b/src/ifd/local/LocalWebSocketServerImpl.h index f74cbdd08..11b5177e0 100644 --- a/src/ifd/local/LocalWebSocketServerImpl.h +++ b/src/ifd/local/LocalWebSocketServerImpl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of LocalWebSocketServer interface - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/remote/RemoteIfdClient.cpp b/src/ifd/remote/RemoteIfdClient.cpp index d4eb37b04..2ce8f2736 100644 --- a/src/ifd/remote/RemoteIfdClient.cpp +++ b/src/ifd/remote/RemoteIfdClient.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteIfdClient.h" diff --git a/src/ifd/remote/RemoteIfdClient.h b/src/ifd/remote/RemoteIfdClient.h index 85b0a70da..88ab6ea16 100644 --- a/src/ifd/remote/RemoteIfdClient.h +++ b/src/ifd/remote/RemoteIfdClient.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Send RemoteReaderDiscoverCmds and maintain a list of responsive peers. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/remote/RemoteIfdReaderManagerPlugIn.cpp b/src/ifd/remote/RemoteIfdReaderManagerPlugIn.cpp index e9e8cc1ba..837ae7355 100644 --- a/src/ifd/remote/RemoteIfdReaderManagerPlugIn.cpp +++ b/src/ifd/remote/RemoteIfdReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteIfdReaderManagerPlugIn.h" diff --git a/src/ifd/remote/RemoteIfdReaderManagerPlugIn.h b/src/ifd/remote/RemoteIfdReaderManagerPlugIn.h index b082fd168..68bbb35bc 100644 --- a/src/ifd/remote/RemoteIfdReaderManagerPlugIn.h +++ b/src/ifd/remote/RemoteIfdReaderManagerPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implementation of \ref ReaderManagerPlugIn for smartphone as card reader (SaC). - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/remote/RemoteIfdServer.cpp b/src/ifd/remote/RemoteIfdServer.cpp index f5d935497..16c81a0bb 100644 --- a/src/ifd/remote/RemoteIfdServer.cpp +++ b/src/ifd/remote/RemoteIfdServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteIfdServer.h" diff --git a/src/ifd/remote/RemoteIfdServer.h b/src/ifd/remote/RemoteIfdServer.h index b442a921d..d59201bd8 100644 --- a/src/ifd/remote/RemoteIfdServer.h +++ b/src/ifd/remote/RemoteIfdServer.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Remote Ifd server service to offer smartphones as card readers (SaCs). * This class controls the advertising over UDP as well as the Websocket connection management. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/remote/RemoteReaderAdvertiser.cpp b/src/ifd/remote/RemoteReaderAdvertiser.cpp index a4959c434..d49fa85e7 100644 --- a/src/ifd/remote/RemoteReaderAdvertiser.cpp +++ b/src/ifd/remote/RemoteReaderAdvertiser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteReaderAdvertiser.h" @@ -24,12 +24,6 @@ template<> RemoteReaderAdvertiser* createNewObject RemoteReaderAdvertiser* createNewObject(const QString& pIfdName, const QString& pIfdId, quint16& pPort, int& pTimerInterval) -{ - return new RemoteReaderAdvertiserImpl(pIfdName, pIfdId, pPort, pTimerInterval); -} - - } // namespace governikus @@ -40,24 +34,31 @@ void RemoteReaderAdvertiserImpl::timerEvent(QTimerEvent* pEvent) { if (pEvent->timerId() == mTimerId) { - mHandler->send(mDiscovery.toByteArray(IfdVersion::Version::latest)); + sendDiscovery(); } } +void RemoteReaderAdvertiserImpl::sendDiscovery() +{ + mHandler->send(mDiscovery.toByteArray(IfdVersion::Version::latest)); +} + + RemoteReaderAdvertiserImpl::~RemoteReaderAdvertiserImpl() { qCDebug(ifd) << "Stop advertising"; } -RemoteReaderAdvertiserImpl::RemoteReaderAdvertiserImpl(const QString& pIfdName, const QString& pIfdId, quint16 pPort, int pTimerInterval) +RemoteReaderAdvertiserImpl::RemoteReaderAdvertiserImpl(const QString& pIfdName, const QString& pIfdId, quint16 pPort, int pTimerInterval, bool pPairing) : RemoteReaderAdvertiser() , mHandler(Env::create(false)) , mTimerId(startTimer(pTimerInterval)) - , mDiscovery(Discovery(pIfdName, pIfdId, pPort, {IfdVersion::supported()})) + , mDiscovery(Discovery(pIfdName, pIfdId, pPort, {IfdVersion::supported()}, pPairing)) { qCDebug(ifd) << "Start advertising every" << pTimerInterval << "msecs"; + sendDiscovery(); } diff --git a/src/ifd/remote/RemoteReaderAdvertiser.h b/src/ifd/remote/RemoteReaderAdvertiser.h index 2efbb19cc..bd7134077 100644 --- a/src/ifd/remote/RemoteReaderAdvertiser.h +++ b/src/ifd/remote/RemoteReaderAdvertiser.h @@ -1,9 +1,11 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Component advertising the smartphone as card reader (SaC) * functionality on the server side. According to the concept this * is done by sending the message REMOTE_READER_OFFER as a UDP broadcast. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -47,10 +49,11 @@ class RemoteReaderAdvertiserImpl Discovery mDiscovery; void timerEvent(QTimerEvent* pEvent) override; + void sendDiscovery(); public: ~RemoteReaderAdvertiserImpl() override; - RemoteReaderAdvertiserImpl(const QString& pIfdName, const QString& pIfdId, quint16 pPort, int pTimerInterval = 1000); + RemoteReaderAdvertiserImpl(const QString& pIfdName, const QString& pIfdId, quint16 pPort, int pTimerInterval = 1000, bool pPairing = false); void setPairing(bool pEnabled) override; }; diff --git a/src/ifd/remote/RemoteTlsServer.cpp b/src/ifd/remote/RemoteTlsServer.cpp index 0fd2af96f..9ce2daac6 100644 --- a/src/ifd/remote/RemoteTlsServer.cpp +++ b/src/ifd/remote/RemoteTlsServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteTlsServer.h" diff --git a/src/ifd/remote/RemoteTlsServer.h b/src/ifd/remote/RemoteTlsServer.h index 213ef66ce..39fc7a10f 100644 --- a/src/ifd/remote/RemoteTlsServer.h +++ b/src/ifd/remote/RemoteTlsServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief QTcpServer with necessary TLS handling of remote device configuration. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/remote/RemoteWebSocketServer.cpp b/src/ifd/remote/RemoteWebSocketServer.cpp index 7e42a0742..d955bad8d 100644 --- a/src/ifd/remote/RemoteWebSocketServer.cpp +++ b/src/ifd/remote/RemoteWebSocketServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteWebSocketServer.h" diff --git a/src/ifd/remote/RemoteWebSocketServer.h b/src/ifd/remote/RemoteWebSocketServer.h index 319075b04..91a614bd2 100644 --- a/src/ifd/remote/RemoteWebSocketServer.h +++ b/src/ifd/remote/RemoteWebSocketServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief WebSocketServer on the server side of a smartphone as card reader (SaC) scenario. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ifd/remote/RemoteWebSocketServerImpl.cpp b/src/ifd/remote/RemoteWebSocketServerImpl.cpp index 781d99e8b..da8b91309 100644 --- a/src/ifd/remote/RemoteWebSocketServerImpl.cpp +++ b/src/ifd/remote/RemoteWebSocketServerImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteWebSocketServerImpl.h" diff --git a/src/ifd/remote/RemoteWebSocketServerImpl.h b/src/ifd/remote/RemoteWebSocketServerImpl.h index cf9e4e586..6089f00fe 100644 --- a/src/ifd/remote/RemoteWebSocketServerImpl.h +++ b/src/ifd/remote/RemoteWebSocketServerImpl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief WebSocketServer on the server side of a smartphone as card reader (SaC) scenario. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/init/Bootstrap.cpp b/src/init/Bootstrap.cpp index 0048d2fbd..21cb7d969 100644 --- a/src/init/Bootstrap.cpp +++ b/src/init/Bootstrap.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Bootstrap.h" diff --git a/src/init/Bootstrap.h b/src/init/Bootstrap.h index c5e983297..510190e94 100644 --- a/src/init/Bootstrap.h +++ b/src/init/Bootstrap.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/init/CommandLineParser.cpp b/src/init/CommandLineParser.cpp index ac7435682..643bcbbb6 100644 --- a/src/init/CommandLineParser.cpp +++ b/src/init/CommandLineParser.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CommandLineParser.h" diff --git a/src/init/CommandLineParser.h b/src/init/CommandLineParser.h index b32860e46..b48229913 100644 --- a/src/init/CommandLineParser.h +++ b/src/init/CommandLineParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Provides and parses command line options. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/init/SignalHandler.cpp b/src/init/SignalHandler.cpp index e7e592dc0..243067f74 100644 --- a/src/init/SignalHandler.cpp +++ b/src/init/SignalHandler.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SignalHandler.h" @@ -69,10 +69,13 @@ void SignalHandler::setController(const std::function& pController) } +#ifdef Q_OS_WIN void SignalHandler::quit() { -#ifdef Q_OS_WIN setServiceStatus(SERVICE_STOP_PENDING); +#else +void SignalHandler::quit() const +{ #endif if (mController) diff --git a/src/init/SignalHandler.h b/src/init/SignalHandler.h index 568aaa0a8..e2de2f638 100644 --- a/src/init/SignalHandler.h +++ b/src/init/SignalHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Implements signal handler for unix and windows. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -63,7 +65,11 @@ class SignalHandler private Q_SLOTS: void onSignalSocketActivated(); +#if defined(Q_OS_WIN) void quit(); +#else + void quit() const; +#endif public: void init(); diff --git a/src/init/SignalHandler_bsd_linux_osx.cpp b/src/init/SignalHandler_bsd_linux_osx.cpp index 0968a5597..e9b8b8211 100644 --- a/src/init/SignalHandler_bsd_linux_osx.cpp +++ b/src/init/SignalHandler_bsd_linux_osx.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "SignalHandler.h" diff --git a/src/init/SignalHandler_win.cpp b/src/init/SignalHandler_win.cpp index 6815709d8..360903f92 100644 --- a/src/init/SignalHandler_win.cpp +++ b/src/init/SignalHandler_win.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "SignalHandler.h" diff --git a/src/main.cpp b/src/main.cpp index 37aea616b..ad07ea5d2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Bootstrap.h" diff --git a/src/network/DatagramHandler.cpp b/src/network/DatagramHandler.cpp index b61989b32..42d2f6444 100644 --- a/src/network/DatagramHandler.cpp +++ b/src/network/DatagramHandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "DatagramHandler.h" diff --git a/src/network/DatagramHandler.h b/src/network/DatagramHandler.h index dcf841477..61d48d479 100644 --- a/src/network/DatagramHandler.h +++ b/src/network/DatagramHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provides an interface to send and receive datagrams over UDP. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/DatagramHandlerImpl.cpp b/src/network/DatagramHandlerImpl.cpp index f9913f385..bd241e7b8 100644 --- a/src/network/DatagramHandlerImpl.cpp +++ b/src/network/DatagramHandlerImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "DatagramHandlerImpl.h" diff --git a/src/network/DatagramHandlerImpl.h b/src/network/DatagramHandlerImpl.h index 7e2fbb2e0..c51c8c0b6 100644 --- a/src/network/DatagramHandlerImpl.h +++ b/src/network/DatagramHandlerImpl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provides an UDP socket to send and receive datagrams. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/HttpHandler.cpp b/src/network/HttpHandler.cpp index 259f34896..a4e6f42ce 100644 --- a/src/network/HttpHandler.cpp +++ b/src/network/HttpHandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpHandler.h" diff --git a/src/network/HttpHandler.h b/src/network/HttpHandler.h index deb2019bd..05cd11f7c 100644 --- a/src/network/HttpHandler.h +++ b/src/network/HttpHandler.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/HttpRequest.cpp b/src/network/HttpRequest.cpp index b4347f61b..bc62d74c8 100644 --- a/src/network/HttpRequest.cpp +++ b/src/network/HttpRequest.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpRequest.h" diff --git a/src/network/HttpRequest.h b/src/network/HttpRequest.h index f6c8b86a9..54046aa8b 100644 --- a/src/network/HttpRequest.h +++ b/src/network/HttpRequest.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to parse http request. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/HttpResponse.cpp b/src/network/HttpResponse.cpp index 8a380fe3f..35edf2af8 100644 --- a/src/network/HttpResponse.cpp +++ b/src/network/HttpResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpResponse.h" diff --git a/src/network/HttpResponse.h b/src/network/HttpResponse.h index 18ed10f56..6ee8ba9aa 100644 --- a/src/network/HttpResponse.h +++ b/src/network/HttpResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to create http response. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/HttpServer.cpp b/src/network/HttpServer.cpp index c9446d854..b2192574c 100644 --- a/src/network/HttpServer.cpp +++ b/src/network/HttpServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpServer.h" @@ -91,9 +91,14 @@ void HttpServer::bindAddresses(quint16 pPort, const QVector& pAddr } -int HttpServer::boundAddresses() const +QStringList HttpServer::boundAddresses() const { - return mServer.size(); + QStringList serverList; + for (const auto& server : std::as_const(mServer)) + { + serverList << server->serverAddress().toString() + QLatin1Char(':') + QString::number(server->serverPort()); + } + return serverList; } diff --git a/src/network/HttpServer.h b/src/network/HttpServer.h index 65865085c..a32b8da76 100644 --- a/src/network/HttpServer.h +++ b/src/network/HttpServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provide a HTTP server. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -10,6 +12,7 @@ #include "PortFile.h" #include +#include #include #include @@ -38,7 +41,7 @@ class HttpServer const QVector& pAddresses = HttpServer::cAddresses); ~HttpServer() override; - [[nodiscard]] int boundAddresses() const; + [[nodiscard]] QStringList boundAddresses() const; [[nodiscard]] bool isListening() const; [[nodiscard]] quint16 getServerPort() const; void rebind(quint16 pPort = 0, const QVector& pAddresses = HttpServer::cAddresses); diff --git a/src/network/HttpServerRequestor.cpp b/src/network/HttpServerRequestor.cpp index 4785e8b3c..a4e335da2 100644 --- a/src/network/HttpServerRequestor.cpp +++ b/src/network/HttpServerRequestor.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpServerRequestor.h" diff --git a/src/network/HttpServerRequestor.h b/src/network/HttpServerRequestor.h index e748e0111..53de6ae59 100644 --- a/src/network/HttpServerRequestor.h +++ b/src/network/HttpServerRequestor.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Sends one time GET requests to server. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/HttpServerStatusParser.cpp b/src/network/HttpServerStatusParser.cpp index 9e96a8e12..0fdab6f1c 100644 --- a/src/network/HttpServerStatusParser.cpp +++ b/src/network/HttpServerStatusParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpServerStatusParser.h" diff --git a/src/network/HttpServerStatusParser.h b/src/network/HttpServerStatusParser.h index 3a23024a9..91df65dee 100644 --- a/src/network/HttpServerStatusParser.h +++ b/src/network/HttpServerStatusParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Sends a status request to given url:port and tries to detect details and server header. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/MulticastLock.cpp b/src/network/MulticastLock.cpp index 692e5f5e5..c042ac313 100644 --- a/src/network/MulticastLock.cpp +++ b/src/network/MulticastLock.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "MulticastLock.h" diff --git a/src/network/MulticastLock.h b/src/network/MulticastLock.h index ec661354a..746bde9c7 100644 --- a/src/network/MulticastLock.h +++ b/src/network/MulticastLock.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/MulticastLockJniBridgeUtil.java b/src/network/MulticastLockJniBridgeUtil.java index 832ab317a..24b33eba7 100644 --- a/src/network/MulticastLockJniBridgeUtil.java +++ b/src/network/MulticastLockJniBridgeUtil.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/network/NetworkManager.cpp b/src/network/NetworkManager.cpp index a13a9bbae..369fc8bf2 100644 --- a/src/network/NetworkManager.cpp +++ b/src/network/NetworkManager.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "NetworkManager.h" diff --git a/src/network/NetworkManager.h b/src/network/NetworkManager.h index fe0e327cf..472087fe6 100644 --- a/src/network/NetworkManager.h +++ b/src/network/NetworkManager.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Wrapper around QNetworkAccessManager - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/NetworkReplyError.cpp b/src/network/NetworkReplyError.cpp index 1426fb36b..421218b9c 100644 --- a/src/network/NetworkReplyError.cpp +++ b/src/network/NetworkReplyError.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "NetworkReplyError.h" diff --git a/src/network/NetworkReplyError.h b/src/network/NetworkReplyError.h index 88974364b..cfc5720e4 100644 --- a/src/network/NetworkReplyError.h +++ b/src/network/NetworkReplyError.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/NetworkReplyTimeout.cpp b/src/network/NetworkReplyTimeout.cpp index 14f7715c1..14acf8d46 100644 --- a/src/network/NetworkReplyTimeout.cpp +++ b/src/network/NetworkReplyTimeout.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "NetworkReplyTimeout.h" diff --git a/src/network/NetworkReplyTimeout.h b/src/network/NetworkReplyTimeout.h index 41db1b6bf..729e46d15 100644 --- a/src/network/NetworkReplyTimeout.h +++ b/src/network/NetworkReplyTimeout.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Utility class to set a timeout on a QNetworkReply - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/PortFile.cpp b/src/network/PortFile.cpp index 45bc67bf5..6a0728feb 100644 --- a/src/network/PortFile.cpp +++ b/src/network/PortFile.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "PortFile.h" @@ -52,6 +52,12 @@ void PortFile::remove() } +const QFile& PortFile::getFile() const +{ + return mPortFile; +} + + QFileInfoList PortFile::getAllPortFiles() { QDir tmpPath = QDir::temp(); diff --git a/src/network/PortFile.h b/src/network/PortFile.h index 9962cb1d2..0324196ca 100644 --- a/src/network/PortFile.h +++ b/src/network/PortFile.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -31,6 +31,7 @@ class PortFile void handlePort(quint16 pCurrentPort); void remove(); + [[nodiscard]] const QFile& getFile() const; }; } // namespace governikus diff --git a/src/network/Template.cpp b/src/network/Template.cpp index a5613a796..b9682aa50 100644 --- a/src/network/Template.cpp +++ b/src/network/Template.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "Template.h" diff --git a/src/network/Template.h b/src/network/Template.h index 5c9eb0c14..f88075052 100644 --- a/src/network/Template.h +++ b/src/network/Template.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * A simple template renderer. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/network/TlsChecker.cpp b/src/network/TlsChecker.cpp index 662f784d9..6646fa43e 100644 --- a/src/network/TlsChecker.cpp +++ b/src/network/TlsChecker.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TlsChecker.h" @@ -257,6 +257,17 @@ bool TlsChecker::containsFatalError(const QSharedPointer& pReply, } +QString TlsChecker::sslErrorsToString(const QList& pErrors) +{ + QStringList errorString; + for (const auto& error : pErrors) + { + errorString += error.errorString(); + } + return errorString.join(QLatin1Char(',')); +} + + void TlsChecker::logSslConfig(const QSslConfiguration& pCfg, const MessageLogger& pLogger) { pLogger.info() << "Used session cipher" << pCfg.sessionCipher(); diff --git a/src/network/TlsChecker.h b/src/network/TlsChecker.h index f3600b1b0..72ab2e5d9 100644 --- a/src/network/TlsChecker.h +++ b/src/network/TlsChecker.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper to check certificates and other security stuff of TLS/SSL. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -34,6 +36,7 @@ class TlsChecker [[nodiscard]] static QStringList getFatalErrors(const QList& pErrors); [[nodiscard]] static bool containsFatalError(const QSharedPointer& pReply, const QList& pErrors); + [[nodiscard]] static QString sslErrorsToString(const QList& pErrors); /*! * Checks, whether the certificate's hash is contained in a set of accepted certificate hashes. diff --git a/src/network/UrlUtil.cpp b/src/network/UrlUtil.cpp index 7af1f96a1..d1752f341 100644 --- a/src/network/UrlUtil.cpp +++ b/src/network/UrlUtil.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/network/UrlUtil.h b/src/network/UrlUtil.h index 2e07fdca1..149ec38ed 100644 --- a/src/network/UrlUtil.h +++ b/src/network/UrlUtil.h @@ -1,6 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper to convert \ref Result to Redirect-Result-String and some other URL stuff. - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -24,8 +27,6 @@ defineEnumType(UrlQueryRequest, /*! * \brief Utility class for checking various constraints on URLs. - * - * \copyright Copyright (c) 2014 Governikus GmbH & Co. KG */ class UrlUtil { diff --git a/src/network/WifiInfo.cpp b/src/network/WifiInfo.cpp index 373e321c2..8152d7ee4 100644 --- a/src/network/WifiInfo.cpp +++ b/src/network/WifiInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "WifiInfo.h" diff --git a/src/network/WifiInfo.h b/src/network/WifiInfo.h index dd1ef18fa..6bfdcba13 100644 --- a/src/network/WifiInfo.h +++ b/src/network/WifiInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provides information about the WiFi status - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/network/WifiInfo.java b/src/network/WifiInfo.java index 85b0fced7..3cf52b791 100644 --- a/src/network/WifiInfo.java +++ b/src/network/WifiInfo.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/network/WifiInfo_android.cpp b/src/network/WifiInfo_android.cpp index adccdd763..f20c515fc 100644 --- a/src/network/WifiInfo_android.cpp +++ b/src/network/WifiInfo_android.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "WifiInfo.h" diff --git a/src/network/WifiInfo_generic.cpp b/src/network/WifiInfo_generic.cpp index 208430e2d..3558ccd2a 100644 --- a/src/network/WifiInfo_generic.cpp +++ b/src/network/WifiInfo_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "WifiInfo.h" diff --git a/src/network/WifiInfo_ios.mm b/src/network/WifiInfo_ios.mm index 6420a4334..72a9e7eb9 100644 --- a/src/network/WifiInfo_ios.mm +++ b/src/network/WifiInfo_ios.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "WifiInfo.h" diff --git a/src/secure_storage/SecureStorage.cpp b/src/secure_storage/SecureStorage.cpp index c2ca71586..cd05b4941 100644 --- a/src/secure_storage/SecureStorage.cpp +++ b/src/secure_storage/SecureStorage.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/secure_storage/SecureStorage.h b/src/secure_storage/SecureStorage.h index 9c6de9a5d..7d7aa9c9d 100644 --- a/src/secure_storage/SecureStorage.h +++ b/src/secure_storage/SecureStorage.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Utility class that provides access to the "secure storage" of the application, which contains * the certificates for preverification and update checks. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/secure_storage/TlsConfiguration.cpp b/src/secure_storage/TlsConfiguration.cpp index ca4088b0a..e5021bcac 100644 --- a/src/secure_storage/TlsConfiguration.cpp +++ b/src/secure_storage/TlsConfiguration.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "TlsConfiguration.h" diff --git a/src/secure_storage/TlsConfiguration.h b/src/secure_storage/TlsConfiguration.h index 1631e067f..5701b1e79 100644 --- a/src/secure_storage/TlsConfiguration.h +++ b/src/secure_storage/TlsConfiguration.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Configuration options for TLS channels - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/services/AppUpdateData.cpp b/src/services/AppUpdateData.cpp index 7d0f5ddd0..e5e510f7c 100644 --- a/src/services/AppUpdateData.cpp +++ b/src/services/AppUpdateData.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "AppUpdateData.h" diff --git a/src/services/AppUpdateData.h b/src/services/AppUpdateData.h index 3363c3252..8846da7bc 100644 --- a/src/services/AppUpdateData.h +++ b/src/services/AppUpdateData.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Update data implementation for application version. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/services/AppUpdater.cpp b/src/services/AppUpdater.cpp index f38a75188..c7ebe45ea 100644 --- a/src/services/AppUpdater.cpp +++ b/src/services/AppUpdater.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "AppUpdater.h" diff --git a/src/services/AppUpdater.h b/src/services/AppUpdater.h index 24d6b457a..1cc51fa0c 100644 --- a/src/services/AppUpdater.h +++ b/src/services/AppUpdater.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/services/Service.cpp b/src/services/Service.cpp index 1dd08cae4..eab8254ac 100644 --- a/src/services/Service.cpp +++ b/src/services/Service.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "Service.h" diff --git a/src/services/Service.h b/src/services/Service.h index 2d196be66..8c5e50304 100644 --- a/src/services/Service.h +++ b/src/services/Service.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/AbstractSettings.cpp b/src/settings/AbstractSettings.cpp index 10a4666a3..902670a3b 100644 --- a/src/settings/AbstractSettings.cpp +++ b/src/settings/AbstractSettings.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/settings/AbstractSettings.h b/src/settings/AbstractSettings.h index 9e120923a..13fd34c05 100644 --- a/src/settings/AbstractSettings.h +++ b/src/settings/AbstractSettings.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/AppSettings.cpp b/src/settings/AppSettings.cpp index 13bdcf6be..d430a8719 100644 --- a/src/settings/AppSettings.cpp +++ b/src/settings/AppSettings.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AppSettings.h" diff --git a/src/settings/AppSettings.h b/src/settings/AppSettings.h index f201b2836..1d531522d 100644 --- a/src/settings/AppSettings.h +++ b/src/settings/AppSettings.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains the definition of the AppSettings class. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/AutoStart.cpp b/src/settings/AutoStart.cpp index 75acac7b0..b0eeda7c3 100644 --- a/src/settings/AutoStart.cpp +++ b/src/settings/AutoStart.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "AutoStart.h" diff --git a/src/settings/AutoStart.h b/src/settings/AutoStart.h index ae069cbef..46919612f 100644 --- a/src/settings/AutoStart.h +++ b/src/settings/AutoStart.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/AutoStart_generic.cpp b/src/settings/AutoStart_generic.cpp index 491dcd1bb..ad507961d 100644 --- a/src/settings/AutoStart_generic.cpp +++ b/src/settings/AutoStart_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AutoStart.h" diff --git a/src/settings/AutoStart_osx.mm b/src/settings/AutoStart_osx.mm index c082a34e2..ca25424e2 100644 --- a/src/settings/AutoStart_osx.mm +++ b/src/settings/AutoStart_osx.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AutoStart.h" diff --git a/src/settings/AutoStart_win.cpp b/src/settings/AutoStart_win.cpp index 00b7ffdbd..e23fa1f39 100644 --- a/src/settings/AutoStart_win.cpp +++ b/src/settings/AutoStart_win.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AutoStart.h" diff --git a/src/settings/Backup.h b/src/settings/Backup.h index fd3bb0b86..b3beecc1d 100644 --- a/src/settings/Backup.h +++ b/src/settings/Backup.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/Backup_generic.cpp b/src/settings/Backup_generic.cpp index 4505931c0..3c0714fed 100644 --- a/src/settings/Backup_generic.cpp +++ b/src/settings/Backup_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "Backup.h" diff --git a/src/settings/Backup_ios_osx.mm b/src/settings/Backup_ios_osx.mm index 9c361a334..a5fd2e347 100644 --- a/src/settings/Backup_ios_osx.mm +++ b/src/settings/Backup_ios_osx.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "Backup.h" diff --git a/src/settings/GeneralSettings.cpp b/src/settings/GeneralSettings.cpp index 601de8ab3..4e5cbc7bd 100644 --- a/src/settings/GeneralSettings.cpp +++ b/src/settings/GeneralSettings.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains the method definitions of the GeneralSettings class. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "GeneralSettings.h" diff --git a/src/settings/GeneralSettings.h b/src/settings/GeneralSettings.h index cf7c20c46..cc9ee8e1e 100644 --- a/src/settings/GeneralSettings.h +++ b/src/settings/GeneralSettings.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains the definition of the GeneralSettings class. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/HistoryInfo.cpp b/src/settings/HistoryInfo.cpp index 7cbaa1b3e..df58fe7af 100644 --- a/src/settings/HistoryInfo.cpp +++ b/src/settings/HistoryInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "HistoryInfo.h" diff --git a/src/settings/HistoryInfo.h b/src/settings/HistoryInfo.h index d679b08b8..d7512b469 100644 --- a/src/settings/HistoryInfo.h +++ b/src/settings/HistoryInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Represents history settings. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/HistorySettings.cpp b/src/settings/HistorySettings.cpp index 74987002c..d6e6522e6 100644 --- a/src/settings/HistorySettings.cpp +++ b/src/settings/HistorySettings.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "HistorySettings.h" diff --git a/src/settings/HistorySettings.h b/src/settings/HistorySettings.h index 5df0a9b49..de5d4a0f2 100644 --- a/src/settings/HistorySettings.h +++ b/src/settings/HistorySettings.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Represents history settings. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/KeyPair.cpp b/src/settings/KeyPair.cpp index 23d34027b..d0f150327 100644 --- a/src/settings/KeyPair.cpp +++ b/src/settings/KeyPair.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/settings/KeyPair.h b/src/settings/KeyPair.h index 7a528e352..2183075ec 100644 --- a/src/settings/KeyPair.h +++ b/src/settings/KeyPair.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Generates a new private/public key with an X509 certificate. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/PreVerificationSettings.cpp b/src/settings/PreVerificationSettings.cpp index 46f370b2b..2de8a4cc7 100644 --- a/src/settings/PreVerificationSettings.cpp +++ b/src/settings/PreVerificationSettings.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PreVerificationSettings.h" diff --git a/src/settings/PreVerificationSettings.h b/src/settings/PreVerificationSettings.h index 5b925fdcb..82a17e5fe 100644 --- a/src/settings/PreVerificationSettings.h +++ b/src/settings/PreVerificationSettings.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Settings to handle PreVerification and the corresponding linked certificates. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/RemoteServiceSettings.cpp b/src/settings/RemoteServiceSettings.cpp index 2f18ca493..a105833bf 100644 --- a/src/settings/RemoteServiceSettings.cpp +++ b/src/settings/RemoteServiceSettings.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteServiceSettings.h" diff --git a/src/settings/RemoteServiceSettings.h b/src/settings/RemoteServiceSettings.h index 3c3977b7c..97f2bb993 100644 --- a/src/settings/RemoteServiceSettings.h +++ b/src/settings/RemoteServiceSettings.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief RemoteService settings - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/settings/VolatileSettings.cpp b/src/settings/VolatileSettings.cpp index e6424eda4..5ef60efe9 100644 --- a/src/settings/VolatileSettings.cpp +++ b/src/settings/VolatileSettings.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "VolatileSettings.h" diff --git a/src/settings/VolatileSettings.h b/src/settings/VolatileSettings.h index cd98ac218..8c7a15d38 100644 --- a/src/settings/VolatileSettings.h +++ b/src/settings/VolatileSettings.h @@ -1,10 +1,12 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains non-persistent settings. * * This is not integrated into AppSettings to avoid * circular dependency because settings can use this, too. - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/aidl/AidlBinder.java b/src/ui/aidl/AidlBinder.java index 7d94743a5..6c4ee61cc 100644 --- a/src/ui/aidl/AidlBinder.java +++ b/src/ui/aidl/AidlBinder.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/ui/aidl/UIPlugInAidl.cpp b/src/ui/aidl/UIPlugInAidl.cpp index 1d0a2f211..891b41ca6 100644 --- a/src/ui/aidl/UIPlugInAidl.cpp +++ b/src/ui/aidl/UIPlugInAidl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInAidl.h" diff --git a/src/ui/aidl/UIPlugInAidl.h b/src/ui/aidl/UIPlugInAidl.h index 3c03873fe..aa1598495 100644 --- a/src/ui/aidl/UIPlugInAidl.h +++ b/src/ui/aidl/UIPlugInAidl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of the AIDL UI. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/automatic/UIPlugInAutomatic.cpp b/src/ui/automatic/UIPlugInAutomatic.cpp index e1d799480..4fa967e20 100644 --- a/src/ui/automatic/UIPlugInAutomatic.cpp +++ b/src/ui/automatic/UIPlugInAutomatic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInAutomatic.h" @@ -21,6 +21,7 @@ UIPlugInAutomatic::UIPlugInAutomatic() : UIPlugIn() , mContext() , mPrevUsedAsSDK() + , mPrevUsedDeveloperMode() { } @@ -51,8 +52,15 @@ void UIPlugInAutomatic::onWorkflowStarted(QSharedPointer pConte mContext->setReaderPlugInTypes({ReaderManagerPlugInType::SIMULATOR, ReaderManagerPlugInType::PCSC}); connect(mContext.data(), &WorkflowContext::fireStateChanged, this, &UIPlugInAutomatic::onStateChanged); mPrevUsedAsSDK = Env::getSingleton()->isUsedAsSDK(); + mPrevUsedDeveloperMode = Env::getSingleton()->isDeveloperMode(); Env::getSingleton()->setUsedAsSDK(true); Env::getSingleton()->startScanAll(); + + const auto& developerMode = qEnvironmentVariable("AUSWEISAPP2_AUTOMATIC_DEVELOPERMODE").toLower(); + if (developerMode == QLatin1String("true") || developerMode == QLatin1String("on") || developerMode == QLatin1String("1")) + { + Env::getSingleton()->setDeveloperMode(true); + } } else { @@ -73,6 +81,7 @@ void UIPlugInAutomatic::onWorkflowFinished(QSharedPointer pCont Env::getSingleton()->stopScanAll(); Env::getSingleton()->setUsedAsSDK(mPrevUsedAsSDK); + Env::getSingleton()->setDeveloperMode(mPrevUsedDeveloperMode); mContext.clear(); } diff --git a/src/ui/automatic/UIPlugInAutomatic.h b/src/ui/automatic/UIPlugInAutomatic.h index 50251ce4f..856f501b3 100644 --- a/src/ui/automatic/UIPlugInAutomatic.h +++ b/src/ui/automatic/UIPlugInAutomatic.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of full automatic authentication. - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -25,6 +27,7 @@ class UIPlugInAutomatic QSharedPointer mContext; QString mDominator; bool mPrevUsedAsSDK; + bool mPrevUsedDeveloperMode; [[nodiscard]] bool isDominated() const; void handleInsertCard(); diff --git a/src/ui/base/UILoader.cpp b/src/ui/base/UILoader.cpp index 615ba255b..e09ae93d3 100644 --- a/src/ui/base/UILoader.cpp +++ b/src/ui/base/UILoader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "UILoader.h" @@ -122,15 +122,14 @@ bool UILoader::load(const QString& pUi) qCDebug(gui) << "Load plugin:" << metaData; auto instance = qobject_cast(plugin.instance()); - if (instance) - { - preparePlugIn(instance, metaData); - return true; - } - else + if (!instance) { qCWarning(gui) << "Cannot cast to plugin instance:" << plugin.instance(); + continue; } + + preparePlugIn(instance, metaData); + return true; } } diff --git a/src/ui/base/UILoader.h b/src/ui/base/UILoader.h index f6b2b0448..2e8e50cd8 100644 --- a/src/ui/base/UILoader.h +++ b/src/ui/base/UILoader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Loader to initialize UIPlugIns. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/base/UIPlugIn.cpp b/src/ui/base/UIPlugIn.cpp index f19e0a571..f4a37f05e 100644 --- a/src/ui/base/UIPlugIn.cpp +++ b/src/ui/base/UIPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugIn.h" diff --git a/src/ui/base/UIPlugIn.h b/src/ui/base/UIPlugIn.h index c620f3bbb..de1e4518a 100644 --- a/src/ui/base/UIPlugIn.h +++ b/src/ui/base/UIPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Abstract layer to UI implementations. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/functional/AusweisApp2.cpp b/src/ui/functional/AusweisApp2.cpp index 59b21c85b..612b6bb81 100644 --- a/src/ui/functional/AusweisApp2.cpp +++ b/src/ui/functional/AusweisApp2.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "AusweisApp2_p.h" diff --git a/src/ui/functional/AusweisApp2.h b/src/ui/functional/AusweisApp2.h index 08c348887..8f78781c1 100644 --- a/src/ui/functional/AusweisApp2.h +++ b/src/ui/functional/AusweisApp2.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #ifndef AUSWEISAPP2_HEADER diff --git a/src/ui/functional/AusweisApp2_p.h b/src/ui/functional/AusweisApp2_p.h index ed30203db..6387abbe8 100644 --- a/src/ui/functional/AusweisApp2_p.h +++ b/src/ui/functional/AusweisApp2_p.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/functional/UIPlugInFunctional.cpp b/src/ui/functional/UIPlugInFunctional.cpp index 6a0142e90..3ce9dbf28 100644 --- a/src/ui/functional/UIPlugInFunctional.cpp +++ b/src/ui/functional/UIPlugInFunctional.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInFunctional.h" diff --git a/src/ui/functional/UIPlugInFunctional.h b/src/ui/functional/UIPlugInFunctional.h index 00e5b1c9b..0f50c2431 100644 --- a/src/ui/functional/UIPlugInFunctional.h +++ b/src/ui/functional/UIPlugInFunctional.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of the integrated SDK (C-API). - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/MessageDispatcher.cpp b/src/ui/json/MessageDispatcher.cpp index fe29a2d41..cc5d7a1ad 100644 --- a/src/ui/json/MessageDispatcher.cpp +++ b/src/ui/json/MessageDispatcher.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MessageDispatcher.h" diff --git a/src/ui/json/MessageDispatcher.h b/src/ui/json/MessageDispatcher.h index 9c5e5ec6f..9e9ff44f3 100644 --- a/src/ui/json/MessageDispatcher.h +++ b/src/ui/json/MessageDispatcher.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Dispatch Messages of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/UIPlugInJson.cpp b/src/ui/json/UIPlugInJson.cpp index 476c8f5c8..f8528ee18 100644 --- a/src/ui/json/UIPlugInJson.cpp +++ b/src/ui/json/UIPlugInJson.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInJson.h" diff --git a/src/ui/json/UIPlugInJson.h b/src/ui/json/UIPlugInJson.h index 899edbdca..3272ce543 100644 --- a/src/ui/json/UIPlugInJson.h +++ b/src/ui/json/UIPlugInJson.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of the Json API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/Msg.cpp b/src/ui/json/messages/Msg.cpp index 2f9f8991e..49f6109c0 100644 --- a/src/ui/json/messages/Msg.cpp +++ b/src/ui/json/messages/Msg.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "Msg.h" diff --git a/src/ui/json/messages/Msg.h b/src/ui/json/messages/Msg.h index 131f2782e..539e93f96 100644 --- a/src/ui/json/messages/Msg.h +++ b/src/ui/json/messages/Msg.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Msg wrapper of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgContext.cpp b/src/ui/json/messages/MsgContext.cpp index 80031d2da..81593e92d 100644 --- a/src/ui/json/messages/MsgContext.cpp +++ b/src/ui/json/messages/MsgContext.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgContext.h" diff --git a/src/ui/json/messages/MsgContext.h b/src/ui/json/messages/MsgContext.h index 31d81dc90..866799573 100644 --- a/src/ui/json/messages/MsgContext.h +++ b/src/ui/json/messages/MsgContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Context of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandler.cpp b/src/ui/json/messages/MsgHandler.cpp index 7da63d630..a79623cc4 100644 --- a/src/ui/json/messages/MsgHandler.cpp +++ b/src/ui/json/messages/MsgHandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandler.h" diff --git a/src/ui/json/messages/MsgHandler.h b/src/ui/json/messages/MsgHandler.h index effd6917a..47e6f7219 100644 --- a/src/ui/json/messages/MsgHandler.h +++ b/src/ui/json/messages/MsgHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Base of all messages of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerAccessRights.cpp b/src/ui/json/messages/MsgHandlerAccessRights.cpp index 6cc9905a8..26c12b41e 100644 --- a/src/ui/json/messages/MsgHandlerAccessRights.cpp +++ b/src/ui/json/messages/MsgHandlerAccessRights.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerAccessRights.h" diff --git a/src/ui/json/messages/MsgHandlerAccessRights.h b/src/ui/json/messages/MsgHandlerAccessRights.h index e964fcb54..1b3e443b2 100644 --- a/src/ui/json/messages/MsgHandlerAccessRights.h +++ b/src/ui/json/messages/MsgHandlerAccessRights.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message MsgHandlerAccessRights of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerApiLevel.cpp b/src/ui/json/messages/MsgHandlerApiLevel.cpp index 194f24725..bb25c990e 100644 --- a/src/ui/json/messages/MsgHandlerApiLevel.cpp +++ b/src/ui/json/messages/MsgHandlerApiLevel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerApiLevel.h" diff --git a/src/ui/json/messages/MsgHandlerApiLevel.h b/src/ui/json/messages/MsgHandlerApiLevel.h index 052ff3513..3ae923b28 100644 --- a/src/ui/json/messages/MsgHandlerApiLevel.h +++ b/src/ui/json/messages/MsgHandlerApiLevel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message API_LEVEL of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerAuth.cpp b/src/ui/json/messages/MsgHandlerAuth.cpp index 9514192bb..9aa5c4175 100644 --- a/src/ui/json/messages/MsgHandlerAuth.cpp +++ b/src/ui/json/messages/MsgHandlerAuth.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerAuth.h" @@ -51,7 +51,7 @@ MsgHandlerAuth::MsgHandlerAuth(const QSharedPointer& pContext) { Q_ASSERT(pContext); - mJsonObject[QLatin1String("result")] = ECardApiResult(pContext->getStatus()).toJson(); + mJsonObject[QLatin1String("result")] = ECardApiResult(pContext->getStatus(), pContext->getFailureCode()).toJson(); QString url; if (pContext->getRefreshUrl().isEmpty()) diff --git a/src/ui/json/messages/MsgHandlerAuth.h b/src/ui/json/messages/MsgHandlerAuth.h index d7b72eeb6..9fbae0616 100644 --- a/src/ui/json/messages/MsgHandlerAuth.h +++ b/src/ui/json/messages/MsgHandlerAuth.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Auth of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerBadState.cpp b/src/ui/json/messages/MsgHandlerBadState.cpp index 9e29b6e33..31cfcf2fd 100644 --- a/src/ui/json/messages/MsgHandlerBadState.cpp +++ b/src/ui/json/messages/MsgHandlerBadState.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerBadState.h" diff --git a/src/ui/json/messages/MsgHandlerBadState.h b/src/ui/json/messages/MsgHandlerBadState.h index 9ec4c0ef9..6b3fc628f 100644 --- a/src/ui/json/messages/MsgHandlerBadState.h +++ b/src/ui/json/messages/MsgHandlerBadState.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message BadState of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerCertificate.cpp b/src/ui/json/messages/MsgHandlerCertificate.cpp index 61172c476..40d2a6fcd 100644 --- a/src/ui/json/messages/MsgHandlerCertificate.cpp +++ b/src/ui/json/messages/MsgHandlerCertificate.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerCertificate.h" diff --git a/src/ui/json/messages/MsgHandlerCertificate.h b/src/ui/json/messages/MsgHandlerCertificate.h index 4a02dd663..95f3a1cef 100644 --- a/src/ui/json/messages/MsgHandlerCertificate.h +++ b/src/ui/json/messages/MsgHandlerCertificate.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message handler for GET_CERTIFICATE of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerChangePin.cpp b/src/ui/json/messages/MsgHandlerChangePin.cpp index aaf1322e7..496aa7f22 100644 --- a/src/ui/json/messages/MsgHandlerChangePin.cpp +++ b/src/ui/json/messages/MsgHandlerChangePin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerChangePin.h" diff --git a/src/ui/json/messages/MsgHandlerChangePin.h b/src/ui/json/messages/MsgHandlerChangePin.h index f28305354..cf7b08e92 100644 --- a/src/ui/json/messages/MsgHandlerChangePin.h +++ b/src/ui/json/messages/MsgHandlerChangePin.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Change PIN of JSON API. - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerEnterCan.cpp b/src/ui/json/messages/MsgHandlerEnterCan.cpp index ee085f37a..7a849a4aa 100644 --- a/src/ui/json/messages/MsgHandlerEnterCan.cpp +++ b/src/ui/json/messages/MsgHandlerEnterCan.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerEnterCan.h" diff --git a/src/ui/json/messages/MsgHandlerEnterCan.h b/src/ui/json/messages/MsgHandlerEnterCan.h index 7c057ad43..f7ae59cef 100644 --- a/src/ui/json/messages/MsgHandlerEnterCan.h +++ b/src/ui/json/messages/MsgHandlerEnterCan.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message EnterCan of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerEnterNewPin.cpp b/src/ui/json/messages/MsgHandlerEnterNewPin.cpp index 0ab1b48ff..7dc2e17e4 100644 --- a/src/ui/json/messages/MsgHandlerEnterNewPin.cpp +++ b/src/ui/json/messages/MsgHandlerEnterNewPin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerEnterNewPin.h" diff --git a/src/ui/json/messages/MsgHandlerEnterNewPin.h b/src/ui/json/messages/MsgHandlerEnterNewPin.h index 36fa74f8a..7f6c50037 100644 --- a/src/ui/json/messages/MsgHandlerEnterNewPin.h +++ b/src/ui/json/messages/MsgHandlerEnterNewPin.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message EnterNewPin of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerEnterNumber.cpp b/src/ui/json/messages/MsgHandlerEnterNumber.cpp index 5724fd2c2..a73a48e35 100644 --- a/src/ui/json/messages/MsgHandlerEnterNumber.cpp +++ b/src/ui/json/messages/MsgHandlerEnterNumber.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerEnterNumber.h" diff --git a/src/ui/json/messages/MsgHandlerEnterNumber.h b/src/ui/json/messages/MsgHandlerEnterNumber.h index 2775d2a49..75d6e9c2f 100644 --- a/src/ui/json/messages/MsgHandlerEnterNumber.h +++ b/src/ui/json/messages/MsgHandlerEnterNumber.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper handler for EnterCan, EnterPin and EnterPuk of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerEnterPin.cpp b/src/ui/json/messages/MsgHandlerEnterPin.cpp index 7f48b877b..9ba124d31 100644 --- a/src/ui/json/messages/MsgHandlerEnterPin.cpp +++ b/src/ui/json/messages/MsgHandlerEnterPin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerEnterPin.h" diff --git a/src/ui/json/messages/MsgHandlerEnterPin.h b/src/ui/json/messages/MsgHandlerEnterPin.h index 36b53c091..04d5f99a4 100644 --- a/src/ui/json/messages/MsgHandlerEnterPin.h +++ b/src/ui/json/messages/MsgHandlerEnterPin.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message EnterPin of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerEnterPuk.cpp b/src/ui/json/messages/MsgHandlerEnterPuk.cpp index 87e92a87b..a0453f290 100644 --- a/src/ui/json/messages/MsgHandlerEnterPuk.cpp +++ b/src/ui/json/messages/MsgHandlerEnterPuk.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerEnterPuk.h" diff --git a/src/ui/json/messages/MsgHandlerEnterPuk.h b/src/ui/json/messages/MsgHandlerEnterPuk.h index d6973fe18..9c041acf4 100644 --- a/src/ui/json/messages/MsgHandlerEnterPuk.h +++ b/src/ui/json/messages/MsgHandlerEnterPuk.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message EnterPuk of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerInfo.cpp b/src/ui/json/messages/MsgHandlerInfo.cpp index 1c8bb09b4..be6636fff 100644 --- a/src/ui/json/messages/MsgHandlerInfo.cpp +++ b/src/ui/json/messages/MsgHandlerInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerInfo.h" diff --git a/src/ui/json/messages/MsgHandlerInfo.h b/src/ui/json/messages/MsgHandlerInfo.h index b3f24b547..19d8c33be 100644 --- a/src/ui/json/messages/MsgHandlerInfo.h +++ b/src/ui/json/messages/MsgHandlerInfo.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Info of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerInsertCard.cpp b/src/ui/json/messages/MsgHandlerInsertCard.cpp index 433c79c99..ffc1581ae 100644 --- a/src/ui/json/messages/MsgHandlerInsertCard.cpp +++ b/src/ui/json/messages/MsgHandlerInsertCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerInsertCard.h" diff --git a/src/ui/json/messages/MsgHandlerInsertCard.h b/src/ui/json/messages/MsgHandlerInsertCard.h index 929e0bf19..f07860556 100644 --- a/src/ui/json/messages/MsgHandlerInsertCard.h +++ b/src/ui/json/messages/MsgHandlerInsertCard.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message InsertCard of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerInternalError.cpp b/src/ui/json/messages/MsgHandlerInternalError.cpp index 0762b6ea8..c755dee55 100644 --- a/src/ui/json/messages/MsgHandlerInternalError.cpp +++ b/src/ui/json/messages/MsgHandlerInternalError.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerInternalError.h" diff --git a/src/ui/json/messages/MsgHandlerInternalError.h b/src/ui/json/messages/MsgHandlerInternalError.h index c4e193507..872c96057 100644 --- a/src/ui/json/messages/MsgHandlerInternalError.h +++ b/src/ui/json/messages/MsgHandlerInternalError.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message INTERNAL_ERROR of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerInvalid.cpp b/src/ui/json/messages/MsgHandlerInvalid.cpp index e54df8c02..4edcf1145 100644 --- a/src/ui/json/messages/MsgHandlerInvalid.cpp +++ b/src/ui/json/messages/MsgHandlerInvalid.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerInvalid.h" diff --git a/src/ui/json/messages/MsgHandlerInvalid.h b/src/ui/json/messages/MsgHandlerInvalid.h index a71886db2..be2f9fe9c 100644 --- a/src/ui/json/messages/MsgHandlerInvalid.h +++ b/src/ui/json/messages/MsgHandlerInvalid.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Invalid of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerLog.cpp b/src/ui/json/messages/MsgHandlerLog.cpp index 99fb47765..b2c1e3ee9 100644 --- a/src/ui/json/messages/MsgHandlerLog.cpp +++ b/src/ui/json/messages/MsgHandlerLog.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerLog.h" diff --git a/src/ui/json/messages/MsgHandlerLog.h b/src/ui/json/messages/MsgHandlerLog.h index 7e5becaf1..2b0225ad7 100644 --- a/src/ui/json/messages/MsgHandlerLog.h +++ b/src/ui/json/messages/MsgHandlerLog.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Log of JSON API. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerPersonalization.cpp b/src/ui/json/messages/MsgHandlerPersonalization.cpp index f85be8818..8e840e7d0 100644 --- a/src/ui/json/messages/MsgHandlerPersonalization.cpp +++ b/src/ui/json/messages/MsgHandlerPersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerPersonalization.h" diff --git a/src/ui/json/messages/MsgHandlerPersonalization.h b/src/ui/json/messages/MsgHandlerPersonalization.h index d7829e4f5..9c3089e2c 100644 --- a/src/ui/json/messages/MsgHandlerPersonalization.h +++ b/src/ui/json/messages/MsgHandlerPersonalization.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Personalization of JSON API. - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerReader.cpp b/src/ui/json/messages/MsgHandlerReader.cpp index 7b31396c0..4dd780fe8 100644 --- a/src/ui/json/messages/MsgHandlerReader.cpp +++ b/src/ui/json/messages/MsgHandlerReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerReader.h" diff --git a/src/ui/json/messages/MsgHandlerReader.h b/src/ui/json/messages/MsgHandlerReader.h index ca0e70d88..163113858 100644 --- a/src/ui/json/messages/MsgHandlerReader.h +++ b/src/ui/json/messages/MsgHandlerReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Reader of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerReaderList.cpp b/src/ui/json/messages/MsgHandlerReaderList.cpp index 5afd0507b..dd26fa662 100644 --- a/src/ui/json/messages/MsgHandlerReaderList.cpp +++ b/src/ui/json/messages/MsgHandlerReaderList.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerReaderList.h" diff --git a/src/ui/json/messages/MsgHandlerReaderList.h b/src/ui/json/messages/MsgHandlerReaderList.h index 0b72581e6..176a90ad0 100644 --- a/src/ui/json/messages/MsgHandlerReaderList.h +++ b/src/ui/json/messages/MsgHandlerReaderList.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message ReaderList of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerStatus.cpp b/src/ui/json/messages/MsgHandlerStatus.cpp index f6a0e3f0a..81fae2d12 100644 --- a/src/ui/json/messages/MsgHandlerStatus.cpp +++ b/src/ui/json/messages/MsgHandlerStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerStatus.h" diff --git a/src/ui/json/messages/MsgHandlerStatus.h b/src/ui/json/messages/MsgHandlerStatus.h index e2fa52556..119b7b386 100644 --- a/src/ui/json/messages/MsgHandlerStatus.h +++ b/src/ui/json/messages/MsgHandlerStatus.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Message Status of JSON API. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerUnknownCommand.cpp b/src/ui/json/messages/MsgHandlerUnknownCommand.cpp index 06c1d6eb9..86aea6e45 100644 --- a/src/ui/json/messages/MsgHandlerUnknownCommand.cpp +++ b/src/ui/json/messages/MsgHandlerUnknownCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerUnknownCommand.h" diff --git a/src/ui/json/messages/MsgHandlerUnknownCommand.h b/src/ui/json/messages/MsgHandlerUnknownCommand.h index 9eb74bfc6..9bed67175 100644 --- a/src/ui/json/messages/MsgHandlerUnknownCommand.h +++ b/src/ui/json/messages/MsgHandlerUnknownCommand.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief MsgHandlerUnknownCommand of JSON API. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgHandlerWorkflows.cpp b/src/ui/json/messages/MsgHandlerWorkflows.cpp index 323b5b5e0..0a2c82420 100644 --- a/src/ui/json/messages/MsgHandlerWorkflows.cpp +++ b/src/ui/json/messages/MsgHandlerWorkflows.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerWorkflows.h" diff --git a/src/ui/json/messages/MsgHandlerWorkflows.h b/src/ui/json/messages/MsgHandlerWorkflows.h index d87549b86..59def741a 100644 --- a/src/ui/json/messages/MsgHandlerWorkflows.h +++ b/src/ui/json/messages/MsgHandlerWorkflows.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generic class for Workflows. - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/json/messages/MsgTypes.cpp b/src/ui/json/messages/MsgTypes.cpp index 10ddc160e..c474e635d 100644 --- a/src/ui/json/messages/MsgTypes.cpp +++ b/src/ui/json/messages/MsgTypes.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgTypes.h" diff --git a/src/ui/json/messages/MsgTypes.h b/src/ui/json/messages/MsgTypes.h index ebf50ef50..ad5df9c7c 100644 --- a/src/ui/json/messages/MsgTypes.h +++ b/src/ui/json/messages/MsgTypes.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Enumerations of message types and additional stuff. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/local_ifd/UIPlugInLocalIfd.cpp b/src/ui/local_ifd/UIPlugInLocalIfd.cpp index bbcdebe6e..a218acd4e 100644 --- a/src/ui/local_ifd/UIPlugInLocalIfd.cpp +++ b/src/ui/local_ifd/UIPlugInLocalIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInLocalIfd.h" diff --git a/src/ui/local_ifd/UIPlugInLocalIfd.h b/src/ui/local_ifd/UIPlugInLocalIfd.h index a6240e627..9c7db7940 100644 --- a/src/ui/local_ifd/UIPlugInLocalIfd.h +++ b/src/ui/local_ifd/UIPlugInLocalIfd.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/proxy/PortWrapper.h b/src/ui/proxy/PortWrapper.h index 8f2b2cd8c..ab4f9bc39 100644 --- a/src/ui/proxy/PortWrapper.h +++ b/src/ui/proxy/PortWrapper.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/proxy/PortWrapper_generic.cpp b/src/ui/proxy/PortWrapper_generic.cpp index 22713a7c7..147580cd9 100644 --- a/src/ui/proxy/PortWrapper_generic.cpp +++ b/src/ui/proxy/PortWrapper_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "PortWrapper.h" diff --git a/src/ui/proxy/PortWrapper_win.cpp b/src/ui/proxy/PortWrapper_win.cpp index 29cb5f70f..15959cb7b 100644 --- a/src/ui/proxy/PortWrapper_win.cpp +++ b/src/ui/proxy/PortWrapper_win.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "PortWrapper.h" diff --git a/src/ui/proxy/RedirectRequest.cpp b/src/ui/proxy/RedirectRequest.cpp index 9cc62eb95..61543b742 100644 --- a/src/ui/proxy/RedirectRequest.cpp +++ b/src/ui/proxy/RedirectRequest.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "RedirectRequest.h" diff --git a/src/ui/proxy/RedirectRequest.h b/src/ui/proxy/RedirectRequest.h index 9227a1805..f6adc0f45 100644 --- a/src/ui/proxy/RedirectRequest.h +++ b/src/ui/proxy/RedirectRequest.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/proxy/UIPlugInProxy.cpp b/src/ui/proxy/UIPlugInProxy.cpp index 253bf2ef8..6617a4676 100644 --- a/src/ui/proxy/UIPlugInProxy.cpp +++ b/src/ui/proxy/UIPlugInProxy.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInProxy.h" diff --git a/src/ui/proxy/UIPlugInProxy.h b/src/ui/proxy/UIPlugInProxy.h index ed8beb3ba..b429506e0 100644 --- a/src/ui/proxy/UIPlugInProxy.h +++ b/src/ui/proxy/UIPlugInProxy.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of the UIPlugInProxy. - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/AppUpdateDataModel.cpp b/src/ui/qml/AppUpdateDataModel.cpp index efbc86826..4df1b8733 100644 --- a/src/ui/qml/AppUpdateDataModel.cpp +++ b/src/ui/qml/AppUpdateDataModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "AppUpdateDataModel.h" diff --git a/src/ui/qml/AppUpdateDataModel.h b/src/ui/qml/AppUpdateDataModel.h index 3c3cad1e0..6c1a9522d 100644 --- a/src/ui/qml/AppUpdateDataModel.h +++ b/src/ui/qml/AppUpdateDataModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ApplicationModel.cpp b/src/ui/qml/ApplicationModel.cpp index 12aeec272..8d63b5bf4 100644 --- a/src/ui/qml/ApplicationModel.cpp +++ b/src/ui/qml/ApplicationModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationModel.h" diff --git a/src/ui/qml/ApplicationModel.h b/src/ui/qml/ApplicationModel.h index 98d10cb7c..472499d5a 100644 --- a/src/ui/qml/ApplicationModel.h +++ b/src/ui/qml/ApplicationModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the application. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ApplicationModel_android.cpp b/src/ui/qml/ApplicationModel_android.cpp index 0312f60f7..3735ef24e 100644 --- a/src/ui/qml/ApplicationModel_android.cpp +++ b/src/ui/qml/ApplicationModel_android.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationModel.h" diff --git a/src/ui/qml/ApplicationModel_generic.cpp b/src/ui/qml/ApplicationModel_generic.cpp index 5f5831321..7046da8fa 100644 --- a/src/ui/qml/ApplicationModel_generic.cpp +++ b/src/ui/qml/ApplicationModel_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationModel.h" diff --git a/src/ui/qml/ApplicationModel_ios.mm b/src/ui/qml/ApplicationModel_ios.mm index 1dd3b3d89..939e52727 100644 --- a/src/ui/qml/ApplicationModel_ios.mm +++ b/src/ui/qml/ApplicationModel_ios.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationModel.h" diff --git a/src/ui/qml/AuthModel.cpp b/src/ui/qml/AuthModel.cpp index fcb599c47..bc1cbbe5c 100644 --- a/src/ui/qml/AuthModel.cpp +++ b/src/ui/qml/AuthModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "AuthModel.h" @@ -97,14 +97,22 @@ QString AuthModel::getErrorText() const } const auto& status = mContext->getStatus(); - const auto& externalInfo = status.getExternalInfo(); - const auto& errorDescription = status.toErrorDescription(false); - if (externalInfo.isEmpty() || errorDescription == externalInfo) + auto errorDescription = status.toErrorDescription(false); + + if (const auto& externalInfo = status.getExternalInfo(); + !externalInfo.isEmpty() && errorDescription != externalInfo) + { + errorDescription += QStringLiteral("
(%1)").arg(externalInfo); + } + + if (const auto& failureCode = mContext->getFailureCode(); + failureCode.has_value()) { - return errorDescription; + //: INFO ALL_PLATFORMS Failure code (string) of current workflow error. + errorDescription += QStringLiteral("

%1
%2").arg(tr("Reason:"), failureCode.value().toString()); } - return errorDescription + QStringLiteral("\n(%1)").arg(externalInfo); + return errorDescription; } @@ -125,16 +133,6 @@ void AuthModel::cancelWorkflowToChangePin() } -void AuthModel::requestTransportPinChange() -{ - if (mContext) - { - mContext->setPin(QString(5, QLatin1Char(0))); - continueWorkflow(); - } -} - - void AuthModel::onDidAuthenticateEac1Changed() { if (mContext) diff --git a/src/ui/qml/AuthModel.h b/src/ui/qml/AuthModel.h index 802d94367..881ea4b98 100644 --- a/src/ui/qml/AuthModel.h +++ b/src/ui/qml/AuthModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the authentication action. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -52,7 +54,6 @@ class AuthModel [[nodiscard]] QString getStatusCodeString() const; Q_INVOKABLE void cancelWorkflowToChangePin(); - Q_INVOKABLE void requestTransportPinChange(); private Q_SLOTS: void onDidAuthenticateEac1Changed(); diff --git a/src/ui/qml/CardPosition.cpp b/src/ui/qml/CardPosition.cpp index 791241464..5a7ebe6ae 100644 --- a/src/ui/qml/CardPosition.cpp +++ b/src/ui/qml/CardPosition.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "CardPosition.h" diff --git a/src/ui/qml/CardPosition.h b/src/ui/qml/CardPosition.h index 8c851fb4a..195cc3a67 100644 --- a/src/ui/qml/CardPosition.h +++ b/src/ui/qml/CardPosition.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Description of recommended card position - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/CardPositionModel.cpp b/src/ui/qml/CardPositionModel.cpp index f88a05ff5..a5ec26c9f 100644 --- a/src/ui/qml/CardPositionModel.cpp +++ b/src/ui/qml/CardPositionModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "CardPositionModel.h" diff --git a/src/ui/qml/CardPositionModel.h b/src/ui/qml/CardPositionModel.h index 5153a114f..92b1ecec0 100644 --- a/src/ui/qml/CardPositionModel.h +++ b/src/ui/qml/CardPositionModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model for card positioning animations. - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/CertificateDescriptionModel.cpp b/src/ui/qml/CertificateDescriptionModel.cpp index 64ee22712..10df26852 100644 --- a/src/ui/qml/CertificateDescriptionModel.cpp +++ b/src/ui/qml/CertificateDescriptionModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "CertificateDescriptionModel.h" diff --git a/src/ui/qml/CertificateDescriptionModel.h b/src/ui/qml/CertificateDescriptionModel.h index 81230dcc2..c2adc3a2f 100644 --- a/src/ui/qml/CertificateDescriptionModel.h +++ b/src/ui/qml/CertificateDescriptionModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the CV certificate description. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ChangePinModel.cpp b/src/ui/qml/ChangePinModel.cpp index 1f5afa12a..50b0f57e4 100644 --- a/src/ui/qml/ChangePinModel.cpp +++ b/src/ui/qml/ChangePinModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ChangePinModel.h" diff --git a/src/ui/qml/ChangePinModel.h b/src/ui/qml/ChangePinModel.h index 61a0f60a9..92782e0c7 100644 --- a/src/ui/qml/ChangePinModel.h +++ b/src/ui/qml/ChangePinModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the PIN action. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ChatModel.cpp b/src/ui/qml/ChatModel.cpp index 62a43fb12..e658a4863 100644 --- a/src/ui/qml/ChatModel.cpp +++ b/src/ui/qml/ChatModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the chat. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ChatModel.h" diff --git a/src/ui/qml/ChatModel.h b/src/ui/qml/ChatModel.h index 061958730..cf2dc05d6 100644 --- a/src/ui/qml/ChatModel.h +++ b/src/ui/qml/ChatModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the chat. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/CheckIDCardModel.cpp b/src/ui/qml/CheckIDCardModel.cpp index 39b01a077..9fdd6edec 100644 --- a/src/ui/qml/CheckIDCardModel.cpp +++ b/src/ui/qml/CheckIDCardModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "CheckIDCardModel.h" diff --git a/src/ui/qml/CheckIDCardModel.h b/src/ui/qml/CheckIDCardModel.h index 8ebd05e5d..ff592c57e 100644 --- a/src/ui/qml/CheckIDCardModel.h +++ b/src/ui/qml/CheckIDCardModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for checking the ID card in "playground". - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ConnectivityManager.cpp b/src/ui/qml/ConnectivityManager.cpp index 4bc99c536..3837f5ebc 100644 --- a/src/ui/qml/ConnectivityManager.cpp +++ b/src/ui/qml/ConnectivityManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ConnectivityManager.h" diff --git a/src/ui/qml/ConnectivityManager.h b/src/ui/qml/ConnectivityManager.h index 6f824f03f..04e3794a3 100644 --- a/src/ui/qml/ConnectivityManager.h +++ b/src/ui/qml/ConnectivityManager.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Utility class providing information about network connectivity status. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/Email.cpp b/src/ui/qml/Email.cpp index 701725d40..8c95585d8 100644 --- a/src/ui/qml/Email.cpp +++ b/src/ui/qml/Email.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "Email.h" diff --git a/src/ui/qml/Email.h b/src/ui/qml/Email.h index 9d34e696c..82a32a150 100644 --- a/src/ui/qml/Email.h +++ b/src/ui/qml/Email.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/FormattedTextModel.cpp b/src/ui/qml/FormattedTextModel.cpp index 3919ae0d2..2e811209e 100644 --- a/src/ui/qml/FormattedTextModel.cpp +++ b/src/ui/qml/FormattedTextModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "FormattedTextModel.h" diff --git a/src/ui/qml/FormattedTextModel.h b/src/ui/qml/FormattedTextModel.h index 0fee6352f..420677a59 100644 --- a/src/ui/qml/FormattedTextModel.h +++ b/src/ui/qml/FormattedTextModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for displaying simple formatted text. - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/HelpAction.cpp b/src/ui/qml/HelpAction.cpp index ea5c2a374..681a112bf 100644 --- a/src/ui/qml/HelpAction.cpp +++ b/src/ui/qml/HelpAction.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "HelpAction.h" diff --git a/src/ui/qml/HelpAction.h b/src/ui/qml/HelpAction.h index 69c8435a8..e36502492 100644 --- a/src/ui/qml/HelpAction.h +++ b/src/ui/qml/HelpAction.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper class for mapping object name to help file. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/HistoryModel.cpp b/src/ui/qml/HistoryModel.cpp index 3c9418649..8337f40c5 100644 --- a/src/ui/qml/HistoryModel.cpp +++ b/src/ui/qml/HistoryModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the history entries. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "HistoryModel.h" diff --git a/src/ui/qml/HistoryModel.h b/src/ui/qml/HistoryModel.h index 2649ac58d..bce6b4f0f 100644 --- a/src/ui/qml/HistoryModel.h +++ b/src/ui/qml/HistoryModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the history entries. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/HistoryModelSearchFilter.cpp b/src/ui/qml/HistoryModelSearchFilter.cpp index 72ed1fbaa..1acf6d801 100644 --- a/src/ui/qml/HistoryModelSearchFilter.cpp +++ b/src/ui/qml/HistoryModelSearchFilter.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HistoryModelSearchFilter.h" diff --git a/src/ui/qml/HistoryModelSearchFilter.h b/src/ui/qml/HistoryModelSearchFilter.h index 4e3ff4846..2849b1023 100644 --- a/src/ui/qml/HistoryModelSearchFilter.h +++ b/src/ui/qml/HistoryModelSearchFilter.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief A filter to search the history model - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/HistoryProxyModel.cpp b/src/ui/qml/HistoryProxyModel.cpp index 0c207b9c2..1471c3bcd 100644 --- a/src/ui/qml/HistoryProxyModel.cpp +++ b/src/ui/qml/HistoryProxyModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "HistoryProxyModel.h" diff --git a/src/ui/qml/HistoryProxyModel.h b/src/ui/qml/HistoryProxyModel.h index 555b081be..08e60fe74 100644 --- a/src/ui/qml/HistoryProxyModel.h +++ b/src/ui/qml/HistoryProxyModel.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/LogFilterModel.cpp b/src/ui/qml/LogFilterModel.cpp index e760c61b9..c9f7030c7 100644 --- a/src/ui/qml/LogFilterModel.cpp +++ b/src/ui/qml/LogFilterModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "LogFilterModel.h" diff --git a/src/ui/qml/LogFilterModel.h b/src/ui/qml/LogFilterModel.h index c18a0cbb3..a2fa8a99c 100644 --- a/src/ui/qml/LogFilterModel.h +++ b/src/ui/qml/LogFilterModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/LogModel.cpp b/src/ui/qml/LogModel.cpp index f6e85aa6d..dd6782d19 100644 --- a/src/ui/qml/LogModel.cpp +++ b/src/ui/qml/LogModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "LogModel.h" diff --git a/src/ui/qml/LogModel.h b/src/ui/qml/LogModel.h index bce4206d6..e8c914d3a 100644 --- a/src/ui/qml/LogModel.h +++ b/src/ui/qml/LogModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/LogModel_android.cpp b/src/ui/qml/LogModel_android.cpp index 7692885e4..5711b33ec 100644 --- a/src/ui/qml/LogModel_android.cpp +++ b/src/ui/qml/LogModel_android.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "LogModel.h" diff --git a/src/ui/qml/LogModel_generic.cpp b/src/ui/qml/LogModel_generic.cpp index 02af81cb0..85a6a47c4 100644 --- a/src/ui/qml/LogModel_generic.cpp +++ b/src/ui/qml/LogModel_generic.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "LogModel.h" diff --git a/src/ui/qml/LogModel_ios.mm b/src/ui/qml/LogModel_ios.mm index 534b95374..2d6e5f43f 100644 --- a/src/ui/qml/LogModel_ios.mm +++ b/src/ui/qml/LogModel_ios.mm @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "LogModel.h" diff --git a/src/ui/qml/NotificationModel.cpp b/src/ui/qml/NotificationModel.cpp index 7f43af1d7..ad03e0252 100644 --- a/src/ui/qml/NotificationModel.cpp +++ b/src/ui/qml/NotificationModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "NotificationModel.h" diff --git a/src/ui/qml/NotificationModel.h b/src/ui/qml/NotificationModel.h index eedb593dc..e2a6cb7f5 100644 --- a/src/ui/qml/NotificationModel.h +++ b/src/ui/qml/NotificationModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/NumberModel.cpp b/src/ui/qml/NumberModel.cpp index 2480510ac..2ee6d8155 100644 --- a/src/ui/qml/NumberModel.cpp +++ b/src/ui/qml/NumberModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "NumberModel.h" @@ -201,12 +201,6 @@ void NumberModel::setPuk(const QString& pPuk) } -bool NumberModel::hasError() const -{ - return getInputErrorCode() != CardReturnCode::OK || Env::getSingleton()->isExtendedLengthApdusUnsupported(); -} - - bool NumberModel::hasPasswordError() const { return CardReturnCodeUtil::equalsWrongPacePassword(getInputErrorCode()); diff --git a/src/ui/qml/NumberModel.h b/src/ui/qml/NumberModel.h index de53c9245..4b0a0bf2c 100644 --- a/src/ui/qml/NumberModel.h +++ b/src/ui/qml/NumberModel.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model for accessing PIN, CAN, PUK, according to the * currently active workflow. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -30,7 +32,6 @@ class NumberModel Q_PROPERTY(QString pin READ getPin WRITE setPin NOTIFY firePinChanged) Q_PROPERTY(QString newPin READ getNewPin WRITE setNewPin NOTIFY fireNewPinChanged) Q_PROPERTY(QString puk READ getPuk WRITE setPuk NOTIFY firePukChanged) - Q_PROPERTY(bool hasError READ hasError NOTIFY fireInputErrorChanged) Q_PROPERTY(bool hasPasswordError READ hasPasswordError NOTIFY fireInputErrorChanged) Q_PROPERTY(QString inputError READ getInputError NOTIFY fireInputErrorChanged) Q_PROPERTY(int retryCounter READ getRetryCounter NOTIFY fireReaderInfoChanged) @@ -64,7 +65,6 @@ class NumberModel [[nodiscard]] QString getPuk() const; void setPuk(const QString& pPuk); - [[nodiscard]] bool hasError() const; [[nodiscard]] bool hasPasswordError() const; [[nodiscard]] QString getInputError() const; diff --git a/src/ui/qml/PersonalizationModel.cpp b/src/ui/qml/PersonalizationModel.cpp index bf94f59d9..ec9c38e62 100644 --- a/src/ui/qml/PersonalizationModel.cpp +++ b/src/ui/qml/PersonalizationModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "PersonalizationModel.h" diff --git a/src/ui/qml/PersonalizationModel.h b/src/ui/qml/PersonalizationModel.h index b9bb50851..3c15ca85b 100644 --- a/src/ui/qml/PersonalizationModel.h +++ b/src/ui/qml/PersonalizationModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for Smart-eID workflow. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/PinResetInformationModel.cpp b/src/ui/qml/PinResetInformationModel.cpp index c9ed2d1a5..160903ced 100644 --- a/src/ui/qml/PinResetInformationModel.cpp +++ b/src/ui/qml/PinResetInformationModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "PinResetInformationModel.h" @@ -16,14 +16,6 @@ PinResetInformationModel::PinResetInformationModel() } -bool PinResetInformationModel::hasPinResetService() const -{ - const auto& config = Env::getSingleton(); - const auto& info = config->getProviderInfo(QStringLiteral("pinResetService")); - return !info.getAddress().isEmpty(); -} - - QUrl PinResetInformationModel::getPinResetUrl() const { const auto& config = Env::getSingleton(); @@ -39,80 +31,24 @@ QUrl PinResetInformationModel::getPinResetUrl() const } -QString PinResetInformationModel::getPinUnknownText() const -{ - //: LABEL ALL_PLATFORMS Explanation if the (Transport) PIN is unknown to the user on the Change PIN startpage. - return tr("You cannot find your PIN letter? You have set a ID card PIN when picking up the ID card or later that you cannot recall now?"); -} - - -QString PinResetInformationModel::getPinUnknownHint() const -{ - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS Text in Hint to PRS if the (Transport) PIN is unknown to the user on the Change PIN startpage - tr("By using the PIN Reset Service you may request a new ID card PIN.") : - //: LABEL ALL_PLATFORMS Text in Hint when PRS is not available and the (Transport) PIN is unknown to the user on the Change PIN startpage - tr("If this is the case please turn to the competent authority and set a new ID card PIN there.

For further information, please visit the ID card portal."); -} - - QString PinResetInformationModel::getNoPinAndNoPukHint() const { - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - tr("If you have forgotten your ID card PIN or do not have access to the PUK, you may request a new PIN here.") : - //: LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. - tr("If you have forgotten your ID card PIN or do not have access to the PUK, you may turn to the competent authority and set a new PIN there.

For further information, please visit the ID card portal."); -} - - -QString PinResetInformationModel::getNoPinAndNoTransportPinHint() const -{ - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - tr("If you know neither your Transport PIN nor your ID card PIN, you may request a new PIN here.") : - //: LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PIN and PIN are not known. - tr("If you know neither your Transport PIN nor your ID card PIN, you may turn to the competent authority and set a new PIN there.

For further information, please visit the ID card portal."); -} - - -QString PinResetInformationModel::getPinForgottenHint() const -{ - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - tr("If you cannot recall your ID card PIN, you may request a new PIN here.") : - //: LABEL ALL_PLATFORMS Hint text for PIN but it is unknown. - tr("If you cannot recall your ID card PIN, you may turn to the competent authority and set a new PIN there.

For further information, please visit the ID card portal."); -} - - -QString PinResetInformationModel::getPinForgottenTutorialHint() const -{ - return hasPinResetService() ? - //: LABEL ANDROID IOS - tr("If you cannot recall your six-digit PIN or cannot find your PIN letter, you may request a new PIN using the PIN Reset Service.") : - //: LABEL ANDROID IOS - tr("You can always set a new ID card PIN at the competent authority if the (Transport) PIN is not known.

For further information, please visit the ID card portal."); + //: LABEL ALL_PLATFORMS Hint text for requested PUK but both, PUK and PIN are not known. + return tr("You cannot use the PUK to reset your previously set card PIN. If you forgot your card PIN, you can use the PIN Reset Service to request a new PIN."); } QString PinResetInformationModel::getRequestNewPinHint() const { - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - tr("You may request a new ID card PIN here.") : - //: LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK - tr("You may turn to the competent authority and set a new ID card PIN there.

For further information, please visit the ID card portal."); + //: LABEL ALL_PLATFORMS Hint when a workflow failed because of a blocked PUK + return tr("Request a new card PIN free of charge to be able to use the eID function again."); } QString PinResetInformationModel::getActivateOnlineFunctionHint() const { - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - tr("You can request activation of the online identification function here.") : - //: LABEL ALL_PLATFORMS Hint when a workflow failed because the online identification function was not activated - tr("Please contact the competent authority to activate the online identification function.

For further information, please visit the ID card portal."); + //: LABEL ALL_PLATFORMS Hint when a workflow failed because the eID function was not activated + return tr("You can request activation of the eID function without charge."); } @@ -122,13 +58,17 @@ QString PinResetInformationModel::getActivateOnlineFunctionDescription() const } +QString PinResetInformationModel::getActivateOnlineFunctionActionText() const +{ + //: LABEL ALL_PLATFORMS + return tr("Go to Activation Service"); +} + + QString PinResetInformationModel::getPinResetActionText() const { - return hasPinResetService() ? - //: LABEL ALL_PLATFORMS - tr("To provider") : - //: LABEL ALL_PLATFORMS - tr("Open website"); + //: LABEL ALL_PLATFORMS + return tr("Go to PIN Reset Service"); } diff --git a/src/ui/qml/PinResetInformationModel.h b/src/ui/qml/PinResetInformationModel.h index fbfb84f8c..803e5809d 100644 --- a/src/ui/qml/PinResetInformationModel.h +++ b/src/ui/qml/PinResetInformationModel.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -15,33 +15,21 @@ class PinResetInformationModel Q_OBJECT Q_PROPERTY(QUrl pinResetUrl READ getPinResetUrl NOTIFY fireUpdated) - Q_PROPERTY(QString pinUnknownText READ getPinUnknownText NOTIFY fireUpdated) - Q_PROPERTY(QString pinUnknownHint READ getPinUnknownHint NOTIFY fireUpdated) Q_PROPERTY(QString noPinAndNoPukHint READ getNoPinAndNoPukHint NOTIFY fireUpdated) - Q_PROPERTY(QString noPinAndNoTransportPinHint READ getNoPinAndNoTransportPinHint NOTIFY fireUpdated) - Q_PROPERTY(QString pinForgottenHint READ getPinForgottenHint NOTIFY fireUpdated) - Q_PROPERTY(QString pinForgottenTutorialHint READ getPinForgottenTutorialHint NOTIFY fireUpdated) Q_PROPERTY(QString requestNewPinHint READ getRequestNewPinHint NOTIFY fireUpdated) Q_PROPERTY(QString activateOnlineFunctionHint READ getActivateOnlineFunctionHint NOTIFY fireUpdated) Q_PROPERTY(QString activateOnlineFunctionDescription READ getActivateOnlineFunctionDescription NOTIFY fireUpdated) Q_PROPERTY(QString pinResetActionText READ getPinResetActionText NOTIFY fireUpdated) - private: - bool hasPinResetService() const; - public: PinResetInformationModel(); [[nodiscard]] QUrl getPinResetUrl() const; - [[nodiscard]] QString getPinUnknownText() const; - [[nodiscard]] QString getPinUnknownHint() const; [[nodiscard]] QString getNoPinAndNoPukHint() const; - [[nodiscard]] QString getNoPinAndNoTransportPinHint() const; - [[nodiscard]] QString getPinForgottenHint() const; - [[nodiscard]] QString getPinForgottenTutorialHint() const; [[nodiscard]] QString getRequestNewPinHint() const; [[nodiscard]] QString getActivateOnlineFunctionHint() const; [[nodiscard]] QString getActivateOnlineFunctionDescription() const; + [[nodiscard]] QString getActivateOnlineFunctionActionText() const; [[nodiscard]] QString getPinResetActionText() const; public Q_SLOTS: diff --git a/src/ui/qml/PlatformTools.h b/src/ui/qml/PlatformTools.h index bc7342e5e..b26ca925d 100644 --- a/src/ui/qml/PlatformTools.h +++ b/src/ui/qml/PlatformTools.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/PlatformTools_generic.cpp b/src/ui/qml/PlatformTools_generic.cpp index 8ef8cb3ac..915333835 100644 --- a/src/ui/qml/PlatformTools_generic.cpp +++ b/src/ui/qml/PlatformTools_generic.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "PlatformTools.h" diff --git a/src/ui/qml/PlatformTools_osx.mm b/src/ui/qml/PlatformTools_osx.mm index 323dc04c6..6756d9e05 100644 --- a/src/ui/qml/PlatformTools_osx.mm +++ b/src/ui/qml/PlatformTools_osx.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "PlatformTools.h" diff --git a/src/ui/qml/ProviderCategoryFilterModel.cpp b/src/ui/qml/ProviderCategoryFilterModel.cpp index fab3236d5..7fd366e5c 100644 --- a/src/ui/qml/ProviderCategoryFilterModel.cpp +++ b/src/ui/qml/ProviderCategoryFilterModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderCategoryFilterModel.h" diff --git a/src/ui/qml/ProviderCategoryFilterModel.h b/src/ui/qml/ProviderCategoryFilterModel.h index f38bf6017..ce7ce3b52 100644 --- a/src/ui/qml/ProviderCategoryFilterModel.h +++ b/src/ui/qml/ProviderCategoryFilterModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the providers. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ProviderModel.cpp b/src/ui/qml/ProviderModel.cpp index 8b66b0697..76aa637f0 100644 --- a/src/ui/qml/ProviderModel.cpp +++ b/src/ui/qml/ProviderModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderModel.h" diff --git a/src/ui/qml/ProviderModel.h b/src/ui/qml/ProviderModel.h index 47a17c40d..4ba072171 100644 --- a/src/ui/qml/ProviderModel.h +++ b/src/ui/qml/ProviderModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the providers. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ProviderNameFilterModel.cpp b/src/ui/qml/ProviderNameFilterModel.cpp index 54008e81e..d7664b387 100644 --- a/src/ui/qml/ProviderNameFilterModel.cpp +++ b/src/ui/qml/ProviderNameFilterModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderNameFilterModel.h" diff --git a/src/ui/qml/ProviderNameFilterModel.h b/src/ui/qml/ProviderNameFilterModel.h index 5dcbe120c..bbbde08b1 100644 --- a/src/ui/qml/ProviderNameFilterModel.h +++ b/src/ui/qml/ProviderNameFilterModel.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ProxyCredentials.cpp b/src/ui/qml/ProxyCredentials.cpp index 9fa80074d..d9b127f91 100644 --- a/src/ui/qml/ProxyCredentials.cpp +++ b/src/ui/qml/ProxyCredentials.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ProxyCredentials.h" diff --git a/src/ui/qml/ProxyCredentials.h b/src/ui/qml/ProxyCredentials.h index bd62e3d00..5e03535a6 100644 --- a/src/ui/qml/ProxyCredentials.h +++ b/src/ui/qml/ProxyCredentials.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ReaderModel.cpp b/src/ui/qml/ReaderModel.cpp index 8f13c60bf..bb603488d 100644 --- a/src/ui/qml/ReaderModel.cpp +++ b/src/ui/qml/ReaderModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderModel.h" diff --git a/src/ui/qml/ReaderModel.h b/src/ui/qml/ReaderModel.h index 26bf09e2d..cc091f066 100644 --- a/src/ui/qml/ReaderModel.h +++ b/src/ui/qml/ReaderModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for recognized readers - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ReaderScanEnabler.cpp b/src/ui/qml/ReaderScanEnabler.cpp index 1d60193e7..e86c5ab5b 100644 --- a/src/ui/qml/ReaderScanEnabler.cpp +++ b/src/ui/qml/ReaderScanEnabler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderScanEnabler.h" diff --git a/src/ui/qml/ReaderScanEnabler.h b/src/ui/qml/ReaderScanEnabler.h index 22a755153..c5c756799 100644 --- a/src/ui/qml/ReaderScanEnabler.h +++ b/src/ui/qml/ReaderScanEnabler.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ReleaseInformationModel.cpp b/src/ui/qml/ReleaseInformationModel.cpp index 6829d4625..e72e87319 100644 --- a/src/ui/qml/ReleaseInformationModel.cpp +++ b/src/ui/qml/ReleaseInformationModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ReleaseInformationModel.h" diff --git a/src/ui/qml/ReleaseInformationModel.h b/src/ui/qml/ReleaseInformationModel.h index a1378c1b0..5dbaa63aa 100644 --- a/src/ui/qml/ReleaseInformationModel.h +++ b/src/ui/qml/ReleaseInformationModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provides information about the App release to QML - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/RemoteDeviceModel.cpp b/src/ui/qml/RemoteDeviceModel.cpp index f5cb98039..e994d425d 100644 --- a/src/ui/qml/RemoteDeviceModel.cpp +++ b/src/ui/qml/RemoteDeviceModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteDeviceModel.h" diff --git a/src/ui/qml/RemoteDeviceModel.h b/src/ui/qml/RemoteDeviceModel.h index 8ff44aa69..5fe5a91a5 100644 --- a/src/ui/qml/RemoteDeviceModel.h +++ b/src/ui/qml/RemoteDeviceModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the remote device table - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/RemoteServiceModel.cpp b/src/ui/qml/RemoteServiceModel.cpp index 4db22bc5a..1daf0816e 100644 --- a/src/ui/qml/RemoteServiceModel.cpp +++ b/src/ui/qml/RemoteServiceModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteServiceModel.h" diff --git a/src/ui/qml/RemoteServiceModel.h b/src/ui/qml/RemoteServiceModel.h index a21ec7848..6b1741e86 100644 --- a/src/ui/qml/RemoteServiceModel.h +++ b/src/ui/qml/RemoteServiceModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the remote service component - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/SelfAuthModel.cpp b/src/ui/qml/SelfAuthModel.cpp index 06784ad02..32b9fa9bd 100644 --- a/src/ui/qml/SelfAuthModel.cpp +++ b/src/ui/qml/SelfAuthModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "SelfAuthModel.h" diff --git a/src/ui/qml/SelfAuthModel.h b/src/ui/qml/SelfAuthModel.h index 9a97bbb89..01c42df3f 100644 --- a/src/ui/qml/SelfAuthModel.h +++ b/src/ui/qml/SelfAuthModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the self authentication workflow. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/SettingsModel.cpp b/src/ui/qml/SettingsModel.cpp index 185d5fbfc..95e89d402 100644 --- a/src/ui/qml/SettingsModel.cpp +++ b/src/ui/qml/SettingsModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "SettingsModel.h" diff --git a/src/ui/qml/SettingsModel.h b/src/ui/qml/SettingsModel.h index 92f90a1c0..77c8096f9 100644 --- a/src/ui/qml/SettingsModel.h +++ b/src/ui/qml/SettingsModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the settings. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/ShareUtil.java b/src/ui/qml/ShareUtil.java index cae40241c..d39944cd1 100644 --- a/src/ui/qml/ShareUtil.java +++ b/src/ui/qml/ShareUtil.java @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ package com.governikus.ausweisapp2; diff --git a/src/ui/qml/SmartModel.cpp b/src/ui/qml/SmartModel.cpp index 8369edb9b..69082ed1d 100644 --- a/src/ui/qml/SmartModel.cpp +++ b/src/ui/qml/SmartModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartModel.h" diff --git a/src/ui/qml/SmartModel.h b/src/ui/qml/SmartModel.h index 209900383..553b4a220 100644 --- a/src/ui/qml/SmartModel.h +++ b/src/ui/qml/SmartModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for Smart-eID status information. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/SortedReaderModel.cpp b/src/ui/qml/SortedReaderModel.cpp index 3a0c13791..843300d87 100644 --- a/src/ui/qml/SortedReaderModel.cpp +++ b/src/ui/qml/SortedReaderModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SortedReaderModel.h" diff --git a/src/ui/qml/SortedReaderModel.h b/src/ui/qml/SortedReaderModel.h index 75724fe77..2667d67ee 100644 --- a/src/ui/qml/SortedReaderModel.h +++ b/src/ui/qml/SortedReaderModel.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/TrayIcon.cpp b/src/ui/qml/TrayIcon.cpp index ec3f58f48..b813f804f 100644 --- a/src/ui/qml/TrayIcon.cpp +++ b/src/ui/qml/TrayIcon.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "TrayIcon.h" diff --git a/src/ui/qml/TrayIcon.h b/src/ui/qml/TrayIcon.h index 7a927632e..eba447244 100644 --- a/src/ui/qml/TrayIcon.h +++ b/src/ui/qml/TrayIcon.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/UIPlugInQml.cpp b/src/ui/qml/UIPlugInQml.cpp index bf26d623d..7bbce886e 100644 --- a/src/ui/qml/UIPlugInQml.cpp +++ b/src/ui/qml/UIPlugInQml.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInQml.h" diff --git a/src/ui/qml/UIPlugInQml.h b/src/ui/qml/UIPlugInQml.h index d2432e55a..91f1499e2 100644 --- a/src/ui/qml/UIPlugInQml.h +++ b/src/ui/qml/UIPlugInQml.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of QML. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/UIPlugInQml_ios.mm b/src/ui/qml/UIPlugInQml_ios.mm index 92514bc3a..059616daa 100644 --- a/src/ui/qml/UIPlugInQml_ios.mm +++ b/src/ui/qml/UIPlugInQml_ios.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInQml.h" diff --git a/src/ui/qml/UIPlugInQml_osx.mm b/src/ui/qml/UIPlugInQml_osx.mm index f0721410e..581491b3b 100644 --- a/src/ui/qml/UIPlugInQml_osx.mm +++ b/src/ui/qml/UIPlugInQml_osx.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInQml.h" diff --git a/src/ui/qml/VersionInformationModel.cpp b/src/ui/qml/VersionInformationModel.cpp index c3c9b9f69..e140aa742 100644 --- a/src/ui/qml/VersionInformationModel.cpp +++ b/src/ui/qml/VersionInformationModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for version information. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "VersionInformationModel.h" diff --git a/src/ui/qml/VersionInformationModel.h b/src/ui/qml/VersionInformationModel.h index 948c48f33..94af97380 100644 --- a/src/ui/qml/VersionInformationModel.h +++ b/src/ui/qml/VersionInformationModel.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/qml/WorkflowModel.cpp b/src/ui/qml/WorkflowModel.cpp index 707f7ae16..87c54f444 100644 --- a/src/ui/qml/WorkflowModel.cpp +++ b/src/ui/qml/WorkflowModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "WorkflowModel.h" @@ -273,6 +273,9 @@ QString WorkflowModel::getStatusHintText() const case GlobalStatus::Code::Card_Pin_Deactivated: return Env::getSingleton()->getActivateOnlineFunctionHint(); + case GlobalStatus::Code::Card_ValidityVerificationFailed: + return tr("Contact your local citizens' office (Bürgeramt) to apply for a new ID card or to unblock the ID card."); + default: return QString(); } @@ -284,9 +287,11 @@ QString WorkflowModel::getStatusHintActionText() const switch (getStatusCode()) { case GlobalStatus::Code::Card_Puk_Blocked: - case GlobalStatus::Code::Card_Pin_Deactivated: return Env::getSingleton()->getPinResetActionText(); + case GlobalStatus::Code::Card_Pin_Deactivated: + return Env::getSingleton()->getActivateOnlineFunctionActionText(); + default: return QString(); } diff --git a/src/ui/qml/WorkflowModel.h b/src/ui/qml/WorkflowModel.h index d1f30266d..287818f16 100644 --- a/src/ui/qml/WorkflowModel.h +++ b/src/ui/qml/WorkflowModel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Model implementation for the authentication action. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/scheme/CustomSchemeActivationContext.cpp b/src/ui/scheme/CustomSchemeActivationContext.cpp index de2bf3bab..67ad68af8 100644 --- a/src/ui/scheme/CustomSchemeActivationContext.cpp +++ b/src/ui/scheme/CustomSchemeActivationContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CustomSchemeActivationContext.h" diff --git a/src/ui/scheme/CustomSchemeActivationContext.h b/src/ui/scheme/CustomSchemeActivationContext.h index f545d1f9b..b9ab25a4f 100644 --- a/src/ui/scheme/CustomSchemeActivationContext.h +++ b/src/ui/scheme/CustomSchemeActivationContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/scheme/UIPlugInScheme.cpp b/src/ui/scheme/UIPlugInScheme.cpp index 89fd4634f..87efc6016 100644 --- a/src/ui/scheme/UIPlugInScheme.cpp +++ b/src/ui/scheme/UIPlugInScheme.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInScheme.h" diff --git a/src/ui/scheme/UIPlugInScheme.h b/src/ui/scheme/UIPlugInScheme.h index dd37481cc..418815baa 100644 --- a/src/ui/scheme/UIPlugInScheme.h +++ b/src/ui/scheme/UIPlugInScheme.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/webservice/UIPlugInWebService.cpp b/src/ui/webservice/UIPlugInWebService.cpp index 34334db9f..c38b381e4 100644 --- a/src/ui/webservice/UIPlugInWebService.cpp +++ b/src/ui/webservice/UIPlugInWebService.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInWebService.h" diff --git a/src/ui/webservice/UIPlugInWebService.h b/src/ui/webservice/UIPlugInWebService.h index 2a42d5b15..3f7f12b36 100644 --- a/src/ui/webservice/UIPlugInWebService.h +++ b/src/ui/webservice/UIPlugInWebService.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of the UIPlugInWebService. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/webservice/WebserviceActivationContext.cpp b/src/ui/webservice/WebserviceActivationContext.cpp index 0b372522f..41f1c9f28 100644 --- a/src/ui/webservice/WebserviceActivationContext.cpp +++ b/src/ui/webservice/WebserviceActivationContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "WebserviceActivationContext.h" diff --git a/src/ui/webservice/WebserviceActivationContext.h b/src/ui/webservice/WebserviceActivationContext.h index c7b357c2d..60c62b673 100644 --- a/src/ui/webservice/WebserviceActivationContext.h +++ b/src/ui/webservice/WebserviceActivationContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/ui/websocket/UIPlugInWebSocket.cpp b/src/ui/websocket/UIPlugInWebSocket.cpp index 08b0a30a8..471bf22b4 100644 --- a/src/ui/websocket/UIPlugInWebSocket.cpp +++ b/src/ui/websocket/UIPlugInWebSocket.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInWebSocket.h" diff --git a/src/ui/websocket/UIPlugInWebSocket.h b/src/ui/websocket/UIPlugInWebSocket.h index ca305c019..1e8891e7f 100644 --- a/src/ui/websocket/UIPlugInWebSocket.h +++ b/src/ui/websocket/UIPlugInWebSocket.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief UIPlugIn implementation of the Websocket. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/whitelist_client/SurveyModel.cpp b/src/whitelist_client/SurveyModel.cpp index 127a462ca..6deac52b9 100644 --- a/src/whitelist_client/SurveyModel.cpp +++ b/src/whitelist_client/SurveyModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "SurveyModel.h" diff --git a/src/whitelist_client/SurveyModel.h b/src/whitelist_client/SurveyModel.h index f10096187..4725903c8 100644 --- a/src/whitelist_client/SurveyModel.h +++ b/src/whitelist_client/SurveyModel.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class holding information about an Android device to be sent to * the whitelist server. - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/CertificateChecker.cpp b/src/workflows/base/CertificateChecker.cpp index ad1e77cd1..249a1baaa 100644 --- a/src/workflows/base/CertificateChecker.cpp +++ b/src/workflows/base/CertificateChecker.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CertificateChecker.h" diff --git a/src/workflows/base/CertificateChecker.h b/src/workflows/base/CertificateChecker.h index d411409ec..a7b210bd4 100644 --- a/src/workflows/base/CertificateChecker.h +++ b/src/workflows/base/CertificateChecker.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Contains the definition of the CertificateChecker class. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/TcToken.cpp b/src/workflows/base/TcToken.cpp index cdfa84639..52a0c426a 100644 --- a/src/workflows/base/TcToken.cpp +++ b/src/workflows/base/TcToken.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/workflows/base/TcToken.h b/src/workflows/base/TcToken.h index f45f03353..9cefe2972 100644 --- a/src/workflows/base/TcToken.h +++ b/src/workflows/base/TcToken.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parses TCTokens from XML data and provides its content. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/WorkflowRequest.cpp b/src/workflows/base/WorkflowRequest.cpp index e4750ed31..b81f9ab4b 100644 --- a/src/workflows/base/WorkflowRequest.cpp +++ b/src/workflows/base/WorkflowRequest.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "WorkflowRequest.h" diff --git a/src/workflows/base/WorkflowRequest.h b/src/workflows/base/WorkflowRequest.h index 88cb5305e..13cf4721a 100644 --- a/src/workflows/base/WorkflowRequest.h +++ b/src/workflows/base/WorkflowRequest.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/context/AccessRightManager.cpp b/src/workflows/base/context/AccessRightManager.cpp index dc8a84175..bb2051208 100644 --- a/src/workflows/base/context/AccessRightManager.cpp +++ b/src/workflows/base/context/AccessRightManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AccessRightManager.h" diff --git a/src/workflows/base/context/AccessRightManager.h b/src/workflows/base/context/AccessRightManager.h index 8d394e54e..564bdfd70 100644 --- a/src/workflows/base/context/AccessRightManager.h +++ b/src/workflows/base/context/AccessRightManager.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Manager for AccessRights - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/context/ActivationContext.cpp b/src/workflows/base/context/ActivationContext.cpp index 16da57813..c5df773f2 100644 --- a/src/workflows/base/context/ActivationContext.cpp +++ b/src/workflows/base/context/ActivationContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ActivationContext.h" diff --git a/src/workflows/base/context/ActivationContext.h b/src/workflows/base/context/ActivationContext.h index f0c271e86..045e4ebf3 100644 --- a/src/workflows/base/context/ActivationContext.h +++ b/src/workflows/base/context/ActivationContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/context/AuthContext.cpp b/src/workflows/base/context/AuthContext.cpp index a1138a9d3..7b3f757eb 100644 --- a/src/workflows/base/context/AuthContext.cpp +++ b/src/workflows/base/context/AuthContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AuthContext.h" diff --git a/src/workflows/base/context/AuthContext.h b/src/workflows/base/context/AuthContext.h index d2655b6e8..d68bf724d 100644 --- a/src/workflows/base/context/AuthContext.h +++ b/src/workflows/base/context/AuthContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Authentication context. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/context/ChangePinContext.cpp b/src/workflows/base/context/ChangePinContext.cpp index bcdd6091e..b50745613 100644 --- a/src/workflows/base/context/ChangePinContext.cpp +++ b/src/workflows/base/context/ChangePinContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ChangePinContext.h" diff --git a/src/workflows/base/context/ChangePinContext.h b/src/workflows/base/context/ChangePinContext.h index 42eeed8f9..770426d67 100644 --- a/src/workflows/base/context/ChangePinContext.h +++ b/src/workflows/base/context/ChangePinContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Context for changing the Pin. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/context/InternalActivationContext.cpp b/src/workflows/base/context/InternalActivationContext.cpp index 10217e0c7..024db7d40 100644 --- a/src/workflows/base/context/InternalActivationContext.cpp +++ b/src/workflows/base/context/InternalActivationContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "InternalActivationContext.h" diff --git a/src/workflows/base/context/InternalActivationContext.h b/src/workflows/base/context/InternalActivationContext.h index 722e98116..a91d83a9d 100644 --- a/src/workflows/base/context/InternalActivationContext.h +++ b/src/workflows/base/context/InternalActivationContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/context/WorkflowContext.cpp b/src/workflows/base/context/WorkflowContext.cpp index fa2ead4cb..26ee92ffe 100644 --- a/src/workflows/base/context/WorkflowContext.cpp +++ b/src/workflows/base/context/WorkflowContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "WorkflowContext.h" @@ -33,6 +33,7 @@ WorkflowContext::WorkflowContext(const Action pAction) , mExpectedReader() , mLastPaceResult(CardReturnCode::OK) , mStatus(GlobalStatus::Code::No_Error) + , mFailureCode() , mStartPaosResult(ECardApiResult::createOk()) , mErrorReportedToUser(true) , mPaceResultReportedToUser(false) @@ -446,6 +447,25 @@ void WorkflowContext::setStatus(const GlobalStatus& pStatus) } +std::optional WorkflowContext::getFailureCode() const +{ + return mFailureCode; +} + + +void WorkflowContext::setFailureCode(const FailureCode& pFailure) +{ + if (mFailureCode.has_value()) + { + qWarning() << "FailureCode already set to" << mFailureCode.value() << "- ignoring" << pFailure; + return; + } + + mFailureCode = pFailure; + Q_EMIT fireResultChanged(); +} + + const ECardApiResult& WorkflowContext::getStartPaosResult() const { return mStartPaosResult; diff --git a/src/workflows/base/context/WorkflowContext.h b/src/workflows/base/context/WorkflowContext.h index 79ea4ec92..cb439639f 100644 --- a/src/workflows/base/context/WorkflowContext.h +++ b/src/workflows/base/context/WorkflowContext.h @@ -1,13 +1,16 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Workflow context. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once #include "CardConnection.h" #include "ECardApiResult.h" +#include "FailureCode.h" #include "GlobalStatus.h" #include "ReaderInfo.h" #include "SmartCardDefinitions.h" @@ -15,6 +18,7 @@ #include #include #include +#include namespace governikus { @@ -48,6 +52,7 @@ class WorkflowContext ReaderInfo mExpectedReader; CardReturnCode mLastPaceResult; GlobalStatus mStatus; + std::optional mFailureCode; ECardApiResult mStartPaosResult; bool mErrorReportedToUser; bool mPaceResultReportedToUser; @@ -166,6 +171,9 @@ class WorkflowContext [[nodiscard]] const GlobalStatus& getStatus() const; void setStatus(const GlobalStatus& pResult); + [[nodiscard]] std::optional getFailureCode() const; + void setFailureCode(const FailureCode& pFailure); + [[nodiscard]] const ECardApiResult& getStartPaosResult() const; void setStartPaosResult(const ECardApiResult& pStartPaosResult); diff --git a/src/workflows/base/controller/AuthController.cpp b/src/workflows/base/controller/AuthController.cpp index 788a5153b..e5ee20927 100644 --- a/src/workflows/base/controller/AuthController.cpp +++ b/src/workflows/base/controller/AuthController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "controller/AuthController.h" @@ -54,6 +54,7 @@ AuthController::AuthController(QSharedPointer pContext) sCheckError->addTransition(sCheckError, &AbstractState::fireContinue, sActivateStoreFeedbackDialog); sCheckError->addTransition(sCheckError, &AbstractState::fireAbort, sRedirectBrowser); + sCheckError->addTransition(sCheckError, &StateCheckError::firePropagateAbort, sRedirectBrowser); sActivateStoreFeedbackDialog->addTransition(sActivateStoreFeedbackDialog, &AbstractState::fireContinue, sWriteHistory); sActivateStoreFeedbackDialog->addTransition(sActivateStoreFeedbackDialog, &AbstractState::fireAbort, sWriteHistory); diff --git a/src/workflows/base/controller/AuthController.h b/src/workflows/base/controller/AuthController.h index 48d8cb060..9c990aa19 100644 --- a/src/workflows/base/controller/AuthController.h +++ b/src/workflows/base/controller/AuthController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the authentication process. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/controller/ChangePinController.cpp b/src/workflows/base/controller/ChangePinController.cpp index 88e3bef20..37c8c57c3 100644 --- a/src/workflows/base/controller/ChangePinController.cpp +++ b/src/workflows/base/controller/ChangePinController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ChangePinController.h" @@ -40,6 +40,7 @@ ChangePinController::ChangePinController(QSharedPointer pConte sStatePace->addTransition(sStatePace, &CompositeStatePace::fireContinue, sPrepareChangePin); sStatePace->addTransition(sStatePace, &CompositeStatePace::fireAbort, sClearPacePasswords); + sStatePace->addTransition(sStatePace, &CompositeStatePace::firePropagateAbort, sClearPacePasswords); sPrepareChangePin->addTransition(sPrepareChangePin, &AbstractState::fireContinue, sChangePin); sPrepareChangePin->addTransition(sPrepareChangePin, &AbstractState::fireAbort, sDestroyPace); diff --git a/src/workflows/base/controller/ChangePinController.h b/src/workflows/base/controller/ChangePinController.h index 734f2379b..6a7b835e2 100644 --- a/src/workflows/base/controller/ChangePinController.h +++ b/src/workflows/base/controller/ChangePinController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the PIN changing process. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/controller/WorkflowController.cpp b/src/workflows/base/controller/WorkflowController.cpp index 4493e2093..cff04cf2e 100644 --- a/src/workflows/base/controller/WorkflowController.cpp +++ b/src/workflows/base/controller/WorkflowController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "controller/WorkflowController.h" diff --git a/src/workflows/base/controller/WorkflowController.h b/src/workflows/base/controller/WorkflowController.h index c2c4e5d4e..406d09d9d 100644 --- a/src/workflows/base/controller/WorkflowController.h +++ b/src/workflows/base/controller/WorkflowController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Base class for controllers controlling a workflow (using a state machine). - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/ElementDetector.cpp b/src/workflows/base/paos/ElementDetector.cpp index f176382e5..680a969e8 100644 --- a/src/workflows/base/paos/ElementDetector.cpp +++ b/src/workflows/base/paos/ElementDetector.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ElementDetector.h" diff --git a/src/workflows/base/paos/ElementDetector.h b/src/workflows/base/paos/ElementDetector.h index d2fe43097..9f2b19bba 100644 --- a/src/workflows/base/paos/ElementDetector.h +++ b/src/workflows/base/paos/ElementDetector.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /** * \brief Example class - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/PaosHandler.cpp b/src/workflows/base/paos/PaosHandler.cpp index d8d954d4c..589ab5016 100644 --- a/src/workflows/base/paos/PaosHandler.cpp +++ b/src/workflows/base/paos/PaosHandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PaosHandler.h" diff --git a/src/workflows/base/paos/PaosHandler.h b/src/workflows/base/paos/PaosHandler.h index df11b1bb8..b5b3e1b79 100644 --- a/src/workflows/base/paos/PaosHandler.h +++ b/src/workflows/base/paos/PaosHandler.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generic Handler to detect and parse paos types. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/PaosMessage.cpp b/src/workflows/base/paos/PaosMessage.cpp index 0520dd950..39b68c753 100644 --- a/src/workflows/base/paos/PaosMessage.cpp +++ b/src/workflows/base/paos/PaosMessage.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PaosMessage.h" diff --git a/src/workflows/base/paos/PaosMessage.h b/src/workflows/base/paos/PaosMessage.h index 4ec5c9929..d915c8f84 100644 --- a/src/workflows/base/paos/PaosMessage.h +++ b/src/workflows/base/paos/PaosMessage.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief object represents one paos type - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/PaosType.cpp b/src/workflows/base/paos/PaosType.cpp index 4ee4d7626..f9f89cc8b 100644 --- a/src/workflows/base/paos/PaosType.cpp +++ b/src/workflows/base/paos/PaosType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PaosType.h" diff --git a/src/workflows/base/paos/PaosType.h b/src/workflows/base/paos/PaosType.h index b57923c95..909df715b 100644 --- a/src/workflows/base/paos/PaosType.h +++ b/src/workflows/base/paos/PaosType.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief All possible paos types - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/RequestType.cpp b/src/workflows/base/paos/RequestType.cpp index 145969050..7943c5e92 100644 --- a/src/workflows/base/paos/RequestType.cpp +++ b/src/workflows/base/paos/RequestType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "RequestType.h" diff --git a/src/workflows/base/paos/RequestType.h b/src/workflows/base/paos/RequestType.h index b239929f0..574360800 100644 --- a/src/workflows/base/paos/RequestType.h +++ b/src/workflows/base/paos/RequestType.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Represents a PAOS request type according to ISOCommon.xsd - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/ResponseType.cpp b/src/workflows/base/paos/ResponseType.cpp index 6fc999d5a..a4b6c6d34 100644 --- a/src/workflows/base/paos/ResponseType.cpp +++ b/src/workflows/base/paos/ResponseType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ResponseType.h" diff --git a/src/workflows/base/paos/ResponseType.h b/src/workflows/base/paos/ResponseType.h index 795f40d20..a9b1e7a0f 100644 --- a/src/workflows/base/paos/ResponseType.h +++ b/src/workflows/base/paos/ResponseType.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Represents a PAOS response type according to ISOCommon.xsd - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/workflows/base/paos/element/ConnectionHandle.cpp b/src/workflows/base/paos/element/ConnectionHandle.cpp index 6268e1ea5..ecb5db90f 100644 --- a/src/workflows/base/paos/element/ConnectionHandle.cpp +++ b/src/workflows/base/paos/element/ConnectionHandle.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ConnectionHandle.h" diff --git a/src/workflows/base/paos/element/ConnectionHandle.h b/src/workflows/base/paos/element/ConnectionHandle.h index 03fa121e9..34969afb6 100644 --- a/src/workflows/base/paos/element/ConnectionHandle.h +++ b/src/workflows/base/paos/element/ConnectionHandle.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Object hold the paos connection handle. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/element/ConnectionHandleParser.cpp b/src/workflows/base/paos/element/ConnectionHandleParser.cpp index 4d60b26a1..99ada8416 100644 --- a/src/workflows/base/paos/element/ConnectionHandleParser.cpp +++ b/src/workflows/base/paos/element/ConnectionHandleParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ConnectionHandleParser.h" diff --git a/src/workflows/base/paos/element/ConnectionHandleParser.h b/src/workflows/base/paos/element/ConnectionHandleParser.h index 7140f02ee..204ceb7c2 100644 --- a/src/workflows/base/paos/element/ConnectionHandleParser.h +++ b/src/workflows/base/paos/element/ConnectionHandleParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parse an XML connection handle from given stream. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/element/Eac1InputType.cpp b/src/workflows/base/paos/element/Eac1InputType.cpp index 8d8a6fa53..b920358b6 100644 --- a/src/workflows/base/paos/element/Eac1InputType.cpp +++ b/src/workflows/base/paos/element/Eac1InputType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Eac1InputType.h" diff --git a/src/workflows/base/paos/element/Eac1InputType.h b/src/workflows/base/paos/element/Eac1InputType.h index 35218e0bd..9ade7c795 100644 --- a/src/workflows/base/paos/element/Eac1InputType.h +++ b/src/workflows/base/paos/element/Eac1InputType.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Store information of Eac1InputType. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/element/Eac2InputType.cpp b/src/workflows/base/paos/element/Eac2InputType.cpp index a2fabffc4..0da1a534f 100644 --- a/src/workflows/base/paos/element/Eac2InputType.cpp +++ b/src/workflows/base/paos/element/Eac2InputType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Eac2InputType.h" diff --git a/src/workflows/base/paos/element/Eac2InputType.h b/src/workflows/base/paos/element/Eac2InputType.h index db218eeba..a231102e8 100644 --- a/src/workflows/base/paos/element/Eac2InputType.h +++ b/src/workflows/base/paos/element/Eac2InputType.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Store information of Eac2InputType. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/element/ElementParser.cpp b/src/workflows/base/paos/element/ElementParser.cpp index 87ccd4ce7..10fbd11b7 100644 --- a/src/workflows/base/paos/element/ElementParser.cpp +++ b/src/workflows/base/paos/element/ElementParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ElementParser.h" diff --git a/src/workflows/base/paos/element/ElementParser.h b/src/workflows/base/paos/element/ElementParser.h index 1e754d48d..85943864b 100644 --- a/src/workflows/base/paos/element/ElementParser.h +++ b/src/workflows/base/paos/element/ElementParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Base class for all XML element parser. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/element/SupportedApi.cpp b/src/workflows/base/paos/element/SupportedApi.cpp index dd9c2942e..b6ae9e00a 100644 --- a/src/workflows/base/paos/element/SupportedApi.cpp +++ b/src/workflows/base/paos/element/SupportedApi.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SupportedApi.h" diff --git a/src/workflows/base/paos/element/SupportedApi.h b/src/workflows/base/paos/element/SupportedApi.h index 3eb0cfc5e..9d320a70c 100644 --- a/src/workflows/base/paos/element/SupportedApi.h +++ b/src/workflows/base/paos/element/SupportedApi.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief XML element for "SupportedAPI". See TR-03112-7. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/element/UserAgent.cpp b/src/workflows/base/paos/element/UserAgent.cpp index 5b2846d9b..c7fe3c1fb 100644 --- a/src/workflows/base/paos/element/UserAgent.cpp +++ b/src/workflows/base/paos/element/UserAgent.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "UserAgent.h" diff --git a/src/workflows/base/paos/element/UserAgent.h b/src/workflows/base/paos/element/UserAgent.h index 91ecb8c79..c64690685 100644 --- a/src/workflows/base/paos/element/UserAgent.h +++ b/src/workflows/base/paos/element/UserAgent.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Provides UserAgent information for PAOS elements. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.cpp b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.cpp index d80ca6399..9691995cc 100644 --- a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.cpp +++ b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DidAuthenticateResponseEac1.h" diff --git a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.h b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.h index 7df985938..fc1c7fc39 100644 --- a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.h +++ b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac1.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generate information for DIDAuthenticateResponseEAC1. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.cpp b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.cpp index e7710fd98..68659ceda 100644 --- a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.cpp +++ b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DidAuthenticateResponseEac2.h" diff --git a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.h b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.h index 5a5929086..4d55f221f 100644 --- a/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.h +++ b/src/workflows/base/paos/invoke/DidAuthenticateResponseEac2.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generate information for DIDAuthenticateResponseEAC2. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/invoke/InitializeFrameworkResponse.cpp b/src/workflows/base/paos/invoke/InitializeFrameworkResponse.cpp index 099855c57..9963d6d26 100644 --- a/src/workflows/base/paos/invoke/InitializeFrameworkResponse.cpp +++ b/src/workflows/base/paos/invoke/InitializeFrameworkResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "InitializeFrameworkResponse.h" diff --git a/src/workflows/base/paos/invoke/InitializeFrameworkResponse.h b/src/workflows/base/paos/invoke/InitializeFrameworkResponse.h index 93d1f021d..f874eab28 100644 --- a/src/workflows/base/paos/invoke/InitializeFrameworkResponse.h +++ b/src/workflows/base/paos/invoke/InitializeFrameworkResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generate information for InitializeFrameworkResponse. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/invoke/PaosCreator.cpp b/src/workflows/base/paos/invoke/PaosCreator.cpp index 1a087c74a..c163e02e1 100644 --- a/src/workflows/base/paos/invoke/PaosCreator.cpp +++ b/src/workflows/base/paos/invoke/PaosCreator.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PaosCreator.h" diff --git a/src/workflows/base/paos/invoke/PaosCreator.h b/src/workflows/base/paos/invoke/PaosCreator.h index f7dd2a229..330d1e7e7 100644 --- a/src/workflows/base/paos/invoke/PaosCreator.h +++ b/src/workflows/base/paos/invoke/PaosCreator.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Base class to create a PaosMessage. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/invoke/StartPaos.cpp b/src/workflows/base/paos/invoke/StartPaos.cpp index a77a2ffc6..88b085f5b 100644 --- a/src/workflows/base/paos/invoke/StartPaos.cpp +++ b/src/workflows/base/paos/invoke/StartPaos.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StartPaos.h" diff --git a/src/workflows/base/paos/invoke/StartPaos.h b/src/workflows/base/paos/invoke/StartPaos.h index b642c6542..87e4960e4 100644 --- a/src/workflows/base/paos/invoke/StartPaos.h +++ b/src/workflows/base/paos/invoke/StartPaos.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generate information for StartPaos. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/invoke/TransmitResponse.cpp b/src/workflows/base/paos/invoke/TransmitResponse.cpp index adc9aef51..6432ea5eb 100644 --- a/src/workflows/base/paos/invoke/TransmitResponse.cpp +++ b/src/workflows/base/paos/invoke/TransmitResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TransmitResponse.h" diff --git a/src/workflows/base/paos/invoke/TransmitResponse.h b/src/workflows/base/paos/invoke/TransmitResponse.h index b7520c8c3..a2e991e2c 100644 --- a/src/workflows/base/paos/invoke/TransmitResponse.h +++ b/src/workflows/base/paos/invoke/TransmitResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Generate information for TransmitResponse. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac1.cpp b/src/workflows/base/paos/retrieve/DidAuthenticateEac1.cpp index cb138e63b..857afb02b 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac1.cpp +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac1.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DidAuthenticateEac1.h" diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac1.h b/src/workflows/base/paos/retrieve/DidAuthenticateEac1.h index eb44d77a0..103a9f55a 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac1.h +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac1.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class represents the retrieved PAOS EAC1InputType. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.cpp b/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.cpp index fbedc5f58..f4dd75aab 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.cpp +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parser for the PAOS DidAuthenticateEac1 element. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEac1Parser.h" diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.h b/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.h index 60a9ac261..1a9e7a463 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.h +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac1Parser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parser for the PAOS DidAuthenticateEac1 element. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac2.cpp b/src/workflows/base/paos/retrieve/DidAuthenticateEac2.cpp index 39feea3d9..768684472 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac2.cpp +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac2.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEac2.h" diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac2.h b/src/workflows/base/paos/retrieve/DidAuthenticateEac2.h index 07a067552..e104db59a 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac2.h +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac2.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class represents the retrieved PAOS EAC2InputType. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.cpp b/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.cpp index 0963f2f02..ecf7dd6b3 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.cpp +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEac2Parser.h" diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.h b/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.h index b4c071623..8dd11d95f 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.h +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEac2Parser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parse information for DidAuthenticateEac2. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.cpp b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.cpp index 71929e064..3344194ca 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.cpp +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "DidAuthenticateEacAdditional.h" diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.h b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.h index 7ec23fc34..a1ef96b8d 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.h +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditional.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to hold information of DIDAuthenticateEACAdditional. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.cpp b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.cpp index 817338f04..29a37ff4f 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.cpp +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEacAdditionalParser.h" diff --git a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.h b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.h index 5a75f7188..520a8bd86 100644 --- a/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.h +++ b/src/workflows/base/paos/retrieve/DidAuthenticateEacAdditionalParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parse information for DidAuthenticateEacAdditional. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/InitializeFramework.cpp b/src/workflows/base/paos/retrieve/InitializeFramework.cpp index bd332b4c4..9b508d7e7 100644 --- a/src/workflows/base/paos/retrieve/InitializeFramework.cpp +++ b/src/workflows/base/paos/retrieve/InitializeFramework.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class represents the retrieved PAOS InitializeFramework - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/PaosType.h" diff --git a/src/workflows/base/paos/retrieve/InitializeFramework.h b/src/workflows/base/paos/retrieve/InitializeFramework.h index 2e95e712f..f2e965b28 100644 --- a/src/workflows/base/paos/retrieve/InitializeFramework.h +++ b/src/workflows/base/paos/retrieve/InitializeFramework.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class to parse InitializeFramework from server. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/PaosParser.cpp b/src/workflows/base/paos/retrieve/PaosParser.cpp index 0d5bf525c..dbdde12b4 100644 --- a/src/workflows/base/paos/retrieve/PaosParser.cpp +++ b/src/workflows/base/paos/retrieve/PaosParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PaosParser.h" diff --git a/src/workflows/base/paos/retrieve/PaosParser.h b/src/workflows/base/paos/retrieve/PaosParser.h index 308fbaba9..0ca2438ba 100644 --- a/src/workflows/base/paos/retrieve/PaosParser.h +++ b/src/workflows/base/paos/retrieve/PaosParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Base class for PAOS message parsers. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/StartPaosResponse.cpp b/src/workflows/base/paos/retrieve/StartPaosResponse.cpp index 86d8561d3..11cf382be 100644 --- a/src/workflows/base/paos/retrieve/StartPaosResponse.cpp +++ b/src/workflows/base/paos/retrieve/StartPaosResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StartPaosResponse.h" diff --git a/src/workflows/base/paos/retrieve/StartPaosResponse.h b/src/workflows/base/paos/retrieve/StartPaosResponse.h index 42614032b..11357ee49 100644 --- a/src/workflows/base/paos/retrieve/StartPaosResponse.h +++ b/src/workflows/base/paos/retrieve/StartPaosResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Class represents the retrieved PAOS StartPaosResponse - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/Transmit.cpp b/src/workflows/base/paos/retrieve/Transmit.cpp index f95c14ac2..f4550b688 100644 --- a/src/workflows/base/paos/retrieve/Transmit.cpp +++ b/src/workflows/base/paos/retrieve/Transmit.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Transmit.h" diff --git a/src/workflows/base/paos/retrieve/Transmit.h b/src/workflows/base/paos/retrieve/Transmit.h index e512a65f7..28773c45a 100644 --- a/src/workflows/base/paos/retrieve/Transmit.h +++ b/src/workflows/base/paos/retrieve/Transmit.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Transmit objects hold a transmit request and provide access to the transmitted data via member functions. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/paos/retrieve/TransmitParser.cpp b/src/workflows/base/paos/retrieve/TransmitParser.cpp index 7c4133118..22801753f 100644 --- a/src/workflows/base/paos/retrieve/TransmitParser.cpp +++ b/src/workflows/base/paos/retrieve/TransmitParser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TransmitParser.h" diff --git a/src/workflows/base/paos/retrieve/TransmitParser.h b/src/workflows/base/paos/retrieve/TransmitParser.h index fcf74ee16..801601424 100644 --- a/src/workflows/base/paos/retrieve/TransmitParser.h +++ b/src/workflows/base/paos/retrieve/TransmitParser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parser for the PAOS Transmit element. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/AbstractState.cpp b/src/workflows/base/states/AbstractState.cpp index c144fe96e..b2bcf9279 100644 --- a/src/workflows/base/states/AbstractState.cpp +++ b/src/workflows/base/states/AbstractState.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "AbstractState.h" @@ -27,6 +27,7 @@ AbstractState::AbstractState(const QSharedPointer& pContext) , mConnections() { Q_ASSERT(mContext); + connect(this, &AbstractState::fireAbort, this, &AbstractState::onAbort); } @@ -55,6 +56,16 @@ void AbstractState::setStateName(const QString& pName) } +void AbstractState::onAbort(const FailureCode& pFailure) const +{ + if (mContext) + { + qCDebug(statemachine) << "Abort with FailureCode" << pFailure; + mContext->setFailureCode(pFailure); + } +} + + QString AbstractState::getClassName(const char* const pName) { QString className = QString::fromLatin1(pName); @@ -140,7 +151,9 @@ void AbstractState::onUserCancelled() qCInfo(support) << "Cancellation by user"; mContext->setWorkflowCancelledInState(); updateStatus(GlobalStatus::Code::Workflow_Cancellation_By_User); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::User_Cancelled, + {FailureCode::Info::State_Name, getStateName()} + }); } @@ -149,7 +162,9 @@ void AbstractState::onCardRemoved(const ReaderInfo& pInfo) if (pInfo.getName() == mContext->getReaderName()) { updateStatus(GlobalStatus::Code::Workflow_Card_Removed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Card_Removed, + {FailureCode::Info::State_Name, getStateName()} + }); } } diff --git a/src/workflows/base/states/AbstractState.h b/src/workflows/base/states/AbstractState.h index 12ae137f1..afb6035bd 100644 --- a/src/workflows/base/states/AbstractState.h +++ b/src/workflows/base/states/AbstractState.h @@ -1,11 +1,14 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Base class for all states taken by the state machine. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once +#include "FailureCode.h" #include "context/WorkflowContext.h" #include @@ -72,7 +75,10 @@ class AbstractState Q_SIGNALS: void fireContinue(); - void fireAbort(); + void fireAbort(const FailureCode& pFailure); + + private Q_SLOTS: + void onAbort(const FailureCode& pFailure) const; public Q_SLOTS: void onStateApprovedChanged(bool pApproved); diff --git a/src/workflows/base/states/CompositeStatePace.cpp b/src/workflows/base/states/CompositeStatePace.cpp index 9b304f3b4..0d1ce2af8 100644 --- a/src/workflows/base/states/CompositeStatePace.cpp +++ b/src/workflows/base/states/CompositeStatePace.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "CompositeStatePace.h" @@ -55,10 +55,11 @@ CompositeStatePace::CompositeStatePace(const QSharedPointer& pC sMaintainCardConnection->addTransition(sMaintainCardConnection, &AbstractState::fireContinue, sVerifyRetryCounter); sMaintainCardConnection->addTransition(sMaintainCardConnection, &AbstractState::fireAbort, sClearPacePasswordsOnError); + sMaintainCardConnection->addTransition(sMaintainCardConnection, &StateMaintainCardConnection::firePropagateAbort, sClearPacePasswordsOnError); sMaintainCardConnection->addTransition(sMaintainCardConnection, &StateMaintainCardConnection::fireNoCardConnection, sSelectReader); sMaintainCardConnection->addTransition(sMaintainCardConnection, &StateMaintainCardConnection::fireForceUpdateRetryCounter, sUpdateRetryCounter); - connect(sClearPacePasswordsOnError, &AbstractState::fireContinue, this, &CompositeStatePace::fireAbort); + connect(sClearPacePasswordsOnError, &AbstractState::fireContinue, this, &CompositeStatePace::firePropagateAbort); connect(sClearPacePasswordsOnError, &AbstractState::fireAbort, this, &CompositeStatePace::fireAbort); sSelectReader->addTransition(sSelectReader, &AbstractState::fireContinue, sConnectCard); @@ -82,9 +83,11 @@ CompositeStatePace::CompositeStatePace(const QSharedPointer& pC sEnterPacePassword->addTransition(sEnterPacePassword, &AbstractState::fireContinue, sEstablishPaceChannel); sEnterPacePassword->addTransition(sEnterPacePassword, &AbstractState::fireAbort, sMaintainCardConnection); + sEnterPacePassword->addTransition(sEnterPacePassword, &StateEnterPacePassword::firePropagateAbort, sMaintainCardConnection); sEstablishPaceChannel->addTransition(sEstablishPaceChannel, &AbstractState::fireContinue, sMaintainCardConnection); sEstablishPaceChannel->addTransition(sEstablishPaceChannel, &AbstractState::fireAbort, sMaintainCardConnection); + sEstablishPaceChannel->addTransition(sEstablishPaceChannel, &StateEstablishPaceChannel::firePropagateAbort, sMaintainCardConnection); connect(sEstablishPaceChannel, &StateEstablishPaceChannel::firePaceChannelEstablished, this, &CompositeStatePace::fireContinue); sEstablishPaceChannel->addTransition(sEstablishPaceChannel, &StateEstablishPaceChannel::firePaceChannelInoperative, sClearPacePasswordsBeforeDestroy); sEstablishPaceChannel->addTransition(sEstablishPaceChannel, &StateEstablishPaceChannel::fireAbortAndUnfortunateCardPosition, sUnfortunateCardPosition); diff --git a/src/workflows/base/states/CompositeStatePace.h b/src/workflows/base/states/CompositeStatePace.h index 7341cc46c..5c972db03 100644 --- a/src/workflows/base/states/CompositeStatePace.h +++ b/src/workflows/base/states/CompositeStatePace.h @@ -1,9 +1,11 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once +#include "FailureCode.h" + #include #include @@ -27,7 +29,8 @@ class CompositeStatePace Q_SIGNALS: void fireContinue(); - void fireAbort(); + void fireAbort(const FailureCode& pFailure); + void firePropagateAbort(); }; } // namespace governikus diff --git a/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.cpp b/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.cpp index dee2f9b48..dffb31bcc 100644 --- a/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.cpp +++ b/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "CompositeStateProcessCvcsAndSetRights.h" diff --git a/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.h b/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.h index 690b8a086..b608028d3 100644 --- a/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.h +++ b/src/workflows/base/states/CompositeStateProcessCvcsAndSetRights.h @@ -1,11 +1,15 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Composite state for selecting a card. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once +#include "FailureCode.h" + #include #include @@ -29,7 +33,7 @@ class CompositeStateProcessCvcsAndSetRights Q_SIGNALS: void fireContinue(); - void fireAbort(); + void fireAbort(const FailureCode& pFailure); }; } // namespace governikus diff --git a/src/workflows/base/states/CompositeStateTrustedChannel.cpp b/src/workflows/base/states/CompositeStateTrustedChannel.cpp index dc6ac9385..e81f7cfef 100644 --- a/src/workflows/base/states/CompositeStateTrustedChannel.cpp +++ b/src/workflows/base/states/CompositeStateTrustedChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CompositeStateTrustedChannel.h" @@ -99,6 +99,7 @@ CompositeStateTrustedChannel::CompositeStateTrustedChannel(const QSharedPointer< sStatePace->addTransition(sStatePace, &CompositeStatePace::fireContinue, sDidAuthenticateEac1); sStatePace->addTransition(sStatePace, &CompositeStatePace::fireAbort, sSendDidAuthenticateResponseEac1); + sStatePace->addTransition(sStatePace, &CompositeStatePace::firePropagateAbort, sSendDidAuthenticateResponseEac1); sDidAuthenticateEac1->addTransition(sDidAuthenticateEac1, &AbstractState::fireContinue, sSendDidAuthenticateResponseEac1); sDidAuthenticateEac1->addTransition(sDidAuthenticateEac1, &AbstractState::fireAbort, sSendDidAuthenticateResponseEac1); @@ -143,5 +144,4 @@ CompositeStateTrustedChannel::CompositeStateTrustedChannel(const QSharedPointer< connect(sStartPaosResponse, &AbstractState::fireContinue, this, &CompositeStateTrustedChannel::fireContinue); connect(sStartPaosResponse, &AbstractState::fireAbort, this, &CompositeStateTrustedChannel::fireAbort); - } diff --git a/src/workflows/base/states/CompositeStateTrustedChannel.h b/src/workflows/base/states/CompositeStateTrustedChannel.h index cc71f7b0c..daeb6bbeb 100644 --- a/src/workflows/base/states/CompositeStateTrustedChannel.h +++ b/src/workflows/base/states/CompositeStateTrustedChannel.h @@ -1,9 +1,11 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once +#include "FailureCode.h" + #include #include @@ -27,7 +29,7 @@ class CompositeStateTrustedChannel Q_SIGNALS: void fireContinue(); - void fireAbort(); + void fireAbort(const FailureCode& pFailure); }; } // namespace governikus diff --git a/src/workflows/base/states/FinalState.cpp b/src/workflows/base/states/FinalState.cpp index 94a0990da..cb462300e 100644 --- a/src/workflows/base/states/FinalState.cpp +++ b/src/workflows/base/states/FinalState.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "states/FinalState.h" diff --git a/src/workflows/base/states/FinalState.h b/src/workflows/base/states/FinalState.h index fe2dd688a..fe5e9fd3f 100644 --- a/src/workflows/base/states/FinalState.h +++ b/src/workflows/base/states/FinalState.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief A final state which blocks the state machine before termination. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/GenericContextContainer.h b/src/workflows/base/states/GenericContextContainer.h index 253d70181..379d9c465 100644 --- a/src/workflows/base/states/GenericContextContainer.h +++ b/src/workflows/base/states/GenericContextContainer.h @@ -1,10 +1,12 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Template base class for all steps taken by the state machine. * It is parameterized over the context type and contains a getter for the context. * We cannot parameterize the super class AbstractState because Qt does not * support template classes. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateActivateStoreFeedbackDialog.cpp b/src/workflows/base/states/StateActivateStoreFeedbackDialog.cpp index e615f833a..60b7e53c8 100644 --- a/src/workflows/base/states/StateActivateStoreFeedbackDialog.cpp +++ b/src/workflows/base/states/StateActivateStoreFeedbackDialog.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "StateActivateStoreFeedbackDialog.h" diff --git a/src/workflows/base/states/StateActivateStoreFeedbackDialog.h b/src/workflows/base/states/StateActivateStoreFeedbackDialog.h index 62b7fcd2d..68d20d24a 100644 --- a/src/workflows/base/states/StateActivateStoreFeedbackDialog.h +++ b/src/workflows/base/states/StateActivateStoreFeedbackDialog.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Activates store the feedback dialog after a successful * authentication. - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateBuilder.h b/src/workflows/base/states/StateBuilder.h index 384b135a9..387c98df7 100644 --- a/src/workflows/base/states/StateBuilder.h +++ b/src/workflows/base/states/StateBuilder.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Builder for states. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateCertificateDescriptionCheck.cpp b/src/workflows/base/states/StateCertificateDescriptionCheck.cpp index 186cbaf59..ebe36e885 100644 --- a/src/workflows/base/states/StateCertificateDescriptionCheck.cpp +++ b/src/workflows/base/states/StateCertificateDescriptionCheck.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateCertificateDescriptionCheck.h" @@ -31,7 +31,7 @@ void StateCertificateDescriptionCheck::run() { qCritical() << "No certificate description available"; updateStatus(GlobalStatus::Code::Workflow_Certificate_No_Description); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Certificate_Check_Failed_No_Description); return; } @@ -39,7 +39,7 @@ void StateCertificateDescriptionCheck::run() { qCritical() << "No subject url available in certificate description"; updateStatus(GlobalStatus::Code::Workflow_Certificate_No_Url_In_Description); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Certificate_Check_Failed_No_SubjectUrl_In_Description); return; } @@ -58,7 +58,7 @@ void StateCertificateDescriptionCheck::run() { qCritical() << certificateHashError; updateStatus(GlobalStatus::Code::Workflow_Certificate_Hash_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Certificate_Check_Failed_Hash_Mismatch); return; } } @@ -87,7 +87,7 @@ void StateCertificateDescriptionCheck::run() { qCritical() << sameOriginPolicyError; updateStatus(GlobalStatus::Code::Workflow_Certificate_Sop_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Certificate_Check_Failed_Same_Origin_Policy_Violation); return; } } diff --git a/src/workflows/base/states/StateCertificateDescriptionCheck.h b/src/workflows/base/states/StateCertificateDescriptionCheck.h index 06cfedf4a..6dd56b0b6 100644 --- a/src/workflows/base/states/StateCertificateDescriptionCheck.h +++ b/src/workflows/base/states/StateCertificateDescriptionCheck.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateChangePin.cpp b/src/workflows/base/states/StateChangePin.cpp index 122af7b30..76bc5308f 100644 --- a/src/workflows/base/states/StateChangePin.cpp +++ b/src/workflows/base/states/StateChangePin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateChangePin.h" @@ -40,7 +40,7 @@ void StateChangePin::onSetEidPinDone(QSharedPointer pCommand) Q_ASSERT(false); qCDebug(statemachine) << "Expected a SetEidPinCommand as response!"; updateStatus(GlobalStatus::Code::Card_Protocol_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_No_SetEidPinCommand_Response); return; } @@ -68,31 +68,39 @@ void StateChangePin::onSetEidPinDone(QSharedPointer pCommand) case StatusCode::INPUT_TIMEOUT: updateStatus(GlobalStatus::Code::Card_Input_TimeOut); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_Input_Timeout); break; case StatusCode::INPUT_CANCELLED: updateStatus(GlobalStatus::Code::Card_Cancellation_By_User); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_User_Cancelled); break; case StatusCode::PASSWORDS_DIFFER: updateStatus(GlobalStatus::Code::Card_NewPin_Mismatch); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_New_Pin_Mismatch); break; case StatusCode::PASSWORD_OUTOF_RANGE: updateStatus(GlobalStatus::Code::Card_NewPin_Invalid_Length); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_New_Pin_Invalid_Length); break; default: updateStatus(GlobalStatus::Code::Card_Unexpected_Transmit_Status); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_Unexpected_Transmit_Status); } - Q_EMIT fireAbort(); return; case CardReturnCode::CANCELLATION_BY_USER: + updateStatus(CardReturnCodeUtil::toGlobalStatus(returnCode)); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_Card_User_Cancelled); + break; + case CardReturnCode::NEW_PIN_MISMATCH: updateStatus(CardReturnCodeUtil::toGlobalStatus(returnCode)); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Change_Pin_Card_New_Pin_Mismatch); break; default: diff --git a/src/workflows/base/states/StateChangePin.h b/src/workflows/base/states/StateChangePin.h index 4c40b77c2..09864dad6 100644 --- a/src/workflows/base/states/StateChangePin.h +++ b/src/workflows/base/states/StateChangePin.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the state changing the PIN. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateCheckCertificates.cpp b/src/workflows/base/states/StateCheckCertificates.cpp index 7a6795c41..ecdec4329 100644 --- a/src/workflows/base/states/StateCheckCertificates.cpp +++ b/src/workflows/base/states/StateCheckCertificates.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateCheckCertificates.h" @@ -41,7 +41,7 @@ void StateCheckCertificates::run() const auto& issuerName = TlsChecker::getCertificateIssuerName(certificate); updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Hash_Not_In_Description, {GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, issuerName} }); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Certificate_Check_Failed_Hash_Missing_In_Description); return; } } diff --git a/src/workflows/base/states/StateCheckCertificates.h b/src/workflows/base/states/StateCheckCertificates.h index 6d080d787..d738e1358 100644 --- a/src/workflows/base/states/StateCheckCertificates.h +++ b/src/workflows/base/states/StateCheckCertificates.h @@ -1,9 +1,11 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Checks whether the hashes of the certificates encountered so far * (i.e. those stored in the AuthContext) are in the CertificateDescription * extension of the eService certificate. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateCheckError.cpp b/src/workflows/base/states/StateCheckError.cpp index 42f976a90..e651325e5 100644 --- a/src/workflows/base/states/StateCheckError.cpp +++ b/src/workflows/base/states/StateCheckError.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateCheckError.h" @@ -21,5 +21,6 @@ void StateCheckError::run() return; } - Q_EMIT fireAbort(); + Q_ASSERT(getContext()->getFailureCode().has_value()); + Q_EMIT firePropagateAbort(); } diff --git a/src/workflows/base/states/StateCheckError.h b/src/workflows/base/states/StateCheckError.h index bb2838e14..d9f0e6dce 100644 --- a/src/workflows/base/states/StateCheckError.h +++ b/src/workflows/base/states/StateCheckError.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper state to decide whether an error has been occurred that should * be reported to the user. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -24,6 +26,9 @@ class StateCheckError private: explicit StateCheckError(const QSharedPointer& pContext); void run() override; + + Q_SIGNALS: + void firePropagateAbort(); }; } // namespace governikus diff --git a/src/workflows/base/states/StateCheckRefreshAddress.cpp b/src/workflows/base/states/StateCheckRefreshAddress.cpp index 11e12e44f..64e7f4985 100644 --- a/src/workflows/base/states/StateCheckRefreshAddress.cpp +++ b/src/workflows/base/states/StateCheckRefreshAddress.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateCheckRefreshAddress.h" @@ -173,19 +173,19 @@ void StateCheckRefreshAddress::onSslErrors(const QList& pErrors) if (TlsChecker::containsFatalError(mReply, pErrors)) { reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Fatal_Ssl_Error_Before_Reply}); } } -void StateCheckRefreshAddress::reportCommunicationError(const GlobalStatus& pStatus) +void StateCheckRefreshAddress::reportCommunicationError(const GlobalStatus& pStatus, const FailureCode& pFailure) { qCritical() << pStatus; updateStatus(pStatus); clearConnections(); mReply->abort(); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(pFailure); } @@ -208,7 +208,8 @@ bool StateCheckRefreshAddress::checkSslConnectionAndSaveCertificate(const QSslCo if (!TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey())) { - reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}); + reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}, + {FailureCode::Reason::Check_Refresh_Address_Invalid_Ephemeral_Key_Length}); return false; } @@ -216,7 +217,22 @@ bool StateCheckRefreshAddress::checkSslConnectionAndSaveCertificate(const QSslCo if (statusCode != CertificateChecker::CertificateStatus::Good) { infoMap.insert(GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate())); - reportCommunicationError({CertificateChecker::getGlobalStatus(statusCode, false), infoMap}); + switch (statusCode) + { + case CertificateChecker::CertificateStatus::Good: + break; + + case CertificateChecker::CertificateStatus::Unsupported_Algorithm_Or_Length: + reportCommunicationError({CertificateChecker::getGlobalStatus(statusCode, false), infoMap}, + {FailureCode::Reason::Check_Refresh_Address_Unsupported_Certificate}); + break; + + case CertificateChecker::CertificateStatus::Hash_Not_In_Description: + reportCommunicationError({CertificateChecker::getGlobalStatus(statusCode, false), infoMap}, + {FailureCode::Reason::Check_Refresh_Address_Hash_Missing_In_Certificate}); + + } + return false; } @@ -234,27 +250,27 @@ void StateCheckRefreshAddress::onNetworkReply() { case NetworkManager::NetworkError::ServiceUnavailable: reportCommunicationError({GlobalStatus::Code::Network_ServiceUnavailable, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Service_Unavailable}); break; case NetworkManager::NetworkError::TimeOut: reportCommunicationError({GlobalStatus::Code::Network_TimeOut, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Service_Timeout}); break; case NetworkManager::NetworkError::ProxyError: reportCommunicationError({GlobalStatus::Code::Network_Proxy_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Proxy_Error}); break; case NetworkManager::NetworkError::SecurityError: reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Fatal_Ssl_Error_After_Reply}); break; case NetworkManager::NetworkError::OtherError: reportCommunicationError({GlobalStatus::Code::Network_Other_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Unknown_Network_Error}); break; } return; @@ -267,7 +283,8 @@ void StateCheckRefreshAddress::onNetworkReply() {GlobalStatus::ExternalInformation::HTTP_STATUS_CODE, QString::number(statusCode)}, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} }; - reportCommunicationError({GlobalStatus::Code::Workflow_Network_Expected_Redirect, infoMap}); + reportCommunicationError({GlobalStatus::Code::Workflow_Network_Expected_Redirect, infoMap}, + {FailureCode::Reason::Check_Refresh_Address_Invalid_Http_Response}); return; } @@ -276,7 +293,7 @@ void StateCheckRefreshAddress::onNetworkReply() { qCritical() << "Got empty redirect URL"; reportCommunicationError({GlobalStatus::Code::Workflow_Network_Empty_Redirect_Url, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Empty}); return; } @@ -287,7 +304,8 @@ void StateCheckRefreshAddress::onNetworkReply() {GlobalStatus::ExternalInformation::REDIRECT_URL, redirectUrl.toString()}, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} }; - reportCommunicationError({GlobalStatus::Code::Workflow_Network_Malformed_Redirect_Url, infoMap}); + reportCommunicationError({GlobalStatus::Code::Workflow_Network_Malformed_Redirect_Url, infoMap}, + {FailureCode::Reason::Check_Refresh_Address_Invalid_Url}); return; } @@ -306,7 +324,8 @@ void StateCheckRefreshAddress::onNetworkReply() {GlobalStatus::ExternalInformation::URL_SCHEME, redirectUrl.scheme()}, {GlobalStatus::ExternalInformation::LAST_URL, redirectUrl.toString()} }; - reportCommunicationError({GlobalStatus::Code::Workflow_Network_Invalid_Scheme, infoMap}); + reportCommunicationError({GlobalStatus::Code::Workflow_Network_Invalid_Scheme, infoMap}, + {FailureCode::Reason::Check_Refresh_Address_No_Https_Scheme}); return; } } @@ -400,7 +419,7 @@ void StateCheckRefreshAddress::onNetworkErrorFetchingServerCertificate(QNetworkR } qCritical() << "An error occurred fetching the server certificate:" << mReply->errorString(); reportCommunicationError({GlobalStatus::Code::Workflow_Network_Empty_Redirect_Url, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} - }); + }, {FailureCode::Reason::Check_Refresh_Address_Fetch_Certificate_Error}); } diff --git a/src/workflows/base/states/StateCheckRefreshAddress.h b/src/workflows/base/states/StateCheckRefreshAddress.h index 6931f09be..03fa8ec6c 100644 --- a/src/workflows/base/states/StateCheckRefreshAddress.h +++ b/src/workflows/base/states/StateCheckRefreshAddress.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Calls the RefreshAddress of TcToken and checks the certificates. * After that it will set RedirectAddress in WorkflowContext. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -48,7 +50,7 @@ class StateCheckRefreshAddress void fetchServerCertificate(); bool checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration); void doneSuccess(); - void reportCommunicationError(const GlobalStatus& pStatus); + void reportCommunicationError(const GlobalStatus& pStatus, const FailureCode& pFailure); private Q_SLOTS: void onSslHandshakeDone(); diff --git a/src/workflows/base/states/StateCleanUpReaderManager.cpp b/src/workflows/base/states/StateCleanUpReaderManager.cpp index 7019f2d77..d1a979dcd 100644 --- a/src/workflows/base/states/StateCleanUpReaderManager.cpp +++ b/src/workflows/base/states/StateCleanUpReaderManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "StateCleanUpReaderManager.h" diff --git a/src/workflows/base/states/StateCleanUpReaderManager.h b/src/workflows/base/states/StateCleanUpReaderManager.h index 6633b73bb..6768bbcbc 100644 --- a/src/workflows/base/states/StateCleanUpReaderManager.h +++ b/src/workflows/base/states/StateCleanUpReaderManager.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Performs clean up of the ReaderManager, * e.g. disconnects all readers, clears the card connection, ... - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateClearPacePasswords.cpp b/src/workflows/base/states/StateClearPacePasswords.cpp index ee84b3ed8..da49a8aa4 100644 --- a/src/workflows/base/states/StateClearPacePasswords.cpp +++ b/src/workflows/base/states/StateClearPacePasswords.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateClearPacePasswords.h" diff --git a/src/workflows/base/states/StateClearPacePasswords.h b/src/workflows/base/states/StateClearPacePasswords.h index a60ed018a..03eda56ce 100644 --- a/src/workflows/base/states/StateClearPacePasswords.h +++ b/src/workflows/base/states/StateClearPacePasswords.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateConnectCard.cpp b/src/workflows/base/states/StateConnectCard.cpp index 6e066bda9..01d17039c 100644 --- a/src/workflows/base/states/StateConnectCard.cpp +++ b/src/workflows/base/states/StateConnectCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "StateConnectCard.h" @@ -55,7 +55,7 @@ void StateConnectCard::onCommandDone(QSharedPointer { qCDebug(statemachine) << "Card connection failed"; updateStatus(GlobalStatus::Code::Card_Communication_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Connect_Card_Connection_Failed); return; } @@ -78,7 +78,7 @@ void StateConnectCard::onCommandDone(QSharedPointer if (readerInfo.isPinDeactivated() && !context->isCanAllowedMode()) { - qCDebug(statemachine) << "The online identification function of the ID card is not activated."; + qCDebug(statemachine) << "The eID function of the ID card is not activated."; const GlobalStatus status = GlobalStatus::Code::Card_Pin_Deactivated; if (Env::getSingleton()->isUsedAsSDK()) { @@ -87,7 +87,7 @@ void StateConnectCard::onCommandDone(QSharedPointer else { updateStatus(status); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Connect_Card_Eid_Inactive); } return; } diff --git a/src/workflows/base/states/StateConnectCard.h b/src/workflows/base/states/StateConnectCard.h index 116553648..4cbd6238b 100644 --- a/src/workflows/base/states/StateConnectCard.h +++ b/src/workflows/base/states/StateConnectCard.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateDestroyPace.cpp b/src/workflows/base/states/StateDestroyPace.cpp index 1a0acf386..cb2eb9c2c 100644 --- a/src/workflows/base/states/StateDestroyPace.cpp +++ b/src/workflows/base/states/StateDestroyPace.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ @@ -25,7 +25,7 @@ void StateDestroyPace::run() if (!cardConnection) { qCDebug(statemachine) << "No card connection available."; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Destroy_Pace_No_Connection_To_Destroy); return; } diff --git a/src/workflows/base/states/StateDestroyPace.h b/src/workflows/base/states/StateDestroyPace.h index 9e3408356..fbd75fb41 100644 --- a/src/workflows/base/states/StateDestroyPace.h +++ b/src/workflows/base/states/StateDestroyPace.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the step that tries to destroy an existing PACE connection. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateDidAuthenticateEac1.cpp b/src/workflows/base/states/StateDidAuthenticateEac1.cpp index 705ef1fcf..5e38b9cff 100644 --- a/src/workflows/base/states/StateDidAuthenticateEac1.cpp +++ b/src/workflows/base/states/StateDidAuthenticateEac1.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateDidAuthenticateEac1.h" @@ -57,7 +57,9 @@ void StateDidAuthenticateEac1::onCardCommandDone(QSharedPointer else { updateStatus(CardReturnCodeUtil::toGlobalStatus(result)); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Did_Authenticate_Eac1_Card_Command_Failed, + {FailureCode::Info::Card_Return_Code, Enum::getName(result)} + }); } } diff --git a/src/workflows/base/states/StateDidAuthenticateEac1.h b/src/workflows/base/states/StateDidAuthenticateEac1.h index ed2aa1217..40a5e0dda 100644 --- a/src/workflows/base/states/StateDidAuthenticateEac1.h +++ b/src/workflows/base/states/StateDidAuthenticateEac1.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateDidAuthenticateEac2.cpp b/src/workflows/base/states/StateDidAuthenticateEac2.cpp index b52440b2f..f8dfbae4d 100644 --- a/src/workflows/base/states/StateDidAuthenticateEac2.cpp +++ b/src/workflows/base/states/StateDidAuthenticateEac2.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateDidAuthenticateEac2.h" @@ -40,7 +40,7 @@ void StateDidAuthenticateEac2::run() if (!cvcChain.isValid()) { updateStatus(GlobalStatus::Code::Workflow_No_Permission_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Did_Authenticate_Eac2_Invalid_Cvc_Chain); return; } @@ -70,7 +70,9 @@ void StateDidAuthenticateEac2::onCardCommandDone(QSharedPointer newStatus = GlobalStatus::Code::Workflow_No_Permission_Error; } updateStatus(newStatus); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Did_Authenticate_Eac2_Card_Command_Failed, + {FailureCode::Info::Card_Return_Code, Enum::getName(returnCode)} + }); return; } diff --git a/src/workflows/base/states/StateDidAuthenticateEac2.h b/src/workflows/base/states/StateDidAuthenticateEac2.h index cfeb555e3..8dc416043 100644 --- a/src/workflows/base/states/StateDidAuthenticateEac2.h +++ b/src/workflows/base/states/StateDidAuthenticateEac2.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateEACAdditionalInputType.cpp b/src/workflows/base/states/StateEACAdditionalInputType.cpp index 16b1a9c77..ae5baa80d 100644 --- a/src/workflows/base/states/StateEACAdditionalInputType.cpp +++ b/src/workflows/base/states/StateEACAdditionalInputType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateEACAdditionalInputType.h" diff --git a/src/workflows/base/states/StateEACAdditionalInputType.h b/src/workflows/base/states/StateEACAdditionalInputType.h index 179eb7e0a..feb5b8494 100644 --- a/src/workflows/base/states/StateEACAdditionalInputType.h +++ b/src/workflows/base/states/StateEACAdditionalInputType.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateEditAccessRights.cpp b/src/workflows/base/states/StateEditAccessRights.cpp index 4943422db..055f6e133 100644 --- a/src/workflows/base/states/StateEditAccessRights.cpp +++ b/src/workflows/base/states/StateEditAccessRights.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEditAccessRights.h" diff --git a/src/workflows/base/states/StateEditAccessRights.h b/src/workflows/base/states/StateEditAccessRights.h index 6a2e52327..d92281ab6 100644 --- a/src/workflows/base/states/StateEditAccessRights.h +++ b/src/workflows/base/states/StateEditAccessRights.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * * \brief This state waits for editing of the effective CHAT - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateEnterNewPacePin.cpp b/src/workflows/base/states/StateEnterNewPacePin.cpp index ae23ff708..c8660b793 100644 --- a/src/workflows/base/states/StateEnterNewPacePin.cpp +++ b/src/workflows/base/states/StateEnterNewPacePin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEnterNewPacePin.h" diff --git a/src/workflows/base/states/StateEnterNewPacePin.h b/src/workflows/base/states/StateEnterNewPacePin.h index d1d753564..8be5c3973 100644 --- a/src/workflows/base/states/StateEnterNewPacePin.h +++ b/src/workflows/base/states/StateEnterNewPacePin.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateEnterPacePassword.cpp b/src/workflows/base/states/StateEnterPacePassword.cpp index 7042fb62c..39a8c7445 100644 --- a/src/workflows/base/states/StateEnterPacePassword.cpp +++ b/src/workflows/base/states/StateEnterPacePassword.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEnterPacePassword.h" @@ -20,7 +20,8 @@ void StateEnterPacePassword::run() { if (getContext()->getStatus().isError()) { - Q_EMIT fireAbort(); + Q_ASSERT(getContext()->getFailureCode().has_value()); + Q_EMIT firePropagateAbort(); } else { diff --git a/src/workflows/base/states/StateEnterPacePassword.h b/src/workflows/base/states/StateEnterPacePassword.h index 0f4de66d0..f2743e14a 100644 --- a/src/workflows/base/states/StateEnterPacePassword.h +++ b/src/workflows/base/states/StateEnterPacePassword.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -27,6 +27,9 @@ class StateEnterPacePassword public: void onEntry(QEvent* pEvent) override; + + Q_SIGNALS: + void firePropagateAbort(); }; } // namespace governikus diff --git a/src/workflows/base/states/StateEstablishPaceChannel.cpp b/src/workflows/base/states/StateEstablishPaceChannel.cpp index 79fbb641d..43ca6ac64 100644 --- a/src/workflows/base/states/StateEstablishPaceChannel.cpp +++ b/src/workflows/base/states/StateEstablishPaceChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ @@ -24,7 +24,8 @@ void StateEstablishPaceChannel::run() { if (getContext()->getStatus().isError()) { - Q_EMIT fireAbort(); + Q_ASSERT(getContext()->getFailureCode().has_value()); + Q_EMIT firePropagateAbort(); return; } @@ -61,7 +62,7 @@ void StateEstablishPaceChannel::run() password = getContext()->getPin().toLatin1(); if (authContext && password.size() == 5) { - abortToChangePin(); + abortToChangePin(FailureCode::Reason::Establish_Pace_Channel_Transport_Pin); return; } break; @@ -80,7 +81,7 @@ void StateEstablishPaceChannel::run() if (!cardConnection) { qCDebug(statemachine) << "No card connection available."; - abort(); + abort(FailureCode::Reason::Establish_Pace_Channel_No_Card_Connection); return; } @@ -92,7 +93,7 @@ void StateEstablishPaceChannel::run() qCDebug(statemachine) << "Resetting all PACE passwords."; getContext()->resetPacePasswords(); - abort(); + abort(FailureCode::Reason::Establish_Pace_Channel_Basic_Reader_No_Pin); return; } @@ -124,14 +125,14 @@ void StateEstablishPaceChannel::onUserCancelled() } -void StateEstablishPaceChannel::abort() +void StateEstablishPaceChannel::abort(FailureCode::Reason pReason) { getContext()->resetLastPaceResult(); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(pReason); } -void StateEstablishPaceChannel::abortToChangePin() +void StateEstablishPaceChannel::abortToChangePin(FailureCode::Reason pReason) { if (auto authContext = getContext().objectCast()) { @@ -139,7 +140,7 @@ void StateEstablishPaceChannel::abortToChangePin() authContext->setLastPaceResult(CardReturnCode::NO_ACTIVE_PIN_SET); } updateStatus(GlobalStatus::Code::Workflow_Cancellation_By_User); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(pReason); } @@ -204,13 +205,17 @@ void StateEstablishPaceChannel::onEstablishConnectionDone(QSharedPointer::getName(returnCode)} + }); return; } diff --git a/src/workflows/base/states/StateEstablishPaceChannel.h b/src/workflows/base/states/StateEstablishPaceChannel.h index d57529a9d..89e14f609 100644 --- a/src/workflows/base/states/StateEstablishPaceChannel.h +++ b/src/workflows/base/states/StateEstablishPaceChannel.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the step that tries to establish a PACE * connection using the card's Pin. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -32,8 +34,8 @@ class StateEstablishPaceChannel void run() override; void onUserCancelled() override; - void abort(); - void abortToChangePin(); + void abort(FailureCode::Reason pReason); + void abortToChangePin(FailureCode::Reason pReason); void handleNpaPosition(CardReturnCode pReturnCode); private Q_SLOTS: @@ -43,6 +45,7 @@ class StateEstablishPaceChannel void firePaceChannelEstablished(); void firePaceChannelInoperative(); void fireAbortAndUnfortunateCardPosition(); + void firePropagateAbort(); }; } // namespace governikus diff --git a/src/workflows/base/states/StateExtractCvcsFromEac1InputType.cpp b/src/workflows/base/states/StateExtractCvcsFromEac1InputType.cpp index ac84d9f29..af6897d1f 100644 --- a/src/workflows/base/states/StateExtractCvcsFromEac1InputType.cpp +++ b/src/workflows/base/states/StateExtractCvcsFromEac1InputType.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateExtractCvcsFromEac1InputType.h" @@ -31,7 +31,7 @@ void StateExtractCvcsFromEac1InputType::run() { qCritical() << "More than one terminal certificate found in EAC1InputType"; updateStatus(GlobalStatus::Code::Workflow_No_Unique_AtCvc); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Extract_Cvcs_From_Eac1_No_Unique_At); return; } foundTerminalCvc = true; @@ -43,7 +43,7 @@ void StateExtractCvcsFromEac1InputType::run() { qCritical() << "More than one DV certificate found in EAC1InputType"; updateStatus(GlobalStatus::Code::Workflow_No_Unique_DvCvc); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Extract_Cvcs_From_Eac1_No_Unique_Dv); return; } foundDvCvc = true; @@ -55,14 +55,14 @@ void StateExtractCvcsFromEac1InputType::run() { qCritical() << "No terminal certificate found in EAC1InputType"; updateStatus(GlobalStatus::Code::Workflow_No_Unique_AtCvc); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Extract_Cvcs_From_Eac1_At_Missing); return; } if (!foundDvCvc) { qCritical() << "No DV certificate found in EAC1InputType"; updateStatus(GlobalStatus::Code::Workflow_No_Unique_DvCvc); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Extract_Cvcs_From_Eac1_Dv_Missing); return; } diff --git a/src/workflows/base/states/StateExtractCvcsFromEac1InputType.h b/src/workflows/base/states/StateExtractCvcsFromEac1InputType.h index 4cc69231a..fa97c530e 100644 --- a/src/workflows/base/states/StateExtractCvcsFromEac1InputType.h +++ b/src/workflows/base/states/StateExtractCvcsFromEac1InputType.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State to process InputType of EAC1. Extract certificates and set it to context. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateGenericProviderCommunication.cpp b/src/workflows/base/states/StateGenericProviderCommunication.cpp index 6fa644597..50c5b4214 100644 --- a/src/workflows/base/states/StateGenericProviderCommunication.cpp +++ b/src/workflows/base/states/StateGenericProviderCommunication.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateGenericProviderCommunication.h" @@ -59,14 +59,14 @@ void StateGenericProviderCommunication::run() } -void StateGenericProviderCommunication::reportCommunicationError(const GlobalStatus& pStatus) +void StateGenericProviderCommunication::reportCommunicationError(const GlobalStatus& pStatus, const FailureCode& pFailure) { qCritical() << pStatus; updateStatus(pStatus); clearConnections(); mReply->abort(); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(pFailure); } @@ -83,7 +83,11 @@ void StateGenericProviderCommunication::checkSslConnectionAndSaveCertificate(con if (!TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey())) { - reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}); + const GlobalStatus& status {GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}; + const FailureCode& failure {FailureCode::Reason::Generic_Provider_Communication_Invalid_Ephemeral_Key_Length, + {FailureCode::Info::State_Name, getStateName()} + }; + reportCommunicationError(status, failure); return; } @@ -91,7 +95,14 @@ void StateGenericProviderCommunication::checkSslConnectionAndSaveCertificate(con if (statusCode != CertificateChecker::CertificateStatus::Good) { infoMap.insert(GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate())); - reportCommunicationError(GlobalStatus(CertificateChecker::getGlobalStatus(statusCode, false), infoMap)); + const auto& status = GlobalStatus(CertificateChecker::getGlobalStatus(statusCode, false), infoMap); + const FailureCode& failure {FailureCode::Reason::Generic_Provider_Communication_Certificate_Error, + { + {FailureCode::Info::Certificate_Status, Enum::getName(statusCode)}, + {FailureCode::Info::State_Name, getStateName()} + } + }; + reportCommunicationError(status, failure); } } @@ -112,7 +123,15 @@ void StateGenericProviderCommunication::onSslErrors(const QList& pErr infoMap.insert(GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()); } - reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, infoMap}); + const GlobalStatus& status = {GlobalStatus::Code::Network_Ssl_Establishment_Error, infoMap}; + const FailureCode& failure {FailureCode::Reason::Generic_Provider_Communication_Ssl_Error, + { + {FailureCode::Info::Network_Error, mReply->errorString()}, + {FailureCode::Info::Ssl_Errors, TlsChecker::sslErrorsToString(pErrors)}, + {FailureCode::Info::State_Name, getStateName()} + } + }; + reportCommunicationError(status, failure); } } @@ -152,7 +171,12 @@ void StateGenericProviderCommunication::onNetworkReply() qDebug() << "Network request failed"; updateStatus(GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); - Q_EMIT fireAbort(); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::Network_Error, mReply->errorString()}, + {FailureCode::Info::Http_Status_Code, QString::number(statusCode)}, + {FailureCode::Info::State_Name, getStateName()} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Provider_Communication_Network_Error, infoMap}); } diff --git a/src/workflows/base/states/StateGenericProviderCommunication.h b/src/workflows/base/states/StateGenericProviderCommunication.h index 3ae488f7b..8405d06d5 100644 --- a/src/workflows/base/states/StateGenericProviderCommunication.h +++ b/src/workflows/base/states/StateGenericProviderCommunication.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -56,7 +56,7 @@ class StateGenericProviderCommunication void run() override; - void reportCommunicationError(const GlobalStatus& pStatus); + void reportCommunicationError(const GlobalStatus& pStatus, const FailureCode& pFailure); void checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration); private Q_SLOTS: diff --git a/src/workflows/base/states/StateGenericSendReceive.cpp b/src/workflows/base/states/StateGenericSendReceive.cpp index b321f8079..d168c60b7 100644 --- a/src/workflows/base/states/StateGenericSendReceive.cpp +++ b/src/workflows/base/states/StateGenericSendReceive.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateGenericSendReceive.h" @@ -36,7 +36,11 @@ StateGenericSendReceive::StateGenericSendReceive( void StateGenericSendReceive::emitStateMachineSignal(PaosType pResponseType) { Q_UNUSED(pResponseType) - Q_EMIT fireAbort(); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, getStateName()}, + {FailureCode::Info::Paos_Type, Enum::getName(pResponseType)} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Paos_Unhandled, infoMap}); } @@ -94,7 +98,11 @@ void StateGenericSendReceive::onSslErrors(const QList& pErrors) clearConnections(); mReply->abort(); - Q_EMIT fireAbort(); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, getStateName()}, + {FailureCode::Info::Ssl_Errors, TlsChecker::sslErrorsToString(pErrors)} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Ssl_Error, infoMap}); } } @@ -104,10 +112,10 @@ void StateGenericSendReceive::onSslHandshakeDone() const auto& cfg = mReply->sslConfiguration(); TlsChecker::logSslConfig(cfg, spawnMessageLogger(network)); - bool abort = !checkSslConnectionAndSaveCertificate(cfg); + auto failure = checkSslConnectionAndSaveCertificate(cfg); auto context = getContext(); - if (!abort && !context->getTcToken()->usePsk()) + if (!failure.has_value() && !context->getTcToken()->usePsk()) { const auto& session = context->getSslSession(); if (session.isEmpty() || session != cfg.sessionTicket()) @@ -123,16 +131,18 @@ void StateGenericSendReceive::onSslHandshakeDone() qCCritical(network) << sessionFailedError; updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }); - abort = true; + failure = {FailureCode::Reason::Generic_Send_Receive_Session_Resumption_Failed, + {FailureCode::Info::State_Name, getStateName()} + }; } } } - if (abort) + if (failure.has_value()) { clearConnections(); mReply->abort(); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(failure.value()); } } @@ -162,7 +172,7 @@ void StateGenericSendReceive::onExit(QEvent* pEvent) } -bool StateGenericSendReceive::checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration) +std::optional StateGenericSendReceive::checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration) { const QSharedPointer context = getContext(); Q_ASSERT(!context.isNull()); @@ -177,7 +187,8 @@ bool StateGenericSendReceive::checkSslConnectionAndSaveCertificate(const QSslCon !TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey())) { updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}); - return false; + return FailureCode(FailureCode::Reason::Generic_Send_Receive_Invalid_Ephemeral_Key_Length, + {FailureCode::Info::State_Name, getStateName()}); } const auto statusCode = CertificateChecker::checkAndSaveCertificate(pSslConfiguration.peerCertificate(), context->getTcToken()->getServerAddress(), context); @@ -185,10 +196,14 @@ bool StateGenericSendReceive::checkSslConnectionAndSaveCertificate(const QSslCon { infoMap.insert(GlobalStatus::ExternalInformation::CERTIFICATE_ISSUER_NAME, TlsChecker::getCertificateIssuerName(pSslConfiguration.peerCertificate())); updateStatus({CertificateChecker::getGlobalStatus(statusCode, true), infoMap}); - return false; + const FailureCode::FailureInfoMap failureInfoMap { + {FailureCode::Info::State_Name, getStateName()}, + {FailureCode::Info::Certificate_Status, Enum::getName(statusCode)} + }; + return FailureCode(FailureCode::Reason::Generic_Send_Receive_Certificate_Error, failureInfoMap); } - return true; + return {}; } @@ -254,7 +269,11 @@ void StateGenericSendReceive::onReplyFinished() const auto& channelStatus = NetworkManager::toTrustedChannelStatus(mReply); qCCritical(network) << GlobalStatus(channelStatus); updateStatus(channelStatus); - Q_EMIT fireAbort(); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::Network_Error, mReply->errorString()}, + {FailureCode::Info::State_Name, getStateName()} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Network_Error, infoMap}); return; } @@ -263,7 +282,11 @@ void StateGenericSendReceive::onReplyFinished() qCCritical(network) << GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_Error_From_Server); updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Error_From_Server, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }); - Q_EMIT fireAbort(); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, getStateName()}, + {FailureCode::Info::Http_Status_Code, QString::number(statusCode)} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Server_Error, infoMap}); return; } @@ -272,7 +295,11 @@ void StateGenericSendReceive::onReplyFinished() qCCritical(network) << GlobalStatus(GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer); updateStatus({GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }); - Q_EMIT fireAbort(); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, getStateName()}, + {FailureCode::Info::Http_Status_Code, QString::number(statusCode)} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Client_Error, infoMap}); return; } @@ -317,12 +344,18 @@ void StateGenericSendReceive::onReplyFinished() qCCritical(network) << "The program received an unknown message from the server."; updateStatus({GlobalStatus::Code::Workflow_Unknown_Paos_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }); - } - else - { - qCCritical(network) << "The program received an unexpected message from the server."; - updateStatus({GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Paos_Unknown, + {FailureCode::Info::State_Name, getStateName()} }); + return; } - Q_EMIT fireAbort(); + + qCCritical(network) << "The program received an unexpected message from the server."; + updateStatus({GlobalStatus::Code::Workflow_Unexpected_Message_From_EidServer, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} + }); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, getStateName()}, + {FailureCode::Info::Paos_Type, Enum::getName(receivedType)} + }; + Q_EMIT fireAbort({FailureCode::Reason::Generic_Send_Receive_Paos_Unexpected, infoMap}); } diff --git a/src/workflows/base/states/StateGenericSendReceive.h b/src/workflows/base/states/StateGenericSendReceive.h index b0655a732..a956b1aaf 100644 --- a/src/workflows/base/states/StateGenericSendReceive.h +++ b/src/workflows/base/states/StateGenericSendReceive.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -14,6 +14,7 @@ #include #include #include +#include class test_StateGenericSendReceive; @@ -34,7 +35,7 @@ class StateGenericSendReceive QSharedPointer mReply; void setReceivedMessage(const QSharedPointer& pMessage); - bool checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration); + std::optional checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration); void onSslErrors(const QList& pErrors); void onSslHandshakeDone(); void run() override; diff --git a/src/workflows/base/states/StateGetTcToken.cpp b/src/workflows/base/states/StateGetTcToken.cpp index 485b43f9a..370515d1a 100644 --- a/src/workflows/base/states/StateGetTcToken.cpp +++ b/src/workflows/base/states/StateGetTcToken.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateGetTcToken.h" @@ -37,7 +37,7 @@ void StateGetTcToken::run() if (!isValidRedirectUrl(url)) { - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Invalid_Url); return; } @@ -129,7 +129,7 @@ void StateGetTcToken::onSslHandshakeDone() mReply->abort(); qCritical() << "Error while connecting to the provider. The server's SSL certificate uses an unsupported key algorithm or length."; updateStatus(status); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Invalid_Certificate_Key_Length); return; } @@ -139,7 +139,7 @@ void StateGetTcToken::onSslHandshakeDone() mReply->abort(); qCritical() << "Error while connecting to the provider. The SSL connection uses an unsupported key algorithm or length."; updateStatus(status); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Invalid_Ephemeral_Key_Length); return; } @@ -158,7 +158,9 @@ void StateGetTcToken::onNetworkReply() { qCritical() << NetworkManager::toStatus(mReply); updateStatus(NetworkManager::toTrustedChannelStatus(mReply)); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Get_TcToken_Network_Error, + {FailureCode::Info::Network_Error, mReply->errorString()} + }); return; } @@ -171,7 +173,7 @@ void StateGetTcToken::onNetworkReply() const QUrl& redirectUrl = mReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!isValidRedirectUrl(redirectUrl)) { - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Invalid_Redirect_Url); return; } @@ -183,7 +185,9 @@ void StateGetTcToken::onNetworkReply() {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }; updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error, infoMap}); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Get_TcToken_Invalid_Server_Reply, + {FailureCode::Info::Http_Status_Code, QString::number(statusCode)} + }); return; } @@ -201,7 +205,7 @@ void StateGetTcToken::parseTcToken() qDebug() << "Received no data."; updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_No_Data_Received, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Empty_Data); return; } const QSharedPointer& tcToken = QSharedPointer::create(data); @@ -223,5 +227,5 @@ void StateGetTcToken::parseTcToken() qCritical() << "TCToken invalid"; updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error, {GlobalStatus::ExternalInformation::LAST_URL, mReply->url().toString()} }); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Invalid_Data); } diff --git a/src/workflows/base/states/StateGetTcToken.h b/src/workflows/base/states/StateGetTcToken.h index 7a03d039b..7a9cf8b9f 100644 --- a/src/workflows/base/states/StateGetTcToken.h +++ b/src/workflows/base/states/StateGetTcToken.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State machine state: Get TCToken. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateInitializeFramework.cpp b/src/workflows/base/states/StateInitializeFramework.cpp index 4507929e3..0e5285ecd 100644 --- a/src/workflows/base/states/StateInitializeFramework.cpp +++ b/src/workflows/base/states/StateInitializeFramework.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/invoke/InitializeFrameworkResponse.h" diff --git a/src/workflows/base/states/StateInitializeFramework.h b/src/workflows/base/states/StateInitializeFramework.h index 5f9f24f4b..fe3872852 100644 --- a/src/workflows/base/states/StateInitializeFramework.h +++ b/src/workflows/base/states/StateInitializeFramework.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateMaintainCardConnection.cpp b/src/workflows/base/states/StateMaintainCardConnection.cpp index 4d4bef092..e66d70d90 100644 --- a/src/workflows/base/states/StateMaintainCardConnection.cpp +++ b/src/workflows/base/states/StateMaintainCardConnection.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateMaintainCardConnection.h" @@ -24,7 +24,8 @@ void StateMaintainCardConnection::run() auto context = getContext(); if (context->getStatus().isError()) { - Q_EMIT fireAbort(); + Q_ASSERT(context->getFailureCode().has_value()); + Q_EMIT firePropagateAbort(); return; } @@ -48,7 +49,9 @@ void StateMaintainCardConnection::run() qCDebug(statemachine) << "Last PACE result is unrecoverable. Aborting."; updateStatus(CardReturnCodeUtil::toGlobalStatus(lastPaceResult)); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Maintain_Card_Connection_Pace_Unrecoverable, + {FailureCode::Info::Card_Return_Code, Enum::getName(lastPaceResult)} + }); return; } diff --git a/src/workflows/base/states/StateMaintainCardConnection.h b/src/workflows/base/states/StateMaintainCardConnection.h index b46e69c89..a7a5c7940 100644 --- a/src/workflows/base/states/StateMaintainCardConnection.h +++ b/src/workflows/base/states/StateMaintainCardConnection.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -25,6 +25,7 @@ class StateMaintainCardConnection Q_SIGNALS: void fireNoCardConnection(); void fireForceUpdateRetryCounter(); + void firePropagateAbort(); }; } // namespace governikus diff --git a/src/workflows/base/states/StateParseTcTokenUrl.cpp b/src/workflows/base/states/StateParseTcTokenUrl.cpp index a8f295499..a01dde0c1 100644 --- a/src/workflows/base/states/StateParseTcTokenUrl.cpp +++ b/src/workflows/base/states/StateParseTcTokenUrl.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parse tcTokenURL from GET query. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateParseTcTokenUrl.h" @@ -31,13 +33,14 @@ void StateParseTcTokenUrl::run() if (query.hasQueryItem(QStringLiteral("tcTokenURL"))) { qCritical() << "TcTokenUrl is not valid:" << tcTokenURL.toString(); + updateStatus(GlobalStatus::Code::Workflow_Wrong_Parameter_Invocation); + Q_EMIT fireAbort(FailureCode::Reason::Parse_TcToken_Invalid_Url); } else { qCritical() << "No parameter tcTokenURL"; + updateStatus(GlobalStatus::Code::Workflow_Wrong_Parameter_Invocation); + Q_EMIT fireAbort(FailureCode::Reason::Parse_TcToken_Missing_Url); } - - updateStatus(GlobalStatus::Code::Workflow_Wrong_Parameter_Invocation); - Q_EMIT fireAbort(); } } diff --git a/src/workflows/base/states/StateParseTcTokenUrl.h b/src/workflows/base/states/StateParseTcTokenUrl.h index 018439482..432452083 100644 --- a/src/workflows/base/states/StateParseTcTokenUrl.h +++ b/src/workflows/base/states/StateParseTcTokenUrl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Implements the parsing of TcTokenUrl in header of browser request. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StatePreVerification.cpp b/src/workflows/base/states/StatePreVerification.cpp index b7ddad726..4e203d6da 100644 --- a/src/workflows/base/states/StatePreVerification.cpp +++ b/src/workflows/base/states/StatePreVerification.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePreVerification.h" @@ -53,7 +53,7 @@ void StatePreVerification::run() { qCritical() << "Using the developer mode is only allowed in a test environment"; updateStatus(GlobalStatus::Code::Workflow_Preverification_Developermode_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Pre_Verfication_No_Test_Environment); return; } @@ -68,14 +68,14 @@ void StatePreVerification::run() { qCritical() << "Pre-verification failed: cannot build certificate chain"; updateStatus(GlobalStatus::Code::Workflow_Preverification_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Pre_Verfication_Invalid_Certificate_Chain); return; } else if (!SignatureChecker(certificateChain).check()) { qCritical() << "Pre-verification failed: signature check failed"; updateStatus(GlobalStatus::Code::Workflow_Preverification_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Pre_Verfication_Invalid_Certificate_Signature); return; } else if (!isValid(certificateChain)) @@ -88,7 +88,7 @@ void StatePreVerification::run() { qCritical() << "Pre-verification failed: certificate not valid"; updateStatus(GlobalStatus::Code::Workflow_Preverification_Error); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Pre_Verfication_Certificate_Expired); return; } } diff --git a/src/workflows/base/states/StatePreVerification.h b/src/workflows/base/states/StatePreVerification.h index 8e9adbb4a..da38631d1 100644 --- a/src/workflows/base/states/StatePreVerification.h +++ b/src/workflows/base/states/StatePreVerification.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Performs the pre-verification of cvcs. If the pre-verification succeeds the cvc chain is set to the authentication model. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StatePrepareChangePin.cpp b/src/workflows/base/states/StatePrepareChangePin.cpp index b5964c737..506e05774 100644 --- a/src/workflows/base/states/StatePrepareChangePin.cpp +++ b/src/workflows/base/states/StatePrepareChangePin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePrepareChangePin.h" diff --git a/src/workflows/base/states/StatePrepareChangePin.h b/src/workflows/base/states/StatePrepareChangePin.h index c7f88f96a..87d779c87 100644 --- a/src/workflows/base/states/StatePrepareChangePin.h +++ b/src/workflows/base/states/StatePrepareChangePin.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StatePreparePace.cpp b/src/workflows/base/states/StatePreparePace.cpp index 8e36d3298..fb5ed84e2 100644 --- a/src/workflows/base/states/StatePreparePace.cpp +++ b/src/workflows/base/states/StatePreparePace.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePreparePace.h" @@ -25,7 +25,7 @@ void StatePreparePace::run() if (!cardConnection) { qCDebug(statemachine) << "Card connection lost."; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Prepace_Pace_No_Card_Connection); return; } @@ -36,7 +36,7 @@ void StatePreparePace::run() { qCDebug(statemachine) << "Smart-eID was invalidated during workflow"; updateStatus(GlobalStatus::Code::Card_Smart_Invalid); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Prepace_Pace_Smart_Eid_Invalidated); } qCDebug(statemachine) << "Smart-eID PIN required"; diff --git a/src/workflows/base/states/StatePreparePace.h b/src/workflows/base/states/StatePreparePace.h index 78cffbd5d..e8f83b974 100644 --- a/src/workflows/base/states/StatePreparePace.h +++ b/src/workflows/base/states/StatePreparePace.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateProcessCertificatesFromEac2.cpp b/src/workflows/base/states/StateProcessCertificatesFromEac2.cpp index 890a2c0c4..e6f2266bf 100644 --- a/src/workflows/base/states/StateProcessCertificatesFromEac2.cpp +++ b/src/workflows/base/states/StateProcessCertificatesFromEac2.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateProcessCertificatesFromEac2.h" @@ -44,7 +44,7 @@ void StateProcessCertificatesFromEac2::run() { qCritical() << "No cvc chain determined, abort authentication"; updateStatus(GlobalStatus::Code::Workflow_Cannot_Confirm_IdCard_Authenticity); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Process_Certificates_From_Eac2_Cvc_Chain_Missing); } else { diff --git a/src/workflows/base/states/StateProcessCertificatesFromEac2.h b/src/workflows/base/states/StateProcessCertificatesFromEac2.h index 0719e3d31..3c2e54756 100644 --- a/src/workflows/base/states/StateProcessCertificatesFromEac2.h +++ b/src/workflows/base/states/StateProcessCertificatesFromEac2.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State to process certificates from EAC2. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateProcessing.cpp b/src/workflows/base/states/StateProcessing.cpp index c7656d7c1..15cb68ad5 100644 --- a/src/workflows/base/states/StateProcessing.cpp +++ b/src/workflows/base/states/StateProcessing.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateProcessing.h" @@ -25,6 +25,6 @@ void StateProcessing::run() qCritical() << "Cannot send \"Processing\" to caller:" << activationContext->getSendError(); updateStatus({GlobalStatus::Code::Workflow_Processing_Error, {GlobalStatus::ExternalInformation::ACTIVATION_ERROR, activationContext->getSendError()} }); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Processing_Send_Status_Failed); } } diff --git a/src/workflows/base/states/StateProcessing.h b/src/workflows/base/states/StateProcessing.h index f213caee1..76a5205bb 100644 --- a/src/workflows/base/states/StateProcessing.h +++ b/src/workflows/base/states/StateProcessing.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Sends a HTTP-Processing to the browser. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateRedirectBrowser.cpp b/src/workflows/base/states/StateRedirectBrowser.cpp index b21c64da2..aeeb20195 100644 --- a/src/workflows/base/states/StateRedirectBrowser.cpp +++ b/src/workflows/base/states/StateRedirectBrowser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateRedirectBrowser.h" @@ -76,7 +76,7 @@ void StateRedirectBrowser::sendErrorPage(http_status pStatus) qCritical() << "Cannot send error page to caller:" << activationContext->getSendError(); updateStatus({GlobalStatus::Code::Workflow_Error_Page_Transmission_Error, {GlobalStatus::ExternalInformation::ACTIVATION_ERROR, activationContext->getSendError()} }); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Redirect_Browser_Send_Error_Page_Failed); } } @@ -106,7 +106,7 @@ bool StateRedirectBrowser::sendRedirect(const QUrl& pRedirectAddress, const ECar qCritical() << "Cannot send redirect to caller:" << activationContext->getSendError(); updateStatus({GlobalStatus::Code::Workflow_Redirect_Transmission_Error, {GlobalStatus::ExternalInformation::ACTIVATION_ERROR, activationContext->getSendError()} }); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Redirect_Browser_Send_Redirect_Failed); return false; } diff --git a/src/workflows/base/states/StateRedirectBrowser.h b/src/workflows/base/states/StateRedirectBrowser.h index 3e5c452d9..c222748f0 100644 --- a/src/workflows/base/states/StateRedirectBrowser.h +++ b/src/workflows/base/states/StateRedirectBrowser.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Send a redirect to the browser. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateSelectReader.cpp b/src/workflows/base/states/StateSelectReader.cpp index 2a8c624af..520e46cc1 100644 --- a/src/workflows/base/states/StateSelectReader.cpp +++ b/src/workflows/base/states/StateSelectReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "StateSelectReader.h" @@ -30,7 +30,6 @@ void StateSelectReader::run() mConnections += connect(readerManager, &ReaderManager::fireReaderRemoved, this, &StateSelectReader::onReaderInfoChanged); mConnections += connect(readerManager, &ReaderManager::fireCardInserted, this, &StateSelectReader::onReaderInfoChanged); mConnections += connect(readerManager, &ReaderManager::fireCardRemoved, this, &StateSelectReader::onReaderInfoChanged); - mConnections += connect(readerManager, &ReaderManager::fireStatusChanged, this, &StateSelectReader::onReaderStatusChanged); onReaderInfoChanged(); @@ -48,6 +47,7 @@ void StateSelectReader::run() void StateSelectReader::onReaderInfoChanged() { const QSharedPointer context = getContext(); + Q_ASSERT(context); bool currentReaderHasEidCardButInsufficientApduLength = false; const QVector& plugInTypes = context->getReaderPlugInTypes(); @@ -94,23 +94,10 @@ void StateSelectReader::onReaderInfoChanged() } -void StateSelectReader::onReaderStatusChanged(const ReaderManagerPlugInInfo& pInfo) -{ - const auto& readerPlugInType = pInfo.getPlugInType(); - const auto& context = getContext(); - - const auto& shouldBeRunning = context->getReaderPlugInTypes().contains(readerPlugInType); - - if (Env::getSingleton()->isScanRunning(readerPlugInType) != shouldBeRunning) - { - Q_EMIT fireRetry(); - } -} - - void StateSelectReader::onEntry(QEvent* pEvent) { const WorkflowContext* const context = getContext().data(); + Q_ASSERT(context); /* * Note: the plugin types to be used in this state must be already set in the workflow context before this state is entered. diff --git a/src/workflows/base/states/StateSelectReader.h b/src/workflows/base/states/StateSelectReader.h index f68af5fe5..714fcd03e 100644 --- a/src/workflows/base/states/StateSelectReader.h +++ b/src/workflows/base/states/StateSelectReader.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -7,7 +7,6 @@ #include "AbstractState.h" #include "GenericContextContainer.h" -class test_StateSelectReader; namespace governikus { @@ -18,7 +17,6 @@ class StateSelectReader { Q_OBJECT friend class StateBuilder; - friend class ::test_StateSelectReader; private: explicit StateSelectReader(const QSharedPointer& pContext); @@ -26,7 +24,6 @@ class StateSelectReader private Q_SLOTS: void onReaderInfoChanged(); - void onReaderStatusChanged(const ReaderManagerPlugInInfo& pInfo); public: void onEntry(QEvent* pEvent) override; diff --git a/src/workflows/base/states/StateSendWhitelistSurvey.cpp b/src/workflows/base/states/StateSendWhitelistSurvey.cpp index 7f11df98d..79ffaa24b 100644 --- a/src/workflows/base/states/StateSendWhitelistSurvey.cpp +++ b/src/workflows/base/states/StateSendWhitelistSurvey.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateSendWhitelistSurvey.h" diff --git a/src/workflows/base/states/StateSendWhitelistSurvey.h b/src/workflows/base/states/StateSendWhitelistSurvey.h index da6aeb8d2..6c93f4717 100644 --- a/src/workflows/base/states/StateSendWhitelistSurvey.h +++ b/src/workflows/base/states/StateSendWhitelistSurvey.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /* * \brief Allows the user to send a survey after a successful authentication * on Android. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateShowResult.cpp b/src/workflows/base/states/StateShowResult.cpp index 9b2778723..6ec308bc0 100644 --- a/src/workflows/base/states/StateShowResult.cpp +++ b/src/workflows/base/states/StateShowResult.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateShowResult.h" diff --git a/src/workflows/base/states/StateShowResult.h b/src/workflows/base/states/StateShowResult.h index dcb679029..bfb12f704 100644 --- a/src/workflows/base/states/StateShowResult.h +++ b/src/workflows/base/states/StateShowResult.h @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateStartPaos.cpp b/src/workflows/base/states/StateStartPaos.cpp index 82602b619..c8c67246a 100644 --- a/src/workflows/base/states/StateStartPaos.cpp +++ b/src/workflows/base/states/StateStartPaos.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateStartPaos.h" diff --git a/src/workflows/base/states/StateStartPaos.h b/src/workflows/base/states/StateStartPaos.h index 151698e7b..9445cd77c 100644 --- a/src/workflows/base/states/StateStartPaos.h +++ b/src/workflows/base/states/StateStartPaos.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State machine state: Start PAOS. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateStartPaosResponse.cpp b/src/workflows/base/states/StateStartPaosResponse.cpp index 01024e563..a273f156e 100644 --- a/src/workflows/base/states/StateStartPaosResponse.cpp +++ b/src/workflows/base/states/StateStartPaosResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateStartPaosResponse.h" @@ -25,7 +25,7 @@ void StateStartPaosResponse::run() const QSharedPointer& startPaosResponse = getContext()->getStartPaosResponse(); if (!startPaosResponse) { - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Start_Paos_Response_Missing); return; } @@ -39,5 +39,5 @@ void StateStartPaosResponse::run() qDebug() << "Processing server result:" << result.getMajorString() << result.getMinorString() << result.getMessage(); updateStartPaosResult(result); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Start_Paos_Response_Error); } diff --git a/src/workflows/base/states/StateStartPaosResponse.h b/src/workflows/base/states/StateStartPaosResponse.h index 4012943e5..d6cb10a72 100644 --- a/src/workflows/base/states/StateStartPaosResponse.h +++ b/src/workflows/base/states/StateStartPaosResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State to process StartPaosResponse from Server. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateTransmit.cpp b/src/workflows/base/states/StateTransmit.cpp index 1db396deb..52178782f 100644 --- a/src/workflows/base/states/StateTransmit.cpp +++ b/src/workflows/base/states/StateTransmit.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardConnection.h" @@ -46,7 +46,9 @@ void StateTransmit::onCardCommandDone(QSharedPointer pCommand) else { updateStatus(CardReturnCodeUtil::toGlobalStatus(returnCode)); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Transmit_Card_Command_Failed, + {FailureCode::Info::Card_Return_Code, Enum::getName(returnCode)} + }); } } diff --git a/src/workflows/base/states/StateTransmit.h b/src/workflows/base/states/StateTransmit.h index 6590920d2..cb1528c7a 100644 --- a/src/workflows/base/states/StateTransmit.h +++ b/src/workflows/base/states/StateTransmit.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Process received transmits. Send it to the card and create a response. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateUnfortunateCardPosition.cpp b/src/workflows/base/states/StateUnfortunateCardPosition.cpp index adf3379c1..b3efb7aaf 100644 --- a/src/workflows/base/states/StateUnfortunateCardPosition.cpp +++ b/src/workflows/base/states/StateUnfortunateCardPosition.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateUnfortunateCardPosition.h" diff --git a/src/workflows/base/states/StateUnfortunateCardPosition.h b/src/workflows/base/states/StateUnfortunateCardPosition.h index 8c2b5c5bf..411854b57 100644 --- a/src/workflows/base/states/StateUnfortunateCardPosition.h +++ b/src/workflows/base/states/StateUnfortunateCardPosition.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateUpdateRetryCounter.cpp b/src/workflows/base/states/StateUpdateRetryCounter.cpp index e625a356c..111b69006 100644 --- a/src/workflows/base/states/StateUpdateRetryCounter.cpp +++ b/src/workflows/base/states/StateUpdateRetryCounter.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateUpdateRetryCounter.h" @@ -26,7 +26,7 @@ void StateUpdateRetryCounter::run() if (!cardConnection) { qCDebug(statemachine) << "No card connection available."; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Update_Retry_Counter_No_Card_Connection); return; } @@ -39,11 +39,14 @@ void StateUpdateRetryCounter::onUpdateRetryCounterDone(QSharedPointergetReturnCode() != CardReturnCode::OK) + const auto& returnCode = pCommand->getReturnCode(); + if (returnCode != CardReturnCode::OK) { qCCritical(statemachine) << "An error occurred while communicating with the card reader, cannot determine retry counter, abort state"; getContext()->resetCardConnection(); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Update_Retry_Counter_Communication_Error, + {FailureCode::Info::Card_Return_Code, Enum::getName(returnCode)} + }); return; } diff --git a/src/workflows/base/states/StateUpdateRetryCounter.h b/src/workflows/base/states/StateUpdateRetryCounter.h index 6fd13b4c1..9d34ea635 100644 --- a/src/workflows/base/states/StateUpdateRetryCounter.h +++ b/src/workflows/base/states/StateUpdateRetryCounter.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the step that updates the retry * counter of a card. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateVerifyRetryCounter.cpp b/src/workflows/base/states/StateVerifyRetryCounter.cpp index f03d7b628..6715b240e 100644 --- a/src/workflows/base/states/StateVerifyRetryCounter.cpp +++ b/src/workflows/base/states/StateVerifyRetryCounter.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateVerifyRetryCounter.h" @@ -24,7 +24,7 @@ void StateVerifyRetryCounter::run() if (!cardConnection) { qCDebug(statemachine) << "Card connection lost."; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Verify_Retry_Counter_No_Card_Connection); return; } diff --git a/src/workflows/base/states/StateVerifyRetryCounter.h b/src/workflows/base/states/StateVerifyRetryCounter.h index 5e6d291eb..558ac60cf 100644 --- a/src/workflows/base/states/StateVerifyRetryCounter.h +++ b/src/workflows/base/states/StateVerifyRetryCounter.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/base/states/StateWriteHistory.cpp b/src/workflows/base/states/StateWriteHistory.cpp index 779409402..78fe27431 100644 --- a/src/workflows/base/states/StateWriteHistory.cpp +++ b/src/workflows/base/states/StateWriteHistory.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateWriteHistory.h" @@ -35,10 +35,17 @@ void StateWriteHistory::run() return; } - if (context->getDidAuthenticateEac1() == nullptr || context->getAccessRightManager()->getEffectiveAccessRights().isEmpty()) + if (context->getDidAuthenticateEac1() == nullptr) { - qWarning() << "No EAC1 structure or effective CHAT in model."; - Q_EMIT fireAbort(); + qWarning() << "No EAC1 structure in context."; + Q_EMIT fireAbort(FailureCode::Reason::Write_History_No_Eac1); + return; + } + + if (context->getAccessRightManager()->getEffectiveAccessRights().isEmpty()) + { + qWarning() << "No effective CHAT in context."; + Q_EMIT fireAbort(FailureCode::Reason::Write_History_No_Chat); return; } diff --git a/src/workflows/base/states/StateWriteHistory.h b/src/workflows/base/states/StateWriteHistory.h index b8d8d41e6..516a5808b 100644 --- a/src/workflows/base/states/StateWriteHistory.h +++ b/src/workflows/base/states/StateWriteHistory.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /* * * \brief Writes the history entry . - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/context/IfdServiceContext.cpp b/src/workflows/ifd/context/IfdServiceContext.cpp index 51eb50c60..cc7145c83 100644 --- a/src/workflows/ifd/context/IfdServiceContext.cpp +++ b/src/workflows/ifd/context/IfdServiceContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdServiceContext.h" @@ -104,7 +104,7 @@ bool IfdServiceContext::isCanAllowedMode() const void IfdServiceContext::cancelPasswordRequest() { - Q_EMIT fireCancelPasswordRequest(false); + Q_EMIT fireCancelPasswordRequest(); } @@ -115,7 +115,7 @@ void IfdServiceContext::setEstablishPaceChannel(const QSharedPointergetSlotHandle(); mEstablishPaceChannel = pMessage->getInputData(); mRequestTransportPin = pMessage->getExpectedPinLength() == 5; - mAllowToChangePinLength = isPinAuthentication() || (isPinChangeWorkflow() && pMessage->getExpectedPinLength() == 0); + mAllowToChangePinLength = isPinChangeWorkflow() && pMessage->getExpectedPinLength() == 0; } else { @@ -153,8 +153,6 @@ void IfdServiceContext::changePinLength() Q_EMIT firePasswordTypeChanged(); return; } - - Q_EMIT fireCancelPasswordRequest(true); } diff --git a/src/workflows/ifd/context/IfdServiceContext.h b/src/workflows/ifd/context/IfdServiceContext.h index 1e79ad334..986ee691c 100644 --- a/src/workflows/ifd/context/IfdServiceContext.h +++ b/src/workflows/ifd/context/IfdServiceContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Remote service context. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -46,7 +48,7 @@ class IfdServiceContext Q_SIGNALS: void fireCardConnected(const QSharedPointer& pConnection); void fireCardDisconnected(const QSharedPointer& pConnection); - void fireCancelPasswordRequest(bool pRequestPinChange); + void fireCancelPasswordRequest(); void fireEstablishPaceChannelUpdated(); void fireIsRunningChanged(); diff --git a/src/workflows/ifd/controller/IfdServiceController.cpp b/src/workflows/ifd/controller/IfdServiceController.cpp index dd88a8d65..34cdf8011 100644 --- a/src/workflows/ifd/controller/IfdServiceController.cpp +++ b/src/workflows/ifd/controller/IfdServiceController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdServiceController.h" diff --git a/src/workflows/ifd/controller/IfdServiceController.h b/src/workflows/ifd/controller/IfdServiceController.h index b10386c06..720b69cb5 100644 --- a/src/workflows/ifd/controller/IfdServiceController.h +++ b/src/workflows/ifd/controller/IfdServiceController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the remote service process. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateChangePinIfd.cpp b/src/workflows/ifd/states/StateChangePinIfd.cpp index 5a2749bab..fe532d9ba 100644 --- a/src/workflows/ifd/states/StateChangePinIfd.cpp +++ b/src/workflows/ifd/states/StateChangePinIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateChangePinIfd.h" diff --git a/src/workflows/ifd/states/StateChangePinIfd.h b/src/workflows/ifd/states/StateChangePinIfd.h index bc45b3aa8..5eff270ac 100644 --- a/src/workflows/ifd/states/StateChangePinIfd.h +++ b/src/workflows/ifd/states/StateChangePinIfd.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief This state executes the remote message IfdModifyPin. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateChangePinResponse.cpp b/src/workflows/ifd/states/StateChangePinResponse.cpp index dbab481f7..249078e82 100644 --- a/src/workflows/ifd/states/StateChangePinResponse.cpp +++ b/src/workflows/ifd/states/StateChangePinResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateChangePinResponse.h" diff --git a/src/workflows/ifd/states/StateChangePinResponse.h b/src/workflows/ifd/states/StateChangePinResponse.h index bc4e3e329..2fadcaf4c 100644 --- a/src/workflows/ifd/states/StateChangePinResponse.h +++ b/src/workflows/ifd/states/StateChangePinResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief This state executes the remote message IfdModifyPin. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateEnterNewPacePinIfd.cpp b/src/workflows/ifd/states/StateEnterNewPacePinIfd.cpp index 16b038a0b..d5189ede0 100644 --- a/src/workflows/ifd/states/StateEnterNewPacePinIfd.cpp +++ b/src/workflows/ifd/states/StateEnterNewPacePinIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEnterNewPacePinIfd.h" @@ -28,7 +28,7 @@ void StateEnterNewPacePinIfd::onCancelChangePin() { getContext()->setModifyPinMessageResponseApdu(ResponseApdu(StatusCode::INPUT_CANCELLED)); } - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Enter_New_Pace_Pin_Ifd_User_Cancelled); } diff --git a/src/workflows/ifd/states/StateEnterNewPacePinIfd.h b/src/workflows/ifd/states/StateEnterNewPacePinIfd.h index 4e884d14b..d5b239982 100644 --- a/src/workflows/ifd/states/StateEnterNewPacePinIfd.h +++ b/src/workflows/ifd/states/StateEnterNewPacePinIfd.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateEnterPacePasswordIfd.cpp b/src/workflows/ifd/states/StateEnterPacePasswordIfd.cpp index 532676607..386acaf1e 100644 --- a/src/workflows/ifd/states/StateEnterPacePasswordIfd.cpp +++ b/src/workflows/ifd/states/StateEnterPacePasswordIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEnterPacePasswordIfd.h" @@ -22,16 +22,16 @@ void StateEnterPacePasswordIfd::run() } -void StateEnterPacePasswordIfd::onCancelEstablishPaceChannel(bool pRequestPinChange) +void StateEnterPacePasswordIfd::onCancelEstablishPaceChannel() { if (getContext() && getContext()->getIfdServer() && getContext()->getIfdServer()->getMessageHandler()) { EstablishPaceChannelOutput channelOutput; - channelOutput.setPaceReturnCode(pRequestPinChange ? CardReturnCode::NO_ACTIVE_PIN_SET : CardReturnCode::CANCELLATION_BY_USER); + channelOutput.setPaceReturnCode(CardReturnCode::CANCELLATION_BY_USER); getContext()->setEstablishPaceChannelOutput(channelOutput); } - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Enter_Pace_Password_Ifd_User_Cancelled); } diff --git a/src/workflows/ifd/states/StateEnterPacePasswordIfd.h b/src/workflows/ifd/states/StateEnterPacePasswordIfd.h index 066b02137..cbf6fc9b2 100644 --- a/src/workflows/ifd/states/StateEnterPacePasswordIfd.h +++ b/src/workflows/ifd/states/StateEnterPacePasswordIfd.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -23,7 +23,7 @@ class StateEnterPacePasswordIfd void run() override; private Q_SLOTS: - void onCancelEstablishPaceChannel(bool pRequestPinChange); + void onCancelEstablishPaceChannel(); public: void onEntry(QEvent* pEvent) override; diff --git a/src/workflows/ifd/states/StateEstablishPaceChannelIfd.cpp b/src/workflows/ifd/states/StateEstablishPaceChannelIfd.cpp index ffcfa70fa..ff7452ecf 100644 --- a/src/workflows/ifd/states/StateEstablishPaceChannelIfd.cpp +++ b/src/workflows/ifd/states/StateEstablishPaceChannelIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEstablishPaceChannelIfd.h" @@ -53,7 +53,7 @@ void StateEstablishPaceChannelIfd::run() break; default: - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Establish_Pace_Ifd_Unknown); return; } diff --git a/src/workflows/ifd/states/StateEstablishPaceChannelIfd.h b/src/workflows/ifd/states/StateEstablishPaceChannelIfd.h index 68833024b..70cf3c38c 100644 --- a/src/workflows/ifd/states/StateEstablishPaceChannelIfd.h +++ b/src/workflows/ifd/states/StateEstablishPaceChannelIfd.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief This state executes the remote message PACE channel establish. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateEstablishPaceChannelResponse.cpp b/src/workflows/ifd/states/StateEstablishPaceChannelResponse.cpp index 997de1ecd..000155863 100644 --- a/src/workflows/ifd/states/StateEstablishPaceChannelResponse.cpp +++ b/src/workflows/ifd/states/StateEstablishPaceChannelResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateEstablishPaceChannelResponse.h" diff --git a/src/workflows/ifd/states/StateEstablishPaceChannelResponse.h b/src/workflows/ifd/states/StateEstablishPaceChannelResponse.h index a69f273ab..c3d50aa02 100644 --- a/src/workflows/ifd/states/StateEstablishPaceChannelResponse.h +++ b/src/workflows/ifd/states/StateEstablishPaceChannelResponse.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief This state executes the remote message PACE channel establish. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StatePrepareChangePinIfd.cpp b/src/workflows/ifd/states/StatePrepareChangePinIfd.cpp index 00bb91bbc..78222662b 100644 --- a/src/workflows/ifd/states/StatePrepareChangePinIfd.cpp +++ b/src/workflows/ifd/states/StatePrepareChangePinIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePrepareChangePinIfd.h" diff --git a/src/workflows/ifd/states/StatePrepareChangePinIfd.h b/src/workflows/ifd/states/StatePrepareChangePinIfd.h index 3a9d57a54..a7cb2f048 100644 --- a/src/workflows/ifd/states/StatePrepareChangePinIfd.h +++ b/src/workflows/ifd/states/StatePrepareChangePinIfd.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StatePreparePaceIfd.cpp b/src/workflows/ifd/states/StatePreparePaceIfd.cpp index 395a38d22..77dad393a 100644 --- a/src/workflows/ifd/states/StatePreparePaceIfd.cpp +++ b/src/workflows/ifd/states/StatePreparePaceIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePreparePaceIfd.h" @@ -56,7 +56,7 @@ void StatePreparePaceIfd::run() case PacePasswordId::PACE_MRZ: case PacePasswordId::UNKNOWN: qCritical() << "Cannot handle unknown PacePasswordId"; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Prepare_Pace_Ifd_Unknown); return; } } diff --git a/src/workflows/ifd/states/StatePreparePaceIfd.h b/src/workflows/ifd/states/StatePreparePaceIfd.h index 0518804ac..7f736274c 100644 --- a/src/workflows/ifd/states/StatePreparePaceIfd.h +++ b/src/workflows/ifd/states/StatePreparePaceIfd.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateProcessIfdMessages.cpp b/src/workflows/ifd/states/StateProcessIfdMessages.cpp index c5817fd52..37b81e26b 100644 --- a/src/workflows/ifd/states/StateProcessIfdMessages.cpp +++ b/src/workflows/ifd/states/StateProcessIfdMessages.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateProcessIfdMessages.h" @@ -105,7 +105,7 @@ void StateProcessIfdMessages::onReaderStatusChanged(const ReaderManagerPlugInInf const auto& context = getContext(); if (context->getIfdServer()->isConnected()) { - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Process_Ifd_Messages_No_Server_Connection); } } diff --git a/src/workflows/ifd/states/StateProcessIfdMessages.h b/src/workflows/ifd/states/StateProcessIfdMessages.h index e6c91abd7..cbf89918e 100644 --- a/src/workflows/ifd/states/StateProcessIfdMessages.h +++ b/src/workflows/ifd/states/StateProcessIfdMessages.h @@ -1,8 +1,10 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief This state allows the processing of ordenary remote messages in the * background and handles special PACE messages. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateStartIfdService.cpp b/src/workflows/ifd/states/StateStartIfdService.cpp index e77b7cf45..169ebcac6 100644 --- a/src/workflows/ifd/states/StateStartIfdService.cpp +++ b/src/workflows/ifd/states/StateStartIfdService.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateStartIfdService.h" @@ -29,7 +29,7 @@ void StateStartIfdService::run() if (!server->isRunning() && !server->start(serverName)) { qCCritical(statemachine) << "Cannot start IfdServer."; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Start_Ifd_Service_Failed); return; } diff --git a/src/workflows/ifd/states/StateStartIfdService.h b/src/workflows/ifd/states/StateStartIfdService.h index 667e04fd5..22d6efd38 100644 --- a/src/workflows/ifd/states/StateStartIfdService.h +++ b/src/workflows/ifd/states/StateStartIfdService.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Start the remote service. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/ifd/states/StateStopIfdService.cpp b/src/workflows/ifd/states/StateStopIfdService.cpp index 6bb04bb09..01d8eed01 100644 --- a/src/workflows/ifd/states/StateStopIfdService.cpp +++ b/src/workflows/ifd/states/StateStopIfdService.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "StateStopIfdService.h" diff --git a/src/workflows/ifd/states/StateStopIfdService.h b/src/workflows/ifd/states/StateStopIfdService.h index cf4c1aa2b..a40912aa8 100644 --- a/src/workflows/ifd/states/StateStopIfdService.h +++ b/src/workflows/ifd/states/StateStopIfdService.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Stop the remote service. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/context/PersonalizationContext.cpp b/src/workflows/personalization/context/PersonalizationContext.cpp index 7d1fea0fc..9413f9e8b 100644 --- a/src/workflows/personalization/context/PersonalizationContext.cpp +++ b/src/workflows/personalization/context/PersonalizationContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Smart context. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "PersonalizationContext.h" diff --git a/src/workflows/personalization/context/PersonalizationContext.h b/src/workflows/personalization/context/PersonalizationContext.h index f0fa4372c..1a40de25a 100644 --- a/src/workflows/personalization/context/PersonalizationContext.h +++ b/src/workflows/personalization/context/PersonalizationContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/controller/PersonalizationController.cpp b/src/workflows/personalization/controller/PersonalizationController.cpp index e8482f17f..e0f7a53a7 100644 --- a/src/workflows/personalization/controller/PersonalizationController.cpp +++ b/src/workflows/personalization/controller/PersonalizationController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "controller/PersonalizationController.h" @@ -96,6 +96,7 @@ PersonalizationController::PersonalizationController(QSharedPointeraddTransition(sCheckError, &AbstractState::fireContinue, sCheckRefreshAddress); sCheckError->addTransition(sCheckError, &AbstractState::fireAbort, sFinal); + sCheckError->addTransition(sCheckError, &StateCheckError::firePropagateAbort, sFinal); sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireContinue, sWriteHistory); sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireAbort, sFinal); @@ -137,6 +138,7 @@ PersonalizationController::PersonalizationController(QSharedPointeraddTransition(sFinalizePersonalization, &AbstractState::fireContinue, sInsertCard); sFinalizePersonalization->addTransition(sFinalizePersonalization, &AbstractState::fireAbort, sClearPacePasswordsNewPin); + sFinalizePersonalization->addTransition(sFinalizePersonalization, &StateFinalizePersonalization::firePropagateAbort, sClearPacePasswordsNewPin); sClearPacePasswordsNewPin->addTransition(sClearPacePasswordsNewPin, &AbstractState::fireContinue, sFinal); sClearPacePasswordsNewPin->addTransition(sClearPacePasswordsNewPin, &AbstractState::fireAbort, sFinal); @@ -146,6 +148,7 @@ PersonalizationController::PersonalizationController(QSharedPointeraddTransition(sPace, &CompositeStatePace::fireContinue, sChangeSmartPin); sPace->addTransition(sPace, &CompositeStatePace::fireAbort, sClearPacePasswordsAll); + sPace->addTransition(sPace, &CompositeStatePace::firePropagateAbort, sClearPacePasswordsAll); sChangeSmartPin->addTransition(sChangeSmartPin, &AbstractState::fireContinue, sDestroyPace); sChangeSmartPin->addTransition(sChangeSmartPin, &AbstractState::fireAbort, sDestroyPace); diff --git a/src/workflows/personalization/controller/PersonalizationController.h b/src/workflows/personalization/controller/PersonalizationController.h index 7b72f3af0..e52bc0aeb 100644 --- a/src/workflows/personalization/controller/PersonalizationController.h +++ b/src/workflows/personalization/controller/PersonalizationController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the initialising a smartie. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateChangeSmartPin.cpp b/src/workflows/personalization/states/StateChangeSmartPin.cpp index 316370604..3eb3b94a3 100644 --- a/src/workflows/personalization/states/StateChangeSmartPin.cpp +++ b/src/workflows/personalization/states/StateChangeSmartPin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateChangeSmartPin.h" @@ -59,6 +59,8 @@ void StateChangeSmartPin::onSetEidPinDone(QSharedPointer pComma default: updateStatus(CardReturnCodeUtil::toGlobalStatus(returnCode)); - Q_EMIT fireAbort(); + Q_EMIT fireAbort({FailureCode::Reason::Change_Smart_Pin_Failed, + {FailureCode::Info::Card_Return_Code, Enum::getName(returnCode)} + }); } } diff --git a/src/workflows/personalization/states/StateChangeSmartPin.h b/src/workflows/personalization/states/StateChangeSmartPin.h index 79bfabbf0..d3b078dec 100644 --- a/src/workflows/personalization/states/StateChangeSmartPin.h +++ b/src/workflows/personalization/states/StateChangeSmartPin.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the state changing the initial Smart-eID PIN. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateCheckApplet.cpp b/src/workflows/personalization/states/StateCheckApplet.cpp index a13da9539..9fb2a04f9 100644 --- a/src/workflows/personalization/states/StateCheckApplet.cpp +++ b/src/workflows/personalization/states/StateCheckApplet.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateCheckApplet.h" @@ -32,12 +32,12 @@ void StateCheckApplet::onCommandDone(const QVariant& pResult) { case EidStatus::INTERNAL_ERROR: updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Applet_Preparation_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Check_Applet_Error); return; case EidStatus::UNAVAILABLE: updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Unavailable); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Check_Applet_Unavailable); return; case EidStatus::NO_PERSONALIZATION: diff --git a/src/workflows/personalization/states/StateCheckApplet.h b/src/workflows/personalization/states/StateCheckApplet.h index 3b8a9f743..0f99bb986 100644 --- a/src/workflows/personalization/states/StateCheckApplet.h +++ b/src/workflows/personalization/states/StateCheckApplet.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper state that installs the Smart-eID applet - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateCheckStatus.cpp b/src/workflows/personalization/states/StateCheckStatus.cpp index da1f31cae..cda42d0e8 100644 --- a/src/workflows/personalization/states/StateCheckStatus.cpp +++ b/src/workflows/personalization/states/StateCheckStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateCheckStatus.h" @@ -27,5 +27,5 @@ void StateCheckStatus::run() updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Unavailable); qDebug() << "Smart-eID not available"; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Check_Status_Unavailable); } diff --git a/src/workflows/personalization/states/StateCheckStatus.h b/src/workflows/personalization/states/StateCheckStatus.h index a1edcedf3..ac35fd7cc 100644 --- a/src/workflows/personalization/states/StateCheckStatus.h +++ b/src/workflows/personalization/states/StateCheckStatus.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! - * \brief State that checks if the Smart-eID functionality is given - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + * \brief State that checks if the Smart-eID function is given */ #pragma once diff --git a/src/workflows/personalization/states/StateFinalizePersonalization.cpp b/src/workflows/personalization/states/StateFinalizePersonalization.cpp index de12c7cc9..e6daf9ee7 100644 --- a/src/workflows/personalization/states/StateFinalizePersonalization.cpp +++ b/src/workflows/personalization/states/StateFinalizePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateFinalizePersonalization.h" @@ -48,7 +48,8 @@ void StateFinalizePersonalization::onCommandDone(const QVariant& pResult) if (context->getStatus().isError()) { - Q_EMIT fireAbort(); + Q_ASSERT(context->getFailureCode().has_value()); + Q_EMIT firePropagateAbort(); return; } @@ -57,7 +58,7 @@ void StateFinalizePersonalization::onCommandDone(const QVariant& pResult) { qCWarning(card_smart) << "Finalization of personalization failed"; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Finalize_Personalization_Failed); return; } diff --git a/src/workflows/personalization/states/StateFinalizePersonalization.h b/src/workflows/personalization/states/StateFinalizePersonalization.h index dd2b1a664..474f5f85d 100644 --- a/src/workflows/personalization/states/StateFinalizePersonalization.h +++ b/src/workflows/personalization/states/StateFinalizePersonalization.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State that finalizes the personalization of the Smart-eID applet - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -31,6 +33,9 @@ class StateFinalizePersonalization private Q_SLOTS: void onCommandDone(const QVariant& pResult); + + Q_SIGNALS: + void firePropagateAbort(); }; } // namespace governikus diff --git a/src/workflows/personalization/states/StateGetChallenge.cpp b/src/workflows/personalization/states/StateGetChallenge.cpp index 07973e6f0..0cd10813e 100644 --- a/src/workflows/personalization/states/StateGetChallenge.cpp +++ b/src/workflows/personalization/states/StateGetChallenge.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateGetChallenge.h" @@ -101,5 +101,5 @@ void StateGetChallenge::handleNetworkReply(const QByteArray& pContent) qDebug() << "No valid challenge to prepare personalization"; updateStatus(GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_Challenge_Invalid); } diff --git a/src/workflows/personalization/states/StateGetChallenge.h b/src/workflows/personalization/states/StateGetChallenge.h index d9453d2ee..8f2e56b1f 100644 --- a/src/workflows/personalization/states/StateGetChallenge.h +++ b/src/workflows/personalization/states/StateGetChallenge.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief get the xml data from the given url - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateGetSessionId.cpp b/src/workflows/personalization/states/StateGetSessionId.cpp index ee27a0b49..296911479 100644 --- a/src/workflows/personalization/states/StateGetSessionId.cpp +++ b/src/workflows/personalization/states/StateGetSessionId.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateGetSessionId.h" @@ -72,5 +72,5 @@ void StateGetSessionId::handleNetworkReply(const QByteArray& pContent) qDebug() << "No valid sessionID to prepare personalization"; updateStatus(GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_Session_Id_Invalid); } diff --git a/src/workflows/personalization/states/StateGetSessionId.h b/src/workflows/personalization/states/StateGetSessionId.h index 388f35949..4aff35598 100644 --- a/src/workflows/personalization/states/StateGetSessionId.h +++ b/src/workflows/personalization/states/StateGetSessionId.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief get the xml data from the given url - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateInitializePersonalization.cpp b/src/workflows/personalization/states/StateInitializePersonalization.cpp index d2c3c33c7..dbf002c04 100644 --- a/src/workflows/personalization/states/StateInitializePersonalization.cpp +++ b/src/workflows/personalization/states/StateInitializePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateInitializePersonalization.h" @@ -61,5 +61,5 @@ void StateInitializePersonalization::onCommandDone(const QVariant& pResult) qCWarning(card_smart) << "Initialization of personalization failed"; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_PrePersonalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Initialize_Personalization_Failed); } diff --git a/src/workflows/personalization/states/StateInitializePersonalization.h b/src/workflows/personalization/states/StateInitializePersonalization.h index f1359428b..a30fd8d5d 100644 --- a/src/workflows/personalization/states/StateInitializePersonalization.h +++ b/src/workflows/personalization/states/StateInitializePersonalization.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State that initializes the personalization of the Smart-eID applet - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateInsertCard.cpp b/src/workflows/personalization/states/StateInsertCard.cpp index 1210e1d1c..7054ab2ea 100644 --- a/src/workflows/personalization/states/StateInsertCard.cpp +++ b/src/workflows/personalization/states/StateInsertCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateInsertCard.h" @@ -29,14 +29,14 @@ void StateInsertCard::run() { qCWarning(statemachine) << "No Smart reader present"; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Insert_Card_No_SmartReader); return; } if (readerInfos.size() > 1) { qCWarning(statemachine) << "Multiple Smart readers present"; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Insert_Card_Multiple_SmartReader); return; } @@ -63,12 +63,12 @@ void StateInsertCard::onCardInfoChanged(const ReaderInfo& pInfo) case MobileEidType::UNKNOWN: qCWarning(statemachine) << "Smart card has an unexpected eID-Type:" << type; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Insert_Card_Unknown_Eid_Type); return; case MobileEidType::HW_KEYSTORE: qCDebug(statemachine) << "Skipping PIN change because of eID-Type:" << type; - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Insert_Card_HW_Keystore); return; } @@ -76,7 +76,7 @@ void StateInsertCard::onCardInfoChanged(const ReaderInfo& pInfo) { qCWarning(statemachine) << "Smart reader is present but not insertable"; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Insert_Card_Invalid_SmartReader); return; } @@ -94,5 +94,5 @@ void StateInsertCard::onStatusChanged(const ReaderManagerPlugInInfo& pInfo) qCWarning(statemachine) << "Scan was started but no smart card was found"; updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Insert_Card_Missing_Card); } diff --git a/src/workflows/personalization/states/StateInsertCard.h b/src/workflows/personalization/states/StateInsertCard.h index 85fd77bbe..3d2960bd6 100644 --- a/src/workflows/personalization/states/StateInsertCard.h +++ b/src/workflows/personalization/states/StateInsertCard.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.cpp b/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.cpp index 5f68fe555..beefbb09b 100644 --- a/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.cpp +++ b/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateLoadSmartTcTokenUrl.h" diff --git a/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.h b/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.h index 4a8b6264e..69678e829 100644 --- a/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.h +++ b/src/workflows/personalization/states/StateLoadSmartTcTokenUrl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State that retrieves the Smart-eID TcTokenURL from the Secure Storage - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StatePrepareApplet.cpp b/src/workflows/personalization/states/StatePrepareApplet.cpp index 714dac591..ff80d4ff0 100644 --- a/src/workflows/personalization/states/StatePrepareApplet.cpp +++ b/src/workflows/personalization/states/StatePrepareApplet.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePrepareApplet.h" @@ -36,14 +36,14 @@ void StatePrepareApplet::run() { case EidStatus::INTERNAL_ERROR: qCDebug(card_smart) << "getSmartEidStatus() failed"; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_Status_Call_Failed); case EidStatus::NO_PROVISIONING: { if (!context->allowSmartEidInstallation()) { qCDebug(card_smart) << "Loop detected: A previous Smart-eID installation seems to be broken."; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_Installation_Loop); } const int initialProgress = context->getProgressValue(); @@ -59,22 +59,22 @@ void StatePrepareApplet::run() { context->smartEidInstallationSuccessfull(); qCDebug(card_smart) << "Successfully installed Smart-eID"; - return true; + return QVariant(); } qCDebug(card_smart) << "Installation of Smart-eID failed"; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_Installation_Failed); } case EidStatus::UNAVAILABLE: qCDebug(card_smart) << "Smart-eID is not available on this device"; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_Unavailable); case EidStatus::PERSONALIZED: if (!smartManager->deletePersonalization()) { qCDebug(card_smart) << "Deletion of Smart-eID personalization failed"; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_Delete_Personalization_Failed); } qCDebug(card_smart) << "Successfully deleted the Smart-eID personalization"; @@ -85,7 +85,7 @@ void StatePrepareApplet::run() { case EidUpdateInfo::INTERNAL_ERROR: qCDebug(card_smart) << "updateInfo() failed"; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_UpdateInfo_Call_Failed); case EidUpdateInfo::UPDATE_AVAILABLE: qCDebug(card_smart) << "Update available, delete the Smart-eID first"; @@ -93,7 +93,7 @@ void StatePrepareApplet::run() default: qCDebug(card_smart) << "No update available"; - return true; + return QVariant(); } Q_FALLTHROUGH(); @@ -112,11 +112,11 @@ void StatePrepareApplet::run() if (!smartManager->deleteSmart(progressHandler)) { qCDebug(card_smart) << "Deletion of Smart-eID failed"; - return false; + return QVariant::fromValue(FailureCode::Reason::Prepare_Applet_Delete_Smart_Failed); } qCDebug(card_smart) << "Successfully deleted Smart-eID"; - return true; + return QVariant(); } } @@ -142,22 +142,22 @@ void StatePrepareApplet::setProgress(int pProgress, const QString& pMessage, int } -void StatePrepareApplet::onCommandDone(const QVariant& pResult) +void StatePrepareApplet::onCommandDone(const QVariant& pFailure) { if (getContext()->isWorkflowCancelledInState()) { - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Prepare_Applet_User_Cancelled); return; } - if (pResult.toBool()) + if (pFailure.isNull()) { Q_EMIT fireContinue(); return; } updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Applet_Preparation_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(pFailure.value()); } diff --git a/src/workflows/personalization/states/StatePrepareApplet.h b/src/workflows/personalization/states/StatePrepareApplet.h index 3f15e0a35..0ccf46b9a 100644 --- a/src/workflows/personalization/states/StatePrepareApplet.h +++ b/src/workflows/personalization/states/StatePrepareApplet.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper state that installs the Smart-eID applet - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StatePreparePersonalization.cpp b/src/workflows/personalization/states/StatePreparePersonalization.cpp index be62642b1..548d2f0bc 100644 --- a/src/workflows/personalization/states/StatePreparePersonalization.cpp +++ b/src/workflows/personalization/states/StatePreparePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StatePreparePersonalization.h" diff --git a/src/workflows/personalization/states/StatePreparePersonalization.h b/src/workflows/personalization/states/StatePreparePersonalization.h index 84a43a1fe..d42d12e50 100644 --- a/src/workflows/personalization/states/StatePreparePersonalization.h +++ b/src/workflows/personalization/states/StatePreparePersonalization.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State that initializes the pre personalization of the Smart-eID applet - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateSendStartPaosPersonalization.cpp b/src/workflows/personalization/states/StateSendStartPaosPersonalization.cpp index 1e7b5d91e..1d48f9e80 100644 --- a/src/workflows/personalization/states/StateSendStartPaosPersonalization.cpp +++ b/src/workflows/personalization/states/StateSendStartPaosPersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/workflows/personalization/states/StateSendStartPaosPersonalization.h b/src/workflows/personalization/states/StateSendStartPaosPersonalization.h index e4d1c61e5..46204a302 100644 --- a/src/workflows/personalization/states/StateSendStartPaosPersonalization.h +++ b/src/workflows/personalization/states/StateSendStartPaosPersonalization.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.cpp b/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.cpp index 0f860c5fc..386ee6501 100644 --- a/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.cpp +++ b/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.h b/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.h index 2e1974225..df2f5abc6 100644 --- a/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.h +++ b/src/workflows/personalization/states/StateSendTransmitResponsePersonalization.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateStartPaosPersonalization.cpp b/src/workflows/personalization/states/StateStartPaosPersonalization.cpp index 0cca26cfc..3a3131acb 100644 --- a/src/workflows/personalization/states/StateStartPaosPersonalization.cpp +++ b/src/workflows/personalization/states/StateStartPaosPersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateStartPaosPersonalization.h" diff --git a/src/workflows/personalization/states/StateStartPaosPersonalization.h b/src/workflows/personalization/states/StateStartPaosPersonalization.h index 9b4b96e84..de2c23e98 100644 --- a/src/workflows/personalization/states/StateStartPaosPersonalization.h +++ b/src/workflows/personalization/states/StateStartPaosPersonalization.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateStartPaosResponsePersonalization.cpp b/src/workflows/personalization/states/StateStartPaosResponsePersonalization.cpp index 2ec9d014f..306c23273 100644 --- a/src/workflows/personalization/states/StateStartPaosResponsePersonalization.cpp +++ b/src/workflows/personalization/states/StateStartPaosResponsePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateStartPaosResponsePersonalization.h" @@ -23,7 +23,7 @@ void StateStartPaosResponsePersonalization::run() const QSharedPointer& startPaosResponse = getContext()->getStartPaosResponse(); if (!startPaosResponse) { - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Start_Paos_Response_Personalization_Empty); return; } @@ -47,5 +47,5 @@ void StateStartPaosResponsePersonalization::run() qDebug() << "Processing server result:" << result.getMajorString() << result.getMinorString() << result.getMessage(); updateStartPaosResult(result); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Start_Paos_Response_Personalization_Invalid); } diff --git a/src/workflows/personalization/states/StateStartPaosResponsePersonalization.h b/src/workflows/personalization/states/StateStartPaosResponsePersonalization.h index e314f1d53..c463e00e3 100644 --- a/src/workflows/personalization/states/StateStartPaosResponsePersonalization.h +++ b/src/workflows/personalization/states/StateStartPaosResponsePersonalization.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State to process StartPaosResponse from Server. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/personalization/states/StateTransmitPersonalization.cpp b/src/workflows/personalization/states/StateTransmitPersonalization.cpp index a6b1331dc..b8ce08905 100644 --- a/src/workflows/personalization/states/StateTransmitPersonalization.cpp +++ b/src/workflows/personalization/states/StateTransmitPersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "StateTransmitPersonalization.h" @@ -44,7 +44,7 @@ void StateTransmitPersonalization::onCommandDone(const QVariant& pResult) if (outputApduAsHex.size() != transmit->getInputApduInfos().size()) { updateStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Transmit_Personalization_Size_Mismatch); return; } diff --git a/src/workflows/personalization/states/StateTransmitPersonalization.h b/src/workflows/personalization/states/StateTransmitPersonalization.h index 5431a192c..1cc6f51f0 100644 --- a/src/workflows/personalization/states/StateTransmitPersonalization.h +++ b/src/workflows/personalization/states/StateTransmitPersonalization.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief State that performs the personalization of the Smart-eID applet - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/selfauth/SelfAuthenticationData.cpp b/src/workflows/selfauth/SelfAuthenticationData.cpp index 428050f21..0d2b80abf 100644 --- a/src/workflows/selfauth/SelfAuthenticationData.cpp +++ b/src/workflows/selfauth/SelfAuthenticationData.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SelfAuthenticationData.h" diff --git a/src/workflows/selfauth/SelfAuthenticationData.h b/src/workflows/selfauth/SelfAuthenticationData.h index 118b20bfc..3b32640c9 100644 --- a/src/workflows/selfauth/SelfAuthenticationData.h +++ b/src/workflows/selfauth/SelfAuthenticationData.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Parses self authentication data from JSON data and provides its content. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/selfauth/context/SelfAuthContext.cpp b/src/workflows/selfauth/context/SelfAuthContext.cpp index 781cfe082..0d3e7ee22 100644 --- a/src/workflows/selfauth/context/SelfAuthContext.cpp +++ b/src/workflows/selfauth/context/SelfAuthContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "SelfAuthContext.h" diff --git a/src/workflows/selfauth/context/SelfAuthContext.h b/src/workflows/selfauth/context/SelfAuthContext.h index 4dc6ff7e1..2af16f3e5 100644 --- a/src/workflows/selfauth/context/SelfAuthContext.h +++ b/src/workflows/selfauth/context/SelfAuthContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Self authentication context. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/selfauth/controller/SelfAuthController.cpp b/src/workflows/selfauth/controller/SelfAuthController.cpp index ff589b73a..6daf214f2 100644 --- a/src/workflows/selfauth/controller/SelfAuthController.cpp +++ b/src/workflows/selfauth/controller/SelfAuthController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "controller/SelfAuthController.h" @@ -46,7 +46,7 @@ SelfAuthController::SelfAuthController(QSharedPointer pContext) sTrustedChannel->addTransition(sTrustedChannel, &CompositeStateTrustedChannel::fireAbort, sCheckError); sCheckError->addTransition(sCheckError, &AbstractState::fireContinue, sCheckRefreshAddress); - sCheckError->addTransition(sCheckError, &AbstractState::fireAbort, sFinal); + sCheckError->addTransition(sCheckError, &StateCheckError::firePropagateAbort, sFinal); sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireContinue, sActivateStoreFeedbackDialog); sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireAbort, sFinal); diff --git a/src/workflows/selfauth/controller/SelfAuthController.h b/src/workflows/selfauth/controller/SelfAuthController.h index 731dd7b0e..797543fd3 100644 --- a/src/workflows/selfauth/controller/SelfAuthController.h +++ b/src/workflows/selfauth/controller/SelfAuthController.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Controller for the self authentication process. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/selfauth/states/StateGetSelfAuthenticationData.cpp b/src/workflows/selfauth/states/StateGetSelfAuthenticationData.cpp index 5ed253d25..fddd0e6f6 100644 --- a/src/workflows/selfauth/states/StateGetSelfAuthenticationData.cpp +++ b/src/workflows/selfauth/states/StateGetSelfAuthenticationData.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateGetSelfAuthenticationData.h" @@ -56,5 +56,5 @@ void StateGetSelfAuthenticationData::handleNetworkReply(const QByteArray& pConte qDebug() << "No valid data of self-authentication."; updateStatus(GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); - Q_EMIT fireAbort(); + Q_EMIT fireAbort(FailureCode::Reason::Get_SelfAuthData_Invalid_Or_Empty); } diff --git a/src/workflows/selfauth/states/StateGetSelfAuthenticationData.h b/src/workflows/selfauth/states/StateGetSelfAuthenticationData.h index eef527c16..62e4fae7b 100644 --- a/src/workflows/selfauth/states/StateGetSelfAuthenticationData.h +++ b/src/workflows/selfauth/states/StateGetSelfAuthenticationData.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief get the xml data from the given url - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/src/workflows/selfauth/states/StateLoadTcTokenUrl.cpp b/src/workflows/selfauth/states/StateLoadTcTokenUrl.cpp index 7fe79b6db..5c5303330 100644 --- a/src/workflows/selfauth/states/StateLoadTcTokenUrl.cpp +++ b/src/workflows/selfauth/states/StateLoadTcTokenUrl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "StateLoadTcTokenUrl.h" diff --git a/src/workflows/selfauth/states/StateLoadTcTokenUrl.h b/src/workflows/selfauth/states/StateLoadTcTokenUrl.h index 253cf8687..433158a8c 100644 --- a/src/workflows/selfauth/states/StateLoadTcTokenUrl.h +++ b/src/workflows/selfauth/states/StateLoadTcTokenUrl.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Loads the tcTokenUrl for triggering the self authentication from secure storage - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockActivationContext.cpp b/test/helper/common/MockActivationContext.cpp index a86d67a4f..68dc87b84 100644 --- a/test/helper/common/MockActivationContext.cpp +++ b/test/helper/common/MockActivationContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MockActivationContext.h" diff --git a/test/helper/common/MockActivationContext.h b/test/helper/common/MockActivationContext.h index 22c876155..34facae68 100644 --- a/test/helper/common/MockActivationContext.h +++ b/test/helper/common/MockActivationContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mocked ActivationContext for unit tests. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockCard.cpp b/test/helper/common/MockCard.cpp index 9c568daee..3c4921243 100644 --- a/test/helper/common/MockCard.cpp +++ b/test/helper/common/MockCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MockCard.h" diff --git a/test/helper/common/MockCard.h b/test/helper/common/MockCard.h index f848b170e..8b84d36c7 100644 --- a/test/helper/common/MockCard.h +++ b/test/helper/common/MockCard.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Card mock for tests - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockCardConnection.cpp b/test/helper/common/MockCardConnection.cpp index d424f0f41..2a2cbaefb 100644 --- a/test/helper/common/MockCardConnection.cpp +++ b/test/helper/common/MockCardConnection.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "MockCardConnection.h" diff --git a/test/helper/common/MockCardConnection.h b/test/helper/common/MockCardConnection.h index 2206bb836..b0daf54c4 100644 --- a/test/helper/common/MockCardConnection.h +++ b/test/helper/common/MockCardConnection.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockCardConnectionWorker.cpp b/test/helper/common/MockCardConnectionWorker.cpp index e36bc517e..afb9ffb89 100644 --- a/test/helper/common/MockCardConnectionWorker.cpp +++ b/test/helper/common/MockCardConnectionWorker.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "MockCardConnectionWorker.h" diff --git a/test/helper/common/MockCardConnectionWorker.h b/test/helper/common/MockCardConnectionWorker.h index 8e3088826..7a6bf93c9 100644 --- a/test/helper/common/MockCardConnectionWorker.h +++ b/test/helper/common/MockCardConnectionWorker.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief CardConnectionWorker mock for tests - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockDownloader.cpp b/test/helper/common/MockDownloader.cpp index 567e9c5ed..c1daef1cf 100644 --- a/test/helper/common/MockDownloader.cpp +++ b/test/helper/common/MockDownloader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "MockDownloader.h" diff --git a/test/helper/common/MockDownloader.h b/test/helper/common/MockDownloader.h index a290f054f..2d7b56dda 100644 --- a/test/helper/common/MockDownloader.h +++ b/test/helper/common/MockDownloader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief MockDownloader of class Downloader, part of \ref Updater and \ref UpdatableFile tests - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/test/helper/common/MockHttpServer.cpp b/test/helper/common/MockHttpServer.cpp index c35fc1cfb..a604c6241 100644 --- a/test/helper/common/MockHttpServer.cpp +++ b/test/helper/common/MockHttpServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MockHttpServer.h" diff --git a/test/helper/common/MockHttpServer.h b/test/helper/common/MockHttpServer.h index d4d10c6cd..561aaa1d8 100644 --- a/test/helper/common/MockHttpServer.h +++ b/test/helper/common/MockHttpServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provide a HTTP-Server for tests - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockNetworkManager.cpp b/test/helper/common/MockNetworkManager.cpp index 9ad47688f..ae637540f 100644 --- a/test/helper/common/MockNetworkManager.cpp +++ b/test/helper/common/MockNetworkManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "MockNetworkManager.h" diff --git a/test/helper/common/MockNetworkManager.h b/test/helper/common/MockNetworkManager.h index ddbe6dd38..701590d03 100644 --- a/test/helper/common/MockNetworkManager.h +++ b/test/helper/common/MockNetworkManager.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mock \ref NetworkManager for tests - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockNetworkReply.cpp b/test/helper/common/MockNetworkReply.cpp index 0e9dc0b11..78973e6d0 100644 --- a/test/helper/common/MockNetworkReply.cpp +++ b/test/helper/common/MockNetworkReply.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "MockNetworkReply.h" diff --git a/test/helper/common/MockNetworkReply.h b/test/helper/common/MockNetworkReply.h index 1de1d806b..61bd8ab00 100644 --- a/test/helper/common/MockNetworkReply.h +++ b/test/helper/common/MockNetworkReply.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mock a QNetworkReply for tests. - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockReader.cpp b/test/helper/common/MockReader.cpp index 31e43382f..7ed7cef2f 100644 --- a/test/helper/common/MockReader.cpp +++ b/test/helper/common/MockReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MockReader.h" diff --git a/test/helper/common/MockReader.h b/test/helper/common/MockReader.h index 6143adefb..5e7d6d32e 100644 --- a/test/helper/common/MockReader.h +++ b/test/helper/common/MockReader.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Reader mock for tests - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockReaderConfiguration.cpp b/test/helper/common/MockReaderConfiguration.cpp index 18520287a..7bf0d278f 100644 --- a/test/helper/common/MockReaderConfiguration.cpp +++ b/test/helper/common/MockReaderConfiguration.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "MockReaderConfiguration.h" diff --git a/test/helper/common/MockReaderConfiguration.h b/test/helper/common/MockReaderConfiguration.h index a87edb2ef..0f2e4340e 100644 --- a/test/helper/common/MockReaderConfiguration.h +++ b/test/helper/common/MockReaderConfiguration.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief ReaderConfigurationFile mock for tests - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockReaderDetector.cpp b/test/helper/common/MockReaderDetector.cpp index 3a55fdcee..7e6783353 100644 --- a/test/helper/common/MockReaderDetector.cpp +++ b/test/helper/common/MockReaderDetector.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "MockReaderDetector.h" diff --git a/test/helper/common/MockReaderDetector.h b/test/helper/common/MockReaderDetector.h index 287ebd62d..c9f0b63ac 100644 --- a/test/helper/common/MockReaderDetector.h +++ b/test/helper/common/MockReaderDetector.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief ReaderDetector mock for tests - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockReaderManagerPlugIn.cpp b/test/helper/common/MockReaderManagerPlugIn.cpp index f91ba8640..a3424e7ca 100644 --- a/test/helper/common/MockReaderManagerPlugIn.cpp +++ b/test/helper/common/MockReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/test/helper/common/MockReaderManagerPlugIn.h b/test/helper/common/MockReaderManagerPlugIn.h index dd4701617..f08897d11 100644 --- a/test/helper/common/MockReaderManagerPlugIn.h +++ b/test/helper/common/MockReaderManagerPlugIn.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mock implementation of ReaderManagerPlugIn - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockReleaseInformation.cpp b/test/helper/common/MockReleaseInformation.cpp index a3eeda3d4..f6da15938 100644 --- a/test/helper/common/MockReleaseInformation.cpp +++ b/test/helper/common/MockReleaseInformation.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "MockReleaseInformation.h" diff --git a/test/helper/common/MockReleaseInformation.h b/test/helper/common/MockReleaseInformation.h index 98e598b1e..fd15f7820 100644 --- a/test/helper/common/MockReleaseInformation.h +++ b/test/helper/common/MockReleaseInformation.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief MockReleaseInformation for Unittest - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/test/helper/common/MockSocket.cpp b/test/helper/common/MockSocket.cpp index 66eda29a7..f7318b6ad 100644 --- a/test/helper/common/MockSocket.cpp +++ b/test/helper/common/MockSocket.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MockSocket.h" diff --git a/test/helper/common/MockSocket.h b/test/helper/common/MockSocket.h index f249bca90..6a2c6ef32 100644 --- a/test/helper/common/MockSocket.h +++ b/test/helper/common/MockSocket.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mock a QAbstractSocket for tests. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockWorkflowAuthenticateUi.h b/test/helper/common/MockWorkflowAuthenticateUi.h index 3abfc393b..4e553a02f 100644 --- a/test/helper/common/MockWorkflowAuthenticateUi.h +++ b/test/helper/common/MockWorkflowAuthenticateUi.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mock implementation of WorkflowAuthenticateUi. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/MockWorkflowChangePinUi.h b/test/helper/common/MockWorkflowChangePinUi.h index 4bf863f42..8211ccf01 100644 --- a/test/helper/common/MockWorkflowChangePinUi.h +++ b/test/helper/common/MockWorkflowChangePinUi.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Mock implementation of WorkflowAuthenticateUi. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/QtHooks.cpp b/test/helper/common/QtHooks.cpp index 4b0264bd5..be62cd32f 100644 --- a/test/helper/common/QtHooks.cpp +++ b/test/helper/common/QtHooks.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "QtHooks.h" diff --git a/test/helper/common/QtHooks.h b/test/helper/common/QtHooks.h index 713b4cfa8..caa674f29 100644 --- a/test/helper/common/QtHooks.h +++ b/test/helper/common/QtHooks.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/TestAuthContext.cpp b/test/helper/common/TestAuthContext.cpp index fa24d6846..81fab012c 100644 --- a/test/helper/common/TestAuthContext.cpp +++ b/test/helper/common/TestAuthContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "TestAuthContext.h" diff --git a/test/helper/common/TestAuthContext.h b/test/helper/common/TestAuthContext.h index b327d883b..56b84552e 100644 --- a/test/helper/common/TestAuthContext.h +++ b/test/helper/common/TestAuthContext.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper to use AuthContext in an easy way. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/TestFileHelper.cpp b/test/helper/common/TestFileHelper.cpp index c2e79eddb..fe75f17d9 100644 --- a/test/helper/common/TestFileHelper.cpp +++ b/test/helper/common/TestFileHelper.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" @@ -9,6 +9,10 @@ #include +#if __has_include() + #include +#endif + using namespace governikus; static const uchar qm_magic[16] = { @@ -86,7 +90,21 @@ int TestFileHelper::getUnprivilegedPortStart() { result = converted; } + else + { + qCritical() << "Cannot convert port data"; + } #endif return result; } + + +bool TestFileHelper::systemAllowsPort(int pPort) +{ + return TestFileHelper::getUnprivilegedPortStart() <= pPort +#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS) || defined(Q_OS_BSD4) + || getuid() == 0 +#endif + ; +} diff --git a/test/helper/common/TestFileHelper.h b/test/helper/common/TestFileHelper.h index 8160dca2a..29625eae1 100644 --- a/test/helper/common/TestFileHelper.h +++ b/test/helper/common/TestFileHelper.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper for some file functions. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #pragma once @@ -20,6 +22,7 @@ class TestFileHelper static void createTranslations(const QString& pTranslationDir); static bool containsLog(const QSignalSpy& pSpy, const QLatin1String pStr); static int getUnprivilegedPortStart(); + static bool systemAllowsPort(int pPort); }; } // namespace governikus diff --git a/test/helper/common/TestWorkflowContext.cpp b/test/helper/common/TestWorkflowContext.cpp index f1decb4e6..494f89ef0 100644 --- a/test/helper/common/TestWorkflowContext.cpp +++ b/test/helper/common/TestWorkflowContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "TestWorkflowContext.h" diff --git a/test/helper/common/TestWorkflowContext.h b/test/helper/common/TestWorkflowContext.h index bfb133d55..3413bf29c 100644 --- a/test/helper/common/TestWorkflowContext.h +++ b/test/helper/common/TestWorkflowContext.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/common/TestWorkflowController.cpp b/test/helper/common/TestWorkflowController.cpp index b92427fbb..bd93b7622 100644 --- a/test/helper/common/TestWorkflowController.cpp +++ b/test/helper/common/TestWorkflowController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "TestWorkflowController.h" diff --git a/test/helper/common/TestWorkflowController.h b/test/helper/common/TestWorkflowController.h index 5c389a855..4fd2a2958 100644 --- a/test/helper/common/TestWorkflowController.h +++ b/test/helper/common/TestWorkflowController.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/ifd/MockDataChannel.cpp b/test/helper/ifd/MockDataChannel.cpp index 20f945a77..1668e8848 100644 --- a/test/helper/ifd/MockDataChannel.cpp +++ b/test/helper/ifd/MockDataChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "MockDataChannel.h" diff --git a/test/helper/ifd/MockDataChannel.h b/test/helper/ifd/MockDataChannel.h index cc48439a1..24e4e4b46 100644 --- a/test/helper/ifd/MockDataChannel.h +++ b/test/helper/ifd/MockDataChannel.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Data channel mock for tests. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/ifd/MockIfdDispatcher.cpp b/test/helper/ifd/MockIfdDispatcher.cpp index 3f837492a..480fa1ff4 100644 --- a/test/helper/ifd/MockIfdDispatcher.cpp +++ b/test/helper/ifd/MockIfdDispatcher.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "MockIfdDispatcher.h" diff --git a/test/helper/ifd/MockIfdDispatcher.h b/test/helper/ifd/MockIfdDispatcher.h index aad36745d..47580fea2 100644 --- a/test/helper/ifd/MockIfdDispatcher.h +++ b/test/helper/ifd/MockIfdDispatcher.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Ifd dispatcher mock for tests. - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/ifd/MockIfdServer.cpp b/test/helper/ifd/MockIfdServer.cpp index f57fe7c48..3addf4efd 100644 --- a/test/helper/ifd/MockIfdServer.cpp +++ b/test/helper/ifd/MockIfdServer.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "MockIfdServer.h" diff --git a/test/helper/ifd/MockIfdServer.h b/test/helper/ifd/MockIfdServer.h index cfd0dbce3..55ca7f636 100644 --- a/test/helper/ifd/MockIfdServer.h +++ b/test/helper/ifd/MockIfdServer.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Provide a IfdServer for tests - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/ui/json/MsgHandlerEnterPassword.cpp b/test/helper/ui/json/MsgHandlerEnterPassword.cpp index 4552eb548..90147207a 100644 --- a/test/helper/ui/json/MsgHandlerEnterPassword.cpp +++ b/test/helper/ui/json/MsgHandlerEnterPassword.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "MsgHandlerEnterPassword.h" diff --git a/test/helper/ui/json/MsgHandlerEnterPassword.h b/test/helper/ui/json/MsgHandlerEnterPassword.h index f00cc12a3..c6368d1d6 100644 --- a/test/helper/ui/json/MsgHandlerEnterPassword.h +++ b/test/helper/ui/json/MsgHandlerEnterPassword.h @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Helper static methods for \ref test_MsgHandlerEnterPin, \ref test_MsgHandlerEnterCan and \ref test_MsgHandlerEnterPuk - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/helper/ui/websocket/WebSocketHelper.cpp b/test/helper/ui/websocket/WebSocketHelper.cpp index 39bfde114..cba160d2e 100644 --- a/test/helper/ui/websocket/WebSocketHelper.cpp +++ b/test/helper/ui/websocket/WebSocketHelper.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "WebSocketHelper.h" diff --git a/test/helper/ui/websocket/WebSocketHelper.h b/test/helper/ui/websocket/WebSocketHelper.h index 6044a8b96..245e3610b 100644 --- a/test/helper/ui/websocket/WebSocketHelper.h +++ b/test/helper/ui/websocket/WebSocketHelper.h @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #pragma once diff --git a/test/integrated/test_Integrated.cpp b/test/integrated/test_Integrated.cpp index 46f74433e..bb75c7f9b 100644 --- a/test/integrated/test_Integrated.cpp +++ b/test/integrated/test_Integrated.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Integration tests for integrated SDK. - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "AusweisApp2_p.h" diff --git a/test/integration/init/test_CommandLineParser.cpp b/test/integration/init/test_CommandLineParser.cpp index d5c171f28..e630dc5f4 100644 --- a/test/integration/init/test_CommandLineParser.cpp +++ b/test/integration/init/test_CommandLineParser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CommandLineParser - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/integration/ui/qml/test_UIPlugInQml.cpp b/test/integration/ui/qml/test_UIPlugInQml.cpp index 3606ab04a..12e550a20 100644 --- a/test/integration/ui/qml/test_UIPlugInQml.cpp +++ b/test/integration/ui/qml/test_UIPlugInQml.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/test/integration/ui/websocket/test_UIPlugInWebSocket.cpp b/test/integration/ui/websocket/test_UIPlugInWebSocket.cpp index f4e0c0f1c..852958da6 100644 --- a/test/integration/ui/websocket/test_UIPlugInWebSocket.cpp +++ b/test/integration/ui/websocket/test_UIPlugInWebSocket.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UIPlugInWebSocket - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "PortFile.h" diff --git a/test/qml/AuthView/test_AuthView.qml b/test/qml/AuthView/test_AuthView.qml index 60fdcb50e..c067a1546 100644 --- a/test/qml/AuthView/test_AuthView.qml +++ b/test/qml/AuthView/test_AuthView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/ChangePinView/+desktop/test_ChangePinView.qml b/test/qml/ChangePinView/+desktop/test_ChangePinView.qml index 5a38e1263..232423d0f 100644 --- a/test/qml/ChangePinView/+desktop/test_ChangePinView.qml +++ b/test/qml/ChangePinView/+desktop/test_ChangePinView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/ChangePinView/+mobile/test_ChangePinView.qml b/test/qml/ChangePinView/+mobile/test_ChangePinView.qml index f1078e2ff..e1c82b5cd 100644 --- a/test/qml/ChangePinView/+mobile/test_ChangePinView.qml +++ b/test/qml/ChangePinView/+mobile/test_ChangePinView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/CheckIDCardView/+mobile/test_CheckIDCardView.qml b/test/qml/CheckIDCardView/+mobile/test_CheckIDCardView.qml index acee35828..374a5c494 100644 --- a/test/qml/CheckIDCardView/+mobile/test_CheckIDCardView.qml +++ b/test/qml/CheckIDCardView/+mobile/test_CheckIDCardView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/CheckResultView/+mobile/test_CheckResultSuggestionView.qml b/test/qml/CheckResultView/+mobile/test_CheckResultSuggestionView.qml index f5ad86d06..5c9409498 100644 --- a/test/qml/CheckResultView/+mobile/test_CheckResultSuggestionView.qml +++ b/test/qml/CheckResultView/+mobile/test_CheckResultSuggestionView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/CheckResultView/+mobile/test_CheckResultView.qml b/test/qml/CheckResultView/+mobile/test_CheckResultView.qml index fce3ed6db..5abf9b2f3 100644 --- a/test/qml/CheckResultView/+mobile/test_CheckResultView.qml +++ b/test/qml/CheckResultView/+mobile/test_CheckResultView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/EnterPasswordView/+desktop/test_EnterPasswordView.qml b/test/qml/EnterPasswordView/+desktop/test_EnterPasswordView.qml index c102ca813..d54c3161c 100644 --- a/test/qml/EnterPasswordView/+desktop/test_EnterPasswordView.qml +++ b/test/qml/EnterPasswordView/+desktop/test_EnterPasswordView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 import Governikus.Type.PasswordType 1.0 diff --git a/test/qml/EnterPasswordView/+desktop/test_PasswordInfoView.qml b/test/qml/EnterPasswordView/+desktop/test_PasswordInfoView.qml deleted file mode 100644 index 2907da3d8..000000000 --- a/test/qml/EnterPasswordView/+desktop/test_PasswordInfoView.qml +++ /dev/null @@ -1,32 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtTest 1.15 -import Governikus.Type.PasswordType 1.0 - -TestCase { - id: parent - function test_load_PasswordInfoView(data) { - var item = createTemporaryQmlObject(" - import Governikus.EnterPasswordView 1.0; - PasswordInfoView { - passwordType: %1 - } - ".arg(data.passwordType), parent); - item.destroy(); - } - function test_load_PasswordInfoView_data() { - return [{ - "passwordType": PasswordType.PIN - }, { - "passwordType": PasswordType.CAN - }, { - "passwordType": PasswordType.PUK - }, { - "passwordType": PasswordType.REMOTE_PIN - }]; - } - - visible: true - when: windowShown -} diff --git a/test/qml/EnterPasswordView/test_EnterPasswordView.qml b/test/qml/EnterPasswordView/test_EnterPasswordView.qml index 01565327a..adf3f1e31 100644 --- a/test/qml/EnterPasswordView/test_EnterPasswordView.qml +++ b/test/qml/EnterPasswordView/test_EnterPasswordView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/FeedbackView/+desktop/test_DetachedLogView.qml b/test/qml/FeedbackView/+desktop/test_DetachedLogView.qml index 371890f7e..6ee39deb2 100644 --- a/test/qml/FeedbackView/+desktop/test_DetachedLogView.qml +++ b/test/qml/FeedbackView/+desktop/test_DetachedLogView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/FeedbackView/+mobile/test_LogView.qml b/test/qml/FeedbackView/+mobile/test_LogView.qml index 41907666f..0dc8c403d 100644 --- a/test/qml/FeedbackView/+mobile/test_LogView.qml +++ b/test/qml/FeedbackView/+mobile/test_LogView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/FeedbackView/+mobile/test_StoreFeedbackPopup.qml b/test/qml/FeedbackView/+mobile/test_StoreFeedbackPopup.qml index 7e889ed5e..b804bee22 100644 --- a/test/qml/FeedbackView/+mobile/test_StoreFeedbackPopup.qml +++ b/test/qml/FeedbackView/+mobile/test_StoreFeedbackPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_DecisionView.qml b/test/qml/Global/+desktop/test_DecisionView.qml index dd086d59c..5352bf83b 100644 --- a/test/qml/Global/+desktop/test_DecisionView.qml +++ b/test/qml/Global/+desktop/test_DecisionView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_GFileDialog.qml b/test/qml/Global/+desktop/test_GFileDialog.qml index 38672e45a..9c0ed4871 100644 --- a/test/qml/Global/+desktop/test_GFileDialog.qml +++ b/test/qml/Global/+desktop/test_GFileDialog.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_NavigationButton.qml b/test/qml/Global/+desktop/test_NavigationButton.qml index fae2f48a4..81496acea 100644 --- a/test/qml/Global/+desktop/test_NavigationButton.qml +++ b/test/qml/Global/+desktop/test_NavigationButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_RoundedRectangle.qml b/test/qml/Global/+desktop/test_RoundedRectangle.qml index ac8a6d67d..0807eb3a9 100644 --- a/test/qml/Global/+desktop/test_RoundedRectangle.qml +++ b/test/qml/Global/+desktop/test_RoundedRectangle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_ScrollGradients.qml b/test/qml/Global/+desktop/test_ScrollGradients.qml index ef2c1939f..fad6db09d 100644 --- a/test/qml/Global/+desktop/test_ScrollGradients.qml +++ b/test/qml/Global/+desktop/test_ScrollGradients.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_ScrollablePane.qml b/test/qml/Global/+desktop/test_ScrollablePane.qml index 55e4f0454..229de2939 100644 --- a/test/qml/Global/+desktop/test_ScrollablePane.qml +++ b/test/qml/Global/+desktop/test_ScrollablePane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_TabbedPane.qml b/test/qml/Global/+desktop/test_TabbedPane.qml index e72ae593f..89352f963 100644 --- a/test/qml/Global/+desktop/test_TabbedPane.qml +++ b/test/qml/Global/+desktop/test_TabbedPane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+desktop/test_ToggleableOption.qml b/test/qml/Global/+desktop/test_ToggleableOption.qml deleted file mode 100644 index fb39077b4..000000000 --- a/test/qml/Global/+desktop/test_ToggleableOption.qml +++ /dev/null @@ -1,35 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtQuick 2.15 -import QtTest 1.15 -import Governikus.Global 1.0 - -TestCase { - id: testCase - function createTestObject() { - return createTemporaryQmlObject("import Governikus.Global 1.0; ToggleableOption {}", testCase); - } - function test_checked() { - let testObject = createTestObject(); - verify(!testObject.checked, "Initial checked: false"); - testObject.checked = true; - verify(testObject.checked, "checked: true"); - testObject.checked = false; - verify(!testObject.checked, "checked: false"); - } - function test_load() { - let testObject = createTestObject(); - verify(testObject, "Object loaded"); - } - function test_text() { - let testObject = createTestObject(); - compare(testObject.text, "", "Initial text: empty"); - testObject.text = "test"; - compare(testObject.text, "test", "text: test"); - } - - name: "test_ToggleableOption" - visible: true - when: windowShown -} diff --git a/test/qml/Global/+mobile/test_DynamicLayout.qml b/test/qml/Global/+mobile/test_DynamicLayout.qml deleted file mode 100644 index b377cedfb..000000000 --- a/test/qml/Global/+mobile/test_DynamicLayout.qml +++ /dev/null @@ -1,17 +0,0 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany - */ -import QtTest 1.15 - -TestCase { - id: parent - function test_load_MainView() { - var item = createTemporaryQmlObject(" - import Governikus.Global 1.0; - DynamicLayout {} - ", parent); - item.destroy(); - } - - name: "ModuleImportTest" -} diff --git a/test/qml/Global/+mobile/test_GSwitch.qml b/test/qml/Global/+mobile/test_GSwitch.qml index c8f6a9601..988e4e021 100644 --- a/test/qml/Global/+mobile/test_GSwitch.qml +++ b/test/qml/Global/+mobile/test_GSwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+mobile/test_LabeledSwitch.qml b/test/qml/Global/+mobile/test_LabeledSwitch.qml index 48f17c77f..975d47579 100644 --- a/test/qml/Global/+mobile/test_LabeledSwitch.qml +++ b/test/qml/Global/+mobile/test_LabeledSwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+mobile/test_ListItem.qml b/test/qml/Global/+mobile/test_ListItem.qml index 065f4b205..3a5663efe 100644 --- a/test/qml/Global/+mobile/test_ListItem.qml +++ b/test/qml/Global/+mobile/test_ListItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+mobile/test_PaneTitle.qml b/test/qml/Global/+mobile/test_PaneTitle.qml index b81cb8b96..e0347944c 100644 --- a/test/qml/Global/+mobile/test_PaneTitle.qml +++ b/test/qml/Global/+mobile/test_PaneTitle.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+mobile/test_SwipeActionDelegate.qml b/test/qml/Global/+mobile/test_SwipeActionDelegate.qml index dd2da8c23..46e74560c 100644 --- a/test/qml/Global/+mobile/test_SwipeActionDelegate.qml +++ b/test/qml/Global/+mobile/test_SwipeActionDelegate.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/+mobile/test_TitledSeparator.qml b/test/qml/Global/+mobile/test_TitledSeparator.qml index b9a489bf9..18ce4a7bc 100644 --- a/test/qml/Global/+mobile/test_TitledSeparator.qml +++ b/test/qml/Global/+mobile/test_TitledSeparator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_Category.qml b/test/qml/Global/test_Category.qml index 8bdf78628..124726482 100644 --- a/test/qml/Global/test_Category.qml +++ b/test/qml/Global/test_Category.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_ConfirmationPopup.qml b/test/qml/Global/test_ConfirmationPopup.qml index 6b5aea6dd..8b37db5f3 100644 --- a/test/qml/Global/test_ConfirmationPopup.qml +++ b/test/qml/Global/test_ConfirmationPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_Constants.qml b/test/qml/Global/test_Constants.qml index a880c02ef..85ae2a717 100644 --- a/test/qml/Global/test_Constants.qml +++ b/test/qml/Global/test_Constants.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GBusyIndicator.qml b/test/qml/Global/test_GBusyIndicator.qml index 3bffc5910..1233e8f8a 100644 --- a/test/qml/Global/test_GBusyIndicator.qml +++ b/test/qml/Global/test_GBusyIndicator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GButton.qml b/test/qml/Global/test_GButton.qml index 21e72c833..a66b7ad40 100644 --- a/test/qml/Global/test_GButton.qml +++ b/test/qml/Global/test_GButton.qml @@ -1,6 +1,7 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ +import QtQml 2.15 import QtQuick 2.15 import QtTest 1.15 import Governikus.Global 1.0 @@ -29,6 +30,57 @@ TestCase { let testObject = createTestObject(); verify(testObject, "Object loaded"); } + function test_size(data) { + let button = createTemporaryQmlObject("import Governikus.Global 1.0; GButton {icon.source: \"" + data.icon + "\"; text: \"" + data.text + "\"}", testCase); + waitForRendering(button); + compare(button.height, data.height); + compare(button.width, data.width); + } + function test_size_data() { + if (Qt.platform.os !== "osx") { + skip(); + } + let text = createTemporaryQmlObject("import Governikus.Global 1.0; import Governikus.Style 1.0; GText {textStyle: Style.text.button; text: \"test test test test test test\"}", testCase); + waitForRendering(text); + let longTextWidth = Math.round(text.width + 0.1); + return [{ + "tag": "noIconNoText", + "icon": "", + "text": "", + "height": 12, + "width": 16 + }, { + "tag": "noIconSmallText", + "icon": "", + "text": "t", + "height": Constants.is_desktop ? 39 : 40, + "width": Constants.is_desktop ? 59 : 112 + }, { + "tag": "noIconLongText", + "icon": "", + "text": "test test test test test test", + "height": Constants.is_desktop ? 39 : 40, + "width": 16 + longTextWidth + }, { + "tag": "withIconNoText", + "icon": "qrc:///images/identify.svg", + "text": "", + "height": Constants.is_desktop ? 39 : 40, + "width": Constants.is_desktop ? 43 : 44 + }, { + "tag": "withIconSmallText", + "icon": "qrc:///images/identify.svg", + "text": "t", + "height": Constants.is_desktop ? 39 : 40, + "width": Constants.is_desktop ? 59 : 112 + }, { + "tag": "withIconLongText", + "icon": "qrc:///images/identify.svg", + "text": "test test test test test test", + "height": Constants.is_desktop ? 39 : 40, + "width": (Constants.is_desktop ? 49 : 54) + longTextWidth + }]; + } function test_text() { let testObject = createTestObject(); compare(testObject.text, "", "Initial empty text"); diff --git a/test/qml/Global/test_GCheckBox.qml b/test/qml/Global/test_GCheckBox.qml index 22b8a229f..fd8211a04 100644 --- a/test/qml/Global/test_GCheckBox.qml +++ b/test/qml/Global/test_GCheckBox.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GComboBox.qml b/test/qml/Global/test_GComboBox.qml index 80f2f315a..a782aff60 100644 --- a/test/qml/Global/test_GComboBox.qml +++ b/test/qml/Global/test_GComboBox.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GFlickable.qml b/test/qml/Global/test_GFlickable.qml index fc748cff3..f6ed02785 100644 --- a/test/qml/Global/test_GFlickable.qml +++ b/test/qml/Global/test_GFlickable.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GFlickableColumnLayout.qml b/test/qml/Global/test_GFlickableColumnLayout.qml index 7367428f3..6324a2d05 100644 --- a/test/qml/Global/test_GFlickableColumnLayout.qml +++ b/test/qml/Global/test_GFlickableColumnLayout.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GGridView.qml b/test/qml/Global/test_GGridView.qml index 30e418df3..e27d4c889 100644 --- a/test/qml/Global/test_GGridView.qml +++ b/test/qml/Global/test_GGridView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GInformativeButton.qml b/test/qml/Global/test_GInformativeButton.qml new file mode 100644 index 000000000..f430e3fcd --- /dev/null +++ b/test/qml/Global/test_GInformativeButton.qml @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ +import QtQuick 2.15 +import QtTest 1.15 +import Governikus.Global 1.0 +import Governikus.Style 1.0 + +TestCase { + id: testCase + function createTestObject() { + return createTemporaryQmlObject("import Governikus.Global 1.0; GInformativeButton {}", testCase); + } + function test_description() { + let testObject = createTestObject(); + compare(testObject.description, "", "Initial empty description"); + testObject.description = "test"; + compare(testObject.description, "test", "description: test"); + } + function test_icon() { + let testObject = createTestObject(); + compare(testObject.icon.source, "", "Initial no image"); + testObject.icon.source = "qrc:///images/material_check.svg"; + compare(testObject.icon.source, "qrc:///images/material_check.svg", "Image: qrc:///images/material_check.svg"); + } + function test_load() { + let testObject = createTestObject(); + verify(testObject, "Object loaded"); + } + function test_scaleIcon() { + let testObject = createTestObject(); + compare(testObject.scaleIcon, 1.0, "Initial scale factor 1.0"); + testObject.scaleIcon = 0.75; + compare(testObject.scaleIcon, 0.75, "scaleIcon: 1.0"); + } + function test_text() { + let testObject = createTestObject(); + compare(testObject.text, "", "Initial empty text"); + testObject.text = "test"; + compare(testObject.text, "test", "text: test"); + } + function test_textStyle() { + let testObject = createTestObject(); + compare(testObject.textStyle, Style.text.button, "Initial textStyle: button"); + testObject.textStyle = Style.text.hint_warning; + compare(testObject.textStyle, Style.text.hint_warning, "textStyle: hint_warning"); + } + + name: "test_GInformativeButton" + visible: true + when: windowShown + + GInformativeButton { + id: testObject + icon.source: "qrc:///images/material_check.svg" + scaleIcon: 0.5 + text: "test" + + TestCase { + function test_click() { + verify(!testObject.pressed, "pressed: false"); + mousePress(testObject); + tryVerify(function () { + return testObject.pressed; + }); + mouseRelease(testObject); + tryVerify(function () { + return !testObject.pressed; + }); + } + function test_tintIcon() { + verify(!testObject.tintIcon, "Initial tintIcon: false"); + testObject.tintIcon = true; + verify(testObject.tintIcon, "tintIcon: true"); + testObject.tintIcon = false; + verify(!testObject.tintIcon, "tintIcon: false"); + } + + when: windowShown + } + } +} diff --git a/test/qml/Global/test_GListView.qml b/test/qml/Global/test_GListView.qml index af2af3576..d84c26017 100644 --- a/test/qml/Global/test_GListView.qml +++ b/test/qml/Global/test_GListView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GPane.qml b/test/qml/Global/test_GPane.qml index 7bc55449a..d361cd324 100644 --- a/test/qml/Global/test_GPane.qml +++ b/test/qml/Global/test_GPane.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GPaneBackground.qml b/test/qml/Global/test_GPaneBackground.qml index 0fcdc84f4..3740131a8 100644 --- a/test/qml/Global/test_GPaneBackground.qml +++ b/test/qml/Global/test_GPaneBackground.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GRadioButton.qml b/test/qml/Global/test_GRadioButton.qml index 836df6ac5..cccb647b4 100644 --- a/test/qml/Global/test_GRadioButton.qml +++ b/test/qml/Global/test_GRadioButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GRepeater.qml b/test/qml/Global/test_GRepeater.qml index b3187d4fd..24a962127 100644 --- a/test/qml/Global/test_GRepeater.qml +++ b/test/qml/Global/test_GRepeater.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtQml.Models 2.15 diff --git a/test/qml/Global/test_GScrollBar.qml b/test/qml/Global/test_GScrollBar.qml index af4909ddb..1a982edcd 100644 --- a/test/qml/Global/test_GScrollBar.qml +++ b/test/qml/Global/test_GScrollBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GSeparator.qml b/test/qml/Global/test_GSeparator.qml index 5dc260d89..9e2396514 100644 --- a/test/qml/Global/test_GSeparator.qml +++ b/test/qml/Global/test_GSeparator.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GText.qml b/test/qml/Global/test_GText.qml index 5a8662f05..1e4260c07 100644 --- a/test/qml/Global/test_GText.qml +++ b/test/qml/Global/test_GText.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_GTextField.qml b/test/qml/Global/test_GTextField.qml index d1b592adf..37b06b637 100644 --- a/test/qml/Global/test_GTextField.qml +++ b/test/qml/Global/test_GTextField.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_Hint.qml b/test/qml/Global/test_Hint.qml index cff8c2357..d1fff1dac 100644 --- a/test/qml/Global/test_Hint.qml +++ b/test/qml/Global/test_Hint.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_LabeledText.qml b/test/qml/Global/test_LabeledText.qml index b8dcedf11..e74cccb23 100644 --- a/test/qml/Global/test_LabeledText.qml +++ b/test/qml/Global/test_LabeledText.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_LocationButton.qml b/test/qml/Global/test_LocationButton.qml index 32bbb8aee..6a95e4c6c 100644 --- a/test/qml/Global/test_LocationButton.qml +++ b/test/qml/Global/test_LocationButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_NumberField.qml b/test/qml/Global/test_NumberField.qml index 65e4e33c2..119a3cc83 100644 --- a/test/qml/Global/test_NumberField.qml +++ b/test/qml/Global/test_NumberField.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_PkiSwitch.qml b/test/qml/Global/test_PkiSwitch.qml index 1a021a702..0c7549123 100644 --- a/test/qml/Global/test_PkiSwitch.qml +++ b/test/qml/Global/test_PkiSwitch.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_PrivacyStatement.qml b/test/qml/Global/test_PrivacyStatement.qml index 4138fbb48..f7919db69 100644 --- a/test/qml/Global/test_PrivacyStatement.qml +++ b/test/qml/Global/test_PrivacyStatement.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_ProxyCredentialsPopup.qml b/test/qml/Global/test_ProxyCredentialsPopup.qml index e0ea1358c..264c9bd10 100644 --- a/test/qml/Global/test_ProxyCredentialsPopup.qml +++ b/test/qml/Global/test_ProxyCredentialsPopup.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_SearchBar.qml b/test/qml/Global/test_SearchBar.qml index 4e5498fad..c6cb455d4 100644 --- a/test/qml/Global/test_SearchBar.qml +++ b/test/qml/Global/test_SearchBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_StatusIcon.qml b/test/qml/Global/test_StatusIcon.qml index 3da7eafd7..fc2e940c2 100644 --- a/test/qml/Global/test_StatusIcon.qml +++ b/test/qml/Global/test_StatusIcon.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_TintableIcon.qml b/test/qml/Global/test_TintableIcon.qml index e8e0a8469..62968a711 100644 --- a/test/qml/Global/test_TintableIcon.qml +++ b/test/qml/Global/test_TintableIcon.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Global/test_Utils.qml b/test/qml/Global/test_Utils.qml index 093b5dea8..cc39a2db9 100644 --- a/test/qml/Global/test_Utils.qml +++ b/test/qml/Global/test_Utils.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 import Governikus.Global 1.0 diff --git a/test/qml/InformationView/+desktop/test_ReleaseNotes.qml b/test/qml/InformationView/+desktop/test_ReleaseNotes.qml index 54b412443..a5f022210 100644 --- a/test/qml/InformationView/+desktop/test_ReleaseNotes.qml +++ b/test/qml/InformationView/+desktop/test_ReleaseNotes.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/InformationView/+mobile/test_ReleaseNotes.qml b/test/qml/InformationView/+mobile/test_ReleaseNotes.qml index e3785f320..96e265377 100644 --- a/test/qml/InformationView/+mobile/test_ReleaseNotes.qml +++ b/test/qml/InformationView/+mobile/test_ReleaseNotes.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/InformationView/test_LicenseInformation.qml b/test/qml/InformationView/test_LicenseInformation.qml index e3904eab4..878d50415 100644 --- a/test/qml/InformationView/test_LicenseInformation.qml +++ b/test/qml/InformationView/test_LicenseInformation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/InformationView/test_ReleaseNotesView.qml b/test/qml/InformationView/test_ReleaseNotesView.qml index 760d5e879..06805dada 100644 --- a/test/qml/InformationView/test_ReleaseNotesView.qml +++ b/test/qml/InformationView/test_ReleaseNotesView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 import Governikus.Global 1.0 diff --git a/test/qml/Navigation/+mobile/test_Navigation.qml b/test/qml/Navigation/+mobile/test_Navigation.qml index 8c8b15053..d25b32fff 100644 --- a/test/qml/Navigation/+mobile/test_Navigation.qml +++ b/test/qml/Navigation/+mobile/test_Navigation.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/PasswordInfoView/+desktop/test_PasswordInfoView.qml b/test/qml/PasswordInfoView/+desktop/test_PasswordInfoView.qml new file mode 100644 index 000000000..27eeb7409 --- /dev/null +++ b/test/qml/PasswordInfoView/+desktop/test_PasswordInfoView.qml @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ +import QtTest 1.15 +import Governikus.PasswordInfoView 1.0 + +TestCase { + id: parent + function test_load_PasswordInfoView(data) { + var item = createTemporaryQmlObject(" + import Governikus.PasswordInfoView 1.0; + PasswordInfoView { + infoContent: PasswordInfoData { + contentType: %1 + } + } + ".arg(data.contentType), parent); + item.destroy(); + } + function test_load_PasswordInfoView_data() { + return [{ + "contentType": PasswordInfoContent.Type.PIN + }, { + "contentType": PasswordInfoContent.Type.CAN + }, { + "contentType": PasswordInfoContent.Type.PUK + }, { + "contentType": PasswordInfoContent.Type.SMARTPHONE_AS_CARD_READER + }]; + } + + visible: true + when: windowShown +} diff --git a/test/qml/Provider/+mobile/+phone/test_ProviderHeader.qml b/test/qml/Provider/+mobile/+phone/test_ProviderHeader.qml index d9dc7fb64..5af37b853 100644 --- a/test/qml/Provider/+mobile/+phone/test_ProviderHeader.qml +++ b/test/qml/Provider/+mobile/+phone/test_ProviderHeader.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Provider/+mobile/test_ProviderModelItem.qml b/test/qml/Provider/+mobile/test_ProviderModelItem.qml index 47d34ede0..29098b60a 100644 --- a/test/qml/Provider/+mobile/test_ProviderModelItem.qml +++ b/test/qml/Provider/+mobile/test_ProviderModelItem.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Provider/test_ProviderDetailView.qml b/test/qml/Provider/test_ProviderDetailView.qml index 701560b5d..c3a14a87e 100644 --- a/test/qml/Provider/test_ProviderDetailView.qml +++ b/test/qml/Provider/test_ProviderDetailView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Provider/test_ProviderInfoSection.qml b/test/qml/Provider/test_ProviderInfoSection.qml index 996f5ad90..fc7450c3e 100644 --- a/test/qml/Provider/test_ProviderInfoSection.qml +++ b/test/qml/Provider/test_ProviderInfoSection.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/QmlTestRunner.cpp b/test/qml/QmlTestRunner.cpp index cea1a96fe..c8bdc1e70 100644 --- a/test/qml/QmlTestRunner.cpp +++ b/test/qml/QmlTestRunner.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "Env.h" diff --git a/test/qml/RemoteServiceView/+mobile/test_RemoteServiceView.qml b/test/qml/RemoteServiceView/+mobile/test_RemoteServiceView.qml index 9b9c9c266..4f3582b88 100644 --- a/test/qml/RemoteServiceView/+mobile/test_RemoteServiceView.qml +++ b/test/qml/RemoteServiceView/+mobile/test_RemoteServiceView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/ResultView/+mobile/test_ResultErrorView.qml b/test/qml/ResultView/+mobile/test_ResultErrorView.qml index 9d7fcafdd..4b73bbb15 100644 --- a/test/qml/ResultView/+mobile/test_ResultErrorView.qml +++ b/test/qml/ResultView/+mobile/test_ResultErrorView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/ResultView/test_ResultView.qml b/test/qml/ResultView/test_ResultView.qml index 541c68991..f6015e07e 100644 --- a/test/qml/ResultView/test_ResultView.qml +++ b/test/qml/ResultView/test_ResultView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/SettingsView/+desktop/test_TabbedReaderView.qml b/test/qml/SettingsView/+desktop/test_TabbedReaderView.qml index 1be50a732..4ee9be342 100644 --- a/test/qml/SettingsView/+desktop/test_TabbedReaderView.qml +++ b/test/qml/SettingsView/+desktop/test_TabbedReaderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/SettingsView/test_LanguageButtons.qml b/test/qml/SettingsView/test_LanguageButtons.qml index 2ce73eecb..43667609f 100644 --- a/test/qml/SettingsView/test_LanguageButtons.qml +++ b/test/qml/SettingsView/test_LanguageButtons.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/SettingsView/test_SettingsView.qml b/test/qml/SettingsView/test_SettingsView.qml index f77c5bea2..e499ba18b 100644 --- a/test/qml/SettingsView/test_SettingsView.qml +++ b/test/qml/SettingsView/test_SettingsView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/SmartView/+mobile/test_SmartView.qml b/test/qml/SmartView/+mobile/test_SmartView.qml index 2dee2b823..bd7c06bac 100644 --- a/test/qml/SmartView/+mobile/test_SmartView.qml +++ b/test/qml/SmartView/+mobile/test_SmartView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/TechnologyInfo/+mobile/test_TechnologyInfo.qml b/test/qml/TechnologyInfo/+mobile/test_TechnologyInfo.qml index d1cb2a7df..77deb1b8e 100644 --- a/test/qml/TechnologyInfo/+mobile/test_TechnologyInfo.qml +++ b/test/qml/TechnologyInfo/+mobile/test_TechnologyInfo.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/TitleBar/+desktop/test_CancelAction.qml b/test/qml/TitleBar/+desktop/test_CancelAction.qml index 5d363c94f..393c59c63 100644 --- a/test/qml/TitleBar/+desktop/test_CancelAction.qml +++ b/test/qml/TitleBar/+desktop/test_CancelAction.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/TitleBar/test_TitleBar.qml b/test/qml/TitleBar/test_TitleBar.qml index 6020baf96..b49e79b85 100644 --- a/test/qml/TitleBar/test_TitleBar.qml +++ b/test/qml/TitleBar/test_TitleBar.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/TitleBar/test_TitleBarButton.qml b/test/qml/TitleBar/test_TitleBarButton.qml index b78babb86..229e45740 100644 --- a/test/qml/TitleBar/test_TitleBarButton.qml +++ b/test/qml/TitleBar/test_TitleBarButton.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/TutorialView/+desktop/test_TutorialView.qml b/test/qml/TutorialView/+desktop/test_TutorialView.qml index ea69299f5..a5e9560fd 100644 --- a/test/qml/TutorialView/+desktop/test_TutorialView.qml +++ b/test/qml/TutorialView/+desktop/test_TutorialView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/TutorialView/+mobile/test_TutorialView.qml b/test/qml/TutorialView/+mobile/test_TutorialView.qml index 8c1e4883a..8dae65143 100644 --- a/test/qml/TutorialView/+mobile/test_TutorialView.qml +++ b/test/qml/TutorialView/+mobile/test_TutorialView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/View/+mobile/test_ContentArea.qml b/test/qml/View/+mobile/test_ContentArea.qml index fbeef8342..a90b57579 100644 --- a/test/qml/View/+mobile/test_ContentArea.qml +++ b/test/qml/View/+mobile/test_ContentArea.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/View/+mobile/test_TabBarView.qml b/test/qml/View/+mobile/test_TabBarView.qml index 7d072aa16..c408f77b2 100644 --- a/test/qml/View/+mobile/test_TabBarView.qml +++ b/test/qml/View/+mobile/test_TabBarView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/View/test_Controller.qml b/test/qml/View/test_Controller.qml index 39f101410..ccf65cf92 100644 --- a/test/qml/View/test_Controller.qml +++ b/test/qml/View/test_Controller.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/View/test_FocusFrame.qml b/test/qml/View/test_FocusFrame.qml index 30153ee08..66b4c8e59 100644 --- a/test/qml/View/test_FocusFrame.qml +++ b/test/qml/View/test_FocusFrame.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/View/test_FocusPoint.qml b/test/qml/View/test_FocusPoint.qml index a9457dbe2..9dc859165 100644 --- a/test/qml/View/test_FocusPoint.qml +++ b/test/qml/View/test_FocusPoint.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/View/test_SectionPage.qml b/test/qml/View/test_SectionPage.qml index 3e01d46ad..321172cc9 100644 --- a/test/qml/View/test_SectionPage.qml +++ b/test/qml/View/test_SectionPage.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/WhiteListClient/+mobile/test_WhiteListSurveyView.qml b/test/qml/WhiteListClient/+mobile/test_WhiteListSurveyView.qml index 9748077cc..89c1a0450 100644 --- a/test/qml/WhiteListClient/+mobile/test_WhiteListSurveyView.qml +++ b/test/qml/WhiteListClient/+mobile/test_WhiteListSurveyView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Workflow/+desktop/test_GeneralWorkflow.qml b/test/qml/Workflow/+desktop/test_GeneralWorkflow.qml index bc04963f5..8823d5b85 100644 --- a/test/qml/Workflow/+desktop/test_GeneralWorkflow.qml +++ b/test/qml/Workflow/+desktop/test_GeneralWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Workflow/+mobile/test_GeneralWorkflow.qml b/test/qml/Workflow/+mobile/test_GeneralWorkflow.qml index cca26c774..31fe4099e 100644 --- a/test/qml/Workflow/+mobile/test_GeneralWorkflow.qml +++ b/test/qml/Workflow/+mobile/test_GeneralWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Workflow/+mobile/test_NfcWorkflow.qml b/test/qml/Workflow/+mobile/test_NfcWorkflow.qml index 21c3b3e73..74aaf5b5e 100644 --- a/test/qml/Workflow/+mobile/test_NfcWorkflow.qml +++ b/test/qml/Workflow/+mobile/test_NfcWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Workflow/+mobile/test_SmartWorkflow.qml b/test/qml/Workflow/+mobile/test_SmartWorkflow.qml index 4e999eff7..fd1654934 100644 --- a/test/qml/Workflow/+mobile/test_SmartWorkflow.qml +++ b/test/qml/Workflow/+mobile/test_SmartWorkflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/Workflow/test_Workflow.qml b/test/qml/Workflow/test_Workflow.qml index 0bc182b48..2f0bf1aa6 100644 --- a/test/qml/Workflow/test_Workflow.qml +++ b/test/qml/Workflow/test_Workflow.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qml/test_HistoryView.qml b/test/qml/test_HistoryView.qml index db84b8c12..7d655a2fb 100644 --- a/test/qml/test_HistoryView.qml +++ b/test/qml/test_HistoryView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_MainView.qml b/test/qml/test_MainView.qml index ca2ccfcfd..3722f9b8b 100644 --- a/test/qml/test_MainView.qml +++ b/test/qml/test_MainView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_MoreView.qml b/test/qml/test_MoreView.qml index 800d4deca..cee71b5f2 100644 --- a/test/qml/test_MoreView.qml +++ b/test/qml/test_MoreView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_ProgressView.qml b/test/qml/test_ProgressView.qml index 405172bdc..88d6317e9 100644 --- a/test/qml/test_ProgressView.qml +++ b/test/qml/test_ProgressView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_ProviderView.qml b/test/qml/test_ProviderView.qml index 6fc15ed05..4011ca856 100644 --- a/test/qml/test_ProviderView.qml +++ b/test/qml/test_ProviderView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_SelfAuthenticationView.qml b/test/qml/test_SelfAuthenticationView.qml index 66681094a..13dbad88c 100644 --- a/test/qml/test_SelfAuthenticationView.qml +++ b/test/qml/test_SelfAuthenticationView.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_Style.qml b/test/qml/test_Style.qml index 613652421..49c985d48 100644 --- a/test/qml/test_Style.qml +++ b/test/qml/test_Style.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtTest 1.15 diff --git a/test/qml/test_UiPluginQml.qml b/test/qml/test_UiPluginQml.qml index 7c4852727..86d03e03a 100644 --- a/test/qml/test_UiPluginQml.qml +++ b/test/qml/test_UiPluginQml.qml @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ import QtQuick 2.15 import QtTest 1.15 diff --git a/test/qt/card/asn1/test_AccessRoleAndRight.cpp b/test/qt/card/asn1/test_AccessRoleAndRight.cpp index f6f1d2ad3..b5ee1b428 100644 --- a/test/qt/card/asn1/test_AccessRoleAndRight.cpp +++ b/test/qt/card/asn1/test_AccessRoleAndRight.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref AccessRoleAndRight - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/AccessRoleAndRight.h" diff --git a/test/qt/card/asn1/test_ApplicationTemplate.cpp b/test/qt/card/asn1/test_ApplicationTemplate.cpp index f64a1062e..d0465e33a 100644 --- a/test/qt/card/asn1/test_ApplicationTemplate.cpp +++ b/test/qt/card/asn1/test_ApplicationTemplate.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ApplicationTemplate - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ApplicationTemplate.h" diff --git a/test/qt/card/asn1/test_ApplicationTemplates.cpp b/test/qt/card/asn1/test_ApplicationTemplates.cpp index 925be0717..0a2ef65ed 100644 --- a/test/qt/card/asn1/test_ApplicationTemplates.cpp +++ b/test/qt/card/asn1/test_ApplicationTemplates.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ApplicationTemplate - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ApplicationTemplates.h" diff --git a/test/qt/card/asn1/test_Asn1BCDDateUtil.cpp b/test/qt/card/asn1/test_Asn1BCDDateUtil.cpp index d9d2cb7de..05326369b 100644 --- a/test/qt/card/asn1/test_Asn1BCDDateUtil.cpp +++ b/test/qt/card/asn1/test_Asn1BCDDateUtil.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Asn1BCDDateUtil - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_Asn1IntegerUtil.cpp b/test/qt/card/asn1/test_Asn1IntegerUtil.cpp index eddae097b..be8cb3376 100644 --- a/test/qt/card/asn1/test_Asn1IntegerUtil.cpp +++ b/test/qt/card/asn1/test_Asn1IntegerUtil.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Asn1IntegerUtil - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_Asn1OctetStringUtil.cpp b/test/qt/card/asn1/test_Asn1OctetStringUtil.cpp index 5de953897..3b8d2e988 100644 --- a/test/qt/card/asn1/test_Asn1OctetStringUtil.cpp +++ b/test/qt/card/asn1/test_Asn1OctetStringUtil.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Asn1OctetStringUtil - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_Asn1StringUtil.cpp b/test/qt/card/asn1/test_Asn1StringUtil.cpp index f910cbf4a..7363285d1 100644 --- a/test/qt/card/asn1/test_Asn1StringUtil.cpp +++ b/test/qt/card/asn1/test_Asn1StringUtil.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Asn1StringUtil - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_Asn1TypeUtil.cpp b/test/qt/card/asn1/test_Asn1TypeUtil.cpp index 161dc9409..32cd5ffef 100644 --- a/test/qt/card/asn1/test_Asn1TypeUtil.cpp +++ b/test/qt/card/asn1/test_Asn1TypeUtil.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Asn1TypeUtil - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_Asn1Util.cpp b/test/qt/card/asn1/test_Asn1Util.cpp index 7fe2b0df7..a4e79dd43 100644 --- a/test/qt/card/asn1/test_Asn1Util.cpp +++ b/test/qt/card/asn1/test_Asn1Util.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_AuxiliaryAuthenticatedData.cpp b/test/qt/card/asn1/test_AuxiliaryAuthenticatedData.cpp index bb3080074..5c59ab4ab 100644 --- a/test/qt/card/asn1/test_AuxiliaryAuthenticatedData.cpp +++ b/test/qt/card/asn1/test_AuxiliaryAuthenticatedData.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref AuxiliaryAuthenticatedData - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ASN1Util.h" diff --git a/test/qt/card/asn1/test_CVCertificate.cpp b/test/qt/card/asn1/test_CVCertificate.cpp index 2df945d30..a40148198 100644 --- a/test/qt/card/asn1/test_CVCertificate.cpp +++ b/test/qt/card/asn1/test_CVCertificate.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CVCertificate - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/CVCertificate.h" diff --git a/test/qt/card/asn1/test_CVCertificateBody.cpp b/test/qt/card/asn1/test_CVCertificateBody.cpp index 05fafe7de..cdd22f94d 100644 --- a/test/qt/card/asn1/test_CVCertificateBody.cpp +++ b/test/qt/card/asn1/test_CVCertificateBody.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CVCertificateBody - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/CVCertificateBody.h" diff --git a/test/qt/card/asn1/test_CVCertificateChainBuilder.cpp b/test/qt/card/asn1/test_CVCertificateChainBuilder.cpp index e71c9b622..82eefad1e 100644 --- a/test/qt/card/asn1/test_CVCertificateChainBuilder.cpp +++ b/test/qt/card/asn1/test_CVCertificateChainBuilder.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CVCertificateChain - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/asn1/test_CertificateDescription.cpp b/test/qt/card/asn1/test_CertificateDescription.cpp index e348f02bc..9d7b51f36 100644 --- a/test/qt/card/asn1/test_CertificateDescription.cpp +++ b/test/qt/card/asn1/test_CertificateDescription.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CertificateDescription - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/asn1/test_ChainBuilder.cpp b/test/qt/card/asn1/test_ChainBuilder.cpp index 4a5b0c504..f98fa5d77 100644 --- a/test/qt/card/asn1/test_ChainBuilder.cpp +++ b/test/qt/card/asn1/test_ChainBuilder.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ChainBuilder - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/asn1/test_Chat.cpp b/test/qt/card/asn1/test_Chat.cpp index ff1e482c6..1f913aeab 100644 --- a/test/qt/card/asn1/test_Chat.cpp +++ b/test/qt/card/asn1/test_Chat.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CHAT - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/Chat.h" diff --git a/test/qt/card/asn1/test_ChipAuthenticationInfo.cpp b/test/qt/card/asn1/test_ChipAuthenticationInfo.cpp index 2094f2d13..47675368d 100644 --- a/test/qt/card/asn1/test_ChipAuthenticationInfo.cpp +++ b/test/qt/card/asn1/test_ChipAuthenticationInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ChipAuthenticationInfo - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/ChipAuthenticationInfo.h" diff --git a/test/qt/card/asn1/test_EcdsaPublicKey.cpp b/test/qt/card/asn1/test_EcdsaPublicKey.cpp index b28b9e623..99f638770 100644 --- a/test/qt/card/asn1/test_EcdsaPublicKey.cpp +++ b/test/qt/card/asn1/test_EcdsaPublicKey.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref EcdsaPublicKey - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/EcdsaPublicKey.h" diff --git a/test/qt/card/asn1/test_Oid.cpp b/test/qt/card/asn1/test_Oid.cpp index ea43d1192..8ca811b10 100644 --- a/test/qt/card/asn1/test_Oid.cpp +++ b/test/qt/card/asn1/test_Oid.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/Oid.h" diff --git a/test/qt/card/asn1/test_PaceInfo.cpp b/test/qt/card/asn1/test_PaceInfo.cpp index 74bfe0843..64107015b 100644 --- a/test/qt/card/asn1/test_PaceInfo.cpp +++ b/test/qt/card/asn1/test_PaceInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PACEInfo - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/PaceInfo.h" diff --git a/test/qt/card/asn1/test_SecurityInfo.cpp b/test/qt/card/asn1/test_SecurityInfo.cpp index 5e9b13365..cd6ee1e97 100644 --- a/test/qt/card/asn1/test_SecurityInfo.cpp +++ b/test/qt/card/asn1/test_SecurityInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SecurityInfo - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/SecurityInfo.h" diff --git a/test/qt/card/asn1/test_SecurityInfos.cpp b/test/qt/card/asn1/test_SecurityInfos.cpp index 4b1e67675..5b4cb3063 100644 --- a/test/qt/card/asn1/test_SecurityInfos.cpp +++ b/test/qt/card/asn1/test_SecurityInfos.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SecurityInfos - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/asn1/test_SignatureChecker.cpp b/test/qt/card/asn1/test_SignatureChecker.cpp index 668598770..2ee2ac7b8 100644 --- a/test/qt/card/asn1/test_SignatureChecker.cpp +++ b/test/qt/card/asn1/test_SignatureChecker.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SignatureChecker - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/SignatureChecker.h" diff --git a/test/qt/card/asn1/test_efCardAccess.cpp b/test/qt/card/asn1/test_efCardAccess.cpp index 7bd103d02..36b80fcce 100644 --- a/test/qt/card/asn1/test_efCardAccess.cpp +++ b/test/qt/card/asn1/test_efCardAccess.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" diff --git a/test/qt/card/asn1/test_efCardSecurity.cpp b/test/qt/card/asn1/test_efCardSecurity.cpp index 666fe7f92..2dd8f4a3b 100644 --- a/test/qt/card/asn1/test_efCardSecurity.cpp +++ b/test/qt/card/asn1/test_efCardSecurity.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" diff --git a/test/qt/card/base/apdu/test_CommandApdu.cpp b/test/qt/card/base/apdu/test_CommandApdu.cpp index 71f93faac..958eaf06c 100644 --- a/test/qt/card/base/apdu/test_CommandApdu.cpp +++ b/test/qt/card/base/apdu/test_CommandApdu.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for the class CommandApdu. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/CommandApdu.h" diff --git a/test/qt/card/base/apdu/test_CommandData.cpp b/test/qt/card/base/apdu/test_CommandData.cpp index d66103e5a..e485bcca7 100644 --- a/test/qt/card/base/apdu/test_CommandData.cpp +++ b/test/qt/card/base/apdu/test_CommandData.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/CommandData.h" diff --git a/test/qt/card/base/apdu/test_FileCommand.cpp b/test/qt/card/base/apdu/test_FileCommand.cpp index bb379527c..bd1ec3cb8 100644 --- a/test/qt/card/base/apdu/test_FileCommand.cpp +++ b/test/qt/card/base/apdu/test_FileCommand.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for the class FileCommand. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/FileCommand.h" diff --git a/test/qt/card/base/apdu/test_GeneralAuthenticateResponse.cpp b/test/qt/card/base/apdu/test_GeneralAuthenticateResponse.cpp index 27a6d08b3..cc87b44b9 100644 --- a/test/qt/card/base/apdu/test_GeneralAuthenticateResponse.cpp +++ b/test/qt/card/base/apdu/test_GeneralAuthenticateResponse.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for GeneralAuthenticate response APDUs - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/base/apdu/test_PacePinStatus.cpp b/test/qt/card/base/apdu/test_PacePinStatus.cpp index 022d73842..01af57260 100644 --- a/test/qt/card/base/apdu/test_PacePinStatus.cpp +++ b/test/qt/card/base/apdu/test_PacePinStatus.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/PacePinStatus.h" diff --git a/test/qt/card/base/apdu/test_ResponseApdu.cpp b/test/qt/card/base/apdu/test_ResponseApdu.cpp index 43d09e1d0..892c1954e 100644 --- a/test/qt/card/base/apdu/test_ResponseApdu.cpp +++ b/test/qt/card/base/apdu/test_ResponseApdu.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Apdu - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/ResponseApdu.h" diff --git a/test/qt/card/base/apdu/test_SecureMessaging.cpp b/test/qt/card/base/apdu/test_SecureMessaging.cpp index 54364d70e..630814f36 100644 --- a/test/qt/card/base/apdu/test_SecureMessaging.cpp +++ b/test/qt/card/base/apdu/test_SecureMessaging.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/SecureMessaging.h" diff --git a/test/qt/card/base/apdu/test_SecureMessagingCommand.cpp b/test/qt/card/base/apdu/test_SecureMessagingCommand.cpp index 60d359a81..2cc6b2081 100644 --- a/test/qt/card/base/apdu/test_SecureMessagingCommand.cpp +++ b/test/qt/card/base/apdu/test_SecureMessagingCommand.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for SecureMessagingCommand - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/SecureMessagingCommand.h" diff --git a/test/qt/card/base/apdu/test_SecureMessagingResponse.cpp b/test/qt/card/base/apdu/test_SecureMessagingResponse.cpp index 9278498bb..bec4fa83a 100644 --- a/test/qt/card/base/apdu/test_SecureMessagingResponse.cpp +++ b/test/qt/card/base/apdu/test_SecureMessagingResponse.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for SecureMessagingResponse - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "apdu/SecureMessagingResponse.h" diff --git a/test/qt/card/base/command/test_BaseCardCommand.cpp b/test/qt/card/base/command/test_BaseCardCommand.cpp index a9d769f8c..6e66a1e67 100644 --- a/test/qt/card/base/command/test_BaseCardCommand.cpp +++ b/test/qt/card/base/command/test_BaseCardCommand.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref BaseCardCommand - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "command/BaseCardCommand.h" diff --git a/test/qt/card/base/command/test_DestroyPaceChannelCommand.cpp b/test/qt/card/base/command/test_DestroyPaceChannelCommand.cpp index e9da3204d..879868bef 100644 --- a/test/qt/card/base/command/test_DestroyPaceChannelCommand.cpp +++ b/test/qt/card/base/command/test_DestroyPaceChannelCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "command/DestroyPaceChannelCommand.h" diff --git a/test/qt/card/base/command/test_DidAuthenticateEAC1Command.cpp b/test/qt/card/base/command/test_DidAuthenticateEAC1Command.cpp index 12008c482..b95bf3bc4 100644 --- a/test/qt/card/base/command/test_DidAuthenticateEAC1Command.cpp +++ b/test/qt/card/base/command/test_DidAuthenticateEAC1Command.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "command/DidAuthenticateEAC1Command.h" diff --git a/test/qt/card/base/command/test_DidAuthenticateEAC2Command.cpp b/test/qt/card/base/command/test_DidAuthenticateEAC2Command.cpp index f0daadf20..d9d486f42 100644 --- a/test/qt/card/base/command/test_DidAuthenticateEAC2Command.cpp +++ b/test/qt/card/base/command/test_DidAuthenticateEAC2Command.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "command/DidAuthenticateEAC2Command.h" diff --git a/test/qt/card/base/command/test_EstablishPaceChannelCommand.cpp b/test/qt/card/base/command/test_EstablishPaceChannelCommand.cpp index 282ef3e31..03eeb2efa 100644 --- a/test/qt/card/base/command/test_EstablishPaceChannelCommand.cpp +++ b/test/qt/card/base/command/test_EstablishPaceChannelCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "command/EstablishPaceChannelCommand.h" diff --git a/test/qt/card/base/command/test_SetEidPinCommand.cpp b/test/qt/card/base/command/test_SetEidPinCommand.cpp index c29c69c3c..9c6017c33 100644 --- a/test/qt/card/base/command/test_SetEidPinCommand.cpp +++ b/test/qt/card/base/command/test_SetEidPinCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "command/SetEidPinCommand.h" diff --git a/test/qt/card/base/command/test_TransmitCommand.cpp b/test/qt/card/base/command/test_TransmitCommand.cpp index 18e849560..10dd5b335 100644 --- a/test/qt/card/base/command/test_TransmitCommand.cpp +++ b/test/qt/card/base/command/test_TransmitCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "command/TransmitCommand.h" diff --git a/test/qt/card/base/command/test_UpdRetryCounterCommand.cpp b/test/qt/card/base/command/test_UpdRetryCounterCommand.cpp index a3735c5ba..520eac27c 100644 --- a/test/qt/card/base/command/test_UpdRetryCounterCommand.cpp +++ b/test/qt/card/base/command/test_UpdRetryCounterCommand.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "command/UpdateRetryCounterCommand.h" diff --git a/test/qt/card/base/pinpad/test_EstablishPaceChannel.cpp b/test/qt/card/base/pinpad/test_EstablishPaceChannel.cpp index c7730b439..923d83acd 100644 --- a/test/qt/card/base/pinpad/test_EstablishPaceChannel.cpp +++ b/test/qt/card/base/pinpad/test_EstablishPaceChannel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for card EstablishPaceChannelBuilder - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/base/pinpad/test_EstablishPaceChannelOutput.cpp b/test/qt/card/base/pinpad/test_EstablishPaceChannelOutput.cpp index 106ba81d7..224203286 100644 --- a/test/qt/card/base/pinpad/test_EstablishPaceChannelOutput.cpp +++ b/test/qt/card/base/pinpad/test_EstablishPaceChannelOutput.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for card EstablishPACEChannelOutput - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/base/pinpad/test_LengthValue.cpp b/test/qt/card/base/pinpad/test_LengthValue.cpp index 8fa5ad9ab..f6153cba2 100644 --- a/test/qt/card/base/pinpad/test_LengthValue.cpp +++ b/test/qt/card/base/pinpad/test_LengthValue.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "pinpad/LengthValue.h" diff --git a/test/qt/card/base/pinpad/test_PinModify.cpp b/test/qt/card/base/pinpad/test_PinModify.cpp index 84040935a..68658d6e0 100644 --- a/test/qt/card/base/pinpad/test_PinModify.cpp +++ b/test/qt/card/base/pinpad/test_PinModify.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/base/pinpad/test_PinModifyOutput.cpp b/test/qt/card/base/pinpad/test_PinModifyOutput.cpp index 6f10fb810..04a7536f4 100644 --- a/test/qt/card/base/pinpad/test_PinModifyOutput.cpp +++ b/test/qt/card/base/pinpad/test_PinModifyOutput.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/base/test_CardConnection.cpp b/test/qt/card/base/test_CardConnection.cpp index 16b91aed5..54790240a 100644 --- a/test/qt/card/base/test_CardConnection.cpp +++ b/test/qt/card/base/test_CardConnection.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for the class CardConnection. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "CardConnection.h" diff --git a/test/qt/card/base/test_CardConnectionWorker.cpp b/test/qt/card/base/test_CardConnectionWorker.cpp index c310c98a7..0dc402afe 100644 --- a/test/qt/card/base/test_CardConnectionWorker.cpp +++ b/test/qt/card/base/test_CardConnectionWorker.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for the class CardConnectionWorker. - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "CardConnectionWorker.h" diff --git a/test/qt/card/base/test_CardInfo.cpp b/test/qt/card/base/test_CardInfo.cpp index d739a7666..a840f1f61 100644 --- a/test/qt/card/base/test_CardInfo.cpp +++ b/test/qt/card/base/test_CardInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for \ref CardInfo. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "CardInfo.h" diff --git a/test/qt/card/base/test_FileRef.cpp b/test/qt/card/base/test_FileRef.cpp index 4711f891b..c7f8a10d8 100644 --- a/test/qt/card/base/test_FileRef.cpp +++ b/test/qt/card/base/test_FileRef.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "FileRef.h" diff --git a/test/qt/card/base/test_Reader.cpp b/test/qt/card/base/test_Reader.cpp index b27719f4a..d8c109e81 100644 --- a/test/qt/card/base/test_Reader.cpp +++ b/test/qt/card/base/test_Reader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Reader - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "Reader.h" diff --git a/test/qt/card/base/test_ReaderInfo.cpp b/test/qt/card/base/test_ReaderInfo.cpp index 466752aed..7c75f3f8a 100644 --- a/test/qt/card/base/test_ReaderInfo.cpp +++ b/test/qt/card/base/test_ReaderInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for \ref ReaderInfo. - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderInfo.h" diff --git a/test/qt/card/base/test_ReaderManager.cpp b/test/qt/card/base/test_ReaderManager.cpp index bad424a80..aab17dc45 100644 --- a/test/qt/card/base/test_ReaderManager.cpp +++ b/test/qt/card/base/test_ReaderManager.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderManager.h" diff --git a/test/qt/card/base/test_SecurityProtocol.cpp b/test/qt/card/base/test_SecurityProtocol.cpp index cff33ff5f..d267e7396 100644 --- a/test/qt/card/base/test_SecurityProtocol.cpp +++ b/test/qt/card/base/test_SecurityProtocol.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SecurityProtocol.h" diff --git a/test/qt/card/drivers/test_ReaderDetector.cpp b/test/qt/card/drivers/test_ReaderDetector.cpp index f53727ac3..f23631ca6 100644 --- a/test/qt/card/drivers/test_ReaderDetector.cpp +++ b/test/qt/card/drivers/test_ReaderDetector.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReaderDetector - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderDetector.h" diff --git a/test/qt/card/pace/test_CipherMAC.cpp b/test/qt/card/pace/test_CipherMAC.cpp index bab04b5ab..011f1b511 100644 --- a/test/qt/card/pace/test_CipherMAC.cpp +++ b/test/qt/card/pace/test_CipherMAC.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/CipherMac.h" diff --git a/test/qt/card/pace/test_EcUtil.cpp b/test/qt/card/pace/test_EcUtil.cpp index dcc0edcd4..53943e7f5 100644 --- a/test/qt/card/pace/test_EcUtil.cpp +++ b/test/qt/card/pace/test_EcUtil.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/ec/EcUtil.h" diff --git a/test/qt/card/pace/test_EcdhGenericMapping.cpp b/test/qt/card/pace/test_EcdhGenericMapping.cpp index b0a01ecc1..5cb825358 100644 --- a/test/qt/card/pace/test_EcdhGenericMapping.cpp +++ b/test/qt/card/pace/test_EcdhGenericMapping.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/ec/EcdhGenericMapping.h" diff --git a/test/qt/card/pace/test_EcdhKeyAgreement.cpp b/test/qt/card/pace/test_EcdhKeyAgreement.cpp index 001d1e971..3678fe5f6 100644 --- a/test/qt/card/pace/test_EcdhKeyAgreement.cpp +++ b/test/qt/card/pace/test_EcdhKeyAgreement.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for the EcdhKeyAgreement - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/ec/EcdhKeyAgreement.h" diff --git a/test/qt/card/pace/test_KeyDerivationFunction.cpp b/test/qt/card/pace/test_KeyDerivationFunction.cpp index 1830e6345..6097efe74 100644 --- a/test/qt/card/pace/test_KeyDerivationFunction.cpp +++ b/test/qt/card/pace/test_KeyDerivationFunction.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/KeyDerivationFunction.h" diff --git a/test/qt/card/pace/test_PaceHandler.cpp b/test/qt/card/pace/test_PaceHandler.cpp index 7a146d3b2..1bfb71e14 100644 --- a/test/qt/card/pace/test_PaceHandler.cpp +++ b/test/qt/card/pace/test_PaceHandler.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests for the PaceHandler - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/PaceHandler.h" diff --git a/test/qt/card/pace/test_SymmetricCipher.cpp b/test/qt/card/pace/test_SymmetricCipher.cpp index b86bc298d..e061c6515 100644 --- a/test/qt/card/pace/test_SymmetricCipher.cpp +++ b/test/qt/card/pace/test_SymmetricCipher.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "pace/SymmetricCipher.h" diff --git a/test/qt/card/pcsc/test_PcscUtils.cpp b/test/qt/card/pcsc/test_PcscUtils.cpp index 77bd304c9..2e1807ef1 100644 --- a/test/qt/card/pcsc/test_PcscUtils.cpp +++ b/test/qt/card/pcsc/test_PcscUtils.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PcscUtils - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscUtils.h" diff --git a/test/qt/card/pcsc/test_pcscReaderFeature.cpp b/test/qt/card/pcsc/test_pcscReaderFeature.cpp index 48fc43c8c..8710e86cd 100644 --- a/test/qt/card/pcsc/test_pcscReaderFeature.cpp +++ b/test/qt/card/pcsc/test_pcscReaderFeature.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PcscReaderFeature - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PcscReaderFeature.h" diff --git a/test/qt/card/simulator/test_SimulatorCard.cpp b/test/qt/card/simulator/test_SimulatorCard.cpp index 8e3c1a66e..0c462030a 100644 --- a/test/qt/card/simulator/test_SimulatorCard.cpp +++ b/test/qt/card/simulator/test_SimulatorCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/test/qt/card/simulator/test_SimulatorFileSystem.cpp b/test/qt/card/simulator/test_SimulatorFileSystem.cpp index 0523554c1..21e677a50 100644 --- a/test/qt/card/simulator/test_SimulatorFileSystem.cpp +++ b/test/qt/card/simulator/test_SimulatorFileSystem.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ diff --git a/test/qt/card/smart/test_MockSmartEidRestClient.cpp b/test/qt/card/smart/test_MockSmartEidRestClient.cpp index d023ccc24..4ac7b786e 100644 --- a/test/qt/card/smart/test_MockSmartEidRestClient.cpp +++ b/test/qt/card/smart/test_MockSmartEidRestClient.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "mock/MockSmartEidRestClient.h" diff --git a/test/qt/card/smart/test_SmartCard.cpp b/test/qt/card/smart/test_SmartCard.cpp index 2f1450c8f..4fa3826c5 100644 --- a/test/qt/card/smart/test_SmartCard.cpp +++ b/test/qt/card/smart/test_SmartCard.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/smart/test_SmartManager.cpp b/test/qt/card/smart/test_SmartManager.cpp index 928855b44..aed337154 100644 --- a/test/qt/card/smart/test_SmartManager.cpp +++ b/test/qt/card/smart/test_SmartManager.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SmartManager - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderManager.h" diff --git a/test/qt/card/smart/test_SmartReader.cpp b/test/qt/card/smart/test_SmartReader.cpp index bd5d30524..979b706db 100644 --- a/test/qt/card/smart/test_SmartReader.cpp +++ b/test/qt/card/smart/test_SmartReader.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/smart/test_SmartReaderManagerPlugIn.cpp b/test/qt/card/smart/test_SmartReaderManagerPlugIn.cpp index 158ed9c75..a59f5887d 100644 --- a/test/qt/card/smart/test_SmartReaderManagerPlugIn.cpp +++ b/test/qt/card/smart/test_SmartReaderManagerPlugIn.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/card/smart/test_eid_applet_service.cpp b/test/qt/card/smart/test_eid_applet_service.cpp index 42d99f13d..bee15cb98 100644 --- a/test/qt/card/smart/test_eid_applet_service.cpp +++ b/test/qt/card/smart/test_eid_applet_service.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "eid_applet_interface.h" diff --git a/test/qt/configuration/test_ProviderConfiguration.cpp b/test/qt/configuration/test_ProviderConfiguration.cpp index f1297b40c..9bc73f3a5 100644 --- a/test/qt/configuration/test_ProviderConfiguration.cpp +++ b/test/qt/configuration/test_ProviderConfiguration.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProviderConfiguration - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderConfiguration.h" @@ -300,7 +302,7 @@ class test_ProviderConfiguration } } - QCOMPARE(attachedEidCounter, 19); + QCOMPARE(attachedEidCounter, 20); } diff --git a/test/qt/configuration/test_ProviderConfigurationParser.cpp b/test/qt/configuration/test_ProviderConfigurationParser.cpp index b6e2a826f..e78c05468 100644 --- a/test/qt/configuration/test_ProviderConfigurationParser.cpp +++ b/test/qt/configuration/test_ProviderConfigurationParser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProviderConfigurationParser - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderConfigurationParser.h" @@ -222,8 +224,8 @@ class test_ProviderConfigurationParser QTest::addColumn("majorVersion"); QTest::addColumn("count"); - const int all = 100; - const int withEidSupport = 78; + const int all = 112; + const int withEidSupport = 90; QTest::newRow("win") << QOperatingSystemVersion::Windows << -1 << all; QTest::newRow("mac") << QOperatingSystemVersion::MacOS << -1 << all; QTest::newRow("linux") << QOperatingSystemVersion::Unknown << -1 << all; diff --git a/test/qt/configuration/test_ReaderConfiguration.cpp b/test/qt/configuration/test_ReaderConfiguration.cpp index 862f2e035..dace0229c 100644 --- a/test/qt/configuration/test_ReaderConfiguration.cpp +++ b/test/qt/configuration/test_ReaderConfiguration.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReaderConfiguration - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderConfiguration.h" @@ -119,7 +121,6 @@ class test_ReaderConfiguration QTest::newRow("Identiv SCL011") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader" << "img_Identive_SCL011" << "^(SCM Microsystems Inc. )?SCL011G? Contactless Reader( 0)?$"; QTest::newRow("ACS-ACR1281U") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U" << "img_ACS_ACR1281U" << "ACS ACR1281 PICC Reader( 0)?"; - QTest::newRow("ACS-ACR1252U") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader PICC 0" << "ACS ACR1252U" << "img_ACS_ACR1252U" << "^ACS ACR1252 (1S CL|Dual)? Reader(( PICC 0)|\\(1\\))?$"; QTest::newRow("HID OMNIKEY 5021") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan 5x21-CL 0" << "HID OMNIKEY 5021-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "OMNIKEY CardMan 5x21-CL 0|OMNIKEY CardMan \\(076B:5340\\) 5021 CL"; QTest::newRow("HID OMNIKEY 5022") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader 0" << "HID OMNIKEY 5022-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "HID Global OMNIKEY 5022 Smart Card Reader( 0)?$"; @@ -230,16 +231,6 @@ class test_ReaderConfiguration QTest::newRow("ACS-ACR1281U-windows-7-10") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader 0" << "ACS ACR1281U"; QTest::newRow("ACS-ACR1281U-macosx-10.13-11.0") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U"; - QTest::newRow("ACS-ACR1252U-windows-7-10-1") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader PICC 0" << "ACS ACR1252U"; - QTest::newRow("ACS-ACR1252U-windows-7-10-2") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader SAM 0" << "ACS ACR1252 1S CL Reader SAM 0"; - QTest::newRow("ACS-ACR1252U-windows-7-10-3") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader PICC 0" << "ACS ACR1252U"; - QTest::newRow("ACS-ACR1252U-windows-7-10-4") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader SAM 0" << "ACS ACR1252 Dual Reader SAM 0"; - QTest::newRow("ACS-ACR1252U-macosx-10.13-10.15-1") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader(1)" << "ACS ACR1252U"; - QTest::newRow("ACS-ACR1252U-macosx-10.13-10.15-2") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader(2)" << "ACS ACR1252 Dual Reader(2)"; - QTest::newRow("ACS-ACR1252U-macosx-10.13-11.0-3") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader(1)" << "ACS ACR1252U"; - QTest::newRow("ACS-ACR1252U-macosx-10.13-11.0-4") << UsbId(0x072F, 0x223B) << "ACS ACR1252 1S CL Reader(2)" << "ACS ACR1252 1S CL Reader(2)"; - QTest::newRow("ACS-ACR1252U-macosx-10.13-11.0-5") << UsbId(0x072F, 0x223B) << "ACS ACR1252 Dual Reader" << "ACS ACR1252U"; - QTest::newRow("HID OMNIKEY 5021-windows-7-10") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan 5x21-CL 0" << "HID OMNIKEY 5021-CL"; QTest::newRow("HID OMNIKEY 5021-macosx-10.13-11.0") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan (076B:5340) 5021 CL" << "HID OMNIKEY 5021-CL"; @@ -413,7 +404,7 @@ class test_ReaderConfiguration }; -const int test_ReaderConfiguration::cCardReadersInConfigurationFile = 32; +const int test_ReaderConfiguration::cCardReadersInConfigurationFile = 31; QTEST_GUILESS_MAIN(test_ReaderConfiguration) #include "test_ReaderConfiguration.moc" diff --git a/test/qt/configuration/test_ReaderConfigurationEntryParser.cpp b/test/qt/configuration/test_ReaderConfigurationEntryParser.cpp index 8cd92fe31..5ea70600a 100644 --- a/test/qt/configuration/test_ReaderConfigurationEntryParser.cpp +++ b/test/qt/configuration/test_ReaderConfigurationEntryParser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReaderConfigurationParser - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderConfigurationParser.h" diff --git a/test/qt/configuration/test_ReaderConfigurationParser.cpp b/test/qt/configuration/test_ReaderConfigurationParser.cpp index 33cb346e9..3053fef4d 100644 --- a/test/qt/configuration/test_ReaderConfigurationParser.cpp +++ b/test/qt/configuration/test_ReaderConfigurationParser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReaderDetector - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderConfigurationParser.h" diff --git a/test/qt/configuration/test_ReleaseInformation.cpp b/test/qt/configuration/test_ReleaseInformation.cpp index 4fe5460fc..9c990e6fe 100644 --- a/test/qt/configuration/test_ReleaseInformation.cpp +++ b/test/qt/configuration/test_ReleaseInformation.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReleaseInformation - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ReleaseInformation.h" diff --git a/test/qt/configuration/test_ReleaseInformationConfiguration.cpp b/test/qt/configuration/test_ReleaseInformationConfiguration.cpp index a5daa9089..9c67bfd4d 100644 --- a/test/qt/configuration/test_ReleaseInformationConfiguration.cpp +++ b/test/qt/configuration/test_ReleaseInformationConfiguration.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReleaseInformationConfiguration - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "ReleaseInformationConfiguration.h" diff --git a/test/qt/core/test_AppController.cpp b/test/qt/core/test_AppController.cpp index 00aa32528..74c349364 100644 --- a/test/qt/core/test_AppController.cpp +++ b/test/qt/core/test_AppController.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "controller/AppController.h" diff --git a/test/qt/diagnosis/test_DiagnosisAntivirusDetection.cpp b/test/qt/diagnosis/test_DiagnosisAntivirusDetection.cpp index 64e94a66b..d7f9c8f37 100644 --- a/test/qt/diagnosis/test_DiagnosisAntivirusDetection.cpp +++ b/test/qt/diagnosis/test_DiagnosisAntivirusDetection.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DiagnosisAntivirusDetection - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisAntivirusDetection.h" diff --git a/test/qt/diagnosis/test_DiagnosisConnectionTest.cpp b/test/qt/diagnosis/test_DiagnosisConnectionTest.cpp index f4920077b..7cb3b5523 100644 --- a/test/qt/diagnosis/test_DiagnosisConnectionTest.cpp +++ b/test/qt/diagnosis/test_DiagnosisConnectionTest.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DiagnosisConnectionTest - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisConnectionTest.h" diff --git a/test/qt/diagnosis/test_DiagnosisContext.cpp b/test/qt/diagnosis/test_DiagnosisContext.cpp index ea84236c0..5e6ffb50e 100644 --- a/test/qt/diagnosis/test_DiagnosisContext.cpp +++ b/test/qt/diagnosis/test_DiagnosisContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "context/DiagnosisContext.h" diff --git a/test/qt/diagnosis/test_DiagnosisFirewallDetection.cpp b/test/qt/diagnosis/test_DiagnosisFirewallDetection.cpp index b60081621..4d00f7af0 100644 --- a/test/qt/diagnosis/test_DiagnosisFirewallDetection.cpp +++ b/test/qt/diagnosis/test_DiagnosisFirewallDetection.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DiagnosisAntivirusDetection - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisFirewallDetection.h" diff --git a/test/qt/diagnosis/test_DiagnosisModel.cpp b/test/qt/diagnosis/test_DiagnosisModel.cpp index 1f47504c0..6ee9c5187 100644 --- a/test/qt/diagnosis/test_DiagnosisModel.cpp +++ b/test/qt/diagnosis/test_DiagnosisModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DiagnosisModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "DiagnosisModel.h" @@ -29,21 +31,9 @@ class test_DiagnosisModel bool verifyOrder(const QSharedPointer& pSection, - const QVector>& pSectionOrder) - { - QVector>> contentOrder; - for (const auto& section : pSectionOrder) - { - contentOrder.append(section->mContentItems); - } - - return verifyOrder(pSection->mContentItems, contentOrder); - } - - - bool verifyOrder(const QVector>& pSection, - const QVector>>& pOrder) + const QVector>& pOrder) { + const auto& content = pSection->mContentItems; #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) qsizetype offset = 0; #else @@ -51,7 +41,7 @@ class test_DiagnosisModel #endif for (const auto& subsection : pOrder) { - const auto& slice = pSection.mid(offset, subsection.size()); + const auto& slice = content.mid(offset, subsection.size()); if (slice != subsection) { return false; @@ -59,7 +49,7 @@ class test_DiagnosisModel offset += subsection.size(); } - return offset == pSection.size(); + return offset == content.size(); } private Q_SLOTS: @@ -67,6 +57,7 @@ class test_DiagnosisModel { mContext.reset(new DiagnosisContext()); mModel.reset(new DiagnosisModel(mContext)); + mModel->reloadContent(); } @@ -80,34 +71,28 @@ class test_DiagnosisModel void test_newDiagnosisModel() { QCOMPARE(mModel->mContext, mContext); - QCOMPARE(mModel->mSections.size(), 4); - - QCOMPARE(mModel->mSections.at(0).first, QCoreApplication::applicationName()); - QCOMPARE(mModel->mSections.at(1).first, QString("Card reader")); - QCOMPARE(mModel->mSections.at(2).first, QString("Network")); - QCOMPARE(mModel->mSections.at(3).first, QString("Antivirus and firewall")); - - QCOMPARE(mModel->mSections.at(0).second->mContentItems.last(), mModel->mTimestampItem); - - QCOMPARE(mModel->mSections.at(1).second, mModel->mCombinedReaderSection); - QCOMPARE(mModel->mSections.at(2).second, mModel->mCombinedNetworkSection); - QCOMPARE(mModel->mSections.at(3).second, mModel->mCombinedAntivirusFirewallSection); - - QCOMPARE(mModel->mSections.at(1).second->mContentItems.at(0)->mTitle, QString("Paired smartphones")); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.at(1)->mContent, QString("No devices paired.")); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.at(2)->mTitle, QString("Card reader")); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.at(3)->mContent, QString("Diagnosis is running...")); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.at(4)->mTitle, QString("PC/SC driver information")); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.at(5)->mContent, QString("Diagnosis is running...")); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.mid(0, 2), mModel->mRemoteDeviceSection->mContentItems); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.mid(2, 2), mModel->mCardReaderSection->mContentItems); - QCOMPARE(mModel->mSections.at(1).second->mContentItems.mid(4, 2), mModel->mPcscSection->mContentItems); - - QCOMPARE(true, verifyOrder(mModel->mSections.at(1).second, + QCOMPARE(mModel->rowCount(), mModel->mSections.size()); + + QCOMPARE(mModel->getSectionName(DiagnosisModel::Section::GENERAL), QCoreApplication::applicationName()); + QCOMPARE(mModel->getSectionName(DiagnosisModel::Section::READER), QString("Card reader")); + QCOMPARE(mModel->getSectionName(DiagnosisModel::Section::NETWORK), QString("Network")); + QCOMPARE(mModel->getSectionName(DiagnosisModel::Section::SECURITY), QString("Antivirus and firewall")); + + QCOMPARE(mModel->mSections[DiagnosisModel::Section::GENERAL]->mContentItems.last().mTitle, QString("Time of diagnosis")); + QCOMPARE(mModel->mSections[DiagnosisModel::Section::GENERAL]->mContentItems.last().mContent, QString("Initial diagnosis running, please wait.")); + + QCOMPARE(mModel->mSections[DiagnosisModel::Section::READER]->mContentItems.at(0).mTitle, QString("Paired smartphones")); + QCOMPARE(mModel->mSections[DiagnosisModel::Section::READER]->mContentItems.at(1).mContent, QString("No devices paired.")); + QCOMPARE(mModel->mSections[DiagnosisModel::Section::READER]->mContentItems.at(2).mTitle, QString("Card reader")); + QCOMPARE(mModel->mSections[DiagnosisModel::Section::READER]->mContentItems.at(3).mContent, QString("Diagnosis is running...")); + QCOMPARE(mModel->mSections[DiagnosisModel::Section::READER]->mContentItems.at(4).mTitle, QString("PC/SC driver information")); + QCOMPARE(mModel->mSections[DiagnosisModel::Section::READER]->mContentItems.at(5).mContent, QString("Diagnosis is running...")); + + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::READER], {mModel->mRemoteDeviceSection, mModel->mCardReaderSection, mModel->mPcscSection})); - QCOMPARE(true, verifyOrder(mModel->mSections.at(2).second, + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::NETWORK], {mModel->mNetworkConnectionSection, mModel->mNetworkInterfaceSection})); - QCOMPARE(true, verifyOrder(mModel->mSections.at(3).second, + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::SECURITY], {mModel->mAntivirusSection, mModel->mFirewallSection})); } @@ -115,8 +100,8 @@ class test_DiagnosisModel void test_OnReaderInfosChanged() { mModel->onReaderInfosChanged(); - QCOMPARE(mModel->mCardReaderSection->mContentItems.size(), 2); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(1)->mContent, QString("No supported reader found.")); + QCOMPARE(mModel->mCardReaderSection.size(), 2); + QCOMPARE(mModel->mCardReaderSection.at(1).mContent, QString("No supported reader found.")); ReaderInfo defaultInfo; ReaderInfo infoEidCard(QString("testInfo"), ReaderManagerPlugInType::PCSC, CardInfo(CardType::EID_CARD)); @@ -126,35 +111,35 @@ class test_DiagnosisModel mContext->setReaderInfos(readerInfos); mModel->onReaderInfosChanged(); - QCOMPARE(mModel->mCardReaderSection->mContentItems.size(), 4); + QCOMPARE(mModel->mCardReaderSection.size(), 4); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(0)->mTitle, QString("Connected Card readers")); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(1)->mTitle, QString()); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(2)->mTitle, QString("testInfo")); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(3)->mTitle, QString("name")); + QCOMPARE(mModel->mCardReaderSection.at(0).mTitle, QString("Connected Card readers")); + QCOMPARE(mModel->mCardReaderSection.at(1).mTitle, QString()); + QCOMPARE(mModel->mCardReaderSection.at(2).mTitle, QString("testInfo")); + QCOMPARE(mModel->mCardReaderSection.at(3).mTitle, QString("name")); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(0)->mContent, QString()); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(1)->mContent, QString("Type: Basic card reader\nCard: not inserted")); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(2)->mContent, QString("Type: Basic card reader\nCard: ID card (PA/eAT/eID)\nRetry counter: -1")); - QCOMPARE(mModel->mCardReaderSection->mContentItems.at(3)->mContent, QString("Type: Standard / comfort card reader\nCard: unknown type")); + QCOMPARE(mModel->mCardReaderSection.at(0).mContent, QString()); + QCOMPARE(mModel->mCardReaderSection.at(1).mContent, QString("Type: Basic card reader\nCard: not inserted")); + QCOMPARE(mModel->mCardReaderSection.at(2).mContent, QString("Type: Basic card reader\nCard: ID card (PA/eAT/eID)\nRetry counter: -1")); + QCOMPARE(mModel->mCardReaderSection.at(3).mContent, QString("Type: Standard / comfort card reader\nCard: unknown type")); - QCOMPARE(true, verifyOrder(mModel->mCombinedReaderSection->mContentItems, { - mModel->mRemoteDeviceSection->mContentItems, - mModel->mCardReaderSection->mContentItems, - mModel->mPcscSection->mContentItems})); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::READER], { + mModel->mRemoteDeviceSection, + mModel->mCardReaderSection, + mModel->mPcscSection})); } void test_OnRemoteInfosChanged() { mModel->onRemoteInfosChanged(); - QCOMPARE(mModel->mRemoteDeviceSection->mContentItems.size(), 2); - QCOMPARE(mModel->mRemoteDeviceSection->mContentItems.at(0)->mTitle, QString("Paired smartphones")); - QCOMPARE(mModel->mRemoteDeviceSection->mContentItems.at(1)->mContent, QString("No devices paired.")); - QCOMPARE(true, verifyOrder(mModel->mCombinedReaderSection->mContentItems, { - mModel->mRemoteDeviceSection->mContentItems, - mModel->mCardReaderSection->mContentItems, - mModel->mPcscSection->mContentItems})); + QCOMPARE(mModel->mRemoteDeviceSection.size(), 2); + QCOMPARE(mModel->mRemoteDeviceSection.at(0).mTitle, QString("Paired smartphones")); + QCOMPARE(mModel->mRemoteDeviceSection.at(1).mContent, QString("No devices paired.")); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::READER], { + mModel->mRemoteDeviceSection, + mModel->mCardReaderSection, + mModel->mPcscSection})); } @@ -170,18 +155,18 @@ class test_DiagnosisModel mContext->setPcscInfo(version, components, drivers); mModel->onPcscInfoChanged(); - QCOMPARE(mModel->mPcscSection->mContentItems.size(), 4); - - QCOMPARE(mModel->mPcscSection->mContentItems.at(0)->mTitle, QString("PC/SC information")); - QCOMPARE(mModel->mPcscSection->mContentItems.at(1)->mContent, QString("Version")); - QCOMPARE(mModel->mPcscSection->mContentItems.at(2)->mTitle, QString("Components")); - QCOMPARE(mModel->mPcscSection->mContentItems.at(2)->mContent, QString("description1\nVendor: vendor1\nVersion: version1\nFile path: /path/to/component1\ndescription2\nVendor: vendor2\nVersion: version2\nFile path: /path/to/component2")); - QCOMPARE(mModel->mPcscSection->mContentItems.at(3)->mTitle, QString("Driver")); - QCOMPARE(mModel->mPcscSection->mContentItems.at(3)->mContent, QString("description1\nVendor: vendor1\nVersion: version1\nFile path: /path/to/driver1\ndescription2\nVendor: vendor2\nVersion: version2\nFile path: /path/to/driver2")); - QCOMPARE(true, verifyOrder(mModel->mCombinedReaderSection->mContentItems, { - mModel->mRemoteDeviceSection->mContentItems, - mModel->mCardReaderSection->mContentItems, - mModel->mPcscSection->mContentItems})); + QCOMPARE(mModel->mPcscSection.size(), 4); + + QCOMPARE(mModel->mPcscSection.at(0).mTitle, QString("PC/SC information")); + QCOMPARE(mModel->mPcscSection.at(1).mContent, QString("Version")); + QCOMPARE(mModel->mPcscSection.at(2).mTitle, QString("Components")); + QCOMPARE(mModel->mPcscSection.at(2).mContent, QString("description1\nVendor: vendor1\nVersion: version1\nFile path: /path/to/component1\ndescription2\nVendor: vendor2\nVersion: version2\nFile path: /path/to/component2")); + QCOMPARE(mModel->mPcscSection.at(3).mTitle, QString("Driver")); + QCOMPARE(mModel->mPcscSection.at(3).mContent, QString("description1\nVendor: vendor1\nVersion: version1\nFile path: /path/to/driver1\ndescription2\nVendor: vendor2\nVersion: version2\nFile path: /path/to/driver2")); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::READER], { + mModel->mRemoteDeviceSection, + mModel->mCardReaderSection, + mModel->mPcscSection})); } @@ -194,13 +179,13 @@ class test_DiagnosisModel mContext->setTimestamp(invalid); mModel->onTimestampChanged(); - QCOMPARE(mModel->mTimestampItem->mTitle, QString("Time of diagnosis")); - QCOMPARE(mModel->mTimestampItem->mContent, QString("Failed to retrieve date & time")); + QCOMPARE(mModel->mTimestampSection.last().mTitle, QString("Time of diagnosis")); + QCOMPARE(mModel->mTimestampSection.last().mContent, QString("Failed to retrieve date & time")); mContext->setTimestamp(valid); mModel->onTimestampChanged(); - QCOMPARE(mModel->mTimestampItem->mTitle, QString("Time of diagnosis")); - QCOMPARE(mModel->mTimestampItem->mContent, QString("12. October 2018, 12:00:00 PM")); + QCOMPARE(mModel->mTimestampSection.last().mTitle, QString("Time of diagnosis")); + QCOMPARE(mModel->mTimestampSection.last().mContent, QString("12. October 2018, 12:00:00 PM")); } @@ -213,56 +198,56 @@ class test_DiagnosisModel mContext->setNetworkInterfaces(interfaces); mModel->onNetworkInfoChanged(); - QCOMPARE(mModel->mNetworkInterfaceSection->mContentItems.size(), 3); - for (const auto& item : std::as_const(mModel->mNetworkInterfaceSection->mContentItems)) + QCOMPARE(mModel->mNetworkInterfaceSection.size(), 3); + for (const auto& item : std::as_const(mModel->mNetworkInterfaceSection)) { - QCOMPARE(item->mTitle, QString("")); - QCOMPARE(item->mContent, QString("Hardware address: \nNo IP addresses assigned")); + QCOMPARE(item.mTitle, QString("")); + QCOMPARE(item.mContent, QString("Hardware address: \nNo IP addresses assigned")); } - QCOMPARE(true, verifyOrder(mModel->mCombinedNetworkSection, {mModel->mNetworkConnectionSection, mModel->mNetworkInterfaceSection})); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::NETWORK], {mModel->mNetworkConnectionSection, mModel->mNetworkInterfaceSection})); } void test_OnAntivirusDetectionFailed() { mModel->onAntivirusDetectionFailed(); - QCOMPARE(mModel->mAntivirusSection->mContentItems.size(), 1); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(0)->mTitle, QString("Antivirus information")); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(0)->mContent, QString("Antivirus detection failed.")); - QCOMPARE(true, verifyOrder(mModel->mCombinedAntivirusFirewallSection, {mModel->mAntivirusSection, mModel->mFirewallSection})); + QCOMPARE(mModel->mAntivirusSection.size(), 1); + QCOMPARE(mModel->mAntivirusSection.at(0).mTitle, QString("Antivirus information")); + QCOMPARE(mModel->mAntivirusSection.at(0).mContent, QString("Antivirus detection failed.")); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::SECURITY], {mModel->mAntivirusSection, mModel->mFirewallSection})); } void test_OnAntivirusInformationChanged() { mModel->onAntivirusInformationChanged(); - QCOMPARE(mModel->mAntivirusSection->mContentItems.size(), 1); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(0)->mTitle, QString("Antivirus information")); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(0)->mContent, QString("No Antivirus software detected.")); - QCOMPARE(true, verifyOrder(mModel->mCombinedAntivirusFirewallSection, {mModel->mAntivirusSection, mModel->mFirewallSection})); + QCOMPARE(mModel->mAntivirusSection.size(), 1); + QCOMPARE(mModel->mAntivirusSection.at(0).mTitle, QString("Antivirus information")); + QCOMPARE(mModel->mAntivirusSection.at(0).mContent, QString("No Antivirus software detected.")); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::SECURITY], {mModel->mAntivirusSection, mModel->mFirewallSection})); const QString& fileContent = getTestData(QStringLiteral("antivir_two_antivirus.txt")); mModel->mAntivirusDetection.parseAntivirInfos(fileContent); mModel->onAntivirusInformationChanged(); - QCOMPARE(mModel->mAntivirusSection->mContentItems.size(), 3); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(0)->mTitle, QString("Antivirus information")); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(1)->mTitle, QString("BullGuard Antivirus")); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(1)->mContent, QString("Last updated: Fri, 30 Nov 2018 15:04:13 GMT\nExecutable path: C:\\Program Files\\BullGuard Ltd\\BullGuard\\BullGuard.exe")); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(2)->mTitle, QString("Windows Defender")); - QCOMPARE(mModel->mAntivirusSection->mContentItems.at(2)->mContent, QString("Last updated: Mon, 26 Nov 2018 10:34:23 GMT\nExecutable path: windowsdefender://")); - QCOMPARE(true, verifyOrder(mModel->mCombinedAntivirusFirewallSection, {mModel->mAntivirusSection, mModel->mFirewallSection})); + QCOMPARE(mModel->mAntivirusSection.size(), 3); + QCOMPARE(mModel->mAntivirusSection.at(0).mTitle, QString("Antivirus information")); + QCOMPARE(mModel->mAntivirusSection.at(1).mTitle, QString("BullGuard Antivirus")); + QCOMPARE(mModel->mAntivirusSection.at(1).mContent, QString("Last updated: Fri, 30 Nov 2018 15:04:13 GMT\nExecutable path: C:\\Program Files\\BullGuard Ltd\\BullGuard\\BullGuard.exe")); + QCOMPARE(mModel->mAntivirusSection.at(2).mTitle, QString("Windows Defender")); + QCOMPARE(mModel->mAntivirusSection.at(2).mContent, QString("Last updated: Mon, 26 Nov 2018 10:34:23 GMT\nExecutable path: windowsdefender://")); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::SECURITY], {mModel->mAntivirusSection, mModel->mFirewallSection})); } void test_OnFirewallInformationFailed() { mModel->onFirewallInformationFailed(); - QCOMPARE(mModel->mFirewallSection->mContentItems.size(), 1); - QCOMPARE(mModel->mFirewallSection->mContentItems.at(0)->mTitle, QString("Firewall information")); - QCOMPARE(mModel->mFirewallSection->mContentItems.at(0)->mContent, QString("An error occurred while trying to gather firewall information. Please check the log for more information.")); - QCOMPARE(true, verifyOrder(mModel->mCombinedAntivirusFirewallSection, {mModel->mAntivirusSection, mModel->mFirewallSection})); + QCOMPARE(mModel->mFirewallSection.size(), 1); + QCOMPARE(mModel->mFirewallSection.at(0).mTitle, QString("Firewall information")); + QCOMPARE(mModel->mFirewallSection.at(0).mContent, QString("An error occurred while trying to gather firewall information. Please check the log for more information.")); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::SECURITY], {mModel->mAntivirusSection, mModel->mFirewallSection})); } @@ -293,8 +278,9 @@ class test_DiagnosisModel mModel->mConnectionTest.mConnectionTestWithoutProxySuccessful = connectionTestWithoutProxy; mModel->onConnectionTestDone(); - QCOMPARE(mModel->mNetworkConnectionSection->mContentItems.size(), 1); - QCOMPARE(mModel->mNetworkConnectionSection->mContentItems.at(0)->mTitle, QString("Proxy information")); + QCOMPARE(mModel->mNetworkConnectionSection.size(), 2); + QCOMPARE(mModel->mNetworkConnectionSection.at(0).mTitle, QString("Service addresses")); + QCOMPARE(mModel->mNetworkConnectionSection.at(1).mTitle, QString("Proxy information")); QString contentString; if (proxySet) @@ -308,12 +294,12 @@ class test_DiagnosisModel { contentString = QString("No proxy found"); } - contentString += QString("\nConnection test without proxy: "); contentString += connectionTestWithoutProxy ? QString("Successful") : QString("Failed"); - QCOMPARE(mModel->mNetworkConnectionSection->mContentItems.at(0)->mContent, contentString); - QCOMPARE(true, verifyOrder(mModel->mCombinedNetworkSection, {mModel->mNetworkConnectionSection, mModel->mNetworkInterfaceSection})); + QCOMPARE(mModel->mNetworkConnectionSection.at(0).mContent, QStringLiteral("Not bound")); + QCOMPARE(mModel->mNetworkConnectionSection.at(1).mContent, contentString); + QVERIFY(verifyOrder(mModel->mSections[DiagnosisModel::Section::NETWORK], {mModel->mNetworkConnectionSection, mModel->mNetworkInterfaceSection})); } diff --git a/test/qt/export/test_PdfExporter.cpp b/test/qt/export/test_PdfExporter.cpp index 3fd3a23c5..d8cc4d524 100644 --- a/test/qt/export/test_PdfExporter.cpp +++ b/test/qt/export/test_PdfExporter.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PdfExporter - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "PdfExporter.h" diff --git a/test/qt/file_provider/test_Downloader.cpp b/test/qt/file_provider/test_Downloader.cpp index c4d79618c..e488760eb 100644 --- a/test/qt/file_provider/test_Downloader.cpp +++ b/test/qt/file_provider/test_Downloader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for class \ref Downloader - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "Downloader.h" diff --git a/test/qt/file_provider/test_FileProvider.cpp b/test/qt/file_provider/test_FileProvider.cpp index a8656f033..5877a17e1 100644 --- a/test/qt/file_provider/test_FileProvider.cpp +++ b/test/qt/file_provider/test_FileProvider.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "FileProvider.h" diff --git a/test/qt/file_provider/test_UpdatableFile.cpp b/test/qt/file_provider/test_UpdatableFile.cpp index 9519a0e75..b7ad81333 100644 --- a/test/qt/file_provider/test_UpdatableFile.cpp +++ b/test/qt/file_provider/test_UpdatableFile.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "UpdatableFile.h" diff --git a/test/qt/global/test_BuildHelper.cpp b/test/qt/global/test_BuildHelper.cpp index b200b9536..a91ffc35a 100644 --- a/test/qt/global/test_BuildHelper.cpp +++ b/test/qt/global/test_BuildHelper.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref BuildHelper - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "BuildHelper.h" diff --git a/test/qt/global/test_CardReturnCode.cpp b/test/qt/global/test_CardReturnCode.cpp index c7da1014d..ced985beb 100644 --- a/test/qt/global/test_CardReturnCode.cpp +++ b/test/qt/global/test_CardReturnCode.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for return codes. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardReturnCode.h" diff --git a/test/qt/global/test_DeviceInfo.cpp b/test/qt/global/test_DeviceInfo.cpp index 3871530ff..fa762c1a9 100644 --- a/test/qt/global/test_DeviceInfo.cpp +++ b/test/qt/global/test_DeviceInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DeviceInfo - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/global/test_ECardApiResult.cpp b/test/qt/global/test_ECardApiResult.cpp index 888710603..235a793c6 100644 --- a/test/qt/global/test_ECardApiResult.cpp +++ b/test/qt/global/test_ECardApiResult.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "CardReturnCode.h" @@ -57,11 +57,12 @@ class test_ECardApiResult void createInternalError() { - ECardApiResult result = ECardApiResult(GlobalStatus::Code::Workflow_Cannot_Confirm_IdCard_Authenticity); + ECardApiResult result = ECardApiResult(GlobalStatus::Code::Workflow_Cannot_Confirm_IdCard_Authenticity, FailureCode::Reason::Change_Pin_User_Cancelled); QCOMPARE(result.getMajor(), ECardApiResult::Major::Error); QCOMPARE(result.getMinor(), ECardApiResult::Minor::AL_Internal_Error); QCOMPARE(result.getMessage(), QString("The authenticity of your ID card could not be confirmed.")); QCOMPARE(result.getMessageLang(), QString("en")); + QCOMPARE(result.getFailureCode(), FailureCode::Reason::Change_Pin_User_Cancelled); } @@ -72,6 +73,7 @@ class test_ECardApiResult QCOMPARE(result.getMinor(), ECardApiResult::Minor::null); QCOMPARE(result.getMessage(), QString()); QCOMPARE(result.getMessageLang(), QString("en")); + QCOMPARE(result.getFailureCode(), std::optional()); } @@ -111,6 +113,13 @@ class test_ECardApiResult QCOMPARE(logSpy.count(), 1); param = logSpy.takeFirst(); QVERIFY(param.at(0).toString().contains("Result: \"http://www.bsi.bund.de/ecard/api/1.1/resultmajor#error | http://www.bsi.bund.de/ecard/api/1.1/resultminor/il/signature#invalidCertificatePath | Pre-verification failed.\"")); + + logSpy.clear(); + + qDebug() << ECardApiResult(GlobalStatus::Code::Card_Cancellation_By_User, FailureCode::Reason::Change_Pin_User_Cancelled); + QCOMPARE(logSpy.count(), 1); + param = logSpy.takeFirst(); + QVERIFY(param.at(0).toString().contains("Result: \"http://www.bsi.bund.de/ecard/api/1.1/resultmajor#error | http://www.bsi.bund.de/ecard/api/1.1/resultminor/sal#cancellationByUser | The process has been cancelled by the card reader. | Change_Pin_User_Cancelled\"")); } @@ -132,6 +141,13 @@ class test_ECardApiResult "\"message\":\"The selected card reader cannot be accessed anymore.\"," "\"minor\":\"http://www.bsi.bund.de/ecard/api/1.1/resultminor/al/common#communicationError\"}"; QCOMPARE(bytes(ECardApiResult(GlobalStatus::Code::Workflow_Reader_Became_Inaccessible).toJson()), expected); + + expected = "{\"description\":\"The process has been cancelled.\"," + "\"language\":\"en\",\"major\":\"http://www.bsi.bund.de/ecard/api/1.1/resultmajor#error\"," + "\"message\":\"The process has been cancelled by the card reader.\"," + "\"minor\":\"http://www.bsi.bund.de/ecard/api/1.1/resultminor/sal#cancellationByUser\"," + "\"reason\":\"Change_Pin_User_Cancelled\"}"; + QCOMPARE(bytes(ECardApiResult(GlobalStatus::Code::Card_Cancellation_By_User, FailureCode::Reason::Change_Pin_User_Cancelled).toJson()), expected); } @@ -337,7 +353,7 @@ class test_ECardApiResult QTest::newRow("keyGenerationNotPossible") << ECardApiResult::Minor::KEY_KeyGenerationNotPossible << tr("Signature certificate key generation is not possible."); QTest::newRow("cancellationByUser") << ECardApiResult::Minor::SAL_Cancellation_by_User << tr("The process has been cancelled."); QTest::newRow("invalidCertificatePath") << ECardApiResult::Minor::IL_Signature_InvalidCertificatePath << tr("One or more certificate checks failed. The operation will be aborted due to security reasons."); - QTest::newRow("invalidKey") << ECardApiResult::Minor::SAL_Invalid_Key << tr("This action cannot be performed. The online identification function of your ID card is not activated."); + QTest::newRow("invalidKey") << ECardApiResult::Minor::SAL_Invalid_Key << tr("This action cannot be performed. The eID function of your ID card is not activated."); QTest::newRow("securityConditionNotSatisfied") << ECardApiResult::Minor::SAL_SecurityConditionNotSatisfied << tr("The authenticity of your ID card could not be verified. Please make sure that you are using a genuine ID card. Please note that test applications require the use of a test ID card."); QTest::newRow("ageVerificationFailed") << ECardApiResult::Minor::SAL_MEAC_AgeVerificationFailedWarning << tr("The age verification failed."); QTest::newRow("comunityVerificationFailed") << ECardApiResult::Minor::SAL_MEAC_CommunityVerificationFailedWarning << tr("The community verification failed."); diff --git a/test/qt/global/test_EnumHelper.cpp b/test/qt/global/test_EnumHelper.cpp index d541b0411..c4af81767 100644 --- a/test/qt/global/test_EnumHelper.cpp +++ b/test/qt/global/test_EnumHelper.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for EnumHelper. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "EnumHelper.h" diff --git a/test/qt/global/test_Env.cpp b/test/qt/global/test_Env.cpp index 40299d026..d12a2dfb2 100644 --- a/test/qt/global/test_Env.cpp +++ b/test/qt/global/test_Env.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Env - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "Env.h" @@ -423,6 +425,20 @@ class test_Env } + void sharedNoSpawn() + { + { + auto orig = Env::getShared(); + QVERIFY(orig); + + auto orig2 = Env::getShared(true); + QVERIFY(orig == orig2); + } + + QVERIFY(!Env::getShared(false)); + } + + void testAbstractQObjectSingletonIsTheSamePointer() { TestAbstractQObjectSingleton* ptr = Env::getSingleton(); diff --git a/test/qt/global/test_FailureCode.cpp b/test/qt/global/test_FailureCode.cpp new file mode 100644 index 000000000..ca6b1f0a1 --- /dev/null +++ b/test/qt/global/test_FailureCode.cpp @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + +/*! + * \brief Unit tests for \ref FailureCode. + */ + +#include "FailureCode.h" + +#include + +using namespace governikus; + + +Q_DECLARE_METATYPE(FailureCode::FailureInfoMap) + + +class test_FailureCode + : public QObject +{ + Q_OBJECT + + private Q_SLOTS: + void test_getReason() + { + FailureCode failureCode(FailureCode::Reason::User_Cancelled); + QCOMPARE(failureCode.getReason(), FailureCode::Reason::User_Cancelled); + } + + + void test_isEqual() + { + const FailureCode failureCode {FailureCode::Reason::User_Cancelled}; + const FailureCode comparisonCode {FailureCode::Reason::Card_Removed}; + + QVERIFY(failureCode == failureCode); + QVERIFY(failureCode != comparisonCode); + } + + + void test_getFailureInfoMap_data() + { + QTest::addColumn("failureInfoMap"); + + QTest::newRow("Empty") << FailureCode::FailureInfoMap(); + QTest::newRow("One entry") << FailureCode::FailureInfoMap({ + {FailureCode::Info::State_Name, "MyStateName"} + }); + QTest::newRow("Two entries") << FailureCode::FailureInfoMap({ + {FailureCode::Info::State_Name, "MyStateName"}, + {FailureCode::Info::Card_Return_Code, "MyReturnCode"} + }); + } + + + void test_getFailureInfoMap() + { + QFETCH(FailureCode::FailureInfoMap, failureInfoMap); + const FailureCode failureCode {FailureCode::Reason::User_Cancelled, failureInfoMap}; + + QVERIFY(failureCode.getFailureInfoMap() == failureInfoMap); + } + + +}; + +QTEST_GUILESS_MAIN(test_FailureCode) +#include "test_FailureCode.moc" diff --git a/test/qt/global/test_FileDestination.cpp b/test/qt/global/test_FileDestination.cpp index 7419a0a91..342ad7c79 100644 --- a/test/qt/global/test_FileDestination.cpp +++ b/test/qt/global/test_FileDestination.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref FileDestination - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "FileDestination.h" diff --git a/test/qt/global/test_FuncUtils.cpp b/test/qt/global/test_FuncUtils.cpp index 15c294c72..2a9686a30 100644 --- a/test/qt/global/test_FuncUtils.cpp +++ b/test/qt/global/test_FuncUtils.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref FuncUtils - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "FuncUtils.h" diff --git a/test/qt/global/test_GlobalStatus.cpp b/test/qt/global/test_GlobalStatus.cpp index 1e98289fe..3b05020bb 100644 --- a/test/qt/global/test_GlobalStatus.cpp +++ b/test/qt/global/test_GlobalStatus.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref GlobalStatus. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "GlobalStatus.h" diff --git a/test/qt/global/test_LanguageLoader.cpp b/test/qt/global/test_LanguageLoader.cpp index 20ccf3686..8acb87886 100644 --- a/test/qt/global/test_LanguageLoader.cpp +++ b/test/qt/global/test_LanguageLoader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref LanguageLoader - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "LanguageLoader.h" diff --git a/test/qt/global/test_LogHandler.cpp b/test/qt/global/test_LogHandler.cpp index 4403047bd..cb6dfe095 100644 --- a/test/qt/global/test_LogHandler.cpp +++ b/test/qt/global/test_LogHandler.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref LogHandler - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "LogHandler.h" diff --git a/test/qt/global/test_Randomizer.cpp b/test/qt/global/test_Randomizer.cpp index ee110c0c8..850d7bf51 100644 --- a/test/qt/global/test_Randomizer.cpp +++ b/test/qt/global/test_Randomizer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Randomizer - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "Randomizer.h" diff --git a/test/qt/global/test_ResourceLoader.cpp b/test/qt/global/test_ResourceLoader.cpp index 7f40cd711..2d116edfb 100644 --- a/test/qt/global/test_ResourceLoader.cpp +++ b/test/qt/global/test_ResourceLoader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ResourceLoader - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ResourceLoader.h" diff --git a/test/qt/global/test_VersionInfo.cpp b/test/qt/global/test_VersionInfo.cpp index fa8185838..9b5c7f2db 100644 --- a/test/qt/global/test_VersionInfo.cpp +++ b/test/qt/global/test_VersionInfo.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/global/test_VersionNumber.cpp b/test/qt/global/test_VersionNumber.cpp index d729fed93..ffae6ae20 100644 --- a/test/qt/global/test_VersionNumber.cpp +++ b/test/qt/global/test_VersionNumber.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref VersionNumber. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "VersionNumber.h" diff --git a/test/qt/ifd/local/test_LocalTlsServer.cpp b/test/qt/ifd/local/test_LocalTlsServer.cpp index c7574fdf7..075115790 100644 --- a/test/qt/ifd/local/test_LocalTlsServer.cpp +++ b/test/qt/ifd/local/test_LocalTlsServer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref LocalTlsServer - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalTlsServer.h" diff --git a/test/qt/ifd/local/test_LocalWebSocketServer.cpp b/test/qt/ifd/local/test_LocalWebSocketServer.cpp index f9d557d48..e74a3ec41 100644 --- a/test/qt/ifd/local/test_LocalWebSocketServer.cpp +++ b/test/qt/ifd/local/test_LocalWebSocketServer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref LocalWebSocketServer - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "LocalWebSocketServer.h" diff --git a/test/qt/ifd/messages/test_Discovery.cpp b/test/qt/ifd/messages/test_Discovery.cpp index 93a0a0363..abc59e5bf 100644 --- a/test/qt/ifd/messages/test_Discovery.cpp +++ b/test/qt/ifd/messages/test_Discovery.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/Discovery.h" diff --git a/test/qt/ifd/messages/test_IfdConnect.cpp b/test/qt/ifd/messages/test_IfdConnect.cpp index 0f02fc3d2..c45c00ec2 100644 --- a/test/qt/ifd/messages/test_IfdConnect.cpp +++ b/test/qt/ifd/messages/test_IfdConnect.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdConnect.h" diff --git a/test/qt/ifd/messages/test_IfdConnectResponse.cpp b/test/qt/ifd/messages/test_IfdConnectResponse.cpp index 757a14bff..012ae06e5 100644 --- a/test/qt/ifd/messages/test_IfdConnectResponse.cpp +++ b/test/qt/ifd/messages/test_IfdConnectResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdConnectResponse.h" diff --git a/test/qt/ifd/messages/test_IfdDisconnect.cpp b/test/qt/ifd/messages/test_IfdDisconnect.cpp index 2c8c097c7..1b6894d65 100644 --- a/test/qt/ifd/messages/test_IfdDisconnect.cpp +++ b/test/qt/ifd/messages/test_IfdDisconnect.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdDisconnect.h" diff --git a/test/qt/ifd/messages/test_IfdDisconnectResponse.cpp b/test/qt/ifd/messages/test_IfdDisconnectResponse.cpp index eac6621cf..ae5d4c65e 100644 --- a/test/qt/ifd/messages/test_IfdDisconnectResponse.cpp +++ b/test/qt/ifd/messages/test_IfdDisconnectResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdDisconnectResponse.h" diff --git a/test/qt/ifd/messages/test_IfdError.cpp b/test/qt/ifd/messages/test_IfdError.cpp index ed1810785..a3634cd29 100644 --- a/test/qt/ifd/messages/test_IfdError.cpp +++ b/test/qt/ifd/messages/test_IfdError.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdError.h" diff --git a/test/qt/ifd/messages/test_IfdEstablishContext.cpp b/test/qt/ifd/messages/test_IfdEstablishContext.cpp index b241055dc..68a088d6a 100644 --- a/test/qt/ifd/messages/test_IfdEstablishContext.cpp +++ b/test/qt/ifd/messages/test_IfdEstablishContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdEstablishContext.h" diff --git a/test/qt/ifd/messages/test_IfdEstablishContextResponse.cpp b/test/qt/ifd/messages/test_IfdEstablishContextResponse.cpp index 276ff8e1d..962135146 100644 --- a/test/qt/ifd/messages/test_IfdEstablishContextResponse.cpp +++ b/test/qt/ifd/messages/test_IfdEstablishContextResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdEstablishContextResponse.h" diff --git a/test/qt/ifd/messages/test_IfdEstablishPaceChannel.cpp b/test/qt/ifd/messages/test_IfdEstablishPaceChannel.cpp index c7446355c..629efe742 100644 --- a/test/qt/ifd/messages/test_IfdEstablishPaceChannel.cpp +++ b/test/qt/ifd/messages/test_IfdEstablishPaceChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdEstablishPaceChannel.h" diff --git a/test/qt/ifd/messages/test_IfdEstablishPaceChannelResponse.cpp b/test/qt/ifd/messages/test_IfdEstablishPaceChannelResponse.cpp index 3f58fc4c8..476810bcc 100644 --- a/test/qt/ifd/messages/test_IfdEstablishPaceChannelResponse.cpp +++ b/test/qt/ifd/messages/test_IfdEstablishPaceChannelResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdEstablishPaceChannelResponse.h" diff --git a/test/qt/ifd/messages/test_IfdGetStatus.cpp b/test/qt/ifd/messages/test_IfdGetStatus.cpp index e130b8299..a2c278fa0 100644 --- a/test/qt/ifd/messages/test_IfdGetStatus.cpp +++ b/test/qt/ifd/messages/test_IfdGetStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdGetStatus.h" diff --git a/test/qt/ifd/messages/test_IfdMessage.cpp b/test/qt/ifd/messages/test_IfdMessage.cpp index 6a283150f..1ef5b7f9a 100644 --- a/test/qt/ifd/messages/test_IfdMessage.cpp +++ b/test/qt/ifd/messages/test_IfdMessage.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdMessage.h" diff --git a/test/qt/ifd/messages/test_IfdMessageResponse.cpp b/test/qt/ifd/messages/test_IfdMessageResponse.cpp index 0070b39f1..374d3b4d4 100644 --- a/test/qt/ifd/messages/test_IfdMessageResponse.cpp +++ b/test/qt/ifd/messages/test_IfdMessageResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdMessageResponse.h" diff --git a/test/qt/ifd/messages/test_IfdModifyPin.cpp b/test/qt/ifd/messages/test_IfdModifyPin.cpp index beba0f63b..41f1efcba 100644 --- a/test/qt/ifd/messages/test_IfdModifyPin.cpp +++ b/test/qt/ifd/messages/test_IfdModifyPin.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdModifyPin.h" diff --git a/test/qt/ifd/messages/test_IfdModifyPinResponse.cpp b/test/qt/ifd/messages/test_IfdModifyPinResponse.cpp index 4609018e3..30a6428fd 100644 --- a/test/qt/ifd/messages/test_IfdModifyPinResponse.cpp +++ b/test/qt/ifd/messages/test_IfdModifyPinResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdModifyPinResponse.h" diff --git a/test/qt/ifd/messages/test_IfdStatus.cpp b/test/qt/ifd/messages/test_IfdStatus.cpp index f48c2c377..35659470e 100644 --- a/test/qt/ifd/messages/test_IfdStatus.cpp +++ b/test/qt/ifd/messages/test_IfdStatus.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdStatus.h" diff --git a/test/qt/ifd/messages/test_IfdTransmit.cpp b/test/qt/ifd/messages/test_IfdTransmit.cpp index 2000b4dea..58421a1a0 100644 --- a/test/qt/ifd/messages/test_IfdTransmit.cpp +++ b/test/qt/ifd/messages/test_IfdTransmit.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdTransmit.h" diff --git a/test/qt/ifd/messages/test_IfdTransmitResponse.cpp b/test/qt/ifd/messages/test_IfdTransmitResponse.cpp index ad769b4f3..b56a436b3 100644 --- a/test/qt/ifd/messages/test_IfdTransmitResponse.cpp +++ b/test/qt/ifd/messages/test_IfdTransmitResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdTransmitResponse.h" diff --git a/test/qt/ifd/messages/test_IfdVersion.cpp b/test/qt/ifd/messages/test_IfdVersion.cpp index 0a2fe367c..3c2ff208d 100644 --- a/test/qt/ifd/messages/test_IfdVersion.cpp +++ b/test/qt/ifd/messages/test_IfdVersion.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/IfdVersion.h" diff --git a/test/qt/ifd/remote/test_RemoteIfdClient.cpp b/test/qt/ifd/remote/test_RemoteIfdClient.cpp index fdfbbb07b..849ca415a 100644 --- a/test/qt/ifd/remote/test_RemoteIfdClient.cpp +++ b/test/qt/ifd/remote/test_RemoteIfdClient.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteIfdClient.h" diff --git a/test/qt/ifd/remote/test_RemoteIfdReaderManagerPlugin.cpp b/test/qt/ifd/remote/test_RemoteIfdReaderManagerPlugin.cpp index 0ec4015c3..4b2e81f5b 100644 --- a/test/qt/ifd/remote/test_RemoteIfdReaderManagerPlugin.cpp +++ b/test/qt/ifd/remote/test_RemoteIfdReaderManagerPlugin.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RemoteIfdReaderManagerPlugIn - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteIfdReaderManagerPlugIn.h" diff --git a/test/qt/ifd/remote/test_RemoteIfdServer.cpp b/test/qt/ifd/remote/test_RemoteIfdServer.cpp index cd9685c79..9ae1000b3 100644 --- a/test/qt/ifd/remote/test_RemoteIfdServer.cpp +++ b/test/qt/ifd/remote/test_RemoteIfdServer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RemoteServerImpl - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteIfdServer.h" diff --git a/test/qt/ifd/remote/test_RemoteReaderAdvertiser.cpp b/test/qt/ifd/remote/test_RemoteReaderAdvertiser.cpp index 9a5e72d1a..e1cd78291 100644 --- a/test/qt/ifd/remote/test_RemoteReaderAdvertiser.cpp +++ b/test/qt/ifd/remote/test_RemoteReaderAdvertiser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RemoteReaderAdvertiserImpl - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteReaderAdvertiser.h" @@ -13,6 +15,19 @@ #include #include +namespace governikus +{ + + +template<> RemoteReaderAdvertiser* createNewObject(const QString& pIfdName, const QString& pIfdId, quint16& pPort, int& pTimerInterval, bool& pPairing) +{ + return new RemoteReaderAdvertiserImpl(pIfdName, pIfdId, pPort, pTimerInterval, pPairing); +} + + +} // namespace governikus + + using namespace governikus; @@ -22,15 +37,16 @@ class DatagramHandlerMock Q_OBJECT public: + QByteArrayList mList; + [[nodiscard]] bool isBound() const override; void send(const QByteArray& pData) override { - Q_EMIT fireSend(pData); + mList << pData; } - Q_SIGNALS: - void fireSend(const QByteArray& pData); + }; @@ -64,19 +80,6 @@ class test_RemoteReaderAdvertiser } - void advertisePeriodically() - { - const QString ifdName("ServerName"); - const QString ifdId("0123456789ABCDEF"); - quint16 port = 12345; - int pTimerInterval = 100; - - QSignalSpy spy(mMock.data(), &DatagramHandlerMock::fireSend); - QScopedPointer advertiser(Env::create(ifdName, ifdId, port, pTimerInterval)); - QTRY_COMPARE(spy.count(), 5); // clazy:exclude=qstring-allocations - } - - void checkBroadcast_data() { QTest::addColumn("pairing"); @@ -92,16 +95,14 @@ class test_RemoteReaderAdvertiser const QString ifdName("ServerName"); const QString ifdId("0123456789ABCDEF"); quint16 port = 12345; - int pTimerInterval = 100; + int pTimerInterval = 99999; - QSignalSpy spy(mMock.data(), &DatagramHandlerMock::fireSend); - QScopedPointer advertiser(Env::create(ifdName, ifdId, port, pTimerInterval)); - advertiser->setPairing(pairing); - QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations - advertiser.reset(); + QScopedPointer advertiser(Env::create(ifdName, ifdId, port, pTimerInterval, pairing)); + QTRY_COMPARE(mMock->mList.size(), 1); // clazy:exclude=qstring-allocations - const auto& byteArray = spy.at(0).at(0).toByteArray(); - const auto& offerMsg = Discovery(QJsonDocument::fromJson(byteArray).object()); + const auto data = mMock->mList.at(0); + advertiser.reset(); + const auto& offerMsg = Discovery(QJsonDocument::fromJson(data).object()); QCOMPARE(offerMsg.getIfdName(), ifdName); QCOMPARE(offerMsg.getIfdId(), ifdId); diff --git a/test/qt/ifd/remote/test_RemoteTlsServer.cpp b/test/qt/ifd/remote/test_RemoteTlsServer.cpp index 490731fce..6e431255c 100644 --- a/test/qt/ifd/remote/test_RemoteTlsServer.cpp +++ b/test/qt/ifd/remote/test_RemoteTlsServer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RemoteTlsServer - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteTlsServer.h" diff --git a/test/qt/ifd/remote/test_RemoteWebSocketServer.cpp b/test/qt/ifd/remote/test_RemoteWebSocketServer.cpp index 53d5626f3..7cd8b282c 100644 --- a/test/qt/ifd/remote/test_RemoteWebSocketServer.cpp +++ b/test/qt/ifd/remote/test_RemoteWebSocketServer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RemoteWebSocketServer - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteWebSocketServerImpl.h" diff --git a/test/qt/ifd/test_IfdConnector.cpp b/test/qt/ifd/test_IfdConnector.cpp index ed6585e79..a3ce401c6 100644 --- a/test/qt/ifd/test_IfdConnector.cpp +++ b/test/qt/ifd/test_IfdConnector.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref IfdConnector - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdConnectorImpl.h" diff --git a/test/qt/ifd/test_IfdDescriptor.cpp b/test/qt/ifd/test_IfdDescriptor.cpp index 6a71c947e..da70d39f2 100644 --- a/test/qt/ifd/test_IfdDescriptor.cpp +++ b/test/qt/ifd/test_IfdDescriptor.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdDescriptor.h" diff --git a/test/qt/ifd/test_IfdDispatcher.cpp b/test/qt/ifd/test_IfdDispatcher.cpp index 4f571bbe9..412ed370c 100644 --- a/test/qt/ifd/test_IfdDispatcher.cpp +++ b/test/qt/ifd/test_IfdDispatcher.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref IfdDispatcher - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdDispatcherClient.h" diff --git a/test/qt/ifd/test_IfdListImpl.cpp b/test/qt/ifd/test_IfdListImpl.cpp index afa6537b5..de9f26501 100644 --- a/test/qt/ifd/test_IfdListImpl.cpp +++ b/test/qt/ifd/test_IfdListImpl.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "IfdList.h" diff --git a/test/qt/ifd/test_ServerMessageHandler.cpp b/test/qt/ifd/test_ServerMessageHandler.cpp index edf74e952..0bae9449f 100644 --- a/test/qt/ifd/test_ServerMessageHandler.cpp +++ b/test/qt/ifd/test_ServerMessageHandler.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ServerMessageHandlerImpl - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ServerMessageHandler.h" diff --git a/test/qt/network/test_DatagramHandlerImpl.cpp b/test/qt/network/test_DatagramHandlerImpl.cpp index 2b8356068..7b73361dc 100644 --- a/test/qt/network/test_DatagramHandlerImpl.cpp +++ b/test/qt/network/test_DatagramHandlerImpl.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DatagramHandlerImpl - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "DatagramHandlerImpl.h" @@ -71,11 +73,9 @@ class test_DatagramHandlerImpl #ifdef Q_OS_WIN QSKIP("Windows does not block privileged ports"); #elif defined(Q_OS_LINUX) - const auto portStart = TestFileHelper::getUnprivilegedPortStart(); - QVERIFY(portStart != -1); - if (portStart <= HttpServer::cPort) + if (TestFileHelper::systemAllowsPort(HttpServer::cPort)) { - QSKIP("Cannot check privileged port"); + QSKIP("Cannot check, privileged port allowed."); } #endif diff --git a/test/qt/network/test_HttpRequest.cpp b/test/qt/network/test_HttpRequest.cpp index a9b34871b..7c4274ae0 100644 --- a/test/qt/network/test_HttpRequest.cpp +++ b/test/qt/network/test_HttpRequest.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref HttpResponse - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpRequest.h" diff --git a/test/qt/network/test_HttpResponse.cpp b/test/qt/network/test_HttpResponse.cpp index 0a721da7f..0b7266d28 100644 --- a/test/qt/network/test_HttpResponse.cpp +++ b/test/qt/network/test_HttpResponse.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref HttpResponse - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpResponse.h" diff --git a/test/qt/network/test_HttpServer.cpp b/test/qt/network/test_HttpServer.cpp index 4857b522c..791f2badb 100644 --- a/test/qt/network/test_HttpServer.cpp +++ b/test/qt/network/test_HttpServer.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref HttpResponse - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpServer.h" @@ -56,8 +58,8 @@ class test_HttpServer QVERIFY(server->isListening()); QCOMPARE(logSpy.count(), 3); - QVERIFY(server->boundAddresses() > 0); - QVERIFY(server->boundAddresses() < 3); + QVERIFY(server->boundAddresses().size() > 0); + QVERIFY(server->boundAddresses().size() < 3); auto param = logSpy.takeFirst(); QVERIFY(param.at(0).toString().contains("Spawn shared instance: governikus::HttpServer")); @@ -67,7 +69,7 @@ class test_HttpServer const auto listeningLogPattern = QStringLiteral("Listening on port: "); // IPv4 and IPv6 are available on test system - if (server->boundAddresses() == 2) + if (server->boundAddresses().size() == 2) { QVERIFY(listenPort.contains(listeningLogPattern)); @@ -78,7 +80,7 @@ class test_HttpServer param = logSpy.takeFirst(); QVERIFY(param.at(0).toString().contains(listeningLogPattern + matcher.captured(1))); } - else if (server->boundAddresses() == 1) + else if (server->boundAddresses().size() == 1) { // Only IPv4 OR IPv6 is available... let 's just that at least one was successful. const auto notAvailableLogPattern = QStringLiteral("The address is not available"); @@ -113,11 +115,9 @@ class test_HttpServer #ifdef Q_OS_WIN QSKIP("Windows does not block privileged ports"); #elif defined(Q_OS_LINUX) - const auto portStart = TestFileHelper::getUnprivilegedPortStart(); - QVERIFY(portStart != -1); - if (portStart <= HttpServer::cPort) + if (TestFileHelper::systemAllowsPort(HttpServer::cPort)) { - QSKIP("Cannot check privileged port"); + QSKIP("Cannot check, privileged port allowed."); } #endif @@ -248,7 +248,7 @@ class test_HttpServer QSignalSpy logSpy(Env::getSingleton()->getEventHandler(), &LogEventHandler::fireLog); HttpServer server(existingServer.serverPort()); QVERIFY(!server.isListening()); - QCOMPARE(server.boundAddresses(), 0); + QCOMPARE(server.boundAddresses().size(), 0); auto param = logSpy.takeFirst(); QVERIFY(param.at(0).toString().contains(QLatin1String("Cannot start server: \"The bound address is already in use"))); diff --git a/test/qt/network/test_HttpServerRequestor.cpp b/test/qt/network/test_HttpServerRequestor.cpp index dfbee552f..55cdf2284 100644 --- a/test/qt/network/test_HttpServerRequestor.cpp +++ b/test/qt/network/test_HttpServerRequestor.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "HttpServerRequestor.h" diff --git a/test/qt/network/test_NetworkManager.cpp b/test/qt/network/test_NetworkManager.cpp index dde34b8fb..a7c8f016d 100644 --- a/test/qt/network/test_NetworkManager.cpp +++ b/test/qt/network/test_NetworkManager.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref NetworkManager - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "NetworkManager.h" diff --git a/test/qt/network/test_PortFile.cpp b/test/qt/network/test_PortFile.cpp index 1be86fa4e..a35d43a4e 100644 --- a/test/qt/network/test_PortFile.cpp +++ b/test/qt/network/test_PortFile.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PortFile - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "PortFile.h" diff --git a/test/qt/network/test_Template.cpp b/test/qt/network/test_Template.cpp index 543cddc81..836302d0c 100644 --- a/test/qt/network/test_Template.cpp +++ b/test/qt/network/test_Template.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref Template - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "Template.h" diff --git a/test/qt/network/test_TlsChecker.cpp b/test/qt/network/test_TlsChecker.cpp index 4d04bbde2..bb23f6b0c 100644 --- a/test/qt/network/test_TlsChecker.cpp +++ b/test/qt/network/test_TlsChecker.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CertificateChecker - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "TlsChecker.h" diff --git a/test/qt/network/test_UrlUtil.cpp b/test/qt/network/test_UrlUtil.cpp index 7d23d900e..6a36477c1 100644 --- a/test/qt/network/test_UrlUtil.cpp +++ b/test/qt/network/test_UrlUtil.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UrlUtil - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "UrlUtil.h" diff --git a/test/qt/network/test_WifiInfo.cpp b/test/qt/network/test_WifiInfo.cpp index aa9120aab..e647e0278 100644 --- a/test/qt/network/test_WifiInfo.cpp +++ b/test/qt/network/test_WifiInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref WifiInfo - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "WifiInfo.h" diff --git a/test/qt/secure_storage/test_SecureStorage.cpp b/test/qt/secure_storage/test_SecureStorage.cpp index 3217b7760..2e8e81a3c 100644 --- a/test/qt/secure_storage/test_SecureStorage.cpp +++ b/test/qt/secure_storage/test_SecureStorage.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SecureStorage - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SecureStorage.h" diff --git a/test/qt/secure_storage/test_TlsConfiguration.cpp b/test/qt/secure_storage/test_TlsConfiguration.cpp index 17f27eeee..ca4cfe562 100644 --- a/test/qt/secure_storage/test_TlsConfiguration.cpp +++ b/test/qt/secure_storage/test_TlsConfiguration.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref TlsConfiguration - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "TlsConfiguration.h" diff --git a/test/qt/services/test_AppUpdatData.cpp b/test/qt/services/test_AppUpdatData.cpp index ef71a1ba2..6d5b3451d 100644 --- a/test/qt/services/test_AppUpdatData.cpp +++ b/test/qt/services/test_AppUpdatData.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref AppUpdateData - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "AppUpdateData.h" diff --git a/test/qt/services/test_AppUpdatr.cpp b/test/qt/services/test_AppUpdatr.cpp index 3584d4dc2..f19478e14 100644 --- a/test/qt/services/test_AppUpdatr.cpp +++ b/test/qt/services/test_AppUpdatr.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref AppUpdater - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "AppUpdater.h" diff --git a/test/qt/settings/test_Backup.mm b/test/qt/settings/test_Backup.mm index d36baba6d..cb219c54e 100644 --- a/test/qt/settings/test_Backup.mm +++ b/test/qt/settings/test_Backup.mm @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "Backup.h" diff --git a/test/qt/settings/test_GeneralSettings.cpp b/test/qt/settings/test_GeneralSettings.cpp index e5216b6c2..8e2be1abf 100644 --- a/test/qt/settings/test_GeneralSettings.cpp +++ b/test/qt/settings/test_GeneralSettings.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref GeneralSettings - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "GeneralSettings.h" diff --git a/test/qt/settings/test_HistorySettings.cpp b/test/qt/settings/test_HistorySettings.cpp index 997c6f36a..e103a9efc 100644 --- a/test/qt/settings/test_HistorySettings.cpp +++ b/test/qt/settings/test_HistorySettings.cpp @@ -1,10 +1,12 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for History. * * All tests end with _QTEST to be able to identify them later. * All original history entry from AusweisApp2 do not have this. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "HistorySettings.h" diff --git a/test/qt/settings/test_KeyPair.cpp b/test/qt/settings/test_KeyPair.cpp index 4253f15fa..570330d22 100644 --- a/test/qt/settings/test_KeyPair.cpp +++ b/test/qt/settings/test_KeyPair.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CertificateGenerator - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "KeyPair.h" diff --git a/test/qt/settings/test_PreVerificationSettings.cpp b/test/qt/settings/test_PreVerificationSettings.cpp index 0f1e50b8f..c59e42963 100644 --- a/test/qt/settings/test_PreVerificationSettings.cpp +++ b/test/qt/settings/test_PreVerificationSettings.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PreVerificationSettings - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "PreVerificationSettings.h" diff --git a/test/qt/settings/test_RemoteServiceSettings.cpp b/test/qt/settings/test_RemoteServiceSettings.cpp index 9f22f8d72..8dbe07f30 100644 --- a/test/qt/settings/test_RemoteServiceSettings.cpp +++ b/test/qt/settings/test_RemoteServiceSettings.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RemoteSertviceSettings - * - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteServiceSettings.h" diff --git a/test/qt/settings/test_VolatileSettings.cpp b/test/qt/settings/test_VolatileSettings.cpp index 2c84f1076..197e0f2a4 100644 --- a/test/qt/settings/test_VolatileSettings.cpp +++ b/test/qt/settings/test_VolatileSettings.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref VolatileSettings - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "VolatileSettings.h" diff --git a/test/qt/ui/automatic/test_UIPlugInAutomatic.cpp b/test/qt/ui/automatic/test_UIPlugInAutomatic.cpp index 197179188..0713d2f36 100644 --- a/test/qt/ui/automatic/test_UIPlugInAutomatic.cpp +++ b/test/qt/ui/automatic/test_UIPlugInAutomatic.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UIPlugInAutomatic - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInAutomatic.h" diff --git a/test/qt/ui/json/test_Message.cpp b/test/qt/ui/json/test_Message.cpp index aba30e29a..f75adfff5 100644 --- a/test/qt/ui/json/test_Message.cpp +++ b/test/qt/ui/json/test_Message.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MessageDispatcher - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MessageDispatcher.h" diff --git a/test/qt/ui/json/test_MsgContext.cpp b/test/qt/ui/json/test_MsgContext.cpp index 4d250a8d0..2dadd8259 100644 --- a/test/qt/ui/json/test_MsgContext.cpp +++ b/test/qt/ui/json/test_MsgContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgContext - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgContext.h" diff --git a/test/qt/ui/json/test_MsgHandler.cpp b/test/qt/ui/json/test_MsgHandler.cpp index 7e5937b72..9b66dc2dd 100644 --- a/test/qt/ui/json/test_MsgHandler.cpp +++ b/test/qt/ui/json/test_MsgHandler.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandler - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandler.h" diff --git a/test/qt/ui/json/test_MsgHandlerAccessRights.cpp b/test/qt/ui/json/test_MsgHandlerAccessRights.cpp index cbbe0858e..ce6a6682c 100644 --- a/test/qt/ui/json/test_MsgHandlerAccessRights.cpp +++ b/test/qt/ui/json/test_MsgHandlerAccessRights.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerAccessRights - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerAccessRights.h" diff --git a/test/qt/ui/json/test_MsgHandlerApiLevel.cpp b/test/qt/ui/json/test_MsgHandlerApiLevel.cpp index 4ee954207..488516d37 100644 --- a/test/qt/ui/json/test_MsgHandlerApiLevel.cpp +++ b/test/qt/ui/json/test_MsgHandlerApiLevel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerApiLevel - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerApiLevel.h" diff --git a/test/qt/ui/json/test_MsgHandlerAuth.cpp b/test/qt/ui/json/test_MsgHandlerAuth.cpp index 8044b60a2..62c7f877f 100644 --- a/test/qt/ui/json/test_MsgHandlerAuth.cpp +++ b/test/qt/ui/json/test_MsgHandlerAuth.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerAuth - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerAuth.h" diff --git a/test/qt/ui/json/test_MsgHandlerCertificate.cpp b/test/qt/ui/json/test_MsgHandlerCertificate.cpp index b2f0c0e4b..71b0948f3 100644 --- a/test/qt/ui/json/test_MsgHandlerCertificate.cpp +++ b/test/qt/ui/json/test_MsgHandlerCertificate.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerCertificate - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerCertificate.h" diff --git a/test/qt/ui/json/test_MsgHandlerChangePin.cpp b/test/qt/ui/json/test_MsgHandlerChangePin.cpp index b30e5e3b4..61fcb353c 100644 --- a/test/qt/ui/json/test_MsgHandlerChangePin.cpp +++ b/test/qt/ui/json/test_MsgHandlerChangePin.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerChangePin - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerChangePin.h" diff --git a/test/qt/ui/json/test_MsgHandlerEnterCan.cpp b/test/qt/ui/json/test_MsgHandlerEnterCan.cpp index ab5624285..899329bf2 100644 --- a/test/qt/ui/json/test_MsgHandlerEnterCan.cpp +++ b/test/qt/ui/json/test_MsgHandlerEnterCan.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerEnterCan - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerEnterCan.h" diff --git a/test/qt/ui/json/test_MsgHandlerEnterNewPin.cpp b/test/qt/ui/json/test_MsgHandlerEnterNewPin.cpp index c639a72a4..938770ac5 100644 --- a/test/qt/ui/json/test_MsgHandlerEnterNewPin.cpp +++ b/test/qt/ui/json/test_MsgHandlerEnterNewPin.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerEnterNewPin - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerEnterNewPin.h" diff --git a/test/qt/ui/json/test_MsgHandlerEnterPin.cpp b/test/qt/ui/json/test_MsgHandlerEnterPin.cpp index f7da8711e..e8fec98fd 100644 --- a/test/qt/ui/json/test_MsgHandlerEnterPin.cpp +++ b/test/qt/ui/json/test_MsgHandlerEnterPin.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerEnterPin - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerEnterPin.h" diff --git a/test/qt/ui/json/test_MsgHandlerEnterPuk.cpp b/test/qt/ui/json/test_MsgHandlerEnterPuk.cpp index 2edf1bc0c..c801c7b14 100644 --- a/test/qt/ui/json/test_MsgHandlerEnterPuk.cpp +++ b/test/qt/ui/json/test_MsgHandlerEnterPuk.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerEnterPuk - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerEnterPuk.h" diff --git a/test/qt/ui/json/test_MsgHandlerInfo.cpp b/test/qt/ui/json/test_MsgHandlerInfo.cpp index 0f694a7f6..cb7ea4239 100644 --- a/test/qt/ui/json/test_MsgHandlerInfo.cpp +++ b/test/qt/ui/json/test_MsgHandlerInfo.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerInfo - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerInfo.h" diff --git a/test/qt/ui/json/test_MsgHandlerInsertCard.cpp b/test/qt/ui/json/test_MsgHandlerInsertCard.cpp index 8f29b5f27..3b7c7f60b 100644 --- a/test/qt/ui/json/test_MsgHandlerInsertCard.cpp +++ b/test/qt/ui/json/test_MsgHandlerInsertCard.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerInsertCard - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerInsertCard.h" diff --git a/test/qt/ui/json/test_MsgHandlerInternalError.cpp b/test/qt/ui/json/test_MsgHandlerInternalError.cpp index 26d132a41..517b71b15 100644 --- a/test/qt/ui/json/test_MsgHandlerInternalError.cpp +++ b/test/qt/ui/json/test_MsgHandlerInternalError.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerInternalError - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerInternalError.h" diff --git a/test/qt/ui/json/test_MsgHandlerPersonalization.cpp b/test/qt/ui/json/test_MsgHandlerPersonalization.cpp index e5dd42fb4..1d606743c 100644 --- a/test/qt/ui/json/test_MsgHandlerPersonalization.cpp +++ b/test/qt/ui/json/test_MsgHandlerPersonalization.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerPersonalization - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerPersonalization.h" diff --git a/test/qt/ui/json/test_MsgHandlerReader.cpp b/test/qt/ui/json/test_MsgHandlerReader.cpp index 98cd5ce57..da5a597b8 100644 --- a/test/qt/ui/json/test_MsgHandlerReader.cpp +++ b/test/qt/ui/json/test_MsgHandlerReader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerReader - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerReader.h" diff --git a/test/qt/ui/json/test_MsgHandlerReaderList.cpp b/test/qt/ui/json/test_MsgHandlerReaderList.cpp index 8bbef0b6f..d05a5cbce 100644 --- a/test/qt/ui/json/test_MsgHandlerReaderList.cpp +++ b/test/qt/ui/json/test_MsgHandlerReaderList.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerReaderList - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "MessageDispatcher.h" diff --git a/test/qt/ui/json/test_MsgHandlerStatus.cpp b/test/qt/ui/json/test_MsgHandlerStatus.cpp index 448e68741..f7dd8a21b 100644 --- a/test/qt/ui/json/test_MsgHandlerStatus.cpp +++ b/test/qt/ui/json/test_MsgHandlerStatus.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref MsgHandlerStatus - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "messages/MsgHandlerStatus.h" diff --git a/test/qt/ui/json/test_UILoader.cpp b/test/qt/ui/json/test_UILoader.cpp index 5b34f4ff2..d82f9a1b2 100644 --- a/test/qt/ui/json/test_UILoader.cpp +++ b/test/qt/ui/json/test_UILoader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UILoader - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UILoader.h" diff --git a/test/qt/ui/json/test_UIPlugInJson.cpp b/test/qt/ui/json/test_UIPlugInJson.cpp index d8f08402f..476ba0f5b 100644 --- a/test/qt/ui/json/test_UIPlugInJson.cpp +++ b/test/qt/ui/json/test_UIPlugInJson.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UIPlugInJsonApi - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInJson.h" diff --git a/test/qt/ui/proxy/test_RedirectRequest.cpp b/test/qt/ui/proxy/test_RedirectRequest.cpp index 22af272f2..57b9ebc73 100644 --- a/test/qt/ui/proxy/test_RedirectRequest.cpp +++ b/test/qt/ui/proxy/test_RedirectRequest.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "RedirectRequest.h" @@ -45,12 +45,12 @@ class test_RedirectRequest PortFile portFile; portFile.handlePort(123); + QVERIFY(portFile.getFile().exists()); const auto httpRequest = QSharedPointer::create(new MockSocket()); QTest::ignoreMessage(QtDebugMsg, "Redirect to port: 123"); RedirectRequest request(httpRequest); - QCOMPARE(request.mPortWrapper.fetchPort(), 123); } diff --git a/test/qt/ui/proxy/test_UILoader.cpp b/test/qt/ui/proxy/test_UILoader.cpp index dabcb3738..34f6855cc 100644 --- a/test/qt/ui/proxy/test_UILoader.cpp +++ b/test/qt/ui/proxy/test_UILoader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UILoader - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UILoader.h" diff --git a/test/qt/ui/proxy/test_UIPlugInProxy.cpp b/test/qt/ui/proxy/test_UIPlugInProxy.cpp index bb4bad34c..650027ab1 100644 --- a/test/qt/ui/proxy/test_UIPlugInProxy.cpp +++ b/test/qt/ui/proxy/test_UIPlugInProxy.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInProxy.h" diff --git a/test/qt/ui/qml/smart/test_PersonalizationModel.cpp b/test/qt/ui/qml/smart/test_PersonalizationModel.cpp index bdf1faaa7..4f1897463 100644 --- a/test/qt/ui/qml/smart/test_PersonalizationModel.cpp +++ b/test/qt/ui/qml/smart/test_PersonalizationModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PersonalizationModel - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "PersonalizationModel.h" diff --git a/test/qt/ui/qml/smart/test_SmartModel.cpp b/test/qt/ui/qml/smart/test_SmartModel.cpp index 3a5c5d70b..0c70d1587 100644 --- a/test/qt/ui/qml/smart/test_SmartModel.cpp +++ b/test/qt/ui/qml/smart/test_SmartModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SmartModel - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "SmartModel.h" diff --git a/test/qt/ui/qml/test_ApplicationModel.cpp b/test/qt/ui/qml/test_ApplicationModel.cpp index c00b42880..05f0e8cdc 100644 --- a/test/qt/ui/qml/test_ApplicationModel.cpp +++ b/test/qt/ui/qml/test_ApplicationModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ApplicationModel - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "ApplicationModel.h" diff --git a/test/qt/ui/qml/test_AuthModel.cpp b/test/qt/ui/qml/test_AuthModel.cpp index 60eff4a0d..7dfbcac7b 100644 --- a/test/qt/ui/qml/test_AuthModel.cpp +++ b/test/qt/ui/qml/test_AuthModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref AuthModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "AuthModel.h" diff --git a/test/qt/ui/qml/test_CardPositionModel.cpp b/test/qt/ui/qml/test_CardPositionModel.cpp index fbcdb5764..9dbb86c1b 100644 --- a/test/qt/ui/qml/test_CardPositionModel.cpp +++ b/test/qt/ui/qml/test_CardPositionModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CardPositionModel - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "CardPositionModel.h" diff --git a/test/qt/ui/qml/test_CertificateDescriptionModel.cpp b/test/qt/ui/qml/test_CertificateDescriptionModel.cpp index 903731996..8c52fd113 100644 --- a/test/qt/ui/qml/test_CertificateDescriptionModel.cpp +++ b/test/qt/ui/qml/test_CertificateDescriptionModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CertificateDescriptionModel - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "CertificateDescriptionModel.h" diff --git a/test/qt/ui/qml/test_ChangePinModel.cpp b/test/qt/ui/qml/test_ChangePinModel.cpp index 729dd50ca..88f48964d 100644 --- a/test/qt/ui/qml/test_ChangePinModel.cpp +++ b/test/qt/ui/qml/test_ChangePinModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ChangePinModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "ChangePinModel.h" diff --git a/test/qt/ui/qml/test_ChatModel.cpp b/test/qt/ui/qml/test_ChatModel.cpp index e77d348a7..db6acd875 100644 --- a/test/qt/ui/qml/test_ChatModel.cpp +++ b/test/qt/ui/qml/test_ChatModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ChatModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "ChatModel.h" diff --git a/test/qt/ui/qml/test_ConnectivityManager.cpp b/test/qt/ui/qml/test_ConnectivityManager.cpp index adf408ae5..ad5a1dca5 100644 --- a/test/qt/ui/qml/test_ConnectivityManager.cpp +++ b/test/qt/ui/qml/test_ConnectivityManager.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ConnectivityManager - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "ConnectivityManager.h" diff --git a/test/qt/ui/qml/test_FormattedTextModel.cpp b/test/qt/ui/qml/test_FormattedTextModel.cpp index df18da07f..8bc5453c4 100644 --- a/test/qt/ui/qml/test_FormattedTextModel.cpp +++ b/test/qt/ui/qml/test_FormattedTextModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref FormattedTextModel - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "FormattedTextModel.h" diff --git a/test/qt/ui/qml/test_HelpAction.cpp b/test/qt/ui/qml/test_HelpAction.cpp index 3e9e62620..236a636f8 100644 --- a/test/qt/ui/qml/test_HelpAction.cpp +++ b/test/qt/ui/qml/test_HelpAction.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref HelpAction - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" diff --git a/test/qt/ui/qml/test_HistoryModel.cpp b/test/qt/ui/qml/test_HistoryModel.cpp index ac4e0e6d5..1372808c1 100644 --- a/test/qt/ui/qml/test_HistoryModel.cpp +++ b/test/qt/ui/qml/test_HistoryModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref HistoryModel - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "HistoryModel.h" diff --git a/test/qt/ui/qml/test_LogFilterModel.cpp b/test/qt/ui/qml/test_LogFilterModel.cpp index 983353f35..ba9abaf44 100644 --- a/test/qt/ui/qml/test_LogFilterModel.cpp +++ b/test/qt/ui/qml/test_LogFilterModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "LogFilterModel.h" diff --git a/test/qt/ui/qml/test_LogModel.cpp b/test/qt/ui/qml/test_LogModel.cpp index 03729edd8..1d82d9bed 100644 --- a/test/qt/ui/qml/test_LogModel.cpp +++ b/test/qt/ui/qml/test_LogModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref LogModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "LogModel.h" diff --git a/test/qt/ui/qml/test_NotificationModel.cpp b/test/qt/ui/qml/test_NotificationModel.cpp index 827f5c71f..418c2c7c0 100644 --- a/test/qt/ui/qml/test_NotificationModel.cpp +++ b/test/qt/ui/qml/test_NotificationModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref NotificationModel - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "NotificationModel.h" diff --git a/test/qt/ui/qml/test_NumberModel.cpp b/test/qt/ui/qml/test_NumberModel.cpp index ae0571a8d..cfb3f0f8d 100644 --- a/test/qt/ui/qml/test_NumberModel.cpp +++ b/test/qt/ui/qml/test_NumberModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref NumberModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "NumberModel.h" @@ -243,16 +245,13 @@ class test_NumberModel QSharedPointer context(new TestWorkflowContext()); QCOMPARE(mModel->getInputError(), QString()); - QVERIFY(!mModel->hasError()); context->setLastPaceResult(CardReturnCode::OK); mModel->resetContext(context); QCOMPARE(mModel->getInputError(), QString()); - QVERIFY(!mModel->hasError()); context->setLastPaceResult(CardReturnCode::CANCELLATION_BY_USER); QCOMPARE(mModel->getInputError(), QString()); - QVERIFY(!mModel->hasError()); const QSharedPointer worker(new MockCardConnectionWorker()); worker->moveToThread(&connectionThread); @@ -261,25 +260,21 @@ class test_NumberModel context->setLastPaceResult(CardReturnCode::INVALID_PIN); QCOMPARE(mModel->getInputError(), tr("You have entered an incorrect, six-digit ID card PIN. You have two further attempts to enter the correct ID card PIN.")); - QVERIFY(mModel->hasError()); context->setLastPaceResult(CardReturnCode::INVALID_PIN_2); QCOMPARE(mModel->getInputError(), tr("You have entered an incorrect, six-digit ID card PIN twice. " "For a third attempt, the six-digit Card Access Number (CAN) must be entered first. " "You can find your CAN in the bottom right on the front of your ID card.")); - QVERIFY(mModel->hasError()); context->setLastPaceResult(CardReturnCode::INVALID_PIN_3); QCOMPARE(mModel->getInputError(), tr("You have entered an incorrect, six-digit ID card PIN thrice, your ID card PIN is now blocked. " "To remove the block, the ten-digit PUK must be entered first.")); - QVERIFY(mModel->hasError()); context->setLastPaceResult(CardReturnCode::INVALID_CAN); QCOMPARE(mModel->getInputError(), tr("You have entered an incorrect, six-digit Card Access Number (CAN). Please try again.")); context->setLastPaceResult(CardReturnCode::INVALID_PUK); QCOMPARE(mModel->getInputError(), tr("You have entered an incorrect, ten-digit PUK. Please try again.")); - QVERIFY(mModel->hasError()); context->setLastPaceResult(CardReturnCode::UNKNOWN); QCOMPARE(mModel->getInputError(), tr("An unexpected error has occurred during processing.")); @@ -289,7 +284,6 @@ class test_NumberModel tr("A protocol error occurred. Please make sure that your ID card is placed correctly on the card reader and try again. If the problem occurs again, please contact our support at"), LanguageLoader::getLocaleCode(), tr("AusweisApp2 Support"))); - QVERIFY(mModel->hasError()); context.reset(new ChangePinContext(true)); mModel->resetContext(context); @@ -515,24 +509,6 @@ class test_NumberModel context->setEstablishPaceChannel(message); QCOMPARE(mModel->getPasswordType(), passwordType); - - context->changePinLength(); - PasswordType otherType = passwordType; - if (context->isPinChangeWorkflow()) - { - if (passwordType == PasswordType::PIN) - { - otherType = PasswordType::TRANSPORT_PIN; - } - else if (passwordType == PasswordType::TRANSPORT_PIN) - { - otherType = PasswordType::PIN; - } - } - QCOMPARE(mModel->getPasswordType(), otherType); - - context->changePinLength(); - QCOMPARE(mModel->getPasswordType(), passwordType); } diff --git a/test/qt/ui/qml/test_PinResetInformationModel.cpp b/test/qt/ui/qml/test_PinResetInformationModel.cpp index f1220e79b..573ab1753 100644 --- a/test/qt/ui/qml/test_PinResetInformationModel.cpp +++ b/test/qt/ui/qml/test_PinResetInformationModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PinResetInformationModel - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "PinResetInformationModel.h" diff --git a/test/qt/ui/qml/test_ProviderCategoryFilterModel.cpp b/test/qt/ui/qml/test_ProviderCategoryFilterModel.cpp index f7a034694..8b13be3c4 100644 --- a/test/qt/ui/qml/test_ProviderCategoryFilterModel.cpp +++ b/test/qt/ui/qml/test_ProviderCategoryFilterModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProviderCategoryFilterModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderCategoryFilterModel.h" diff --git a/test/qt/ui/qml/test_ProviderModel.cpp b/test/qt/ui/qml/test_ProviderModel.cpp index 45f292e9a..bd139c358 100644 --- a/test/qt/ui/qml/test_ProviderModel.cpp +++ b/test/qt/ui/qml/test_ProviderModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProviderModel - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderModel.h" diff --git a/test/qt/ui/qml/test_ProviderNameFilterModel.cpp b/test/qt/ui/qml/test_ProviderNameFilterModel.cpp index f575def60..013f8e24d 100644 --- a/test/qt/ui/qml/test_ProviderNameFilterModel.cpp +++ b/test/qt/ui/qml/test_ProviderNameFilterModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProviderNameFilterModel - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "ProviderNameFilterModel.h" diff --git a/test/qt/ui/qml/test_ProxyCredentials.cpp b/test/qt/ui/qml/test_ProxyCredentials.cpp index 19c855604..dd13561d3 100644 --- a/test/qt/ui/qml/test_ProxyCredentials.cpp +++ b/test/qt/ui/qml/test_ProxyCredentials.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProxyCredentials - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ProxyCredentials.h" diff --git a/test/qt/ui/qml/test_QmlFileStructure.cpp b/test/qt/ui/qml/test_QmlFileStructure.cpp index 0f3994f80..76ebb616d 100644 --- a/test/qt/ui/qml/test_QmlFileStructure.cpp +++ b/test/qt/ui/qml/test_QmlFileStructure.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "ResourceLoader.h" diff --git a/test/qt/ui/qml/test_ReaderModel.cpp b/test/qt/ui/qml/test_ReaderModel.cpp index b17b09d35..ffa514e3f 100644 --- a/test/qt/ui/qml/test_ReaderModel.cpp +++ b/test/qt/ui/qml/test_ReaderModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2017-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderModel.h" diff --git a/test/qt/ui/qml/test_ReaderScanEnabler.cpp b/test/qt/ui/qml/test_ReaderScanEnabler.cpp index fd680fc7d..965280c35 100644 --- a/test/qt/ui/qml/test_ReaderScanEnabler.cpp +++ b/test/qt/ui/qml/test_ReaderScanEnabler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "ReaderScanEnabler.h" diff --git a/test/qt/ui/qml/test_ReleaseInformationModel.cpp b/test/qt/ui/qml/test_ReleaseInformationModel.cpp index d94051d50..789706932 100644 --- a/test/qt/ui/qml/test_ReleaseInformationModel.cpp +++ b/test/qt/ui/qml/test_ReleaseInformationModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ReleaseInformationModel - * - * \copyright Copyright (c) 2020-2023 Governikus GmbH & Co. KG, Germany */ #include "ReleaseInformationModel.h" diff --git a/test/qt/ui/qml/test_RemoteDeviceModel.cpp b/test/qt/ui/qml/test_RemoteDeviceModel.cpp index e59bd9a15..73fe79908 100644 --- a/test/qt/ui/qml/test_RemoteDeviceModel.cpp +++ b/test/qt/ui/qml/test_RemoteDeviceModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteDeviceModel.h" diff --git a/test/qt/ui/qml/test_RemoteServiceModel.cpp b/test/qt/ui/qml/test_RemoteServiceModel.cpp index 621d0cff4..17bb04396 100644 --- a/test/qt/ui/qml/test_RemoteServiceModel.cpp +++ b/test/qt/ui/qml/test_RemoteServiceModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref ProviderModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "RemoteServiceModel.h" @@ -151,63 +153,6 @@ class test_RemoteServiceModel } - void test_EnableTransportPinLink_data() - { - QTest::addColumn("inputData"); - QTest::addColumn("pinLength"); - QTest::addColumn("enableTransportPinLink"); - - QTest::newRow("default - 0") << EstablishPaceChannel() << 0 << false; - QTest::newRow("default - 5") << EstablishPaceChannel() << 5 << false; - QTest::newRow("default - 6") << EstablishPaceChannel() << 6 << false; - - QTest::newRow("pin - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 0 << true; - QTest::newRow("pin - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 5 << false; - QTest::newRow("pin - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 6 << false; - - QTest::newRow("can - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 0 << false; - QTest::newRow("can - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 5 << false; - QTest::newRow("can - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 6 << false; - - QTest::newRow("puk - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 0 << false; - QTest::newRow("puk - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 5 << false; - QTest::newRow("puk - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 6 << false; - - QTest::newRow("unknown - no cert - 0") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 0 << false; - QTest::newRow("unknown - no cert - 5") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 5 << false; - QTest::newRow("unknown - no cert - 6") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 6 << false; - - QTest::newRow("pin - cert - 0") << createDataToParse(PacePasswordId::PACE_PIN) << 0 << true; - QTest::newRow("pin - cert - 5") << createDataToParse(PacePasswordId::PACE_PIN) << 5 << true; - QTest::newRow("pin - cert - 6") << createDataToParse(PacePasswordId::PACE_PIN) << 6 << true; - - QTest::newRow("can - cert - 0") << createDataToParse(PacePasswordId::PACE_CAN) << 0 << false; - QTest::newRow("can - cert - 5") << createDataToParse(PacePasswordId::PACE_CAN) << 5 << false; - QTest::newRow("can - cert - 6") << createDataToParse(PacePasswordId::PACE_CAN) << 6 << false; - - QTest::newRow("puk - cert - 0") << createDataToParse(PacePasswordId::PACE_PUK) << 0 << false; - QTest::newRow("puk - cert - 5") << createDataToParse(PacePasswordId::PACE_PUK) << 5 << false; - QTest::newRow("puk - cert - 6") << createDataToParse(PacePasswordId::PACE_PUK) << 6 << false; - - QTest::newRow("unknown - cert - 0") << createDataToParse(PacePasswordId::UNKNOWN) << 0 << false; - QTest::newRow("unknown - cert - 5") << createDataToParse(PacePasswordId::UNKNOWN) << 5 << false; - QTest::newRow("unknown - cert - 6") << createDataToParse(PacePasswordId::UNKNOWN) << 6 << false; - } - - - void test_EnableTransportPinLink() - { - QFETCH(EstablishPaceChannel, inputData); - QFETCH(int, pinLength); - QFETCH(bool, enableTransportPinLink); - - mModel->resetRemoteServiceContext(mContext); - QSharedPointer message(new IfdEstablishPaceChannel(QString(), inputData, pinLength)); - mContext->setEstablishPaceChannel(message); - QCOMPARE(mModel->enableTransportPinLink(), enableTransportPinLink); - } - - }; QTEST_MAIN(test_RemoteServiceModel) diff --git a/test/qt/ui/qml/test_SelfAuthModel.cpp b/test/qt/ui/qml/test_SelfAuthModel.cpp index e274d0067..b9932a81c 100644 --- a/test/qt/ui/qml/test_SelfAuthModel.cpp +++ b/test/qt/ui/qml/test_SelfAuthModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SelfAuthModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "SelfAuthModel.h" diff --git a/test/qt/ui/qml/test_SortedReaderModel.cpp b/test/qt/ui/qml/test_SortedReaderModel.cpp index 7be1548c8..4e609a31e 100644 --- a/test/qt/ui/qml/test_SortedReaderModel.cpp +++ b/test/qt/ui/qml/test_SortedReaderModel.cpp @@ -1,5 +1,5 @@ -/* - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/ui/qml/test_UILoader.cpp b/test/qt/ui/qml/test_UILoader.cpp index 05f1501bb..f6ef6cda4 100644 --- a/test/qt/ui/qml/test_UILoader.cpp +++ b/test/qt/ui/qml/test_UILoader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UILoader - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "UILoader.h" diff --git a/test/qt/ui/qml/test_WorkflowModel.cpp b/test/qt/ui/qml/test_WorkflowModel.cpp index 9aa8519c5..25e8a3e3c 100644 --- a/test/qt/ui/qml/test_WorkflowModel.cpp +++ b/test/qt/ui/qml/test_WorkflowModel.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref WorkflowModel - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "WorkflowModel.h" diff --git a/test/qt/ui/scheme/test_CustomSchemeActivationContext.cpp b/test/qt/ui/scheme/test_CustomSchemeActivationContext.cpp index bcc6efdc4..38f349b30 100644 --- a/test/qt/ui/scheme/test_CustomSchemeActivationContext.cpp +++ b/test/qt/ui/scheme/test_CustomSchemeActivationContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CustomSchemeActivationContext - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "CustomSchemeActivationContext.h" diff --git a/test/qt/ui/scheme/test_UIPlugInScheme.cpp b/test/qt/ui/scheme/test_UIPlugInScheme.cpp index a4881e09c..8352f2973 100644 --- a/test/qt/ui/scheme/test_UIPlugInScheme.cpp +++ b/test/qt/ui/scheme/test_UIPlugInScheme.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UIPlugInScheme - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInScheme.h" diff --git a/test/qt/ui/webservice/test_UIPlugInWebService.cpp b/test/qt/ui/webservice/test_UIPlugInWebService.cpp index 60773e529..bee49e5e7 100644 --- a/test/qt/ui/webservice/test_UIPlugInWebService.cpp +++ b/test/qt/ui/webservice/test_UIPlugInWebService.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref WebserviceActivationHandler - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "UIPlugInWebService.h" diff --git a/test/qt/ui/webservice/test_WebserviceActivationContext.cpp b/test/qt/ui/webservice/test_WebserviceActivationContext.cpp index de9acec5c..38ca95c34 100644 --- a/test/qt/ui/webservice/test_WebserviceActivationContext.cpp +++ b/test/qt/ui/webservice/test_WebserviceActivationContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref WebserviceActivationContext - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "WebserviceActivationContext.h" diff --git a/test/qt/whitelist_client/test_SurveyModel.cpp b/test/qt/whitelist_client/test_SurveyModel.cpp index a3fb8f111..340db1a05 100644 --- a/test/qt/whitelist_client/test_SurveyModel.cpp +++ b/test/qt/whitelist_client/test_SurveyModel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "SurveyModel.h" diff --git a/test/qt/workflows/context/test_AccessRightManager.cpp b/test/qt/workflows/context/test_AccessRightManager.cpp index d6d3e1b6a..b55b0b42d 100644 --- a/test/qt/workflows/context/test_AccessRightManager.cpp +++ b/test/qt/workflows/context/test_AccessRightManager.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Test for the chat administration in authentication context. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "VolatileSettings.h" diff --git a/test/qt/workflows/context/test_AuthContext.cpp b/test/qt/workflows/context/test_AuthContext.cpp index b3d203c66..43f8b68a9 100644 --- a/test/qt/workflows/context/test_AuthContext.cpp +++ b/test/qt/workflows/context/test_AuthContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Test for the chat administration in authentication context. - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "context/AuthContext.h" diff --git a/test/qt/workflows/context/test_ChangePinContext.cpp b/test/qt/workflows/context/test_ChangePinContext.cpp index 35c20df3a..4c986c4ed 100644 --- a/test/qt/workflows/context/test_ChangePinContext.cpp +++ b/test/qt/workflows/context/test_ChangePinContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Test for \ref ChangePinContext. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "context/ChangePinContext.h" diff --git a/test/qt/workflows/context/test_WorkflowContext.cpp b/test/qt/workflows/context/test_WorkflowContext.cpp index d9ffb809b..f5bee5ae9 100644 --- a/test/qt/workflows/context/test_WorkflowContext.cpp +++ b/test/qt/workflows/context/test_WorkflowContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "context/WorkflowContext.h" @@ -257,6 +257,22 @@ class test_WorkflowContext } + void test_setFailureCode() + { + QVERIFY(!mContext->getFailureCode().has_value()); + + mContext->setFailureCode(FailureCode::Reason::Card_Removed); + + const auto& firstFailureCode = mContext->getFailureCode(); + QVERIFY(firstFailureCode.has_value()); + QCOMPARE(firstFailureCode->getReason(), FailureCode::Reason::Card_Removed); + + QTest::ignoreMessage(QtWarningMsg, "FailureCode already set to Card_Removed - ignoring User_Cancelled"); + mContext->setFailureCode(FailureCode::Reason::User_Cancelled); + QCOMPARE(firstFailureCode->getReason(), FailureCode::Reason::Card_Removed); + } + + }; QTEST_GUILESS_MAIN(test_WorkflowContext) diff --git a/test/qt/workflows/ifd/test_IfdServiceContext.cpp b/test/qt/workflows/ifd/test_IfdServiceContext.cpp index 36e724131..6ab80c053 100644 --- a/test/qt/workflows/ifd/test_IfdServiceContext.cpp +++ b/test/qt/workflows/ifd/test_IfdServiceContext.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for the class \ref IfdServiceContext. - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "MockIfdServer.h" @@ -170,44 +172,43 @@ class test_IfdServiceContext { QTest::addColumn("inputData"); QTest::addColumn("pinLength"); - QTest::addColumn("allowToChangePinLength"); QTest::addColumn("requestTransportPin"); - QTest::newRow("default - 0") << EstablishPaceChannel() << 0 << false << false; - QTest::newRow("default - 5") << EstablishPaceChannel() << 5 << false << true; - QTest::newRow("default - 6") << EstablishPaceChannel() << 6 << false << false; + QTest::newRow("default - 0") << EstablishPaceChannel() << 0 << false; + QTest::newRow("default - 5") << EstablishPaceChannel() << 5 << true; + QTest::newRow("default - 6") << EstablishPaceChannel() << 6 << false; - QTest::newRow("pin - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 0 << true << false; - QTest::newRow("pin - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 5 << false << true; - QTest::newRow("pin - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 6 << false << false; + QTest::newRow("pin - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 0 << false; + QTest::newRow("pin - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 5 << true; + QTest::newRow("pin - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_PIN) << 6 << false; - QTest::newRow("can - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 0 << false << false; - QTest::newRow("can - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 5 << false << true; - QTest::newRow("can - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 6 << false << false; + QTest::newRow("can - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 0 << false; + QTest::newRow("can - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 5 << true; + QTest::newRow("can - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_CAN) << 6 << false; - QTest::newRow("puk - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 0 << false << false; - QTest::newRow("puk - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 5 << false << true; - QTest::newRow("puk - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 6 << false << false; + QTest::newRow("puk - no cert - 0") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 0 << false; + QTest::newRow("puk - no cert - 5") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 5 << true; + QTest::newRow("puk - no cert - 6") << EstablishPaceChannel(PacePasswordId::PACE_PUK) << 6 << false; - QTest::newRow("unknown - no cert - 0") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 0 << false << false; - QTest::newRow("unknown - no cert - 5") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 5 << false << true; - QTest::newRow("unknown - no cert - 6") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 6 << false << false; + QTest::newRow("unknown - no cert - 0") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 0 << false; + QTest::newRow("unknown - no cert - 5") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 5 << true; + QTest::newRow("unknown - no cert - 6") << EstablishPaceChannel(PacePasswordId::UNKNOWN) << 6 << false; - QTest::newRow("pin - cert - 0") << createDataToParse(PacePasswordId::PACE_PIN) << 0 << true << false; - QTest::newRow("pin - cert - 5") << createDataToParse(PacePasswordId::PACE_PIN) << 5 << true << true; - QTest::newRow("pin - cert - 6") << createDataToParse(PacePasswordId::PACE_PIN) << 6 << true << false; + QTest::newRow("pin - cert - 0") << createDataToParse(PacePasswordId::PACE_PIN) << 0 << false; + QTest::newRow("pin - cert - 5") << createDataToParse(PacePasswordId::PACE_PIN) << 5 << true; + QTest::newRow("pin - cert - 6") << createDataToParse(PacePasswordId::PACE_PIN) << 6 << false; - QTest::newRow("can - cert - 0") << createDataToParse(PacePasswordId::PACE_CAN) << 0 << false << false; - QTest::newRow("can - cert - 5") << createDataToParse(PacePasswordId::PACE_CAN) << 5 << false << true; - QTest::newRow("can - cert - 6") << createDataToParse(PacePasswordId::PACE_CAN) << 6 << false << false; + QTest::newRow("can - cert - 0") << createDataToParse(PacePasswordId::PACE_CAN) << 0 << false; + QTest::newRow("can - cert - 5") << createDataToParse(PacePasswordId::PACE_CAN) << 5 << true; + QTest::newRow("can - cert - 6") << createDataToParse(PacePasswordId::PACE_CAN) << 6 << false; - QTest::newRow("puk - cert - 0") << createDataToParse(PacePasswordId::PACE_PUK) << 0 << false << false; - QTest::newRow("puk - cert - 5") << createDataToParse(PacePasswordId::PACE_PUK) << 5 << false << true; - QTest::newRow("puk - cert - 6") << createDataToParse(PacePasswordId::PACE_PUK) << 6 << false << false; + QTest::newRow("puk - cert - 0") << createDataToParse(PacePasswordId::PACE_PUK) << 0 << false; + QTest::newRow("puk - cert - 5") << createDataToParse(PacePasswordId::PACE_PUK) << 5 << true; + QTest::newRow("puk - cert - 6") << createDataToParse(PacePasswordId::PACE_PUK) << 6 << false; - QTest::newRow("unknown - cert - 0") << createDataToParse(PacePasswordId::UNKNOWN) << 0 << false << false; - QTest::newRow("unknown - cert - 5") << createDataToParse(PacePasswordId::UNKNOWN) << 5 << false << true; - QTest::newRow("unknown - cert - 6") << createDataToParse(PacePasswordId::UNKNOWN) << 6 << false << false; + QTest::newRow("unknown - cert - 0") << createDataToParse(PacePasswordId::UNKNOWN) << 0 << false; + QTest::newRow("unknown - cert - 5") << createDataToParse(PacePasswordId::UNKNOWN) << 5 << true; + QTest::newRow("unknown - cert - 6") << createDataToParse(PacePasswordId::UNKNOWN) << 6 << false; } @@ -215,33 +216,13 @@ class test_IfdServiceContext { QFETCH(EstablishPaceChannel, inputData); QFETCH(int, pinLength); - QFETCH(bool, allowToChangePinLength); QFETCH(bool, requestTransportPin); IfdServiceContext context(mIfdServer); QSharedPointer message(new IfdEstablishPaceChannel(QString(), inputData, pinLength)); context.setEstablishPaceChannel(message); - QCOMPARE(context.allowToChangePinLength(), allowToChangePinLength); - QCOMPARE(context.isRequestTransportPin(), requestTransportPin); - - QSignalSpy spy(&context, &IfdServiceContext::fireCancelPasswordRequest); - - context.changePinLength(); - if (context.isPinChangeWorkflow()) - { - QCOMPARE(context.isRequestTransportPin(), !requestTransportPin); - QCOMPARE(spy.count(), 0); - } - else - { - QCOMPARE(context.isRequestTransportPin(), requestTransportPin); - QCOMPARE(spy.count(), 1); - } - - context.changePinLength(); QCOMPARE(context.isRequestTransportPin(), requestTransportPin); - QCOMPARE(spy.count(), context.isPinChangeWorkflow() ? 0 : 2); } diff --git a/test/qt/workflows/ifd/test_StateChangePinIfd.cpp b/test/qt/workflows/ifd/test_StateChangePinIfd.cpp index 97a8cace9..d4d8b8102 100644 --- a/test/qt/workflows/ifd/test_StateChangePinIfd.cpp +++ b/test/qt/workflows/ifd/test_StateChangePinIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateChangePinIfd.h" diff --git a/test/qt/workflows/ifd/test_StateEstablishPaceChannelIfd.cpp b/test/qt/workflows/ifd/test_StateEstablishPaceChannelIfd.cpp index 4309e35a3..e76da65e2 100644 --- a/test/qt/workflows/ifd/test_StateEstablishPaceChannelIfd.cpp +++ b/test/qt/workflows/ifd/test_StateEstablishPaceChannelIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateEstablishPaceChannelIfd.h" diff --git a/test/qt/workflows/ifd/test_StateEstablishPaceChannelResponse.cpp b/test/qt/workflows/ifd/test_StateEstablishPaceChannelResponse.cpp index 7e83dafa8..f6467ef3b 100644 --- a/test/qt/workflows/ifd/test_StateEstablishPaceChannelResponse.cpp +++ b/test/qt/workflows/ifd/test_StateEstablishPaceChannelResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateEstablishPaceChannelResponse.h" diff --git a/test/qt/workflows/ifd/test_StatePreparePaceIfd.cpp b/test/qt/workflows/ifd/test_StatePreparePaceIfd.cpp index d521417c5..214a445ab 100644 --- a/test/qt/workflows/ifd/test_StatePreparePaceIfd.cpp +++ b/test/qt/workflows/ifd/test_StatePreparePaceIfd.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StatePreparePaceIfd.h" @@ -102,11 +102,12 @@ class test_StatePreparePaceIfd { const auto& message = createMessage(PacePasswordId::UNKNOWN); mContext->setEstablishPaceChannel(message); - QSignalSpy spyContinue(mState.data(), &StatePreparePaceIfd::fireAbort); + QSignalSpy spyAbort(mState.data(), &StatePreparePaceIfd::fireAbort); QTest::ignoreMessage(QtCriticalMsg, "Cannot handle unknown PacePasswordId"); mContext->setStateApproved(); - QTRY_COMPARE(spyContinue.count(), 1); // clazy:exclude=qstring-allocations + QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Prepare_Pace_Ifd_Unknown); } diff --git a/test/qt/workflows/ifd/test_StateProcessIfdMessages.cpp b/test/qt/workflows/ifd/test_StateProcessIfdMessages.cpp index 8bc3b723d..5d533913b 100644 --- a/test/qt/workflows/ifd/test_StateProcessIfdMessages.cpp +++ b/test/qt/workflows/ifd/test_StateProcessIfdMessages.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateProcessIfdMessages.h" diff --git a/test/qt/workflows/ifd/test_StateStartIfdService.cpp b/test/qt/workflows/ifd/test_StateStartIfdService.cpp index 965f03f94..4277bbd22 100644 --- a/test/qt/workflows/ifd/test_StateStartIfdService.cpp +++ b/test/qt/workflows/ifd/test_StateStartIfdService.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateStartIfdService.h" diff --git a/test/qt/workflows/ifd/test_StateStopIfdService.cpp b/test/qt/workflows/ifd/test_StateStopIfdService.cpp index 10ce11ee1..b2fa31e89 100644 --- a/test/qt/workflows/ifd/test_StateStopIfdService.cpp +++ b/test/qt/workflows/ifd/test_StateStopIfdService.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateStopIfdService.h" diff --git a/test/qt/workflows/paos/element/test_ElementParser.cpp b/test/qt/workflows/paos/element/test_ElementParser.cpp index 675b4db2b..1b89a356f 100644 --- a/test/qt/workflows/paos/element/test_ElementParser.cpp +++ b/test/qt/workflows/paos/element/test_ElementParser.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * brief Tests for the class ElementParser. - * - * \copyright Copyright (c) 2022-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/element/ElementParser.h" diff --git a/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC1.cpp b/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC1.cpp index 55f6a20bf..ff609c6ec 100644 --- a/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC1.cpp +++ b/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC1.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DidAuthenticateEAC1 - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/invoke/DidAuthenticateResponseEac1.h" diff --git a/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC2.cpp b/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC2.cpp index 4808ac3c5..79205f1ff 100644 --- a/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC2.cpp +++ b/test/qt/workflows/paos/invoke/test_DidAuthenticateResponseEAC2.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref DidAuthenticateEAC2 - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/invoke/DidAuthenticateResponseEac2.h" diff --git a/test/qt/workflows/paos/invoke/test_PaosCreator.cpp b/test/qt/workflows/paos/invoke/test_PaosCreator.cpp index e593aa8ef..df1e46f50 100644 --- a/test/qt/workflows/paos/invoke/test_PaosCreator.cpp +++ b/test/qt/workflows/paos/invoke/test_PaosCreator.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PaosCreator - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/invoke/PaosCreator.h" diff --git a/test/qt/workflows/paos/invoke/test_StartPaos.cpp b/test/qt/workflows/paos/invoke/test_StartPaos.cpp index d2cf3563f..cefce42a4 100644 --- a/test/qt/workflows/paos/invoke/test_StartPaos.cpp +++ b/test/qt/workflows/paos/invoke/test_StartPaos.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StartPaos - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/invoke/StartPaos.h" diff --git a/test/qt/workflows/paos/invoke/test_TransmitResponse.cpp b/test/qt/workflows/paos/invoke/test_TransmitResponse.cpp index e78a6f94a..686080d7f 100644 --- a/test/qt/workflows/paos/invoke/test_TransmitResponse.cpp +++ b/test/qt/workflows/paos/invoke/test_TransmitResponse.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref TransmitResponse - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/invoke/TransmitResponse.h" diff --git a/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac1.cpp b/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac1.cpp index 5dd53e9b9..825da0fec 100644 --- a/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac1.cpp +++ b/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac1.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \DidAuthenticateEac1 - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEac1.h" diff --git a/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac2.cpp b/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac2.cpp index 8e584b483..cb7264b0a 100644 --- a/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac2.cpp +++ b/test/qt/workflows/paos/retrieve/test_DidAuthenticateEac2.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \DidAuthenticateEac1 - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEac2.h" diff --git a/test/qt/workflows/paos/retrieve/test_DidAuthenticateEacAdditional.cpp b/test/qt/workflows/paos/retrieve/test_DidAuthenticateEacAdditional.cpp index bc8f2bac5..c6e369e11 100644 --- a/test/qt/workflows/paos/retrieve/test_DidAuthenticateEacAdditional.cpp +++ b/test/qt/workflows/paos/retrieve/test_DidAuthenticateEacAdditional.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \DidAuthenticateEACAdditionalInputType - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/DidAuthenticateEacAdditional.h" diff --git a/test/qt/workflows/paos/retrieve/test_InitializeFramework.cpp b/test/qt/workflows/paos/retrieve/test_InitializeFramework.cpp index ed3bb3771..e67f51c2d 100644 --- a/test/qt/workflows/paos/retrieve/test_InitializeFramework.cpp +++ b/test/qt/workflows/paos/retrieve/test_InitializeFramework.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \InitializeFramework - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" diff --git a/test/qt/workflows/paos/retrieve/test_StartPAOSResponse.cpp b/test/qt/workflows/paos/retrieve/test_StartPAOSResponse.cpp index c091f658b..6403efdc8 100644 --- a/test/qt/workflows/paos/retrieve/test_StartPAOSResponse.cpp +++ b/test/qt/workflows/paos/retrieve/test_StartPAOSResponse.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \InitializeFramework - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" diff --git a/test/qt/workflows/paos/retrieve/test_transmit.cpp b/test/qt/workflows/paos/retrieve/test_transmit.cpp index 194b3a101..4510f8cd5 100644 --- a/test/qt/workflows/paos/retrieve/test_transmit.cpp +++ b/test/qt/workflows/paos/retrieve/test_transmit.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \transmit - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/retrieve/Transmit.h" diff --git a/test/qt/workflows/paos/test_PaosMessage.cpp b/test/qt/workflows/paos/test_PaosMessage.cpp index c0d423104..320da508d 100644 --- a/test/qt/workflows/paos/test_PaosMessage.cpp +++ b/test/qt/workflows/paos/test_PaosMessage.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref PaosMessage - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/PaosMessage.h" diff --git a/test/qt/workflows/paos/test_RequestType.cpp b/test/qt/workflows/paos/test_RequestType.cpp index 054c6d079..e8537a1f0 100644 --- a/test/qt/workflows/paos/test_RequestType.cpp +++ b/test/qt/workflows/paos/test_RequestType.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref RequestType - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/workflows/paos/test_UserAgent.cpp b/test/qt/workflows/paos/test_UserAgent.cpp index b9efa86b9..f6db5b079 100644 --- a/test/qt/workflows/paos/test_UserAgent.cpp +++ b/test/qt/workflows/paos/test_UserAgent.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref UserAgent - * - * \copyright Copyright (c) 2016-2023 Governikus GmbH & Co. KG, Germany */ #include "paos/element/UserAgent.h" diff --git a/test/qt/workflows/paos/test_paoshandler.cpp b/test/qt/workflows/paos/test_paoshandler.cpp index de60c6c2c..de92f84da 100644 --- a/test/qt/workflows/paos/test_paoshandler.cpp +++ b/test/qt/workflows/paos/test_paoshandler.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include diff --git a/test/qt/workflows/personalization/test_PersonalizationContext.cpp b/test/qt/workflows/personalization/test_PersonalizationContext.cpp index 6552e23d6..5c6ab8584 100644 --- a/test/qt/workflows/personalization/test_PersonalizationContext.cpp +++ b/test/qt/workflows/personalization/test_PersonalizationContext.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "context/PersonalizationContext.h" diff --git a/test/qt/workflows/personalization/test_StateChangeSmartPin.cpp b/test/qt/workflows/personalization/test_StateChangeSmartPin.cpp index 8b17d1c12..72bb49d32 100644 --- a/test/qt/workflows/personalization/test_StateChangeSmartPin.cpp +++ b/test/qt/workflows/personalization/test_StateChangeSmartPin.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateChangePin - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateChangeSmartPin.h" @@ -117,6 +119,11 @@ class test_StateChangeSmartPin command->setReturnCode(CardReturnCode::CANCELLATION_BY_USER); state.onSetEidPinDone(command); QCOMPARE(context->getStatus().getStatusCode(), GlobalStatus::Code::Card_Cancellation_By_User); + const FailureCode failureCode({FailureCode::Reason::Change_Smart_Pin_Failed, + {FailureCode::Info::Card_Return_Code, Enum::getName(CardReturnCode::CANCELLATION_BY_USER)} + }); + QCOMPARE(context->getFailureCode().value(), failureCode); + QVERIFY(context->getFailureCode()->getFailureInfoMap() == failureCode.getFailureInfoMap()); QCOMPARE(spyAbort.count(), 1); } diff --git a/test/qt/workflows/personalization/test_StateCheckApplet.cpp b/test/qt/workflows/personalization/test_StateCheckApplet.cpp index 822ffb42a..de2847e0a 100644 --- a/test/qt/workflows/personalization/test_StateCheckApplet.cpp +++ b/test/qt/workflows/personalization/test_StateCheckApplet.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateCheckApplet.h" @@ -75,10 +75,17 @@ class test_StateCheckApplet switch (code) { case GlobalStatus::Code::Workflow_Smart_eID_Applet_Preparation_Failed: + QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(spyContinue.size(), 0); + QCOMPARE(spyFurtherStepRequired.size(), 0); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Check_Applet_Error); + break; + case GlobalStatus::Code::Workflow_Smart_eID_Unavailable: QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations QCOMPARE(spyContinue.size(), 0); QCOMPARE(spyFurtherStepRequired.size(), 0); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Check_Applet_Unavailable); break; default: diff --git a/test/qt/workflows/personalization/test_StateFinalizePersonalization.cpp b/test/qt/workflows/personalization/test_StateFinalizePersonalization.cpp index 34c91da8b..b707ffd22 100644 --- a/test/qt/workflows/personalization/test_StateFinalizePersonalization.cpp +++ b/test/qt/workflows/personalization/test_StateFinalizePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateFinalizePersonalization.h" @@ -57,14 +57,16 @@ class test_StateFinalizePersonalization } - void fail() + void previousFail() { StateFinalizePersonalization state(mContext); - QSignalSpy spy(&state, &StateFinalizePersonalization::fireAbort); + QSignalSpy spy(&state, &StateFinalizePersonalization::firePropagateAbort); mContext->setStatus(GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); + mContext->setFailureCode(FailureCode::Reason::Start_Paos_Response_Personalization_Invalid); state.run(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Start_Paos_Response_Personalization_Invalid); } diff --git a/test/qt/workflows/personalization/test_StateGetChallenge.cpp b/test/qt/workflows/personalization/test_StateGetChallenge.cpp index aa86227f2..69670c2dd 100644 --- a/test/qt/workflows/personalization/test_StateGetChallenge.cpp +++ b/test/qt/workflows/personalization/test_StateGetChallenge.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateGetChallenge.h" @@ -39,6 +39,7 @@ class test_StateGetChallenge Env::getSingleton()->init(); mContext.reset(new PersonalizationContext(QStringLiteral("https://dummy/v1/%1"))); mState.reset(new StateGetChallenge(mContext)); + mState->setStateName("StateGetChallenge"); QVERIFY(mContext->getChallenge().isEmpty()); } @@ -87,6 +88,7 @@ class test_StateGetChallenge QVERIFY(logMsg.contains("No valid challenge to prepare personalization")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + QCOMPARE(mState->getContext()->getFailureCode() == FailureCode::Reason::Get_Challenge_Invalid, true); QVERIFY(mContext->getChallenge().isEmpty()); } @@ -119,6 +121,16 @@ class test_StateGetChallenge QVERIFY(logMsg.contains("Network request failed")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, "StateGetChallenge"}, + {FailureCode::Info::Http_Status_Code, QString::number(500)}, + {FailureCode::Info::Network_Error, "Unknown error"} + }; + const FailureCode failureCode(FailureCode::Reason::Generic_Provider_Communication_Network_Error, infoMap); + QCOMPARE(mState->getContext()->getFailureCode() == failureCode, true); + QVERIFY(mState->getContext()->getFailureCode()->getFailureInfoMap() == infoMap); + QVERIFY(mContext->getChallenge().isEmpty()); } diff --git a/test/qt/workflows/personalization/test_StateGetSessionId.cpp b/test/qt/workflows/personalization/test_StateGetSessionId.cpp index 667a74f7a..65922710a 100644 --- a/test/qt/workflows/personalization/test_StateGetSessionId.cpp +++ b/test/qt/workflows/personalization/test_StateGetSessionId.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateGetSessionId.h" @@ -32,6 +32,7 @@ class test_StateGetSessionId Env::getSingleton()->init(); mContext = QSharedPointer::create(QString()); mState.reset(new StateGetSessionId(mContext)); + mState->setStateName("StateGetSessionId"); QVERIFY(mContext->getSessionIdentifier().isNull()); } @@ -82,6 +83,7 @@ class test_StateGetSessionId QVERIFY(logMsg.contains("No valid sessionID to prepare personalization")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + QCOMPARE(mState->getContext()->getFailureCode(), FailureCode::Reason::Get_Session_Id_Invalid); QVERIFY(mContext->getSessionIdentifier().isNull()); } @@ -126,6 +128,14 @@ class test_StateGetSessionId QVERIFY(logMsg.contains("Network request failed")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, "StateGetSessionId"}, + {FailureCode::Info::Http_Status_Code, QString::number(500)}, + {FailureCode::Info::Network_Error, "Unknown error"} + }; + const FailureCode failureCode(FailureCode::Reason::Generic_Provider_Communication_Network_Error, infoMap); + QCOMPARE(mState->getContext()->getFailureCode() == failureCode, true); + QVERIFY(mState->getContext()->getFailureCode()->getFailureInfoMap() == infoMap); QVERIFY(mContext->getSessionIdentifier().isNull()); } diff --git a/test/qt/workflows/personalization/test_StateInitializePersonalization.cpp b/test/qt/workflows/personalization/test_StateInitializePersonalization.cpp index 70118c95b..c3fc09103 100644 --- a/test/qt/workflows/personalization/test_StateInitializePersonalization.cpp +++ b/test/qt/workflows/personalization/test_StateInitializePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateInitializePersonalization.h" @@ -63,6 +63,7 @@ class test_StateInitializePersonalization QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations QCOMPARE(spyContinue.size(), 0); QCOMPARE(mContext->getStatus(), GlobalStatus::Code::Workflow_Smart_eID_PrePersonalization_Failed); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Initialize_Personalization_Failed); } diff --git a/test/qt/workflows/personalization/test_StatePrepareApplet.cpp b/test/qt/workflows/personalization/test_StatePrepareApplet.cpp index b1678d7be..0427ded71 100644 --- a/test/qt/workflows/personalization/test_StatePrepareApplet.cpp +++ b/test/qt/workflows/personalization/test_StatePrepareApplet.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StatePrepareApplet.h" @@ -49,67 +49,67 @@ class test_StatePrepareApplet QTest::addColumn("updateInfo"); QTest::addColumn("result"); QTest::addColumn("logEntries"); - QTest::addColumn("stateSucceed"); + QTest::addColumn>("failureCode"); QTest::newRow("unavailable") << EidStatus::UNAVAILABLE << EidUpdateInfo::UP_TO_DATE << EidServiceResult::SUCCESS - << QStringList("Smart-eID is not available on this device") << false; + << QStringList("Smart-eID is not available on this device") << std::optional(FailureCode::Reason::Prepare_Applet_Unavailable); QTest::newRow("no_provisioning - success") << EidStatus::NO_PROVISIONING << EidUpdateInfo::UP_TO_DATE << EidServiceResult::SUCCESS - << QStringList("Successfully installed Smart-eID") << true; + << QStringList("Successfully installed Smart-eID") << std::optional(); QTest::newRow("no_provisioning - fail") << EidStatus::NO_PROVISIONING << EidUpdateInfo::UP_TO_DATE << EidServiceResult::ERROR - << QStringList("Installation of Smart-eID failed") << false; + << QStringList("Installation of Smart-eID failed") << std::optional(FailureCode::Reason::Prepare_Applet_Installation_Failed); QTest::newRow("no_personalization - internal_error") << EidStatus::NO_PERSONALIZATION << EidUpdateInfo::INTERNAL_ERROR << EidServiceResult::SUCCESS - << QStringList("updateInfo() failed") << false; + << QStringList("updateInfo() failed") << std::optional(FailureCode::Reason::Prepare_Applet_UpdateInfo_Call_Failed); QTest::newRow("no_personalization - up_to_data") << EidStatus::NO_PERSONALIZATION << EidUpdateInfo::UP_TO_DATE << EidServiceResult::SUCCESS - << QStringList("No update available") << true; + << QStringList("No update available") << std::optional(); QTest::newRow("no_personalization - unavailable") << EidStatus::NO_PERSONALIZATION << EidUpdateInfo::UNAVAILABLE << EidServiceResult::SUCCESS - << QStringList("No update available") << true; + << QStringList("No update available") << std::optional(); QTest::newRow("no_personalization - no_provisioning") << EidStatus::NO_PERSONALIZATION << EidUpdateInfo::NO_PROVISIONING << EidServiceResult::SUCCESS - << QStringList("No update available") << true; + << QStringList("No update available") << std::optional(); QTest::newRow("no_personalization - update_available - success") << EidStatus::NO_PERSONALIZATION << EidUpdateInfo::UPDATE_AVAILABLE << EidServiceResult::SUCCESS - << QStringList({"Update available, delete the Smart-eID first", "Successfully deleted Smart-eID"}) << true; + << QStringList({"Update available, delete the Smart-eID first", "Successfully deleted Smart-eID"}) << std::optional(); QTest::newRow("no_personalization - update_available - fail") << EidStatus::NO_PERSONALIZATION << EidUpdateInfo::UPDATE_AVAILABLE << EidServiceResult::ERROR - << QStringList({"Update available, delete the Smart-eID first", "Deletion of Smart-eID failed"}) << false; + << QStringList({"Update available, delete the Smart-eID first", "Deletion of Smart-eID failed"}) << std::optional(FailureCode::Reason::Prepare_Applet_Delete_Smart_Failed); QTest::newRow("applet_unusable - success") << EidStatus::APPLET_UNUSABLE << EidUpdateInfo::UP_TO_DATE << EidServiceResult::SUCCESS - << QStringList("Successfully deleted Smart-eID") << true; + << QStringList("Successfully deleted Smart-eID") << std::optional(); QTest::newRow("applet_unusable - fail") << EidStatus::APPLET_UNUSABLE << EidUpdateInfo::UP_TO_DATE << EidServiceResult::ERROR - << QStringList("Deletion of Smart-eID failed") << false; + << QStringList("Deletion of Smart-eID failed") << std::optional(FailureCode::Reason::Prepare_Applet_Delete_Smart_Failed); QTest::newRow("personalized - fail") << EidStatus::PERSONALIZED << EidUpdateInfo::UP_TO_DATE << EidServiceResult::ERROR - << QStringList("Deletion of Smart-eID personalization failed") << false; + << QStringList("Deletion of Smart-eID personalization failed") << std::optional(FailureCode::Reason::Prepare_Applet_Delete_Personalization_Failed); QTest::newRow("personalized - internal_error") << EidStatus::PERSONALIZED << EidUpdateInfo::INTERNAL_ERROR << EidServiceResult::SUCCESS - << QStringList({"Successfully deleted the Smart-eID personalization", "updateInfo() failed"}) << false; + << QStringList({"Successfully deleted the Smart-eID personalization", "updateInfo() failed"}) << std::optional(FailureCode::Reason::Prepare_Applet_UpdateInfo_Call_Failed); QTest::newRow("personalized - up_to_data") << EidStatus::PERSONALIZED << EidUpdateInfo::UP_TO_DATE << EidServiceResult::SUCCESS - << QStringList({"Successfully deleted the Smart-eID personalization", "No update available"}) << true; + << QStringList({"Successfully deleted the Smart-eID personalization", "No update available"}) << std::optional(); QTest::newRow("personalized - unavailable") << EidStatus::PERSONALIZED << EidUpdateInfo::UNAVAILABLE << EidServiceResult::SUCCESS - << QStringList({"Successfully deleted the Smart-eID personalization", "No update available"}) << true; + << QStringList({"Successfully deleted the Smart-eID personalization", "No update available"}) << std::optional(); QTest::newRow("personalized - no_provisioning") << EidStatus::PERSONALIZED << EidUpdateInfo::NO_PROVISIONING << EidServiceResult::SUCCESS - << QStringList({"Successfully deleted the Smart-eID personalization", "No update available"}) << true; + << QStringList({"Successfully deleted the Smart-eID personalization", "No update available"}) << std::optional(); QTest::newRow("personalized - update_available") << EidStatus::PERSONALIZED << EidUpdateInfo::UPDATE_AVAILABLE << EidServiceResult::SUCCESS - << QStringList({"Successfully deleted the Smart-eID personalization", "Update available, delete the Smart-eID first", "Successfully deleted Smart-eID"}) << true; + << QStringList({"Successfully deleted the Smart-eID personalization", "Update available, delete the Smart-eID first", "Successfully deleted Smart-eID"}) << std::optional(); QTest::newRow("internal_error") << EidStatus::INTERNAL_ERROR << EidUpdateInfo::UP_TO_DATE << EidServiceResult::SUCCESS - << QStringList("getSmartEidStatus() failed") << false; + << QStringList("getSmartEidStatus() failed") << std::optional(FailureCode::Reason::Prepare_Applet_Status_Call_Failed); } @@ -119,7 +119,7 @@ class test_StatePrepareApplet QFETCH(EidUpdateInfo, updateInfo); QFETCH(EidServiceResult, result); QFETCH(QStringList, logEntries); - QFETCH(bool, stateSucceed); + QFETCH(std::optional, failureCode); setSmartEidStatus(status); setUpdateInfo(updateInfo); @@ -139,17 +139,18 @@ class test_StatePrepareApplet } state.run(); - if (stateSucceed) - { - QTRY_COMPARE(spyContinue.size(), 1); // clazy:exclude=qstring-allocations - QCOMPARE(spyAbort.size(), 0); - QCOMPARE(context->getStatus(), GlobalStatus::Code::No_Error); - } - else + if (failureCode.has_value()) { QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations QCOMPARE(spyContinue.size(), 0); QCOMPARE(context->getStatus(), GlobalStatus::Code::Workflow_Smart_eID_Applet_Preparation_Failed); + QCOMPARE(context->getFailureCode(), failureCode); + } + else + { + QTRY_COMPARE(spyContinue.size(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(spyAbort.size(), 0); + QCOMPARE(context->getStatus(), GlobalStatus::Code::No_Error); } } diff --git a/test/qt/workflows/personalization/test_StatePreparePersonalization.cpp b/test/qt/workflows/personalization/test_StatePreparePersonalization.cpp index 87596e6a0..8fb687e72 100644 --- a/test/qt/workflows/personalization/test_StatePreparePersonalization.cpp +++ b/test/qt/workflows/personalization/test_StatePreparePersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StatePreparePersonalization.h" @@ -40,6 +40,7 @@ class test_StatePreparePersonalization Env::getSingleton()->init(); mContext.reset(new PersonalizationContext(QStringLiteral("https://dummy/%1"))); mState.reset(new StatePreparePersonalization(mContext)); + mState->setStateName("StatePreparePersonalization"); mNetworkManager.reset(new MockNetworkManager()); Env::set(NetworkManager::staticMetaObject, mNetworkManager.data()); @@ -103,6 +104,14 @@ class test_StatePreparePersonalization QVERIFY(logMsg.contains("Network request failed")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, "StatePreparePersonalization"}, + {FailureCode::Info::Http_Status_Code, QString::number(500)}, + {FailureCode::Info::Network_Error, "Unknown error"} + }; + const FailureCode failureCode(FailureCode::Reason::Generic_Provider_Communication_Network_Error, infoMap); + QCOMPARE(mState->getContext()->getFailureCode() == failureCode, true); + QVERIFY(mState->getContext()->getFailureCode()->getFailureInfoMap() == infoMap); } diff --git a/test/qt/workflows/personalization/test_StateTransmitPersonalization.cpp b/test/qt/workflows/personalization/test_StateTransmitPersonalization.cpp index ba047043e..3ffd51655 100644 --- a/test/qt/workflows/personalization/test_StateTransmitPersonalization.cpp +++ b/test/qt/workflows/personalization/test_StateTransmitPersonalization.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateTransmitPersonalization.h" @@ -69,6 +69,7 @@ class test_StateTransmitPersonalization QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations QCOMPARE(spyContinue.size(), 0); QCOMPARE(mContext->getStatus(), GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Transmit_Personalization_Size_Mismatch); } @@ -86,6 +87,7 @@ class test_StateTransmitPersonalization QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations QCOMPARE(spyContinue.size(), 0); QCOMPARE(mContext->getStatus(), GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Transmit_Personalization_Size_Mismatch); } @@ -109,6 +111,7 @@ class test_StateTransmitPersonalization QTRY_COMPARE(spyAbort.size(), 1); // clazy:exclude=qstring-allocations QCOMPARE(spyContinue.size(), 0); QCOMPARE(mContext->getStatus(), GlobalStatus::Code::Workflow_Smart_eID_Personalization_Failed); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Transmit_Personalization_Size_Mismatch); } diff --git a/test/qt/workflows/selfauth/test_SelfAuthenticationData.cpp b/test/qt/workflows/selfauth/test_SelfAuthenticationData.cpp index 1db11efd3..9eedf51c5 100644 --- a/test/qt/workflows/selfauth/test_SelfAuthenticationData.cpp +++ b/test/qt/workflows/selfauth/test_SelfAuthenticationData.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref SelfAuthenticationData - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "SelfAuthenticationData.h" diff --git a/test/qt/workflows/states/test_StateCertificateDescriptionCheck.cpp b/test/qt/workflows/states/test_StateCertificateDescriptionCheck.cpp index 41742a666..5462d1328 100644 --- a/test/qt/workflows/states/test_StateCertificateDescriptionCheck.cpp +++ b/test/qt/workflows/states/test_StateCertificateDescriptionCheck.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateCertificateDescriptionCheck.h" @@ -56,6 +56,7 @@ class test_StateCertificateDescriptionCheck mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Certificate_Check_Failed_No_Description); } @@ -71,6 +72,7 @@ class test_StateCertificateDescriptionCheck mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Certificate_Check_Failed_No_SubjectUrl_In_Description); } @@ -86,6 +88,7 @@ class test_StateCertificateDescriptionCheck mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Certificate_Check_Failed_Hash_Mismatch); } @@ -110,6 +113,7 @@ class test_StateCertificateDescriptionCheck mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Certificate_Check_Failed_Same_Origin_Policy_Violation); } diff --git a/test/qt/workflows/states/test_StateChangePin.cpp b/test/qt/workflows/states/test_StateChangePin.cpp index 833b9b7be..970df135f 100644 --- a/test/qt/workflows/states/test_StateChangePin.cpp +++ b/test/qt/workflows/states/test_StateChangePin.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateChangePin - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateChangePin.h" @@ -74,6 +76,8 @@ class MockSetEidPinCommand }; +Q_DECLARE_METATYPE(std::optional) + class test_StateChangePin : public QObject { @@ -111,21 +115,22 @@ class test_StateChangePin QTest::addColumn("fireContinue"); QTest::addColumn("fireAbort"); QTest::addColumn("fireRetry"); - - QTest::newRow("1") << CardReturnCode::OK << QByteArray() << GlobalStatus::Code::Card_Unexpected_Transmit_Status << 0 << 1 << 0; - QTest::newRow("2") << CardReturnCode::OK << QByteArray("9000") << GlobalStatus::Code::No_Error << 1 << 0 << 0; - QTest::newRow("3") << CardReturnCode::OK << QByteArray("6400") << GlobalStatus::Code::Card_Input_TimeOut << 0 << 1 << 0; - QTest::newRow("4") << CardReturnCode::OK << QByteArray("6401") << GlobalStatus::Code::Card_Cancellation_By_User << 0 << 1 << 0; - QTest::newRow("5") << CardReturnCode::OK << QByteArray("6402") << GlobalStatus::Code::Card_NewPin_Mismatch << 0 << 1 << 0; - QTest::newRow("6") << CardReturnCode::OK << QByteArray("6403") << GlobalStatus::Code::Card_NewPin_Invalid_Length << 0 << 1 << 0; - QTest::newRow("7") << CardReturnCode::INPUT_TIME_OUT << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1; - QTest::newRow("8") << CardReturnCode::CANCELLATION_BY_USER << QByteArray() << GlobalStatus::Code::Card_Cancellation_By_User << 0 << 1 << 0; - QTest::newRow("9") << CardReturnCode::NEW_PIN_MISMATCH << QByteArray() << GlobalStatus::Code::Card_NewPin_Mismatch << 0 << 1 << 0; - QTest::newRow("10") << CardReturnCode::NEW_PIN_INVALID_LENGTH << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1; - QTest::newRow("11") << CardReturnCode::PROTOCOL_ERROR << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1; - QTest::newRow("12") << CardReturnCode::CARD_NOT_FOUND << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1; - QTest::newRow("13") << CardReturnCode::COMMAND_FAILED << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1; - QTest::newRow("14") << CardReturnCode::PIN_BLOCKED << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1; + QTest::addColumn>("failureCode"); + + QTest::newRow("1") << CardReturnCode::OK << QByteArray() << GlobalStatus::Code::Card_Unexpected_Transmit_Status << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_Unexpected_Transmit_Status); + QTest::newRow("2") << CardReturnCode::OK << QByteArray("9000") << GlobalStatus::Code::No_Error << 1 << 0 << 0 << std::optional(); + QTest::newRow("3") << CardReturnCode::OK << QByteArray("6400") << GlobalStatus::Code::Card_Input_TimeOut << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_Input_Timeout); + QTest::newRow("4") << CardReturnCode::OK << QByteArray("6401") << GlobalStatus::Code::Card_Cancellation_By_User << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_User_Cancelled); + QTest::newRow("5") << CardReturnCode::OK << QByteArray("6402") << GlobalStatus::Code::Card_NewPin_Mismatch << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_New_Pin_Mismatch); + QTest::newRow("6") << CardReturnCode::OK << QByteArray("6403") << GlobalStatus::Code::Card_NewPin_Invalid_Length << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_New_Pin_Invalid_Length); + QTest::newRow("7") << CardReturnCode::INPUT_TIME_OUT << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1 << std::optional(); + QTest::newRow("8") << CardReturnCode::CANCELLATION_BY_USER << QByteArray() << GlobalStatus::Code::Card_Cancellation_By_User << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_Card_User_Cancelled); + QTest::newRow("9") << CardReturnCode::NEW_PIN_MISMATCH << QByteArray() << GlobalStatus::Code::Card_NewPin_Mismatch << 0 << 1 << 0 << std::optional(FailureCode::Reason::Change_Pin_Card_New_Pin_Mismatch); + QTest::newRow("10") << CardReturnCode::NEW_PIN_INVALID_LENGTH << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1 << std::optional(); + QTest::newRow("11") << CardReturnCode::PROTOCOL_ERROR << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1 << std::optional(); + QTest::newRow("12") << CardReturnCode::CARD_NOT_FOUND << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1 << std::optional(); + QTest::newRow("13") << CardReturnCode::COMMAND_FAILED << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1 << std::optional(); + QTest::newRow("14") << CardReturnCode::PIN_BLOCKED << QByteArray() << GlobalStatus::Code::No_Error << 0 << 0 << 1 << std::optional(); } @@ -137,6 +142,7 @@ class test_StateChangePin QFETCH(int, fireContinue); QFETCH(int, fireAbort); QFETCH(int, fireRetry); + QFETCH(std::optional, failureCode); const QSharedPointer context(new ChangePinContext()); StateChangePin state(context); @@ -162,6 +168,7 @@ class test_StateChangePin QCOMPARE(spyContinue.count(), fireContinue); QCOMPARE(spyAbort.count(), fireAbort); QCOMPARE(spyRetry.count(), fireRetry); + QCOMPARE(context->getFailureCode(), failureCode); } diff --git a/test/qt/workflows/states/test_StateCheckRefreshAddress.cpp b/test/qt/workflows/states/test_StateCheckRefreshAddress.cpp index f9e326a14..04f8c15dc 100644 --- a/test/qt/workflows/states/test_StateCheckRefreshAddress.cpp +++ b/test/qt/workflows/states/test_StateCheckRefreshAddress.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateCheckRefreshAddress.h" @@ -230,22 +230,29 @@ class test_StateCheckRefreshAddress } - void reportCommunicationError() + void reportCommunicationError_CardCommunicationError() { mState->mReply = QSharedPointer::create(); QSignalSpy spy(mState.data(), &StateCheckRefreshAddress::fireAbort); QTest::ignoreMessage(QtCriticalMsg, "Card_Communication_Error | \"An error occurred while communicating with the ID card. Please make sure that your ID card is placed correctly on the card reader and try again.\""); - mState->reportCommunicationError(GlobalStatus::Code::Card_Communication_Error); + mState->reportCommunicationError(GlobalStatus::Code::Card_Communication_Error, FailureCode::Reason::Check_Refresh_Address_Empty); QCOMPARE(mAuthContext->getStatus().getStatusCode(), GlobalStatus::Code::Card_Communication_Error); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Check_Refresh_Address_Empty); QCOMPARE(spy.count(), 1); + } - mAuthContext->setStatus(GlobalStatus::Code::No_Error); + + void reportCommunicationError_NetworkError() + { + mState->mReply = QSharedPointer::create(); + QSignalSpy spy(mState.data(), &StateCheckRefreshAddress::fireAbort); QTest::ignoreMessage(QtCriticalMsg, "Network_Other_Error | \"An unknown network error occurred. Check your network connection and try to restart the app.\""); - mState->reportCommunicationError(GlobalStatus::Code::Network_Other_Error); + mState->reportCommunicationError(GlobalStatus::Code::Network_Other_Error, FailureCode::Reason::Check_Refresh_Address_Unknown_Network_Error); QCOMPARE(mAuthContext->getStatus().getStatusCode(), GlobalStatus::Code::Network_Other_Error); - QCOMPARE(spy.count(), 2); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Check_Refresh_Address_Unknown_Network_Error); + QCOMPARE(spy.count(), 1); } diff --git a/test/qt/workflows/states/test_StateConnectCard.cpp b/test/qt/workflows/states/test_StateConnectCard.cpp index 27d07ca04..e2bb26285 100644 --- a/test/qt/workflows/states/test_StateConnectCard.cpp +++ b/test/qt/workflows/states/test_StateConnectCard.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief unit tests for \ref StateConnectCard - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateConnectCard.h" @@ -68,6 +70,7 @@ class test_StateConnectCard QTest::ignoreMessage(QtDebugMsg, "Card connection failed"); mState->onCommandDone(command); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(mState->getContext()->getFailureCode(), FailureCode::Reason::Connect_Card_Connection_Failed); QSharedPointer connectionWorker(new MockCardConnectionWorker()); connectionWorker->moveToThread(&workerThread); diff --git a/test/qt/workflows/states/test_StateDestroyPace.cpp b/test/qt/workflows/states/test_StateDestroyPace.cpp index 084f21c5a..ee61803be 100644 --- a/test/qt/workflows/states/test_StateDestroyPace.cpp +++ b/test/qt/workflows/states/test_StateDestroyPace.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateDestroyPace.h" diff --git a/test/qt/workflows/states/test_StateDidAuthenticateEac1.cpp b/test/qt/workflows/states/test_StateDidAuthenticateEac1.cpp index 5ca125814..9b0dd3668 100644 --- a/test/qt/workflows/states/test_StateDidAuthenticateEac1.cpp +++ b/test/qt/workflows/states/test_StateDidAuthenticateEac1.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit test for \ref StateDidAuthenticateEac1 - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateDidAuthenticateEac1.h" @@ -93,6 +95,7 @@ class test_StateDidAuthenticateEac1 state.onCardCommandDone(command); QCOMPARE(mAuthContext->getStatus().getStatusCode(), GlobalStatus::Code::Unknown_Error); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Did_Authenticate_Eac1_Card_Command_Failed); command->setMockReturnCode(CardReturnCode::OK); const QByteArray array(QByteArray::fromHex("9000")); diff --git a/test/qt/workflows/states/test_StateDidAuthenticateEac2.cpp b/test/qt/workflows/states/test_StateDidAuthenticateEac2.cpp index 1589da6df..dbf065222 100644 --- a/test/qt/workflows/states/test_StateDidAuthenticateEac2.cpp +++ b/test/qt/workflows/states/test_StateDidAuthenticateEac2.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit test for \ref StateDidAuthenticateEac2 - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateDidAuthenticateEac2.h" @@ -35,6 +37,7 @@ class MockDidAuthenticateEAC2Command }; +Q_DECLARE_METATYPE(std::optional) class test_StateDidAuthenticateEac2 : public QObject @@ -76,6 +79,7 @@ class test_StateDidAuthenticateEac2 mState->run(); QCOMPARE(mState->mConnections.size(), 0); QCOMPARE(mAuthContext->getStatus(), GlobalStatus::Code::Workflow_No_Permission_Error); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Did_Authenticate_Eac2_Invalid_Cvc_Chain); QCOMPARE(spy.count(), 1); } @@ -85,10 +89,11 @@ class test_StateDidAuthenticateEac2 QTest::addColumn("code"); QTest::addColumn("status"); QTest::addColumn("abort"); + QTest::addColumn>("failureCode"); - QTest::newRow("ok") << CardReturnCode::OK << GlobalStatus::Code::No_Error << 0; - QTest::newRow("command_failed") << CardReturnCode::COMMAND_FAILED << GlobalStatus::Code::Workflow_Card_Removed << 1; - QTest::newRow("undefined") << CardReturnCode::UNDEFINED << GlobalStatus::Code::Workflow_No_Permission_Error << 1; + QTest::newRow("ok") << CardReturnCode::OK << GlobalStatus::Code::No_Error << 0 << std::optional(); + QTest::newRow("command_failed") << CardReturnCode::COMMAND_FAILED << GlobalStatus::Code::Workflow_Card_Removed << 1 << std::optional(FailureCode::Reason::Did_Authenticate_Eac2_Card_Command_Failed); + QTest::newRow("undefined") << CardReturnCode::UNDEFINED << GlobalStatus::Code::Workflow_No_Permission_Error << 1 << std::optional(FailureCode::Reason::Did_Authenticate_Eac2_Card_Command_Failed); } @@ -97,6 +102,7 @@ class test_StateDidAuthenticateEac2 QFETCH(CardReturnCode, code); QFETCH(GlobalStatus::Code, status); QFETCH(int, abort); + QFETCH(std::optional, failureCode); QSignalSpy spyAbort(mState.data(), &StateDidAuthenticateEac2::fireAbort); QSignalSpy spyContinue(mState.data(), &StateDidAuthenticateEac2::fireContinue); @@ -116,6 +122,13 @@ class test_StateDidAuthenticateEac2 QCOMPARE(mAuthContext->getStatus(), status); QCOMPARE(spyAbort.count(), abort); QCOMPARE(spyContinue.count(), 1 - abort); + + const auto& actualFailureCode = mAuthContext->getFailureCode(); + QCOMPARE(actualFailureCode, failureCode); + if (actualFailureCode.has_value()) + { + QVERIFY(actualFailureCode->getFailureInfoMap().contains(FailureCode::Info::Card_Return_Code)); + } } diff --git a/test/qt/workflows/states/test_StateEnterPacePassword.cpp b/test/qt/workflows/states/test_StateEnterPacePassword.cpp index 4c3ed7e98..1d0d43b94 100644 --- a/test/qt/workflows/states/test_StateEnterPacePassword.cpp +++ b/test/qt/workflows/states/test_StateEnterPacePassword.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateEnterPacePassword.h" @@ -46,11 +46,12 @@ class test_StateEnterPacePassword void test_RunContextError() { mAuthContext->setStatus(GlobalStatus::Code::Card_Cancellation_By_User); - QSignalSpy spyAbort(mState.data(), &AbstractState::fireAbort); + mAuthContext->setFailureCode(FailureCode::Reason::User_Cancelled); + QSignalSpy spyPropagateAbort(mState.data(), &StateEnterPacePassword::firePropagateAbort); mState->run(); - QCOMPARE(spyAbort.count(), 1); + QCOMPARE(spyPropagateAbort.count(), 1); } diff --git a/test/qt/workflows/states/test_StateEstablishPaceChannel.cpp b/test/qt/workflows/states/test_StateEstablishPaceChannel.cpp index 829ff9168..f28a65f5d 100644 --- a/test/qt/workflows/states/test_StateEstablishPaceChannel.cpp +++ b/test/qt/workflows/states/test_StateEstablishPaceChannel.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateEstablishPaceChannel.h" @@ -34,6 +34,7 @@ class MockEstablishPaceChannelCommand }; +Q_DECLARE_METATYPE(std::optional) class test_StateEstablishPaceChannel : public QObject @@ -61,6 +62,7 @@ class test_StateEstablishPaceChannel mWorkerThread.start(); mAuthContext.reset(new TestAuthContext(nullptr, ":/paos/DIDAuthenticateEAC1.xml")); mState.reset(new StateEstablishPaceChannel(mAuthContext)); + mState->setStateName("StateEstablishPaceChannel"); } @@ -81,6 +83,7 @@ class test_StateEstablishPaceChannel QTest::ignoreMessage(QtDebugMsg, "No card connection available."); mState->run(); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Establish_Pace_Channel_No_Card_Connection); } @@ -104,24 +107,28 @@ class test_StateEstablishPaceChannel void test_OnContextError() { mAuthContext->setStatus(GlobalStatus::Code::Card_Cancellation_By_User); - QSignalSpy spyAbort(mState.data(), &AbstractState::fireAbort); + mAuthContext->setFailureCode(FailureCode::Reason::User_Cancelled); + QSignalSpy spyPropagateAbort(mState.data(), &StateEstablishPaceChannel::firePropagateAbort); mState->run(); - QCOMPARE(spyAbort.count(), 1); + QCOMPARE(spyPropagateAbort.count(), 1); } void test_OnKillWorkflow() { QSignalSpy spyAbort(mState.data(), &AbstractState::fireAbort); + QSignalSpy spyPropagateAbort(mState.data(), &StateEstablishPaceChannel::firePropagateAbort); mState->setStateName("StateEstablishPaceChannel"); mState->onEntry(nullptr); QCOMPARE(spyAbort.count(), 0); + QCOMPARE(spyPropagateAbort.count(), 0); mAuthContext->killWorkflow(); - QTRY_COMPARE(spyAbort.count(), 2); // clazy:exclude=qstring-allocations + QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations + QTRY_COMPARE(spyPropagateAbort.count(), 1); // clazy:exclude=qstring-allocations } @@ -142,6 +149,7 @@ class test_StateEstablishPaceChannel mState->onUserCancelled(); QCOMPARE(mAuthContext->getStatus().getStatusCode(), GlobalStatus::Code::Workflow_Cancellation_By_User); QCOMPARE(mAuthContext->getLastPaceResult(), CardReturnCode::CANCELLATION_BY_USER); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::User_Cancelled); } @@ -152,18 +160,19 @@ class test_StateEstablishPaceChannel QTest::addColumn("code"); QTest::addColumn("result"); QTest::addColumn("canAllowed"); - - QTest::newRow("PIN_OK") << PacePasswordId::PACE_PIN << 3 << CardReturnCode::OK << CardReturnCode::OK << false; - QTest::newRow("PIN_PUK_INOPERATIVE") << PacePasswordId::PACE_PIN << 1 << CardReturnCode::PUK_INOPERATIVE << CardReturnCode::PUK_INOPERATIVE << false; - QTest::newRow("PIN_CANCELLATION_BY_USER") << PacePasswordId::PACE_PIN << 2 << CardReturnCode::CANCELLATION_BY_USER << CardReturnCode::CANCELLATION_BY_USER << false; - QTest::newRow("PIN_INVALID_PIN_RETRY_COUNTER_3") << PacePasswordId::PACE_PIN << 3 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN << false; - QTest::newRow("PIN_INVALID_PIN_RETRY_COUNTER_2") << PacePasswordId::PACE_PIN << 2 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN_2 << false; - QTest::newRow("PIN_INVALID_PIN_RETRY_COUNTER_1") << PacePasswordId::PACE_PIN << 1 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN_3 << false; - QTest::newRow("CAN_OK_CAN_ALLOWED") << PacePasswordId::PACE_CAN << 3 << CardReturnCode::OK << CardReturnCode::OK << true; - QTest::newRow("CAN_OK") << PacePasswordId::PACE_CAN << 2 << CardReturnCode::OK << CardReturnCode::OK << false; - QTest::newRow("CAN_CANCELLATION_BY_USER") << PacePasswordId::PACE_CAN << 2 << CardReturnCode::CANCELLATION_BY_USER << CardReturnCode::CANCELLATION_BY_USER << true; - QTest::newRow("PUK_OK") << PacePasswordId::PACE_PUK << 0 << CardReturnCode::OK << CardReturnCode::OK_PUK << false; - QTest::newRow("PUK_INVALID_PIN_RETRY_COUNTER_1") << PacePasswordId::PACE_PUK << 0 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN << false; + QTest::addColumn>("failureCode"); + + QTest::newRow("PIN_OK") << PacePasswordId::PACE_PIN << 3 << CardReturnCode::OK << CardReturnCode::OK << false << std::optional(); + QTest::newRow("PIN_PUK_INOPERATIVE") << PacePasswordId::PACE_PIN << 1 << CardReturnCode::PUK_INOPERATIVE << CardReturnCode::PUK_INOPERATIVE << false << std::optional(FailureCode::Reason::Establish_Pace_Channel_Puk_Inoperative); + QTest::newRow("PIN_CANCELLATION_BY_USER") << PacePasswordId::PACE_PIN << 2 << CardReturnCode::CANCELLATION_BY_USER << CardReturnCode::CANCELLATION_BY_USER << false << std::optional(FailureCode::Reason::Establish_Pace_Channel_User_Cancelled); + QTest::newRow("PIN_INVALID_PIN_RETRY_COUNTER_3") << PacePasswordId::PACE_PIN << 3 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN << false << std::optional(); + QTest::newRow("PIN_INVALID_PIN_RETRY_COUNTER_2") << PacePasswordId::PACE_PIN << 2 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN_2 << false << std::optional(); + QTest::newRow("PIN_INVALID_PIN_RETRY_COUNTER_1") << PacePasswordId::PACE_PIN << 1 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN_3 << false << std::optional(); + QTest::newRow("CAN_OK_CAN_ALLOWED") << PacePasswordId::PACE_CAN << 3 << CardReturnCode::OK << CardReturnCode::OK << true << std::optional(); + QTest::newRow("CAN_OK") << PacePasswordId::PACE_CAN << 2 << CardReturnCode::OK << CardReturnCode::OK << false << std::optional(); + QTest::newRow("CAN_CANCELLATION_BY_USER") << PacePasswordId::PACE_CAN << 2 << CardReturnCode::CANCELLATION_BY_USER << CardReturnCode::CANCELLATION_BY_USER << true << std::optional(FailureCode::Reason::Establish_Pace_Channel_User_Cancelled); + QTest::newRow("PUK_OK") << PacePasswordId::PACE_PUK << 0 << CardReturnCode::OK << CardReturnCode::OK_PUK << false << std::optional(); + QTest::newRow("PUK_INVALID_PIN_RETRY_COUNTER_1") << PacePasswordId::PACE_PUK << 0 << CardReturnCode::INVALID_PIN << CardReturnCode::INVALID_PIN << false << std::optional(); } @@ -174,6 +183,7 @@ class test_StateEstablishPaceChannel QFETCH(CardReturnCode, code); QFETCH(CardReturnCode, result); QFETCH(bool, canAllowed); + QFETCH(std::optional, failureCode); QSignalSpy spyPaceChannelEstablished(mState.data(), &StateEstablishPaceChannel::firePaceChannelEstablished); QSignalSpy spyPaceChannelInoperative(mState.data(), &StateEstablishPaceChannel::firePaceChannelInoperative); @@ -260,6 +270,7 @@ class test_StateEstablishPaceChannel { QCOMPARE(spyAbort.count(), 1); } + QCOMPARE(mAuthContext->getFailureCode(), failureCode); } diff --git a/test/qt/workflows/states/test_StateExtractCvcsFromEac1InputType.cpp b/test/qt/workflows/states/test_StateExtractCvcsFromEac1InputType.cpp index 50a970506..e0c5958dc 100644 --- a/test/qt/workflows/states/test_StateExtractCvcsFromEac1InputType.cpp +++ b/test/qt/workflows/states/test_StateExtractCvcsFromEac1InputType.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests the StateExtractCvcsFromEac1InputType - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateExtractCvcsFromEac1InputType.h" @@ -69,6 +71,7 @@ class test_StateExtractCvcsFromEac1InputType mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Extract_Cvcs_From_Eac1_Dv_Missing); } @@ -82,6 +85,7 @@ class test_StateExtractCvcsFromEac1InputType mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Extract_Cvcs_From_Eac1_No_Unique_Dv); } @@ -93,6 +97,7 @@ class test_StateExtractCvcsFromEac1InputType mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Extract_Cvcs_From_Eac1_At_Missing); } @@ -106,6 +111,7 @@ class test_StateExtractCvcsFromEac1InputType mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Extract_Cvcs_From_Eac1_No_Unique_At); } diff --git a/test/qt/workflows/states/test_StateGenericProviderCommunication.cpp b/test/qt/workflows/states/test_StateGenericProviderCommunication.cpp index 18aa5ffca..32d3121c4 100644 --- a/test/qt/workflows/states/test_StateGenericProviderCommunication.cpp +++ b/test/qt/workflows/states/test_StateGenericProviderCommunication.cpp @@ -1,10 +1,10 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateGetSelfAuthenticationData.h" -#include "LogHandler.h" +#include "TlsChecker.h" #include "MockNetworkManager.h" @@ -63,7 +63,6 @@ class test_StateGenericProviderCommunication private Q_SLOTS: void init() { - Env::getSingleton()->init(); mContext.reset(new AuthContext(QSharedPointer())); mState.reset(new StateGenericProviderCommunicationImpl(mContext)); mState->setStateName("StateGenericProviderCommunicationImpl"); @@ -86,20 +85,22 @@ class test_StateGenericProviderCommunication mState->mReply.reset(new MockNetworkReply(), &QObject::deleteLater); QSignalSpy spy(mState.data(), &StateGetSelfAuthenticationData::fireAbort); - QSignalSpy logSpy(Env::getSingleton()->getEventHandler(), &LogEventHandler::fireLog); - mState->reportCommunicationError(GlobalStatus::Code::Unknown_Error); - QVERIFY(logSpy.takeLast().at(0).toString().contains("Operation aborted")); - QVERIFY(logSpy.takeLast().at(0).toString().contains("Unknown_Error | \"An unexpected error has occurred during processing.\"")); + QTest::ignoreMessage(QtCriticalMsg, "Unknown_Error | \"An unexpected error has occurred during processing.\""); + QTest::ignoreMessage(QtDebugMsg, "Operation aborted"); + mState->reportCommunicationError(GlobalStatus::Code::Unknown_Error, FailureCode::Reason::Generic_Provider_Communication_Network_Error); QCOMPARE(mContext->getStatus(), GlobalStatus::Code::Unknown_Error); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Generic_Provider_Communication_Network_Error); QCOMPARE(spy.count(), 1); mContext->setStatus(GlobalStatus::Code::No_Error); - mState->reportCommunicationError(GlobalStatus::Code::Card_Not_Found); - QVERIFY(logSpy.takeLast().at(0).toString().contains("Operation aborted")); - QVERIFY(logSpy.takeLast().at(0).toString().contains("Card_Not_Found | \"Card does not exist\"")); + QTest::ignoreMessage(QtCriticalMsg, "Card_Not_Found | \"Card does not exist\""); + QTest::ignoreMessage(QtDebugMsg, "Operation aborted"); + QTest::ignoreMessage(QtWarningMsg, "FailureCode already set to Generic_Provider_Communication_Network_Error - ignoring Generic_Provider_Communication_Certificate_Error"); + mState->reportCommunicationError(GlobalStatus::Code::Card_Not_Found, FailureCode::Reason::Generic_Provider_Communication_Certificate_Error); QCOMPARE(mContext->getStatus(), GlobalStatus::Code::Card_Not_Found); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Generic_Provider_Communication_Network_Error); QCOMPARE(spy.count(), 2); } @@ -108,15 +109,12 @@ class test_StateGenericProviderCommunication { mState->mReply.reset(new MockNetworkReply(), &QObject::deleteLater); - QSignalSpy logSpy(Env::getSingleton()->getEventHandler(), &LogEventHandler::fireLog); - + QTest::ignoreMessage(QtDebugMsg, "Operation aborted"); mState->onSslHandshakeDone(); - QVERIFY(logSpy.takeLast().at(0).toString().contains("Operation aborted")); + QTest::ignoreMessage(QtInfoMsg, QRegularExpression("^Used session cipher")); mState->mReply->setSslConfiguration(QSslConfiguration()); mState->onSslHandshakeDone(); - const QString logMsg(logSpy.at(0).at(0).toString()); - QVERIFY(logMsg.contains("Used session cipher")); } @@ -131,6 +129,11 @@ class test_StateGenericProviderCommunication const QList errorList({QSslError(QSslError::CertificateNotYetValid), QSslError(QSslError::CertificateUntrusted)}); mState->onSslErrors(errorList); QCOMPARE(spy.count(), 1); + + const auto& failureCode = mState->getContext()->getFailureCode(); + QCOMPARE(failureCode, FailureCode::Reason::Generic_Provider_Communication_Ssl_Error); + QCOMPARE(failureCode->getFailureInfoMap()[FailureCode::Info::Network_Error], mState->mReply->errorString()); + QCOMPARE(failureCode->getFailureInfoMap()[FailureCode::Info::Ssl_Errors], TlsChecker::sslErrorsToString(errorList)); } diff --git a/test/qt/workflows/states/test_StateGenericSendReceive.cpp b/test/qt/workflows/states/test_StateGenericSendReceive.cpp index 1b1ab4ebb..8e63c08ab 100644 --- a/test/qt/workflows/states/test_StateGenericSendReceive.cpp +++ b/test/qt/workflows/states/test_StateGenericSendReceive.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "Env.h" @@ -210,6 +210,7 @@ class test_StateGenericSendReceive mNetworkManager->fireFinished(); QCOMPARE(spy.count(), 1); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Generic_Send_Receive_Network_Error); } @@ -244,6 +245,7 @@ class test_StateGenericSendReceive mNetworkManager->fireFinished(); QCOMPARE(spy.count(), 1); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Generic_Send_Receive_Paos_Unexpected); } diff --git a/test/qt/workflows/states/test_StateGetSelfAuthenticationData.cpp b/test/qt/workflows/states/test_StateGetSelfAuthenticationData.cpp index a7965b464..b39b6b754 100644 --- a/test/qt/workflows/states/test_StateGetSelfAuthenticationData.cpp +++ b/test/qt/workflows/states/test_StateGetSelfAuthenticationData.cpp @@ -1,10 +1,9 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateGetSelfAuthenticationData.h" -#include "LogHandler.h" #include "context/SelfAuthContext.h" #include "MockNetworkReply.h" @@ -29,9 +28,9 @@ class test_StateGetSelfAuthenticationData private Q_SLOTS: void init() { - Env::getSingleton()->init(); mContext.reset(new SelfAuthContext()); mState.reset(new StateGetSelfAuthenticationData(mContext)); + mState->setStateName("StateGetSelfAuthenticationData"); } @@ -46,14 +45,13 @@ class test_StateGetSelfAuthenticationData { mState->mReply.reset(new MockNetworkReply(), &QObject::deleteLater); - QSignalSpy logSpy(Env::getSingleton()->getEventHandler(), &LogEventHandler::fireLog); QSignalSpy spyAbort(mState.data(), &StateGetSelfAuthenticationData::fireAbort); + QTest::ignoreMessage(QtDebugMsg, "No valid data of self-authentication."); mState->onNetworkReply(); - const QString logMsg(logSpy.takeLast().at(0).toString()); - QVERIFY(logMsg.contains("No valid data of self-authentication.")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + QCOMPARE(mState->getContext()->getFailureCode(), FailureCode::Reason::Get_SelfAuthData_Invalid_Or_Empty); } @@ -74,14 +72,20 @@ class test_StateGetSelfAuthenticationData mState->mReply.reset(reply, &QObject::deleteLater); reply->setAttribute(QNetworkRequest::Attribute::HttpStatusCodeAttribute, 500); - QSignalSpy logSpy(Env::getSingleton()->getEventHandler(), &LogEventHandler::fireLog); QSignalSpy spyAbort(mState.data(), &StateGetSelfAuthenticationData::fireAbort); + QTest::ignoreMessage(QtDebugMsg, "Network request failed"); mState->onNetworkReply(); - const QString logMsg(logSpy.takeLast().at(0).toString()); - QVERIFY(logMsg.contains("Network request failed")); QCOMPARE(spyAbort.count(), 1); QCOMPARE(mState->getContext()->getStatus(), GlobalStatus::Code::Workflow_Server_Incomplete_Information_Provided); + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::State_Name, "StateGetSelfAuthenticationData"}, + {FailureCode::Info::Http_Status_Code, QString::number(500)}, + {FailureCode::Info::Network_Error, "Unknown error"} + }; + const FailureCode failureCode(FailureCode::Reason::Generic_Provider_Communication_Network_Error, infoMap); + QCOMPARE(mState->getContext()->getFailureCode(), failureCode); + QVERIFY(mState->getContext()->getFailureCode()->getFailureInfoMap() == infoMap); } diff --git a/test/qt/workflows/states/test_StateGetTcToken.cpp b/test/qt/workflows/states/test_StateGetTcToken.cpp index 2f916466c..0a6cbea74 100644 --- a/test/qt/workflows/states/test_StateGetTcToken.cpp +++ b/test/qt/workflows/states/test_StateGetTcToken.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateGetTcToken - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateGetTcToken.h" @@ -46,6 +48,7 @@ class test_StateGetTcToken QTest::ignoreMessage(QtDebugMsg, "Got TC Token URL: QUrl(\"test\")"); state.run(); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Get_TcToken_Invalid_Url); } @@ -77,6 +80,7 @@ class test_StateGetTcToken QCOMPARE(state.mConnections.size(), 3); QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Get_TcToken_Network_Error); } @@ -91,6 +95,7 @@ class test_StateGetTcToken state.parseTcToken(); QCOMPARE(context->getStatus().getStatusCode(), GlobalStatus::Code::Workflow_TrustedChannel_No_Data_Received); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Get_TcToken_Empty_Data); } @@ -133,6 +138,7 @@ class test_StateGetTcToken state.parseTcToken(); QCOMPARE(context->getStatus().getStatusCode(), GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Get_TcToken_Invalid_Data); } diff --git a/test/qt/workflows/states/test_StateInitializeFramework.cpp b/test/qt/workflows/states/test_StateInitializeFramework.cpp index 7a4bc630d..b02338ee4 100644 --- a/test/qt/workflows/states/test_StateInitializeFramework.cpp +++ b/test/qt/workflows/states/test_StateInitializeFramework.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TestFileHelper.h" diff --git a/test/qt/workflows/states/test_StateMaintainCardConnection.cpp b/test/qt/workflows/states/test_StateMaintainCardConnection.cpp index 4f90d6570..37e6aad04 100644 --- a/test/qt/workflows/states/test_StateMaintainCardConnection.cpp +++ b/test/qt/workflows/states/test_StateMaintainCardConnection.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateMaintainCardConnection.h" @@ -39,9 +39,10 @@ class test_StateMaintainCardConnection void test_Run_Error() { - QSignalSpy spy(mState.data(), &StateMaintainCardConnection::fireAbort); + QSignalSpy spy(mState.data(), &StateMaintainCardConnection::firePropagateAbort); mContext->setStatus(GlobalStatus::Code::Unknown_Error); + mContext->setFailureCode(FailureCode::Reason::User_Cancelled); mState->run(); QCOMPARE(spy.count(), 1); } @@ -69,6 +70,7 @@ class test_StateMaintainCardConnection mState->run(); QCOMPARE(mContext->getStatus(), status); QCOMPARE(spy.count(), 1); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Maintain_Card_Connection_Pace_Unrecoverable); } @@ -164,6 +166,10 @@ class test_StateMaintainCardConnection QCOMPARE(mContext->getLastPaceResult(), doReset ? CardReturnCode::OK : code); QCOMPARE(spyNoCard.count(), doReset ? 1 : 0); QCOMPARE(spyAbort.count(), doReset ? 0 : 1); + if (!doReset) + { + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Maintain_Card_Connection_Pace_Unrecoverable); + } } diff --git a/test/qt/workflows/states/test_StatePreVerification.cpp b/test/qt/workflows/states/test_StatePreVerification.cpp index f2aae0d6a..4ba263363 100644 --- a/test/qt/workflows/states/test_StatePreVerification.cpp +++ b/test/qt/workflows/states/test_StatePreVerification.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StatePreVerification - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StatePreVerification.h" @@ -87,6 +89,10 @@ class test_StatePreVerification QTRY_COMPARE(spyContinue.count(), isValid ? 1 : 0); // clazy:exclude=qstring-allocations QTRY_COMPARE(spyAbort.count(), isValid ? 0 : 1); // clazy:exclude=qstring-allocations + if (!isValid) + { + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Pre_Verfication_Certificate_Expired); + } } @@ -98,6 +104,7 @@ class test_StatePreVerification mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Pre_Verfication_Certificate_Expired); } @@ -109,6 +116,7 @@ class test_StatePreVerification mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Pre_Verfication_Invalid_Certificate_Chain); } @@ -128,6 +136,7 @@ class test_StatePreVerification mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Pre_Verfication_Invalid_Certificate_Signature); } @@ -139,6 +148,7 @@ class test_StatePreVerification mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Pre_Verfication_Certificate_Expired); } diff --git a/test/qt/workflows/states/test_StatePreparePace.cpp b/test/qt/workflows/states/test_StatePreparePace.cpp index ee0ee6c8d..bd83b0c37 100644 --- a/test/qt/workflows/states/test_StatePreparePace.cpp +++ b/test/qt/workflows/states/test_StatePreparePace.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StatePreparePace - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StatePreparePace.h" @@ -52,6 +54,7 @@ class test_StatePreparePace mContext->setStateApproved(); QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations QCOMPARE(mContext->getEstablishPaceChannelType(), PacePasswordId::UNKNOWN); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Prepace_Pace_No_Card_Connection); } @@ -85,6 +88,7 @@ class test_StatePreparePace mContext->setStateApproved(); QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations QCOMPARE(mContext->getStatus().getStatusCode(), GlobalStatus::Code::Card_Smart_Invalid); + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Prepace_Pace_Smart_Eid_Invalidated); } diff --git a/test/qt/workflows/states/test_StateProcessCertificatesFromEac2.cpp b/test/qt/workflows/states/test_StateProcessCertificatesFromEac2.cpp index 7f0162a10..8768b3b71 100644 --- a/test/qt/workflows/states/test_StateProcessCertificatesFromEac2.cpp +++ b/test/qt/workflows/states/test_StateProcessCertificatesFromEac2.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StatePreVerification - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateProcessCertificatesFromEac2.h" @@ -93,6 +95,7 @@ class test_StateProcessCertificatesFromEac2 QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations QVERIFY(!mState->getContext()->hasChainForCertificationAuthority(*mState->getContext()->getPaceOutputData())); + QCOMPARE(mState->getContext()->getFailureCode(), FailureCode::Reason::Process_Certificates_From_Eac2_Cvc_Chain_Missing); } diff --git a/test/qt/workflows/states/test_StateRedirectBrowser.cpp b/test/qt/workflows/states/test_StateRedirectBrowser.cpp index 846378810..2382a2e48 100644 --- a/test/qt/workflows/states/test_StateRedirectBrowser.cpp +++ b/test/qt/workflows/states/test_StateRedirectBrowser.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateRedirectBrowser.h" @@ -63,6 +63,7 @@ class test_StateRedirectBrowser QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations QVERIFY(qobject_cast(mAuthContext->getActivationContext())->isSendErroPageCalled()); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Redirect_Browser_Send_Error_Page_Failed); } @@ -89,6 +90,7 @@ class test_StateRedirectBrowser QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations QVERIFY(qobject_cast(mAuthContext->getActivationContext())->isSendErroPageCalled()); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Redirect_Browser_Send_Error_Page_Failed); } @@ -117,6 +119,7 @@ class test_StateRedirectBrowser QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations QVERIFY(qobject_cast(mAuthContext->getActivationContext())->isSendErroPageCalled()); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Redirect_Browser_Send_Error_Page_Failed); } @@ -145,6 +148,7 @@ class test_StateRedirectBrowser QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations QVERIFY(qobject_cast(mAuthContext->getActivationContext())->isSendRedirectCalled()); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Redirect_Browser_Send_Redirect_Failed); } @@ -175,6 +179,7 @@ class test_StateRedirectBrowser QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations QVERIFY(qobject_cast(mAuthContext->getActivationContext())->isSendRedirectCalled()); + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Redirect_Browser_Send_Redirect_Failed); } diff --git a/test/qt/workflows/states/test_StateSelectReader.cpp b/test/qt/workflows/states/test_StateSelectReader.cpp index 727c7b732..1037fd7af 100644 --- a/test/qt/workflows/states/test_StateSelectReader.cpp +++ b/test/qt/workflows/states/test_StateSelectReader.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests the StateSelectReader - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateSelectReader.h" @@ -67,22 +69,6 @@ class test_StateSelectReader } - void test_OnReaderStatusChanged() - { - const auto pType = ReaderManagerPlugInType::PCSC; - mContext->setReaderPlugInTypes({pType}); - mContext->setStateApproved(); - - QVERIFY(!Env::getSingleton()->isScanRunning(pType)); - - QSignalSpy spyRetry(mState.data(), &StateSelectReader::fireRetry); - - mState->onReaderStatusChanged(ReaderManagerPlugInInfo(pType)); - - QTRY_COMPARE(spyRetry.count(), 1); // clazy:exclude=qstring-allocations - } - - void test_fireReaderPlugInTypesChanged() { QSignalSpy spyRetry(mState.data(), &StateSelectReader::fireRetry); diff --git a/test/qt/workflows/states/test_StateSendWhitelistSurvey.cpp b/test/qt/workflows/states/test_StateSendWhitelistSurvey.cpp index bb760d707..fd5ac87b0 100644 --- a/test/qt/workflows/states/test_StateSendWhitelistSurvey.cpp +++ b/test/qt/workflows/states/test_StateSendWhitelistSurvey.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateSendWhitelistSurvey.h" diff --git a/test/qt/workflows/states/test_StateStartPaosResponse.cpp b/test/qt/workflows/states/test_StateStartPaosResponse.cpp index 6f3125ca8..a2fa945a3 100644 --- a/test/qt/workflows/states/test_StateStartPaosResponse.cpp +++ b/test/qt/workflows/states/test_StateStartPaosResponse.cpp @@ -1,5 +1,5 @@ -/*! - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include @@ -56,6 +56,8 @@ class test_StateStartPaosResponse const ECardApiResult& result = mState->getContext()->getStartPaosResult(); QCOMPARE(result.getMajor(), ECardApiResult::Major::Error); QCOMPARE(result.getMinor(), ECardApiResult::Minor::DP_Timeout_Error); + + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Start_Paos_Response_Error); } @@ -69,6 +71,7 @@ class test_StateStartPaosResponse mAuthContext->setStateApproved(); QTRY_COMPARE(spy.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mAuthContext->getFailureCode(), FailureCode::Reason::Start_Paos_Response_Error); } diff --git a/test/qt/workflows/states/test_StateTransmit.cpp b/test/qt/workflows/states/test_StateTransmit.cpp index 3ca39da55..a64e6bce0 100644 --- a/test/qt/workflows/states/test_StateTransmit.cpp +++ b/test/qt/workflows/states/test_StateTransmit.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateTransmit - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateTransmit.h" @@ -109,6 +111,7 @@ class test_StateTransmit command->setMockReturnCode(CardReturnCode::UNKNOWN); stateTransmit.onCardCommandDone(command); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Transmit_Card_Command_Failed); } diff --git a/test/qt/workflows/states/test_StateUpdRetryCounter.cpp b/test/qt/workflows/states/test_StateUpdRetryCounter.cpp index df470e782..8c23ce3b9 100644 --- a/test/qt/workflows/states/test_StateUpdRetryCounter.cpp +++ b/test/qt/workflows/states/test_StateUpdRetryCounter.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateUpdateRetryCounter - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateUpdateRetryCounter.h" @@ -58,6 +60,7 @@ class test_StateUpdateRetryCounter counter.run(); QCOMPARE(spyContinue.count(), 0); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Update_Retry_Counter_No_Card_Connection); } @@ -74,6 +77,7 @@ class test_StateUpdateRetryCounter QTest::ignoreMessage(QtCriticalMsg, "An error occurred while communicating with the card reader, cannot determine retry counter, abort state"); counter.onUpdateRetryCounterDone(command); QCOMPARE(spyAbort.count(), 1); + QCOMPARE(context->getFailureCode(), FailureCode::Reason::Update_Retry_Counter_Communication_Error); command->setMockReturnCode(CardReturnCode::OK); context->setCardConnection(QSharedPointer::create()); diff --git a/test/qt/workflows/states/test_StateVerifyRetryCounter.cpp b/test/qt/workflows/states/test_StateVerifyRetryCounter.cpp index f9c39f5be..2bbfeacb4 100644 --- a/test/qt/workflows/states/test_StateVerifyRetryCounter.cpp +++ b/test/qt/workflows/states/test_StateVerifyRetryCounter.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateVerifyRetryCounter - * - * \copyright Copyright (c) 2018-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateVerifyRetryCounter.h" @@ -69,6 +71,7 @@ class test_StateVerifyRetryCounter QTest::ignoreMessage(QtDebugMsg, "Card connection lost."); mContext->setStateApproved(); QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(mContext->getFailureCode(), FailureCode::Reason::Verify_Retry_Counter_No_Card_Connection); } diff --git a/test/qt/workflows/states/test_StateWriteHistory.cpp b/test/qt/workflows/states/test_StateWriteHistory.cpp index bb0e832ae..fec2f6e8e 100644 --- a/test/qt/workflows/states/test_StateWriteHistory.cpp +++ b/test/qt/workflows/states/test_StateWriteHistory.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref StateWriteHistory - * - * \copyright Copyright (c) 2019-2023 Governikus GmbH & Co. KG, Germany */ #include "states/StateWriteHistory.h" @@ -61,9 +63,10 @@ class test_StateWriteHistory Env::getSingleton()->getHistorySettings().setEnabled(true); *mContext->getAccessRightManager() = {}; - QTest::ignoreMessage(QtWarningMsg, "No EAC1 structure or effective CHAT in model."); + QTest::ignoreMessage(QtWarningMsg, "No effective CHAT in context."); mContext->setStateApproved(); QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations + QCOMPARE(*mContext->getFailureCode(), FailureCode::Reason::Write_History_No_Chat); } diff --git a/test/qt/workflows/states/test_TermsOfUsage.cpp b/test/qt/workflows/states/test_TermsOfUsage.cpp index 0812ee806..0bba3d43e 100644 --- a/test/qt/workflows/states/test_TermsOfUsage.cpp +++ b/test/qt/workflows/states/test_TermsOfUsage.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Tests the Terms of Usage of CertificateDescription - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "asn1/CertificateDescription.h" diff --git a/test/qt/workflows/test_CertificateChecker.cpp b/test/qt/workflows/test_CertificateChecker.cpp index 8ca272b30..5ce59cf74 100644 --- a/test/qt/workflows/test_CertificateChecker.cpp +++ b/test/qt/workflows/test_CertificateChecker.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref CertificateChecker - * - * \copyright Copyright (c) 2015-2023 Governikus GmbH & Co. KG, Germany */ #include "CertificateChecker.h" diff --git a/test/qt/workflows/test_ChangePinController.cpp b/test/qt/workflows/test_ChangePinController.cpp index d58bc2316..594b6c001 100644 --- a/test/qt/workflows/test_ChangePinController.cpp +++ b/test/qt/workflows/test_ChangePinController.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Test for the Change PIN functionality. - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "controller/ChangePinController.h" diff --git a/test/qt/workflows/test_TcToken.cpp b/test/qt/workflows/test_TcToken.cpp index e1ab68829..e704c2b4a 100644 --- a/test/qt/workflows/test_TcToken.cpp +++ b/test/qt/workflows/test_TcToken.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref TcToken - * - * \copyright Copyright (c) 2014-2023 Governikus GmbH & Co. KG, Germany */ #include "TcToken.h" diff --git a/test/qt/workflows/test_WorkflowRequest.cpp b/test/qt/workflows/test_WorkflowRequest.cpp index be896f42d..4ce9eb2a2 100644 --- a/test/qt/workflows/test_WorkflowRequest.cpp +++ b/test/qt/workflows/test_WorkflowRequest.cpp @@ -1,7 +1,9 @@ +/** + * Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany + */ + /*! * \brief Unit tests for \ref WorkflowRequest - * - * \copyright Copyright (c) 2021-2023 Governikus GmbH & Co. KG, Germany */ #include "WorkflowRequest.h"