Compare commits

...

35 Commits

Author SHA1 Message Date
Governikus 684e3a1f06 Merge v1.18.2 into community 2019-09-30 17:28:17 +02:00
Governikus 53fc9bb552 Add revision: v1.18.2 2019-09-30 17:25:27 +02:00
Governikus feb2a155e9 Add revision: v1.18.1 2019-09-30 17:23:39 +02:00
Governikus fb0491a6cb Add revision: v1.18.0 2019-09-30 17:22:19 +02:00
Governikus 9ba662c3bb Merge v1.16.2 into community 2019-05-22 10:11:32 +02:00
Governikus 9484181f86 Add revision: v1.16.2 2019-05-22 10:08:38 +02:00
André Klitzing ebe1437537 Upgrade to Alpine v3.9 and build against system libs 2019-01-31 11:22:27 +01:00
Christian Grasser dab96eb2bd build with open ssl 1.1.1, see https://www.appveyor.com/docs/windows-images-software/#tools for the exact version 1.1.1 for APPVEYOR_BUILD_WORKER_IMAGE VS2015 and 1.1.1a for VS2017 2019-01-14 10:16:14 +01:00
André Klitzing 806a4dc6d7 Fix appveyor of MSVC for __RPC_CALLEE
Looks like some versions do not accept __RPC_CALLEE.
Otherwise the clang compiler for Windows will output a warning
like this:

src\core\SignalHandler.cpp(46,25):  error: cast between incompatible calling conventions 'cdecl' and 'stdcall'; calls through this pointer may abort at runtime [-Werror,-Wcast-calling-convention]
           SetConsoleCtrlHandler(PHANDLER_ROUTINE(ctrlHandler), true);

\src\core\SignalHandler.h(48,15):  note: consider defining 'ctrlHandler' with the 'stdcall' calling convention
               static BOOL ctrlHandler(DWORD pCtrlType);
                           ^
                           __RPC_CALLEE
2019-01-07 14:25:59 +01:00
André Klitzing 84d957f9a8 Switch default PATH for mingw
Otherwise it tries to copy from the separate Qt mingw
installation.
2019-01-07 10:55:48 +01:00
Governikus c9adf39cdc Merge v1.16.1 into community 2019-01-03 15:14:53 +01:00
Governikus b4326788d7 Add revision: v1.16.1 2019-01-03 15:12:45 +01:00
Governikus 34e33f4aa6 Add revision: v1.16.0 2019-01-03 15:06:22 +01:00
John Paul Adrian Glaubitz 5914a27069 Add missing GenericName field in Linux desktop file 2018-11-26 11:04:29 +01:00
John Paul Adrian Glaubitz 5b8016c407 Use valid value for Categories field in Linux desktop file 2018-11-26 11:04:29 +01:00
Christian Grasser 7dd727820c testbuild of QT 5.11.1 + OpenSSL 1.1 2018-10-15 15:01:03 +02:00
Stephan Linz 06836ad54b fix: workaround GCC < 5.x bugs in implicit casts
The following error happens when building with GCC 4.8.5:

    no matching function for call to ‘QObject::connect(QPointer<T>&, ...)’
    no matching function for call to ‘QObject::disconnect(QPointer<T>&, ...)’

There is a simular problem in qtlocation, see Qt bug report:

    https://bugreports.qt.io/browse/QTBUG-69512

It's apparently a compiler bug fixed in GCC 5.x and later.

Signed-off-by: Stephan Linz <linz@li-pro.net>
2018-09-28 16:09:19 +02:00
Governikus 3d08ce3e5f Merge v1.14.3 into community 2018-07-10 14:26:29 +02:00
Governikus 44f272b159 Add revision: v1.14.3 2018-07-10 14:25:24 +02:00
Governikus e626090014 Add tag 1.14.2
-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEaZvzBVsKSSJO/efHLXR5pTFFEIgFAlsqQi4ACgkQLXR5pTFF
 EIj+1w/+OWkoPXGKzGXd/jlHECI7Ki4UEE91DHlOkyWJjT98NqGKfZ/dxMqYmLDW
 L+CBIoOmvSkd/SX2b3MbQ+30JTf5BntPFAt/nS40wPYGcDF+utBkpItS8aidse2y
 FS9qFsyGRy2rkx8tKbLF7OT4QaQ9/89ONP/z/U7+mh6pz4dbb4N2vCGlH7JLpWgD
 mLMa3ZmMbIUgAuFWEVsRLE6cipoE5Hihm/40YRFRb7imcFkBDI5QD1WszV5vxKnB
 sYbNGE2Q7+IXwN9UjkSt8u4T9cz2zoKFm7ic3J235ALezvbkROprBfH2eG0UxGD4
 GW1AAaKQ1p5v0/CiqhR8u1X3e2+kQDxT8qgbZk7y9Dmu4GgbYemqRvVhnAdOPfjn
 xzUP2k0pBF6UsJtgQVy8RWZOon2EXeWhW4rvzyvOHvlo2Yzip88CEo1ZxlzyWWPU
 RcCfF+twHx18r/KA20f0jnX3tZZH5fs0wJcfURQHIs9+EHBzCGHORX6x/tP3SXXR
 iL6XlDEItxSbpJxS92yHST8YmiZZmhB/i32z06e2MifSbNowEa4sXEPsJ5Eec6vo
 AP2TqMs2TFb8JIwq7iWjpbMOqSEJfFKhtHseqsp2qzqmojwY3sQ8awXPeoylgVIN
 aeBt71zMWHDrI83qLqSCKdVTea5njLM/4moTSeizhqmrngjOrXI=
 =MJ0/
 -----END PGP SIGNATURE-----

Merge v1.14.2 into community
2018-06-20 14:07:29 +02:00
Governikus b63df30687 Add revision: v1.14.2 2018-06-20 13:59:17 +02:00
Governikus b4c1fbe7a9 Merge v1.14.1 into community 2018-03-28 15:25:34 +02:00
André Klitzing 8fe1abdaf5 Use 5.9 for appveyor as it is mapped to current version 2018-02-06 08:35:31 +01:00
André Klitzing ee73f4b147 Add support of MinGW on AppVeyor 2018-02-05 17:07:41 +01:00
André Klitzing 19b093efcd Use target package to build MSI file 2018-01-10 13:17:34 +01:00
Christian Grasser 73d816c247 Add initial support of AppVeyor 2018-01-08 10:11:02 +01:00
Governikus fd71d19839 Merge v1.14.0 into community 2017-12-20 15:05:48 +01:00
André Klitzing a5b97b53eb Add initial support for Travis CI 2017-10-05 13:36:17 +02:00
André Klitzing 4c82591b8e Add additional names of Sphinx "binary" 2017-10-05 13:36:17 +02:00
Governikus b41ed2ead7 Merge v1.12.4 into community 2017-09-22 13:06:16 +02:00
André Klitzing 38c4245d1c Fix linux release build if bluetooth is unavailable 2017-09-18 12:04:55 +02:00
Governikus 8fce07113d Merge v1.12.3 into community 2017-09-15 10:40:45 +02:00
Sebastian Janzen 2c9ceb430c Update README.rst
Kleinigkeiten:
 - _Jenkins_ ist ein Produktname, daher solle es nicht _Der Jenkins_ heißen.
 - _macOS_ wird mit kleinem _m_ geschrieben.
 - iOS Apps werden unter macOS gebaut, nicht unter iOS
2017-08-07 11:17:38 +02:00
André Klitzing 3b90861aa4 Fix detection of dirty working copy with git 2017-07-05 15:43:07 +02:00
André Klitzing 7a463a2a06 Fix detection of current tag with git 2017-07-05 15:43:07 +02:00
2933 changed files with 115091 additions and 67590 deletions

18
.clang-tidy 100644
View File

@ -0,0 +1,18 @@
---
Checks: '
,*,
,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
,-cppcoreguidelines-special-member-functions,
,-cppcoreguidelines-pro-type-union-access,
,-hicpp-special-member-functions,
,-hicpp-use-override,
,-google-build-using-namespace,
,-modernize-use-default-member-init,
,-modernize-use-override,
,-readability-redundant-member-init,
,-readability-implicit-bool-cast,
'
WarningsAsErrors: ''
HeaderFilterRegex: ''
AnalyzeTemporaryDtors: false

View File

@ -1,16 +1,25 @@
language: shell
sudo: required
cache:
ccache: true
directories:
- $HOME/.ccache
env:
matrix:
- CHECK=format
- CHECK=docs
- CHECK=build TYPE=debug COMPILER=g++
- CHECK=build TYPE=release COMPILER=g++
- CHECK=build TYPE=debug COMPILER=clang++
- CHECK=build TYPE=release COMPILER=clang++
install:
- sudo resources/travis/setup.sh $CHECK
- sudo -E resources/travis/setup.sh
script:
- sudo resources/travis/build.sh $CHECK
- sudo -E resources/travis/build.sh
notifications:
email: false

View File

@ -0,0 +1,12 @@
########################################
# Generate build dependency
#
# cmake --build . --target architecture
########################################
SET(GRAPHVIZ_IGNORE_TARGETS AusweisAppGlobal;AusweisAppExternal;cvc;fuzz;OpenSsl;tlscheck;Test;Script)
SET(GRAPHVIZ_EXTERNAL_LIBS OFF)
SET(GRAPHVIZ_EXECUTABLES ON)
SET(GRAPHVIZ_GENERATE_PER_TARGET OFF)
SET(GRAPHVIZ_GENERATE_DEPENDERS OFF)
SET(GRAPHVIZ_GRAPH_NAME AusweisApp2)

View File

@ -1,4 +1,4 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.5.0)
CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
IF(POLICY CMP0020)
CMAKE_POLICY(SET CMP0020 NEW)
@ -24,6 +24,10 @@ IF(POLICY CMP0071)
CMAKE_POLICY(SET CMP0071 NEW)
ENDIF()
IF(POLICY CMP0074)
CMAKE_POLICY(SET CMP0074 NEW)
ENDIF()
# "tools.only" can be defined to disable the normal build and enable
# cmdline "tools" only. For example: "make format" or "make package_source"
IF(tools.only)
@ -33,7 +37,7 @@ ELSE()
ENDIF()
PROJECT(AusweisApp2 VERSION 1.14.1 LANGUAGES ${LANGUAGES})
PROJECT(AusweisApp2 VERSION 1.18.2 LANGUAGES ${LANGUAGES})
# Set TWEAK if not defined in PROJECT_VERSION above to
# have a valid tweak version without propagating it
@ -42,10 +46,11 @@ IF(NOT PROJECT_VERSION_TWEAK)
ENDIF()
IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR ANDROID OR IOS)
IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
SET(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/dist" CACHE PATH "default install path" FORCE)
ENDIF()
SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
SET(CMAKE_DIR "${PROJECT_SOURCE_DIR}/cmake")
SET(CMAKE_MODULE_PATH "${CMAKE_DIR}")
OPTION(BUILD_SHARED_LIBS "Enable build of shared libraries")
INCLUDE(Helper)
@ -86,7 +91,7 @@ IF(IOS)
MESSAGE(STATUS "USE_DISTRIBUTION_PROFILE: ${USE_DISTRIBUTION_PROFILE}")
ENDIF()
IF("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
IF("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}" AND NOT FORCE_SOURCE_BUILD)
MESSAGE(FATAL_ERROR "in tree building is not supported!")
ENDIF()
@ -96,20 +101,18 @@ ELSE()
SET(CMAKE_BUILD_TYPE "DEBUG" CACHE STRING "build type configuration" FORCE)
ENDIF()
IF(NOT ${CMAKE_BUILD_TYPE} STREQUAL "DEBUG" AND NOT ${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
MESSAGE(FATAL_ERROR "CMAKE_BUILD_TYPE is invalid! Available options: RELEASE, DEBUG")
IF(DESKTOP)
SET(CMAKE_AUTOUIC ON)
ENDIF()
SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
SET(TEST_DIR ${PROJECT_SOURCE_DIR}/test)
SET(RESOURCES_DIR ${PROJECT_SOURCE_DIR}/resources)
SET(PACKAGING_DIR ${RESOURCES_DIR}/packaging)
SET(EXECUTABLE_BASE_NAME AusweisApp2)
SET(EXECUTABLE_NAME ${EXECUTABLE_BASE_NAME}${CMAKE_EXECUTABLE_SUFFIX})
SET(COPYRIGHT_TEXT "&#9400\; 2014-2019 ${VENDOR}")
STRING(REPLACE " \& " " \&amp; " COPYRIGHT_TEXT ${COPYRIGHT_TEXT})
INCLUDE(Tools)
INCLUDE(DVCS)
@ -131,13 +134,16 @@ ADD_SUBDIRECTORY(src)
IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
INCLUDE(CTest)
CONFIGURE_FILE("${CMAKE_MODULE_PATH}/CTestCustom.cmake.in" "${CMAKE_BINARY_DIR}/CTestCustom.cmake" COPYONLY)
CONFIGURE_FILE("${CMAKE_DIR}/CTestCustom.cmake.in" "${CMAKE_BINARY_DIR}/CTestCustom.cmake" @ONLY)
CONFIGURE_FILE("${RESOURCES_DIR}/sonar-project.properties.in" "${CMAKE_BINARY_DIR}/sonar-project.properties" @ONLY)
ENDIF()
IF(BUILD_TESTING)
ADD_SUBDIRECTORY(test)
ENDIF()
ADD_SUBDIRECTORY(utils)
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/utils")
ADD_SUBDIRECTORY(utils)
ENDIF()
INCLUDE(Packaging)

View File

@ -1,50 +1,7 @@
Nutzungsbedingungen
Allgemeines zur Installation
Bitte lesen Sie zunächst die Lizenzbestimmungen und deren Ergänzungen für die Überlassung und Nutzung der AusweisApp2 durch. Nachdem Sie diesen zugestimmt haben, können Sie die Installation fortsetzen. Datenschutzrechtliche Hinweise sind unter https://www.ausweisapp.bund.de/datenschutz/ abrufbar.
Bitte lesen Sie zunächst die Allgemeinen Geschäftsbedingungen so wie die Lizenzbedingungen für die Überlassung und Nutzung der AusweisApp2 durch. Nachdem Sie zugestimmt haben, können Sie die Installation fortsetzen.
Allgemeine Geschäftsbedingungen
§ 1 Nutzungsbedingungen und Datenschutzhinweis
(1) Diese Allgemeine Geschäftsbedingungen (AGB) des Bundes, vertreten durch das Bundesministerium des Innern, für Bau und Heimat (nachfolgend "Bund") und dem Nutzer gelten für die Überlassung und Nutzung der Software AusweisApp2 (nachfolgend AusweisApp2) und deren neue Versionen, die auf der Grundlage dieser Bedingungen überlassen werden.
(2) "Nutzer" im Sinne dieses Vertrages sind natürliche Personen.
§ 2 Vertragsgegenstand und Unentgeltlichkeit
(1) Die AusweisApp2 wird regelmäßig hinsichtlich ihrer Konformität zu den Technischen Richtlinien des Bundesamtes für Sicherheit in der Informationstechnik [TR-03124-2] zertifiziert sowie hinsichtlich ihrer Nutzerfreundlichkeit [EN ISO 9241 Teil 110 Ergonomie Mensch-System-Integration zur Prüfung der Benutzbarkeit und Funktionalität und Trusted Design Guidelines zur Prüfung der Vertrauenswürdigkeit] und auf Barrierefreiheit [BITV 2.0] überprüft.
(2) Die AusweisApp2 wird in maschinenlesbarer Form unentgeltlich überlassen. Der Quellcode der AusweisApp2 wird ebenfalls unentgeltlich veröffentlicht. Eine Auflistung der verwendeten Open Source-Bestandteile der AusweisApp2 findet sich im Anhang.
(3) Die AusweisApp2 wird von der Governikus GmbH & Co. KG (Governikus) als Erfüllungsgehilfe des Bundes überlassen.
§ 3 Verwendungszweck
Die AusweisApp2 und alle ihre Bestandteile dienen ausschließlich dazu, im Zusammenhang mit der Nutzung der Online-Ausweisfunktion des Personalausweises bzw. des elektronischen Aufenthaltstitels und der Übermittlung der damit verbundenen Daten gemäß den gesetzlichen Vorgaben verwendet zu werden.
§ 4 Pflichten und Obliegenheiten des Nutzers
(1) Der Nutzer verpflichtet sich, die AusweisApp2 entsprechend des in § 3 genannten Verwendungszweckes zu nutzen. Es liegt in seinem Interesse, dass in Verbindung mit der AusweisApp2 genutzte Hard- und Software des Nutzers immer auf dem neuesten Stand der Sicherheitstechnik (System- und Firmware Update, Virenscanner, Firewall usw.) sind.
(2) Es liegt im eigenen Interesse des Nutzers aber auch des Bundes, dass stets nur die neueste Version der AusweisApp2 (siehe § 5) verwendet wird.
§ 5 Pflege und Support
(1) Der Bund bietet nach eigenem Ermessen und ohne hierzu verpflichtet zu sein für Teile der AusweisApp2 zusätzliche kostenfreie Supportleistungen in Form von Dokumentationen und online Hilfen auf dem AusweisApp2-Portal im Internet unter der Adresse www.ausweisapp.bund.de an, sowie über die Hotline des Herstellers Governikus unter der E-Mail-Adresse: support@ausweisapp.de und der Tel.-Nr.: +49 1805 348 743. Auch stellt er verfügbare neue Versionen der AusweisApp2 zur Verfügung. Hieraus erwächst jedoch kein zusätzlicher Anspruch auf Mängelbeseitigung, auf Zertifizierung, auf Beibehaltung der Supportleistungen oder der Hotline und auf Überlassung neuer Versionen.
(2) Verfügbare neue Versionen der AusweisApp2 können im Internet kostenfrei auf dem AusweisApp2-Portal unter der Adresse www.ausweisapp.bund.de sowie über allgemein zugängliche AppStore heruntergeladen werden.
(3) Eventuelle Mängel der AusweisApp2 werden grundsätzlich dadurch behoben, dass der Bund jeweils eine neue Version der AusweisApp2 zum Herunterladen zur Verfügung stellt (siehe § 5 Absatz 1). Eine Pflicht zur Bereitstellung von neuen Versionen ergibt sich daraus grundsätzlich nicht.
§ 6 Hinweis auf gewerbliche und urheberrechtliche Schutzrechte
Die Zeichen AusweisApp2 und die entsprechenden Grafiken sowie das Signet zur Online-Ausweisfunktion sind für den Bund als Marken geschützt.
§ 7 Datenschutzhinweis
(1) Mit dieser Software werden personenbezogene Daten im Sinne des § 3 Absatz 1 des Bundesdatenschutzgesetzes (BDSG) zum Zwecke der Verarbeitung grundsätzlich nicht erhoben.
(2) Personenbezogene Daten aus dem Ausweischip werden ausschließlich zum Zweck des elektronischen Identitätsnachweises im Umfang der erteilten Berechtigung nach Einwilligung des Nutzers mit seiner Ausweis-PIN-Eingabe und auf dem Transportweg zwischen dem Ausweischip und dem Diensteanbieter sicher verschlüsselt und auch für Governikus nicht lesbar übertragen.
(3) Neben den reinen Daten, die zur Identifizierung/ Authentisierung benötigt werden, erhebt die Software nur mit Einverständnis des Nutzers Daten über die Art und Version der Anwendungsumgebung (Betriebssystem, Lesegeräte usw.) des Nutzers. Diese Daten kann der Nutzer bei Bedarf an Governikus übermitteln, um die ordnungsgemäße Verarbeitung prüfen zu lassen und Fehlern im Verarbeitungsprozess vorzubeugen. Die Nutzung der Daten erfolgt dann im Rahmen des § 14 BDSG durch Governikus im Auftrag des Bundes und nur für den genannten Zweck.
(4) Die in der AusweisApp2 enthaltene Selbstauskunft über die im Chip gespeicherten Daten, ist ein Dienst der durch Governikus über das Internet erbracht wird. Die Ausweisdaten werden dabei nur zur Anzeige des Nutzers gebracht und nicht dauerhaft bei Governikus gespeichert oder für andere Zwecke verwendet.
§ 8 Deutsches Recht
Auf diese Nutzungsbedingungen ist ausschließlich deutsches Recht unter Ausschluss des Übereinkommens der Vereinten Nationen über Verträge über den internationalen Warenkauf (CISG) anwendbar.
Anhang
Eingearbeitete Open Source-Komponenten
Qt, OpenSSL und http_parser.
@ -344,6 +301,68 @@ Unbeschadet besonderer Vereinbarungen zwischen den Parteien gilt Folgendes:
Lizenzergänzungen
§ 1 Nutzungsbedingungen
(1) Diese Allgemeine Geschäftsbedingungen (AGB) des Bundes, vertreten durch das Bundesamt für Sicherheit in der Informationstechnik (nachfolgend "Bund") und dem Nutzer gelten für die Überlassung und Nutzung der Software AusweisApp2 (nachfolgend AusweisApp2) und deren neue Versionen, die auf der Grundlage dieser Bedingungen überlassen werden.
(2) "Nutzer" im Sinne dieses Vertrages sind natürliche Personen.
§ 2 Vertragsgegenstand und Unentgeltlichkeit
(1) Die AusweisApp2 wird regelmäßig hinsichtlich ihrer Konformität zu den Technischen Richtlinien des Bundesamtes für Sicherheit in der Informationstechnik [TR-03124-2] zertifiziert sowie hinsichtlich ihrer Nutzerfreundlichkeit [EN ISO 9241 Teil 110 Ergonomie Mensch-System-Integration zur Prüfung der Benutzbarkeit und Funktionalität und Trusted Design Guidelines zur Prüfung der Vertrauenswürdigkeit] und auf Barrierefreiheit [BITV 2.0] überprüft.
(2) Die AusweisApp2 wird in maschinenlesbarer Form unentgeltlich überlassen. Der Quellcode der AusweisApp2 wird ebenfalls unentgeltlich veröffentlicht. Eine Auflistung der verwendeten Open Source-Bestandteile der AusweisApp2 findet sich im Anhang.
(3) Die AusweisApp2 wird von der Governikus GmbH & Co. KG (Governikus) als Erfüllungsgehilfe des Bundes überlassen.
§ 3 Verwendungszweck
Die AusweisApp2 und alle ihre Bestandteile dienen ausschließlich dazu, im Zusammenhang mit der Nutzung der Online-Ausweisfunktion des Personalausweises bzw. des elektronischen Aufenthaltstitels und der Übermittlung der damit verbundenen Daten gemäß den gesetzlichen Vorgaben verwendet zu werden.
§ 4 Pflichten und Obliegenheiten des Nutzers
(1) Der Nutzer verpflichtet sich, die AusweisApp2 entsprechend des in § 3 genannten Verwendungszweckes zu nutzen. Es liegt in seinem Interesse, dass in Verbindung mit der AusweisApp2 genutzte Hard- und Software des Nutzers immer auf dem neuesten Stand der Sicherheitstechnik (System- und Firmware Update, Virenscanner, Firewall usw.) sind.
(2) Es liegt im eigenen Interesse des Nutzers aber auch des Bundes, dass stets nur die neueste Version der AusweisApp2 (siehe § 5) verwendet wird.
§ 5 Pflege und Support
(1) Der Bund bietet nach eigenem Ermessen und ohne hierzu verpflichtet zu sein für Teile der AusweisApp2 zusätzliche kostenfreie Supportleistungen in Form von Dokumentationen und online Hilfen auf dem AusweisApp2-Portal im Internet unter der Adresse www.ausweisapp.bund.de an, sowie über die Hotline des Herstellers Governikus unter der E-Mail-Adresse: support@ausweisapp.de und der Tel.-Nr.: +49 421 204 95-995. Auch stellt er verfügbare neue Versionen der AusweisApp2 zur Verfügung. Hieraus erwächst jedoch kein Anspruch auf Mängelbeseitigung, auf Zertifizierung, auf Beibehaltung der Supportleistungen oder der Hotline und auf Überlassung neuer Versionen.
(2) Verfügbare neue Versionen der AusweisApp2 können im Internet kostenfrei auf dem AusweisApp2-Portal unter der Adresse www.ausweisapp.bund.de sowie über allgemein zugängliche AppStore heruntergeladen werden.
(3) Eventuelle Mängel der AusweisApp2 werden grundsätzlich dadurch behoben, dass der Bund jeweils eine neue Version der AusweisApp2 zum Herunterladen zur Verfügung stellt (siehe § 5 Absatz 1). Eine Pflicht zur Bereitstellung von neuen Versionen ergibt sich daraus nicht.
§ 6 Hinweis auf gewerbliche und urheberrechtliche Schutzrechte
Die Zeichen AusweisApp2 und die entsprechenden Grafiken sowie das Signet zur Online-Ausweisfunktion sind für den Bund als Marken geschützt.
§ 7 Deutsches Recht
Auf diese Nutzungsbedingungen ist ausschließlich deutsches Recht unter Ausschluss des Übereinkommens der Vereinten Nationen über Verträge über den internationalen Warenkauf (CISG) anwendbar.
Anhang
Ergänzende Lizenzhinweise
Die verwendeten Open-Source-Bibliotheken unterliegen den folgenden Nutzungsbedingungen:
OpenSSL
Lizenz: OpenSSL license & SSLeay license
Version: 1.1.1c
Adresse: https://www.openssl.org/
Qt
Lizenz: LGPL v3
Version: 5.12.4
Adresse: https://www.qt.io/
http_parser
Lizenz: MIT
Version: 2.9.2
Adresse: https://github.com/nodejs/http-parser/
Android Support Library V4
Lizenz: Apache 2.0
Version: 21.0.3
Adresse: https://developer.android.com/topic/libraries/support-library/
Die Lizenztexte lauten in ihrer originalen Fassung wie folgt:
Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.
@ -459,28 +478,6 @@ copied and put under another distribution licence
Ergänzende Linzenzhinweise
Die verwendeten OpenSource-Bibliotheken unterliegen den folgenden Nutzungsbedingungen:
Qt
Lizenz: LGPL v3
Version: 5.9.3
Adresse: https://www.qt.io/
http_parser
Lizenz: MIT
Version: 2.7.1
Adresse: https://github.com/nodejs/http-parser/
Die Lizenztexte lauten in ihrer originalen Fassung wie folgt:
GNU LESSER GENERAL PUBLIC LICENSE
The Qt Toolkit is Copyright (C) 2016 The Qt Company Ltd.
@ -680,3 +677,185 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

View File

@ -294,6 +294,38 @@ Unbeschadet besonderer Vereinbarungen zwischen den Parteien gilt Folgendes:
Anhang
Ergänzende Lizenzhinweise
Die verwendeten Open-Source-Bibliotheken unterliegen den folgenden Nutzungsbedingungen:
OpenSSL
Lizenz: OpenSSL license & SSLeay license
Version: 1.1.1c
Adresse: https://www.openssl.org/
Qt
Lizenz: LGPL v3
Version: 5.12.4
Adresse: https://www.qt.io/
http_parser
Lizenz: MIT
Version: 2.9.2
Adresse: https://github.com/nodejs/http-parser/
Android Support Library V4
Lizenz: Apache 2.0
Version: 21.0.3
Adresse: https://developer.android.com/topic/libraries/support-library/
Die Lizenztexte lauten in ihrer originalen Fassung wie folgt:
Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.
@ -409,28 +441,6 @@ copied and put under another distribution licence
Ergänzende Linzenzhinweise
Die verwendeten OpenSource-Bibliotheken unterliegen den folgenden Nutzungsbedingungen:
Qt
Lizenz: LGPL v3
Version: 5.9.3
Adresse: https://www.qt.io/
http_parser
Lizenz: MIT
Version: 2.7.1
Adresse: https://github.com/nodejs/http-parser/
Die Lizenztexte lauten in ihrer originalen Fassung wie folgt:
GNU LESSER GENERAL PUBLIC LICENSE
The Qt Toolkit is Copyright (C) 2016 The Qt Company Ltd.
@ -630,3 +640,185 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

View File

@ -4,7 +4,7 @@ AusweisApp2
Kontakt
-------
| Governikus GmbH & Co. KG
| Am Fallturm 9
| Hochschulring 4
| 28359 Bremen
| ausweisapp2@governikus.de
@ -27,15 +27,6 @@ Die separate README und das Skript unter "libs" dienen dem Aufzusetzen
der notwendigen Build-Umgebung und dem automatisierten Bauen der
notwendigen Bibliotheken mit den entsprechenden Patches.
Derzeit ist es leider noch nicht möglich, die AusweisApp2 ohne Patches
an OpenSSL und Qt voll funktionsfähig auszuliefern.
Dies liegt unter anderem an dem notwendigen RSA-PSK-Patch für
OpenSSL 1.0.2, welcher mit OpenSSL 1.1.0 nicht mehr notwendig ist.
Diese OpenSSL-Version wird allerdings erst mit Qt 5.10 unterstützt.
(siehe https://bugreports.qt.io/browse/QTBUG-52905)
OpenSSL 1.1.0 wird mit der AusweisApp2 1.14.0 unterstützt.
LibreSSL wird auf Grund des fehlenden RSA-PSK nicht unterstützt.
Build
@ -143,7 +134,7 @@ Für iOS wird die AusweisApp2 mittels XCode gebaut!
$ cd build
$ cmake -DCMAKE_PREFIX_PATH=/Users/governikus/Toolchain/dist -DCMAKE_TOOLCHAIN_FILE=../AusweisApp2/cmake/iOS.toolchain.cmake -DCMAKE_BUILD_TYPE=release ../AusweisApp2 -GXcode
$ xcodebuild -target install -configuration Release
$ xcodebuild -configuration Release
$ xcodebuild -target ipa -configuration Release

View File

@ -23,8 +23,8 @@ Tag bauen
---------
Die Release-Jobs müssen nach dem Tag manuell gestartet werden!
Jenkins erstellt das Release anhand des Bookmarks "release" oder des tags/changesets,
welcher als Parameter übergeben wird.
Jenkins erstellt das Release anhand des Parameters 'changeset'. Dort sollte der angebrachte
Tag oder die jeweilige Revision übergeben werden.
Nachdem die notwendigen Jobs (Windows/macOS/Docs/...) durchgelaufen sind, muss der Job
für den AppCast gestartet werden.

View File

@ -3,25 +3,22 @@ version: "{build}"
environment:
matrix:
- PlatformToolset: mingw-w64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
QTPath: C:\Qt\5.9\mingw53_32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
QTPath: C:\Qt\5.12\mingw73_64
OPENSSLPath: C:\OpenSSL-v111-Win64
- PlatformToolset: v140
platform: x64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
QTPath: C:\Qt\5.9\msvc2015_64
ARCHI: amd64
- PlatformToolset: v140
- PlatformToolset: v141
platform: Win32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
QTPath: C:\Qt\5.9\msvc2015
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
QTPath: C:\Qt\5.12\msvc2017
OPENSSLPath: C:\OpenSSL-v111-Win32
ARCHI: x86
- PlatformToolset: v141
platform: x64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
QTPath: C:\Qt\5.9\msvc2017_64
QTPath: C:\Qt\5.12\msvc2017_64
OPENSSLPath: C:\OpenSSL-v111-Win64
ARCHI: amd64
configuration:
@ -29,8 +26,7 @@ configuration:
#- Debug
install:
- if "%PlatformToolset%"=="mingw-w64" set PATH=C:\mingw-w64\i686-5.3.0-posix-dwarf-rt_v4-rev0\mingw32\bin;%PATH:C:\Program Files\Git\usr\bin;=%
- if "%PlatformToolset%"=="v140" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %archi%
- if "%PlatformToolset%"=="mingw-w64" set PATH=C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;%PATH:C:\Program Files\Git\usr\bin;=%
- if "%PlatformToolset%"=="v141" call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" %archi%
build:
@ -43,7 +39,6 @@ before_build:
$generator = switch ($env:PLATFORMTOOLSET)
{
"v141" {"Visual Studio 15 2017"}
"v140" {"Visual Studio 14 2015"}
"mingw-w64" {"MinGW Makefiles"}
}
if ($env:PLATFORM -eq "x64")
@ -53,15 +48,15 @@ before_build:
build_script:
- cd "%APPVEYOR_BUILD_FOLDER%"
- set PATH=%QTPATH%;%QTPATH%/bin;%PATH%
- set OPENSSL_ROOT=%OPENSSLPath%
- set PATH=%PATH%;%QTPATH%;%QTPATH%/bin;%OPENSSLPath%
- echo %PATH%
- echo %OPENSSL_ROOT%
- mkdir _build
- cd _build
- ps: |
# Use -DFORCE_LEGACY_OPENSSL=ON to build with the available openssl 1.0.2 of the appveyor build image
# otherwise openssl 1.1.x is required with an additional download and build step
cmake -G "$generator" -DCMAKE_BUILD_TYPE="$env:CONFIGURATION" -DFORCE_LEGACY_OPENSSL=ON ..
cmake -G "$generator" -DCMAKE_BUILD_TYPE="$env:CONFIGURATION" ..
if ($LastExitCode -ne 0) {
throw "Exec: $ErrorMessage"
}
@ -72,9 +67,9 @@ build_script:
test_script:
- cd "%APPVEYOR_BUILD_FOLDER%"/_build
- set PATH=%QTPATH%;%QTPATH%/bin;%PATH%
- set PATH=%PATH%;%QTPATH%;%QTPATH%/bin
- echo %PATH%
- ctest -VV -C "%CONFIGURATION%"
- ctest --output-on-failure -C "%CONFIGURATION%"
on_finish:
- cd "%APPVEYOR_BUILD_FOLDER%"

View File

@ -10,7 +10,11 @@ IF(MAC OR LINUX OR WIN32)
STRING(TIMESTAMP APPCAST_DATE "%Y-%m-%dT%H:%M:%S")
FOREACH(filePath ${_files})
FILE_SIZE(fileSize ${filePath})
IF(CMAKE_VERSION VERSION_LESS "3.14")
FILE_SIZE(fileSize ${filePath})
ELSE()
FILE(SIZE ${filePath} fileSize)
ENDIF()
GET_FILENAME_COMPONENT(file ${filePath} NAME)
IF(NOT DEFINED fileSize)

View File

@ -1,4 +1,15 @@
LIST(APPEND CTEST_CUSTOM_COVERAGE_EXCLUDE "/test/")
LIST(APPEND CTEST_CUSTOM_COVERAGE_EXCLUDE "/external/")
LIST(APPEND CTEST_CUSTOM_COVERAGE_EXCLUDE "/utils/")
LIST(APPEND CTEST_CUSTOM_COVERAGE_EXCLUDE \\.moc moc_ qrc_ ui_ _ui)
LIST(APPEND CTEST_EXTRA_COVERAGE_GLOB *.cpp *.h)
SET(CTEST_SOURCE_DIRECTORY "@PROJECT_SOURCE_DIR@")
SET(CTEST_BINARY_DIRECTORY "@PROJECT_BINARY_DIR@")
SET(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@")
SET(CTEST_COMMAND @CMAKE_CTEST_COMMAND@)
IF(CMAKE_SCRIPT_MODE_FILE)
INCLUDE(CTestCoverageCollectGCOV)
ctest_coverage_collect_gcov(TARBALL ${CTEST_BINARY_DIRECTORY}/gcov.tar GCOV_COMMAND @COVERAGE_COMMAND@)
ENDIF()

View File

@ -2,17 +2,27 @@ ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-DQT_MESSAGELOGCONTEXT)
ADD_DEFINITIONS(-DQT_NO_CAST_FROM_BYTEARRAY)
ADD_DEFINITIONS(-DQT_NO_CAST_TO_ASCII)
ADD_DEFINITIONS(-DQT_RESTRICTED_CAST_FROM_ASCII)
ADD_DEFINITIONS(-DQT_NO_FOREACH)
ADD_DEFINITIONS(-DQT_NO_KEYWORDS)
ADD_DEFINITIONS(-DQT_NO_EXCEPTIONS)
IF(NOT MSVC AND NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
ADD_DEFINITIONS(-DQT_STRICT_ITERATORS)
ENDIF()
IF(CMAKE_VERSION VERSION_LESS "3.12")
ADD_DEFINITIONS(-DQT_RESTRICTED_CAST_FROM_ASCII)
ELSE()
ADD_COMPILE_DEFINITIONS($<$<CONFIG:Debug>:QT_RESTRICTED_CAST_FROM_ASCII>)
ADD_COMPILE_DEFINITIONS($<$<NOT:$<CONFIG:Debug>>:QT_NO_CAST_FROM_ASCII>)
ENDIF()
IF(QT_VENDOR STREQUAL "Governikus")
ADD_DEFINITIONS(-DGOVERNIKUS_QT)
ADD_DEFINITIONS(-DQT_DEPRECATED_WARNINGS)
ENDIF()
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_CXX_EXTENSIONS OFF)
@ -28,16 +38,26 @@ IF(MSVC)
ENDIF()
ADD_FLAG(/Qspectre)
ELSE()
ADD_DEFINITIONS(-DQT_STRICT_ITERATORS)
STRING(REPLACE "-fexceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
STRING(REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wcast-qual -Wshadow")
SET(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -g")
ADD_FLAG(-flto VAR CMAKE_EXE_LINKER_FLAGS_RELEASE CMAKE_SHARED_LINKER_FLAGS_RELEASE LINK -flto)
IF(ANDROID AND CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")
SET(PREFER_LD bfd CACHE STRING "")
ELSE()
SET(PREFER_LD gold CACHE STRING "")
ENDIF()
ADD_FLAG(-fuse-ld=${PREFER_LD} VAR CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS USE_SAME_FOR_LINKER USE_LINKER_ONLY)
ADD_FLAG(-flto VAR CMAKE_EXE_LINKER_FLAGS_RELEASE CMAKE_SHARED_LINKER_FLAGS_RELEASE USE_SAME_FOR_LINKER)
IF(NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
ADD_FLAG(-fno-rtti VAR CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_MINSIZEREL)
ENDIF()
ADD_FLAG(-fno-exceptions)
ADD_FLAG(-fstack-protector-strong -fstack-protector)
ADD_FLAG(-fuse-ld=gold VAR CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS LINK -fuse-ld=gold)
ADD_FLAG(-Wold-style-cast)
ADD_FLAG(-Wmost)
ADD_FLAG(-Wpedantic)
@ -58,6 +78,9 @@ ELSE()
ADD_FLAG(-Winitializer-overrides)
ADD_FLAG(-Wunreachable-code-aggressive)
ADD_FLAG(-Wnewline-eof)
ADD_FLAG(-Wdate-time)
ADD_FLAG(-Wunused)
ADD_FLAG(-Wunused-template)
ADD_FLAG(-Wno-gnu-zero-variadic-macro-arguments) # Qt (qDebug) is not compatible
@ -66,6 +89,8 @@ ELSE()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
IF(CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -finline-limit=64")
ELSEIF(CMAKE_VERSION VERSION_LESS "3.13" AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.12")
LIST(APPEND CMAKE_CXX_COMPILER_PREDEFINES_COMMAND "--target=${ANDROID_TOOLCHAIN_MACHINE_NAME}")
ENDIF()
SET(CMAKE_CXX_VISIBILITY_PRESET hidden)
ENDIF()
@ -80,7 +105,7 @@ ELSE()
ENDIF()
IF(APPLE AND NOT CMAKE_SYSTEM_VERSION VERSION_LESS 14)
# Allow warning for LSSharedFileListItemResolve since we support OSX 10.9, too!
# Allow warning for SMCopyAllJobDictionaries, Apple will provide an alternative, until then we are stuck with this deprecated method
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=deprecated-declarations")
ENDIF()
@ -96,12 +121,12 @@ ELSE()
ENDIF()
IF(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd1875,1682,2259,654,177")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd1875,1682,2259,654,177,1599")
ENDIF()
ENDIF()
IF(APPLE AND NOT IOS)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ObjC++ -mmacosx-version-min=10.9")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ObjC++ -mmacosx-version-min=10.12")
ENDIF()
@ -113,5 +138,5 @@ INCLUDE(CompilerFlagsPersoSim)
OPTION(COVERAGE "Enable code coverage")
IF(COVERAGE)
MESSAGE(STATUS "Enable code coverage instrumentation")
ADD_FLAG(--coverage LINK --coverage VAR CMAKE_CXX_FLAGS_DEBUG)
ADD_FLAG(--coverage VAR CMAKE_CXX_FLAGS_DEBUG USE_SAME_FOR_LINKER)
ENDIF()

View File

@ -1,6 +1,6 @@
SET(REMOTE_CONFIG_URL_PROD https://appl.governikus-asp.de/ausweisapp2)
IF(JENKINS_APPCAST)
SET(REMOTE_CONFIG_URL https://vtf-aajenkins.tf.bos-test.de/job/${JENKINS_APPCAST}/lastSuccessfulBuild/artifact CACHE STRING "Remote config download URL" FORCE)
SET(REMOTE_CONFIG_URL https://ausweisapp-ci.govkg.de/job/${JENKINS_APPCAST}/lastSuccessfulBuild/artifact CACHE STRING "Remote config download URL" FORCE)
ELSE()
SET(REMOTE_CONFIG_URL ${REMOTE_CONFIG_URL_PROD} CACHE STRING "Remote config download URL" FORCE)
ENDIF()
@ -21,7 +21,4 @@ FUNCTION(CONFIGURE_DEFAULT_FILES _destination)
# Copy secure storage file, so that the AusweisApp2 can be started from the build directory.
CONFIGURE_FILE(${RESOURCES_DIR}/config.json.in ${_destination}/config.json @ONLY)
# Copy qtlogging.ini file
CONFIGURE_FILE(${RESOURCES_DIR}/qtlogging.ini ${_destination}/qtlogging.ini COPYONLY)
ENDFUNCTION()

View File

@ -3,7 +3,9 @@ INCLUDE(CheckCXXCompilerFlag)
# Check if a compiler flag is supported by current compiler.
#
# Options
# NOQUOTES: Do not add quotes to the variable (not used if it is a TARGET)
# NOQUOTES: Do not add quotes to the variable (not used if it is a TARGET).
# USE_SAME_FOR_LINKER: Use flag value for linker, too.
# USE_LINKER_ONLY: Use flag for linker only. Only recognized for USE_SAME_FOR_LINKER.
#
# Parameter
# NAME: Add a human readable name. This is for configure output only to
@ -15,7 +17,7 @@ INCLUDE(CheckCXXCompilerFlag)
# If VAR parameter is a cmake TARGET the compiler flag will be added
# to the COMPILE_FLAGS property of this TARGET only.
FUNCTION(ADD_FLAG)
SET(options NOQUOTES)
SET(options NOQUOTES USE_SAME_FOR_LINKER USE_LINKER_ONLY)
SET(oneValueArgs NAME)
SET(multiValueArgs LINK VAR)
cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
@ -36,7 +38,30 @@ FUNCTION(ADD_FLAG)
STRING(REPLACE "-" "_" flagname ${flagname})
STRING(REPLACE " " "_" flagname ${flagname})
CHECK_CXX_COMPILER_FLAG(${flag} ${flagname})
# GCC will ignore unknown warning options when used in the -Wno- form. It will complain
# about it though, if something else goes wrong. To check if this is a warning which can be
# disabled, we remove the negation for the test only:
STRING(REPLACE "-Wno-" "-W" flagtest ${flag})
# This enforces warnings like "-Wunused-command-line-argument" to fail
# the check.
SET(errorflag "")
IF(NOT MSVC)
SET(errorflag "-Werror")
ENDIF()
IF(_PARAM_USE_SAME_FOR_LINKER)
IF(CMAKE_VERSION VERSION_LESS "3.14")
SET(CMAKE_REQUIRED_LIBRARIES ${_PARAM_LINK} ${flagtest})
ELSE()
SET(CMAKE_REQUIRED_LINK_OPTIONS ${_PARAM_LINK} ${flagtest})
ENDIF()
IF(_PARAM_USE_LINKER_ONLY)
SET(flagtest "")
ENDIF()
ENDIF()
CHECK_CXX_COMPILER_FLAG("${flagtest} ${errorflag}" ${flagname})
IF(${flagname})
FOREACH(var ${_PARAM_VAR})
IF (${var} MATCHES "^AusweisApp")
@ -121,7 +146,7 @@ FUNCTION(GET_FILE_EXTENSIONS _result)
cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
SET(FILE_EXTENSIONS *.cpp)
IF(IOS)
IF(APPLE)
LIST(APPEND FILE_EXTENSIONS *.m *.mm)
ENDIF()
@ -244,7 +269,7 @@ FUNCTION(GET_ANDROID_TOOLCHAIN_VARS _prefix _machine)
GET_FILENAME_COMPONENT(ANDROID_TOOLCHAIN_MACHINE_NAME "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}" NAME)
STRING(REGEX REPLACE "-$" "" ANDROID_TOOLCHAIN_MACHINE_NAME "${ANDROID_TOOLCHAIN_MACHINE_NAME}")
STRING(REGEX MATCH "/toolchains/(.*)/prebuilt/" _unused "${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}")
STRING(REGEX REPLACE "-${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}$" "" ANDROID_TOOLCHAIN_PREFIX "${CMAKE_MATCH_1}")
STRING(REGEX REPLACE "-${ANDROID_NDK_TOOLCHAIN_VERSION}$" "" ANDROID_TOOLCHAIN_PREFIX "${CMAKE_MATCH_1}")
SET(${_prefix} ${ANDROID_TOOLCHAIN_PREFIX} PARENT_SCOPE)
SET(${_machine} ${ANDROID_TOOLCHAIN_MACHINE_NAME} PARENT_SCOPE)
ENDFUNCTION()
@ -267,25 +292,27 @@ IF((WIN32 AND NOT WINDOWS_STORE) OR LINUX OR MAC OR CYGWIN OR BSD)
ENDIF()
FUNCTION(FILE_SIZE _outSize _file)
IF(LINUX)
SET(SIZE_COMMAND stat -c "%s" "${_file}")
ELSEIF(MAC)
SET(SIZE_COMMAND stat -f "%z" "${_file}")
ELSE()
RETURN()
ENDIF()
IF(CMAKE_VERSION VERSION_LESS "3.14") # Use FILE(SIZE)
FUNCTION(FILE_SIZE _outSize _file)
IF(LINUX)
SET(SIZE_COMMAND stat -c "%s" "${_file}")
ELSEIF(MAC)
SET(SIZE_COMMAND stat -f "%z" "${_file}")
ELSE()
RETURN()
ENDIF()
EXECUTE_PROCESS(COMMAND ${SIZE_COMMAND}
OUTPUT_VARIABLE SIZE_OUTPUT
RESULT_VARIABLE SIZE_RESULT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND ${SIZE_COMMAND}
OUTPUT_VARIABLE SIZE_OUTPUT
RESULT_VARIABLE SIZE_RESULT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
IF(${SIZE_RESULT} EQUAL 0)
SET(${_outSize} ${SIZE_OUTPUT} PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
IF(${SIZE_RESULT} EQUAL 0)
SET(${_outSize} ${SIZE_OUTPUT} PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
ENDIF()
IF(NOT COMMAND FIND_HOST_PACKAGE)
MACRO(FIND_HOST_PACKAGE)
@ -299,16 +326,14 @@ FUNCTION(FETCH_TARGET_LOCATION _destination _target)
SET(multiValueArgs)
cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
IF(NOT tmp)
IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_RELEASE)
ELSEIF("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_DEBUG)
ENDIF()
IF(CMAKE_BUILD_TYPE STREQUAL "MINSIZEREL" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
SET(BUILD_TYPE RELEASE)
ELSE()
SET(BUILD_TYPE ${CMAKE_BUILD_TYPE})
ENDIF()
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION_${BUILD_TYPE})
IF(NOT tmp)
GET_TARGET_PROPERTY(tmp "${_target}" IMPORTED_LOCATION)
ENDIF()
@ -352,6 +377,7 @@ IF(WIN32)
IF(WIN_TIMESTAMP)
IF(NOT WIN_TIMESTAMP_URL)
# http://rfc3161timestamp.globalsign.com/advanced
SET(WIN_TIMESTAMP_URL http://timestamp.digicert.com)
ENDIF()
SET(SIGNTOOL_PARAMS ${SIGNTOOL_PARAMS} /tr ${WIN_TIMESTAMP_URL} /td ${WIN_SIGN_HASHALGO})

View File

@ -19,16 +19,41 @@ SET(SEARCH_ADDITIONAL_DIRS "
DIRLIST_OF_FILES(ADDITIONAL_DIRS ${CMAKE_BINARY_DIR}/src/*${CMAKE_SHARED_LIBRARY_SUFFIX})
")
SET(DEPENDENCY_CHECK "
FUNCTION(gp_resolved_file_type_override file type)
MESSAGE(STATUS \"Collect dependency: \${file}\")
IF(file MATCHES \"libstdc.+\.dll\"
OR file MATCHES \"libwinpthread-.+\.dll\"
OR file MATCHES \"libgcc_s_.+\.dll\"
OR file MATCHES \"libssp-.+\.dll\")
get_filename_component(path \"${CMAKE_CXX_COMPILER}\" DIRECTORY)
get_filename_component(pathDest \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\" DIRECTORY)
IF(NOT file MATCHES \"\${path}\" AND NOT file MATCHES \"\${pathDest}\")
MESSAGE(FATAL_ERROR \"Wrong source path detected: \${file} | Should be: \${path} or \${pathDest}\")
ENDIF()
ENDIF()
ENDFUNCTION()
")
IF(WIN32)
IF(MSVC)
IF(MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
SET(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .)
IF(NOT CMAKE_VERSION VERSION_LESS "3.6")
SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
ENDIF()
SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
INCLUDE(InstallRequiredSystemLibraries)
ENDIF()
IF(TARGET Qt5::Qml)
FETCH_TARGET_LOCATION(libEgl "Qt5::Gui_EGL")
FETCH_TARGET_LOCATION(libGLES "Qt5::Gui_GLESv2")
FETCH_TARGET_LOCATION(libQuickControls2 "Qt5::QuickControls2")
INSTALL(FILES ${libQuickControls2} DESTINATION . COMPONENT Runtime)
INSTALL(FILES ${libEgl} DESTINATION . COMPONENT Runtime)
INSTALL(FILES ${libGLES} DESTINATION . COMPONENT Runtime)
ENDIF()
FETCH_TARGET_LOCATION(libSvg "Qt5::Svg")
FETCH_TARGET_LOCATION(pluginSvg "Qt5::QSvgPlugin")
FETCH_TARGET_LOCATION(pluginGif "Qt5::QGifPlugin")
@ -38,6 +63,7 @@ IF(WIN32)
ELSE()
FETCH_TARGET_LOCATION(platformWin "Qt5::QWindowsIntegrationPlugin")
ENDIF()
FETCH_TARGET_LOCATION(styleVista "Qt5::QWindowsVistaStylePlugin")
INSTALL(TARGETS AusweisApp DESTINATION . COMPONENT Application)
INSTALL(FILES ${libSvg} DESTINATION . COMPONENT Runtime)
@ -45,20 +71,24 @@ IF(WIN32)
INSTALL(FILES ${pluginGif} DESTINATION imageformats COMPONENT Runtime)
INSTALL(FILES ${pluginJpeg} DESTINATION imageformats COMPONENT Runtime)
INSTALL(FILES ${platformWin} DESTINATION platforms COMPONENT Runtime)
INSTALL(FILES ${styleVista} DESTINATION styles COMPONENT Runtime)
INSTALL(CODE
"
${DEPENDENCY_CHECK}
${SEARCH_ADDITIONAL_DIRS}
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${EXECUTABLE_NAME}\" \"\" \"${TOOLCHAIN_BIN_PATH};\${ADDITIONAL_DIRS}\")
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}\" \"${libQuickControls2}\" \"${TOOLCHAIN_BIN_PATH};\${ADDITIONAL_DIRS}\")
" COMPONENT Runtime)
ELSEIF(APPLE AND NOT IOS)
SET(MACOS_BUNDLE_MACOS_DIR ../MacOS)
SET(MACOS_BUNDLE_PLUGINS_DIR ../PlugIns)
SET(MACOS_BUNDLE_FRAMEWORKS_DIR ../Frameworks)
SET(MACOS_BUNDLE_RESOURCES_DIR ../Resources)
SET(MACOS_BUNDLE_LOGIN_ITEMS_DIR ../Library/LoginItems)
# We need to include the following (i.e. all) image format plug-ins,
# since those seem to be loaded upon program start-up. Not including
@ -67,43 +97,83 @@ ELSEIF(APPLE AND NOT IOS)
# depend on to be loaded as well, thus resulting in two sets of Qt
# libraries being loaded (ours from the bundle and the ones from the
# installation) and the program misbehaving (crashing).
FETCH_TARGET_LOCATION(platformMac "Qt5::QCocoaIntegrationPlugin")
FOREACH (qtComponent QtCore Qt5Gui Qt5Network Qt5Svg Qt5Widgets)
FOREACH(plugin ${${qtComponent}_PLUGINS})
GET_TARGET_PROPERTY(pluginPath ${plugin} LOCATION)
GET_FILENAME_COMPONENT(pluginDir ${pluginPath} DIRECTORY)
GET_FILENAME_COMPONENT(pluginName ${pluginPath} NAME)
GET_FILENAME_COMPONENT(pluginDirName ${pluginDir} NAME)
IF(pluginDirName STREQUAL "platforms" AND NOT plugin STREQUAL "Qt5::QCocoaIntegrationPlugin")
CONTINUE()
ENDIF()
INSTALL(FILES ${pluginPath} DESTINATION ${MACOS_BUNDLE_PLUGINS_DIR}/${pluginDirName} COMPONENT Runtime)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/PlugIns/${pluginDirName}/${pluginName}")
ENDFOREACH()
ENDFOREACH()
INSTALL(TARGETS AusweisApp DESTINATION . COMPONENT Application)
INSTALL(FILES ${platformMac} DESTINATION ${MACOS_BUNDLE_PLUGINS_DIR}/platforms COMPONENT Runtime)
IF(TARGET Qt5::Qml)
FOREACH(entry QtQuick QtQuick.2 QtQml QtGraphicalEffects Qt)
SET(_dir "${QT_HOST_PREFIX}/qml")
FILE(GLOB_RECURSE DYLIB "${_dir}/${entry}/*.dylib")
FOREACH(_lib ${DYLIB})
FILE(RELATIVE_PATH _lib_dest "${_dir}" "${_lib}")
IF(NOT _lib_dest MATCHES "XmlListModel|Particles.2|LocalStorage") # blacklist not needed stuff
GET_FILENAME_COMPONENT(_lib_dest_dir ${_lib_dest} DIRECTORY)
INSTALL(FILES ${_lib} DESTINATION ${MACOS_BUNDLE_RESOURCES_DIR}/qml/${_lib_dest_dir} COMPONENT Runtime)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Resources/qml/${_lib_dest}")
ENDIF()
ENDFOREACH()
ENDFOREACH()
ENDIF()
INSTALL(TARGETS AusweisApp DESTINATION ${MACOS_BUNDLE_MACOS_DIR} COMPONENT Application)
INSTALL(TARGETS AusweisApp2AutostartHelper DESTINATION ${MACOS_BUNDLE_LOGIN_ITEMS_DIR} COMPONENT Application)
INSTALL(CODE
"
${DEPENDENCY_CHECK}
${SEARCH_ADDITIONAL_DIRS}
file(GLOB_RECURSE QTPLUGINS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MACOS_BUNDLE_PLUGINS_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
file(GLOB_RECURSE QtQuickPLUGINS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MACOS_BUNDLE_RESOURCES_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${EXECUTABLE_NAME}\" \"\${QTPLUGINS}\" \"${TOOLCHAIN_LIB_PATH};\${ADDITIONAL_DIRS}\")
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MACOS_BUNDLE_MACOS_DIR}/${PROJECT_NAME}\" \"\${QTPLUGINS};\${QtQuickPLUGINS}\" \"${TOOLCHAIN_LIB_PATH};\${ADDITIONAL_DIRS}\")
" COMPONENT Runtime)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Library/LoginItems/AusweisApp2AutostartHelper.app/Contents/MacOS/AusweisApp2AutostartHelper")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Library/LoginItems/AusweisApp2AutostartHelper.app")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtCore.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtGui.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtXml.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtNetwork.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtSvg.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtWidgets.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtPrintSupport.framework") # remove if disabled in Qt
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtWebSockets.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtConcurrent.framework")
IF(TARGET Qt5::Qml)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQml.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuick.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuickControls2.framework")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuickTemplates2.framework")
IF(NOT "${Qt5Core_VERSION}" VERSION_LESS "5.12")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtQuickShapes.framework")
ENDIF()
ENDIF()
IF(TARGET Qt5::Bluetooth)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/Frameworks/QtBluetooth.framework")
ENDIF()
FETCH_TARGET_LOCATION(opensslCryptoName "OpenSSL::Crypto" NAME)
FETCH_TARGET_LOCATION(opensslSslName "OpenSSL::SSL" NAME)
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/MacOS/${opensslCryptoName}")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "/Contents/MacOS/${opensslSslName}")
IF(CMAKE_VERSION VERSION_LESS "3.13")
SET(OPENSSL_LIB_LOCATION "/Contents/MacOS")
ELSE()
SET(OPENSSL_LIB_LOCATION "/Contents/Frameworks")
ENDIF()
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "${OPENSSL_LIB_LOCATION}/${opensslCryptoName}")
LIST(APPEND ADDITIONAL_BUNDLE_FILES_TO_SIGN "${OPENSSL_LIB_LOCATION}/${opensslSslName}")
# set it to parent scope to be able to access it from Packaging.cmake
SET(ADDITIONAL_BUNDLE_FILES_TO_SIGN ${ADDITIONAL_BUNDLE_FILES_TO_SIGN} PARENT_SCOPE)
@ -131,13 +201,31 @@ ELSEIF(ANDROID)
SET(ANDROID_PACKAGE_NAME "com.governikus.ausweisapp2")
ENDIF()
FOREACH(entry ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/drawable-${entry} COMPONENT Runtime RENAME npa.png)
ENDFOREACH()
IF(ANDROID_BUILD_AAR)
SET(ANDROID_MANIFEST AndroidManifest.xml.aar.in)
FOREACH(entry network/WifiInfo ui/aidl/AidlBinder activation/intent/AusweisApp2Service)
SET(_java_file "${SRC_DIR}/${entry}.java")
IF(NOT EXISTS "${_java_file}")
MESSAGE(FATAL_ERROR "Cannot find file: ${_java_file}")
ENDIF()
LIST(APPEND JAVA_FILES "${_java_file}")
ENDFOREACH()
INSTALL(FILES ${PACKAGING_DIR}/android/styles.xml DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/values COMPONENT Runtime)
INSTALL(FILES ${PACKAGING_DIR}/android/res/values/strings.xml DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/values COMPONENT Runtime)
ELSE()
SET(ANDROID_MANIFEST AndroidManifest.xml.apk.in)
FOREACH(entry ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/background_npa.png DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_background.png)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/foreground_${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_foreground.png)
INSTALL(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa.png)
ENDFOREACH()
INSTALL(DIRECTORY ${PACKAGING_DIR}/android/res DESTINATION ${ANDROID_PACKAGE_SRC_DIR} COMPONENT Runtime)
FILE(GLOB_RECURSE JAVA_FILES "${SRC_DIR}/*.java")
ENDIF()
FILE(GLOB_RECURSE JAVA_FILES "${SRC_DIR}/*.java")
INSTALL(FILES ${JAVA_FILES} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src COMPONENT Runtime)
INSTALL(FILES ${PACKAGING_DIR}/android/IAusweisApp2Sdk.aidl DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/ COMPONENT Runtime)
INSTALL(FILES ${PACKAGING_DIR}/android/IAusweisApp2SdkCallback.aidl DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/ COMPONENT Runtime)
@ -147,10 +235,29 @@ ELSEIF(ANDROID)
ELSE()
SET(ANDROID_VERSION_NAME ${PROJECT_VERSION})
ENDIF()
CONFIGURE_FILE(${PACKAGING_DIR}/android/AndroidManifest.xml.in ${ANDROID_PACKAGE_SRC_DIR}/AndroidManifest.xml @ONLY)
CONFIGURE_FILE(${PACKAGING_DIR}/android/${ANDROID_MANIFEST} ${ANDROID_PACKAGE_SRC_DIR}/AndroidManifest.xml @ONLY)
CONFIGURE_FILE(${PACKAGING_DIR}/android/backup_rules.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/backup_rules.xml COPYONLY)
IF(NOT ANDROID_BUILD_AAR)
CONFIGURE_FILE(${PACKAGING_DIR}/android/fileprovider.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/fileprovider.xml COPYONLY)
ENDIF()
SET(ANDROID_APP_BINARY "${CMAKE_INSTALL_PREFIX}/${ANDROID_DEST}/libAusweisApp2.so")
SET(SYMBOL_FOLDER "${CMAKE_BINARY_DIR}/debug.symbols/${CMAKE_ANDROID_ARCH_ABI}")
SET(ANDROID_APP_SYMBOLS "${SYMBOL_FOLDER}/libAusweisApp2.so")
INSTALL(CODE
"
EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${SYMBOL_FOLDER}\")
EXECUTE_PROCESS(COMMAND \"${CMAKE_OBJCOPY}\" \"--only-keep-debug\" \"${ANDROID_APP_BINARY}\" \"${ANDROID_APP_SYMBOLS}\")
" COMPONENT Runtime CONFIGURATIONS RelWithDebInfo)
IF(CMAKE_COMPILER_IS_GNUCXX)
SET(ANDROID_STL_PATH gnu-libstdc++/${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION})
ELSE()
SET(ANDROID_STL_PATH llvm-libc++)
ENDIF()
SET(ANDROID_DEPLOYMENT_SETTINGS ${PROJECT_BINARY_DIR}/libAusweisApp2.so-deployment-settings.json CACHE INTERNAL "apk deployment" FORCE)
SET(ANDROID_APP_BINARY "${CMAKE_INSTALL_PREFIX}/${ANDROID_DEST}/libAusweisApp2.so")
CONFIGURE_FILE(${PACKAGING_DIR}/android/libAusweisApp2.so-deployment-settings.json.in ${ANDROID_DEPLOYMENT_SETTINGS} @ONLY)
SET(TRANSLATION_DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/assets/translations)
@ -165,9 +272,10 @@ ELSEIF(UNIX)
INSTALL(TARGETS AusweisApp DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Application)
INSTALL(CODE
"
${DEPENDENCY_CHECK}
${SEARCH_ADDITIONAL_DIRS}
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}/${EXECUTABLE_NAME}\" \"\" \"\${ADDITIONAL_DIRS}\")
FIXUP_BUNDLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}/${PROJECT_NAME}\" \"\" \"\${ADDITIONAL_DIRS}\")
" COMPONENT Runtime)
CONFIGURE_FILE(${PACKAGING_DIR}/linux/AusweisApp2.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/AusweisApp2.desktop @ONLY)
@ -191,14 +299,14 @@ IF(LINUX OR WIN32 OR MAC)
INSTALL(CODE
"
EXECUTE_PROCESS(COMMAND
${SELF_PACKER_FOR_EXECUTABLE} ${SELF_PACKER_FOR_EXECUTABLE_FLAGS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}/${EXECUTABLE_NAME}\")
${SELF_PACKER_FOR_EXECUTABLE} ${SELF_PACKER_FOR_EXECUTABLE_FLAGS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}\")
" COMPONENT Application)
ENDIF()
ENDIF()
IF(WIN32)
IF(SIGNTOOL_CMD)
CONFIGURE_FILE(${CMAKE_MODULE_PATH}/SignFiles.cmake.in ${CMAKE_BINARY_DIR}/SignFiles.cmake @ONLY)
CONFIGURE_FILE(${CMAKE_DIR}/SignFiles.cmake.in ${CMAKE_BINARY_DIR}/SignFiles.cmake @ONLY)
INSTALL(CODE
"
EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" -DSIGN_EXT=*.exe -P \"${CMAKE_BINARY_DIR}/SignFiles.cmake\" WORKING_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DEFAULT_FILE_DESTINATION}\")
@ -210,16 +318,21 @@ ENDIF()
IF(LINUX)
INSTALL(FILES ${QM_FILES} DESTINATION ${TRANSLATION_DESTINATION} COMPONENT Translations)
ELSE()
ELSEIF(NOT ANDROID_BUILD_AAR)
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/translations/ DESTINATION ${TRANSLATION_DESTINATION} COMPONENT Translations)
ENDIF()
# resources file
INSTALL(FILES ${RCC} DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime)
IF(NOT ANDROID_BUILD_AAR)
# resources file
INSTALL(FILES ${RCC} DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime)
ENDIF()
# qt qml plugins
IF(DESKTOP AND TARGET Qt5::Qml)
FOREACH(entry QtQuick QtQuick.2 QtQml QtGraphicalEffects Qt)
INSTALL(DIRECTORY ${QT_HOST_PREFIX}/qml/${entry} DESTINATION ${DEFAULT_FILE_DESTINATION}/qml COMPONENT Runtime PATTERN "*.dylib" EXCLUDE)
ENDFOREACH()
ENDIF()
# secure storage file
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.json DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime)
# qtlogging.ini
INSTALL(FILES ${RESOURCES_DIR}/qtlogging.ini DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime)

View File

@ -5,14 +5,20 @@ IF(MINGW)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" ".a" ".lib")
ENDIF()
SET(MIN_QT_VERSION 5.9)
SET(MIN_QT_VERSION 5.10)
FIND_PACKAGE(Qt5Core ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Concurrent ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Network ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Xml ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Svg ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5LinguistTools ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5WebSockets ${MIN_QT_VERSION} REQUIRED)
IF(NOT ANDROID_BUILD_AAR)
FIND_PACKAGE(Qt5Qml ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Quick ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5QuickControls2 ${MIN_QT_VERSION} REQUIRED)
ENDIF()
IF(DESKTOP)
FIND_PACKAGE(Qt5Widgets ${MIN_QT_VERSION} REQUIRED)
@ -22,15 +28,8 @@ IF(DESKTOP)
ENDIF()
IF(ANDROID OR IOS OR WINDOWS_STORE OR "${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
FIND_PACKAGE(Qt5Nfc ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Qml ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Quick ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5QuickControls2 ${MIN_QT_VERSION} REQUIRED)
ENDIF()
IF(LINUX OR ANDROID OR IOS)
FIND_PACKAGE(Qt5Bluetooth ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5Nfc ${MIN_QT_VERSION} REQUIRED)
ENDIF()
IF(ANDROID)
@ -75,18 +74,11 @@ IF(tmp_crosscompile_enabled)
SET(CMAKE_CROSSCOMPILING OFF)
ENDIF()
IF(ANDROID)
GET_TARGET_PROPERTY(CryptoLib OpenSSL::Crypto IMPORTED_LOCATION)
STRING(REPLACE "libcrypto.so" "libgovcrypto.so" CryptoLib "${CryptoLib}")
MESSAGE(STATUS "Rewrite OpenSSL::Crypto: ${CryptoLib}")
SET_TARGET_PROPERTIES(OpenSSL::Crypto PROPERTIES IMPORTED_LOCATION "${CryptoLib}")
ENDIF()
IF(MINGW)
SET(PCSC_LIBRARIES -lwinscard)
SET(WIN_DEFAULT_LIBS "-lAdvapi32" "-lKernel32" "-lOle32" "-lSetupapi" "-lVersion" "-lws2_32")
ELSEIF(MSVC)
ELSEIF(MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
SET(PCSC_LIBRARIES winscard.lib)
SET(WIN_DEFAULT_LIBS setupapi.lib version.lib Ws2_32.lib)
ELSEIF(ANDROID)
@ -94,6 +86,7 @@ ELSEIF(ANDROID)
ELSEIF(IOS)
FIND_LIBRARY(IOS_ASSETSLIBRARY AssetsLibrary)
FIND_LIBRARY(IOS_UIKIT UIKit)
FIND_LIBRARY(IOS_STOREKIT StoreKit)
FIND_LIBRARY(IOS_MOBILECORESERVICES MobileCoreServices)
FIND_LIBRARY(IOS_COREBLUETOOTH CoreBluetooth)
FIND_LIBRARY(IOS_COREFOUNDATION CoreFoundation)
@ -105,6 +98,9 @@ ELSEIF(IOS)
FIND_LIBRARY(IOS_SECURITY Security)
FIND_LIBRARY(IOS_SYSTEMCONFIGURATION SystemConfiguration)
FIND_LIBRARY(IOS_AUDIOTOOLBOX AudioToolbox)
FIND_LIBRARY(IOS_IMAGEIO ImageIO)
FIND_LIBRARY(IOS_CORENFC CoreNFC)
FIND_LIBRARY(IOS_MESSAGEUI MessageUI)
ELSEIF(MAC)
FIND_PATH(PCSC_INCLUDE_DIRS WinSCard.h)
FIND_LIBRARY(PCSC_LIBRARIES NAMES PCSC WinSCard)
@ -112,6 +108,8 @@ ELSEIF(MAC)
FIND_LIBRARY(OSX_APPKIT AppKit)
FIND_LIBRARY(IOKIT NAMES IOKit)
FIND_LIBRARY(OSX_SECURITY Security)
FIND_LIBRARY(OSX_FOUNDATION Foundation)
FIND_LIBRARY(OSX_SERVICEMANAGEMENT ServiceManagement)
ELSEIF(UNIX)
IF(LINUX)
FIND_LIBRARY(LIBUDEV NAMES udev ludev libudev)
@ -126,8 +124,4 @@ ENDIF()
IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
FIND_PACKAGE(Qt5Test ${MIN_QT_VERSION} REQUIRED)
FIND_PACKAGE(Qt5QuickTest ${MIN_QT_VERSION} REQUIRED)
IF(DESKTOP AND NOT APPLE)
FIND_PACKAGE(Qt5UiPlugin ${MIN_QT_VERSION})
ENDIF()
ENDIF()

View File

@ -9,17 +9,13 @@ MESSAGE(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
MESSAGE(STATUS "CMAKE_SYSROOT: ${CMAKE_SYSROOT}")
MESSAGE(STATUS "CMAKE_SYSROOT_LINK: ${CMAKE_SYSROOT_LINK}")
MESSAGE(STATUS "CMAKE_SYSROOT_COMPILE: ${CMAKE_SYSROOT_COMPILE}")
IF(APPLE)
MESSAGE(STATUS "CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT}")
ENDIF()
MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
MESSAGE(STATUS "CMAKE_CXX_SIMULATE_ID: ${CMAKE_CXX_SIMULATE_ID}")
IF(ANDROID)
FUNCTION(READ_REVISION _var _regex _file)
IF(EXISTS "${_file}")
FILE(READ "${_file}" content)
STRING(REGEX MATCH "${_regex}" _unused "${content}")
SET(${_var} ${CMAKE_MATCH_1} PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
MESSAGE(STATUS "CMAKE_ANDROID_NDK: ${CMAKE_ANDROID_NDK}")
MESSAGE(STATUS "CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG: ${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}")
MESSAGE(STATUS "CMAKE_ANDROID_ARCH_ABI: ${CMAKE_ANDROID_ARCH_ABI}")
@ -31,15 +27,8 @@ IF(ANDROID)
MESSAGE(STATUS "ANDROID_SDK: ${ANDROID_SDK}")
MESSAGE(STATUS "ANDROID_BUILD_TOOLS_REVISION: ${ANDROID_BUILD_TOOLS_REVISION}")
READ_REVISION(ANDROID_NDK_REVISION ".*Revision = ([0-9|\\.]+)" "${CMAKE_ANDROID_NDK}/source.properties")
MESSAGE(STATUS "ANDROID_NDK_REVISION: ${ANDROID_NDK_REVISION}")
READ_REVISION(ANDROID_SDK_REVISION ".*Revision=([0-9|\\.]+)" "${ANDROID_SDK}/tools/source.properties")
MESSAGE(STATUS "ANDROID_SDK_REVISION: ${ANDROID_SDK_REVISION}")
ELSEIF(IOS)
MESSAGE(STATUS "CMAKE_IOS_SDK_ROOT: ${CMAKE_IOS_SDK_ROOT}")
MESSAGE(STATUS "CMAKE_IOS_DEVELOPER_ROOT: ${CMAKE_IOS_DEVELOPER_ROOT}")
ENDIF()

View File

@ -3,7 +3,10 @@
SET(FILENAME ${PROJECT_NAME}-${PROJECT_VERSION})
IF(ANDROID)
IF(ANDROID_BUILD_AAR)
STRING(TOLOWER "${FILENAME}" FILENAME)
STRING(REGEX REPLACE "[0-9]*-" "-" FILENAME "${FILENAME}")
ELSEIF(ANDROID)
SET(FILENAME ${FILENAME}-${CMAKE_ANDROID_ARCH_ABI})
ENDIF()
@ -35,6 +38,7 @@ SET(CPACK_PACKAGE_CONTACT "info@governikus.com")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Governikus AusweisApp2")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.rst")
SET(CPACK_PACKAGE_FILE_NAME ${FILENAME})
SET(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT_NAME})
IF(VENDOR_GOVERNIKUS)
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.officially.txt")
@ -52,7 +56,7 @@ IF(APPLE AND NOT IOS)
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_BINARY_DIR}/LICENSE.txt")
ENDIF()
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE" OR ${CMAKE_BUILD_TYPE} STREQUAL "MINSIZEREL")
SET(CPACK_STRIP_FILES TRUE)
ENDIF()
@ -69,16 +73,12 @@ LIST(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeLists\\\\.txt\\\\.user")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.project")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.cproject")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.reviewboardrc")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "utils/tlscheck")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "utils/testbedtool")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "utils/fuzzing")
LIST(APPEND CPACK_SOURCE_IGNORE_FILES "utils")
SET(CPACK_MONOLITHIC_INSTALL true)
IF(WIN32)
SET(CPACK_PACKAGE_EXECUTABLES "AusweisApp2;AusweisApp2")
SET(CPACK_GENERATOR WIX)
SET(CPACK_WIX_UPGRADE_GUID 4EE0E467-EAB7-483E-AB45-87BD1DB6B037)
SET(CPACK_WIX_PRODUCT_ICON ${RESOURCES_DIR}/images/npa.ico)
@ -86,27 +86,38 @@ IF(WIN32)
# disable above line, enable beneath line to build MSI for english
# SET(CPACK_WIX_CULTURES en-US)
SET(CPACK_WIX_TEMPLATE ${PACKAGING_DIR}/win/WIX.template.in)
SET(CPACK_WIX_EXTRA_SOURCES ${PACKAGING_DIR}/win/install_settings.wxs ${PACKAGING_DIR}/win/runtime_settings.wxs)
SET(CPACK_WIX_UI_BANNER ${RESOURCES_DIR}/images/wix_banner.jpg)
SET(CPACK_WIX_UI_DIALOG ${RESOURCES_DIR}/images/wix_dialog.jpg)
SET(CPACK_WIX_EXTENSIONS WixUtilExtension)
SET(CPACK_WIX_LIGHT_EXTRA_FLAGS -loc ${PACKAGING_DIR}/win/WIX.Texts.de-DE.wxl -loc ${PACKAGING_DIR}/win/WIX.Texts.en-US.wxl)
# suppress warning LGHT1076/ICE61 caused by AllowSameVersionUpgrades
SET(CPACK_WIX_LIGHT_EXTRA_FLAGS -sw1076 ${CPACK_WIX_LIGHT_EXTRA_FLAGS})
IF(SIGNTOOL_CMD)
MESSAGE(STATUS "MSI can be signed with 'make package.sign'")
ADD_CUSTOM_TARGET(package.sign COMMAND ${SIGNTOOL_CMD} ${SIGNTOOL_PARAMS} ${PROJECT_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.msi)
SET(MSI ${PROJECT_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.msi)
ADD_CUSTOM_TARGET(package.sign COMMAND ${SIGNTOOL_CMD} ${SIGNTOOL_PARAMS} ${MSI}
COMMAND ${SIGNTOOL_CMD} verify /v /pa ${MSI})
ENDIF()
ELSEIF(IOS)
FILE(WRITE ${PROJECT_BINARY_DIR}/ipa.cmake "
SET(BUNDLE_DIRS \"\${CONFIG}-iphoneos;\${CONFIG};UninstalledProducts;UninstalledProducts/iphoneos\")
FUNCTION(FIND_BUNDLE _name _out_bundle _out_parent_dir)
SET(BUNDLE_DIRS \"\${CONFIG}-iphoneos;\${CONFIG};UninstalledProducts;UninstalledProducts/iphoneos\")
FOREACH(dir \${BUNDLE_DIRS})
SET(tmpBundleDir ${PROJECT_BINARY_DIR}/src/\${dir}/${PROJECT_NAME}.app)
IF(EXISTS \"\${tmpBundleDir}\")
SET(BundleDir \"\${tmpBundleDir}\")
BREAK()
ENDIF()
ENDFOREACH()
FOREACH(dir \${BUNDLE_DIRS})
SET(tmpDir ${PROJECT_BINARY_DIR}/src/\${dir})
SET(tmpBundleDir \${tmpDir}/\${_name})
IF(EXISTS \"\${tmpBundleDir}\")
SET(\${_out_bundle} \"\${tmpBundleDir}\" PARENT_SCOPE)
SET(\${_out_parent_dir} \"\${tmpDir}\" PARENT_SCOPE)
BREAK()
ENDIF()
ENDFOREACH()
ENDFUNCTION()
FIND_BUNDLE(${PROJECT_NAME}.app BundleDir ParentDir)
IF(BundleDir)
MESSAGE(STATUS \"Use bundle: \${BundleDir}\")
@ -114,9 +125,15 @@ ELSEIF(IOS)
MESSAGE(FATAL_ERROR \"Bundle directory does not exist\")
ENDIF()
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_directory \${BundleDir} Payload/AusweisApp2.app)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_directory \${BundleDir} Payload/${PROJECT_NAME}.app)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E tar cf \"${CPACK_PACKAGE_FILE_NAME}.ipa\" --format=zip Payload)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E remove_directory Payload)
FIND_BUNDLE(${PROJECT_NAME}.app.dSYM dSYM ParentDir)
IF(dSYM)
MESSAGE(STATUS \"Use dSYM: \${dSYM}\")
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E tar cf \"\${CMAKE_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.dSYM.zip\" --format=zip ${PROJECT_NAME}.app.dSYM WORKING_DIRECTORY \${ParentDir})
ENDIF()
")
ADD_CUSTOM_TARGET(ipa COMMAND ${CMAKE_COMMAND} -DCONFIG=$<CONFIGURATION> -P ${CMAKE_BINARY_DIR}/ipa.cmake)
@ -126,6 +143,7 @@ ELSEIF(APPLE)
SET(CPACK_GENERATOR Bundle)
SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_BINARY_DIR};${PROJECT_NAME};ALL;/)
SET(CPACK_BUNDLE_NAME ${PROJECT_NAME})
SET(CPACK_BUNDLE_COPYRIGHT ${COPYRIGHT_TEXT})
SET(CPACK_BUNDLE_ICON ${RESOURCES_DIR}/images/bundle_icons.icns)
SET(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Governikus GmbH & Co. KG (G7EQCJU4BR)")
@ -153,10 +171,6 @@ ELSEIF(APPLE)
CONFIGURE_FILE(${MACOS_PACKAGING_DIR}/${INFO_PLIST_FILE_NAME} ${INFO_PLIST_FILE_NAME} @ONLY)
SET(CPACK_BUNDLE_PLIST ${INFO_PLIST_FILE_NAME})
SET(STARTUP_FILE_NAME start-ausweisapp2.sh)
CONFIGURE_FILE(${MACOS_PACKAGING_DIR}/${STARTUP_FILE_NAME} ${STARTUP_FILE_NAME} @ONLY)
SET(CPACK_BUNDLE_STARTUP_COMMAND ${STARTUP_FILE_NAME})
ELSEIF(ANDROID)
FIND_PROGRAM(androiddeployqt androiddeployqt CMAKE_FIND_ROOT_PATH_BOTH)
IF(NOT androiddeployqt)
@ -164,48 +178,78 @@ ELSEIF(ANDROID)
ENDIF()
MESSAGE(STATUS "Using androiddeployqt: ${androiddeployqt}")
OPTION(ANDROID_USE_GRADLE "Use gradle for androiddeployqt" OFF)
FILE(READ "${QT_HOST_PREFIX}/src/android/templates/build.gradle" BUILD_GRADLE)
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
IF(APK_SIGN_KEYSTORE AND APK_SIGN_KEYSTORE_ALIAS AND APK_SIGN_KEYSTORE_PSW)
IF(ANDROID_BUILD_AAR)
STRING(REPLACE "apply plugin: 'com.android.application'" "apply plugin: 'com.android.library'" BUILD_GRADLE "${BUILD_GRADLE}")
ENDIF()
FILE(WRITE "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}")
FILE(READ "${PACKAGING_DIR}/android/build.gradle.append" BUILD_GRADLE)
FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}")
OPTION(ANDROID_LINT "Lint Android package" ON)
IF(NOT ANDROID_LINT)
FILE(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "tasks.lint.enabled = false")
ENDIF()
IF(ANDROID_BUILD_AAR)
SET(ANDROID_FILE_EXT aar)
CONFIGURE_FILE(${PACKAGING_DIR}/android/pom.xml.in ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.pom @ONLY)
CONFIGURE_FILE("${PACKAGING_DIR}/android/lint.aar.xml" "${CMAKE_INSTALL_PREFIX}/lint.xml" COPYONLY)
ELSE()
SET(ANDROID_FILE_EXT apk)
CONFIGURE_FILE("${PACKAGING_DIR}/android/lint.apk.xml" "${CMAKE_INSTALL_PREFIX}/lint.xml" COPYONLY)
ENDIF()
MESSAGE(STATUS "Prepare ${ANDROID_FILE_EXT} file generation")
IF(${CMAKE_BUILD_TYPE} STREQUAL "RELEASE" OR ${CMAKE_BUILD_TYPE} STREQUAL "RELWITHDEBINFO" OR ${CMAKE_BUILD_TYPE} STREQUAL "MINSIZEREL")
SET(DEPLOY_CMD_SIGN --release)
IF(ANDROID_BUILD_AAR)
SET(ANDROID_FILE dist-release.aar)
ELSEIF(APK_SIGN_KEYSTORE AND APK_SIGN_KEYSTORE_ALIAS AND APK_SIGN_KEYSTORE_PSW)
MESSAGE(STATUS "Release build will be signed using: ${APK_SIGN_KEYSTORE} | Alias: ${APK_SIGN_KEYSTORE_ALIAS}")
SET(DEPLOY_CMD_SIGN --sign ${APK_SIGN_KEYSTORE} ${APK_SIGN_KEYSTORE_ALIAS} --storepass ${APK_SIGN_KEYSTORE_PSW} --digestalg SHA-256 --sigalg SHA256WithRSA)
IF(ANDROID_USE_GRADLE)
SET(APK_FILE dist-release-signed.apk)
ELSE()
SET(APK_FILE QtApp-release-signed.apk)
ENDIF()
SET(ANDROID_FILE dist-release-signed.apk)
ELSE()
MESSAGE(FATAL_ERROR "Cannot sign release build! Set APK_SIGN_KEYSTORE, APK_SIGN_KEYSTORE_ALIAS and APK_SIGN_KEYSTORE_PSW!")
SET(ANDROID_FILE dist-release-unsigned.apk)
MESSAGE(WARNING "Cannot sign release build! Set APK_SIGN_KEYSTORE, APK_SIGN_KEYSTORE_ALIAS and APK_SIGN_KEYSTORE_PSW!")
ENDIF()
ELSE()
IF(ANDROID_USE_GRADLE)
SET(APK_FILE dist-debug.apk)
SET(ANDROID_FILE dist-debug.${ANDROID_FILE_EXT})
ENDIF()
SET(DEPLOY_CMD ${androiddeployqt} --verbose --gradle --input ${ANDROID_DEPLOYMENT_SETTINGS} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN})
SET(SOURCE_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/build/outputs/${ANDROID_FILE_EXT})
IF("${Qt5Core_VERSION}" VERSION_GREATER_EQUAL "5.12.0" AND NOT ANDROID_BUILD_AAR)
IF(${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/debug)
ELSE()
SET(APK_FILE QtApp-debug.apk)
SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/release)
ENDIF()
ENDIF()
SET(DEPLOY_CMD ${androiddeployqt} --verbose --input ${ANDROID_DEPLOYMENT_SETTINGS} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN})
SET(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/${ANDROID_FILE})
IF(ANDROID_USE_GRADLE)
SET(DEPLOY_CMD ${DEPLOY_CMD} --gradle)
SET(SOURCE_APK_FILE ${CMAKE_INSTALL_PREFIX}/build/outputs/apk/${APK_FILE})
ELSE()
SET(SOURCE_APK_FILE ${CMAKE_INSTALL_PREFIX}/bin/${APK_FILE})
ENDIF()
SET(DESTINATION_APK_FILE ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.apk)
SET(DESTINATION_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.${ANDROID_FILE_EXT})
# Add DEPENDS install someday
# http://public.kitware.com/Bug/view.php?id=8438
ADD_CUSTOM_TARGET(apk
# https://gitlab.kitware.com/cmake/cmake/issues/8438
ADD_CUSTOM_TARGET(${ANDROID_FILE_EXT}
COMMAND ${DEPLOY_CMD}
COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_APK_FILE} ${DESTINATION_APK_FILE})
COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_ANDROID_FILE} ${DESTINATION_ANDROID_FILE})
FIND_PROGRAM(apksigner apksigner HINTS ${ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH)
IF(apksigner)
ADD_CUSTOM_TARGET(verify.signature COMMAND ${apksigner} verify --verbose --print-certs -Werr ${DESTINATION_APK_FILE})
ADD_CUSTOM_COMMAND(TARGET ${ANDROID_FILE_EXT} POST_BUILD
COMMAND ${CMAKE_INSTALL_PREFIX}/gradlew sourcesJar lint
COMMAND ${CMAKE_COMMAND} -E copy build/libs/dist-sources.jar ${CPACK_PACKAGE_FILE_NAME}-sources.jar
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX})
IF(NOT ANDROID_BUILD_AAR)
FIND_PROGRAM(apksigner apksigner HINTS ${ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH)
IF(apksigner)
ADD_CUSTOM_TARGET(verify.signature COMMAND ${apksigner} verify --verbose --print-certs -Werr ${DESTINATION_ANDROID_FILE})
ENDIF()
ENDIF()
ELSEIF(UNIX)

View File

@ -1,54 +1,13 @@
IF(COVERAGE)
# LCov (http://ltp.sourceforge.net/coverage/lcov.php)
FIND_PROGRAM(LCOV_BIN lcov CMAKE_FIND_ROOT_PATH_BOTH)
IF(LCOV_BIN)
SET(LCOV_FILE "${PROJECT_BINARY_DIR}/coverage.info")
SET(LCOV_GLOBAL_CMD ${LCOV_BIN} -q -o ${LCOV_FILE})
SET(LCOV_CMD ${LCOV_GLOBAL_CMD} -c -d ${PROJECT_BINARY_DIR} -b ${PROJECT_SOURCE_DIR})
SET(LCOV_RM_CMD ${LCOV_GLOBAL_CMD} -r ${LCOV_FILE} "*/test/*" "*/include/*" "*/src/external/*" "moc_*" "*.moc" "qrc_*" "ui_*")
IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
IF(WIN32)
SET(CLANG_GCOV py)
ELSE()
SET(CLANG_GCOV sh)
ENDIF()
SET(LCOV_CMD ${LCOV_CMD} --gcov-tool ${RESOURCES_DIR}/jenkins/clang-gcov.${CLANG_GCOV})
ENDIF()
ADD_CUSTOM_COMMAND(OUTPUT ${LCOV_FILE} COMMAND ${LCOV_CMD} COMMAND ${LCOV_RM_CMD})
ADD_CUSTOM_TARGET(lcov COMMAND ${LCOV_BIN} -l ${LCOV_FILE} DEPENDS ${LCOV_FILE})
FIND_PROGRAM(GENHTML_BIN genhtml CMAKE_FIND_ROOT_PATH_BOTH)
IF(GENHTML_BIN)
SET(REPORT_DIR "${PROJECT_BINARY_DIR}/coverage.report")
SET(GENHTML_CMD ${GENHTML_BIN} -q -p ${PROJECT_SOURCE_DIR} --num-spaces=4 -o ${REPORT_DIR} ${LCOV_FILE})
FIND_PROGRAM(FILT_BIN c++filt CMAKE_FIND_ROOT_PATH_BOTH)
IF(FILT_BIN)
SET(GENHTML_CMD ${GENHTML_CMD} --demangle-cpp)
ENDIF()
ADD_CUSTOM_COMMAND(OUTPUT ${REPORT_DIR} COMMAND ${GENHTML_CMD} DEPENDS ${LCOV_FILE})
ADD_CUSTOM_TARGET(lcov.report DEPENDS ${REPORT_DIR})
ENDIF()
SET(LCOV_XML "${PROJECT_BINARY_DIR}/coverage.xml")
SET(LCOV_COBERTURA_CMD ${RESOURCES_DIR}/jenkins/lcov_cobertura.py ${LCOV_FILE} -b ${PROJECT_SOURCE_DIR} -o ${LCOV_XML})
ADD_CUSTOM_COMMAND(OUTPUT ${LCOV_XML} COMMAND ${LCOV_COBERTURA_CMD} DEPENDS ${LCOV_FILE})
ADD_CUSTOM_TARGET(lcov.xml DEPENDS ${LCOV_XML})
ENDIF()
# gcovr (http://gcovr.com/)
FIND_PROGRAM(GCOVR_BIN gcovr CMAKE_FIND_ROOT_PATH_BOTH)
IF(GCOVR_BIN)
SET(GCOVR_FILE "${PROJECT_BINARY_DIR}/gcovr.xml")
SET(GCOVR_CMD ${GCOVR_BIN} -x -o ${GCOVR_FILE} --exclude="src/external" --exclude="test" -r ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
SET(GCOVR_CMD ${GCOVR_BIN} -x -o ${GCOVR_FILE} --exclude="utils" --exclude="src/external" --exclude="test" -r ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
ADD_CUSTOM_COMMAND(OUTPUT ${GCOVR_FILE} COMMAND ${GCOVR_CMD})
ADD_CUSTOM_COMMAND(OUTPUT ${GCOVR_FILE} COMMAND ${GCOVR_CMD} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
ADD_CUSTOM_TARGET(gcovr DEPENDS ${GCOVR_FILE})
ENDIF()
ENDIF()
# CppCheck (http://cppcheck.sourceforge.net)
@ -118,32 +77,34 @@ ENDIF()
FIND_PROGRAM(UNCRUSTIFY uncrustify CMAKE_FIND_ROOT_PATH_BOTH)
IF(UNCRUSTIFY)
FILE(GLOB_RECURSE FILES_JAVA ${PROJECT_SOURCE_DIR}/*.java)
FILE(GLOB_RECURSE FILES_CPP ${PROJECT_SOURCE_DIR}/*.cpp)
FILE(GLOB_RECURSE FILES_H ${PROJECT_SOURCE_DIR}/*.h)
FILE(GLOB_RECURSE FILES_MM ${PROJECT_SOURCE_DIR}/*.mm)
FILE(GLOB_RECURSE FILES_M ${PROJECT_SOURCE_DIR}/*.m)
SET(FILES ${FILES_JAVA} ${FILES_CPP} ${FILES_H} ${FILES_MM} ${FILES_M})
SET(FORMATTING_FILE ${PROJECT_BINARY_DIR}/formatting.files)
FILE(WRITE ${FORMATTING_FILE} "")
FOREACH(file ${FILES})
IF(NOT "${file}" MATCHES "/external/")
FILE(APPEND ${FORMATTING_FILE} ${file})
FILE(APPEND ${FORMATTING_FILE} "\n")
ENDIF()
ENDFOREACH()
SET(UNCRUSTIFY_CFG ${PROJECT_SOURCE_DIR}/uncrustify.cfg)
SET(UNCRUSTIFY_CMD ${UNCRUSTIFY} -c ${UNCRUSTIFY_CFG} --replace --no-backup -q -F ${FORMATTING_FILE})
EXECUTE_PROCESS(COMMAND ${UNCRUSTIFY} --version OUTPUT_VARIABLE UNCRUSTIFY_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
STRING(REPLACE "uncrustify " "" UNCRUSTIFY_VERSION ${UNCRUSTIFY_VERSION})
STRING(REPLACE "Uncrustify-" "" UNCRUSTIFY_VERSION ${UNCRUSTIFY_VERSION})
SET(UNCRUSTIFY_NEEDED_VERSION "0.65")
SET(UNCRUSTIFY_NEEDED_VERSION "0.69")
IF("${UNCRUSTIFY_VERSION}" STRLESS "${UNCRUSTIFY_NEEDED_VERSION}")
MESSAGE(WARNING "Uncrustify seems to be too old. Use at least ${UNCRUSTIFY_NEEDED_VERSION}... you are using: ${UNCRUSTIFY_VERSION}")
ELSE()
MESSAGE(STATUS "Found uncrustify ${UNCRUSTIFY_VERSION}")
FILE(GLOB_RECURSE FILES_JAVA ${PROJECT_SOURCE_DIR}/*.java)
FILE(GLOB_RECURSE FILES_CPP ${PROJECT_SOURCE_DIR}/*.cpp)
FILE(GLOB_RECURSE FILES_H ${PROJECT_SOURCE_DIR}/*.h)
FILE(GLOB_RECURSE FILES_H_IN ${PROJECT_SOURCE_DIR}/*.h.in)
FILE(GLOB_RECURSE FILES_MM ${PROJECT_SOURCE_DIR}/*.mm)
FILE(GLOB_RECURSE FILES_M ${PROJECT_SOURCE_DIR}/*.m)
SET(FILES ${FILES_JAVA} ${FILES_CPP} ${FILES_H_IN} ${FILES_H} ${FILES_MM} ${FILES_M})
SET(FORMATTING_FILE ${PROJECT_BINARY_DIR}/formatting.files)
FILE(WRITE ${FORMATTING_FILE} "")
FOREACH(file ${FILES})
IF(NOT "${file}" MATCHES "/external/")
FILE(APPEND ${FORMATTING_FILE} ${file})
FILE(APPEND ${FORMATTING_FILE} "\n")
ENDIF()
ENDFOREACH()
SET(UNCRUSTIFY_CFG ${PROJECT_SOURCE_DIR}/uncrustify.cfg)
SET(UNCRUSTIFY_CMD ${UNCRUSTIFY} -c ${UNCRUSTIFY_CFG} --replace --no-backup -q -F ${FORMATTING_FILE})
ADD_CUSTOM_TARGET(format COMMAND ${UNCRUSTIFY_CMD} SOURCES ${UNCRUSTIFY_CFG} ${FILES})
ENDIF()
ENDIF()
@ -151,14 +112,11 @@ ENDIF()
FIND_PROGRAM(QMLLINT_BIN qmllint CMAKE_FIND_ROOT_PATH_BOTH)
IF(QMLLINT_BIN)
FILE(GLOB_RECURSE TEST_FILES_QML ${TEST_DIR}/qml/*.qml)
FILE(GLOB_RECURSE TEST_FILES_QML_STATIONARY ${TEST_DIR}/qml_stationary/*.qml)
FILE(GLOB_RECURSE FILES_QML ${RESOURCES_DIR}/qml/*.qml)
FILE(GLOB_RECURSE FILES_QML_STATIONARY ${RESOURCES_DIR}/qml_stationary/*.qml)
FILE(GLOB_RECURSE FILES_JS ${RESOURCES_DIR}/qml/*.js)
FILE(GLOB_RECURSE FILES_JS_STATIONARY ${RESOURCES_DIR}/qml_stationary/*.js)
SET(QMLLINT_CMD ${QMLLINT_BIN} ${FILES_QML} ${FILES_QML_STATIONARY} ${FILES_JS})
SET(QMLLINT_CMD ${QMLLINT_BIN} ${FILES_QML} ${FILES_JS})
ADD_CUSTOM_TARGET(qmllint COMMAND ${QMLLINT_CMD} SOURCES ${TEST_FILES_QML} ${TEST_FILES_QML_STATIONARY} ${FILES_QML} ${FILES_QML_STATIONARY} ${FILES_JS} ${FILES_JS_STATIONARY})
ADD_CUSTOM_TARGET(qmllint COMMAND ${QMLLINT_CMD} SOURCES ${TEST_FILES_QML} ${FILES_QML} ${FILES_JS})
ENDIF()
# doc8 (https://pypi.python.org/pypi/doc8)
@ -175,143 +133,199 @@ ENDFUNCTION()
FIND_PROGRAM(CONVERT convert CMAKE_FIND_ROOT_PATH_BOTH)
IF(CONVERT)
SET(CONVERT_CMD convert)
SET(BACKGROUND_COLOR "transparent")
SET(BACKGROUND_COLOR "#dcebf6")
ADD_CUSTOM_TARGET(npaicons.docs
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 96x96 npa.svg npa_docs.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.win
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -define icon:auto-resize=256,96,64,48,40,32,24,20,16 npa.svg npa.ico
COMMAND ${CONVERT} -background transparent -define icon:auto-resize=256,96,64,48,40,32,24,20,16 npa.svg npa.ico
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android.preview
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 36x36 npa_preview.svg android/ldpi/npa_preview.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 48x48 npa_preview.svg android/mdpi/npa_preview.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 72x72 npa_preview.svg android/hdpi/npa_preview.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 96x96 npa_preview.svg android/xhdpi/npa_preview.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 144x144 npa_preview.svg android/xxhdpi/npa_preview.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 192x192 npa_preview.svg android/xxxhdpi/npa_preview.png
ADD_CUSTOM_TARGET(npaicons.android.background
COMMAND ${CONVERT} -background transparent -resize 81x81 android/npa_background.svg android/ldpi/background_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 108x108 android/npa_background.svg android/mdpi/background_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 162x162 android/npa_background.svg android/hdpi/background_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 216x216 android/npa_background.svg android/xhdpi/background_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 324x324 android/npa_background.svg android/xxhdpi/background_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 432x432 android/npa_background.svg android/xxxhdpi/background_npa.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android.beta
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 36x36 npa_beta.svg android/ldpi/npa_beta.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 48x48 npa_beta.svg android/mdpi/npa_beta.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 72x72 npa_beta.svg android/hdpi/npa_beta.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 96x96 npa_beta.svg android/xhdpi/npa_beta.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 144x144 npa_beta.svg android/xxhdpi/npa_beta.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 192x192 npa_beta.svg android/xxxhdpi/npa_beta.png
ADD_CUSTOM_TARGET(npaicons.android.foreground.preview
COMMAND ${CONVERT} -background transparent -resize 54x54 -gravity center -extent 81x81 android/npa_preview.svg android/ldpi/foreground_npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 72x72 -gravity center -extent 108x108 android/npa_preview.svg android/mdpi/foreground_npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 108x108 -gravity center -extent 162x162 android/npa_preview.svg android/hdpi/foreground_npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 144x144 -gravity center -extent 216x216 android/npa_preview.svg android/xhdpi/foreground_npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 216x216 -gravity center -extent 324x324 android/npa_preview.svg android/xxhdpi/foreground_npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 288x288 -gravity center -extent 432x432 android/npa_preview.svg android/xxxhdpi/foreground_npa_preview.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 36x36 npa.svg android/ldpi/npa.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 48x48 npa.svg android/mdpi/npa.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 72x72 npa.svg android/hdpi/npa.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 96x96 npa.svg android/xhdpi/npa.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 144x144 npa.svg android/xxhdpi/npa.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 192x192 npa.svg android/xxxhdpi/npa.png
ADD_CUSTOM_TARGET(npaicons.android.legacy.preview
COMMAND ${CONVERT} -background transparent -resize 36x36 npa_preview.svg android/ldpi/npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 48x48 npa_preview.svg android/mdpi/npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 72x72 npa_preview.svg android/hdpi/npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 96x96 npa_preview.svg android/xhdpi/npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 144x144 npa_preview.svg android/xxhdpi/npa_preview.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 192x192 npa_preview.svg android/xxxhdpi/npa_preview.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android.foreground.beta
COMMAND ${CONVERT} -background transparent -resize 54x54 -gravity center -extent 81x81 android/npa_beta.svg android/ldpi/foreground_npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 72x72 -gravity center -extent 78x78 android/npa_beta.svg android/mdpi/foreground_npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 108x108 -gravity center -extent 162x162 android/npa_beta.svg android/hdpi/foreground_npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 144x144 -gravity center -extent 216x216 android/npa_beta.svg android/xhdpi/foreground_npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 216x216 -gravity center -extent 324x324 android/npa_beta.svg android/xxhdpi/foreground_npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 288x288 -gravity center -extent 432x432 android/npa_beta.svg android/xxxhdpi/foreground_npa_beta.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android.legacy.beta
COMMAND ${CONVERT} -background transparent -resize 36x36 npa_beta.svg android/ldpi/npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 48x48 npa_beta.svg android/mdpi/npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 72x72 npa_beta.svg android/hdpi/npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 96x96 npa_beta.svg android/xhdpi/npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 144x144 npa_beta.svg android/xxhdpi/npa_beta.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 192x192 npa_beta.svg android/xxxhdpi/npa_beta.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android.foreground
COMMAND ${CONVERT} -background transparent -resize 54x54 -gravity center -extent 81x81 android/npa.svg android/ldpi/foreground_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 72x72 -gravity center -extent 108x108 android/npa.svg android/mdpi/foreground_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 108x108 -gravity center -extent 162x162 android/npa.svg android/hdpi/foreground_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 144x144 -gravity center -extent 216x216 android/npa.svg android/xhdpi/foreground_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 216x216 -gravity center -extent 324x324 android/npa.svg android/xxhdpi/foreground_npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 288x288 -gravity center -extent 432x432 android/npa.svg android/xxxhdpi/foreground_npa.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.android.legacy
COMMAND ${CONVERT} -background transparent -resize 36x36 npa.svg android/ldpi/npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 160 -resize 48x48 npa.svg android/mdpi/npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 240 -resize 72x72 npa.svg android/hdpi/npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 320 -resize 96x96 npa.svg android/xhdpi/npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 480 -resize 144x144 npa.svg android/xxhdpi/npa.png
COMMAND ${CONVERT} -background transparent -units PixelsPerInch -resample 640 -resize 192x192 npa.svg android/xxxhdpi/npa.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.playstore
COMMAND ${CONVERT} -background '${BACKGROUND_COLOR}' -units PixelsPerInch -resample 1120 -resize 336x336 -gravity center -extent 512x512 ${RESOURCES_DIR}/images/npa.svg playstore.png
COMMAND ${CONVERT} -background '${BACKGROUND_COLOR}' -units PixelsPerInch -resample 1120 -resize 336x336 -gravity center -extent 512x512 ${RESOURCES_DIR}/images/npa_preview.svg playstore_preview.png
)
ADD_CUSTOM_TARGET(npaicons.ios.beta
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 29x29 npa_beta.svg iOS/appIcons/beta/iconSmall.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 58x58 npa_beta.svg iOS/appIcons/beta/iconSmall@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 87x87 npa_beta.svg iOS/appIcons/beta/iconSmall@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 40x40 npa_beta.svg iOS/appIcons/beta/iconSmall40.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 80x80 npa_beta.svg iOS/appIcons/beta/iconSmall40@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa_beta.svg iOS/appIcons/beta/iconSmall40@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa_beta.svg iOS/appIcons/beta/icon60@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 180x180 npa_beta.svg iOS/appIcons/beta/icon60@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 76x76 npa_beta.svg iOS/appIcons/beta/icon76.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 152x152 npa_beta.svg iOS/appIcons/beta/icon76@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 167x167 npa_beta.svg iOS/appIcons/beta/icon83.5@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 20x20 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 40x40 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 60x60 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 29x29 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 58x58 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 87x87 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 40x40 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 80x80 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 120x120 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 120x120 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 180x180 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 76x76 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 152x152 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 167x167 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 1024x1024 iOS/appIcons/npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon1024.png
COMMAND ${CONVERT} -background none -resize 256x256 npa_beta.svg iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage.png
COMMAND ${CONVERT} -background none -resize 512x512 npa_beta.svg iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage@2x.png
COMMAND ${CONVERT} -background none -resize 768x768 npa_beta.svg iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage@3x.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.ios
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 29x29 npa.svg iOS/appIcons/iconSmall.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 58x58 npa.svg iOS/appIcons/iconSmall@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 87x87 npa.svg iOS/appIcons/iconSmall@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 40x40 npa.svg iOS/appIcons/iconSmall40.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 80x80 npa.svg iOS/appIcons/iconSmall40@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa.svg iOS/appIcons/iconSmall40@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa.svg iOS/appIcons/icon60@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 180x180 npa.svg iOS/appIcons/icon60@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 76x76 npa.svg iOS/appIcons/icon76.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 152x152 npa.svg iOS/appIcons/icon76@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 167x167 npa.svg iOS/appIcons/icon83.5@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 20x20 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 40x40 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 60x60 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 29x29 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 58x58 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 87x87 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 40x40 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 80x80 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 120x120 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 120x120 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 180x180 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@3x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 76x76 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 152x152 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 167x167 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png
COMMAND ${CONVERT} -alpha off -background '${BACKGROUND_COLOR}' -resize 1024x1024 iOS/appIcons/npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon1024.png
COMMAND ${CONVERT} -background none -resize 256x256 npa.svg iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage.png
COMMAND ${CONVERT} -background none -resize 512x512 npa.svg iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage@2x.png
COMMAND ${CONVERT} -background none -resize 768x768 npa.svg iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage@3x.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
SET(BACKGROUND_COLOR "rgb\(220,235,246\)")
ADD_CUSTOM_TARGET(npaicons.iphone
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 320x320 -gravity center -extent 640x1136 npa.svg iOS/launchImages/Default-568h@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 320x320 -gravity center -extent 640x1136 npa.svg iOS/launchImages/launchImage568@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 480x480 -gravity center -extent 960x1704 npa.svg iOS/launchImages/launchImage568@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 353x353 -gravity center -extent 705x1334 npa.svg iOS/launchImages/launchImage667@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 563x563 -gravity center -extent 1125x2001 npa.svg iOS/launchImages/launchImage667@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 414x414 -gravity center -extent 828x1472 npa.svg iOS/launchImages/launchImage736@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 621x621 -gravity center -extent 1242x2208 npa.svg iOS/launchImages/launchImage736@3x.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons.ipad
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 768x768 -gravity center -extent 2048x1536 npa.svg iOS/launchImages/launchImage1024@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 1152x1152 -gravity center -extent 3072x2304 npa.svg iOS/launchImages/launchImage1024@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 834x834 -gravity center -extent 2224x1668 npa.svg iOS/launchImages/launchImage1112@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 1251x1251 -gravity center -extent 3336x2502 npa.svg iOS/launchImages/launchImage1112@3x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 1024x1024 -gravity center -extent 2732x2048 npa.svg iOS/launchImages/launchImage1366@2x.png
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 1536x1536 -gravity center -extent 4098x3072 npa.svg iOS/launchImages/launchImage1366@3x.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(npaicons DEPENDS npaicons.win npaicons.ios npaicons.ios.beta npaicons.iphone npaicons.ipad npaicons.android npaicons.android.beta npaicons.android.preview)
ADD_CUSTOM_TARGET(npaicons DEPENDS npaicons.docs npaicons.win npaicons.ios npaicons.ios.beta npaicons.playstore npaicons.android.background npaicons.android.foreground npaicons.android.foreground.beta npaicons.android.foreground.preview npaicons.android.legacy npaicons.android.legacy.beta npaicons.android.legacy.preview)
ENDIF()
FIND_PROGRAM(PNGQUANT pngquant CMAKE_FIND_ROOT_PATH_BOTH)
IF(PNGQUANT)
SET(PNGQUANT_CMD pngquant -f -o)
SET(PNGQUANT_CMD pngquant -f -o)
ADD_CUSTOM_TARGET(pngquant.npaicons.docs
COMMAND ${PNGQUANT_CMD} npa_docs.png -- npa_docs.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.ios.beta
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/iconSmall.png -- iOS/appIcons/beta/iconSmall.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/iconSmall@2x.png -- iOS/appIcons/beta/iconSmall@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/iconSmall@3x.png -- iOS/appIcons/beta/iconSmall@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/iconSmall40.png -- iOS/appIcons/beta/iconSmall40.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/iconSmall40@2x.png -- iOS/appIcons/beta/iconSmall40@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/iconSmall40@3x.png -- iOS/appIcons/beta/iconSmall40@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/icon60@2x.png -- iOS/appIcons/beta/icon60@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/icon60@3x.png -- iOS/appIcons/beta/icon60@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/icon76.png -- iOS/appIcons/beta/icon76.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/icon76@2x.png -- iOS/appIcons/beta/icon76@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/icon83.5@2x.png -- iOS/appIcons/beta/icon83.5@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@2x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@3x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@2x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@3x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76@2x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon1024.png -- iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon1024.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage.png -- iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage@2x.png -- iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage@3x.png -- iOS/appIcons/beta/Images.xcassets/LaunchImage.imageset/launchImage@3x.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.ios
COMMAND ${PNGQUANT_CMD} iOS/appIcons/iconSmall.png -- iOS/appIcons/iconSmall.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/iconSmall@2x.png -- iOS/appIcons/iconSmall@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/iconSmall@3x.png -- iOS/appIcons/iconSmall@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/iconSmall40.png -- iOS/appIcons/iconSmall40.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/iconSmall40@2x.png -- iOS/appIcons/iconSmall40@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/iconSmall40@3x.png -- iOS/appIcons/iconSmall40@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/icon60@2x.png -- iOS/appIcons/icon60@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/icon60@3x.png -- iOS/appIcons/icon60@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/icon76.png -- iOS/appIcons/icon76.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/icon76@2x.png -- iOS/appIcons/icon76@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/icon83.5@2x.png -- iOS/appIcons/icon83.5@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/Default-568h@2x.png -- iOS/launchImages/Default-568h@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@2x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@3x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@2x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@3x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@3x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76@2x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon1024.png -- iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon1024.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage.png -- iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage@2x.png -- iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage@2x.png
COMMAND ${PNGQUANT_CMD} iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage@3x.png -- iOS/appIcons/Images.xcassets/LaunchImage.imageset/launchImage@3x.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.iphone
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage568@2x.png -- iOS/launchImages/launchImage568@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage568@3x.png -- iOS/launchImages/launchImage568@3x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage667@2x.png -- iOS/launchImages/launchImage667@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage667@3x.png -- iOS/launchImages/launchImage667@3x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage736@2x.png -- iOS/launchImages/launchImage736@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage736@3x.png -- iOS/launchImages/launchImage736@3x.png
ADD_CUSTOM_TARGET(pngquant.android.background
COMMAND ${PNGQUANT_CMD} android/ldpi/background_npa.png -- android/ldpi/background_npa.png
COMMAND ${PNGQUANT_CMD} android/mdpi/background_npa.png -- android/mdpi/background_npa.png
COMMAND ${PNGQUANT_CMD} android/hdpi/background_npa.png -- android/hdpi/background_npa.png
COMMAND ${PNGQUANT_CMD} android/xhdpi/background_npa.png -- android/xhdpi/background_npa.png
COMMAND ${PNGQUANT_CMD} android/xxhdpi/background_npa.png -- android/xxhdpi/background_npa.png
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/background_npa.png -- android/xxxhdpi/background_npa.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.ipad
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage1024@2x.png -- iOS/launchImages/launchImage1024@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage1024@3x.png -- iOS/launchImages/launchImage1024@3x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage1112@2x.png -- iOS/launchImages/launchImage1112@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage1112@3x.png -- iOS/launchImages/launchImage1112@3x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage1366@2x.png -- iOS/launchImages/launchImage1366@2x.png
COMMAND ${PNGQUANT_CMD} iOS/launchImages/launchImage1366@3x.png -- iOS/launchImages/launchImage1366@3x.png
ADD_CUSTOM_TARGET(pngquant.android.foreground.preview
COMMAND ${PNGQUANT_CMD} android/ldpi/foreground_npa_preview.png -- android/ldpi/foreground_npa_preview.png
COMMAND ${PNGQUANT_CMD} android/mdpi/foreground_npa_preview.png -- android/mdpi/foreground_npa_preview.png
COMMAND ${PNGQUANT_CMD} android/hdpi/foreground_npa_preview.png -- android/hdpi/foreground_npa_preview.png
COMMAND ${PNGQUANT_CMD} android/xhdpi/foreground_npa_preview.png -- android/xhdpi/foreground_npa_preview.png
COMMAND ${PNGQUANT_CMD} android/xxhdpi/foreground_npa_preview.png -- android/xxhdpi/foreground_npa_preview.png
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/foreground_npa_preview.png -- android/xxxhdpi/foreground_npa_preview.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.android.preview
ADD_CUSTOM_TARGET(pngquant.android.legacy.preview
COMMAND ${PNGQUANT_CMD} android/ldpi/npa_preview.png -- android/ldpi/npa_preview.png
COMMAND ${PNGQUANT_CMD} android/mdpi/npa_preview.png -- android/mdpi/npa_preview.png
COMMAND ${PNGQUANT_CMD} android/hdpi/npa_preview.png -- android/hdpi/npa_preview.png
@ -320,7 +334,16 @@ SET(PNGQUANT_CMD pngquant -f -o)
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/npa_preview.png -- android/xxxhdpi/npa_preview.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.android.beta
ADD_CUSTOM_TARGET(pngquant.android.foreground.beta
COMMAND ${PNGQUANT_CMD} android/ldpi/foreground_npa_beta.png -- android/ldpi/foreground_npa_beta.png
COMMAND ${PNGQUANT_CMD} android/mdpi/foreground_npa_beta.png -- android/mdpi/foreground_npa_beta.png
COMMAND ${PNGQUANT_CMD} android/hdpi/foreground_npa_beta.png -- android/hdpi/foreground_npa_beta.png
COMMAND ${PNGQUANT_CMD} android/xhdpi/foreground_npa_beta.png -- android/xhdpi/foreground_npa_beta.png
COMMAND ${PNGQUANT_CMD} android/xxhdpi/foreground_npa_beta.png -- android/xxhdpi/foreground_npa_beta.png
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/foreground_npa_beta.png -- android/xxxhdpi/foreground_npa_beta.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.android.legacy.beta
COMMAND ${PNGQUANT_CMD} android/ldpi/npa_beta.png -- android/ldpi/npa_beta.png
COMMAND ${PNGQUANT_CMD} android/mdpi/npa_beta.png -- android/mdpi/npa_beta.png
COMMAND ${PNGQUANT_CMD} android/hdpi/npa_beta.png -- android/hdpi/npa_beta.png
@ -329,7 +352,16 @@ SET(PNGQUANT_CMD pngquant -f -o)
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/npa_beta.png -- android/xxxhdpi/npa_beta.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.android
ADD_CUSTOM_TARGET(pngquant.android.foreground
COMMAND ${PNGQUANT_CMD} android/ldpi/foreground_npa.png -- android/ldpi/foreground_npa.png
COMMAND ${PNGQUANT_CMD} android/mdpi/foreground_npa.png -- android/mdpi/foreground_npa.png
COMMAND ${PNGQUANT_CMD} android/hdpi/foreground_npa.png -- android/hdpi/foreground_npa.png
COMMAND ${PNGQUANT_CMD} android/xhdpi/foreground_npa.png -- android/xhdpi/foreground_npa.png
COMMAND ${PNGQUANT_CMD} android/xxhdpi/foreground_npa.png -- android/xxhdpi/foreground_npa.png
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/foreground_npa.png -- android/xxxhdpi/foreground_npa.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant.android.legacy
COMMAND ${PNGQUANT_CMD} android/ldpi/npa.png -- android/ldpi/npa.png
COMMAND ${PNGQUANT_CMD} android/mdpi/npa.png -- android/mdpi/npa.png
COMMAND ${PNGQUANT_CMD} android/hdpi/npa.png -- android/hdpi/npa.png
@ -338,7 +370,7 @@ SET(PNGQUANT_CMD pngquant -f -o)
COMMAND ${PNGQUANT_CMD} android/xxxhdpi/npa.png -- android/xxxhdpi/npa.png
WORKING_DIRECTORY ${RESOURCES_DIR}/images)
ADD_CUSTOM_TARGET(pngquant DEPENDS pngquant.ios pngquant.ios.beta pngquant.iphone pngquant.ipad pngquant.android pngquant.android.beta pngquant.android.preview)
ADD_CUSTOM_TARGET(pngquant DEPENDS pngquant.npaicons.docs pngquant.ios pngquant.ios.beta pngquant.android.background pngquant.android.foreground pngquant.android.foreground.beta pngquant.android.foreground.preview pngquant.android.legacy pngquant.android.legacy.beta pngquant.android.legacy.preview)
ENDIF()
IF(NOT JAVA_EXECUTABLE)
@ -356,4 +388,55 @@ IF(JAVA_EXECUTABLE)
ENDIF()
ENDIF()
FIND_PROGRAM(DOT dot CMAKE_FIND_ROOT_PATH_BOTH)
IF(DOT)
SET(architecture_file Architecture)
SET(ARCHI_PDF_DEPENDS)
ADD_CUSTOM_TARGET(architecture.graphviz ${CMAKE_COMMAND} --graphviz=${architecture_file} . WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
LIST(APPEND ARCHI_PDF_DEPENDS architecture.graphviz)
FIND_PROGRAM(SED sed CMAKE_FIND_ROOT_PATH_BOTH)
IF(SED)
# 1. Strip line of plugins as it is misleading
# 2. Strip "AusweisApp" prefix
ADD_CUSTOM_TARGET(architecture.sed
COMMAND ${SED} -i -E '/AusweisApp -> AusweisApp\(Ui|Card|Activation\).+/d' ${architecture_file}
COMMAND ${SED} -i'' -e 's/"AusweisApp"/"AusweisApp2"/' ${architecture_file}
COMMAND ${SED} -i'' -e 's/"AusweisApp2"/"REPLACE"/' ${architecture_file}
COMMAND ${SED} -i'' -e 's/AusweisApp//' ${architecture_file}
COMMAND ${SED} -i'' -e 's/"REPLACE"/"AusweisApp2"/' ${architecture_file}
COMMAND ${SED} -i'' -e 's/diamond/box/' ${architecture_file}
DEPENDS ${ARCHI_PDF_DEPENDS}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
LIST(APPEND ARCHI_PDF_DEPENDS architecture.sed)
ENDIF()
ADD_CUSTOM_TARGET(architecture
${DOT} -O -Tpdf ${architecture_file}
DEPENDS ${ARCHI_PDF_DEPENDS}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
ENDIF()
FIND_PACKAGE(PythonInterp 2.7)
IF(PYTHONINTERP_FOUND)
ADD_CUSTOM_TARGET(checkproviderurls
COMMAND ${PYTHON_EXECUTABLE} "${PROJECT_SOURCE_DIR}/utils/providercheck/check-urls.py" "${PROJECT_SOURCE_DIR}/resources/updatable-files/supported-providers.json")
ENDIF()
FIND_PROGRAM(SED sed CMAKE_FIND_ROOT_PATH_BOTH)
IF(SED)
FILE(GLOB FILES_TO_GENERATE ${RESOURCES_DIR}/images/tutorial/src/*.svg)
SET(TARGET_DIR ${RESOURCES_DIR}/images/tutorial/generated)
ADD_CUSTOM_TARGET(generate_composite_images.sed)
FOREACH(SRC ${FILES_TO_GENERATE})
GET_FILENAME_COMPONENT(SRC_NAME ${SRC} NAME)
ADD_CUSTOM_COMMAND(TARGET generate_composite_images.sed PRE_BUILD
COMMAND ${SED} -E 's/xlink:href=\\"[\\.\\/]+/xlink:href=\\":\\//' ${SRC} > ${TARGET_DIR}/${SRC_NAME})
ENDFOREACH(SRC)
ENDIF()
INCLUDE(Sphinx)

View File

@ -1,5 +1,17 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.7.1)
FUNCTION(READ_REVISION _var _regex _file)
IF(EXISTS "${_file}")
FILE(READ "${_file}" content)
STRING(REGEX MATCH "${_regex}" _unused "${content}")
SET(${_var} ${CMAKE_MATCH_1} PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
IF(NOT CMAKE_ANDROID_NDK)
SET(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK})
ENDIF()
SET(ANDROID_SDK $ENV{ANDROID_HOME})
SET(ANDROID_BUILD_TOOLS_REVISION $ENV{ANDROID_BUILD_TOOLS_REVISION})
@ -18,19 +30,31 @@ IF(NOT ANDROID_BUILD_TOOLS_REVISION)
GET_FILENAME_COMPONENT(ANDROID_BUILD_TOOLS_REVISION "${build_tools}" NAME)
ENDIF()
READ_REVISION(ANDROID_NDK_REVISION ".*Revision = ([0-9|\\.]+)" "${CMAKE_ANDROID_NDK}/source.properties")
READ_REVISION(ANDROID_SDK_REVISION ".*Revision=([0-9|\\.]+)" "${ANDROID_SDK}/tools/source.properties")
IF(NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION AND ANDROID_NDK_REVISION VERSION_GREATER_EQUAL "11")
SET(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
ENDIF()
SET(ANDROID_NDK_TOOLCHAIN_VERSION 4.9)
SET(CMAKE_SYSTEM_NAME Android)
SET(CMAKE_ANDROID_STL_TYPE gnustl_shared)
SET(CMAKE_SYSTEM_VERSION 21)
IF(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "clang")
SET(CMAKE_ANDROID_STL_TYPE c++_shared)
ELSE()
SET(CMAKE_ANDROID_STL_TYPE gnustl_shared)
ENDIF()
IF(NOT CMAKE_ANDROID_ARCH_ABI)
SET(CMAKE_ANDROID_ARCH_ABI armeabi-v7a)
ENDIF()
IF(CMAKE_ANDROID_ARCH_ABI MATCHES "arm64-v8a")
SET(CMAKE_SYSTEM_VERSION 21)
ELSE()
SET(CMAKE_SYSTEM_VERSION 18)
ENDIF()
SET(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH} CACHE string "android find search path root")
OPTION(ANDROID_BUILD_AAR "Build AAR file instead of APK" OFF)
SET(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH} CACHE STRING "android find search path root")
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

View File

@ -35,6 +35,19 @@ FUNCTION(CREATE_HASH)
ENDFOREACH()
ENDFUNCTION()
FUNCTION(CHECK_WIX_WARNING)
FILE(STRINGS "${FILE}" WIX_WARNINGS REGEX "warning")
LIST(LENGTH WIX_WARNINGS WARNING_COUNT)
IF(WARNING_COUNT GREATER 0)
FOREACH(m ${WIX_WARNINGS})
MESSAGE(STATUS "${m}\n")
ENDFOREACH()
MESSAGE(FATAL_ERROR "Found ${WARNING_COUNT} new WIX warnings")
ELSE()
MESSAGE(STATUS "No WIX warnings found")
ENDIF()
ENDFUNCTION()
@ -47,6 +60,8 @@ ENDIF()
IF(CMD STREQUAL "HASH")
CREATE_HASH()
ELSEIF(CMD STREQUAL "CHECK_WIX_WARNING")
CHECK_WIX_WARNING()
ELSE()
MESSAGE(FATAL_ERROR "Unknown CMD: ${CMD}")
ENDIF()

View File

@ -1,217 +1,35 @@
# This file is based off of the Platform/Darwin.cmake and Platform/UnixPaths.cmake
# files which are included with CMake 2.8.4
# It has been altered for iOS development
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
# Options:
#
# IOS_PLATFORM = OS (default) or SIMULATOR or SIMULATOR64
# This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders
# OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch.
# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch.
#
# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder
# By default this location is automatcially chosen based on the IOS_PLATFORM value above.
# If set manually, it will override the default location and force the user of a particular Developer Platform
#
# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder
# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value.
# In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path.
# If set manually, this will force the use of a specific SDK version
SET(CMAKE_SYSTEM_NAME iOS)
SET(CMAKE_OSX_ARCHITECTURES "arm64")
SET(CMAKE_OSX_DEPLOYMENT_TARGET 13.0)
# Macros:
#
# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE)
# A convenience macro for setting xcode specific properties on targets
# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1")
#
# find_host_package (PROGRAM ARGS)
# A macro used to find executable programs on the host system, not within the iOS environment.
# Thanks to the android-cmake project for providing the command
SET(UNIX True)
SET(APPLE True)
SET(IOS True)
# Standard settings
set (CMAKE_SYSTEM_NAME Darwin)
set (CMAKE_SYSTEM_VERSION 1)
set (UNIX True)
set (APPLE True)
set (IOS True)
SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
find_program(xcrun_bin xcrun CMAKE_FIND_ROOT_PATH_BOTH)
if(NOT xcrun_bin)
message(FATAL_ERROR "Cannot find xcrun")
endif()
SET(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "YES")
SET(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE "bitcode")
function(XCRUN _out _find)
execute_process(COMMAND ${xcrun_bin} --sdk iphoneos -f ${_find} OUTPUT_VARIABLE tmp_out OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${_out} "${tmp_out}" PARENT_SCOPE)
endfunction()
SET(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH} CACHE STRING "iOS find search path root")
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# https://cmake.org/Bug/view.php?id=15329
set(CMAKE_MACOSX_BUNDLE YES)
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
# Required as of cmake 2.8.10
set (CMAKE_OSX_DEPLOYMENT_TARGET "" CACHE STRING "Force unset of the deployment target for iOS" FORCE)
# Determine the cmake host system version so we know where to find the iOS SDKs
find_program (CMAKE_UNAME uname /bin /usr/bin /usr/local/bin)
if (CMAKE_UNAME)
exec_program(uname ARGS -r OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION)
string (REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}")
endif (CMAKE_UNAME)
XCRUN(CMAKE_C_COMPILER clang)
XCRUN(CMAKE_CXX_COMPILER clang++)
XCRUN(CMAKE_AR ar)
set(CMAKE_AR ${CMAKE_AR} CACHE FILEPATH "" FORCE)
# All iOS/Darwin specific settings - some may be redundant
set (CMAKE_SHARED_LIBRARY_PREFIX "lib")
set (CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
set (CMAKE_SHARED_MODULE_PREFIX "lib")
set (CMAKE_SHARED_MODULE_SUFFIX ".so")
set (CMAKE_MODULE_EXISTS 1)
set (CMAKE_DL_LIBS "")
set (CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
set (CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ")
set (CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}")
set (CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}")
# Hidden visibilty is required for cxx on iOS
set (CMAKE_C_FLAGS_INIT "")
set (CMAKE_CXX_FLAGS_INIT "-fvisibility=hidden -fvisibility-inlines-hidden")
set (CMAKE_C_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
set (CMAKE_CXX_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
set (CMAKE_PLATFORM_HAS_INSTALLNAME 1)
set (CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -headerpad_max_install_names")
set (CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -headerpad_max_install_names")
set (CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,")
set (CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,")
set (CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a")
# hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree
# (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache
# and still cmake didn't fail in CMakeFindBinUtils.cmake (because it isn't rerun)
# hardcode CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did before, Alex
if (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool)
endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
# Setup iOS platform unless specified manually with IOS_PLATFORM
if (NOT DEFINED IOS_PLATFORM)
set (IOS_PLATFORM "OS")
endif (NOT DEFINED IOS_PLATFORM)
set (IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform")
# Setup building for arm64 or not
if (NOT DEFINED BUILD_ARM64)
set (BUILD_ARM64 true)
endif (NOT DEFINED BUILD_ARM64)
set (BUILD_ARM64 ${BUILD_ARM64} CACHE STRING "Build arm64 arch or not")
# Check the platform selection and setup for developer root
if (${IOS_PLATFORM} STREQUAL "OS")
set (IOS_PLATFORM_LOCATION "iPhoneOS.platform")
# This causes the installers to properly locate the output libraries
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphoneos")
elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR")
set (SIMULATOR true)
set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform")
# This causes the installers to properly locate the output libraries
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator")
elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR64")
set (SIMULATOR true)
set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform")
# This causes the installers to properly locate the output libraries
set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "-iphonesimulator")
else (${IOS_PLATFORM} STREQUAL "OS")
message (FATAL_ERROR "Unsupported IOS_PLATFORM value selected. Please choose OS or SIMULATOR")
endif (${IOS_PLATFORM} STREQUAL "OS")
# Setup iOS developer location unless specified manually with CMAKE_IOS_DEVELOPER_ROOT
# Note Xcode 4.3 changed the installation location, choose the most recent one available
exec_program(/usr/bin/xcode-select ARGS -print-path OUTPUT_VARIABLE CMAKE_XCODE_DEVELOPER_DIR)
set (XCODE_POST_43_ROOT "${CMAKE_XCODE_DEVELOPER_DIR}/Platforms/${IOS_PLATFORM_LOCATION}/Developer")
set (XCODE_PRE_43_ROOT "/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer")
if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
if (EXISTS ${XCODE_POST_43_ROOT})
set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_POST_43_ROOT})
elseif(EXISTS ${XCODE_PRE_43_ROOT})
set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_PRE_43_ROOT})
endif (EXISTS ${XCODE_POST_43_ROOT})
endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
set (CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform")
# Find and use the most recent iOS sdk unless specified manually with CMAKE_IOS_SDK_ROOT
if (NOT DEFINED CMAKE_IOS_SDK_ROOT)
file (GLOB _CMAKE_IOS_SDKS "${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/*")
if (_CMAKE_IOS_SDKS)
list (SORT _CMAKE_IOS_SDKS)
list (REVERSE _CMAKE_IOS_SDKS)
list (GET _CMAKE_IOS_SDKS 0 CMAKE_IOS_SDK_ROOT)
else (_CMAKE_IOS_SDKS)
message (FATAL_ERROR "No iOS SDK's found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.")
endif (_CMAKE_IOS_SDKS)
message (STATUS "Toolchain using default iOS SDK: ${CMAKE_IOS_SDK_ROOT}")
endif (NOT DEFINED CMAKE_IOS_SDK_ROOT)
set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK")
# Set the sysroot default to the most recent SDK
set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support")
# set the architecture for iOS
if (${IOS_PLATFORM} STREQUAL "OS")
set (IOS_ARCH arm64)
elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR")
set (IOS_ARCH i386)
elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR64")
set (IOS_ARCH x86_64)
endif (${IOS_PLATFORM} STREQUAL "OS")
set (CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE string "Build architecture for iOS")
# Set the find root to the iOS developer roots and to user defined paths
set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root")
# default to searching for frameworks first
set (CMAKE_FIND_FRAMEWORK FIRST)
# set up the default search directories for frameworks
set (CMAKE_SYSTEM_FRAMEWORK_PATH
${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks
${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks
${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks
)
# only search the iOS sdks, not the remainder of the host filesystem
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# This little macro lets you set any XCode specific property
macro (set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE)
set_property (TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE})
endmacro (set_xcode_property)
# This macro lets you find executable programs on the host system
macro (find_host_package)
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
set (IOS FALSE)
find_package(${ARGN})
set (IOS TRUE)
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endmacro (find_host_package)
# work-around: cmake will fail if this is missing!
macro(find_host_package)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
set(IOS FALSE)
find_package(${ARGN})
set(IOS TRUE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
endmacro(find_host_package)

View File

@ -2,6 +2,8 @@ IF(SPHINX_FOUND)
SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/releasenotes" "notes" BUILDER singlehtml html latex)
SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/sdk" "sdk" BUILDER changes html latex DEFAULT_LANG en)
SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/installation" "inst" BUILDER changes html latex)
ELSE()
MESSAGE(STATUS "No documentation will be generated")
ENDIF()

View File

@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.18.1-->
<key attr.name="Beschreibung" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/>
<key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<data key="d0" xml:space="preserve"/>
<node id="n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="249.93318675648084" width="150.73691016175417" x="379.82322525840146" y="-15.0"/>
<y:Fill color="#E0E0E0" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="90.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.609375" x="9.991977284848872" xml:space="preserve" y="146.38688006175698">Internet<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="-0.4337124711251771" nodeRatioY="0.2841945985857549" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle3d"/>
</y:ShapeNode>
</data>
</node>
<node id="n1">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="402.28247680692664" width="162.91206076630084" x="130.0970161695911" y="-19.152021620717733"/>
<y:Fill color="#E0E0E0" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="79.45603038315042" y="199.14123840346332">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="90.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.396484375" x="9.113003096740954" xml:space="preserve" y="308.695703503948">Lokales Netz<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="-0.4440618266451515" nodeRatioY="0.4622397449460143" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle3d"/>
</y:ShapeNode>
</data>
</node>
<node id="n2">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="283.8426393358113" width="150.73691016175417" x="138.89277718906638" y="-15.0"/>
<y:Fill color="#D0D0D0" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="90.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="97.181640625" x="8.098407213028707" xml:space="preserve" y="166.02446489063328">Lokaler Rechner<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="-0.44627455741040206" nodeRatioY="0.4272958641151755" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle3d"/>
</y:ShapeNode>
</data>
</node>
<node id="n3">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="166.95265436079174" y="97.8883879466967"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="82.333984375" x="13.8330078125" xml:space="preserve" y="6.93359375">AusweisApp2<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n4">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="409.06939432176046" y="97.8883879466967"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.939453125" x="22.0302734375" xml:space="preserve" y="6.93359375">eID-Server<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n5">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="409.06939432176046" y="-7.134920941481575"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="89.060546875" x="10.4697265625" xml:space="preserve" y="6.93359375">Dienstanbieter<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n6">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="166.95265436079174" y="-7.1349209414815675"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.142578125" x="29.9287109375" xml:space="preserve" y="6.93359375">Browser<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n7">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="110.0" x="409.06939432176046" y="199.59487324412942"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="88.029296875" x="10.9853515625" xml:space="preserve" y="5.93359375">Update-Server<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n8">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="166.95265436079174" y="326.6678526626905"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="104.494140625" x="2.7529296875" xml:space="preserve" y="6.93359375">Mobiles Endgerät<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n9">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="101.0" x="171.45265436079177" y="202.91169683487496"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="97.7265625" x="1.63671875" xml:space="preserve" y="6.93359375">Drittanwendung<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<edge id="e0" source="n6" target="n5">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e1" source="n5" target="n4">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e2" source="n6" target="n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.71875" x="-34.70611583776903" xml:space="preserve" y="28.92603874253608">eID1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="19.34674322102171" distanceToCenter="true" position="right" ratio="0.5329867452764283" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e3" source="n3" target="n4">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.71875" x="51.6604446461962" xml:space="preserve" y="-21.17213706476275">eID3<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="12.10572917405711" distanceToCenter="true" position="left" ratio="0.5105195151628484" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e4" source="n3" target="n8">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="54.54734563920826" sy="14.111612053303304" tx="26.398238238132535" ty="-16.02468140151575">
<y:Point x="276.5" y="269.0"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="36.30859375" x="-59.09839513686407" xml:space="preserve" y="149.37254155441815">SaK1,
SaK2 <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="1.8153536324476993" distanceToCenter="false" position="right" ratio="0.7870346060615276" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e5" source="n3" target="n7">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="54.971035876728166" sy="15.038770784339903" tx="-53.5611005145696" ty="-15.000980657566373"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" rotationAngle="22.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.220703125" x="46.57289611424528" xml:space="preserve" y="33.28619210241317">Update<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="11.307275195559956" distanceToCenter="true" position="right" ratio="0.6189315207731947" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e6" source="n5" target="n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="27.54734563920826" ty="-1.888387946696696"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" rotationAngle="337.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.71875" x="-101.58040528438903" xml:space="preserve" y="9.329639509720586">eID2<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="15.099869002821848" distanceToCenter="true" position="right" ratio="0.3864086416472374" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e7" source="n3" target="n9">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="53.359375" x="-55.679685116747294" xml:space="preserve" y="28.445254182778">eID-SDK<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="28.999999999999986" distanceToCenter="true" position="right" ratio="0.5222764299898304" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d7">
<y:Resources/>
</data>
</graphml>

View File

@ -0,0 +1,486 @@
%PDF-1.4
%âãÏÓ
1 0 obj
<<
/Title ()
/Author ()
/Subject ()
/Keywords ()
/Creator (yExport 1.5)
/Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.5)
/CreationDate (D:20190314162821+01'00')
/ModDate (D:20190314162821+01'00')
/Trapped /False
>>
endobj
2 0 obj
<<
/Type /Catalog
/Pages 3 0 R
/ViewerPreferences 4 0 R
/OpenAction [5 0 R /Fit]
>>
endobj
4 0 obj
<<
/FitWindow true
/CenterWindow false
>>
endobj
5 0 obj
<<
/Parent 3 0 R
/Type /Page
/Contents 6 0 R
>>
endobj
6 0 obj
<<
/Length 7 0 R
/Filter [/ASCII85Decode /FlateDecode]
>>
stream
Gb"07bDmmlYpD<3YG`ONb288R7KN^+E7KR^$OLorOO`PFrBDE3CRLU2hHAq,"!0?'JK13>8rk"O%s'OJ
H[5T]kC5_Fb<LKu0<iuMrm/p:?U+Pga6SAmI^FuF*Ig)XT7$T^IDsg!^]+#S5Q9D_ci<RNIf9#Ura5Ka
J,OlR?>9H;huEBDJ,_b5[ibEiJ,emX:QPPCJ)[rokN73ZmrS(aGFG!cCPMjcfDj^FJ'#7]eJ8,GduOg[
09>7_d,4gC'<69T`Er9(7rRG`LG/Zph-8q0YJ9&nK>7E\0E9LepeQ83D&!#k&q$dk>5e9ncPc4js*b/W
kPeTF]JGkHVN3q#%q#<kE_'rsKC'KDq#92g$2u>MI-XX8l1G/PLHj@b\$qlYQMi^<s$M/3c>W^O2hq/`
Eh;=SlT^d7hu+Q_omp(ar7@M)We#PeqY,QUr*J3))qNnN;#cE%nW*YC./tEHrVI,.mIPfPQWc")lefJI
<(lgmpRh8#]"6dtrJtjbo^dPsFP$@Ts2U2sO`RYf`?-<>d$aBkgTi2OlUPf7IDbb@VIa-a+)`hq5>#4K
an[[3RE9Zc5$G)Ki:Tr[:T(n8RXX[c>]N"Vm5]Z.oX['Zr,H]ErR&28>0AI0DU-arEmQ3\j4X>bpte1*
7-hu)?Z"sJ6\g0B>kBRdN9\'$N:[SJO-[cfY<sgQ%-Z6e#PC74X4GH[Fe>hBch5N&qT/Pq!_0QDO0m4i
mP>Z%3r8bo3n22hN)q9tN^)71SNa.'cEi6I.rf6FO,^ou[a%JbN%$]UZ%dY?Y6<?6f<I0FmGKbGT?G8M
Ho@l4FJ^S8R3[7tGi?CXZV`r%g>?kN\39kP#A/SYX+-?iS#?"eb_tr]j7L!4_tSM(rZ-UkC45"rRW4)0
%tSVk[EdFE7g2$`IH'("Vap&4>RK]-q4P,U.k>a*9,pnd5'l>gO1k(*W@;HZASjWWC6^UJLXIn[H^rV9
VgGkYCAqB,a.1tX5H'fqIpLJm=Yno_=Oj,CKA%KG%'%P<jWV7bb<naaj38FnTe2@7(24UH,eC=R"[4bD
qEeslR-.<cd4/8k"NGk]h1l`hZRQDgo^jPCmF8e!<Z-omIl$df[&PYJUQ2ZX%N:c41iqQGGtAaOg%ot"
Zdc5N8fcI0l*%$$\2I`!Jb.ZBaV3:&Z(JQd]uiboJ!T*dM8V!a5&ST=[?clFM.T[>17p_!O/n$h:!D+g
V^G`_[$'H&a4S"\lSg;:`9*H8a!=/#i_8?qL=,2;rKj_F+l+,QY3#4Y_m);GU$+AKiS_0M@iHB%/a)$_
)<7Y!b]mKDHZ6<6;_*%:4SrqQ+;!Er?lXP0G^Yh+1VRp"d)ZskH+pic*^'epAE`r7En>U&l/BQ64/gU(
DnPhna7J598!N31P[VE`"%R#kGeN.)Ob:J_D+<faa'O/;7j$s&h\j7u@`=9Ge4XulFO9=?8t_rKk#GXf
*E:d4$"PG0OPq&,Gurku)\*0bfH_#).5$1E_lS/1d(uc*QTte8gg.o><-H"hk`!6Z's61'-@p!i638$R
X@+Q\V74Xsg=]sd3DXFG/*,esl_$#aj_=D7rT0C=HujDmBbb^A/l+R=Y2VS2+KUFi1e5j?$l`![0ACT?
G0h/no!D#OlTD:9*)Ga$eT\"_[*sNlC#UqsUH:M4CX>60j_8@6&uhKc%C<FAo/&hNdt":MfZKi"1>3+R
[5^rD]ui.@f'-+;mIIW:pZU"nWBD+po<l.l%AV80o!J#d;*HX/1MiQfitliJ9W&tRn&s2*]?]'(p%16t
s5iQjnE"`,c"gS/V&^GEJeej%r=.#J2:pAp^=jI?E6[L;.P;4nm`77%_kANdb5M3tK2^Foml3.je$F5K
.PqsZp\D]I>Q0BGp[nAF%aDtt1m`hq*Nkm%3O@8#k&Trbo?k.p6,k_tHrol3RYt\5\bN;kP%P@;C+ZfN
f<tG86)`]I_%XdJ6Mpq`U4<&1c8#@7G;DVi%UE`AF:-ED[#Q,Uq!pY>ANTI@3\>jONpdMX_#s_H*oX'l
ncAX*+7%>/>;4Fp5#D-oHMu--rpVk$qF;(o0p%!Is12-71m%0)s$#r8n(!u<@K!kCNN\T(iP.Ous1&C6
g``VVU3(MSp1GKBY@@%Fn]Lt5aR48"=9l?!NpEO.oGp/VTga`o3/4$dWqR@!TYaO0;u^"YFC7eEnc2of
+tcBo*r4QN13-\$M<F*8THkPDJN%\1NdhCsfc?dsmi<*,>6k)t,FT@G&tqfP%EOK)GU1$n"qXD*`99+E
!<)I^7s_oD#U?>_r9?<'S]PE'E7,N]JAF2cB5q#NP4M<1IZE;i8!@h=QsE4ncG`CW*59_eVp5"XcMG@=
Uf,hg[ed6Dg5MfjQ1.Z-kN5F\`]WWs?fK9@E>J(2D`o!Heb$C;YX5TUNid*[Qh0q7V8""$Nq>W&L5kuB
GVG]S)hsMWGc3VmWqfKeEW!riUXRoH9aBL;[b>^\$*$,nZo#tFO7s_Rpu4s.kK$P37[Q#:Smt>F;[VhN
<ZP%#EZEuKNhp`CDb&*m$6E0X).n-3V$6!47'AZ2G0SPiCusX=F?b`i8u_#WihHc$:#M\<'q&]Jpr]h9
r`1++\WGf`##>cMJjF5']l<&$4EM5+Ga@',r,qOtZ[+>7%6,oVBTelXcC7N?'Fc'f;iT?a'0;S(ND=Z#
N\`?/"+1Sjp7:n31Y&hg2r<>7bgYNm:cZ3Zf:r>rf[ZmT[4hOM/E9$Ka4^X$Nin5bY.](a"V4er.u%lA
I$Pc;S;aDP3A*EoiP:tZN&ICV,6AF+]1.4UDOI*c:Vfo4CRr#%7h0+Y':,9JTag9<lI!Uj\/q?.Tas:L
k\Hc8]$uL&aed2t])<<hA+af6(c4Vu:*3m11`1b0!iI?7b'&/5TkEeX;2B69<T.1O.[u\nZ^ePZ*@@,j
!RKoB#l6ZUm4ubY9mRg8>@E;>=t:+64W>+^R;um`-1E<3obK^=Gbj\PJ#sI_Pc3Um04Y$H0qjX5-Sc[3
k9qGDbhkL2RNp,:;TE5eJoQ#mhKBCF#F/0GQogli75FpeT!uT4Yi?:B%Q\l!%`+D73BmXJNQVgJL>iaq
m"aNjHCA&[#X2b?j`(RG>h:q<T@lme%`*eD`Z^_)lbE`7*e/D?XtV'DHO.WR5#4BG++uG6*J+a>+di%5
a?+h0iT>^Clu<=!gjF:hXcORh*eN^RW:O'2mcB43?`V3jpj?eOHO)g]A#I9hfWZH/@K,P3bT3VYETiZb
Vr-&pRGbi-q9Gms-`.d7+ZRpZk/T.m(aO[X#Q:<&Bs6P_h[]WC0-/T$GRFW`hR)=AM!stt`ABQuF^(oi
k.-=BMBDL3cQ6!6lp2k3+F;=>3WD(]+#5-Jg^fllE!gQnQU:lbl6EjZR2RlCA/RC>;?)ii$L"mS'lEH6
m-*rVe]\RL>k*At-7/[PrXOlL-V9D[on<\tnNbqA_n]>hQod#5:C2W@R%Xc%1dJ/so-iH*hr&ihAtWS+
:bt/d;j*gSfT]ka(<k/^%M(VAW!5!ghehCG8G"Bcf%":==>4j+M[l(e)@s&tbmrHLCGf33Yg*nDCii9%
N/,`^25^%<HlWH`#,dEm=7H51ShQs%Pbmo$H(EJYL!S%1ZO44c7F2/4/912\j6EZmI>*gkHC/BA01i]C
g=n2-rae<%L\0Y&/+I5hEE;=l/H4Y('21E<aogPp8[li(%US!83U-]ZRYD?&JH?nfkmT`8'6b8]+&rdV
nbuD(jYW]a^i3e2,Bc%NcU,k<]Y@t,b2rR,(V-N\qtm*4e9J_QkP^-ppZ%UR47>CIc>e.0q.eU+H2j!%
d(&t'957ei5G1@K4sS>5IH:>/$X,1O+#$9!kP`;Xg#W*dK(fAjJ?)g9]qC5RJY?Zomm"L;UW'b?!7B??
q[`CA#?oGa9)et]pU.TF+/:Lfo)=1\P:uA`C`FGTVm2WE*OCsljo#96YhQ11MZ<8/48eYq;Z?KtgbMV4
B9%*CKE60'nu4<n*aH\?EGucWG*E$WOW-OpLV[sM*P/[t36k7lr&YAjk^Xhj?N[7cqu!=?ooAM8o_^c\
"/o]I5S'<c\YM9-Aud@@2HFJlC0`:#!>OFVeNu<jA)FilX_E4HFEC@HiGO'L)m%Ua+cFHt*#C.S66$nf
G)U2$;#H>l8;,4Cn+])=`Mqnrh;-M_q!t-Y0:HQq5?mXM++ErCJ#AS$/Dtu1nA#`]QMX/4fH1H$]$W.O
?bGD`/LKdfO"ss,cO\YMr`G6<hL^<]pOV$?g?Ws3o7t'qX`UB)H,Jr4R/Gk?SO9f99Q^3aSa*2*I%U90
JNnX&"Sk*[^UKm+Q1[6:G@IlW(lA3d-JF$gma'[^'`H3Cq_&WM^J)$71=?*E7/JVNmCu?%s"`"$b=)7-
9+u/g;UR5=2ngY<L;)](1i.k#DAHr2OQ+mJ^pqB/d]gPu&oi`PA#L8l$1f@OTuC=VNn@!l-YrJ/9>%gU
U&,t6;oE":(H2O)4WN9f0<P6dHYN6mn[D*(G=I7h8PN+^M.*eLgs<F&q1)$A#G&UNeAN*uU&#uL4/Ce[
((om"-_`iOL,/td:0GmE0@B&N.:_HV:=!iF3Bb"_ZdlZI?C:E>S([9"M[lk3CXkI:H@Nhn=bnG'5$["^
hN60+bY]TcbO?B^/WcZr<C7Eh0Mn1r6`12,mni!WkMU<ZDAGF0:]IS+)BeY)hs4^$9JBM%!A]f6NHb&:
gtE:af$BBE@Hcof:TWJj#Y3PYcIS'CQ5$.rno3rc_>n9u%$8>DJ;!'J_Z1",q1H!o]Q.u"dj)el)XjEJ
ZT\eZ7kkpufa\o`3#g(no>0)iDEBhI)=-&XR@SDe5n3V*fhS0`=V5oOi,"r]\'DT\+*W$M2AlEo`11<p
UiFi`BkqiO>G#`A#091GlSUp7?SeF$!dPSoLYA#5[LQRrU<M$J<rA;fhk:&`;1;:CjPc"Cn7_IoR!pgK
r9.3HJQZ!J3[\\]K"'0J%P]t9[,^[Zi%<X+?]n@bHgAQ]19d[eU2X5-7lN=H7aLbS-&5sL]lfb]1F#U!
#!<g(cae#;:ma5#ASa:d.L$g&-JgR=O,.g?W:`EJR$VH$B=oqn/rZo&(T<_]d:QJ[a5jD$@C@nVrp71<
(o!]`M`JdC]Q:e'pX=eP]<f8B?g@fXQjO-14Yl1AhL#+2QD767%K+g^O6#Q[/H]W,ZF#n:PHs4@@B=aB
ipGsYG]@'&cjM:9la.XW@)AUk9j1K0iK0$QE\_EdZnRE[AZk3t1pFu7+$<W+p&tDm'Lif96(ND=U@8\"
1eBJ1Is*mY0acf77,]'pc9CQ0L6(;L_Ol94Vdu1F11V5U5B.+!2[]TCcMRr;i?)$?`7`I'N@1Ii%k`h/
=)4\ZfCQd7D`81X]B-l*d@B9]f/u3UDn:4>dCf"0mn.i[]2mpm@u?hc&e?q+&dqI8^amkFD(DmHO_H>N
T`%8B`'GLK>7![%&r'mqkKUE"D`Ce7YcS%S2'X2P@8jSG&dru;OUlHYI,s(R%G;fu&/.1sXqT-KYnEM7
]+W<IVL9a+qY/'dTE-j\1g]dA'6[3afb(-K_fI3Xg?I0HBtSD>HfRPq6h<2++]dWlQo'!Idb(cqj4-gU
;Au2%VS')h?9"iO5/c\_8`B/#rCnSKo6GN!Sj_n4D;(g7N>J*>m7QCB=k-aqA!UkNBl#2n0lVD/hdtU3
Jbt=PLssCjZa`c&7dX7q06"G:#L*tY&AD1H)WOJ#?>4eYJ)k'e3B!:O^9q^G/5AEQHfRO6/6t]HSc3O,
ji_l;jc/<pK9mL:*P2\BJaYRA0OgSgm,20Kce';p%CV_;K/[>cI^C`!*dQ$jBJ[lKc5DAsS8n&ZY2_ME
D][m2g5YD4kDW\\^[ft@3sel#rJu#SiVu3!efV6ps&fi65O:Qp+qq9BONC\5iB6Xsj':e/q=<_+EBK:B
H#Xf$,8D="oY1:%fCaISBEiNS_1t]gpt6Y>_-gBhs'80Mo60s\i#0Bb%Y`C*$q:R6#J1RtE<pX!@Tid-
4E*SV*uJhRn;t!>Qnc7X<??B4PQ?U'Om`V=pZR0<lp:UPCl%I4-Xn#P,1uJtZ/b0rKRD+``UdpuhMS7d
K8+iS*93$?/q.H5(&SGH/Jel+`Uk]9D"m9peNCV,e+GYY6TrfW]9E*Hp"eVU*r9nU/%n,F,<-kn42S=:
2=bVOr$N`Pk\&,od2t<>2&q$t)>H-M<hcDVJ*Aq.Q]s[7FUXLOV9_LJ_LtH$&'"t9U//Xt5!:Lq/Q[pQ
NUO78k`anposQV]"DD>?U,MkhJ=EZ>B.LV"R+Zf5RIt"7)Etg'Dpk(0X#c.WNq?E02^39u)u&/+%r(4J
mA823+X?EL_u6p&>rZV3\:Y?U`/uF@QL$]X<ai6JShCr1Mu#7NWW1ahelq^2N/dr/QcO[;ZW6Tr['Kj%
)A!_P,.O1#a&@EAqX/N;F4"oAdOu3HpdE$?@sBr7oAD_GbqV%JbhBFH-80ot_tjN)%dGEL6rc%n[Bc'F
j<3P=VlK4$,/[HOT<R5D'+KG7g(%%s'.".cMJ,+44UlCi\hu.W?!d7-]`e]HoZO;\iKVR(pXBf3g+e/V
<afC@J<qZIg:+Si@g$eKa7H[m5MKVZIXQZ7It3_2hXPkUq8\o9AGmAVDLG!=\,W:D6n!(PI$Xr#&bCP_
RdYV<Cp\IlL\<<L;Qu:"(Xp,"QZ(8H71BI"eQT_0;?'I`!lp:b!-6a46dpD([:+@AZSCL<s6'Q46.dEM
rT1@RT,\e.ZaVRS2Q6=60b;D"!9jQ]+#J'.ll7iNak-]U]'[1hD&'X\idp?^*8Db];k'3"547E$I5Kg%
etlY9=[L0\$MG7_,JKuPeq^A6&,^Q)"]-ocMD6`4)(-FJXes2F[W_%KqrRE2r,R'\hQMj.1/$#^hsmO*
s$ae>gc)a?i4jNWH<tM,r_CQc'JR&/\(E0dP"QHa1O0_fjcr%^GuZ7J>U#HlCF"1*VBh#+:/S(Q(#4l;
+g9%Q>`l[NZZV#8EocfV@`U(4Bnj8]L`2)mX"l)\>[F-(L*9VjF&(I2aQ1kR_eTXhjU-959W)iT"W-k@
Gua;3.dBr'09$^XhJM(!j;"2nq&uq<e=o1gQ"-.^"im$m=*SdW.*d<ka=GKRQ"FuiViXsr8R>\]]uZ?Q
+g253k`o4#iUN"2kYhq9<MX/o]Rl'Q53*G`fI>l]fe*LPOY.ROXQ_^qlM?QiAN]$RYrsX`<Mm6gih-*6
Q#O<V&N^MrZrbhIn2sN^EDC*.JH?'c8<@2sWVd2'+2?_T$d?1b=5q`*]b.c;B>lJmEO#/SB1'C*Uq/#>
&_4`(3Q&[)i#8]3_,\'j6&(,m"1tLCm9S+M/)k;=Z-49!Xj(u:80p[d)c^m%2GOlF,+^r<8@1Y>^7h^9
7:6`I:sp6HYT1<b9>_Q7[\hVE3^On/e[^ge;'$>dDSj$BbXKo4d>.A@U-E-o1ln/0Ips884hn1t>;sf+
B]]#0H[/iGhR:u^l@qb-U,,*a7c\o6E^W:\E=RFP+sN"[YM3e1=+(qur3`83PZOdog+[ng_5QT=#Al$6
0r'^K)YI7\StrVND=m1AKrl5Of4h!Yh70fmBAs3NkXB,Dd=rmD%EG1Pr3?NDoV1k8D=m1-<m\kNiEiec
*RXa[g=VIm01WT,D:gthC'm1>_k%.f=FL`+D/;FZEV6eV-.@4/0BFm3,A=uWdtVA[#(ARAomK4o)dAKU
BOcl_lcY):D045FST?fGobVE$S+b,-!LDS2c\OSABS`!6djhuomF4Dk>LOQBj_56.#)VRmIr*M!@!f>>
j)DD#_R$J@^-eoPp[KV-'ga0K+0P''&g(B@D=-?\M1N=Q8aG;95(<])9g&-aZVP;9a5_eq?VW8gR[PJo
$&J]>\gR["Y=gg&1s*a6qNf]@^"D&BAAA_OeTB";4HOUf4^2e'A:)mPXj&P6VJ5KnBdCq[Tg&GIOL`EX
k_?SZGLQm=9=&6!>k@EO7Vsufhp+`AgH,1$XctER`GmJ\4[8J'j08I7oC)IH@\s"oqtBccPc_qCP@mYK
/2#Nc75IA2jC8Yq8B=0:mW;=![J#]4K4TmpA/*@[/5n+&L%Ie:IYf_CFHN+S"*;NSQ_M6lpDP,Wc2*Nt
]-:es@;D`KAG3LaT5j#3BPP,\;`p"O:5lfR'N#e-d]OmOj".0"Bj>1]:1E`H;JK.Xed(UqU!I46Aq*1U
W]JteWEN=.?)tGW8[_L(N4"O!-bgqk`\Suk9hAi-cG2P&Er9pW`9aki82Ftk*F$-s=oS!f*I\kp[iUiE
a0&(D-L(>dmr!$e^3mX\q#3Tmieqpd&I)E*$YW1[8mn9I'\ed(86Pe786rY/e5[f`U&r>621uo?7Ngh%
1=>;.>sq&aSfP*h+>NYa,5iHPX3aupV3Qkj[\(]@AUdF$BLj_GDTcb5k-OAQ`FI1HN]p7Z)L[Hc]K6E7
+g\:K;aF4'HFNblIE,+bWO2P`^]b+i?^`!Il+PNeo\R#&of-d[BPZH9nBdIPH\elgZQWTlaZ$'&+S5CO
Zap]rhQ[`X2L9Ktp)Iap?&VC/R#Q!tQ$:I8q1b$&2[rf56YKGBgd]_;K'GXS1`XfO0IMT(N);MbKcL2:
_fBGJB-iu'l3R()ML,oe>%PV4OVt)).BRkphs3k9;n=C@qkA>d0P29=PTDnB&a-moXN^-H2F.59pdt=<
C*9hbC[TM^QEY,/1"2@$%j!`ogT7t_&Rl.jk%Pb>)4\ZWB>&U'ntk_V_[)Jp:n,jbI7:bL2$XA-NI7WK
J?6<lK`9SG2'gId^TEbOQ]M]+:ih%V1hi<lPr[D6FD(3@<_,Eudr;+*:%br,c$uJK)s0LZZ@N!g8YK*C
3jZNLr'Wp@%1Lp?OmC5EI>qKGTiUNn9mGmTAbp^RIn_064tko#IG.f$r$&4jf6mTtTe<<!I@cbg.:]Gb
1u,K>L5+*k`Ck-TSHCK%RX5QhGBu2pKR19Q47]phaUr1:$Fj\'PNH,=a\3VFFH9k.8(UGSo(*)jVq]4b
R>g(*dS.Z")ZV].jSnH2`>()fRYbNg-MXF_:JL:8hC6][KUiO?aY<%oFH7T9/Mn,qO[UcUB?bq5M3^_M
;Z+bu_U;+iQIM%/ilF!@Mku7QA8o1j5OgZ*d<q_94\"YqdS+81GuLnoV<tl]Y*k4tmu2$/1J,?%c,?mZ
$]P,N*eRNX>g7pFHae./9WhRRq]4'YFe)NYKk%GV[+R:uGAMGZ2S8EDPh%gM\gT-@D%;!Klk7+?4^6a:
<JfM'f^7?D>qDsIk&C>4dN&51`IHY%/H3aTc$ETZP)1'l0<P9!oFAoCdmA:\Ia6$!*/YV9c<#[#E]KC%
B>;TI-)W?dTg,,Uj5l1)I<t>;AREg@AIq`*c@\`Z0i%c#drWm%ftb">4T`LpmV9%PC@<>fipL)B^3:T5
n)B[Xn#kgFVnJ!rV%e9C@84!g&]YKT.m,o4eZ<o(-O5"M,<1)>Sp<'TMS4pNg9GiBq;/eeHhI$1bZES'
m+jO0+k,ja1]4?/qRH"N?->D(h7ictG?9:\<NVkGg9l,FCBq![*p]ZUM7opWguYtfEAm^Uo/lm@c;"bA
<6%aJ]4fFWf_=edm_d#h5]fLuQlAB"_S1DDL-Vp@Cit5W-!KQ<G9-S;`R?:00&D!M0&f8?Q8A6/h:A=,
U%YY`htO;6J"FpF0<im5I16S`LTi<P`GP6_8U/;M#QFq5a.M,"^MEWnZ4eGmS0orJL0?jlqO,(l_ui-<
E%=i?O7LL=7$L9!/%'1<,a'3R')!8;arf+`aqkdb\$I[!0GU^.aM2MSXdf'3bT$m+Q_IVk7(FYXM3Pu@
>'rba(.CZni5)dbD=gp/1l[f2Mm9<6=8br"#JtJ1EV.B\#M/*cZt$algB)P@RH"5T\^Zr\Mi73d)gta*
MkP36SDrJDck(&k(h]D%CWcCsT.gMNr)@+'(&W7<F%r5r\4!sK2jGW;G_Ui0&N-U:Efi&E,H$S,HXt_o
oQqJPoW]@4r2S36K/SDA.@r#277$I(mJ4dA3XQeMqh@a<qSbP)kOf%MR$:56M`<T?:8,?n-)I%]41YNj
lNC=hN^rF1d+pRUG$9(#jTua0bc.ZV&ts!J;df`n8JAtWCtl9IEDT8kAWH<XX]F,_Qj(1oW,<Vd0&JQk
gd"`9[?K8YX!:co9"M.sQQWI8Vj#95)2,UIfr8(<"'ui,'2im`c>mqn1JkJlKs`P?]p2YmSW'Q,kbDkp
N$4[_,,N=^f#Rc'h&je<maamn'.?mOJ6tW\>Xp9>m&D<"QfEc^&WN0%^J'W$C)7Fq24;QoX^E1DQd>-A
P*@&qpri3(<@27*_oO8XWr>cf4B+_=e/S'+X:3CqN@"frZJ<ZH>K7!7a=!br2jS>O<.0lme#54a.$eBU
iiO`-JWi)tKf&l>a*tmLf(t+[16V@M#j<c'jg)LT)UYdJPiC7@7d4jXUW+,tADGY2eMK3QT<q0FCXH<_
QLH9F-K-JF[uD\8EBHYj5'R'TK[Y/(0B1Pl=2IGKkjQN8DqZoq3N?n4ag1A[I^c5;0N)FsZs"l`;PrHp
/=QOjWa(&1b0WQtaG/-L<2DjjR#N_6(/e=*TZff%4Y)I:'Y]DP_+F]3-ohHo8nD)jWf]'Coj9[EkA8Y#
c_5c_jTlg"](M@KQ_d`c_:U<]\"T]CB<,pZFY[0rRr*AFTZ9h)ae`$`E2/\,1_>Qn%+pL!:hhH`#gY1\
Z^.W;#U<YYRV/OTAkFiMc(LP_6k$CM)m[#A[hZ;8n>=>G2q4a#.?8U1HYaptUR2)6R3h9Ip2t!0p:uA5
egG!GCp\7Ob4gSFWCu\J/Hr7fV/6F^:UF0UccP?')E$9UWf?&@\n-GH)nTl_.J^X@Q6qiB?k5b(r6'O3
YNguP]K9YOW;;@BQ^:_659'NSgc`[33t5(Ee5*M&>8('c3Pp(YHaYXj0%%/\3p#"<lo`[fJ&NS%S,A`E
=6Fo"j*;opr!(49m.j`,qEduZRQNk4Z.nGsC/"D?QgFItjh(T+YNn#k:stj?#9Up'`E,WJ$>&tbJ$+cI
3n:_BB`8fbU.lA3T]a-4):-b9qH.N:gb8,K-!@^/XWguSBLq5X]Ac!4dT<J!DH,g(L@WA?mu?@DXf<u%
B9'126,'E2beI;W-atVd#>=dI=WEk.1cbPUHmI38qh]AGZDo_L8NU1Cft77hH"43.>C5a8\o$DR1uA`s
pmZ[ZM;P.IG39b`NAg%si,=66GL9U5Ki0#`-]l42PVt=t,i.+CWV2I>.gTJFLgu]5Qp++hc@6!M9RWWe
=_7G5$Oa2#foks5<Mp6r'Hkqp1>Xs'q>aOfD;PpoU$=;5e<`+]D>DU]I<(dMLioW>-f$g0e&'2KT>(FT
0.]5CSQVu&rD7$h0^\?Z,$RJ"8XXoM.%M)KFqUY#'#V*LMajlCXRLgXL*&g]WZjK$^3O:MZ[3#dX5/l7
MXPBXUs`bF>CX=dqm8&:qfV7oNF=VY)Pcf`?=Ol_^>Q%HN[4u`N=jarHDtlDN,WKQ;KMBZ8[#C7N0>u<
=(@b')Pf40ad?Vj(`g0,.""&09TKj)i2\R>]>b,@6=Y[cH9=#R<5'oW0ol4Z&SWP`%up,'`?)LR?<c"u
2/cQ+'RjeUZ[O;E(g>BAa(N"A]30uVhfjHL@a^J*.l#(7^"Ui/5Q.i"Zk#R*S\t&p4eLHk7'<D!@"0l&
]^S<BHh')?@b,,cA%Ffb<C@_q#f!0P!7s*f/!=FdZ@V+_C7hM]%gd8QHLC8_9QmDCJ#IZ*94s__4CmH9
S[b-^q:?]s1I(H5Eb=PsFWNFUKk3#].T>fMD1:h%@F8`=!ee#I.'YD/NJP/^L[Pbggb.c,7#!NB<J"$t
D>ZBFeeeu#9u8BL?[&L=h3G%RmS`!kFm0^o-6[bR&Gj@-IbH%_*NRd=Z'O\dfGUoAht;V-GWaPq^$'XD
$]hM`^_/aO2MouFm?UIU24JU>,RfB$6J-,fMpZ]cPCUo*4DYXgk>eu_+Si[*eR:0Zj4Yd0E^%KD<onFm
`:Ek82Mjm&UY@%J9.Ofk6J!Qh[cunnR?ljLT6Snj8M!:tRakh<?ON@A=seUHWjj=\8_@30C_BFFJ(Q%)
#:L+PKWnYr(?6t%lEHX_E,?6WdcB0:5?R^7Ieio%m/"jA$U'":=dcXI7-H&j%jWX1q:aNA9Kdl`c^UME
..hoGX&gO`olo'_Ld1osYF`LskAp6CiQ(Oa[Y/iEhm;KQn^[4?S"@B[-YRl3q6^+:Ksi29]sT;(=F*0F
Rih4YE(I_qNQq*CjL&;hqQ`"/5gPPEf]BoJa"H9HUH[7H4l1lG/#pm!kL9"3a+s(lZsCDXiombm%sh>!
%E0q9p0GDEm,Ha\RfQW8QgZ(8XBiR)j7[o6;82%pb;ZP]d7PpIm;e/TEo2%#n7]PZ3D81P\Y7[;(]+Pu
&)Da"Ge+ZF?+uT'AG^V`mDjDGh@IdShL$o9^/g;#^;m;9ERTtuGIasH<K+]552M4u\@[,Er\I`5/;<f@
nRd&/'(<g1BK10*:JLEK'o2JabUXm9^%=]!B_i%^Ib8[e)R)Orl]>CmURWi2"Xi3(%ssW=>Y;)kb26+b
ij)n)H2/NKar1^,c!I4#g-2UP-n1hRN(BN1e&V'A\::+Ec>!kppQu[G\DAk86b(&#([q-kj1Y>fFRS[D
n!M:h0!-!$h8M.n+1Opa->$:6]J7paOZ?\1XXhO$8PCmlR2C-/-i->pA&[31%@Nd&0MF6+XfP(G5[""3
k`4(Zca)P:"eS,1Z79@]]`VhPF8bppia"WMmAB`ZYB3dZdf&)/X);(^b1:I8$U*tXHMW^pD0O#Qc(%P8
mchVBC1-24b7@]3Du+<ND?K$`S13jA<^p`+PiY=^7\aU=L@-%b@_<:OUqCYI"^P[glb.]8mbkDO<d.s,
H-87j<H3@)O5[9(6F^g.O&5L%`HV*kknn(d<S=c;A,V_KZh9b%\ejWb"47VrlT<\Z1P$5;Q-=,!mT!e'
Knn"%qY9P?,+j:m-UePC<q9Rl4OZ5/g_6'QATCSi2E1V;P^F,!Z`sH$ZaCS3Sjaf_G>uGq4o*k#gsb+r
r"3;l&+7PGUt^dtjN]ojs1pi-5I`)Hc"jppA')m6'.sX>#1YLk^3lj\gsDCo,./#jM%&Zc<^M$k*$l@C
f!DI%7-g3<'(/c^Go+S[\Q#[L?fa9c[K6*#hg'&-aZa=)^85K`3]#DAblSmRSYA4C.[+8e,OcZrY1^0p
<Ninh4f^Vhn?4Y6hXj.:hD!ap2Ga#ph&1Ucn#+KV=IO_Z"?k&L7HI3^o#:S#L2O2NiQ53u;@ehEbtM5-
0lM?n<nILV]:R^U7$#k1c7JG,?d@E$B7E.JL;JC-FYM/@\Vp$-Z-4;UY6Z^`_j&iG?eT3cHsk-5M<BXV
\'[BN_[>1)o1o;!Vj@tP@jTheQ/,IT48d_7\FI'nG!V7MgXZqT]9djVJTPU$[`nAT-OP,2rFpNhq5+pK
=ih=d/qJ@t[`XU<0-W02<GPiG6t#g.\A,'@*trG->99bh&MJlUM/V\I7Dr8,*FE,@oPfiV7:^$,E%`D*
2r0C*.(k@eksY`LDFlK*1W91`+u8Jr],-T:%:,0GH<Ai\'BQZ7=UjR`"B'YCGnH14Xf@!D+rUqE,3NFG
(QiVG59[eR++'k=*8Xm1;T1h5hgs"0(mnVtY4HTc,1jA10-]mjf8GGKOn[3e!MjcF]SPd$0%Z$&%.rXf
6m-)Go#u9>]SMS@[+b<jR@3a`pEHmRah<M#Qf(fGqr-#0eB>`ZKfo'PlcdtY<O#M7hY=::;d[^bosgs;
'k#0PS6(:-o^aP/$EKC95Hc!6o.#5-<iNq;h"SI=YL]pM1!;e_;F'PVPq)HPRUsKf=J^Pf_^^@c8R[nD
/;7*H:n1UD+''i_WJjp&(e:0!dAn71Vd`e\IU337O&kNlG$ajL]'!(RraD)/oD)g[12Nj`N^$:;kf8'Q
V=6,6'<IIADrR,0mjNfORt'+%L%+3[NJSJ?phF'9.&'-KQa61Q0/O@IHuP(b]Z!D,kb3"(VC3A7\:h'*
V()YOETt`N;^"IRCrfWrT\e7o#VBaqlMoDEK`<La<R49kl/E<"C%qmR(;h3;q1dr*ImU*uT@gWf+(raO
26,&_VCkQM1Al97L[+fQW'/F.74N3!r<HM[a<DE^Zl><cWf1s<.MRT;86%UhOJ4+$]<0<,jt@IolL1S*
7hoBgA\8bC4AZcD5V,C"B8L+\qe^^B`n-iMC+H&f(]2%Ye-2tAV33r%1hRPV;Of2gk<Z=!(.O&rZFSVs
Q'hYA9?@H8IAJHWZtaKGR1q0IOBtHU_nF#HWt5jq9X7bq*Y\t0MA3Z/7e[A@H2#:*AgfU+olP_M%MnQG
<CW8n;Uf6L[hX+4&pXmsetI^;@9e+%jVkk13]/!1d1rU\.Rmg#kOY$DDhL7)U%'[Fqu\=oL.)q[bqh/L
S!UlfS.nGVDCbC+/!Uk@Ya",8=S&I.=*oPlRXXdD`JS._buF;lj3.,WD(N.1XX_TVRF6i$dBd>sJoe$d
YSH)PWin[!OV)N.AV+^.mYF\6<j^7fj2(LHrJHW5m:OjM;(iN,X9pIA>:lmW5*mi]72JC[%\]]>etP$!
>_QWt\RQATC.7(u`u7D)Z:EMid6^`+3VPT#/E+9BUX^*uLh%6;A*k4X?`1o02&B#gXf29Nb"+5cZM]Z,
?u"t>bY)E>f9`eVbBL%5r-HX>6SO#[CUR!Z2WanRrdOL@]mMDGJ#g!F%mMVRMh\5k"_Jqrf0JYUI&!!-
Em?In<P^(eMs+hpGM\T<Ar1H\Mq_6C\8N,%UD"UbdepN#_UPnX$WGPmXYQ2SQJu<O[()pNM@OW6AQQ8O
*49*0/RR*!@/,!dg=m#MLp(pD>\U8_<`DQsrN.P=<u&F6,le\9]A^R[r,j_-AKI5_O88WrI@>0S=?UuT
UXck<NGBNG9J'u2G_jJK<Aac6:KG2,A#<.#.'CC4d]^fn=DL^lV@92.?G)[F4>(^?4&+$RisOnBG4Y0h
p1>Od3u1mrKc[C_+s_LX`H:hQC`W2*B(^;tZcf-hob.9V9n/+N%8P1#b9sLX.U@+"e$tY<Ug'bX.IK7*
;=[]^`7/XHX#'rjbbO/pEQm,?=o;rP4dXl+ZINj@GD>+oM\,]F+jZOjGc6LOBbF(bRRSOJ?CU541n;QA
$-+;`.*^0&mB<q;50\sE^116oC6qoV`gJm\o9d^UTD;g\<IB*qDDa$KRa/qk=Y&?]h#*)15?j=E,/s<M
r#>!KLHkg!C&V.t/,*kgRM(Y@q4XCpj7lr%0)LO(Wr5%6Ujk=/<Us9MT!%]To^71:0$Oaa1[5,1a6GWB
fmouud;i6gDnWLW>T6,@'la?l:JiEoU$&Nj_7hZ@nTa0+93>+AhAoRI?.+_A/>LI-gesCZq@nXgL0#MH
.0DM/ka:?1NBL/B0.!oIq9jVT5M3I=&d(m38"hn?N8WL#22d5)jlRMkW2;k>U:k(P!LS.'m;ZC\]co`3
4_cLO50Sg'\;TB%?J./_Q;=p0?ULGl*?eU+qhoWs<MpC#-:@[YI\AbgX&kVIYD[+4@>&P,aas:&r?57R
c>h]U>*4:0nf?+Pe(KVspZpi<@8W**oA9!K2c_bBMXq0acAM=N:+4R\:1hBpJ&q_^WZ4g8IP\<&_(njp
DsF2-,AsZA-N'ZpMdt1PD6]QCO_N5&P-_\'%]MDII+cLQWN(tgf'`[/U'Y@_bU2a>XG4c3P1g>uB,m[I
%0:)4Q4MQQ7D$<]Api"OC90BLZVEY7^CF43`QH]m`@tKEl*V.Kd]+)u4&%bJiX11GM,;A#Z)6_.7CDt[
M3p+5VY;I\P$,13Lbr-oiNq'0F@iNLI#mMGT0ED+*VeaLqW<Ch4K4*phlPfF6s<[?YI1Ck?)H#,[+1_V
X8c>KcH=]`9o$![JX"c-1#k9PlV(NI<_^=Yp2&=jX*SrY7*:r7c+[1JB^.5aU;&>Z1so*C$HYV%W;/Pm
42EA/e[/@HOZmni`DN(a47oD8mnW,M)irtMDR-)9[.rA-OjF!+Lq2O!R:O>n%8=(fTQE&mPpD>pG0Kp7
$KgncZ.d*9%7@F2:/QRQa..#JgA)qZ*KDF-jqR!Dm$MB<ES3(5B%?09CtB1?*EI2p0A1n+%dUR'A>72+
`Hn=]G2SOY'!_VG<'tggEnLKkPSJ7RSfZO$!)<"#=$!Ds)DA(9jkt6;]eZ19*H9WQA]J%:0tQ^RfaDId
FuYcj=M,*\V8Gp""d^6N5L-V%o8$bfHq/;-1hO3(3-NP]oiI'6A%*;WTfjf^d2EN7&`[Wd9`E/f%Waj=
\*4,l0q<DR-hTQ5fZ"_WC[uL6`3*<.E*GkHRhicNDQ?p;RX3WB0![XcG-%=^e,2rl>'Xc!:6RC7gU/$[
D7U+!`"sXhlUuR<SNNM$l1mb9`mq!D\*^Q#]o0D>X7u#Ced(TurGqbk.T:)/GDC<7HZttYWP,pUCCN@4
jEoL`p?q?0K5'd(VXa([75aquh,?C>]5pb2l[*h/EA_OfDPpoJjd)KHH^F8TU%`Pm6LP:mH^FN,p[+Z"
HJiu@m[h_S(n8-(j&c0DQEFu)>>h#=pT[c`7PWJlhKPR;:VG)ZG2Q\H3oB;EHKop9#E@=)dI+/eq2Rs"
ep8c&YYeS"eN)Y?[_3']S*sY$"HM-HLaHr!]aNWiZZX:EAL-8Fmfp56$Tqne`ga$DWQ*%SObji9_:GVB
:K%e+s0d+Ra%lK[UDPM"B"q2pL*K6np*K(O^LMcmT+Jm7-hcrrh@9^[\,<=e'c_],<fqt)2X/[$bhB*4
$2BJsf8)TD-,%$$]jK+3oc$S;3\W(1e4*K:n!3O`oUt^LqS`*A^[aQ=>\i/m:-2T=*/8`?<@:,Ca'q>#
]U_.k2clQpK@.N_^P^mdo0=FE3V4l-db+JaXLAo4c*Cs%=0nKpCBS-4i7MMQNM0/)Q8Q[!SXa'eji!a>
]U/;miiA#1WE'#7;%kSjX:S/,V62!3pC;Ijii=t11l90[53M[hApe?QGag:VkF1]t$JkE00-S-Q;=r#8
!]^+ERA!YF1YHZWP4fNj<:Ak6L1596gK3d/etZl-3J,N"GZ)rMI:L-:b#asqO7<\&naNBe^c$Oo&@ft0
Mm"8/*;X/n2ij0MMJuoH"@VX[[Egl_ikDRc[(_C+H.>TA1hB0W51mY#+gtP6)WU!t@pS+63p?\nN>Ii(
b6)7&2sYA"qI2:^hq"P$:6o\bH*E\>m`Xcj2n@TT>o$YV@BHOt#N*4(?#W`sbM0s^]Tnb4q5/=4<Fr8I
\dE7Pc<q]U>dpbG4T!r>[TBSrEg:G9(m.hg`s?@-]c>HT9g$!%XN]S[bE;--Fo*-qFrkA4pkJUW7hYQE
qr$,kOg2gk42-+k.eCr.di7LMX_,XLbR_*=`f3g$?4&q#n4L0TH=p5l'L[U5iuEr`D5*?!Hbrn>$oA9s
M^)ta(5FN4'MZ;0h*pe7icN)ud+<5#BQn?&cCo-QWFqFNQ]uakN7Oi]/d#nC>.sj]4Yk[b:Qeq$G3uMW
&N?qcS`3pDOjD%>*glh2l;KI@.5`bQc1g^ScY+#N<pHL9TCuQaAG6q:/fD[HLK:Tsa'TYS8j\PFdK[b.
1e!K$_kP&j"JQVI>2N[N^S<d>Wd^Bn204`*!].iJMK3lS\oi@a@3-h=EuCSkIOs-Vg\IDu"H(E/q6i3K
m\.N8X2a]nEAs90Q^R08Tre/[h<u=>C^6U_WNi7r:2s*g=f*3olT;6K`"k=p76+B9XmC/Z4I3U;I^`p$
$8mf*9<Mic[5^#s*=l&hJ+i+M4a9Lj\$bHNG,Xg-9@9g"^56uRS7)U^IVCFAVp'tT<$MQqc7=7dPSpUB
IsI(ZPf2%j@sFFM?h<@HKVVc:2BMS&g7;6S\Q38db1^8qVOT+FXEn.K&9m*<\4`l;EnVGsG3@Gqf%NQL
c+YCu=\_a[;TqfB`rE([jrV04GF"5DHuSH-ghrk_Nd6&1h-nmLj&T^:8*'AI^VSH=.C83p0iQ3e4l[lm
prWe/2iZu+%%BXp'Q<s[2XRE@)PCe/Ll390.(!UVGc0G&T(H6Fdk?Y&Q1fF7V^Tiu9(s.H<Q7Ya=!,Lm
<t3o_(tY7,K<&b/#*p,E^!c=#l;a"uPru)%AC&\[L3A0.ch>l\.-;,/1Sa]]B]ntf`Rb4LQ&s)%/)b_t
YICmB5pK<6iZ"W93aIN+e?2.Ye6;5Z`T#7#6(Oa"8\s-"#B`7gmYN'Ig_VhT'uLA7_(S6ZN6CX`]r\7%
N,#eB:LOd_A*p0hSj=5erO:@[rj#">b_'s]_kHOTjaG%]R9BA)1p]bl6roO1B2BKea,dD5a[g1fXtR52
;6sJM*6Y!QR;M81>nQ"L1ud))lZW7#3F\lC.8#s^D7+4LnGmXTBJTK0B!5>[^`n-+Y'_^FN?L^F%d=AP
8hY/6`>4#ZDA!61AHBbgQY;I8_o'#0oV^7d6`-Sed#5JRCR'&d")b0.WF9o!ln$M+6^YuWk'+0A8I9)H
(T3'Ak3ah4/PY#6GU0ScR?QIbG%n1'SU?q3I5KM9r+*M`ZfG*EfXYHq3]"N\)T3\aB5F4Z'ZuoGKG:uR
9S4Q7`g=+F_J7d=IpHGSl3FjWe)<qUm>e.]]Q:58ZKUb&>H@Of9\qGpjYs6nb$/,^@I>:9Jn[*p6Z)&]
g*PGQO4c;E`*/XP@l]`WPQ"nT*_qOgk.I7uPXYY>b=0!Fb;%Z]h]rOr#Sm=u*,0Oo]raX`Uhd*)A(BCD
h79j]hsE6M?+3nW.WO'XHdR+W0C">#L5#]Me[,"em[Hg060Z=@qp)!Yil'p!:J;QPh2Tu2Vf6,1aeeLr
]B\+Hqd,k,U2IQOT9sp>\$=L2DP7_BDpjOA`7.L/dtt&J?TVqQNr6iF]5pJ6iLX?4%c"GSEFMi%5X,qT
.c%m99YL6>WMrrDG\O804Y_*UeF&0m2c6KFQlPGIdq`'SL2Q14o93d,ceHT)jnRs/48SNtQsGG.G.u=i
`r(j&S*J2m'soDhP.UX,,lb"APq$o>>,QAD9XO/&;!lqI]9Tr1iaFZ9">Pn3;.]cE/WOp#g9mi_LGjAD
BCrs]U)3UIhU2:L``mNllD^0TiDB&XY'jc_i%C8W:)ZQ!c!$%tp.;1*0HG$J[11U6'Lk9llV;D$3U1dG
U19K!/uhjiPJt1AZ+Gk>V^r8rr+K%m90ZGpAk=e^(3&Z$^Fh-N]m%\I<\X4fV_"L(+$=V3--f\PUd4(a
BGBXK\_906FAdjimTo?=-#R"&QVNtpA5H,>=0^?Ep1OAF88%P#l54E*JWkEhS`UUhI?Cm$a5(X)G"d`'
1pqXkC1E,c%D+-7QrJuEdn([]L=pp`c?cpUAoue"s)ui90ZK;Tl`QHWI8RD4eh5WjPkh-0:SZuc15!:Y
a#kPpOg;GE7lM9G(><3Z.P0V/U8+Tok,W@M#4B:$h:gDC5cr[R)[=%uG/@k(1oXK]UMRaYH<+#fbS&^4
8,XTh]YE%O>^OFMi+;8D%D!UuXr2IEXY],342,m__,Ps*)[sb?AH2X`mi,kbG^"TKk6JcSDTO0=fWKcC
^Y!F(6@cmSdNXsNiM\9H3H2ERT>tt6i[]2Tma&XVmlC641j=@3E'-@kl^k<4^ZWqX@uCBs9K,5a9g3Gh
47C>Jd3mgWe$IRVEJ)>\-/"l\l#M"If(N&%dj[CJYA<b*kB_*pbHA,n]URL3c@iq6X#0`U4TCH?q*3D^
qks2UmsB$@!c\FXr<fW1[,bXiq\ASf)#i236pG(FafFb*#!A0'L1Js`1PQWS=I+)=q((sEZ'@9""1@C@
."R]PWc;:,4GoCe/@rK..F+V$77*XX9X<7RCQ$m02Hl%ca4TXYRC\ou0_jt#7UI.Y+.]0thJ"-XUD>Z2
c%)]F6THPE(N#p3#XrWY0)"rBB>sPm:TIjf?:;NZ8o=?MZZ+;!9[+L`-Ei5Q@JhKSbD_pCj"3#nU9s5k
DS@*:G'^O&ECY77+_lTe$mUpYEAiPA2ne2s>9WK6/3->)GpJ[_`-C>WOo3Bc4^5#saHj;\MH9Fm?aQON
RCC#i=pEI(RmfF4gJT#ZDgL<li>IpC5IPCOU1]0;r\*m8ErCDU%*&eCm(!W[q"l"pSb./Zmk91.41;fU
^X?3*4O0t>?[+)FF%gN=dMM#7`A+-,MnjO.*<Hp:buZtp^\aaAoO'Y6f=K&>n/^7cj7ubm4\&lC;W5"f
%iinc'\5@Sn&=lO\7F\K"f<j`ZNOT6ML2Ri]2\,$/,Ha0D&o?lQ/^IPl`6h<So+G/+b)#Bkjg"FF_C`b
2Y+O-)O^#..5KDFB:sXRQJu0<C,(u2<blD$D7'ekC'ieN0o*YjCpP),^Z&@tm<!!A[9k=$j4`P&fY/0J
^Yl_-L2F?,;^*_i-1V7I/`9s-Xg@e;n[n1k<a],`rc\*P!L;oUs11,V.:&[:+\ugMl;s4sRok_,IU2WJ
r>N2SgT$W]XfU&+.n[t`<:);Bfu[9i`nE)gmPbWGeOoY'a<:F3(;k'5^;.Rdk*s<i%b50tX<@+UbB0"T
Vf]Sqhg.#S^glnJK]Yr:8,DZA\$^PUWRl$ob`->sYq2BAmmIpQm)R6=4=CG:_erd0_(i%Gb0sGiE]Ad=
PQMH-jb2jN-(.V:d.V+=G*>pe1TXQB,Qi-;MFq8[M';dtEp^;Yj"u[-CgUg<4)M`2Qh0+?g]`,nj\h2q
1mbpU$/r=iE[gTO\)Hr1r^tilR5gW-20JF)l;1iHVI3GO&e-a=:F/c:c61L+eYZSF>]eJaPQ"SE'+M,l
B6^nY%$d_?(8G"`K>T1b;7k8'GO_6KlA"Q6c^R-\'R>doR\E%7fKUs:jf.?&%do$-Qh_S:RLJ[lY0#$4
?\/Vf=m&)G3AakHTH3$EQ@ucM'\YBNENsqePS2.X./SkPZ=cmPLpLZH%_Q:c0+Y]Xi&t;A@e1uKgC<_a
>=Q+-g7+*JjSG+4c(Pq%-"u%[/R?Gt=a5Y73hQ6ZLRoP;U#Wpuk(f[d"3[gB[8c7onSBkUrs%V63;<5H
SI8PH;r5@Nq=2hYXK9;A-dOm?`VS%j7oY]PV)55h[d9!R>*Z9j.*=6&4^E<uB!b/L/\G/K2;,?<[$/Y/
C:mA?pE`IT1$!AjYfalb%BH1spL^J:T_HHbK+uN$>l(QpCcT#qV^elUg.!M/;(jl[<]p(Tll5)`7`HK4
gZfB:a,hY"r8,<8ld>CuMPp5*5$t,'(D\`9't!$mIds^]lZUQEO/f<^&UjYDDmhd^^23IGF8U0ckZbM;
Epf*&V`=PFWd2uQPi$8kI""R#UPdNPG!ZYK.*AV,`:AqZ-e7@"Z\G+.=/K/oMQ^6Ll-ijlF0dF4\nPn[
9.[BYQ<HF5Bg:#9)HlC:Hg5PZp&t[sE\*e]LVeV\PAi`keFG>$GRC$AAVr7G;nLA8NN[]b'Xfp_hO&S\
2s3be+$3R/fXhcVMtO[7a[cSS)D13fB?bZA41_\O@'h8Q%g^pU>_^oA@9l-I7kkBWH6/s";,U)qj"h%^
%;aA2Vb]6#H[*[s!^)1AqjTR6XaM^+"\CMJ!;'s,^@jum!',/8c^5N%1f7b9\Suu;he+jR1r_2Plbt`H
Q[X]*aZ<c$q6g.M3&)b^.=KN/dT12&;u0_YLl:C19Z.p@64kXXXjshga,&&gH4<[.jnHMBG1u.@pD@c>
jE_#3Im6[2o#ops,(96p<sk)SF33GE>]VIg0DD-\5hU6&_ndeUHBic19/b(8nPh'UPcgM*.m#1]H./r#
/9+'9ZU:ZE8+J="^ml:U(Pu<ZDqUj;%7_MP%X7C:5tbL1r2rHSH2C%O[9)_mZ4G8M#JW[7K%L>#3nD?S
OH2/#/Xo]:Z>\nhk'9Oi[gRXFP1ScfpF)-uV;^?nICh)i"UDea/AgX1pIoungK!c-S%M=-m5[.8?TpD,
^2!m>l\HGql"A50o1Qu^Po-ORU$Hpa\Y0efgf#SD=-uWGO/J3Ro@N![.O=KA0"4gnTsX<tBs6pn#YrtQ
bb$*eUT^r7SYhjBE]T@*CZaATh=?I1*Q>,k[\@q+cO]Iscen>gA8t-"f"r?n=1(XZoP!oQVDV$lQ_lY,
/25kG455AhD)C*1Up#\0gH5V:]NCC_k3H>/>f,6+=;oVTiW`#%5KN1;41q=l&^\Obg>P^k_KV\bP\sN]
K:D@ls)X&i[anqF8"'gWDQVGaM2GbfTeH3KA*'OsO3ekKQRV&eEWr&d*0Oeg\#-@u;Qebh=bL8!UZus*
gi$9-qB2$D@217k1s/Wd(3ei,f3+9n,jWPWRWEPij-_h_>.[_#Xn<_#Du<qF2[HL^gIE+%o]o"?R8k8]
^Ynud`a:i*m!bM</?X?m8,HAp-Ypcs]iLrDUM^9f`\T3CQ`k^^I_;FJ^WX4Zik2&?NBmpBXBg&%d;N-J
"pYB-ZAc(m.A`f)q'g\i-UK-8e0VG:V8js]-C8FI"]trB40j07JJGu$MMO:7.>^#j][n?8J6C8].K,"1
h!h2+`VuHA%H1He"@R$,j`:b9+PrfT'RPdaiLR<6Ol.c",(s_k.Z.:Pmd*052UNo-P46E&nP?=^b46<N
l+-!kkIXA+5sLHKk,h8K8mO5hCXkl.J(9lDHU?tTk>?k;q!6q@j<N4[jqnp3_)i<niY-l?,Mu_)0#TE8
hpIdWAoB)<eM-F/@:`1p`S3=fc\(p.ZnrkC&AGnm9H/IhhTBH_66CH]NJ73"CR`b7mcj<qS-7rb`f1K?
cjGjt*!%sHqEl-B8X^M4<gcA]%$!*-<=LU#<QOm^4VJUra9Z:W:A-jcXd5g%jPcl9WkrP-o@\6WD5)mF
(Iuf@]neQB(%#"$qJrmGD;4eZGq-VB&%R#%1b$$b`5tiA0/@M;J=8*Zn5R8YR;%mH(?CD?GRM>U`Et;4
$c(i)cCnlB_!mms!oqr`aP+*'i*77MqUc7@2Pe)tIL>>n0b'"Q2EGWIF-iEeGM@$CoMHU(U%<G-7>oa^
X[lse9q8(2&umD_OZR]iQ)iCOFQo_RQT[%a2;bH;cKZ"3cU+8hmr\JMEJ?@VXP9pW2NH1#Zkn2EGha:!
5d0gV4,0>pfSY$GU$*!2`HLmqn$IIH8_2N18FYuYCD?5?ebT[_gN`HVF$Fin#1&"5_[0bJSHgE-l4`Th
nlBe9]m(KUUI/$]cPhl)RCXj\Q$df5eM?SV>,s?/UUo7H^&j$_7gdI<;Z)E^/j_W1.b[Uuo##T/?Bjk]
%L*/R%Lq)2p=l$a-Z`=[FSd.o$)m]SD,tmUd4`NJAP3iI"T+*_AG"'GN3R94D@Y5:C>d]eC'f1jFXn4X
$L/MaWi,-\p=897^UF.I@jm:!.k%;cO2dpI@:Pjs`h5BnmMO.ZLVf[bY#6*?aP.N"@E'L`pI=968_Y(r
;q_kdR\Zlrg="YVn29ZFpkWqFUpul,j55>+\u974J&0+NLU[+EqJ.ZV:1:TTfs8AA5S;Pk!-R<aKg>+H
gGK0g?9,d_h&*IM>j>C5A+3HOWRHpZ*J<,"]c<]Y6T2OC@O]IkORga])UQ$7\L6hGWJJ;J"Ih!NA76I*
E?$s<<(7&b;%_T+hHkF?=f*2I^-C1h5AFU'M=Y$8NQjP[^TI'M:nl8Xa<R_4MRrP`Hs[+3!A0`6>4,''
!UPm]Q2b'$3W.DSn"$Sn_NK_oar6mX/aNDq7)"CKR.:pZXaAW[P)9XSWb,]L>`k/;mUf_rN$9rt7k5cV
\)%#,??!#cYE[/X6bU,5BNE^7L=^Ega'Xj8WT3)/V=B;oNA2ToTN4Qbbr3U]%'?Kcs5iQjn7C5PF`/_K
prbC4?:_-,NoVn5GAPS]Q37H@Eo1:"ro0jh.)m2CfaQ+[CPcMW;aD\Ii\f7oGLZ1kZfnoAZ6`cC[s>(l
(bi*pg&)sj5.8+LCdk`TS=OUR#Nf^E)X)"A@J?3&UD+_DC^?Z\r>_bEZ$H-lDfejXeG6Fgk(P8qJ^StR
XQ(4/BCo9#qSBdQ3#ahV0#nr[p)A+s:Y#d49f)\mWKd.p.)H+I'&J,,)6LaFJQc3)JESC?P?q\8#f+6&
nOqZp;#B=TimO1pdAT%(o./UAeM9$Da:YNlpS$'A<CtK9mt#^4bk]Po<Z@aa!t:tkE'U$%o]]jEXLui>
XEu6])ie>bQ"T0QBnQk[)h\[lcC<W<7^?oa9sXKO34-b$`'lbkj+/eKVf#gfO5$O?7WOaZOu7t2kr(6C
iPJlZ^J&6WS2Y8CE%>-#1)Dc,o:d?-GCbC/H!["46a3M1H[@95[b-ZldgPkHH,!t=C)TP]j-9#OfEdlu
hDBN<0\.-P`nDH<:T`GRN!;6=D;9mV2]$,?%WU;r0lhT&@$!_?8"p!6fFgNPK.KEN#B$#`lR@rD0:3Ak
jN$'qD4?dt\#J9q5P>meLc>*;;'6omiCu=ikO2SeeBF)`pq0c(i=rHdcqRGS&ofR^-J0\fk0f(EbAmO)
O+7%fXVo2SlhO^?$pUg2nUt*s>V@gI7f:-WX5esm,Mlk[MKm.B)=\3GB%2U=o682NFED_4bO@mNZG2'a
@UY:j9DKN99]`[Qhq'ZXCY:M;9DMXpf<T>-kZY'614CG)Ja^[kNL0GP7IbmC#WLT?6$s!<$;,3FPrCtE
3XA_s;\'g,3@]W@;>%;:J\Q&hr/`d&r[*;G.WK95f[;,(FLDM@l/M3>BeVfDNlB%MhZ!fa^9A-'@3A>P
a3;e3VhPo1Lcb%;Q"Lp2&uMDJMU/6[X'"FW__l8@>r?fNkEli;"/2MU</r-)(,na@IDNFs*bN^;5&SWh
:i.<@D^"dn5$I3iKJh-9)6m4M8Ws'tfAT$>GZ$(BcOtuI!Z0]i`pmu-O^k,VaO$j:fni`6'uVbthpIcn
fP*n3r,U#mdYpHKFLf%oHiD3_,1"ht2].Q^=G5'(lY]X0]<)eHO0%!3_d@DL:gSNYc;DWiK8PkEeD$nq
&bh!:aqhJ+=>"-u,un).HlT\&0NB&Y2IH7tZ!5;Tg5=F\V!2KrB@n`aDL[+]]c#PELSEG0O-WX=0m:=T
oIMJnk>S]Qs+t0D^-t-P<$f\GJ#&>M(@U54G&Uq<<4(_]#IX7H#f]8n-kkG*VO8p0M;/ds#`:V-U22AL
&&Nf"a%7I4@NL:So:XUjiGd=cLrHKh7itI::\CY2a@'jU"a+uYT0@G9M@dYl@h79I4H-ETIrr-r42r5*
,'<I)if1'k;/n_XU(XH3.q;KPnNOr)J&@V!s!)kQMIP+FG7<+e[_&STMFfMW/&k!%?^+[*m>rs@0?HK7
oN"u@Y)"=bRT,u5&hJ+=`8+3@dI.5#8IldpDCaHmGp3Pa7^lpgHT@qVl1?WIVc6q=QrRMlS5QC_8Z)BW
D]VZ,P+I+\0[./[aofP_MoT#MBlbXO6USFqAPI&Ahs/^f-arF\e7:(O)&PuoEeMop-4:WEGH18#[\I1!
>![KgV%d1.]"N:u-qB%#lGUk]m"CHb?26$kN!H%T\UVMAT!^X#_qfrT=Xr\OPYBR8eL<Z/.YgEG5'9(3
:6apTb*0m*)7X4JiYG>2YY'o>(_ODZpXGrP_GR(N'BWoF&`h!:H]?3E>9VK+Jjn@STBQ<4o3XlE#7^m@
1Dkl:R()gqmV;]TQ]CQB3#s@&8Dfo>?X;11',R]HF;R%O"]iq]Xml/UNk%/q''XQQ*4%MrRV\Se2i_o8
"5o[[?/#oc::u#/ETYMmpn^`!\ai/?VPo;/FPcD]S)N:56,;f*9*n34V0;5S/<gil("N]S%A_7OU"-4t
8e&h08"QL9$)m;R8)+!F]&[k6pcXO)Q,hWe+pj3pY+ZeaH_C#)1V[@'qjD_a4#7(-#'\+DW8eP27#Q8p
WYOs%6!K5LY=*l$M!WAs:us.lT(WR7b0h<&W2;h[X:2X'CDX=238jIsbG%XJI4c,9WOlsO:Vp7]Hfnp?
!o;=243tW(Mh47+L(_i+HkmP]Nk&D-Z\*")!dfV#SbG4,-G9gHN.O2`$i"D25>l"="j0-3(sQgC>.C9(
S[thl7eb9^K].\`$j+ZLiu<H;GjH6NL6,ImOp5R*UFLK5V!^P0%AK9>ID;(-h1dY]L0lPcNKDgZ1u]ig
[qR]K9m_Et@2+0F3+C6h[hcH"i&5geq8:gMH/CQa9'2C*PfTddh;W$Em+\a?iX.kh3hlkL;S@5"K`c2s
S)\I79^1)&qRWYJ1Wn[\<:1YA.P=?8::.s\Ne1pCltu=U3K(VW`VHt=d-,a958c:#+5RE;"XiD+"jYIB
`eIn@rjk'`A]>(p#`X(bc-Q:P/S"7`HJianGo"]4nn<,!mi\X_l73F@#a8iXE^LsI"L2Dqf*B:CJGl;$
9qgUL7pXc<^I7oLNq&D'-+@<./_\c@o":,Dl.5XtaMuA8JO*/(IMp&_C:NiE8JX0-g8p"RDis"N*j%82
Ta:Dp)RF+JMk5WB$WOq]IdjKlb8bn>R7aka&GiUPoS)hCok7(a;W\AC)C5o6=.#n7"boT'Bm#=^V^le"
ak@nsE8OEM@2,m-Un@I!-)^AaMdKpDCtTB)3-PL/fk`Uc#e;I]N6-OcX:B!9ZDhA]muWL#M09p],R];Z
HDL'^fg_;mbLS6q>bR;EFmQJ?+&sOuT0%:LWUfmj2H`8L<tRGYo/H@m,uLd$Z*KrGPXSc?+>$D$aUj%Y
mFah?77hUP(N-AQ%>WeKcbEshB/'oS<D6$ZH1?;(G2)Nrhs]h*GK`.?lN>&?$*Q6-bpK%pb-BB[h?[Si
p!F,C%B.``P9eni3f[K(i3u@$:2cuma(G?_D-0FP,4a\=64Jp>ge3<84$!!80+NBtP5Wc\(IgQ@dDJV1
R&PDF7(`^a]9fHk;4,!aNa/J=CgJ=`ZAn>d:$Q?B98)Yam9ZNuBmMKu:u+6sL6m]rB9m$1!gADe9>h/a
om2Hk_dlgB'!\$LFYAlNn.N"GjEu3+ed).=%npJk]L9D+3kHK4+d'!70+fZYNPMK^e=1fAI'"Gr+p>$,
lQp#*_Krm`L<\>f!:K=hiG(k(Fj*L3;K"\aW)[#`H\l(CoD'J4>UQSPA-DIAWu'+1/51.^N?p>gX"X:@
iYUOUq?;efjH_BHbhj9-AZtJ`5?n)l1+^bWX6-QtFL)$L,$%*G;r(a8'&XO%'l9(BdOJlf`sBk@=aV%#
)J9F\*E9qBNQP5/6+dqa:I/_Eqh:`)6D(9>\SeG\n94?[jKA5NeS%pef:A2Bb-L+tB$3H]T+,TC86a.J
\=qQVD%Zb(]G"N5-4F<U\H/!/\$f:U.?%bh+e0G3(`f>lf2;mKmTNgn_:koMYboC^(Kt^-/^tB8*aGBo
T;_Ok`173<7BtdO.s4`m>,tf>9dlh9Vn):7[Z=HpY>pf_\%Gn:V*fMYMj_u:Z5&1!M/'IZSEbal-Pb25
AhRtlo^oRk_W=>[<5rcTn1T6)6(N>*j]=0)OPbnfFs'FU+rZd%FE(<BB,)>Z1p5m.>V'G%Xr0fIRXGPZ
AKRf4K2p1Tnk:tXS,t&9kcPsd!/-[%7K+DjGsjk(_BfZWlHkHJ"q5.@.l?-D>6n!7?$&/#YoB^F1]X(u
G=Ojkl_e=><UHkE/GBK%Y?b=B+QN(9o&?u^-`e_[em!:/Wf#'M(S]_<bH9Dj;42j5TZ]JZT8<2p^m6Cg
E[70C(115!.TB9]f;pI2O#1`C75hb%U^X_;*IhA-XJ26FW>/9j_,@pi=e^0cA`83)]N*A7CFVJHG@Kl!
-1ru1KkX%*->'7"=]nLL<>B+=EqJU]H+gVC1"e33en3V&AZ0./oj--keU<0q'pGESPtQfi/+n?S0o2a-
bk5!JIa-0Yj[lU!4Duekh2]Xi\bJ48W_0JYMgF=A\#`NOoGOR"aoJtF?WDL$>FC<2PkdYT:<?VOc.oF.
cdeVOJOR&O!`-]V'&d<o`NQDn)r3<^PLX9O>OAnrddkgg+9n&Lb$G`@E)iLj'^C!fQ`"ZJ/SdEu4[\3/
A$R.U8"\19Dmb!C[f%t)bsqAS]NF@@nFF/M<2kA"f*C>S;:u^)kI,<Ko3\SnHtt1.&_UMO^8Kje$4"<6
Iq!?r.s&RJIJ!;DBgGe,r>d+"9_sU;?OTAOi26A`=hh>R%(l;KDg7?"EV*(q5T=lIp+UI1VBI*3@5l^s
h+l^t01X"IhZh[0pq,C&[L*ILof'TnY=e"\f+?XFe=.b;?i0fteD.(H*JEQU^&.mg2]tbI_Vln'T5iY/
UQ9,,BM[)7\#SXae(b@cjqb)Kgjns;c)i>)j30>=IV60n##snWc*aglQ7BCub')#=81/LnDDb!?Olckt
UPK5<WnU0fX,3/iK]WKoQ>:A'BtNM.PLnTSjp#([lY70R;:6+8IhnL-(6^Mu%DgXX1cL.n5;]j_1_X=!
>HGb"2kd:_H)id2Xb'6DWGTtgEU4G-9QSrc\07n1e^3*)Y3+lKdbM8WhFhoW\XE9?gpUo\d`mlPYoI1Y
8nb3@Q>TiZ/Cg!NR&ma!1cNX&.B^2^=b-t1Hr&F,1)IGMlQe;G?qYt/Ru@%s2)im810p`e!RL&B)Q8SU
0*4l"nqaoUE7muYdl"W"Z,WZO!UoEE>O9GoIXPmIgcPCJDVV)=2)dYDZcge'7%q.[X/^.dV5-b*"-PTI
RTiecK&;!LMc(V;FAKfSJ18aFH6Et!9"gYh80pg,c6LSnql[KlAgfJp_d=2rQR7H0WN%d6m^qGHS"\3a
U/a/6,[GXJ9atdJgeUCJo4i0YUV#YXg.\Z[)%+X5>G\n#Qbt[>^3<l-NI=F%Wr]=-o#sYFh5\IS*j.jf
XWB"@BCYM3[D(I7CXM>Ijl5SGRN&58>g86`@CbO_'I:rjdT8<?BW]e>S2+I8p7]$*7*9)SX0!jBdbKZM
e_CS&k!ncF?#q7Rp[c36n*eqP25!r%lDE0>gpV!9<C%J!\NOJeX<l#b1X-B-,hLf[IGXs,X6iit-/^fW
LZZU%:(PTd];F\YdjqRNl#\elgFgb<ih>6(hN?r4h[@]rJ`H\R5I%WreZ/i.*]rKi^PI[+3%O),nH%_f
2r4=mW`>#+ol'Voc3oVC/Lb,1)LdQli[EL)5SmYlphWhtp$.n);r.-f0`"KO%;QGecF3!MN'O#8cS06P
ETonDO1,8^.sfc#CEuFYXdX[XV<ZoSPK(3/mE01oe;mYepu#',MTbI"<NL9[9_:XV_QAt86<+%lHFAaD
,ZXYYR_u"8ZZtTc2MYLWOT!_c@&\C9s!^[A`n_1Q#FfGg9foWG`WsuLMX!mZTF(:jXXB)F%]]@IM!qtl
;o@ATY=<p&[?+Q0bHR*))r*b`?J?RlS[Ss-4gU@D+oA;2V>T&mps)GU=]Y(M?bGb=OTq$Fo=1iBkT>K0
9O/8ZoZ8SgLg]^QhA*gb+dums6VrJe&\gW<&fuW8J$>jir\u!58LFhg.RA:b?AlYBT);/,;JbHj,*n#4
[O0<(5]Ae[?,&>bL*h!V4st7pXn.m9#enDh\Pg4Iha(r#A<%dY"NRpF-0l@eehD2UC#V6<0d;Wi;FT7I
6&:#J-I_+H]U61'VVB618,bp6j]\Jko,-siSR5"<mT.<4$%H7)U/=1GHkq^Y9Au?OdS.NqkcK]PM#PT\
GP(!j/nIJM3EGqW]4EjJa*O?I0U&tF5MdM&^K?:oH=EH[%.j0eIBVAlS,/T5>*^d?<De&bXt<SqJD_Fh
9pS"CE,D>;U2$m\kTF4h`K^NYh;6;;eKDtN\!H`[2N>:@FD723q80/32Hl-C3RSA74>LlPR9-[BKa`HV
4_)BS2^Vt=g)b0Z(%LI'UIV-;fW'+2USf"CBSuNgeg1#D<W.-Hh?8qRQSGA)\S:fn0$RngpkEB\pO=fe
?\#8]1]4!ViF]LW\K$%;fS*=*QoY:m&9#M"3%8<?Zgf!IrC5#q]I>B%RFT._1Xr^eF",Oa=6EhGmG=;X
XsiO0?=4^rZPFI'."47+SVlFDQ,2gh93a-66#>+ViVljTd1VLN@5HJ[mBQ0iNI@EVh"@Njf#T7e$?M5V
fs<RU=?_RW+N=Ykp*>aZV)AJqkeZ[&*SU7p'XMgs,>(:1S7?fo>@khb<LM^V:^5F$WP,5gT2Vlf=FMVL
='V#7aeu2kWMSnI4+6^d0d&qB.8!T2@kIA^0!<u;H,V>bMEF5sZCOIsa.-)D1ss5S4c?R]<]Dn2Gq/'e
1.IcR75s1KU]#$--h$)<4rfQr_AkL%?(Sn<k,kpIqjNVKapt34Zj4hS&+u9UrG^p8c&8Bn<A.\Dn"Y%Z
l"?/V,2[YYD1r6kd>PYZ:f'SV3"%(aX.gF`:DC3Y9+Kp1hIJ\sl+JL54gRn<Ufuf0-0Es+jE&(^`;>#)
#KJG-lo*H#m_7C/oH`::Dt:a0UkX8)9Rh'X!48'8#MrGWO:T-B\U<?&Xs"kgR=#8kO':!2Q@&[)&,F"5
Y05pZ7Fp4,Mi)R<j9'1nN[l3=0CY&6Q;(bS\HX3!n>6&E&$.`p>s?3jj^<$arUsF4.bj!um!^I&I`R9g
"0BTLAe'KA@)g0qnq!jl>WsiC+M.c\b-E04I-aouYbGfVd"^MPKj7rkOhfF`aKu<ZDEFn'4`D-a9Z=kQ
_;N[H=Rpc#nU:EN?Z"un[.&!_mDS>@%_qu&kHFLP^]-[Q7Jr9d^&B0oX%at6<dENQ41<0`f)P[.^RZGG
gQ2@N#MUmq~>
endstream
endobj
7 0 obj
30549
endobj
3 0 obj
<<
/Parent null
/Type /Pages
/MediaBox [0.0000 0.0000 431.00 434.00]
/Resources 8 0 R
/Kids [5 0 R]
/Count 1
>>
endobj
9 0 obj
[/PDF /Text /ImageC]
endobj
10 0 obj
<<
/S /Transparency
/CS /DeviceRGB
/I true
/K false
>>
endobj
11 0 obj
<<
/Alpha1
<<
/ca 1.0000
/CA 1.0000
/BM /Normal
/AIS false
>>
>>
endobj
8 0 obj
<<
/ProcSet 9 0 R
/ExtGState 11 0 R
>>
endobj
xref
0 12
0000000000 65535 f
0000000015 00000 n
0000000315 00000 n
0000031292 00000 n
0000000445 00000 n
0000000521 00000 n
0000000609 00000 n
0000031268 00000 n
0000031746 00000 n
0000031462 00000 n
0000031501 00000 n
0000031603 00000 n
trailer
<<
/Size 12
/Root 2 0 R
/Info 1 0 R
>>
startxref
31819
%%EOF

View File

@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.18.1-->
<key attr.name="Beschreibung" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/>
<key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<data key="d0" xml:space="preserve"/>
<node id="n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="249.93318675648084" width="150.73691016175417" x="379.82322525840146" y="-15.0"/>
<y:Fill color="#E0E0E0" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="90.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.609375" x="9.991977284848872" xml:space="preserve" y="146.38688006175698">Internet<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="-0.4337124711251771" nodeRatioY="0.2841945985857549" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle3d"/>
</y:ShapeNode>
</data>
</node>
<node id="n1">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="402.28247680692664" width="162.91206076630084" x="130.0970161695911" y="-19.152021620717733"/>
<y:Fill color="#E0E0E0" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="79.45603038315042" y="199.14123840346332">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="90.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="84.970703125" x="9.113003096740954" xml:space="preserve" y="302.121484753948">Local network<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="-0.4440618266451515" nodeRatioY="0.4622397449460143" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle3d"/>
</y:ShapeNode>
</data>
</node>
<node id="n2">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="283.8426393358113" width="150.73691016175417" x="138.89277718906638" y="-15.0"/>
<y:Fill color="#D0D0D0" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="90.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="86.833984375" x="8.098407213028707" xml:space="preserve" y="176.37212114063328">Local machine<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="-0.44627455741040206" nodeRatioY="0.4272958641151755" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle3d"/>
</y:ShapeNode>
</data>
</node>
<node id="n3">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="166.95265436079174" y="97.8883879466967"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="82.333984375" x="13.8330078125" xml:space="preserve" y="6.93359375">AusweisApp2<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n4">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="409.06939432176046" y="97.8883879466967"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.939453125" x="22.0302734375" xml:space="preserve" y="6.93359375">eID-Server<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n5">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="409.06939432176046" y="-7.134920941481575"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="99.255859375" x="5.3720703125" xml:space="preserve" y="6.93359375">Service-Provider<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n6">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="166.95265436079174" y="-7.1349209414815675"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.142578125" x="29.9287109375" xml:space="preserve" y="6.93359375">Browser<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n7">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="30.0" width="110.0" x="409.06939432176046" y="199.59487324412942"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="88.029296875" x="10.9853515625" xml:space="preserve" y="5.93359375">Update-Server<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n8">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="110.0" x="166.95265436079174" y="326.6678526626905"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.4296875" x="13.28515625" xml:space="preserve" y="6.93359375">Mobile device<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n9">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="32.0" width="101.0" x="171.45265436079177" y="202.91169683487496"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.01953125" x="1.490234375" xml:space="preserve" y="6.93359375">Third-Party App<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<edge id="e0" source="n6" target="n5">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e1" source="n5" target="n4">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e2" source="n6" target="n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.71875" x="-34.70611583776903" xml:space="preserve" y="28.92603874253608">eID1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="19.34674322102171" distanceToCenter="true" position="right" ratio="0.5329867452764283" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e3" source="n3" target="n4">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.71875" x="51.6604446461962" xml:space="preserve" y="-21.17213706476275">eID3<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="12.10572917405711" distanceToCenter="true" position="left" ratio="0.5105195151628484" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e4" source="n3" target="n8">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="54.54734563920826" sy="14.111612053303304" tx="26.398238238132535" ty="-16.02468140151575">
<y:Point x="276.5" y="269.0"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="36.77734375" x="-59.55753414077361" xml:space="preserve" y="149.35286035153882">SaC1,
SaC2 <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="1.8153536324476993" distanceToCenter="false" position="right" ratio="0.7870346060615276" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e5" source="n3" target="n7">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="54.971035876728166" sy="15.038770784339903" tx="-53.5611005145696" ty="-15.000980657566373"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" rotationAngle="22.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.220703125" x="46.57289611424528" xml:space="preserve" y="33.28619210241317">Update<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="11.307275195559956" distanceToCenter="true" position="right" ratio="0.6189315207731947" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e6" source="n5" target="n3">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="27.54734563920826" ty="-1.888387946696696"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" rotationAngle="337.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.71875" x="-101.58040528438903" xml:space="preserve" y="9.329639509720586">eID2<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="15.099869002821848" distanceToCenter="true" position="right" ratio="0.3864086416472374" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e7" source="n3" target="n9">
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="standard" target="standard"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="53.359375" x="-54.679685116747294" xml:space="preserve" y="29.445254182778">eID-SDK<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="27.99999999999999" distanceToCenter="true" position="right" ratio="0.5445528599796611" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d7">
<y:Resources/>
</data>
</graphml>

View File

@ -0,0 +1,468 @@
%PDF-1.4
%âãÏÓ
1 0 obj
<<
/Title ()
/Author ()
/Subject ()
/Keywords ()
/Creator (yExport 1.5)
/Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.5)
/CreationDate (D:20190314163036+01'00')
/ModDate (D:20190314163036+01'00')
/Trapped /False
>>
endobj
2 0 obj
<<
/Type /Catalog
/Pages 3 0 R
/ViewerPreferences 4 0 R
/OpenAction [5 0 R /Fit]
>>
endobj
4 0 obj
<<
/FitWindow true
/CenterWindow false
>>
endobj
5 0 obj
<<
/Parent 3 0 R
/Type /Page
/Contents 6 0 R
>>
endobj
6 0 obj
<<
/Length 7 0 R
/Filter [/ASCII85Decode /FlateDecode]
>>
stream
Gb"07]8gIEYpH@3=6'lG`nq;HU]q#?JTHO2)Ze_H+eg^#qu;6@[?d6V4qYm\$7oMj5RP_=iVW!/%s**.
R<a6SkC5_Fb<LKu0<iuMro<2=kE#Z<nbV2,O&kePit'3(PE-fhYP@n_gQ2C2j+!Tnr*TKua8c1oJ'1(V
qu?N`9)Ie$rqBe"rVuaJ5Ou#Wrl[Nt*rkmtnQTA`k3L[7cHXtOe(jk(1]3$>rd,1U-0L:i=8Y:TIS=F(
Gr3QprpoNF:qc0Jp9N!d]oD1s55Yq6DiMfPrWV1$r:]1.s3m;/:ODl[./o>TG[#6sqXaBP1Z2X>r=$3]
rO0joB.Q>CDgfPG55YrQOOUE<gFp;#qh$Opn4/>p>EA&AY90u5r37;kH-7(=fj=sKIqZ%Cq8FHT`_bP^
c?&o2r<JPdX1r/C5*1Y^J)70-)T]Ces#TY9hlAhGL@om$l<hpl^>cmjb!/F+s7(_Wqu#?mV3Xd#qY+nj
e^Aj"rF\<aY3msmr^XGAqYC.2\nh8;s7]$3bIQ3qijY$WkY1cqD:oT8orY[6^0u@0dk\.lO#IoIDl#)1
jF!HWbiDj<hHI&Ai:U,`:T(n8RXX\6>]N"Vm5]Z.oX[&/s)E#HrR&28>0AI0DU-arEmQ3\j4X>gpte1*
7-hu)?Z"sJ6\g0B>kBRdN9\'$N:[SJ\!G#9Y<sgQ%-Z6e#PC74X4GH[Fe>hBch5N&HHZ2I!_0QDO0m4i
mP>Z%3dUgG3n22hN)q9tN^)71SNa.'cEi6I.rf6FO,^ou[a%JbN%$]UZ%dY?Y6<?6f<I0FmGKbGT?Gta
Ho@l4FJ^S8R3[7tGiAZaAu!)j[(kR%EI7[8*gd8VYPqSJCnBM01,$AfO43^o%H$X=q6(V<;!S4Ud>Tl?
IL(#tX`_WAhC@_lkT0,04$?cfiDMr(bm1Aq=]q`i=lQ*;n^]5RJ*`/m92./<05L0.<i_ai5Eq2Mg>f88
3Sh$4<V+P"hra;)r'@1Oqs0F%b*qkg_l=4.+4LcTAPcrM0+Za,?61l%*,ij4%W-b*ZUi!\+jlkR/F]@<
dMH)&_E<n5LfV?l-SXu[loqLYSlKLWU8LL1CT$:u[*!?0qO=`KU/bKeDfqS0EmVn_Vj[GUbY+s<c.:3.
R&,P.=6c`E:4G^?^pO3t$Cp;)9:iXGNW%)?kuB?>q6Ld5:F'g$p2ORXXgPh79Ji5bOnn@sHsAg^Bk!rO
4[%chV3N$M36'fL>ea.@,<!T,hBk6,&SD`K1lOWEm_=/J%dE+PF"Na9)NNWN%RmSs%0sX2(u*^<D)qWf
cPT/(@)i*7gOkutRp*(<k1OCR!J1"U!or4F_!A+uT(/@-Jjunnch#E3pZOnF-U[(+PIo+E:Ceh%fg1nS
J)e625+W#:4/+jHV[O6!))sqr_Wr_4)*&O]en1^!HL/VkI.Vtrqje>O'J!eVTO,3&TS$9`<rsDu1p>mO
kb-Xa9-?SFJIKStcF`Ymhf)+/_^9qb8oY.?*G3hPJIZ"g]*(0.jR+ecTX+H[5\K_;X_?7V0F;:]()"^X
@jP<(/%o5[f$5=@aa%&O>Tkc`=pL=t/l/O'mOu>VkF85.:TKl#G'VfXFVX(R#@U>cV`AdhB%V>HIbCUi
["Hq3Q`!i@>j#f9icmN9WkM,cVk*g&:D9@_*o54h>(c6?02F\$P">Q4Bpb_sSYm>4Sd$b-``E**Q-ioW
X2TA<kuF=k[8*@JC6th=]LS%69^TrHR]k9'Bc)7>Q`$D;O7IRARUP5M(r*!g@ljRUHXE@fhK?gZXf'Kj
q(H*iK.e;K2m73YQZcn]$<fF1p,=gpem):_q.aOB__md5Wjk$U]-Gp4%#:_,.eiC5*1Xm;s,'0b3B_.j
X[7(`I%NXYZ/op!IS\:>`M'h%QKE57Wl&tC1M=.bdTd9RBg,_P0k<t!_073?Uq&JYSVuBo/pS6&T[lHA
G[6e_)F=TS">,L@6Mppdd9lnc46@X[DMEstd<0V.V\%ZSlcAUO&-'OM[NiPce++;^nbp9gB^gN;&PTm)
&(i!'=HC2/"Tp>`#AS`jYM]/p+9'8Vs/<aU""EI/kFLn4JUF*dY60:R?JYE4XP[7/pe(>srnF4GcSbK=
LS-\cdU?q_cSkR%@e&^X`P=^Dq^Xk3"5Fs[HKc`(`t'u5aJ]A#oIO(WAnZc'6buOrB7\N_0ssUU\<]Nf
NbglL[iK&@]DrSjd<S#L17!JMFH)<1$I.oI;2=lUMOuI&s87[j"fauS&R>KZ,8?U-f?""Z$'c@`V@oP/
T'8elpE!a2Fb3s`7c'P,p'?tm&-iW`kr=U5ig60:9(uhEDj_s.qCoNT]$A8e<ues"n%6j>aNjXu4/>cA
&R4(-Kf7s>H6ms'pUU+JZ8#.%fU"QR7%?]Ycs)RN68a0D&?J^0NaqD/q;o7PHKhW$;s;N')&WrKi[M\K
AM=.QWrbG])*UJF))?$4"&K2qh&&2qi%gK:GT0N?QSd.g]d#a2HbNZS1Mb@=*nM-LqE*,Q(eW`"d<a1'
1l^E>K(2&#SlDQq9jjoB)aYWBB?XkSB/X-g0Dou\ai8O:+I\26<Z#A,-5S49CdkA4D0G7FjsHfqB>2Ul
"(J@,HPsDqAJeXZUNIr1a_%E6!<)$W2E;(u*"&q7_(X'(P)8rI+ZV#UEX]ieF:$fDk+O]4C>;IB.nP<`
_@OG,k]l^M<\Tl\K3i4,+1&0fV[Am3k/*m]gZU,/G=iNgKKH$Y?/_nc:'7GaF?+;\cc51A2Rk95=RDjk
_bD7kfFLom.&EYN]@#U]Q@_]d7[^UP/)/:4XZgRgT6.YB)COmUZ+<_l3Xo%U1kB(;)ZI6+bu-3Lis3kf
UGf"7FF?u#rDNIe;QD$GcP/nnm6tNWg`Q#Oa>Gd<WjV<2YQQhLhDb;dkB.R4o@NNb+`MtNN[\qR;).Ko
]OC;rc1dAC'^Qf%]CoYt#JnDciq%n@XF-<tfOLmYKm$^7jhe\S>2>/Drtsa6[q$F^(In^P9](Kn=Bal3
pI=DCV`qE#Z^9Hi7lrnj5!Pg8q/j9`]?A/tO5c``A\QNn;0"STG0hsW30BRl0U#ET]PF,Z\MB'&ZO1Yu
_d"`\FF>Li\YA^^)3be9HVEl!G.>X_YcmigOO9VB&S7%3<7#:>C4bl[;%`\E7Zg4J/L<>7cm+N?`eX<?
>-Uk]\4QMl3d/fgiE4^RnEJTTOq0O!(+el,purh<VlrnjORRAtSX%Ll)nta6,N6cRpX%k]ZT9*K,ImH&
HO'h"$EA$4:*"Bd_'q&[m\(sc@IBhd+e*i":q28h?\@`ZO1BYUi>sajmNM5&KmO)C(qOk74Tn-$KR3tW
KGm>l#Nbl*%uKbdHO)7=lQ4Ke?2'HMdli@iqfE@b_48D+1aQ5Im$s;^Z%l_Ap8:QVY2SfBA!YI>E"<so
;RhLB;3*RhpQ-VD%iI;":i#,SjrS91gkU7?I'r$S&&B6Xi>t&Y)sc`0RW.sglZi_@K5qKn<@0$%HY=Ep
f>9\XWCsaJ8EdX?+OAY^#G#0d7sj7D_``+ghUamn*@0E+m,M@&4iEPoE"CW*?2"oc0QfS76f=h;pQ2Vk
LYu8E#7tJp5MSWh?*iBg\?Nk6o_KSU\O6CF\;,Bm<[Z\/mr,^kHBu/#m\)8lC[RmKkXq"baH=)i%#6pA
-ZdtTintOEr)Xm+U!ldS;;iQOI%LW[c/8$h?84tC.h;<8A%@@U*7s-j3q'B)P`FSYg7"('f@/$7n_O'"
d#NP;ijU`!6O,ao\$'SbeJ`J>3PXs@o'VODF1Ye,p.4Gno+-T9s4P+8@KV\86fE9='[t:>rUb9BQfh^,
e,c/S+/@T1/'"_arFtTjLjQui^%=7Dp6#N=1S3.PU)fdW^9D:+*ONt`*KB(-/6YQHKc;q.QG;3m>OoJp
>+YZWEk<#K.UfZX^E[*b1_uY[h?p71ig9PDmCr%[3$`;=eX=LYc(['0[\I>8[/=KXMjEfPf:p5cbBAdZ
4dt>=I%B/=S+1hVqhYpWCGCigHGcJ"jLm<b(+k$H>ec8d1$s0MWnc0S37)c*f$I\C__PPRaWp-!Hp'su
mDh?<O</id_`&!uRca*s6gH^Vd=G&p@lABZEs3p$Mq21kK>@P*CF<]_R-pV=mDb1N%*((CSu-:pa)l]M
363HWYi9'jr3fJ"H)n<%4/T@`a"a.Da"Ef6:?PEnTt*m"`8_ekUb3&i8[$oi@7Hl?-C]AdP4Ih0CnLBo
1T`36f^\##h"QhIO8i!tFQ\+]jm,//mP"Q7?Ro*67j(c6R&*;XPPsHZoWt"YY4<B9nXgTMp8ph&#A_Wr
fH:)pO1r71"'o7=C4Bp#htb55r`77p@3k"FYQ&#$J+\!qeHReVn]s;I;ZlhZoj7t'r4N^'l`bhV6/sK]
=86t`g\r%HrM,Bj#WDU%oX'*.])UmUrg0DW?]OQ(3P,7Pkl-pDqd5BOIlY+?ZQ7k373k'&]b(L+BYF(\
FD!Z!Y+o2j-@Z?BFpV*5cKhftISLc<9etHDUWj3dGFLM]B5d/OFkAj087l`upZ8*0W@5AM-fQ`eR\,A7
"et=BcN7I/q>&>2NY23:lG[BEn5D$\%/_9.Z[^21Cks]S`P8HR9Rjm8<.-A1gXrtqrQE)0L,4:+a1!/-
k_Is`SZ[roV>r-Rf5P9Gq%g*Z=#0Ym[U_A\XWQGkoA.nRQRb4E9Gl@QTX:p"rI!jE/TbB=\bt*k'SRsG
dM=8Xj9hI'gZ8d4rjfXG\O^b[Z/c63b\=Xn_,kfoEeP"hmW.E^SO7GibSQ"=l'^t;O=PlVXr'(-ElNS'
ZV-=M/>gbSb5%4UQ,IY'/']#Q"_6_hNl`$R+]g@9EZd`P2!@30j5=afEQIKf)RhSradk%chu[QHU<+-0
L:Qn)=5Y^7`T;uNO=Q&QXuM_PJQ'+6,jD0N\6K'cnUe1>O@jPIDW5j$$67KOE0abFDabt6/%pbjRoB.T
@6Wl_j1@fK4hJErb']o;G>WCC\KeZEf]<Il1LI\50[h%qcRR-s>co&72jVW%XOu_h<uS/sjDs?+aVDjZ
/"d;BOt-<%-4R7X&c3]]K)I!@%EX/BBftOL:];n!pZZ_/niCs>`dG@$5N/2P2[[/=*h%E!-&u=*SP-K\
j_+f:5,bRM(5F-D3"2:qJR=H)('i`dm[h6,J20AD-0W`>;MG!r4tM_S"4GrH^#Tr!hmO?Gi\2>f7jf*r
MZ[mlKhIo06WsY>a1ON=:S/Ik:Q+8+>fO020P_maNe;;.AJU&pYW*WGiolP.AoZbBm9t#,5nZ#4"$Ki2
D$opeZjU%W*H'N67h-HcXrr,;4F"RI/Iog=EF<*HlC^qWs6am\$ban)T7$B9L7`Eu+p.u)^>[Eh7\SXQ
g;0_P*I\iFIT7IpmbkK^[7BudCE0#-aFi=X4$XmYQ@p9O_]d@D4!(%6M?@t<pCO9W<r9gTJ8X!Ld",l@
nc8W]8Su6Qcjq1<RY."Me9IM%,P$Jkq;VI'<,NLj4Yrl-iW.fs/Ip,:57aL>1\^"[nNH.uZKN0EDYX)J
m"dFR&7.'f`E+$LR_Sfg=ikXA`YX(FA>Ga0iTJ%3Ne74;UV7^RPV37\asp6Ri%_K6_a-nQ1hrE#`\V@s
k;PN'+>juCC+t$r!kS:0?Z8ho@AAR63;i3o0YtrPV$7p<o]=SQ"-jK"',*R]Ff>D::H;Ud*Bi:Yo60^g
Kcb*@bVo!1$3WoC[=r[`<N)8:5$ga2Y/_./_%5GWJe)XB3!Bdif"BrU'7?s035o--'+:^WjP^f-/XumW
A7d1+.1YXm81g?@_3\+aS73d:9@Nf?-FXApi/G[`+gaSp(`lFl`a).B(/Al=UgD8a$Hs-D0H!Vo.)IEh
dg_p/IGE08)t[!n1r:]'C4673&3?uSGM+2G_h[?UG"f&XMA:<1LJt:m"47CP358cWZ=6!;>>PIB0C%\e
1:%W=S74ce\ZMdU29.@W^@V*i2u]35s3EaWqSS(Z"2aot5([Q9V^_4o59/k'"-a=Gr[X#l0deW0#QI?f
N'G!os7X$10-/:F0iT]qOm*HbE%rBWj-9/DKbIa1kG\X1L[Y](Pl/MRT("6N*m\qh"k!(%iH<`C^u^PZ
?spp"S/lZ!N7lejXSm]/e:mc^I,KdB5C;<*15!?W#r^Ps7bfsg+G*[E_gU_SIcA8Onnfu8$>8]k6bcU7
p;,[Cn,]ST[cR="\S0o?9[=?hK?l_]c1>"a])Dk#]`X^NG>b'F^0A7r6XO_Gjk7u0#`]go*T:/"*k/QK
T8]Q:T.t7S\(Q/[E:iZSaSlPe.oB4<^RWms>"sdg<Q@AX<Z6GO_pm3`:V(&s[*aeK:S43org'V)\]/hs
EqIZGc?`]_H35uZ;,J9.b(,t`;eIVn&t%?ud@'Z9cPirRDpk(06Tp>GN_Z8fHGgI.2t";k76:dRdqF<j
q7-c>;a,B`XI8#W3ilX4:I6YdGFGYN@On9&/9^]#3`?!gf;uCD.iB?0i\-Eeb%Id;WG#oLL@:S@BG]Xs
8TR#Ea0"fJ7lD1^[O1sY@NZ1<Hp!.-dlJ#b;pcTFA-9.rD4SdA)WjbB_Kcu5;.)dl1Y&n=Q$aiEJ$SV7
3urtW"KsBM>CN=*cVE5'C2K]`@:'V+-`<jcN`!:J-+M.aI\9b#%?PZ#WacO%H2*s\WGBNWSm$i!`<'A?
oP!.ASrV.Vg)ei:[-F:N'he,gr/CUT-W.P:[)G8Tj<a-<G];t)+rn#T081W;_2.*_*2ng`%rBU?kG)F[
c.b:dDu#TKNF]Yg??I7c(@>)NZY2iLebZ,#&5[/g&iW\iaCTE$:%'C[`mHf=N>XC'ID@93p./eFq(0oT
a+hk*X\688HJ;6>6aAj?\j.,BboG"BE53hn`ZB*KD=:bHX3a9M%h&mcX4l4H@5G7Ca'B[aO2`-l]!TX.
b7XPR_8@FB`0[jgqQSN9JNkca!%K<^0uh0cj"OJ(X(h-UX^+$AIeimO^Kd@ppNa#B-BA&e0CYf#s$ae>
gc)a?i4o&Eot9-8r10!P3)mK$\(E0dP&V2iYIk5/o#dSj]IFU5/s4<G23PU%;j,(&Vl3VdlCcfOnd5V6
,NKRMgHo4,Ed;d^j;$N.6XJ_jYWq1`NY9s/=6RD-aHb2De$]K:H1es4/&]9R$@,WFVf6p8"3_YRWndPQ
e>JC7)CopCgU^J-.hi!*%s`j1+oNRf*4rl#6"C=JKf=d?ir%tp]Y[oYBnjO4'_:N5afC?)(KipIjAk.C
^%.'B:`f07IB"HoMNgeu<sPl(OB6#Z4-EZV],Z>h\nLlFVW1dZlTb*.nW6hkp9<UXRGLPnJ*mPA($a49
bT9$;[&c-Y4]#m5:1a,aiA';$?WS`VU&X-hggbn<KBu4#R^>!T=7WHF`@06%Sf#kr079I28pWm"0M]o4
E0?MnAZ4W=h7K?TL8Y3dW+G@%d:=ceC/2#ChN?RH>_do16GA4P'mF<N,`s>2fcu8?$Trhqe7Dhe-F&g_
,r3r6_gB!PHr4EiC0dX1<aDoKMW4E84='>4c+<5c1*cWAqN)b%oR"f?k)hIc:CQ9na@J)B\nS$./'""2
bM0&j[^A"jpHWp(SI(`C,2[I*,8saHA,+$!Lbtj>DQ@JVojpOi?mBteWJ^PF%E"MJN1.K?TT(6XB!eg1
UHU3^P;F&Q%HMH/gR>s'SMiOZNCt3M(`Pa[]uYpAD)cRiE%K`$O]p+$0,fo#7aGtYJi6@7pPRMAdGn`G
F#9S]EMWK[L<W)eVXTd-m"qBpj`W%dA%U:1e_dNp9^cQ,P_20oTFFCd)id?+puR=^pCRRGCe7[&N@"G&
0-e'8d7nCucK0:[>!@b/XMKHFlCqp]^`52LbF<42h=Pl*T_PX'Ng91BLFe(rFG.RWr\guD>K(Tlg*Yc]
Uf-(n<@)_kW!Y8.Bt1l%8UPKF\$_.c-\h5aZ-DE<H2eHn;0D5TB:mUQNsDNnW)nF*2+QpF]UI]g-j.Gl
J[k8B5).LpZjuE@ep\nIINYbi@iFi%c5#tf[Jc<V=lZnJ_k`]t]f2dM1t.-SFR()kO.Xf/E?jnM&NZ4i
bquunh_C,EBOlUtO8cS3oT+;I>J_Q\o`Y!d`#k#Wo4QC!`W$W*je(G>ht'aS)E&pZ:>dZUa*=%%RN`hh
cppDD,.aY0!j/kc"<8u_4=$\8F0al5\5kql;3cl-Rkp/ZS:S62q+K+BdsI&bX_)uPdToZKJYm,uRJlOG
B@r^k9hi*>MMKUA`42j>&]TGWK@W%&B1Y6Q/;tg[3Jk_i8?#;eE$)U%KZ7G:mI#HkC1j+*lVuqESWZ:i
\g6%/>/ja"c,hV1]$]ZYY:420jpXr,OlHtQ'!p&A,L*%KG&6QkAbjO4GPGb3;dU%'fQG<e,X&p%]:0a3
G)bZ(K^UR)'43:@6l9SD/YF]_.=lmk<c(LD,`lP(^ePYXmmL)RO@U,-6^<Ut80-!Y'/=OP&08T5G0%:G
d_?(POT+&ShqKEQ9=6sN<IV"Qo[gI*1Koej`if.(ZDqU#Huek)3nELf['sWgP0*[O[ej*\;L"CPmrlI@
n+]HsQ-'%<\6sm`9Cp%P]iR7_hMY2I@DpY\#LL,[7+<KA(AC3)l&&VTcF%0r@eS%36M,`I:/'A,^lmcu
0k`a(7TDt&7^o^hYF*Z-%3mrQ)GGuOfJKmdgISUtW#dcd_r7*nF(1NR(cBrDp^p>T/Vj%J<cSm]VocG.
jLk3@>33YtaUD.&.]IMhhs3k9;n=C@qkA>d0P29=PTDnB&a-mO<p"T_)kd1-glb.Rl6u'*f%cnF/7I):
6Op<qO>H(AHraOO#UtYrbgSH[1,t38CqY-lL+09<%3NgpDb<J0p(ct$79lMsiI(bGeTE#,^TOU\EJF@-
X^&Dh:mDQ:]#GsO<af%,k#cEGS^!@%+o*ff_i`M-e_?NMs+unWfGR;E%g4jb$DkVeRI@!7-Q7;L@)rP2
>W*8houM#:[:8TA_F)X%e(:r&CDqKlGnK6)e&FFk0#BZ$c1b!KlB3(7k@odE1</$:_d.%hBG_1`]_!Q*
3T*f1q<?l+:@I>+:lk?\7m?Yt3TA7d!S:"Wd[WrdR7ZG&mP2q3FNjs!`V$Z7pPhNr)8TIPR>g)g!,*\a
RI.s.0]\[Z@qd:bV<k+WpDWLbAhq5!#0g\GpKkGOONnW1ahb#HlV+VYV4#Oq)^$u$RDjlVRER4],L+/h
CF0ij'01JUit]2FgXo"X)hm]766E\"'Ii0=^%.Gsmg?U;18[fZ>VeZ8HJjjBV-dX.=8*QE53$B)A'"eW
f'+s#C2NE`6oWY=<p:?Zbn&36e!RmZo1QIDI1N&;$Ncmq:\-]U3V71[9*!<3Cite>-1^ZGDU34b@S%;)
LS#Y3g!S\^r3n7onTX\@f%[4C9[!KcC&MtIG<!=*f%b^TA2>teLLLIRo+g5L>Y_+h>[BNQD:og'j7tQ=
^::W;2qkme^7`0Ok2S!3W.^.]f\GZ36!NIRfA?0+#iE7palBA6Mg1&iG9-M9Ff`97?f&K.Ra[o&meLTj
Z$0!)dbVNkj+rmL4?LO4XEF>1%ed%qE;89qgSHFo/nSh<hK@n+pL<O?e#+s.EGMh'f8tb]]5u4VBAM.Z
IJ</5IT#(j]<?R*ouCChlC"h]He5NGi0nXp]ehgU=#H2Rgt"+'B"r_BLL8okBgJ!KfI:YRNVP*u]t92p
iF6FB\g'>]D)Zmtp[5l25?n*!^Cm[@fXm/ln)ERGHP^V7HP^ZG&'l,?d;E`^D5b/6rV+"kpn-a@p^=aA
D-t>8rujK48GjG*H4msOqh'BMgZ-WIhX>bSZKN>Nn]@6Rlco!\;"P,f$_oCQrk@WY&7hZN.Dpt%TlpSa
O8/nfqD^*<@#R%n`/lD$*51sUb047/Oo9u%X@/l]0PXX;QE9AgP_<)C[,tk%X9YcR`!e"/AEPV&#41@o
Bq:WQU%e9>"Z_+#Qb/AddWDc(%9f/`3fW%,EMD2i)%4&Wd6'-%^G,mEe,KYm/Y4J&po%QD02p6Je=-je
G*0^a*Tra<H9/qLIJXB>+j!c\.ao;*7N0:8l&@m]3Q&;H;Z;A,<Xd/T0h]#FB,&"/Q[/L^Vca2TKQ55)
37^FP$^tudS>V=s<hU<[d_Lt,#mh@'8fnWbgW2NUHis<$.YFTC6b(J)Ah/JsOaWQK)F\p'Nd'o;QF@oG
QDRSS!@e2M"BjlT$;S?%9h:4TY)u`l8PG(l<ZeR2aoa)N@n#<1,,p^t"2m9<.^NFgD%5R`d)4a[;$cD6
Eu#M(LZkKK.'l+.SeYidZVkW&1fA%:;hiZ%g$,'\C.Nj:Hp;f8F2(UVi1-63k;1Y$#8b"0ktS^Ko1`eU
OA+)[1c6G(WP9nI>-0s]2g.jc*GZu#W\j4?H_=I5bmHG'R_,93H9?M>`HFj^`Z`dA'k-"p?C#e=H"[A+
$A*nWljfQZUI<ehTRXpV(jbAtEk\Y<hEe:Rlo1J&,9SCKFg.f/R>X;_3]eSQ@?]BtIU\DLSt/o?JUXKF
VcdB3Eb%(P5^u_pfKe##Z1qEFohd$je@OL9lE=D6Q*4/gh?(Fp^=%#3KN>8]rc#N3]:omMd/DI]GlD/C
X3(8ACSgtJ^O1K#?INGld#r8u,R-o6IVU*JTO.0*D(_(PQ0JO;BQ02.9,fA`0*8<KfT+2ESSr;]NZ?,<
bs[>]&^WlCa"Tmfb9$2_N1S&n/UT?q*Kg(a+*huST/fQT=Y#*PR3d^c;#`I0VW;7<l#O0h`f,j8AN9RG
Zo=7!o,6cO.tOT\GYH'WhVpoZNlmV?1FeCSnO8t>5JJWEGQVUO/,oO&0('KnJ4s?.*W*fWCsVDVPJ/^?
!5(Vf(<.!t;Ef&N[)L!#Oio,EA_%:*Vi7Z0Qog$0oo?g$j9[/&"rspdougprKD1OlO^Rb*5#>^#>ZcV"
5,bB]#GoP_g)mG$noG?8*iU>724!&CY5;0t1P\b)2B\EVDZ]UUKt:Xdc?Aj*H$Zon.Nk^To.hRkc@9Bj
5;O8p;LX-ODlm48JIe:X*,T3?Zbj>S<H8-I'R]Atr)W-9$=q_iH0Nj8@<jU>H*NeSh6!F&rMJj&D95k^
ietdq-@Aj^Ytgf*jl9@cG^WE,P?q45PA[TTJU2fE7PuJgB<[R!\i7dUO?c@S/[naZ7[$)C^:fUnh0_DL
5TY7p$"PG0OK_A#SPcm"6KH(080GiGXH5[Pm2e$[e!GA,OO!?j[7fXQ!pKjf8g'YkNfZMnV&9n:kXqM`
-?6WVqk)NHTKsB"Oi\q[:7kM@cQnUk'mOMD;hbi0OKI&#!b(`s+b@r1.6f)>YfdWUgkLdPN2=)uW&$Io
>)RQTrUTb)I<iQ+NYGCX4rklWGe.NKIE2&oc8Xr6\GT;#EkB.qOU$VumMI"R_Rh'lcgL$bll<&@d*jAE
\&]MFKLfXX'h;mm-7bs/GSaKSP:'/qiR4JrbNE]VZ/(JM=T=.p)V!>7;hq8#-rAnO4KX?&_XmW^s8GF'
ohM-t1[p0H+:[AcX9>eS(K,h&]USYSR=VDRG'NW47%pA@abhh],=lAk^'V1u-!Pp1)skXFY4c2U";=qU
oKt:U/*4Ph7l(i(2Z-u)n/"5Vpr^NX?M,#kX/E2MA*>AJ4nY&m?M0Q9T99C"`iH![q=CS`#[]^u^V+s9
Cem3*[T>V'[\o^K*aUuurP*Z9n8lk;2L]ES)jMR^nBa2Q<1f#;Db?JYYU#_<<OJFFCEV02^f?JV68Aj7
E-1nuR71@^Q`$.GK'-$S$[iaP'IUNAX>QKf%1D=D1(jTU)TZj^^K`li]'ipH55A7r?'/@BRj$MSneG=:
g_oq_BtnbnJ_lkrK33P(P'Gp)9_H%Spmg5cT5gpF7iGXS3UY>!Q#XsYX:3ok&]9ZFcgk*pC-"7/=7;Q9
:l\RG?_O>;:I#VPF]ZUmZd)Y&Wa&?nkbZ&Qc$\q'?/0LFc"aPI"*]s3VV<_LJfa=/&0=qnfFKIfaf*Y%
."$NLZY&23It,AdD1sW%f.XktVf'*]q/Q9SN.XQF2E(LaE+n5nE9fpKW*iOO]pd)][L^ogZU;6--[i(Z
\F:0QgY&Y\7:N;t+'UNt@[RTeX%IW-*`uA[`1!U'B:2c3L-,R-2E@M;iLSV[W:>:Xd*@\X[],H[/,]IN
;/74*h$H%)k*Qt]D8,"r[G`d#_qVcIXD6o5SG7#oj#A&$P[;)TSl@>'1ogC8r6pLZk;Hf"UO^XF?^`hm
,;u>0pO6=h_HCQ%pr[68raFWFeBQ/\XVEhQ8g?oaF^"1(WqeqL$c"4IemajRXgM@ST51RE.JtMU-(Ui/
CN\]AX'sI\q9/,..hM/c1p%L":#S#3R`4qtoWLLW-5]HO\$\e:;JX7]lbdWB4Mu*S=UMp#U!Qu"gXT3L
a'G=I-t7m6/'nX<$$q^UIM:X:DejhQiA^;7\lrlNk$D`'q"9%09amNZamk/D"LH#4I+)921(g:HM'_]8
kBHR[q6hB8e8Xo^SsX0\'o+sSgd<1Ji9)6kHY2>+m,>+_eOOBaI0?K3oF]!7O79WPO7:DfO*"Qp=!(j(
66BVH6Q`T4LH]2B_$g7Tdi$=\^W.F^N.+PYljn*k@DDSps#Hu5s-2sMhWYGiFjm0E_]eP$KD:!J1b6Jf
3eauJ2KN5NjGRlOW;f8t*%!3(56am`a%1nC;&^FRSRd!)$5'[He^'_M?cg2]6M,),2.5o&jI[2fe(d#]
k*=<^5;(g#Zdir9TDFFFOj[Ohi"sgWZa+RTlpB%!(4*I6EP#k+C$+3k%]l)!JXO,Dq9AboWS29k@b4OY
hT?_R@&l,Z@6)3eKufkM.mHGbGcUH1WOuTlC9&ms2&CPVc2q*Sq7-%Y-P,512BKaXGD$7lR6ErDcI'UT
pqGu0BJ.h;ZSgbPosn`$218[:V<3?m22h,JlggIZBf:s-r^>IUbaVD[R^51AX?#>l5Im]Ni0MGS:AYt?
mKn9OVe$M\Ik42E#jtj6eK1j&2*p$(."puJ8iX=.J(pN@g7+'dii>lCa^1dt$AI<HVtE9aVr7mT6oK%5
=E>c=hb(C,"P9_8T_u%VODR.tRKI$C#d$*WDD)hbCX.BCG*Ta"X=erZX?$!Qhg'&/KZ#Dts#F6fp2Kqm
_75R#:=5V\Pt;Htbo$l#ag%p-qk[G:bc9OOR^92d29-c74+klTIJ4V/=EA`$LG`.4Y/78#8%2PeH7l<[
r\?<7S!hWE0lP[T.m2X2CX1::FbF>NnX&k@kh4j;bE:]BZ&:C/(%/6H>:2duEMBVi]YcOlo1OFq%N*jh
(?5,js66;,^=[JMfR;BWGi.@Rb]mN#/#DU/U=di5/uZnK@(W*$Q2k:0ZH-%HpiCG)8%-WOiPLbOb)4`7
2N:kSg\#R1AL1-.\HFf4]!X#"!@R6T,dgQSaapH_pS.UdPo3\K^Q>574$E5;0M6'N9gf;nX!Y/m:`*'_
[MG2@=hVZY]*+nh[:P!dc:_Dj/4N#4c=Nu?RdE@794e0f=3eDE461)^(N]2KTkgr0o<G>H'>gJ$S+!D#
NJ?"o_O:3]1N7VsP1K=HhGdY@<B6,-$g`Mbb/-%#N(^bahgO.3lrB+tKBN>-d(TVTWN$AeG=HH;_C?oE
#\QK6cFe,!B4'i4=9GfelP"Qi7Q\t[kNf?-oKQQNk@*D7k65G\J\"VMEVW$G=m1l=Zki0\f(@8MF%U-a
NAU4*3n31)I-Pi=]NZ/W:?#ff,#>bg.8-Z3D<:Z\Bi+s.20,R0\ZO\pV8<s\mQ"2<pOd7OZ2g^\AT?f)
WaW58q9(a/!EtO_(4<O0.1<Jlj-0^\4\f.;npdBVfkDSq<?P?'1OBl.P,@!7S>G?@WhHXuM'&WHk`]:k
'tD43$[S)u*2QaQR+n[WqpE!lpTT/D>$ZK?UOSf>i-EoR21*lX=e-O^S?ee0o5Vp)GO9KV=k=pJq>?7.
P]^^VZ9n?Wm`*'=YP;j;XiQ\XNN7bG!IOp%V]S)MAs1bYlfb$^25WlMND'%]>foBWND"25SZ4QRAPM2O
0C!Cc%)$F]lMoDEK`<LpWb3>i)U&eqBD;\s'uM)opBAV/s+F4c5I#.A)b4"tRm]-&dB\J*1kn4ImSKGr
(m/`q:8-[Ej1<+M4@MPYMJL=.V15M>Dc?uJf7BqSMBPFGUiosf6I&pr,(HfUAX<1oN2E>6G%HL8@^-M.
9-!!F?cKQbI/So$[K8a>.mOa9icQLT:pPO\(&V5$-.jRHl+4q1(p^^)\!<*578(`^.t+6ENiZu5Gf1FL
Uc^.t?#dZp0cl('Al,\"d4`?j"fB99JC/e_W#SC1i[pSk;Ac;V_nmUHW5t8`M[/Msct'7@q_"2P;sAuh
MFi;1PYI<]NBidj2'6r/"mW+6&=DG.r2%s`pU8VGnLS6n""2J#AuBg;(#$fPD-l(t-nD[)s40fUhF\s1
4KLK"5n_a2.^$ja@(=Q2hc?iR;:A2rs#n)$?f&eC3mjtU4.ZaoW#Il]jsrF3=q=g<Ni;d]<#1Vc<dH+&
QKsP:pI0lr)LX_:Tp2/c:YX-mTqPdJ[YI%FT<4F0/"]I>eaSr?`ab0`'2d/G.$CpBAd!=ZnrKp:(S"`j
GY"fH]4`?:B:+%:F`d-0WmU*t"5I-.g1G^BF^M&dQ8KIRX0&?#f#kQBr$C?DC`\sip`B$iR)nlmCu4_'
CE>^31Q1PZSCuofKPX!3_<gV\ce?RoP4l@g0rF$oDP3[Q4b4I\^bsJb+ePQAPn`i6:K=?Mefm/DgmrZN
MoCbH.Kf&gAMA$;5$Q5<BM6)u>*sUoBOQePX]<YEhING7-ZM`>:acsY=S>E-_,9Mee++Y&1Rs%O<MC1t
Er/qLAL97bLaoEg`)nB%)lni<o+Guad7*Q.j,]+d#k>]@Ia#jHldLgYa6MX3S(h[_T?]<S?*9JMCcoXH
g<'bXia_d0]Y`Z+.-!rAoW,88f%Q=t.4\=On(HJ*aoZ4()fn;&?:5p=:bHKA^NsU42U]$DEA^a(iG))]
*_;Du]g#^kIA0kmSb;>)kt&M+InSB8,J/P+1[=;JCV!-%gt";7ANoA0.=$f_Nbt"C<?=r6`Op"Q=L"*L
ju(B<oIPGJ4A$*^-!Ta`I:jsKY6^9j)"NXLMheV!9p8]8A,]$nh4C1G=7tFP&R*srBo_%gJ#tU%.3f:o
@ombQQW2h]R6($4R*15Vq-NGgI!Sr`m(mO"*s\h*4aT@iok/&\8YendSpu;sn*oMT@_0<=fMCqgCc);7
a7DY]s,,i`c+30kSuUrD^l\QOFB-Fq70$ZYc&3j=X\5u%q:p6FITORpaTajjNL$W>q!+FKkLq?5["os2
3/03eLRttKo6k3<^tfOI?,E$jna<%_m#l8!AJo?.j-IjSmo'q?)GPcVV[V?[JROE@0E;gU9dZ"1bEq(d
r%MF_+eGOcnPgLAWtN7_X][cf./2H*75YN`'^[3iph"+U[E!8apPeS#Hdl)(]pTNqE#6R4*q#oaZTKRM
.5XQ`T)B_4\5,K(e>a#b-',lIg+RP<B_BMgr,FII/bmn3+ZWAKTKhL0QQ>7kVA8?^0AdAt1tbnT^<__L
C0`(0YP)>]+`=ATitV40-f`b2E6MuYPPC$)>`o2pWZ4g8DDJOjIBk1HhUG79Y)JMog!Mmr44A%`Z'uAg
C!kq'Zag8MWAh`/Cu^@O28q<91Kic[q04(J7NosHX[_i?4ks3u`!"=h*`gT&mJcOAcUBpR8Hp%-:`7t2
<(4dK$Ca'J_!/E![']*e`N2YO8d(Mao9,O@27$nZU0;u>6qj$Ue,'eiafO2*6lN+/phVgG/npT1n$2Mj
@O$_T*#RAjFp,d0;@aY-=iD25['$33CK3s49W&V>X#k6$s0J;.b[lo*a)]uHUhn#.OVm8fceqEgCALr8
B=i=he[+!UP+jh'B&BoOS,1<]f8iQh:%Zo*6F+rLC-GGJ/3(UJRb!?7)=siF.N6cXgn?[/I!82,h09@+
GEX=AoDR=(ci'lr^uF(9AB-G79X4b%EEirg,tVU5*P=3R>3GH_0q3['L*>5)Vl2kd@nuauZ.d)(s%0J.
CCSrOV`:kja#&:&bDs+iX&^$E]7.Q*cfEM\Z@c4hgfB]Y1YK%#&ThU).W.+1G4<A3O<'?dFoXa<`E\k0
#Bh1S@isHj%P*7Q9<);Y3*g!sN+ZT)gpM1U0paF\QQ7T'JRlk4a-$F\OZtH=<Y@!olqlK9\'?:(=20.Y
Np*?SbjH3bm$cJiY9"q/mP.m4HVbcY2'+q*k0o)[rm(;f\Y$"YoRk.WI^dZ=gUhi4ZWc^qaie+\qOudI
?#B2(I@BK1RV/Y"LY_nQZ5allCOS'gmkH&!9u[TXf5cPRkq:a'+,gB*0C;JUnp#V]k8+^b=J'os2JZ*8
G;%&XmEWE#qk1X7?`\1bD#3#Ei>pD(h55[:n*]UI"88lBhn+oVGB]A_VS0URqjk*<pQ,ksFTJ@_[W^i*
HIhiYl2S8>hqme!@:\SfSmcs^o9)K0j",o@(Wc;&nPeo26hBrcmI&dnSZ?1CmM-X)p[6nd<NUC:WcRVm
f#maT*fn"7e]Ub%c`qZO?=BCCp1$8Y^-0ErX`_:a]B`h<UF8TqGXeZ`NRAXg\UK*HmkQ)qq;,]LB'`ek
CUV:?"n)9@3b.U[XiK9-CjQtC`86J4=+=-Xb=rSE(-KFa.\!?8LXpt0]7FH>rTR1<[4hSBU'(oqOC7HK
fUr2$rV:q0#ihQ0\)4t!LF3Y@YsR>\i6&o9])="i@&i:qiLVo9P[esFDgF[`@D-#lq4&K!*V1sjmlqeg
2R5C"%<T\XJU-P%kN`f9qs83n_S=IO_2UDI7Ga#!+%`jsc%D#r_V:RJN2NP2dG^aJ=1q0spPsL@TkB2s
B^WWG4e6h9Q8b:?h8F],Q+esWhBKlGJ.0-_Nh*h$.inET9BLjihFh/j?R<Gjg(2]Ob5s2Idsn?4-8qu$
cGQkMn>eH?84pBJpmg5cT5g@>`>LTQd<,P\'c-<c"?8E!?5ZcDa.DQdem1^&1YH\%&hSEFK9dUo1_d!#
fY5Ko7us8?oiT_66q,QK21b)C=eS:SI`"3k&>!(%gcY/X<fjSrl`P/'(.5I7DANimdknH*=dC9$W*8)s
etoS0i6G2JZUdj/9t0fB2imJb6?Hmg6^B@=3],](Z,GI"PYo*dXtO_D=gtf;^Jd)gfK@e[!pAqAW+](U
U<@&iLg'`Y,!&`k?A\,MeW4sEXgb]]YQ2D:>uXi".'UqA`2qkMjP!/sQl(]_g1[>5caA.ZaJuWI`d#kX
08Bs0(Q[CmPCJ.9,Pa"Xp,OgC4OS`L%J+j6TGEO-qd;DI1%W'K)h.FQ,`N0LZ$aG)-^fFR[pi.&13=rf
:[tLMNhn@gDF^2N3/?L!];VRL(uS75B[YZg7+D#(XPkElX_Quk*1:8qW*.R0%Lu*4OEdYYLVmcR]anb_
gIh2kGF0(]Y$TZc4Q[sGe]03mmBCaGbGsc/ihfj1g%a"u\#Q_!-D>63@ug9E8:B:R[PHlrqpW80P`.h<
lFZ7OD74aNnAiL:#Q1r>3C^Qq=)t+)h"eD,D&0m6IcoO^4s0Vei1ZTdN9T*80RFMcl',(joQTPubQhDg
.4Cu:h*Y'ckA=Kq5a]aNrIu14KN:'IDl)*m`&dZ]`>jjCWdG\Ir`OASH/FHtdX<og"tqT%lg((PD"Z[h
)8/R%g-9'g9K"nk*E_ROqh?1Sdbd=YQf;_khRI[RceeYMM]099.oUd@`uQe\4^,Ru=^?Nt;Xmb(-n*>`
\lJ4\=3GHW/^-(sN0jnpU5c!n3DZV:\osZC9ce#V/!"j,/KgKlgt!8389'J85Bof&U/CHF>".c:.?9pr
>R[3%9m2Ak+JL&CGY2h!YBWYsDBuBY#enJ\W_oh))C:<>e>YUh4JaZ%61GXhCj2K1aE^B`U/0qq[:u3R
\BWq\PslmfCFENOns%:NLt4#G;etW5Fa6SrU*8\KF_Z>qV`5H)5_NVRY#0Isg>sd61^Ik+bq*)CBmdt]
*CkPKPjKBn,\ThSQbZ%rc1P-X@X2\VR^:'+F1pqJ2M*\!@;.]M0uYl^ibr`@)=H-g[f,2)^,!>;XeaVr
][\:o'&M)X26p!W#M2]_OrHkSB>Er.0r`k[nf?YuGjCTAK4`i$,e<LY70GSGle-!"g+>+3n8+@PZdpUP
8@f2*WP9F+mLlMI\/&p^<?^>H>Pr=rC=-<GZT6H>2p^(AZ4(X:Sp`8WDZ/H2*Hl!iOr:ju`K=:+%m2]_
>;KIM^!5_A2pP+a,eLT7C[X+9e2*F9btH<j[>'.B3%q/dVJPj5euGMnk/F-3j)<Ds_HuG[qdq*nEp'nk
FfiJuFWX6RHFXe@I]LUCd5kQ/#J]YmO/SCNet;^h:<75?>=VG*(R&aKkXk]\%uo09D.b2`o@lIJo>ORL
P'd"AheiV(F_f:AD[/'d0#,BID@(bRP'E2cXX!#<,=st9rn:'gGi68ehtAKK(J!ki%lh>k]^O6P7g^3Y
^7/I(D.hMdjgTYRIlY8d/?[Z#CDBA,/*-Z5eT?4IE1Zgce1]_TrS+p`Yhol^ZXj:)`[<k8'E/8BS$5-W
(&RTPWo*/=n([=-bpJ'`O@I4S$BB0D^X'5:MX)d1o%)e1lrJUej7t[bJ&1uQDW)p<]fe%X0E*lUfP81:
<-%*RCPj#u;3*RK[B/H82>q'LFbbK!Fc`^ukGaF2"DS^I9eXbskS+aT431mVOCiPGmjW8CUV_65Y5!nG
et#uq)0)&BS;8mn]JVeqajoRSD^Df;4Da%k=*+"/0;BgQZF)285hE%4]PU(<3I\'JcMVgdK],%9P88$;
0Ddj1rWYeR52P5IiG\LK/QVm1qRb\C^O7ecIsb1p_`-r3Y]\3d;8XG9K@P;:WA??.#+TIfBBqIul1FFU
S]pG7r]Q1F8\3+$:5j;BkFNaD[cM//kaej1eo`"'[mkHgrI*8s/PX%NSPs,d5@u0[Z2<49@BEPQg@e8<
\a+ES-8es`1:$a"%_O[h%'3:poBu%gpWh`HeuJ0aq,t%5c0Ig?rN*k=fC81084b*WD-`d2W*].j#T)<u
^9b!DZb"=c+hRJ1=sL5D=LP`dEc9T$QVXjN_"`r)cYR4'XCaBDM77@?[rY)RCrssij(g+'`A:"mnW./_
.`ji7L9p=:eerj4aAJ,l:.QTVJ$`6_'>uc<,;*-(a3&DB)04^/NLtbX%:7kQ]mkV+]KC3q]*diGEL+Qa
8l&'-@QV[XAk6RQ:2n%WS!B\'5[*4H7cIUpdOpu31ZZMZn$V@W$Ym%2(&:GloLLVCR`4N%8Qn6q1(),^
7op)ga2OAPEoad,BfXllY^+-DA!3QtA6<NEjhZ0g\OVobB+Fk"GbX![fe)&;6HjClZoK\76T<ofi[Ho%
p#iT/7Rt'\R?.:`YtNm0PTsI)7D,)r\;4W/D>6;H-PX2.fJuE0k%M+KY"MX-<_9mr\[mQNpD&gC9MP=0
Wr8Z>I?92i>-$j"F&A_S(Q/MC_(4)FWP=aUjD)SQoZj^E>f>"Fd"^crHGMT//p>4CFtk<l5PB=NibI&5
h5LfD.hRJ<Vi>=[!pK&ZbaXnUMco5)4M8p#Zk2o@\(bX6XkPL5BI33]2O?7!cWXk)GsU2Wh<Oe+>l1X3
2Ye/qcno*?E>6..8*a!la_kpU'h(!IVij[r?YU+/WdMC2%'mLc+8"+Em#0FO04d?3p>%-BME@\OPWXqQ
L95>6c?WD!?rk<YUEV>u7<;9P^DWPU<(2N=JW+6.q*\`FZ\GsgWLAmLB=h"5B:[rG]j((h\dNLFn$g'_
>$V1g.;F(nRZ6R\,i3CjFX)3:b:g*a9$H!rXt,p,e>]Z!71MD=Wd;LVF`c6#/E8m8V8/rYn[C"cTYGdK
DbK:`nl>DsX^sr`K[h%j=''G?i8mtD\Y>rsH;XS$?<-NO`kABXqMp_d5:uV9r!LnXNE2jJ3m-kZ(![>n
\EO?-Z"Eu!s,'P>2?,<)H[4Uq^3_cp=)?cPk?i2Mb*WL:ZNSc5\,BOmjW'<A"!.3j3c.pA\""Q4lI]-f
^U9Wigg_8/s'-LgDWN,p<-ab.T'#W]rC-H>:](;Jc[T3Cr2o!>bB>T9I%Is9hif]l1!:jl2@3^0+f_a:
cq;&%a^]PQc)M:i'lRd>f#^(XF$B+"hUp)n44Y'`fbLYsoc$-X*ln(Kj5&kQB?bCSZ<JU5=7!Q5&!p64
8<:Ybm-DArO85r6VeFl:/O`ECC%;q*as2t3`M]-]aQsg-A4VK?HBq[qiD?=gO`CeIT[?lPhC4ctn-<9:
V3Al'C!rn`Uhh'WBU#r8o+6$3pd#A,)*"a"i&O,1G/XdB^?DjCn(X0"odLt073<s7d,X8%Zgd41hN,A:
,78nPkEB-DiLKQq,%\.(ZYI(AdtZhSKi-[(nVWkq7[*6gg)*OVY#^$om67G-0mp1/Fh6C'g6e$65oV=p
-LgA"FJ@0;d%q2h7N4u*g.!#[j)`oko;OC%n^JjSGIq"bJQimC2]>C1?*n&3&?G'jdY@e@B`g:T?<q:o
=N+<jFNLA(gX,e$X*df7)igFH$la&BnaIh!Lk7Oh53'(0cOtP_kgIJcs'GB5eTA\a0@T^od81?q3rXX7
;:0^[6s4[\o?n:`ogemLZmTY0pV"k)^S>]&i98LoP[;)hmJ6:4>)+RG%4JFC*E@Yf#K*eTH'F+%]Z9V*
6gs3kWghqKQ01#P;^Z$Cl7Ui&euTg[W%qFS,m%O8Pp+=^%Eu/XWbM_uAbE"cQDc'4!+n*kUqdd]GT.OL
Mu>fb)T&i)mtfPtWb!^m=*8Ni2"Y,1Sq2DF[-Bim`5:#T=F*fiEaDk*l[sV;j7.t'SN--X%J6pZb\[!8
oA-gTcjs)Ko2a\:R(?n^euHW4"V(#qRm!J;`:Kq"-N%k'<Z$p9(J%+fOB1g(WE'!QlJ$T"iD!YXbNF*A
je^WLarNFR&SO?&A_-;GMX>]9SfImh2[J;J2#<O[R#tX.X)?[bT25bIMdP62`UZ"S]F-pC`oAULCP4bd
7n:es79sG9BEKp9bhs)met!jRLZF2qphjIIn[,o`lqhc'H8nRDWt.Y"AYBc_ph6]XkSW<,2A/5U3cR'F
pL[O&?dW2F@F&lF_;Acf(f(X#Wd(LhTEQdVGR2UCLmC8@FMDprfL6Iq6?!]PVU>C^=!r!j_[eYfVm*3D
AKoEJkZJNPir1NgiG95sg^aQXjl5L[a)79OdHMI`r"RSej,Vr?Atu\m)0a1?J%,BrlocIj*#:SR=%78<
<c>qh?#S^Z?!2`o^/G8@\OnF/*N1Ft4YR6ro"CLRX<+X\I?>n4rLJs50$_&9)UE'6j;>R"Hf:<Na3EQK
oZE*ma(OO#)4_AZ)g^\o>\lq!r(bGEQ"5l&J^ET*3l?3gWn(fjkhk4nbl-0S)t`8:/f3IkS]M"he>GZ[
d7Q$GLu*R-TrP,*NQ9H@%:hOQn%2bH;N00VN!!SN?'i/)L+Kqi0[i;_'li%jM2HHi1\A3F`f&8N9<&jf
LPBUTqeaTlP;t-h])?tZ!]"r(bmI)PIl^ma3O5S0fO(]cnY^"*ZfW14DX@ljn7t+n"?hCDRDin@H=h<s
MLTb/m]Z#-B+0J1F;Laidt>$+nKO-eGl[lAgWA#V%#R-":J3Wn(WMZCEagiK3+LenC#>QT&sG5M/T"Sp
Uo8"]&h71^?ue#M`&M\9D>'"ipjkM5cB/$G9Qs`9kl9kM[BL>risO+urVQ[DV5jCB%G`*L&WN&1#E,IN
?aHosCq(*heWLocs$/ePG78A%2)R[HLMTqhE`#TiG'd4bcS,iJD.V1U"#UX)IF+l=N"eZ>J;u+uS%(pV
#jHWHDDfNuDaFF\l`_BeYjoTObZc04?G,?]2o$$=s$/P:NE4Q1A(A.OHJt+mPL\K2-RMT9-Z@5o/7l<E
7#fAf7s2a<j2P^JY"HJ]Sr%h("dJTlmlaWk1%T^IWgUXsM^ZiTQ6Z%,QQ<2a;pc$UPF%;CX\]\bjQW@E
<puTE26l)uB756g&'$Y,A)ZCpG[K7GQk4gNX!=]XRq"F4f#/N,prh:Xi6/(D\TI.IJmMq(f,p)T;+d's
J%fB=SnGLAR\JRr(r!c#78Wr6&bj`oZOR8,3#,]Q]6O8nf\Oor3bf1W!"r&c2bS1D!M_dBjp."lDmAnM
79D7f,S\eQ]Q(%XJigkbOqT("*:^@*)cm4$_>KM7F*3*QF0oooQ)F%$lf`9=?GXZbK-eO_/<WKqK6:K\
)n=+<3TfPsY)ZZ>6T<BOPGD+-G+C[hJ(m?bgm.9%#ITTSkU8B2l@bW$W0!S?$KmbgqmB5F.LNm"Ldo>i
]]$_*R*4.G+@ieNgeC;n^QP+PRffiHk'Z3D&U;<UfRk/qi.+!)khX9s=D(EJ=Z%?k)iepN.3J1ddg-cM
>gGIpL:Ti/P)$'dWX:9#+l:Wn3l7T/_L2Xkmk.-?i=.-4,TJ5a-*IC?fg[!B=^7;JnWsQ3"ADAB%Qb@`
Fqt0:3:ije!-^`fB"4ZUB@7>RT\SD\MTBXNaHc#@J&<VN=6'St7KWOQ5LS0iR4mF8]5]4L)J,%HGJl](
.Ud87BMb7Lj5/cNGY'+3J@P$C(r:p,E7_pCPpcVT[Y/V.,VP2<JP,Gl5i@'"C!k[U3!ee][]OW&JP)l>
^X)n2$*j@+@Y>k=jg*%279OAr&Z7'bm!5pPfeTH$bW)Xk0D_'D(I]#('0:2K`:2kJs8M&^J)?^r7q'`q
Rpl*Nc%mb&>N'mbGr+Frem9@]]G^5Lo2`dck08^+\2U0HFIh;,6]pX$\sD<1Y%<(h4iIn@6C77%`0e\_
427t36J&MU6C78H\uoW%GgWoMRr':WDHXp'+]7$M#ErUQ72C>6`oHPp4[\[ss2jZ:Z?e;hM,721oe:V.
P9ON#+re2]m3hK_'2U$*'06P3M.6pgNm$LQc8Is?*#MJ@%Kf]!8a8ZTm=$JQKmboh"&Y+51H4Wa(fIL^
lI1)1D&<*_Y+j0^'\)#3HBp`\<!DR0Q,J)$Ll@mU)N"e"[#@90\ind^GDeZT&U5-Se>l;V-t['>@h\`D
8:@"h<n:BM#;Z>O[/s!aoX>+.JM!gF/(tVj56;X%([(QPa2g!_:Lm!PM49(/'t4;#?Tu6"0/N618DJSR
Aka\n0lB%K^LDOrnN/ilLc602?SLMY5I'W&&[n/u(gfCnBnm(^[TC[:-ILM&N8EC74+u,$fjs]578uX[
=<L)<i_4uE6TbB9<@m;,#pENWfX$bl>Bmmh*UW>4>@&TK$FSW\aou$TXj,TcGS4Ya[>[I?T)3dK'gD+i
/Xd!'^T^2bU7M%P&7s2EbihRK\R&_Z*W4),q<1,H35IKUBB$@47JFE.V@%#]2r2=PME'prXJJ>239$MA
HD%oAbTi.d&oRh2BN;h'"ZL`II5L1@PbX8s"KH%ZhDFlm@lLKf*o:IWBuBEo\n33eq1eDDS\WtNM79Si
7Po2Vbeup7loO;CI_;l#s7Hh.lMZ)/Gi"KfX?N<56*kh>'+t^2_&%q&P7id4'ejXp6S]3Qg8jelM`>08
nrm:F/T\Zph<("?mLJC4=VDto"n6Z*L-gK7V*6iIFMg^.lgui;XAfr3c`2tJXOJ^Ma`RRSc,5B]]s`K#
ek%M*%(@i1CJECBf&`r"\n#A8X[>g`-f'ae-*6RW<p2;XPbdCHf%DAX(IlJaf<'A1f\PFX.>>QA]:j1/
3BCDA(,&>-$_@:&<g_h_&#.cus+^&+lY\]-\<N#?VlEfp1/[L-<dLKA%OZnbmKnP8Gt_.?*fDpqag0nA
/S'+&FJg68:53jP+lk2U>2<YmGr#Wba07X^b"l4b'Y]/hfoTG1^]!*P?Q6$F0se[)L#G/Vbr`"p;SV0:
'E/*b+YG^*'r@s0(A7=<`G-)-L5nZQf5j>1c?r_9ISO&jh5[uk^'do(9fmjBPbT/tG!:"b6bEGZmkpV<
2'9StKpF5@\i)uGoV"&q=B40s^k14YiLZ4f\Ga=+K)b&n=(.(Ah+MH`aCs-@V1rL),OO]>!p[DaBY0a&
(Gs>N^IRZsh&L!EK8V!/?E.3RTjKcODmK0Jj3!BU)t(oe#T;D<,GL2o`"=TXVkR33<t5"(FS,e5HUMC_
-A*eMXD@2@5*Vo@3Dc&r<*:*EE7QXR$ZT860pb<Ff(`Jo0LPT]$sLMNH[BgH^e:=^[VD`-gTr:FUh_C+
[cb!4i,Rs!gj#K\RD9jU\BMRQ7[%/5gHiUrU]p639r#_&bE%6UGs^>][;\K/Zb!/>UO-Zj_Dm=ESIFfi
Ku:[`LW*c<J2]lY9dn9jg[(l]SMR6,%!_Y>k&fLal&&-ON1.^=(RIV4r#cnt'<g0_RM=Rh905.4p_i(I
f*GW=q`Sn^S$+r[hQ6^lju#X[#>Bu5\kt%s'u@Tns!5bMMpiOqa@c-V_'9q=1\_rFqdW7%B'JWIO^6V.
[&5s+WZ7jG(+o(8jj;e%6q?)rB@0eh38[aY)GcsM:Bhi\]M!BI=N[*?S=t.c%Dt+%EH.GYks?4^BEWNs
Ibn.E)12,.",@7X><(*TUX=5@T\55l)A#]si`2:cPtMfjK/E9:'MA])PC>HENjg'PJbR!DIo_s,Q1$$.
622Oo>p+E!-^/Z4>BaUfjg2aqW6TH%_r>F@Y,Fo-2'VmuL!FU6I5*lgl-)HpY6?apd5i(,$g/;(K%5/:
0&=*rWQ#N52(DK8qQM%5L%2SDBMI_hjpTu`,nFus\>MLm_kia-\j_k4'kO`4m1@8P%%S<S-sY*?F69fo
SC4;tIYk2rAOFDQmKg2*q/2".>@8Uc9_K-;FVY+A:F4bBa,#(pbEO/Q."'DeNG$?l])5^>DL(1JSP64s
Vrnt,`7a;`-c&c-I4h#%T@g3#S=o`uH^0a"$1V/6aI!0XPTVQ>DJ:NRXc/!/&tS^7Yu^jY6gq8B^LH7Y
g'KW:9M5&)nU2I-g[Pa1n*0YOR.iDe#DRjEVqO7H2Yi;.Ng6d>7M&4pO&dZG5b/CS,h]'FEU9t3^KmRT
SlU_tD"_5eL3;Ds+s3^NbYCo^8qak,*;b7Ts.?o6^U;7=&UZTbS.ZueZeeV)?=B)sPR&`5C\T?@,M+@R
gF3_`akLBL8i3N:h,>M^+5)*8<&\)9Fq.J1:!u!I6;D`1Na"C_``"(7L?`(eSJ!+/FB1UP@P+JBVaQ:!
PR(Bh7^`BaNTWP;9P98YM0KV3p2cm];!<'uM3((e![GUm2a8VZ[<e>U+_YHB;^,JE5Rkq4M%&-A&&uBD
PR,krd+#=!,$\_K@n3ZLMYr_&jZDp\hr?cb:A/DL@DZSlbITuNI5'W^31k\Y?\#cR(G)q_>IO;]Iq-E`
]scC=DTX:Y_t%!Bl;^7-3F[+EEL0_&l8#C/G<MUTnUtCmR%G+M+i6nf3+@%I0D=:W`2ankh9:ML1$WU)
1odW.(T4/<#V"1D0nS7cQst)4;G\Rm,<K*F5D"CX?42F?)eNa/?m//:=i30T*lq4^WOcobdP1<!GZZA0
-F,=M7"VT/\NMLo#"SIT2HHc%CFLZ4FY+EQXYH&=a=?k!#!T3SM,lSE7R=]d7)bcE[R-"c4_6(tSVlc0
\2K)n4@3jFNpmdlMcj456#7Dt6CMi,WHnUZ<c2'O#n&3b(!fGpm[hV>#e6TAK#Q(9,NKMXUdCNJQ#<Xs
_r6QZA1,(BlM]of$VOk[Wp%%*VlUF=Mi,4#&mUaL&>a@eXaW(4;[2F>6>)'chnk`5LT-d^:[hKq#5a3]
Uh-M?R\6K-D@1:e"\k4lo/)-*A>P-;[J1Pp"roEc#fq1L-(?'$H5EXI<iYVJV7eT)47]phPm+MifObRS
eK;ZNDn@!Gor>NS<AhjhPthj4X5$`e$ZDkSQ/T?gHi9Y>euW%DanBCt,0NY7S<WW_0HJG4M6F#J3Bp1s
kH([M;UmBnb/kf$Dp)!,b0aL<6V644339no/#'V_9;1$MM<=1h*IJZen#a_Q6<VO.Z&=42=.AJE@JZ#P
OBH&a7<oh&C,%`F2X>E'[rjKggO<:N;mO)<R6s@!c,qeFeS-n&h4in2a#>)9]S>=Bb15314Wd2X?26MX
fo"/X/YXtISb;=`bq,G1e/T0&q/kIZ6+V(.dT7/jFSa_ha!pUO[nb%I]q$aEpTCrF5mkd_'8m+%rgmO@
9\Qd'8`dPPU_m[GfH=cuNiEBC-u<4S[AP(5/&iMl.=Li))c,._8:U!eU&Cf"-L9'$oH*u(<njOpMLHGT
Hq?\Hl&rS,6dbZ/e8)/fr@?$(g=`ti@Y;'1PHqZPAqj<g%)H]XWE_&bV%QbYY-A(:^3:.Qc?0s_RJa^t
H5'l2,ZF!TIWC9dPbEBa&_(CjP!+uL?-W)!@p["FiA[o;i[e*Fl60(UleYp(;d$Xb>'[8<)3^;uV9pj?
mD<IB<`r)),:j$@#?m!(%*\%"q9'tBVV>7O<\$ZT2!quU*[]p3\hDWY@^:8^rO/`SoO_EKWBg\g?-R?9
M$'>-4c)&;VYIPr`04M,T1d>WAuX)%MmJt:TU=%&N`XgMM*JbbbR_ooBB=/2c`p*mNplk"cdF<r3lUoS
)C`a91Zn<#M02lMC1'bF0UX7;fh)BiA5W:9]KEMOm9edfF4lh^oaN^dmt"JfgMXCP\mFEnhsX?8\gFUT
-;E3uC!o7\\gC^Ho6nYb\!rd4NV:k-P6NM[2/,FO8Ok;aFB)@sC!q70l?PsbY#agl\h[+,(U^:a)t$S-
#09\[;<]YibKlM%>uQ_na\64oeHcUZ9_AZc\u&q>Mpg^;gMfk*-r&<hC\#,:C!p"$etstLA/@rCWr=Q6
!0l@hTh-IGIYK2o+RFk1]d*3MWRVXVaetKk+O[(!<LWPd>%LFS[[V=>ZRk=jV"[n%"u1$L-6c/fk\AP,
_B\ct)Og<T?BJ0ToJTEC\hXn2L*Oo8$*-A%Vk5^@qM@%C+D!<$PK&!:jI.oe--W*D>fs2o;3T#Bj`36C
ROmo3Oj?VLm%d4*-E>D@0`&no4+k+H#;jeLXa>o%>B`e&Fp^*@+KI\0I;aAYq-uoYpZk21k2)M-PNFLB
Y"@Z!Y/&Pn;qWCm8Ok:R>^gn,-=%AC&=R]@oXa;0(_83q5\:B@eho83UcC70I\g56TiFBYBS:*J<Ojc[
8K/"2g@3/%QAH=.b-S&/Gfm2Jp?F%_l"F'kc'4LcV^fU*!6A6*-AD,n8QY"nR3iBmQ>=p'6BdF1C=<#k
F%r+l*ESFOjY#/UCGP^%aKhQBG@bt\nD:<>=69FK-=&bJa>E-O.n:Ch$t&2EUe)<gC=8=Q__l/++DK8j
^8g]lUG$B16((N[I;%%G617m=`bI$\?CE^T]M$[H%@\\=m[d^JXpQ3W9tDg$a`M)dNHA#V46,<Y?'DF7
/VQ%GLMWFEK.c>N-I"7sf;&khhu6f[m8GHc04TKFdT81sPBK,49q$-k>a&bQ]On;58*hGab#N_KJYF'5
@9k?.9tDf]d5>VQn%Y;J,fL6fg16(TdNNU(PP/$kdT]d:RHD/Kf8_`$Ff1sLdT]dLRO2l,`AHh@32T8o
X#0(CbP+\ohV2gN:m:&09<L?tcTdNI1_Q0I;Pm#eKfb\Lc1uL!^=qEoY";R$Bs(#H$;EQbQZRk_.N:YW
G2d=_==#A0dbKc(2<gci-bXc$gKOR?c\jelWjH/@"$P(Pbn4FI)Je]$/!J7_djX"C<hY"X4D,?XAEnQc
;)2AC@OTqYUMXcUICMk<h^1?eF8Z?NMB'?!3e9\6<LUsKh,u\QH#&PE/1m]0V\uV6@hr^D<DZ,d:j#s,
m3>eO\oBe[)-N.$[W^9>TQMDfdW@84-Bqim[hn1dU+a:n-,I$&9d2;]?1gglpmX$!JJ8EOPbH=sAq.Gb
g7jJ;bRpXWd]C2gkGha]0V0V*$p&=<E?OL<\5n4\VY,e/+_YDrUtC/]:WjrCmtlYTD,i25rqW-.=Q-tR
61?i.#sroSJ&FS/>+>60:0)/Z^KM*0f65.u:WDhb=_,G3ad]bj&YM'c)&N;qr+rZ<Q6F0i.?Dn]WH[r.
pg[b;m4>QJJJ%E.Q!QX41C_YPk=($75%:2oj,BT@iDaa"[MjXYM%k;!)5iDYG&Vsj3B]VeQCgUl%dETK
.*cA:Pr^LHR>>g*O77#"<tU7@f;W2EZ?h2>%S'`'mte<)_:s2]mk&h$Lr`M/;tMPRAr7qak*t-5Gbs0K
=9rrqSr0quDg%kp06M`#e_dZM0Jr]I0c;5J-_Fs>n5>e4$#(`+!q37k$K/[HIRdaG5/8_,i,h)MDWF,1
<h-UI`HkjU;d#=K^;4dd@T!#P?s`eL(hi5^Fg+n[f@L`2[9._bGcK%;f=&#DMt-nI/)#HP<@%omIpQ/A
O?cH>BjdrWr+.3H@U%eNU]7]8HtR$BV.jOR(onh4BK<N`M"A0AUHEgVAiDt4a*,?u[,]u0"C2q8Fm-\2
au4Q6_G97g`oo@FfGuQs=Fi=9p.L(rDnT5nhV6`LU#]OjpGe5%iu=H;Wm!COSA:ZFMPD48CurW&CkgeV
m)/D=Iq&ZcG0F@Hn)k?3AJAf9IY"uc5II"?j_jVaI5tn6djE@?)'Z_oF"ZQ1Cs?To('-9Ehmf0K)nA<d
_hi6$MXi)rh]Q+3\/m<a@An4tr`+@&(6?[EREbVcIH*=[pK>BLoXr*\RAE7/cI":len,$-\$pE+]*G?o
)AGuW=V)/:^t`4SNr,CqBG``YJ<s(7JT7\PN[hqY@ET#2ii]=F;/JLp>4]#sp+!4ieQ4MMlVO3ueET,D
Z[cIr!5J@p*(?FMB\cq(+l>XZU<2Ql/L@=BY+1GF!Ah<#@Z-hs=BJ54OliX=gIg:e*(BOA]?u)9rfd)]
)@K'1Y:p42d*OAY&):-2[g5]*=qfW?Sn7r"qQ#e%9NBNR84kB+Ec:VpH)4rs&,(G2b`G.jTIqPX5J-@s
q$9Ra`-SXELa\#$'3VJl@6*.Ansu$;?5*^;`G/<>*B^REI/AqOmalZpZYD_cK4C5QbV.(64FFPVi0/C:
@.F>35NDq7IPTT.K9sMKJgMRYmo+MQ#MoQj>Wsj*,32+aj^(Tt3ZLf$^K$IPZ(>dQ#CNp1QOi:gaZ`mg
/]OsH+A%?9?uF+S4ts#bg@;T`nc<+?&,F#1YH#d$(d6tJ+Hm=e.3JJSOq2s/6U'G//*$g(MF'K@\Of+O
E4).XLE_B,,QR9B$[M4_A&%TNnm*kb(_0`rFdq9nh[>&*qt4c,RIlE,kehF0=G/fNVr-6Fn+PlA:OKR@
0@n!I]t")X!W?C)nbr&ArZD/:;>rfNXk,c?DMX#-*T`P&7sr;L(rlDZJ,GAVj1kTghn[Tm1&~>
endstream
endobj
7 0 obj
29153
endobj
3 0 obj
<<
/Parent null
/Type /Pages
/MediaBox [0.0000 0.0000 431.00 434.00]
/Resources 8 0 R
/Kids [5 0 R]
/Count 1
>>
endobj
9 0 obj
[/PDF /Text /ImageC]
endobj
10 0 obj
<<
/S /Transparency
/CS /DeviceRGB
/I true
/K false
>>
endobj
11 0 obj
<<
/Alpha1
<<
/ca 1.0000
/CA 1.0000
/BM /Normal
/AIS false
>>
>>
endobj
8 0 obj
<<
/ProcSet 9 0 R
/ExtGState 11 0 R
>>
endobj
xref
0 12
0000000000 65535 f
0000000015 00000 n
0000000315 00000 n
0000029896 00000 n
0000000445 00000 n
0000000521 00000 n
0000000609 00000 n
0000029872 00000 n
0000030350 00000 n
0000030066 00000 n
0000030105 00000 n
0000030207 00000 n
trailer
<<
/Size 12
/Root 2 0 R
/Info 1 0 R
>>
startxref
30423
%%EOF

View File

@ -0,0 +1,255 @@
Deutsch
=======
Windows
-------
Der Installer der AusweisApp2 kann über die Kommandozeile gestartet werden, um
den Installationsprozess zu konfigurieren und systemweite Standardeinstellungen
vorzugeben.
Der Rückgabewert von msiexec informiert über das Ergebnis der Installation [#msiexecreturnvalues]_.
Neben den üblichen Parametern [#standardarguments]_ enthält das folgende Kommando
alle unterstützten Parameter, die im Anschluss erläutert werden.
.. code-block:: winbatch
msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALL_ROOT="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false UPDATECHECK=false ONSCREENKEYBOARD=true HISTORY=false
INSTALL_ROOT
Gibt das Installationsverzeichnis an. Ohne Angabe wird der Ordner
"C:\\Programme (x86)\\AusweisApp2" genutzt.
SYSTEMSETTINGS
Betrifft die Erstellung von Firewall-Regeln der Windows Firewall. Ohne Angabe
des Parameters werden die Firewall-Regeln erstellt (true). Durch Angabe von
SYSTEMSETTINGS=false werden keine Firewall-Regeln erstellt.
DESKTOPSHORTCUT
Durch Angabe von DESKTOPSHORTCUT=false kann die Erstellung einer
Desktop-Verknüpfung vermieden werden. Ohne Angabe des Parameters wird eine
Desktop-Verknüpfung für alle Benutzer erstellt (true).
AUTOSTART
Durch Angabe von AUTOSTART=true wird ein Autostart-Eintrag für alle Benutzer
erstellt. Die Deaktivierung des Autostarts ist den Benutzern in der AusweisApp2
dadurch nicht möglich. Ohne Angabe wird der Autostart-Eintrag nicht erstellt
(false). In diesem Fall ist es jedoch jedem Benutzer möglich, die Autostart-
Funktion innerhalb der AusweisApp2 für sich zu aktivieren.
AUTOHIDE
Betrifft die automatische Minimierung nach Abschluss einer erfolgreichen
Authentisierung. Ohne Angabe ist diese aktiviert (true). Durch AUTOHIDE=false
wird diese deaktiviert. Der Benutzer kann diese Einstellung anpassen.
REMINDTOCLOSE
Wenn der Benutzer die AusweisApp2 per Klick auf das X schließt, wird er darauf
hingewiesen, dass nur die Benutzeroberfläche geschlossen wird und die
AusweisApp2 weiterhin im Infobereich zur Verfügung steht. Zu diesem Zeitpunkt
ist es möglich, den Hinweis zukünftig zu unterdrücken. Durch REMINDTOCLOSE=false
kann dieser Hinweis von vornherein deaktiviert werden. Ohne Angabe ist er
aktiviert (true).
ASSISTANT
Startet der Benutzer die AusweisApp2 zum ersten Mal, wird die Benutzeroberfläche
geöffnet und ein Einrichtungsassistent angezeigt. Bei jedem weiteren Start wird
die AusweisApp2 im Hintergrund gestartet und der Einrichtungsassistent erscheint
nicht. Durch ASSISTANT=false wird die AusweisApp2 auch beim ersten Start im
Hintergrund ohne Einrichtungsassistenten gestartet. Ohne Angabe ist der
Einrichtungsassistent aktiviert (true).
TRANSPORTPINREMINDER
Zu Beginn einer Selbstauskunft oder Authentisierung wird der Benutzer einmalig
danach gefragt, ob er die Transport-PIN schon geändert hat. Durch
TRANSPORTPINREMINDER=false kann diese Abfrage deaktiviert werden. Ohne Angabe
ist die Abfrage aktiviert (true).
UPDATECHECK
Wird die Benutzeroberfläche der AusweisApp2 geöffnet, wird eine Überprüfung auf
eine neue Version der AusweisApp2 gestartet, falls seit der letzten Überprüfung
mindestens 24 Stunden vergangen sind. Liegt eine neue Version vor, wird der
Benutzer darüber in einem Dialog informiert. Durch Setzen von UPDATECHECK auf
false oder true kann diese Überprüfung deaktiviert bzw. aktiviert werden.
Die Einstellung kann dann durch den Benutzer in der AusweisApp2 nicht geändert
werden. Ohne Angabe ist die Überprüfung aktiviert, der Benutzer kann die
Einstellung jedoch ändern. Der UPDATECHECK Parameter beeinflusst weder die
Aktualisierung der Diensteanbieterliste noch die Aktualisierung der
Kartenleserinformationen.
ONSCREENKEYBOARD
Für die Eingabe von PIN, CAN und PUK kann eine Bildschirmtastatur verwendet
werden. Durch Setzen von ONSCREENKEYBOARD auf false oder true kann diese
deaktiviert bzw. aktiviert 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,
der Diensteanbieter und die ausgelesenen Datenfelder (ohne Inhalt). Durch Setzen
von HISTORY auf false oder true kann der Verlauf deaktiviert bzw. aktiviert
werden. Der Benutzer kann diese Einstellung anpassen.
Alternativ kann mit Orca [#orca]_ eine MST-Datei erzeugt werden, die die oben
genannten Parameter definiert. Die Parameter sind in den Tabellen "Directory"
und "Property" verfügbar. Übergeben lässt sich die MST-Datei mit dem folgenden
Kommando:
.. code-block:: winbatch
msiexec /i AusweisApp2-X.YY.Z.msi /quiet TRANSFORMS=file.mst
macOS
-----
Unter macOS ist keine Installation per Kommandozeile vorgesehen. Jedoch können
einige der oben genannten Einstellung durch eine plist-Datei im Verzeichnis
/Library/Preferences systemweit vorgegeben werden. Diese plist-Datei muss dabei
manuell durch den Administrator des Systems hinterlegt werden und wird von allen
(zukünftigen) Installationen der AusweisApp2 verwendet. Alle nicht genannten
Einstellungen werden auf macOS nicht unterstützt. Der Name der Datei muss
"com.governikus.AusweisApp2.plist" lauten. Der Inhalt wird im folgenden
dargestellt:
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>autoCloseWindow</key>
<false/>
<key>remindToClose</key>
<false/>
<key>showSetupAssistant</key>
<false/>
<key>transportPinReminder</key>
<false/>
<key>common.autoUpdateCheck</key>
<false/>
<key>common.keylessPassword</key>
<true/>
<key>history.enable</key>
<false/>
</dict>
</plist>
Für die einzelnen Werte gelten die gleichen Beschreibungen wie für die
Windows-Version wobei die Bennennung der Attribute der folgenden Tabelle zu
entnehmen ist.
====================== ====================
macOS Windows
====================== ====================
autoCloseWindow AUTOHIDE
remindToClose REMINDTOCLOSE
showSetupAssistant ASSISTANT
transportPinReminder TRANSPORTPINREMINDER
common.autoUpdateCheck UPDATECHECK
common.keylessPassword ONSCREENKEYBOARD
history.enable HISTORY
====================== ====================
.. [#msiexecreturnvalues] https://docs.microsoft.com/de-de/windows/desktop/msi/error-codes
.. [#standardarguments] https://docs.microsoft.com/de-de/windows/desktop/msi/standard-installer-command-line-options
.. [#orca] https://docs.microsoft.com/de-de/windows/desktop/Msi/orca-exe
Anforderungen an die Einsatzumgebung
------------------------------------
Rechte für Installation und Ausführung
''''''''''''''''''''''''''''''''''''''
Für die Installation der AusweisApp2 sind Administratorrechte erforderlich.
Die Ausführung der AusweisApp2 erfordert keine Administratorrechte.
Verwendete Netzwerk-Ports
'''''''''''''''''''''''''
In :numref:`porttable_de` werden alle von der AusweisApp2 genutzten Ports
aufgelistet.
Eine schematische Darstellung der einzelnen Verbindungen, die von der
AusweisApp2 genutzt werden, ist in :numref:`communicationmodel_de` dargestellt.
Die AusweisApp2 startet einen HTTP-Server, der über Port 24727 erreichbar
ist.
Der Server empfängt nur auf der localhost Netzwerkschnittstelle.
Die Erreichbarkeit dieses lokalen Servers ist für die Onlineausweisfunktion
notwendig, da Diensteanbieter mit einem HTTP-Redirect auf den lokalen Server
umleiten um den Ausweisvorgang in der AusweisApp2 fortzuführen (eID1).
Außerdem wird über den Server die Verwendung der AusweisApp2 von anderen
Anwendungen über eine Websocket-Schnittstelle angeboten (SDK-Funktion, eID-SDK).
Daher müssen eingehende lokale Netzwerkverbindungen auf dem TCP Port 24727
ermöglicht werden.
Für die Verwendung von der "Smartphone als Kartenleser"-Funktion über WLAN
müssen außerdem Broadcasts auf UDP Port 24727 im lokalen Subnetz empfangen
werden können.
Hierzu muss eventuell die AP Isolation im Router deaktiviert werden.
.. _communicationmodel_de:
.. figure:: CommunicationModel_de.pdf
Kommunikationsmodell der AusweisApp2
Der Installer der AusweisApp2 bietet die Option, für alle angebotenen
Funktionen der AusweisApp2 die erforderlichen Firewall-Regeln in der
Windows-Firewall zu registrieren.
Erfolgt die Registrierung der Firewall-Regeln nicht, wird der Benutzer bei
einem Verbindungsaufbau der AusweisApp2 mit einem Dialog der Windows-Firewall
aufgefordert, die ausgehenden Datenverbindungen zuzulassen.
Durch Registrierung der Firewall-Regeln während der Installation werden diese
Aufforderungen unterbunden.
Für die lokalen Verbindungen eID1 und eID-SDK müssen (unter den gängigen
Standardeinstellungen der Windows-Firewall) keine Regeln in der
Windows-Firewall eingetragen werden.
Die durch den Installer angelegten Regeln werden in Tabelle :numref:`firewalltable_de`
aufgelistet.
TLS-Verbindungen
''''''''''''''''
Es ist generell nicht möglich, die AusweisApp2 mit einem TLS-Termination-Proxy
zu verwenden, da die übertragenen TLS-Zertifikate über eine Verschränkung mit
dem Berechtigungszertifikat aus der Personalausweis-PKI validiert werden.
CA-Zertifikate im Windows-Truststore werden daher ignoriert.
.. raw:: latex
\begin{landscape}
.. _porttable_de:
.. csv-table:: Netzwerkverbindungen der AusweisApp2
:header: "Referenz", "Protokoll", "Port", "Richtung", "Optional", "Zweck", "Anmerkungen"
:widths: 8, 8, 8, 8, 8, 35, 25
"eID1", TCP, 24727, "eingehend", "Nein", "Online-Ausweisvorgang, eID-Aktivierung [#TR-03124]_", "Nur erreichbar von localhost [#TR-03124]_"
"eID2", TCP, 443, "ausgehend", "Nein", "Online-Ausweisvorgang, Verbindung zum Dienstanbieter, TLS-1-2-Kanal [#TR-03124]_", "TLS-Zertifikate verschränkt mit Berechtigungs-Zertifikat [#TR-03124]_"
"eID3", TCP, 443, "ausgehend", "Nein", "Online-Ausweisvorgang, Verbindung zum eID-Server, TLS-2-Kanal [#TR-03124]_", "TLS-Zertifikate verschränkt mit Berechtigungs-Zertifikat [#TR-03124]_"
"eID-SDK", TCP, 24727, "eingehend", "Nein", "Verwendung der SDK-Schnittstelle", "Nur erreichbar von localhost [#TR-03124]_"
"SaK1", UDP, 24727, "eingehend", "Ja", "Smartphone als Kartenleser, Erkennung [#TR-03112]_", "Broadcasts"
"SaK2", TCP, , "ausgehend", "Ja", "Smartphone als Kartenleser, Verwendung [#TR-03112]_", "Verbindung im lokalen Subnetz"
"Update", TCP, 443, "ausgehend", "Ja", "Updates [#govurl]_ zu Dienstanbietern und Kartenlesern sowie Informationen zu neuen AusweisApp2-Versionen [#updatecheck]_ .", "Die Zertifikate der TLS-Verbindung werden mit in der AusweisApp2 mitgelieferten CA-Zertifikaten validiert. Im Betriebssystem hinterlegte CA-Zertifikate werden ignoriert."
.. [#TR-03124] Siehe TR-03124 des BSI
.. [#TR-03112] Siehe TR-03112-6 des BSI
.. [#govurl] Erreichbar unter dem URL https://appl.governikus-asp.de/ausweisapp2/
.. [#updatecheck] Die Überprüfung auf neue AusweisApp2-Versionen kann deaktiviert werden, siehe
Kommandozeilenparameter UPDATECHECK
.. _firewalltable_de:
.. csv-table:: Firewallregeln der AusweisApp2
:header: "Name", "Protokoll", "Port", "Richtung", "Umgesetzte Verbindung"
:widths: 25, 15, 15, 15, 30
:align: left
"AusweisApp2-Firewall-Rule", TCP, \*, "ausgehend", "eID2, eID3, SaK2, Update"
"AusweisApp2-Firewall-Rule-SaC-In", UDP, 24727, "eingehend", "SaK1"
.. raw:: latex
\end{landscape}

View File

@ -0,0 +1,235 @@
English
=======
Windows
-------
Start the installer of AusweisApp2 using the command line to configure the
installation process and preset system-wide default settings.
The return value of msiexec indicates the result of the installation [#msiexecreturnvalues]_.
In addition to the usual arguments [#standardarguments]_, the following command
contains all supported arguments, which are explained below.
.. code-block:: winbatch
msiexec /i AusweisApp2-X.YY.Z.msi /quiet INSTALL_ROOT="C:\AusweisApp2" SYSTEMSETTINGS=false DESKTOPSHORTCUT=false AUTOSTART=false AUTOHIDE=false REMINDTOCLOSE=false ASSISTANT=false TRANSPORTPINREMINDER=false UPDATECHECK=false ONSCREENKEYBOARD=true HISTORY=false
INSTALL_ROOT
States the installation directory. If not specified, the folder
"C:\\Program Files (x86)\\AusweisApp2" is used.
SYSTEMSETTINGS
Concerns the settings of firewall rules of the Windows Firewall. When not
specifying the argument, firewall rules are created (true). By indicating
SYSTEMSETTINGS=false, no firewall rules are created.
DESKTOPSHORTCUT
By specifying DESKTOPSHORTCUT=false, no desktop shortcut is created. Without
specifying the argument, the desktop shortcut is created for all users (true).
AUTOSTART
Setting AUTOSTART=true creates autostart entry for all users. Users are unable
to deactivate the autostart function in the AusweisApp2. Not specified, no
autostart entry is created (false). In that case, users are able to activate the
autostart function in the AusweisApp2.
AUTOHIDE
Concerns the automatic minimization after a successful authentication. Not
specified, it is activated (true). Setting AUTOHIDE=false, it is deactivated.
Users can adjust this setting to their preferences.
REMINDTOCLOSE
Closing the AusweisApp2 by clicking on the X, the user is notified that only the
user interface is closed and that the AusweisApp2 is still available in the info
tray. At this point, it is possible to prevent future notifications. Setting
REMINDTOCLOSE=false deactivates this notification from the outset. Not
specified, it is activated (true).
ASSISTANT
Starting the AusweisApp2 for the first time, the user interface is displayed and
the installation wizard is shown. With each subsequent start, the AusweisApp2
is started in the background, without the installation wizard being shown. By
indicating ASSISTANT=false, the AusweisApp2 is started in the background without
the installation wizard from the outset. Not specified, the installation
wizard is activated (true).
TRANSPORTPINREMINDER
Prior to the first authentication, the user is asked once whether they have
changed their transport PIN. Setting TRANSPORTPINREMINDER=false deactivates this
reminder. Not specified, the reminder is activated (true).
UPDATECHECK
Upon opening the user interface of the AusweisApp2, an update check is started,
provided that at least 24 hours have elapsed since the last update check. If a
newer version is available, the user is notified accordingly. Setting
UPDATECHECK to false or true deactivates or activates the update check
respectively. Users are unable to change this setting in the AusweisApp2. Not
specified, the update check is activated, but users can adjust the settings.
The UPDATECHECK parameter affects neither updates of the service
provider list nor updates of card reader information.
ONSCREENKEYBOARD
An on-screen keyboard is available to enter PIN, CAN or PUK. It is deactivated or
activated by setting ONSCREENKEYBOARD to false or true. Users are able to adjust
the settings.
HISTORY
Each authentication is saved in the history. No personal data is saved, only the
time of authentication, the service provider and the selected fields (without
content). Indicating HISTORY as false or true, the history function is
deactivated or activated. Users are able to adjust the settings.
Alternatively, Orca [#orca]_ can be used to create an MST file that defines the
above arguments. The arguments are available in the "Directory" and "Property"
tables. The MST file can be transferred with the following command:
.. code-block:: winbatch
msiexec /i AusweisApp2-X.YY.Z.msi /quiet TRANSFORMS=file.mst
macOS
-----
MacOS does not provide a command line installation. However, some of the above
settings can be specified system-wide by a plist file in the
/Library/Preferences directory. This plist file must be manually stored by the
administrator of the system and will be used by all (future) installations of
AusweisApp2. All not mentioned settings are not supported on macOS. The name of
the file must be "com.governikus.AusweisApp2.plist". The content is shown below:
.. code-block:: xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>autoCloseWindow</key>
<false/>
<key>remindToClose</key>
<false/>
<key>showSetupAssistant</key>
<false/>
<key>transportPinReminder</key>
<false/>
<key>common.autoUpdateCheck</key>
<false/>
<key>common.keylessPassword</key>
<true/>
<key>history.enable</key>
<false/>
</dict>
</plist>
The description for each value is applicable for both Windows and macOS,
although the naming of the attributes differs, as shown in the following table:
====================== ====================
macOS Windows
====================== ====================
autoCloseWindow AUTOHIDE
remindToClose REMINDTOCLOSE
showSetupAssistant ASSISTANT
transportPinReminder TRANSPORTPINREMINDER
common.autoUpdateCheck UPDATECHECK
common.keylessPassword ONSCREENKEYBOARD
history.enable HISTORY
====================== ====================
.. [#msiexecreturnvalues] https://docs.microsoft.com/en-us/windows/desktop/msi/error-codes
.. [#standardarguments] https://docs.microsoft.com/en-us/windows/desktop/msi/standard-installer-command-line-options
.. [#orca] https://docs.microsoft.com/en-us/windows/desktop/Msi/orca-exe
Operational Environment Requirements
------------------------------------
Required authorization for installation and execution
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Administrator privileges are required to install the AusweisApp2.
The execution of the AusweisApp2 does not require administrator privileges.
Used network ports
''''''''''''''''''
All network ports used by the AusweisApp2 are listed in :numref:`porttable_en`.
:numref:`communicationmodel_en` shows a schematic representation of the
individual connections made by the AusweisApp2.
The AusweisApp2 starts a HTTP-Server on port 24727.
The server binds only to the localhost network interface.
The availability of the local server is necessary for the online eID function,
because service providers will redirect the user with a HTTP redirect to the
local server to continue the authentication process in the AusweisApp2 (eID1).
The server is also used to offer other local applications to use the
AusweisApp2 via a websocket interface (SDK function, eID-SDK).
Therefore local incoming network connections to TCP Port 24727 must be
permitted.
Broadcast on UDP port 24727 in the local subnet have to be receivable by the
AusweisApp2 to use the "Smartphone as Card Reader" functionality.
It may be necessary to deactive AP isolation on your router.
.. _communicationmodel_en:
.. figure:: CommunicationModel_en.pdf
Communication model of the AusweisApp2
The installer of the AusweisApp2 provides an option to register all needed
firewall rules in the Windows Firewall.
If the rules are not registered, the user will be prompted by the Windows
Firewall to allow the outgoing connections once the AusweisApp2 tries to
connect to a server.
These prompts are suppressed by registering the firewall rules during
installation.
No rules have to be added to the Windows Firewall for the local connections
eID1 and eID-SDK (when using the standard settings).
In table :numref:`firewalltable_en` all firewall rules registered by the
installer are listed.
TLS connections
'''''''''''''''
Transmitted TLS certificates are solely validated via the interlacing with
the authorization certificate issued by the german eID PKI.
CA certificates in the Windows truststore are thus ignored.
It is therefore generally not possible to use the AusweisApp2 behind a
TLS termination proxy.
.. raw:: latex
\begin{landscape}
.. _porttable_en:
.. csv-table:: Network connections of the AusweisApp2
:header: "Reference", "Protocol", "Port", "Direction", "Optional", "Purpose", "Note"
:widths: 8, 8, 8, 8, 8, 35, 25
"eID1", TCP, 24727, "incoming", "no", "Online eID function, eID activation [#TR-03124]_", "Only accessible from localhost [#TR-03124]_"
"eID2", TCP, 443, "outgoing", "no", "Online eID function, connection to the service provider, TLS-1-2 channel [#TR-03124]_", "TLS certificates interlaced with authorization certificate [#TR-03124]_"
"eID3", TCP, 443, "outgoing", "no", "Online eID function, connection to eID-Server, TLS-2 channel [#TR-03124]_", "TLS certificates interlaced with authorization certificate [#TR-03124]_"
"eID-SDK", TCP, 24727, "incoming", "no", "Usage of the SDK functionality", "Only accessible from localhost [#TR-03124]_"
"SaC1", UDP, 24727, "incoming", "yes", "Smartphone as Card Reader, detection [#TR-03112]_", "Broadcasts"
"SaC2", TCP, , "outgoing", "yes", "Smartphone as Card Reader, usage [#TR-03112]_", "Connection in local subnet"
"Update", TCP, 443, "outgoing", "yes", "Updates [#govurl]_ of service provider and card reader information as well as informations on new AusweisApp2 versions [#updatecheck]_ .", "TLS certificates will be validated against CA certificates included in the AusweisApp2. CA certificates provided by the OS are ignored."
.. [#TR-03124] See TR-03124 specification from the BSI
.. [#TR-03112] See TR-03112-6 specifiaction from the BSI
.. [#govurl] All updates are based on the URL https://appl.governikus-asp.de/ausweisapp2/
.. [#updatecheck] Automatic checks for new AusweisApp2 versions can be deactivated, see commandline parameter
UPDATECHECK.
.. _firewalltable_en:
.. csv-table:: Firewall rules of the AusweisApp2
:header: "Name", "Protocol", "Port", "Direction", "Connection reference"
:widths: 25, 15, 15, 15, 30
:align: left
"AusweisApp2-Firewall-Rule", TCP, \*, "outgoing", "eID2, eID3, SaC2, Update"
"AusweisApp2-Firewall-Rule-SaC-In", UDP, 24727, "incoming", "SaC1"
.. raw:: latex
\end{landscape}

View File

@ -0,0 +1,171 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
import shlex
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = '1.4'
# If true, figures, tables and code-blocks are automatically numbered
# if they has caption. For now, it works only with the HTML builder.
# Default is False.
numfig = True
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
locale_dirs = ['@SPHINX_DOCS_DIR@/locales/']
gettext_additional_targets = ['image']
gettext_location = False
gettext_compact = True
# Add any paths that contain templates here, relative to this directory.
#templates_path = ['@SPHINX_DOCS_DIR@/_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'AusweisApp2 Installation'
copyright = '2018-2019, Governikus GmbH & Co. KG'
author = 'Governikus GmbH & Co. KG'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '@PROJECT_VERSION@'
# The full version, including alpha/beta/rc tags.
release = '@VERSION_DVCS@'
today = ' '
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'en'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
#exclude_patterns = ['']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
html_favicon = '@SPHINX_DOCS_DIR@/../../resources/images/npa.ico'
#html_theme_path = ['@SPHINX_DOCS_DIR@/_themes']
#html_theme = 'appcast'
html_theme = 'sphinx_rtd_theme'
# If false, no module index is generated.
html_domain_indices = True
# If false, no index is generated.
html_use_index = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = True
html_scaled_image_link = False
# Output file base name for HTML help builder.
htmlhelp_basename = 'AusweisApp2Installation'
html_context = {
'display_github': False,
'display_bitbucket': False,
'show_source': False,
'html_show_sourcelink': False,
}
html_add_permalinks = ""
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
'papersize': 'a4paper',
# The font size ('10pt', '11pt' or '12pt').
'pointsize': '11pt',
# Additional stuff for the LaTeX preamble.
'preamble': '''
\\usepackage{lscape}
\\hypersetup{pdfauthor={Governikus GmbH \& Co. KG},
pdftitle={AusweisApp2},
pdfsubject={Installation},
pdfkeywords={installation},
pdfproducer={LaTeX},
pdfcreator={Sphinx}
}
''',
# Override tableofcontents
'tableofcontents': '''
\\tableofcontents
\\newpage
\\pagestyle{plain}
\\pagenumbering{arabic}
''',
# Latex figure (float) alignment
'figure_align': 'H',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'AusweisApp2-@VERSION_DVCS@-NetInstallation.tex', 'AusweisApp2 Installation',
'Governikus GmbH \& Co. KG', 'howto'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
latex_show_pagerefs = True
# If true, show URL addresses after external links.
latex_show_urls = 'footnote'
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True

View File

@ -0,0 +1,13 @@
Table of contents
-----------------
.. raw:: latex
\clearpage
.. toctree::
:maxdepth: 3
:caption: Installation
README.de
README.en

View File

@ -0,0 +1,21 @@
AusweisApp2 1.14.2
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 20. Juni 2018
Anwender
""""""""
- Optimierungen in der Benutzerfreundlichkeit.
- Ein leerer Zweck im Berechtigungszertifikat wird nun
korrekt dargestellt.
Entwickler
""""""""""
- Unterstützung von Vor-Ort-Auslesen von Ausweisdaten unter
Anwesenden (gem. §18a PAuswG).
- Aktualisierung von OpenSSL auf die Version 1.0.2o.

View File

@ -0,0 +1,17 @@
AusweisApp2 1.14.3
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 10. Juli 2018
Anwender
""""""""
- Hinweis zur Datenschutzerklärung hinzugefügt.
Entwickler
""""""""""
- Das Vor-Ort-Auslesen von Ausweisdaten unter Anwesenden (gem. §18a PAuswG)
funktioniert jetzt, wenn ein Smartphone als Kartenlesegerät genutzt wird
und der Tastaturmodus "PIN-Eingabe auf diesem Gerät" aktiviert ist.

View File

@ -0,0 +1,70 @@
AusweisApp2 1.16.0
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 20. Dezember 2018
Anwender
""""""""
- Kleinere Fehlerbehebungen.
- Hinzufügen eines Tutorials um Hilfestellung bei der
Verwendung unter Android zu geben.
- Unterstützung von Android 4.3 und 4.4 wurde eingestellt.
- Unterstützung von OS X 10.10 wurde eingestellt.
- Unterstützung von macOS 10.14.
- Es ist nun möglich nach einer erfolgreichen Authentisierung
Daten eines verwendeten Android Smartphones anonym zu
übermitteln.
- Erweiterung der Diagnosefunktion.
- Bewertungsnachfrage unter Android hinzugefügt.
- Möglichkeit zur Log-Anzeige unter Android hinzugefügt.
- Unter Android wird nun eindeutiger zwischen 5 und 6-stelliger
PIN unterschieden.
- Das Entfernen des Ausweisdokumentes während der Eingabe von
PIN/CAN/PUK löst nicht mehr den Abbruch der Authentisierung
oder der PIN-Änderung aus.
Entwickler
""""""""""
- Unterstützung von firmenweiten Installationen des MSI-Paketes
(separate Dokumentation).
- Unterstützung eines SDKs mittels WebSockets unter Windows und
macOS (separate Dokumentation).
- Konkurrierende Zugriffe von verschiedenen Anwendungen auf
Kartenlesegeräte, die über PC/SC angeschlossen sind, sind
nun möglich.
- Aktualisierung von OpenSSL auf die Version 1.1.1.
- Aktualisierung von Qt auf die Version 5.11.2.
- Unterstützung von TLS v1.1 wurde eingestellt.
- Unterstützung folgender TLS-Cipher wurde eingestellt:
- DHE-DSS-AES256-GCM-SHA384
- DHE-DSS-AES256-SHA256
- DHE-DSS-AES128-GCM-SHA256
- DHE-DSS-AES128-SHA256
- DHE-DSS-AES256-SHA
- DHE-DSS-AES128-SHA
- ECDHE-ECDSA-AES256-SHA
- ECDHE-RSA-AES256-SHA
- DHE-RSA-AES256-SHA
- ECDHE-ECDSA-AES128-SHA
- ECDHE-RSA-AES128-SHA
- DHE-RSA-AES128-SHA

View File

@ -0,0 +1,15 @@
AusweisApp2 1.16.1
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 21. Dezember 2018
Anwender
""""""""
- Deaktivieren der automatischen Bereinigung von alten Log-Dateien, da
diese in 1.16.0 zu einem Programmabsturz führen kann.
Entwickler
""""""""""

View File

@ -0,0 +1,50 @@
AusweisApp2 1.16.2
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 15. Mai 2019
Anwender
""""""""
- Der Abbruch-Dialog beim Wechsel in den PIN-Änderungsmodus aus einem
laufenden Ausweisvorgang heraus wird nicht länger angezeigt.
- Alte Log-Dateien werden unter Android automatisch bereinigt.
- Gekoppelte Smartphones als Kartenleser (SaK) werden jetzt korrekt als
verfügbar angezeigt, wenn die Verbindung automatisch durch die AA2
hergestellt wurde.
- Erklärungstexte der mobilen App wurden verbessert.
- In der mobilen App erfolgt kein Browser-Redirect mehr, wenn die
Transport-PIN innerhalb eines Ausweisvorgangs in eine 6-stellige PIN
überführt wird.
- Der Fehlerdialog wurde um die Möglichkeit erweitert, eine Email an den
Support der AusweisApp2 zu senden, mit der Bitte die Protokolldatei
anzuhängen. Die Email enthält automatisch ermittelte Daten zum
verwendeten System sowie die letzten, kritischen Fehlermeldungen.
- Hinterlegte Daten zu Kartenlesern und Diensteanbietern wurden aktualisiert.
- Die Versionsnummer der AusweisApp2 ist nicht mehr Teil des
Installationspfads, um Probleme mit Antiviren-Software zu vermeiden.
- Ein Absturz beim Start einer Authentisierung, wenn die AusweisApp2
im Hintergrund läuft, ist behoben.
- Die Erkennung von Smartphones als Kartenleser wurde verbessert.
- Die Erkennung der Kartenleser in der Diagnose wurde korrigiert.
- Sonstige kleinere Fehler korrigiert.
Entwickler
""""""""""
- Der Standard-Logger der jeweiligen Plattform kann mittels
Parameter "--no-loghandler" deaktiviert werden.
- Anleitung "Installation in Firmennetzwerken" wurde erweitert.

View File

@ -0,0 +1,21 @@
AusweisApp2 1.18.0
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 24. September 2019
Anwender
""""""""
- Aktivierung der NFC-Funktion für iOS 13.
- Kleinere Fehlerbehebungen.
Entwickler
""""""""""
- Aktualisierung von OpenSSL auf die Version 1.1.1c.
- Aktualisierung von Qt auf die Version 5.12.4.
- Ein Compiler mit C++17-Support ist erforderlich.

View File

@ -0,0 +1,10 @@
AusweisApp2 1.18.1
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 24. September 2019
Entwickler
""""""""""
- Anpassungen an der Info.plist.

View File

@ -0,0 +1,15 @@
AusweisApp2 1.18.2
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 26. September 2019
Anwender
""""""""
- Kleinere Fehlerbehebungen.
Entwickler
""""""""""
- Anpassungen an der Info.plist.

View File

@ -3,6 +3,11 @@
<head>
<meta charset="utf-8">
<title>AusweisApp2 Release Notes</title>
<style>
.important {
color: red;
}
</style>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">

View File

@ -1,10 +1,36 @@
Abkündigungen
=============
Mit der Version 1.16.0 der AusweisApp2 wird die Unterstützung
Mit der Version 1.20.0 der AusweisApp2 wird die Unterstützung
folgender Systeme eingestellt.
- OS X 10.11
- x86-Architektur unter Android
Mit der Version 1.16.0 der AusweisApp2 wurde die Unterstützung
folgender Systeme eingestellt.
- OS X 10.10
- Android 4.3
- Android 4.4
Mit der Version 1.16.0 der AusweisApp2 wurde die Unterstützung
folgender TLS-Cipher eingestellt.
- DHE-DSS-AES256-GCM-SHA384
- DHE-DSS-AES256-SHA256
- DHE-DSS-AES128-GCM-SHA256
- DHE-DSS-AES128-SHA256
- DHE-DSS-AES256-SHA
- DHE-DSS-AES128-SHA
- ECDHE-ECDSA-AES256-SHA
- ECDHE-RSA-AES256-SHA
- DHE-RSA-AES256-SHA
- ECDHE-ECDSA-AES128-SHA
- ECDHE-RSA-AES128-SHA
- DHE-RSA-AES128-SHA
Mit der Version 1.14.0 der AusweisApp2 wurde die Unterstützung

View File

@ -4,7 +4,6 @@ Release Notes
.. toctree::
:maxdepth: 1
1.14.1
1.14.0
1.18.0
announce
issues

View File

@ -42,7 +42,7 @@ master_doc = 'index'
# General information about the project.
project = 'AusweisApp2'
copyright = '2016-2017, Governikus GmbH & Co. KG'
copyright = '2016-2019, Governikus GmbH & Co. KG'
author = 'Governikus GmbH & Co. KG'
# The version info for the project you're documenting, acts as replacement for
@ -151,7 +151,7 @@ latex_documents = [
# The name of an image file (relative to this directory) to place at the top of
# the title page.
latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/android/xhdpi/npa.png'
latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.

View File

@ -5,7 +5,7 @@ Die AusweisApp2 ist eine Software, die Sie auf Ihrem Computer installieren, um s
Ihrem Personalausweis bzw. Ihrem elektronischen Aufenthaltstitel online auszuweisen.
Für die Nutzung der Online-Ausweisfunktion benötigen die Nutzerinnen und Nutzer eine
Software, mit deren Hilfe eine sichere Verbindung zwischen Kartenlesegerät oder Smartphone,
Software, mit deren Hilfe eine sichere Verbindung zwischen Kartenleser oder Smartphone,
Personalausweis und eID-Diensteanbieter hergestellt werden kann. Sie ermöglicht den
verschlüsselten Datenaustausch zwischen Personalausweis und eID-Dienst.

View File

@ -1,8 +1,20 @@
Bekannte Fehler
===============
.. important::
Auf Windows wird beim Update einer Version der AusweisApp2 älter
als Version 1.16.0 auf eine aktuelle Version der AusweisApp2 die
ältere Version nicht erkannt und auch nicht entfernt. Bitte gehen
Sie in die Systemsteuerung Ihres Endgeräts und deinstallieren Sie
die ältere Version manuell. Danach kann die bereits installierte,
aktuelle Version aufgerufen werden.
Die nachfolgende Liste bezieht sich auf die aktuelle Version der AusweisApp2.
- Mit der NFC-Schnittstelle des iPhone 7 und iPhone 7 Plus werden viele
Ausweise nicht erkannt (hauptsächlich NFC-A) und es kommt zu Abbrüchen der
Authentisierung.
- Auf Windows 10 Plattformen mit aktivierter Benutzerkontensteuerung kann
es bei Benutzern mit eingeschränkten Berechtigungen zu Problemen mit der
Online-Ausweisfunktion kommen.
@ -19,8 +31,29 @@ Die nachfolgende Liste bezieht sich auf die aktuelle Version der AusweisApp2.
leichten Irritationen bei der angegebenen Bedienung kommen.
- Wenn die AusweisApp2 heruntergefahren wird, während eine Authentisierung
oder eine PIN-Änderung mit Komfort-Kartenlesegerät durchgeführt wird,
kann es unter Windows und macOS zu einem Absturz kommen.
oder eine PIN-Änderung mit Komfort-Kartenleser durchgeführt wird, kann es
unter Windows und macOS zu einem Absturz kommen.
- Unter Umständen kommt es zu Stabilitätsproblemen der NFC-Schnittstelle
auf Android.
- Längere Texte können unter Android u.U. bei kleinen Bildschirmgrößen
abgeschnitten sein.
- Unter macOS wird der Hinweis bei falscher PIN-Bestätigung während der
PIN-Änderung nur sehr kurz angezeigt.
- Bei der Nutzung eines entfernten Kartenlesers mit aktiviertem Tastaturmodus
kann bei einer Authentisierung nicht in die PIN-Änderung gewechselt werden,
wenn nur eine 5-stellige PIN vorhanden ist.
- Unter Windows wird bei der neuen grafischen Oberfläche der
"Datei speichern unter"-Dialog nicht automatisch bei Beginn einer
Authentisierung geschlossen.
- Unter macOS können per Tastatur mit den Standardsystemeinstellungen nur
Textfelder angesprungen werden. Mit Änderung der Tastaturnavigationsoption
unter "Systemeinstellungen/Tastatur/Kurzbefehle" auf "Alle Steuerungen" kann
das Verhalten von macOS geändert werden, sodass auch alle anderen
Komponenten in der App fokussiert werden können.

View File

@ -42,7 +42,7 @@ master_doc = 'appcast'
# General information about the project.
project = 'AusweisApp2'
copyright = '2016-2017, Governikus GmbH & Co. KG'
copyright = '2016-2019, Governikus GmbH & Co. KG'
author = 'Governikus GmbH & Co. KG'
# The version info for the project you're documenting, acts as replacement for

View File

@ -8,27 +8,25 @@ der AusweisApp2 unterstützt.
Betriebssysteme
"""""""""""""""
- OS X 10.10
- OS X 10.11
- macOS 10.12
- macOS 10.13
- macOS 10.14
- Windows 7 SP1 (32bit / 64bit)
- Windows 8.1 (64bit)
- Windows 10 (64bit)
- Android 4.3 und höher (x86, armeabi-v7a, arm64-v8a)
- Android 5.0 und höher (x86, armeabi-v7a)
Karten
""""""
- Neuer Personalausweis
- Personalausweis
- Elektronischer Aufenthaltstitel
@ -48,19 +46,21 @@ und sollte daher mit allen marktüblichen Browsern verwendet werden können.
Im Rahmen der Qualitätssicherung werden die folgenden Browserversionen
getestet.
- Firefox 57
- Firefox 66
- Chrome 62
- Chrome 74
- Internet Explorer 11
- Safari 11
- Safari 12
- Edge 44
Kartenlesegeräte
~~~~~~~~~~~~~~~~
Alle Kartenlesegeräte, die die Onlineausweisfunktionalität unterstützen und nach
Kartenleser
~~~~~~~~~~~
Alle Kartenleser, die die Onlineausweisfunktionalität unterstützen und nach
BSI TR-03119 zertifiziert sind. Details hierzu befinden sich auf der Homepage
des BSI unter "Nach Technischen Richtlinien zertifizierte Produkte".
@ -91,7 +91,7 @@ Aktuelle Informationen zu Kartenlesern finden Sie auf unserer Webseite:
https://www.ausweisapp.bund.de/fragen-und-antworten/voraussetzungen/
Alle NFC-fähigen Smartphones bzw. Tablets, die die Onlineausweisfunktionalität
unterstützen, können als Kartenlesegerät verwendet werden.
unterstützen, können als Kartenleser verwendet werden.
Dabei ist es notwendig die mobile AusweisApp2 auf dem jeweiligen Smartphone
zu installieren und zu starten.
@ -112,25 +112,25 @@ Im mobilen Umfeld ist die Funktionalität jedoch abhängig von der vom
Diensteanbieter umgesetzten Aktivierung. Daher empfehlen wir einen der
folgenden Browser zu verwenden.
- Firefox Klar 2.5
- Firefox Klar 8
- Chrome 63
- Chrome 73
- Android System WebView 60
- Android System WebView 73
Kartenlesegeräte
~~~~~~~~~~~~~~~~
Kartenleser
~~~~~~~~~~~
Alle NFC-fähigen Smartphones bzw. Tablets, die die Onlineausweisfunktionalität
unterstützen. Details hierzu befinden sich auf der Homepage:
https://www.ausweisapp.bund.de/mobile-geraete/
Ebenfalls ist es möglich ein weiteres Smartphone als Kartenlesegerät zu
verwenden. Dabei ist es notwendig die mobile AusweisApp2 auf dem jeweiligen
Smartphone zu installieren und zu starten.
Ebenfalls ist es möglich ein weiteres Smartphone als Kartenleser zu verwenden.
Dabei ist es notwendig die mobile AusweisApp2 auf dem jeweiligen Smartphone zu
installieren und zu starten.
Darüber hinaus ist die Verwendung eines Bluetooth-Kartenlesegeräts möglich.
Folgendes Bluetooth-Kartenlesegerät wird von der AusweiApp2 unterstützt:
Darüber hinaus ist die Verwendung eines Bluetooth-Kartenlesers möglich.
Folgender Bluetooth-Kartenleser wird von der AusweiApp2 unterstützt:
- cyberJack wave

View File

@ -1,11 +1,33 @@
Versionen
=========
Versionszweig 1.18
------------------
.. toctree::
:maxdepth: 1
1.18.2
1.18.1
1.18.0
Versionszweig 1.16
------------------
.. toctree::
:maxdepth: 1
1.16.2
1.16.1
1.16.0
Versionszweig 1.14
------------------
.. toctree::
:maxdepth: 1
1.14.3
1.14.2
1.14.1
1.14.0

View File

@ -5,15 +5,70 @@ The AusweisApp2 core is encapsulated into an **Android service** which is
running in the background without a user interface. This service is interfaced
via an Android specific interprocess communication (IPC) mechanism. The basics
of this mechanism - the **Android Interface Definition Language** (AIDL) -
are introduced in the following section. The following section deals with the
cryptographic verification of the SDKs authenticity. This step is necessary to
ensure that the SDK has not been modified in a malicious way. Subsequent
sections deal with the SDK interface itself and explain which steps are
necessary in order to talk to the AusweisApp2 SDK.
are introduced in the following section. Subsequent sections deal with the
SDK interface itself and explain which steps are necessary in order to talk
to the AusweisApp2 SDK.
The AusweisApp2 is available as an integrated and as an external variant.
The integrated version is provided as an AAR package that can automatically
be fetched by Android's default build system **gradle**. The external variant
is available as an APK in Google's PlayStore. It is required that the user
has manually installed the AusweisApp2 like any other app to connect to the
external variant.
.. important::
The integrated variant is available in jcenter for free.
If you need enterprise support feel free to contact us.
Integrated
----------
The integrated SDK is distributed as an AAR package that contains
native **arm64-v8a** libraries only.
The AAR package is available in the default repository of Android.
The following listing shows the required **jcenter** in **build.gradle**.
.. code-block:: groovy
buildscript {
repositories {
jcenter()
}
}
The integrated AusweisApp2 will be fetched automatically as a dependency by
your **app/build.gradle** file.
It is recommended to always use the latest version by **1.+** of AusweisApp2.
But you are free to add a concrete version like **1.16.0**.
.. code-block:: groovy
dependencies {
implementation 'com.governikus:ausweisapp:1.16.+'
}
.. seealso::
The AAR package provides an **AndroidManifest.xml** to register required
permissions and the background service. If your own AndroidManifest has
conflicts with our provided file you can add some attributes to resolve
those conflicts.
https://developer.android.com/studio/build/manifest-merge.html
External
--------
The APK is available in Google's PlayStore and needs to be installed by
the user. The external SDK is distributed as 32-bit and 64-bit.
Security
--------
^^^^^^^^
The following listing provides information about the solution to provide a
secure connection to AusweisApp2.
@ -39,82 +94,15 @@ secure connection to AusweisApp2.
.. _android_import_aidl:
Import the AIDL files
---------------------
Android provides an interprocess communication (IPC) mechanism which is based on
messages consisting of primitive types.
In order to abstract from this very basic mechanism, there is the Android
Interface Definition Language (AIDL).
It allows the definition of Java like interfaces.
The Android SDK generates the necessary interface implementations from supplied
AIDL files in order to perform IPC, as if this function had been called directly
in the current process.
In order to interact with the AusweisApp2 SDK there are two AIDL interfaces.
The first one is given to the client application by the SDK and allows the
client to establish a session with the SDK,
to send JSON commands to the SDK and to pass discovered NFC tags to the SDK.
The second AIDL interface is given to the SDK by the client application. It
enables the client to receive the intial session parameters as well as
JSON messages from the SDK. Furthermore it has a function which is called
when an existing connection with the SDK is dropped by the SDK. Both interfaces
are listed below and you need to import them into your build environment.
.. important::
It is required that you place the AIDL files under subdirectory
"aidl/com.governikus.ausweisapp2". Also the interface methods
names must be exactly the same.
.. seealso::
https://developer.android.com/guide/components/aidl.html
Interface
^^^^^^^^^
.. code-block:: java
package com.governikus.ausweisapp2;
import com.governikus.ausweisapp2.IAusweisApp2SdkCallback;
import android.nfc.Tag;
interface IAusweisApp2Sdk
{
boolean connectSdk(IAusweisApp2SdkCallback pCallback);
boolean send(String pSessionId, String pMessageFromClient);
boolean updateNfcTag(String pSessionId, in Tag pTag);
}
Callback
^^^^^^^^
.. code-block:: java
package com.governikus.ausweisapp2;
interface IAusweisApp2SdkCallback
{
void sessionIdGenerated(String pSessionId, boolean pIsSecureSessionId);
void receive(String pJson);
void sdkDisconnected();
}
Verify the authenticity of AusweisApp2
--------------------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The following section deals with the cryptographic verification of the SDK's
authenticity. This step is necessary to ensure that the SDK has not been
modified in a malicious way.
Fingerprint
^^^^^^^^^^^
"""""""""""
In order to verify that the AusweisApp2 SDK is authentic and has not been
modified in a malicious way, it is required to verify its authenticity
before establishing a connection with it.
@ -133,7 +121,7 @@ fingerprint of the authentic SDK certificate is the following:
Example
^^^^^^^
"""""""
The following example code demonstrates how the certificate
hash value of a signed application on Android can be verified.
@ -167,19 +155,101 @@ hash value of a signed application on Android can be verified.
}
.. _android_import_aidl:
Import the AIDL files
^^^^^^^^^^^^^^^^^^^^^
Android provides an interprocess communication (IPC) mechanism which is based on
messages consisting of primitive types.
In order to abstract from this very basic mechanism, there is the Android
Interface Definition Language (AIDL).
It allows the definition of Java like interfaces.
The Android SDK generates the necessary interface implementations from supplied
AIDL files in order to perform IPC, as if this function had been called directly
in the current process.
In order to interact with the AusweisApp2 SDK there are two AIDL interfaces.
The first one is given to the client application by the SDK and allows the
client to establish a session with the SDK,
to send JSON commands to the SDK and to pass discovered NFC tags to the SDK.
The second AIDL interface is given to the SDK by the client application. It
enables the client to receive the intial session parameters as well as
JSON messages from the SDK. Furthermore it has a function which is called
when an existing connection with the SDK is dropped by the SDK. Both interfaces
are listed below and you need to import them into your build environment.
.. important::
It is required that you place the AIDL files under subdirectory
"aidl/com.governikus.ausweisapp2". Also the interface methods
names must be exactly the same.
.. seealso::
https://developer.android.com/guide/components/aidl.html
.. note::
If you implement the integrated variant beside the external variant you do
**not** need to manually add AIDL files as the AAR package already provides
those interfaces.
Interface
"""""""""
.. code-block:: java
package com.governikus.ausweisapp2;
import com.governikus.ausweisapp2.IAusweisApp2SdkCallback;
import android.nfc.Tag;
interface IAusweisApp2Sdk
{
boolean connectSdk(IAusweisApp2SdkCallback pCallback);
boolean send(String pSessionId, String pMessageFromClient);
boolean updateNfcTag(String pSessionId, in Tag pTag);
}
Callback
""""""""
.. code-block:: java
package com.governikus.ausweisapp2;
interface IAusweisApp2SdkCallback
{
void sessionIdGenerated(String pSessionId, boolean pIsSecureSessionId);
void receive(String pJson);
void sdkDisconnected();
}
Background service
------------------
The integrated and external variants use the same method to establish
a connection to the AusweisApp2 SDK. The AusweisApp2 SDK is a background
service in the external AusweisApp2 or an embedded background service
in your own application.
.. _android_binding_service:
Binding to the service
----------------------
^^^^^^^^^^^^^^^^^^^^^^
In order to start the AusweisApp2 SDK it is necessary to bind to the
Android service supplied by the SDK.
This binding fulfils two purposes:
- First it starts the SDK.
- Second it enables the client to establish an IPC connection as mentioned above.
- Second it enables the client to establish an IPC connection as
mentioned above.
Due to the nature of an Android service, there can be only one instance of
@ -194,12 +264,11 @@ section, section :ref:`android_create_session`.
Create connection
^^^^^^^^^^^^^^^^^
"""""""""""""""""
First of all, in order to bind to the service, one needs to instantiate an
Android ServiceConnection.
Subsequently, the object is passed to the Android API and the contained
methods are invoked
by Android on service connection and disconnection.
methods are invoked by Android on service connection and disconnection.
.. code-block:: java
@ -225,15 +294,20 @@ by Android on service connection and disconnection.
.. _android_raw_connection:
Bind service to raw connection
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
""""""""""""""""""""""""""""""
In order to perform the actual binding a directed Intent, which identifies
the AusweisApp2 SDK, is created.
This Intent is send to
the Android API along with the ServiceConnection created above.
This API call either starts up the SDK if it is the first client,
or connects to the running SDK instance
if there is already another client bound.
This Intent is sent to the Android API along with the ServiceConnection
created above. This API call either starts up the SDK if it is the
first client, or connects to the running SDK instance if there is already
another client bound.
If you use the external variant of AusweisApp2 you need to pass the package
name of Governikus. Otherwise you need to pass your own package name
as the integrated variant is a background service of your application.
.. code-block:: java
@ -244,9 +318,15 @@ if there is already another client bound.
// [...]
String pkg = "com.governikus.ausweisapp2";
boolean useIntegrated = true; // use external or integrated
if (useIntegrated)
pkg = getApplicationContext().getPackageName();
String name = "com.governikus.ausweisapp2.START_SERVICE";
Intent serviceIntent = new Intent(name);
serviceIntent.setPackage("com.governikus.ausweisapp2");
serviceIntent.setPackage(pkg);
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
.. seealso::
@ -258,8 +338,8 @@ if there is already another client bound.
Redirect to Play Store
^^^^^^^^^^^^^^^^^^^^^^
It is necessary that AusweisApp2 is installed in order to use the SDK.
""""""""""""""""""""""
It is necessary that AusweisApp2 is installed in order to use the external SDK.
It is recommended to check and display a message in case the user needs
to install AusweisApp2 first. Also, the user should be redirected to
the Play Store entry to find the app.
@ -286,13 +366,15 @@ the Play Store entry to find the app.
}
}
.. note::
This is not necessary if you use the integrated variant.
.. _android_init_aidl:
Initializing the AIDL connection
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
""""""""""""""""""""""""""""""""
Once the Android service of the AusweisApp2 SDK is successfully started
and bound to by the client,
the Android system calls the onServiceConnected method of the ServiceConnection
@ -348,7 +430,7 @@ The example below stores this instance in the member variable mSdk.
.. _android_create_session:
Create session to AusweisApp2
-----------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Once your client is bound to the AusweisApp2 SDK service and you have initialized
the AIDL IPC mechanism, you are ready to use the actual SDK API.
@ -437,7 +519,7 @@ and establishing a session.
Send command
^^^^^^^^^^^^
""""""""""""
In order to send a JSON command to the AusweisApp2 SDK, you need to invoke
the **send** function of your instance of **IAusweisApp2Sdk**. For this command
to be processed by the SDK you need to supply the session ID which you have
@ -464,7 +546,7 @@ previously received. The listing below shows an example.
Receive message
^^^^^^^^^^^^^^^
"""""""""""""""
Messages from the AusweisApp2 SDK are passed to you via the same instance of
**IAusweisApp2SdkCallback** in which you have received the session ID.
The **receive** method is called each time the SDK sends a message.
@ -477,7 +559,7 @@ The **receive** method is called each time the SDK sends a message.
.. _android_disconnect_sdk:
Disconnect from SDK
-------------------
^^^^^^^^^^^^^^^^^^^
In order to disconnect from the AusweisApp2 SDK you need to invalidate your
instance of **IBinder**. There are two possibilities to do this. The first
one is to unbind from the SDK Android service to undo your binding, like
@ -500,7 +582,7 @@ shown in the code listing below. The second one is to return false in the
.. _android_nfc_tags:
Passing NFC tags to the SDK
---------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^
NFC tags can only be detected by applications which have a foreground window
on the Android platform. A common workaround for this problem is
to equip background services with a transparent window which is shown
@ -521,7 +603,7 @@ Android displaying an App Chooser.
Permissions in AndroidManifest.xml
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
""""""""""""""""""""""""""""""""""
The client applications needs to register the NFC permission as shown in the
listing below in order to access the NFC reader hardware.
@ -534,11 +616,14 @@ listing below in order to access the NFC reader hardware.
https://developer.android.com/guide/topics/security/permissions.html
.. note::
The integrated variant already provides an **AndroidManifest.xml** with
prepared permissions.
Intent-Filter in AndroidManifest.xml
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
""""""""""""""""""""""""""""""""""""
In order to be informed about attached NFC tags by Android, the client
application is required to register an intent filter. The appropriate
filter is shown in the listing below.
@ -556,7 +641,7 @@ filter is shown in the listing below.
NFC Technology Filter
^^^^^^^^^^^^^^^^^^^^^
"""""""""""""""""""""
Since there are many different kinds of NFC tags, Android requires the
application to register a technology filter for the kind of tags the application
wants to receive. The proper filter for the German eID card is shown
@ -573,8 +658,8 @@ in the listing below.
Implementation
^^^^^^^^^^^^^^
As it is common on the Android platform, information is send to applications
""""""""""""""
As it is common on the Android platform, information is sent to applications
encapsulated in instances of the **Intent** class. In order to process newly
discovered NFC tags, Intents which are given to the application need to be
checked for the parcelable NFC extra as shown in the code listing below.
@ -614,7 +699,7 @@ The listing below shows an example for the described process.
Dispatching NFC tags in foreground
----------------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
As already mentioned under :ref:`android_nfc_tags`, an App Chooser is displayed
for discovered NFC tags by Android if multiple applications which are able to
dispatch NFC tags are installed. An application can suppress this App Chooser

View File

@ -294,9 +294,14 @@ If the last attempt to enter the PIN failed, AusweisApp2
will send the message :ref:`enter_puk` as the retryCounter
is decreased to **0**.
.. versionchanged:: 1.16.0
The parameter "value" must be omitted if the used :ref:`reader` has a
keypad.
- **value**: The personal identification number (PIN) of the card.
This must be 6 digits.
This must be 6 digits if the :ref:`reader` has no keypad, otherwise
this parameter must be omitted.
.. code-block:: json
@ -325,9 +330,14 @@ to send this command to unblock the last retry of :ref:`set_pin`.
The AusweisApp2 will send an :ref:`enter_can` message on error.
Otherwise the workflow will continue with :ref:`enter_pin`.
.. versionchanged:: 1.16.0
The parameter "value" must be omitted if the used :ref:`reader` has a
keypad.
- **value**: The card access number (CAN) of the card.
This must be 6 digits.
This must be 6 digits if the :ref:`reader` has no keypad, otherwise
this parameter must be omitted.
.. code-block:: json
@ -358,8 +368,14 @@ or if the PUK is operative.
Otherwise the workflow will continue with :ref:`enter_pin`.
For detailed information see message :ref:`enter_puk`.
.. versionchanged:: 1.16.0
The parameter "value" must be omitted if the used :ref:`reader` has a
keypad.
- **value**: The personal unblocking key (PUK) of the card.
This must be 10 digits.
This must be 10 digits if the :ref:`reader` has no keypad, otherwise
this parameter must be omitted.
.. code-block:: json

View File

@ -42,7 +42,7 @@ master_doc = 'index'
# General information about the project.
project = 'AusweisApp2 SDK'
copyright = '2016-2017, Governikus GmbH & Co. KG'
copyright = '2016-2019, Governikus GmbH & Co. KG'
author = 'Governikus GmbH & Co. KG'
# The version info for the project you're documenting, acts as replacement for
@ -149,7 +149,7 @@ latex_documents = [
# The name of an image file (relative to this directory) to place at the top of
# the title page.
latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/android/xhdpi/npa.png'
latex_logo = '@SPHINX_DOCS_DIR@/../../resources/images/npa_docs.png'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.

View File

@ -0,0 +1,104 @@
Desktop
=======
This chapter deals with the desktop specific properties of the AusweisApp2 SDK.
The AusweisApp2 core is reachable over a **WebSocket** which is running by
default since AusweisApp2 1.16.0. Subsequent sections deal with the SDK
interface itself and explain which steps are necessary in order to talk to
the AusweisApp2 SDK.
WebSocket
---------
The AusweisApp2 uses the same default port as defined in TR-03124-1.
Your application can connect to ``ws://localhost:24727/eID-Kernel`` to
establish a bidirectional connection.
You can check the version of AusweisApp2 by the ``Server`` header of the HTTP
response or by an additional query to get the :ref:`status`.
If the WebSocket handshake was succesful your application can send :doc:`commands`
and receive :doc:`messages`.
The AusweisApp2 will send an HTTP error 503 "Service Unavailable" if the WebSocket
is disabled.
.. seealso::
https://tools.ietf.org/html/rfc6455
User installed
^^^^^^^^^^^^^^
Your application can connect to a user installed AusweisApp2. If the
user already has an active workflow your request will be refused by
an HTTP error 409 "Conflict". Also it is not possible to connect
multiple times to the WebSocket as only one connection is allowed and
will be refused by an HTTP error 429 "Too Many Requests". Once an
application is connected to the WebSocket the graphical user interface
of the AusweisApp2 will be blocked and shows a hint that another
application uses the AusweisApp2.
.. important::
Please provide a ``User-Agent`` in your HTTP upgrade request! The AusweisApp2
will show the content to the user as a hint which application uses the AusweisApp2.
Integrated
^^^^^^^^^^
You can deliver separate AusweisApp2 binaries inside your own application or
start an already installed AusweisApp2.
If your application spawns a separate process you should provide the cmdline
parameter ``--port 0`` to avoid conflicts with a user started AusweisApp2 and
other processes that uses a specified port.
The AusweisApp2 will create a text file in the system temporary directory to provide
the selected port. The port filename contains the PID of the running process to allow
multiple instances at the same time.
Example: **$TMPDIR/AusweisApp2.12345.port**
Your application can avoid the graphical interface of AusweisApp2 by providing the
cmdline parameter ``--ui websocket``.
.. _status:
Status
------
TR-03124-1 defined a query for status information. This is useful to fetch current
version of installed AusweisApp2 to check if the version supports the WebSocket-API.
You can get this by a HTTP GET query to ``http://localhost:24727/eID-Client?Status``.
If you prefer the JSON syntax you can add it to the parameter ``?Status=json`` to get
the following information.
.. code-block:: json
{
"Implementation-Title": "AusweisApp2",
"Implementation-Vendor": "Governikus GmbH & Co. KG",
"Implementation-Version": "1.16.0",
"Name": "AusweisApp2",
"Specification-Title": "TR-03124",
"Specification-Vendor": "Federal Office for Information Security",
"Specification-Version": "1.3"
}
.. seealso::
The AusweisApp2 SDK provides a :ref:`get_info` command and an :ref:`info` message
to fetch the same information to check the compatibility of used AusweisApp2.
Reader
------
The AusweisApp2 SDK uses PC/SC and paired Smartphones as card reader. If the
user wants to use the "smartphone as card reader" feature it is necessary
to pair the devices by the graphical interface of AusweisApp2. The AusweisApp2 SDK
provides no API to pair those devices.

View File

@ -1,6 +1,6 @@
.. only:: html
.. image:: ../../resources/images/AppLogo_AutentApp2_2014.png
.. image:: ../../resources/images/Logo_AusweisApp2.png
:alt: AusweisApp2
:align: center
:width: 200pt
@ -27,12 +27,14 @@ Table of contents
.. _connection:
.. toctree::
:maxdepth: 3
:caption: Connection
android
desktop
.. raw:: latex
@ -42,6 +44,7 @@ Table of contents
.. _protocol:
.. toctree::
:maxdepth: 2

View File

@ -5,12 +5,12 @@ the AusweisApp2 as an additional service. It distinguishes between
a connection to the application and the communication between your
application and AusweisApp2.
The section "Connection" will show you what you need to do to
The section :ref:`connection` will show you what you need to do to
set up a connection to AusweisApp2. Once you have established
a connection you can send and receive JSON documents in a
bi-directional manner.
There are different commands and messages. These are listed
and described in the section "Protocol". The protocol
and described in the section :ref:`protocol`. The protocol
is split up in :doc:`commands` and :doc:`messages`. Commands
will be sent by your application to control AusweisApp2.
Messages contain additional information to your command
@ -42,7 +42,7 @@ show a possible communication.
In case your client application requires data input from the
ID card, you need to get this from the backend system
(e.g. the eID server) after a succesfull authentication.
(e.g. the eID server) after a successful authentication.
.. seealso::

View File

@ -235,7 +235,7 @@ a result and an url parameter to indicate the end of an authentication.
"minor": "http://www.bsi.bund.de/ecard/api/1.1/resultminor/al/common#internalError",
"language": "en",
"description": "An internal error has occurred during processing.",
"message": "The ID card has been removed. The process is aborted."
"message": "The connection to the ID card has been lost. The process was aborted."
},
"url": "https://test.governikus-eid.de/gov_autent/async?refID=_abcdefgh"
}
@ -328,9 +328,14 @@ Indicates that a CAN is required to continue workflow.
If the AusweisApp2 sends this message, you will have to
provide the CAN of the inserted card with :ref:`set_can`.
The workflow will automatically continue if the CAN was correct
and the AusweisApp2 will send an :ref:`enter_pin` message.
If the correct CAN is entered the retryCounter will still be **1**.
The CAN is required to enable the last attempt of PIN input if
the retryCounter is **1**. The workflow continues automatically with
the correct CAN and the AusweisApp2 will send an :ref:`enter_pin` message.
Despite the correct CAN being entered, the retryCounter remains at **1**.
The CAN is also required, if the authentication terminal has an approved
"CAN allowed right". This allows the workflow to continue without
an additional PIN.
If your application provides an invalid :ref:`set_can` command
the AusweisApp2 will send an :ref:`enter_can` message with an error
@ -340,6 +345,9 @@ If your application provides a valid :ref:`set_can` command
and the CAN was incorrect the AusweisApp2 will send :ref:`enter_can`
again but without an error parameter.
.. versionadded:: 1.14.2
Support of "CAN allowed right".
- **error**: Optional error message if your command :ref:`set_can`
was invalid.
@ -356,6 +364,7 @@ again but without an error parameter.
{
"name": "NFC",
"attached": true,
"keypad": false,
"card":
{
"inoperative": false,
@ -416,6 +425,7 @@ AusweisApp2 will send an :ref:`enter_pin` again with a retryCounter of **3**.
{
"name": "NFC",
"attached": true,
"keypad": false,
"card":
{
"inoperative": false,
@ -474,6 +484,7 @@ Please see the note for more information.
{
"name": "NFC",
"attached": true,
"keypad": false,
"card":
{
"inoperative": false,
@ -634,10 +645,16 @@ If a workflow is in progress and a card with disabled eID functionality was
inserted, this message will still be sent, but the workflow will be paused
until a card with enabled eID functionality is inserted.
.. versionadded:: 1.16.0
Parameter **keypad** added.
- **name**: Identifier of card reader.
- **attached**: Indicates if a card reader is connected or disconnected.
- **attached**: Indicates whether a card reader is connected or disconnected.
- **keypad**: Indicates whether a card reader has a keypad. The parameter
is only shown when a reader is attached.
- **card**: Provides information about inserted card, otherwise null.
@ -657,6 +674,7 @@ until a card with enabled eID functionality is inserted.
"msg": "READER",
"name": "NFC",
"attached": true,
"keypad": false,
"card":
{
"inoperative": false,
@ -687,12 +705,14 @@ Provides information about all connected card readers.
{
"name": "Example reader 1 [SmartCard] (1234567) 01 00",
"attached": true,
"keypad": true,
"card": null
},
{
"name": "NFC",
"attached": true,
"keypad": false,
"card":
{
"inoperative": false,

View File

@ -32,7 +32,7 @@ into the connected card reader.
{"cmd": "ACCEPT"}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"inserted":true,"retryCounter":3},"name":"NFC"}}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"retryCounter":3},"keypad":false,"name":"NFC"}}
{"cmd": "SET_PIN", "value": "123456"}
@ -62,23 +62,23 @@ into the connected card reader.
{"msg": "INSERT_CARD"}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"inserted":true,"retryCounter":3},"name":"NFC"}}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"retryCounter":3},"keypad":false,"name":"NFC"}}
{"cmd": "SET_PIN", "value": "000000"}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"inserted":true,"retryCounter":2},"name":"NFC"}}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"retryCounter":2},"keypad":false,"name":"NFC"}}
{"cmd": "SET_PIN", "value": "000001"}
{"msg": "ENTER_CAN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"inserted":true,"retryCounter":1},"name":"NFC"}}
{"msg": "ENTER_CAN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"retryCounter":1},"keypad":false,"name":"NFC"}}
{"cmd": "SET_CAN", "value": "000000"}
{"msg": "ENTER_CAN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"inserted":true,"retryCounter":1},"name":"NFC"}}
{"msg": "ENTER_CAN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"retryCounter":1},"keypad":false,"name":"NFC"}}
{"cmd": "SET_CAN", "value": "654321"}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"inserted":true,"retryCounter":1},"name":"NFC"}}
{"msg": "ENTER_PIN", "reader": {"attached":true,"card":{"inoperative":false,"deactivated":false,"retryCounter":1},"keypad":false,"name":"NFC"}}
{"cmd": "SET_PIN", "value": "123456"}

View File

@ -1,4 +1,4 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.5.0)
CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
IF(POLICY CMP0010)
CMAKE_POLICY(SET CMP0010 NEW)
@ -26,8 +26,6 @@ IF(ANDROID)
ENDIF()
ENDIF()
ADD_FLAG(-fstack-protector-strong -fstack-protector NOQUOTES VAR COMPILER_FLAGS)
IF(MSVC)
FIND_PROGRAM(MAKE nmake CMAKE_FIND_ROOT_PATH_BOTH)
@ -61,11 +59,15 @@ ELSE()
SET(CMAKE_BUILD_TYPE "DEBUG" CACHE STRING "build type configuration" FORCE)
ENDIF()
IF(NOT ${CMAKE_BUILD_TYPE} STREQUAL "DEBUG" AND NOT ${CMAKE_BUILD_TYPE} STREQUAL "RELEASE")
MESSAGE(FATAL_ERROR "CMAKE_BUILD_TYPE is invalid! Available options: RELEASE, DEBUG")
IF(NOT ${CMAKE_BUILD_TYPE} STREQUAL "DEBUG" AND NOT ${CMAKE_BUILD_TYPE} STREQUAL "RELEASE" AND NOT ${CMAKE_BUILD_TYPE} STREQUAL "RELWITHDEBINFO")
MESSAGE(FATAL_ERROR "CMAKE_BUILD_TYPE is invalid! Available options: RELEASE, RELWITHDEBINFO, DEBUG")
ENDIF()
FIND_HOST_PACKAGE(Perl REQUIRED)
IF(MSVC)
FIND_HOST_PACKAGE(Perl REQUIRED)
ELSE()
SET(PERL_EXECUTABLE perl)
ENDIF()
FIND_HOST_PACKAGE(PythonInterp 2.7 REQUIRED)
IF(NOT "${PYTHON_VERSION_MAJOR}" STREQUAL "2")
@ -80,15 +82,11 @@ ELSE()
SET(PATCH_CMD ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/patch.py --debug -v)
MESSAGE(STATUS "Cannot find 'patch' command... using patch.py")
ENDIF()
SET(PATCH_CMD ${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PROJECT_SOURCE_DIR}/patches)
IF(NOT DESTINATION_DIR)
SET(DESTINATION_DIR ${PROJECT_BINARY_DIR}/dist)
ENDIF()
IF(MSYS)
STRING(REPLACE "C:/msys/1.0" "" DESTINATION_DIR ${DESTINATION_DIR})
ENDIF()
SET(PATCHES_DIR ${PROJECT_SOURCE_DIR}/../patches)
IF(NOT PACKAGES_DIR)
SET(PACKAGES_DIR $ENV{PACKAGES_DIR})
@ -103,162 +101,183 @@ SET_DIRECTORY_PROPERTIES(PROPERTIES EP_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/b)
INCLUDE(Messages)
################################## Versionen
SET(QT 5.9.3)
SET(QT_HASH 57acd8f03f830c2d7dc29fbe28aaa96781b2b9bdddce94196e6761a0f88c6046)
################################## Versions
SET(QT 5.12.4)
SET(QT_HASH 85da5e0ee498759990180d5b8192efaa6060a313c5018b772f57d446bdd425e1)
SET(OPENSSL 1.0.2n)
SET(OPENSSL_HASH 370babb75f278c39e0c50e8c4e7493bc0f18db6867478341a832a982fd15a8fe)
SET(OPENSSL 1.1.1c)
SET(OPENSSL_HASH f6fb3079ad15076154eda9413fed42877d668e7069d9b87396d0804fdb3f4c90)
################################## Files
SET(QT_FILE qt-everywhere-opensource-src-${QT}.tar.xz)
SET(QT_FILE qt-everywhere-src-${QT}.tar.xz)
SET(OPENSSL_FILE openssl-${OPENSSL}.tar.gz)
################################## Downloads
IF("${QT}" MATCHES "alpha|beta|rc")
SET(QT_DEST_DIR development_releases)
ELSE()
SET(QT_DEST_DIR official_releases)
SET(QT_DEST_DIR archive) # official_releases
ENDIF()
STRING(SUBSTRING ${QT} 0 3 QT_SUBVERSION)
STRING(SUBSTRING ${QT} 0 4 QT_SUBVERSION)
SET(QT_URL https://download.qt.io/${QT_DEST_DIR}/qt/${QT_SUBVERSION}/${QT}/single)
SET(OPENSSL_URL https://www.openssl.org/source)
IF(ANDROID OR APPLE)
FIND_PROGRAM(SH_CMD sh CMAKE_FIND_ROOT_PATH_BOTH)
IF(SH_CMD)
MESSAGE(STATUS "Using 'sh' command... ${SH_CMD}")
ELSE()
MESSAGE(FATAL_ERROR "Cannot find 'sh' command")
ENDIF()
ENDIF()
SET(ENABLED_TARGETS)
################################## OpenSSL
#########################################################################
LIST(APPEND ENABLED_TARGETS openssl)
SET(OPENSSL_CONFIGURE_FLAGS no-ssl2 no-ssl3 no-ssl3-method no-dtls no-srp no-idea no-mdc2 no-rc5 no-hw no-engine no-dso -DOPENSSL_NO_HEARTBEATS shared)
SET(OPENSSL_CONFIGURE_FLAGS no-camellia no-bf no-aria no-seed no-poly1305 no-srp no-gost no-idea no-mdc2 no-rc2 no-rc4 no-rc5 no-srtp no-hw no-sm2 no-sm3 no-sm4)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-ocsp no-ct no-dgram)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-cast no-chacha no-blake2 no-rmd160 no-scrypt no-siphash no-whirlpool no-md4 no-des)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-tls1 no-tls1-method no-tls1_1 no-tls1_1-method no-tls1_3 no-ssl3 no-ssl3-method no-dtls no-dtls1-method no-dtls1_2-method)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-deprecated no-engine no-async no-dso no-comp no-ts no-makedepend no-tests shared)
IF(${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
SET(OPENSSL_CONFIGURE_FLAGS --debug ${OPENSSL_CONFIGURE_FLAGS})
ELSE()
SET(OPENSSL_CONFIGURE_FLAGS no-ui-console no-filenames ${OPENSSL_CONFIGURE_FLAGS})
ADD_FLAG(-Os NOQUOTES VAR OPENSSL_COMPILER_FLAGS)
ENDIF()
ADD_FLAG(-fstack-protector-strong -fstack-protector NOQUOTES VAR OPENSSL_COMPILER_FLAGS)
IF(IOS)
SET(OPENSSL_PATCH_COMMAND ${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/openssl_iOS.patch && )
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} iphoneos-cross)
SET(OPENSSL_ENV export CROSS_TOP=${CMAKE_IOS_DEVELOPER_ROOT} && export CROSS_SDK=iPhoneOS.sdk &&)
SET(OPENSSL_COMPILER_FLAGS "-arch arm64")
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} ios64-cross)
STRING(REGEX REPLACE "/SDKs/.*" "" CROSS_TOP_DEV_ROOT "${CMAKE_OSX_SYSROOT}")
SET(OPENSSL_ENV export CROSS_TOP=${CROSS_TOP_DEV_ROOT} && export CROSS_SDK=iPhoneOS.sdk &&)
ELSEIF(APPLE)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} darwin64-x86_64-cc)
SET(COMPILER_FLAGS "${COMPILER_FLAGS} -mmacosx-version-min=10.9")
SET(OPENSSL_COMPILER_FLAGS ${OPENSSL_COMPILER_FLAGS} -mmacosx-version-min=10.12)
ELSEIF(MINGW)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} mingw)
ELSEIF(MSVC)
SET(OPENSSL_PREBUILD ms\\do_ms.bat)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-asm VC-WIN32)
SET(OPENSSL_ADDITIONAL_MAKE -f ms/ntdll.mak)
SET(OPENSSL_INSTALL_TARGET install)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-asm)
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} VC-WIN64A)
ELSE()
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} VC-WIN32)
ENDIF()
ELSEIF(ANDROID)
IF(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a")
SET(OPENSSL_ARCH android-armv7)
SET(OPENSSL_COMPILER_FLAGS "-mfloat-abi=softfp")
SET(OPENSSL_ARCH android-arm)
SET(OPENSSL_COMPILER_FLAGS ${OPENSSL_COMPILER_FLAGS} -mfloat-abi=softfp)
ELSEIF(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86")
SET(OPENSSL_ARCH android-x86)
ELSEIF(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")
SET(OPENSSL_ARCH android)
SET(OPENSSL_ARCH android-arm64)
ELSE()
MESSAGE(FATAL_ERROR "CMAKE_ANDROID_ARCH_ABI not supported by openssl")
ENDIF()
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} no-stdio ${OPENSSL_ARCH})
SET(OPENSSL_ENV export ANDROID_DEV=${CMAKE_SYSROOT}/usr &&)
IF(UNIFIED_INCLUDE)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} -D__ANDROID_API__=${CMAKE_SYSTEM_VERSION} -isystem${UNIFIED_INCLUDE} -isystem${UNIFIED_INCLUDE}/${ANDROID_TOOLCHAIN_MACHINE_NAME})
GET_FILENAME_COMPONENT(toolchain_bin "${CMAKE_C_COMPILER}" DIRECTORY)
SET(OPENSSL_ENV export PATH=${toolchain_bin}/:$ENV{PATH} &&)
IF(NOT CMAKE_COMPILER_IS_GNUCXX)
SET(OPENSSL_ENV ${OPENSSL_ENV} export CC=clang && export CXX=clang++ &&)
ENDIF()
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} --cross-compile-prefix=${CMAKE_C_ANDROID_TOOLCHAIN_PREFIX} ${OPENSSL_ARCH})
IF(UNIFIED_INCLUDE)
SET(OPENSSL_COMPILER_FLAGS ${OPENSSL_COMPILER_FLAGS} -isystem${UNIFIED_INCLUDE} -isystem${UNIFIED_INCLUDE}/${ANDROID_TOOLCHAIN_MACHINE_NAME})
ENDIF()
SET(OPENSSL_COMPILER_FLAGS ${OPENSSL_COMPILER_FLAGS} -D__ANDROID_API__=${CMAKE_SYSTEM_VERSION})
ELSEIF(BSD)
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} BSD-x86_64)
ELSEIF(LINUX)
IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686")
SET(OPENSSL_ARCH linux-generic32)
ELSE()
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(OPENSSL_ARCH linux-x86_64)
ELSE()
SET(OPENSSL_ARCH linux-generic32)
ENDIF()
SET(OPENSSL_CONFIGURE_FLAGS ${OPENSSL_CONFIGURE_FLAGS} ${OPENSSL_ARCH})
ELSE()
MESSAGE(FATAL_ERROR "Unsupported system")
ENDIF()
IF(NOT OPENSSL_PREBUILD)
SET(OPENSSL_PREBUILD ${MAKE} depend)
ENDIF()
IF(NOT OPENSSL_INSTALL_TARGET)
SET(OPENSSL_INSTALL_TARGET install_sw)
ENDIF()
# OpenSSL does not support multiple make jobs!
ExternalProject_Add(openssl
URL ${OPENSSL_URL}/${OPENSSL_FILE}
URL_HASH SHA256=${OPENSSL_HASH}
DOWNLOAD_DIR ${PACKAGES_DIR}
PATCH_COMMAND
${OPENSSL_PATCH_COMMAND}
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/openssl-fix-no-engine-build.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/openssl_rsa_psk.patch
CONFIGURE_COMMAND ${OPENSSL_ENV} ${PERL_EXECUTABLE} Configure --prefix=${DESTINATION_DIR} ${OPENSSL_CONFIGURE_FLAGS} "${COMPILER_FLAGS}" "${OPENSSL_COMPILER_FLAGS}"
BUILD_COMMAND ${OPENSSL_ENV} ${MAKE} ${OPENSSL_ADDITIONAL_MAKE}
PATCH_COMMAND ${PATCH_CMD}/openssl-android-shlib_variant.patch &&
${PATCH_CMD}/openssl-Adjust-iOS-target.patch
CONFIGURE_COMMAND ${OPENSSL_ENV} ${PERL_EXECUTABLE} Configure --prefix=${DESTINATION_DIR} ${OPENSSL_CONFIGURE_FLAGS} "${OPENSSL_COMPILER_FLAGS}"
BUILD_COMMAND ${OPENSSL_ENV} ${MAKE} ${MAKE_JOBS}
BUILD_IN_SOURCE 1
INSTALL_COMMAND ${MAKE} ${OPENSSL_ADDITIONAL_MAKE} ${OPENSSL_INSTALL_TARGET}
INSTALL_COMMAND ${OPENSSL_ENV} ${MAKE} ${MAKE_JOBS} install_sw
)
ExternalProject_Add_Step(openssl prebuild
COMMAND ${OPENSSL_ENV} ${OPENSSL_PREBUILD}
ExternalProject_Add_Step(openssl configdata
COMMAND ${PERL_EXECUTABLE} configdata.pm --dump
DEPENDEES configure
DEPENDERS build
WORKING_DIRECTORY <BINARY_DIR>)
IF(UNIX)
ADD_CUSTOM_COMMAND(TARGET openssl POST_BUILD COMMAND chmod 755 ${DESTINATION_DIR}/lib/libssl*${CMAKE_SHARED_LIBRARY_SUFFIX} ${DESTINATION_DIR}/lib/libcrypto*${CMAKE_SHARED_LIBRARY_SUFFIX})
ENDIF()
IF(ANDROID)
ADD_CUSTOM_COMMAND(TARGET openssl POST_BUILD
COMMAND ${CMAKE_C_COMPILER} --sysroot ${CMAKE_SYSROOT} -o ${DESTINATION_DIR}/lib/libgovcrypto${CMAKE_SHARED_LIBRARY_SUFFIX} -shared -Wl,-soname=libgovcrypto${CMAKE_SHARED_LIBRARY_SUFFIX} -Wl,--whole-archive ${DESTINATION_DIR}/lib/libcrypto${CMAKE_STATIC_LIBRARY_SUFFIX} -Wl,--no-whole-archive
COMMAND ${CMAKE_C_COMPILER} --sysroot ${CMAKE_SYSROOT} -o ${DESTINATION_DIR}/lib/libgovssl${CMAKE_SHARED_LIBRARY_SUFFIX} -shared -Wl,-soname=libgovssl${CMAKE_SHARED_LIBRARY_SUFFIX} -Wl,--whole-archive ${DESTINATION_DIR}/lib/libssl${CMAKE_STATIC_LIBRARY_SUFFIX} -Wl,--no-whole-archive ${DESTINATION_DIR}/lib/libgovcrypto${CMAKE_SHARED_LIBRARY_SUFFIX})
ELSEIF(MAC)
SET(OPENSSL_FILE_VERSION 1.0.0)
IF(MAC)
SET(OPENSSL_FILE_VERSION 1.1)
ADD_CUSTOM_COMMAND(TARGET openssl POST_BUILD
COMMAND install_name_tool -id libcrypto.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX} ${DESTINATION_DIR}/lib/libcrypto.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}
COMMAND install_name_tool -id libssl.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX} ${DESTINATION_DIR}/lib/libssl.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}
COMMAND install_name_tool -change ${DESTINATION_DIR}/lib/libcrypto.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX} libcrypto.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX} ${DESTINATION_DIR}/lib/libssl.${OPENSSL_FILE_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX})
ENDIF()
IF(IOS)
# Remove this work-around! Do not build any .dylib or be able to use .dylib
# Globbing is not supported by cmake command mode! This will work if executed with unix shell only.
ADD_CUSTOM_COMMAND(TARGET openssl POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove ${DESTINATION_DIR}/lib/*.dylib)
ELSEIF(ANDROID)
ADD_CUSTOM_COMMAND(TARGET openssl POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove ${DESTINATION_DIR}/lib/*.a)
ENDIF()
################################## Qt
#########################################################################
LIST(APPEND ENABLED_TARGETS qt)
IF(${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
SET(QT_CONFIGURE_FLAGS -debug -qml-debug)
SET(QT_PATCH_COMMAND ${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Enable-debug-output-for-OpenSSL.patch &&)
SET(QT_PATCH_COMMAND ${PATCH_CMD}/qt-Enable-debug-output-for-OpenSSL.patch &&)
ELSE()
SET(QT_CONFIGURE_FLAGS -release -no-qml-debug)
SET(QT_CONFIGURE_FLAGS -release -optimize-size -no-qml-debug)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} $<$<CONFIG:RelWithDebInfo>:-force-debug-info>)
ENDIF()
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -prefix ${DESTINATION_DIR} -opensource -confirm-license)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -nomake examples -nomake tests -no-mtdev -no-dbus -no-harfbuzz -no-compile-examples -no-sql-sqlite)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -qt-zlib -qt-libpng -qt-libjpeg -qt-pcre)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -system-proxies -openssl-linked -I ${DESTINATION_DIR}/include -L ${DESTINATION_DIR}/lib)
IF(CMAKE_CXX_COMPILER_LAUNCHER STREQUAL "ccache")
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -ccache)
ENDIF()
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -prefix ${DESTINATION_DIR} -opensource -confirm-license -qt-zlib -no-mtdev -qt-libpng -qt-libjpeg -no-harfbuzz -qt-pcre -system-proxies -no-compile-examples -nomake examples -nomake tests -no-sql-sqlite -openssl-linked -I ${DESTINATION_DIR}/include -L ${DESTINATION_DIR}/lib)
LIST(APPEND NO_FEATURES bearermanagement ftp paint_debug)
LIST(APPEND NO_FEATURES dtls winrt_bt ftp paint_debug lcdnumber mdiarea)
LIST(APPEND NO_FEATURES calendarwidget colordialog cups dial fontcombobox fontdialog)
LIST(APPEND NO_FEATURES imageformat_bmp imageformat_ppm imageformat_xbm)
LIST(APPEND NO_FEATURES sharedmemory textodfwriter)
LIST(APPEND NO_FEATURES sharedmemory textodfwriter bearermanagement)
LIST(APPEND NO_FEATURES undocommand undogroup undostack undoview)
LIST(APPEND NO_FEATURES printer printdialog printpreviewdialog printpreviewwidget)
LIST(APPEND NO_FEATURES splashscreen syntaxhighlighter dom sql qdoc)
FOREACH(feature ${NO_FEATURES})
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -no-feature-${feature})
ENDFOREACH()
SET(QT_CONFIGURE_FLAGS_OTHER -no-journald -no-dbus -no-directfb -no-linuxfb)
SET(QT_CONFIGURE_FLAGS_SKIP_MODULES -skip qtscxml -skip qtxmlpatterns -skip qtwebchannel -skip qtwebengine -skip qtscript -skip qtactiveqt -skip qtlocation -skip qtserialbus -skip qtserialport -skip qtgamepad -skip qtvirtualkeyboard -skip qtcanvas3d -skip qtcharts -skip qtdatavis3d -skip qt3d -skip qtpurchasing -skip qtwayland -skip qtremoteobjects -skip qtspeech -skip qtwebview)
LIST(APPEND SKIP_MODULES qtwebglplugin qtscxml qtxmlpatterns qtwebchannel)
LIST(APPEND SKIP_MODULES qtwebengine qtscript qtactiveqt qtlocation qtserialbus)
LIST(APPEND SKIP_MODULES qtserialport qtgamepad qtvirtualkeyboard qtcanvas3d qtcharts)
LIST(APPEND SKIP_MODULES qtdatavis3d qt3d qtpurchasing qtwayland qtremoteobjects)
LIST(APPEND SKIP_MODULES qtspeech qtwebview multimedia qtquickcontrols)
FOREACH(module ${SKIP_MODULES})
SET(QT_CONFIGURE_FLAGS_SKIP_MODULES ${QT_CONFIGURE_FLAGS_SKIP_MODULES} -skip ${module})
ENDFOREACH()
SET(QT_CONFIGURE_FLAGS_OTHER -no-journald -no-directfb -no-linuxfb)
SET(QT_CONFIGURE ./configure)
IF(IOS)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER} -sdk iphoneos -xplatform macx-ios-clang)
@ -276,23 +295,48 @@ ELSEIF(APPLE)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER} -framework -sdk ${osx_sdk})
ELSEIF(WIN32)
IF(MSVC)
SET(QT_PLATFORM win32-msvc2015)
SET(QT_OPENSSL OPENSSL_LIBS=-llibeay32\ -lssleay32)
IF(MSVC_TOOLSET_VERSION STREQUAL "140")
SET(QT_PLATFORM win32-msvc2015)
ELSEIF(MSVC_TOOLSET_VERSION STREQUAL "141")
SET(QT_PLATFORM win32-msvc2017)
ELSEIF(MSVC_TOOLSET_VERSION STREQUAL "142")
SET(QT_PLATFORM win32-msvc2019)
ELSE()
MESSAGE(FATAL_ERROR "Version of MSVC not supported")
ENDIF()
SET(QT_OPENSSL OPENSSL_LIBS=-llibcrypto\ -llibssl)
ELSE()
SET(QT_PLATFORM win32-g++)
SET(QT_OPENSSL OPENSSL_LIBS=-lcrypto\ -lssl)
ENDIF()
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_OPENSSL} -opengl desktop -no-icu -no-sql-odbc -platform ${QT_PLATFORM})
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_OPENSSL} -opengl dynamic -no-icu -no-sql-odbc -platform ${QT_PLATFORM})
SET(QT_CONFIGURE configure.bat)
ELSEIF(ANDROID)
FIND_PACKAGE(Java COMPONENTS Development REQUIRED)
IF(CMAKE_COMPILER_IS_GNUCXX)
SET(ANDROID_XPLATFORM android-g++)
ELSE()
SET(ANDROID_XPLATFORM android-clang)
ENDIF()
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER}
-android-sdk ${ANDROID_SDK} -android-ndk ${CMAKE_ANDROID_NDK} -android-ndk-platform android-${CMAKE_SYSTEM_VERSION} -android-ndk-host ${CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG}
-android-arch ${CMAKE_ANDROID_ARCH_ABI} -android-toolchain-version ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}
-xplatform android-g++)
SET(QT_ENV export OPENSSL_LIBS=-lgovcrypto\ -lgovssl &&)
ELSE()
-android-arch ${CMAKE_ANDROID_ARCH_ABI} -android-toolchain-version ${ANDROID_NDK_TOOLCHAIN_VERSION}
-xplatform ${ANDROID_XPLATFORM})
IF(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} -no-use-gold-linker)
ENDIF()
SET(QT_ENV export OPENSSL_LIBS=-lcrypto-gov\ -lssl-gov &&)
ELSEIF(BSD)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER})
ELSEIF(LINUX)
SET(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER} -no-libproxy)
ELSE()
MESSAGE(FATAL_ERROR "Unsupported system")
ENDIF()
IF(IOS OR ANDROID)
@ -306,21 +350,25 @@ ExternalProject_Add(qt
DOWNLOAD_DIR ${PACKAGES_DIR}
PATCH_COMMAND ${QT_PATCH_COMMAND}
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Make-server-side-signature-algorithms-configurable.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Register-additional-meta-types.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Change-build-configuration-for-Qt-on-iOS.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Disable-unused-imageformats.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Avoid-using-deprecated-APIs-on-iOS-10.0.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Add-IsoDep-to-the-techList-on-Android.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-macOS-iOS-Fix-garbled-text-under-some-conditions.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Fix-reopening-on-macOS.patch &&
${PATCH_CMD}/qt-Disable-unused-imageformats.patch &&
${PATCH_CMD}/qt-Add-work-around-for-freebsd-build.patch &&
${PATCH_CMD}/qt-Remove-Qt-Labs-specific-plugins-from-the-build.patch &&
${PATCH_CMD}/qt-Remove-unused-plugins-from-the-build.patch &&
${PATCH_CMD}/qt-disable-designer.patch &&
${PATCH_CMD}/qt-Disable-qmltime-for-shared-build.patch &&
${PATCH_CMD}/qt-Add-Q_CORE_EXPORT-to-lcEventDispatcher.patch &&
${PATCH_CMD}/qt-Fix-build-with-no-feature-printer.patch &&
${PATCH_CMD}/qt-Fix-build-with-no-feature-printer-on-macOS.patch &&
${PATCH_CMD}/qt-Core-IO-Bluetooth-fix-ambiguous-conversions.patch &&
${PATCH_CMD}/qt-Core-IO-Bluetooth-fix-ambiguous-conversions-for-macO.patch &&
${PATCH_CMD}/qt-Adjust-iOS-target.patch &&
${CMAKE_COMMAND} -E touch qtbase/.gitignore
CONFIGURE_COMMAND ${QT_ENV} ${QT_CONFIGURE} ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_SKIP_MODULES}
BUILD_COMMAND ${MAKE} ${MAKE_JOBS}
BUILD_IN_SOURCE 1
)
ADD_CUSTOM_COMMAND(TARGET qt POST_BUILD COMMAND cmake -E touch ${DESTINATION_DIR}/mkspecs/qt_vendor_governikus)
ADD_CUSTOM_COMMAND(TARGET qt POST_BUILD COMMAND ${CMAKE_COMMAND} -E touch ${DESTINATION_DIR}/mkspecs/qt_vendor_governikus)
#########################################################################
@ -328,7 +376,11 @@ FOREACH(var ${ENABLED_TARGETS})
EXTERNALPROJECT_GET_PROPERTY(${var} INSTALL_DIR)
LIST(APPEND CLEAN_TARGETS ${INSTALL_DIR})
ENDFOREACH()
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${DESTINATION_DIR};${CLEAN_TARGETS}")
IF(CMAKE_VERSION VERSION_LESS "3.15")
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${DESTINATION_DIR};${CLEAN_TARGETS}")
ELSE()
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_CLEAN_FILES "${DESTINATION_DIR};${CLEAN_TARGETS}")
ENDIF()
OPTION(COMPRESS_DEPENDS "Disable DEPENDS for compress target" ON)
IF(COMPRESS_DEPENDS)
@ -349,12 +401,7 @@ IF(DVCS_FOUND)
ENDIF()
ENDIF()
IF(IOS)
SET(SYSTEM_NAME iOS)
# Remove this work-around! Do not build any .dylib or be able to use .dylib
# Globbing is not supported by cmake command mode! This will work if executed with unix shell only.
SET(CLEANUP_FILES ${CMAKE_COMMAND} -E remove ${DESTINATION_DIR}/lib/*.dylib)
ELSEIF(ANDROID)
IF(ANDROID)
SET(SYSTEM_NAME ${CMAKE_SYSTEM_NAME}_${CMAKE_CXX_COMPILER_ID}_${CMAKE_ANDROID_ARCH_ABI})
ELSE()
SET(SYSTEM_NAME ${CMAKE_SYSTEM_NAME}_${CMAKE_CXX_COMPILER_ID})
@ -367,12 +414,16 @@ IF(WIN32)
ENDIF()
ENDIF()
SET(COMPRESSION cfJ)
SET(COMPRESSION_FILENDING tar.xz)
IF(CMAKE_VERSION VERSION_LESS "3.15")
SET(COMPRESSION cfJ)
SET(COMPRESSION_FILENDING tar.xz)
ELSE()
SET(COMPRESSION cf)
SET(COMPRESSION_OPTION --zstd)
SET(COMPRESSION_FILENDING tar.zstd)
ENDIF()
ADD_CUSTOM_TARGET(compress.pre ${compressed_filename}
COMMAND ${CLEANUP_FILES}
COMMAND ${CMAKE_COMMAND} -E remove_directory "${DESTINATION_DIR}/doc"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${DESTINATION_DIR}/lib/engines"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${DESTINATION_DIR}/share"
COMMAND ${SIGN_COMMAND}
DEPENDS ${COMPRESS_TARGETS}
@ -380,6 +431,6 @@ ADD_CUSTOM_TARGET(compress.pre ${compressed_filename}
SET(compressed_filename Toolchain_${SYSTEM_NAME}_${stamp}.${COMPRESSION_FILENDING})
ADD_CUSTOM_COMMAND(OUTPUT ${compressed_filename}
COMMAND ${CMAKE_COMMAND} -E tar "${COMPRESSION}" "${compressed_filename}" "${DESTINATION_DIR}"
COMMAND ${CMAKE_COMMAND} -E tar "${COMPRESSION}" "${compressed_filename}" ${COMPRESSION_OPTION} "${DESTINATION_DIR}"
DEPENDS compress.pre)
ADD_CUSTOM_TARGET(compress DEPENDS ${compressed_filename})

View File

@ -4,20 +4,18 @@ Libraries
Um die AusweisApp2 zu bauen ist eine Toolchain erforderlich, die die
Abhängigkeiten und die Compilertools beinhaltet.
Unterstützte Compiler:
Unterstützte C++17 Compiler:
- MinGW 32 / 64 >= 4.9
- MinGW / GCC >= 7.3
- GCC >= 4.9
- Clang >= 5.0
- Clang >= 3.4
- MSVC >= 2015
- MSVC >= 2017
Notwendige Bibliotheken:
- Qt >= 5.9
- Qt >= 5.10
- http://www.qt.io/download/
@ -25,18 +23,14 @@ Notwendige Bibliotheken:
- https://www.openssl.org/source/
- Aus dem Ordner "patches" müssen die folgenden Patches angewandt werden.
(Sofern der automatische Build mittels CMake gestartet wird, werden
die Patches automatisch angewandt.)
- openssl_rsa_psk.patch
- LibreSSL wird auf Grund des fehlenden RSA-PSK nicht unterstützt.
- pcsclite >= 1.8 (nur Linux/FreeBSD)
Notwendige Tools:
- CMake >= 3.5.0 (>= 3.7.1 für Android)
- CMake >= 3.8.0 (3.14.0 >= für iOS)
- http://www.cmake.org
@ -97,8 +91,8 @@ Beispiel: Innerhalb von /Users/governikus/AusweisApp2 befindet sich der Quellcod
Windows MinGW
^^^^^^^^^^^^^
Unter Windows ist es derzeit empfohlen einen Teil der Toolchain mittels MSYS zu bauen.
Perl muss dafür ebenfalls installiert sein.
Unter Windows ist es derzeit empfohlen einen Teil der Toolchain mittels MSYS2 zu bauen.
Perl muss dafür in MSYS2 nachinstalliert werden. Außerdem ist das Windows SDK notwendig.
MinGW
"""""
@ -106,23 +100,31 @@ MinGW
- http://sourceforge.net/projects/mingw-w64/
- Dabei wurde das folgende Paket getestet:
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/5.3.0/threads-posix/dwarf/i686-5.3.0-release-posix-dwarf-rt_v4-rev0.7z/download
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/threads-posix/dwarf/i686-7.3.0-release-posix-dwarf-rt_v5-rev0.7z/download
MSYS
""""
MSYS2
"""""
- http://www.mingw.org/wiki/msys
- https://sourceforge.net/projects/msys2/files/Base/x86_64/
- Getestet: 1.0.11
- Getestet: msys2-base-x86_64-20180531.tar.xz
Perl
""""
Windows SDK
"""""""""""
- http://www.activestate.com/activeperl/downloads
- https://developer.microsoft.com/de-de/windows/downloads/windows-10-sdk
- Getestet: 5.24.0
- Getestet: 10.0.14393.795 und 10.0.16299.0
Python 2
""""""""
- https://www.python.org/downloads/
- Getestet: python-2.7.15.amd64.msi
Vorbereitung
@ -131,46 +133,72 @@ Vorbereitung
#. Eintragen des Ordners "bin" von der MinGW-Installation in %PATH%.
#. Installation von MSYS, welche sich auf die MinGW-Installation bezieht.
#. Entpacken von MSYS2.
#. Der Ordner von Perl muss sich in %PATH% befinden.
#. Start von "msys2_shell.cmd -use-full-path".
#. In der Datei "fstab" unter C:\msys\1.0\etc folgende Einträge mit den jeweiligen Pfaden:
#. System aktualisieren mittels "pacman -Syu" (danach MSYS2 neustarten).
#. Perl nachinstallieren mittels "pacman -S perl".
#. Installation des Windows SDK und setzen einer Systemvariable:
::
C:/mingw32/i686-5.3.0-release-posix-dwarf-rt_v4-rev0 /mingw
C:/Perl /perl
Für das Windows SDK 10.0.15063.0 und neuer (getestet: 10.0.17763.0):
WindowsSdkVerBinPath = C:\Program Files (x86)\Windows Kits\10\bin\%VERSION%
Für alle älteren Versionen:
WindowsSdkDir = C:\Program Files (x86)\Windows Kits\10
Durch einige Probleme mit Unix-Shell-Skripten ist es derzeit leider
notwendig die Toolchain in zwei Schritten aufzubauen.
notwendig die Toolchain in zwei Schritten zu bauen.
Hierzu muss OpenSSL und Qt separat gebaut werden.
#. Download und Start der Installation von Python.
#. Sicherstellen, dass die python.exe während der Installation zum PATH hinzugefügt wird.
Eventuell muss für MinGW folgende Option gesetzt werden (QTBUG-16443):
#. Windows --> gpedit.msc --> Enter (als Administrator)
#. Richtlinien für Lokaler Computer
#. Computerkonfiguration
#. Administrative Vorlagen
#. System
#. Dateisystem
#. Lange Win32-Pfade aktivieren
openssl / Qt
""""""""""""
Da Qt mittels Batchskript gebaut werden muss, ist es leider nicht möglich dies innerhalb
von MSYS zu bauen [2]. Daher wird OpenSSL und Qt mittels Windows-CLI konfiguriert.
Dabei wird Qt über Windows-CLI und OpenSSL unter MSYS gebaut.
von MSYS2 zu bauen [2]. Daher wird OpenSSL und Qt mittels Windows-CLI konfiguriert.
Dabei wird Qt über Windows-CLI und OpenSSL unter MSYS2 gebaut.
#. cmd.exe von Windows starten
#. mkdir c:\msys\1.0\home\user\qt ("user" ist der Benutzer, der unter MSYS verwendet wird)
#. mkdir c:\msys64\home\user\qt ("user" ist der Benutzer, der unter MSYS2 verwendet wird)
#. cd c:\msys\1.0\home\user\qt
#. cd c:\msys64\home\user\qt
#. cmake -DCMAKE_BUILD_TYPE=release -DPACKAGES_DIR=C:/packages C:/AusweisApp2/libs -G "MinGW Makefiles"
#. MSYS Shell starten
#. MSYS2 Shell starten ("msys2_shell.cmd -use-full-path")
#. cd qt
#. mingw32-make openssl
#. MSYS Shell verlassen
#. MSYS2 Shell verlassen
#. In der cmd.exe: c:\msys\1.0\home\user\qt
#. In der cmd.exe: c:\msys64\home\user\qt
#. mingw32-make qt
@ -182,7 +210,7 @@ iOS
"""
Die Toolchain für iOS kann nur auf MacOS gebaut werden. Dabei müssen XCode und
die Command Line Tools (siehe "xcode-select -p" bzw. "xcode-select --install")
auf dem Mac vorhanden sein. Die folgende Anleitung wurde unter MacOS 10.9 und 10.11 getestet.
auf dem Mac vorhanden sein. Die folgende Anleitung wurde unter macOS 10.12 getestet.
Ebenfalls muss für den Build-Vorgang von Qt ein iOS Developer-Zertifikat mit Wildcard (*)
im Keystore von MacOS hinterlegt sein.
@ -207,30 +235,33 @@ Komponenten vorhanden sein:
- https://developer.android.com/tools/sdk/ndk/index.html
- Getestet: r10e (https://wiki.qt.io/Qt_for_Android_known_issues)
- Getestet: r18 (https://wiki.qt.io/Qt_for_Android_known_issues)
- Android SDK mit gesetztem ANDROID_HOME
- https://developer.android.com/studio/releases/sdk-tools.html
- Getestet: 25.2.5
- Getestet: 26.1.1
- Qt ist derzeit nicht mit aktuelleren kompatibel: https://bugreports.qt.io/browse/QTBUG-61988
- SDK build tools
- Unter bestimmten Umständen kann es vorkommen, dass die Build-Tools-Version nicht erkannt
wird. Dies kann mittels der Umgebungsvariable ANDROID_BUILD_TOOLS_REVISION behoben werden.
Die genaue Version ist im Android Manager vom Android SDK (./tools/android) hinterlegt.
- https://developer.android.com/studio/releases/build-tools
- Getestet: 27.0.1
- Getestet: 28.0.3
- Um Qt erfolgreich zu bauen, sind verschiedene API Level von Android notwendig.
Diese sollten mindestens Level 18 und 21 sein. Nähere Informationen dazu
- SDK platform tools
- https://developer.android.com/studio/releases/platform-tools
- Getestet: 28.0.1
- Um Qt erfolgreich zu bauen, ist mindestens ein API-Levelpaket von Android notwendig.
Dieses sollte mindestens Level 21 sein. Nähere Informationen dazu
sind im Wiki von Qt enthalten: http://wiki.qt.io/Android
Die Plattformen können mittels Android Manager nachinstalliert werden.
- JDK mit gesetztem JAVA_HOME
- Apache Ant mit gesetztem ANT_HOME
Beispiel: Innerhalb von /home/governikus/AusweisApp2 befindet sich der Quellcode.

View File

@ -368,7 +368,7 @@ class PatchSet(object):
header.append(fe.line)
fe.next()
if fe.is_empty:
if p == None:
if p is None:
debug("no patch data found") # error is shown later
self.errors += 1
else:
@ -956,7 +956,6 @@ class PatchSet(object):
if exists(backupname):
warning("can't backup original file to %s - aborting" % backupname)
else:
import shutil
shutil.move(filename, backupname)
if self.write_hunks(backupname, filename, p.hunks):
info("successfully patched %d/%d:\t %s" % (i+1, total, filename))
@ -1020,7 +1019,6 @@ class PatchSet(object):
lineno = 1
line = fp.readline()
hno = None
try:
for hno, h in enumerate(hunks):
# skip to first line of the hunk

View File

@ -0,0 +1,25 @@
From 0628b87d65feb0209303e91bf7529628c4dd80f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Fri, 1 Feb 2019 13:27:04 +0100
Subject: [PATCH] Adjust iOS target
---
Configurations/15-ios.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git x/Configurations/15-ios.conf y/Configurations/15-ios.conf
index 1bb9f48d06..fb0ece9aff 100644
--- x/Configurations/15-ios.conf
+++ y/Configurations/15-ios.conf
@@ -24,7 +24,7 @@ my %targets = (
"ios64-xcrun" => {
inherit_from => [ "ios-common", asm("aarch64_asm") ],
CC => "xcrun -sdk iphoneos cc",
- cflags => add("-arch arm64 -mios-version-min=7.0.0 -fno-common"),
+ cflags => add("-arch arm64 -mios-version-min=13.0 -fno-common -fembed-bitcode"),
bn_ops => "SIXTY_FOUR_BIT_LONG RC4_CHAR",
perlasm_scheme => "ios64",
},
--
2.20.1

View File

@ -0,0 +1,25 @@
From f63dce0a614ad26176dfbf4069264a4ec36c11b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Tue, 20 Nov 2018 16:05:20 +0100
Subject: [PATCH] android shlib_variant
---
Configurations/15-android.conf | 2 ++
1 file changed, 2 insertions(+)
diff --git x/Configurations/15-android.conf y/Configurations/15-android.conf
index 7b496a4529..559e11e27f 100644
--- x/Configurations/15-android.conf
+++ y/Configurations/15-android.conf
@@ -170,6 +170,8 @@ my %targets = (
bn_ops => sub { android_ndk()->{bn_ops} },
bin_cflags => "-pie",
enable => [ ],
+ shlib_variant => '-gov',
+ shared_extension => '.so',
},
"android-arm" => {
################################################################
--
2.20.1

View File

@ -0,0 +1,38 @@
From 81839e57d5f3d86d6663f58d5d6b7b0605a6986e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Tue, 30 Jul 2019 12:49:14 +0200
Subject: [PATCH] Add Q_CORE_EXPORT to lcEventDispatcher*
Undefined symbols for architecture arm64:
"lcEventDispatcher()", referenced from:
_qt_main_wrapper in libqios.a(qioseventdispatcher.o)
+[QIOSApplicationStateTracker applicationDidFinishLaunching:] in libqios.a(qioseventdispatcher.o)
user_main_trampoline() in libqios.a(qioseventdispatcher.o)
+[QIOSApplicationStateTracker applicationWillTerminate] in libqios.a(qioseventdispatcher.o)
QIOSJumpingEventDispatcher::interruptEventLoopExec() in libqios.a(qioseventdispatcher.o)
ld: symbol(s) not found for architecture arm64
Change-Id: I43677cf3bce0588753731d81d533f85b0ea1e223
Fixes: QTBUG-75457
---
src/corelib/kernel/qeventdispatcher_cf.mm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git x/qtbase/src/corelib/kernel/qeventdispatcher_cf.mm y/qtbase/src/corelib/kernel/qeventdispatcher_cf.mm
index b7b379e2c1..ac711d74ee 100644
--- x/qtbase/src/corelib/kernel/qeventdispatcher_cf.mm
+++ y/qtbase/src/corelib/kernel/qeventdispatcher_cf.mm
@@ -148,8 +148,8 @@ static CFStringRef runLoopMode(NSDictionary *dictionary)
QT_BEGIN_NAMESPACE
-Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher");
-Q_LOGGING_CATEGORY(lcEventDispatcherTimers, "qt.eventdispatcher.timers");
+Q_CORE_EXPORT Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher");
+Q_CORE_EXPORT Q_LOGGING_CATEGORY(lcEventDispatcherTimers, "qt.eventdispatcher.timers");
class RunLoopDebugger : public QObject
{
--
2.22.0

View File

@ -0,0 +1,27 @@
From c06988f6a5816e8ebbcebfcf7e9799cd5b90a91d Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Fri, 13 Apr 2018 08:22:18 +0200
Subject: Add work-around for freebsd build
Change-Id: I14e66e072f9667479815693e3dbbac71385797e7
Task-number: QTBUG-65425
---
qmake/Makefile.unix | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git x/qtbase/qmake/Makefile.unix y/qtbase/qmake/Makefile.unix
index 0f69b6b487..26ac96c473 100644
--- x/qtbase/qmake/Makefile.unix
+++ y/qtbase/qmake/Makefile.unix
@@ -269,7 +269,7 @@ qlibraryinfo.o: $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
$(CXX) -c -o $@ $(CXXFLAGS) -DQT_BUILD_QMAKE_BOOTSTRAP $<
qlibraryinfo_final.o: $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp $(BUILD_PATH)/src/corelib/global/qconfig.cpp
- $(CXX) -c -o $@ $(CXXFLAGS) $<
+ $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
qnumeric.o: $(SOURCE_PATH)/src/corelib/global/qnumeric.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $<
--
2.21.0

View File

@ -0,0 +1,26 @@
From 86b0caf2e167953ef1e50f32edb96e1e64eeba7e Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Fri, 19 Jul 2019 15:19:08 +0200
Subject: Adjust iOS target
Change-Id: I6c7f0616d52b0d118ffd8c031f3f51212b8ed821
---
mkspecs/macx-ios-clang/qmake.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git x/qtbase/mkspecs/macx-ios-clang/qmake.conf y/qtbase/mkspecs/macx-ios-clang/qmake.conf
index 88e96ef32e..b3372a8232 100644
--- x/qtbase/mkspecs/macx-ios-clang/qmake.conf
+++ y/qtbase/mkspecs/macx-ios-clang/qmake.conf
@@ -2,7 +2,7 @@
# qmake configuration for macx-ios-clang
#
-QMAKE_IOS_DEPLOYMENT_TARGET = 11.0
+QMAKE_IOS_DEPLOYMENT_TARGET = 13.0
# Universal target (iPhone and iPad)
QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 1,2
--
2.22.0

View File

@ -0,0 +1,253 @@
From daf0e91b5be5a136d93b0e66efc3681f28a2ffde Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Fri, 19 Jul 2019 11:06:59 +0200
Subject: [PATCH] Core/IO/Bluetooth - fix ambiguous conversions for macOS
This is a sibling of QTBUG-76847 on macOS instead of iOS.
---
.../qbluetoothdevicediscoveryagent_osx.mm | 6 ++---
src/bluetooth/qbluetoothlocaldevice_osx.mm | 2 +-
src/bluetooth/qbluetoothserver_osx.mm | 6 ++---
src/bluetooth/qbluetoothserviceinfo_osx.mm | 2 +-
src/bluetooth/qbluetoothsocket_osx.mm | 26 +++++++++----------
src/bluetooth/qbluetoothtransferreply_osx.mm | 10 +++----
6 files changed, 26 insertions(+), 26 deletions(-)
diff --git x/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm y/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm
index 4657da82..bdc3c85e 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm
@@ -181,7 +181,7 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(con
QBluetoothDeviceDiscoveryAgentPrivate::~QBluetoothDeviceDiscoveryAgentPrivate()
{
- if (inquiryLE && agentState != NonActive) {
+ if (inquiryLE.data() && agentState != NonActive) {
// We want the LE scan to stop as soon as possible.
if (dispatch_queue_t leQueue = OSXBluetooth::qt_LE_queue()) {
// Local variable to be retained ...
@@ -195,7 +195,7 @@ QBluetoothDeviceDiscoveryAgentPrivate::~QBluetoothDeviceDiscoveryAgentPrivate()
bool QBluetoothDeviceDiscoveryAgentPrivate::isValid() const
{
- return hostController && [hostController powerState] == kBluetoothHCIPowerStateON;
+ return hostController.data() && [hostController powerState] == kBluetoothHCIPowerStateON;
}
bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const
@@ -292,7 +292,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startLE()
// Check queue and create scanner:
inquiryLE.reset([[LEDeviceInquiryObjC alloc] initWithNotifier:notifier.data()]);
- if (inquiryLE)
+ if (inquiryLE.data())
notifier.take(); // Whatever happens next, inquiryLE is already the owner ...
dispatch_queue_t leQueue(qt_LE_queue());
diff --git x/qtconnectivity/src/bluetooth/qbluetoothlocaldevice_osx.mm y/qtconnectivity/src/bluetooth/qbluetoothlocaldevice_osx.mm
index 52b7bba8..e7dd9906 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothlocaldevice_osx.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothlocaldevice_osx.mm
@@ -149,7 +149,7 @@ QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(QBluetoothLocalDevice
bool QBluetoothLocalDevicePrivate::isValid() const
{
- return hostController;
+ return hostController.data();
}
void QBluetoothLocalDevicePrivate::requestPairing(const QBluetoothAddress &address, Pairing pairing)
diff --git x/qtconnectivity/src/bluetooth/qbluetoothserver_osx.mm y/qtconnectivity/src/bluetooth/qbluetoothserver_osx.mm
index eefaf4da..5d3b8fc4 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothserver_osx.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothserver_osx.mm
@@ -142,7 +142,7 @@ void QBluetoothServerPrivate::stopListener()
void QBluetoothServerPrivate::openNotify(IOBluetoothRFCOMMChannel *channel)
{
- Q_ASSERT_X(listener, Q_FUNC_INFO, "invalid listener (nil)");
+ Q_ASSERT_X(listener.data(), Q_FUNC_INFO, "invalid listener (nil)");
Q_ASSERT_X(channel, Q_FUNC_INFO, "invalid channel (nil)");
Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)");
@@ -154,7 +154,7 @@ void QBluetoothServerPrivate::openNotify(IOBluetoothRFCOMMChannel *channel)
void QBluetoothServerPrivate::openNotify(IOBluetoothL2CAPChannel *channel)
{
- Q_ASSERT_X(listener, Q_FUNC_INFO, "invalid listener (nil)");
+ Q_ASSERT_X(listener.data(), Q_FUNC_INFO, "invalid listener (nil)");
Q_ASSERT_X(channel, Q_FUNC_INFO, "invalid channel (nil)");
Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)");
@@ -293,7 +293,7 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port)
OSXBluetooth::qt_test_iobluetooth_runloop();
- if (d_ptr->listener) {
+ if (d_ptr->listener.data()) {
qCWarning(QT_BT_OSX) << "already in listen mode, close server first";
return false;
}
diff --git x/qtconnectivity/src/bluetooth/qbluetoothserviceinfo_osx.mm y/qtconnectivity/src/bluetooth/qbluetoothserviceinfo_osx.mm
index 34de4695..7ce4c645 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothserviceinfo_osx.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothserviceinfo_osx.mm
@@ -152,7 +152,7 @@ bool QBluetoothServiceInfoPrivate::unregisterService()
if (!registered)
return false;
- Q_ASSERT_X(serviceRecord, Q_FUNC_INFO, "service registered, but serviceRecord is nil");
+ Q_ASSERT_X(serviceRecord.data(), Q_FUNC_INFO, "service registered, but serviceRecord is nil");
[serviceRecord removeServiceRecord];
serviceRecord.reset(nil);
diff --git x/qtconnectivity/src/bluetooth/qbluetoothsocket_osx.mm y/qtconnectivity/src/bluetooth/qbluetoothsocket_osx.mm
index 7f630146..2a856092 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothsocket_osx.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothsocket_osx.mm
@@ -101,13 +101,13 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
rfcommChannel.reset([[ObjCRFCOMMChannel alloc] initWithDelegate:this]);
- if (rfcommChannel)
+ if (rfcommChannel.data())
status = [rfcommChannel connectAsyncToDevice:address withChannelID:port];
else
status = kIOReturnNoMemory;
} else if (socketType == QBluetoothServiceInfo::L2capProtocol) {
l2capChannel.reset([[ObjCL2CAPChannel alloc] initWithDelegate:this]);
- if (l2capChannel)
+ if (l2capChannel.data())
status = [l2capChannel connectAsyncToDevice:address withPSM:port];
else
status = kIOReturnNoMemory;
@@ -181,10 +181,10 @@ QString QBluetoothSocketPrivate::peerName() const
NSString *nsName = nil;
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
- if (rfcommChannel)
+ if (rfcommChannel.data())
nsName = [rfcommChannel peerName];
} else if (socketType == QBluetoothServiceInfo::L2capProtocol) {
- if (l2capChannel)
+ if (l2capChannel.data())
nsName = [l2capChannel peerName];
}
@@ -198,10 +198,10 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
{
BluetoothDeviceAddress addr = {};
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
- if (rfcommChannel)
+ if (rfcommChannel.data())
addr = [rfcommChannel peerAddress];
} else if (socketType == QBluetoothServiceInfo::L2capProtocol) {
- if (l2capChannel)
+ if (l2capChannel.data())
addr = [l2capChannel peerAddress];
}
@@ -211,10 +211,10 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
quint16 QBluetoothSocketPrivate::peerPort() const
{
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
- if (rfcommChannel)
+ if (rfcommChannel.data())
return [rfcommChannel getChannelID];
} else if (socketType == QBluetoothServiceInfo::L2capProtocol) {
- if (l2capChannel)
+ if (l2capChannel.data())
return [l2capChannel getPSM];
}
@@ -231,7 +231,7 @@ void QBluetoothSocketPrivate::_q_writeNotify()
Q_ASSERT_X(socketType == QBluetoothServiceInfo::L2capProtocol
|| socketType == QBluetoothServiceInfo::RfcommProtocol,
Q_FUNC_INFO, "invalid socket type");
- Q_ASSERT_X(l2capChannel || rfcommChannel, Q_FUNC_INFO,
+ Q_ASSERT_X(l2capChannel.data() || rfcommChannel.data(), Q_FUNC_INFO,
"invalid socket (no open channel)");
Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)");
@@ -275,13 +275,13 @@ bool QBluetoothSocketPrivate::setChannel(IOBluetoothRFCOMMChannel *channel)
openMode = QIODevice::ReadWrite;
rfcommChannel.reset([[ObjCRFCOMMChannel alloc] initWithDelegate:this channel:channel]);
- if (rfcommChannel) {// We do not handle errors, up to an external user.
+ if (rfcommChannel.data()) {// We do not handle errors, up to an external user.
q_ptr->setOpenMode(QIODevice::ReadWrite);
state = QBluetoothSocket::ConnectedState;
socketType = QBluetoothServiceInfo::RfcommProtocol;
}
- return rfcommChannel;
+ return rfcommChannel.data();
}
bool QBluetoothSocketPrivate::setChannel(IOBluetoothL2CAPChannel *channel)
@@ -299,13 +299,13 @@ bool QBluetoothSocketPrivate::setChannel(IOBluetoothL2CAPChannel *channel)
openMode = QIODevice::ReadWrite;
l2capChannel.reset([[ObjCL2CAPChannel alloc] initWithDelegate:this channel:channel]);
- if (l2capChannel) {// We do not handle errors, up to an external user.
+ if (l2capChannel.data()) {// We do not handle errors, up to an external user.
q_ptr->setOpenMode(QIODevice::ReadWrite);
state = QBluetoothSocket::ConnectedState;
socketType = QBluetoothServiceInfo::L2capProtocol;
}
- return l2capChannel;
+ return l2capChannel.data();
}
diff --git x/qtconnectivity/src/bluetooth/qbluetoothtransferreply_osx.mm y/qtconnectivity/src/bluetooth/qbluetoothtransferreply_osx.mm
index 65c8f82d..40a747f8 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothtransferreply_osx.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothtransferreply_osx.mm
@@ -136,13 +136,13 @@ QBluetoothTransferReplyOSXPrivate::~QBluetoothTransferReplyOSXPrivate()
// The OBEX session will be closed then. If
// somehow IOBluetooth/OBEX still has a reference to our
// session, it will not call any of delegate's callbacks.
- if (session)
+ if (session.data())
[session closeSession];
}
bool QBluetoothTransferReplyOSXPrivate::isActive() const
{
- return agent || (session && [session hasActiveRequest]);
+ return agent.data() || (session.data() && [session hasActiveRequest]);
}
bool QBluetoothTransferReplyOSXPrivate::startOPP(const QBluetoothAddress &device)
@@ -218,7 +218,7 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev
void QBluetoothTransferReplyOSXPrivate::sendPut()
{
Q_ASSERT_X(inputStream, Q_FUNC_INFO, "invalid input stream (null)");
- Q_ASSERT_X(session, Q_FUNC_INFO, "invalid OBEX session (nil)");
+ Q_ASSERT_X(session.data(), Q_FUNC_INFO, "invalid OBEX session (nil)");
Q_ASSERT_X([session isConnected], Q_FUNC_INFO, "not connected");
Q_ASSERT_X(![session hasActiveRequest], Q_FUNC_INFO,
"session already has an active request");
@@ -268,7 +268,7 @@ void QBluetoothTransferReplyOSXPrivate::OBEXConnectError(OBEXError errorCode, OB
Q_UNUSED(errorCode)
Q_UNUSED(response)
- if (session) {
+ if (session.data()) {
setReplyError(QBluetoothTransferReply::SessionError,
QCoreApplication::translate(TRANSFER_REPLY, TR_CONNECT_FAILED));
} else {
@@ -283,7 +283,7 @@ void QBluetoothTransferReplyOSXPrivate::OBEXConnectError(OBEXError errorCode, OB
void QBluetoothTransferReplyOSXPrivate::OBEXConnectSuccess()
{
// Now that OBEX connect succeeded, we can send an OBEX put request.
- if (!session) {
+ if (!session.data()) {
// We're still in OBEXConnect(), it'll take care of next steps.
return;
}
--
2.22.0

View File

@ -0,0 +1,97 @@
From cd287186955f1c654a1f35197f0515ffc222e734 Mon Sep 17 00:00:00 2001
From: Timur Pocheptsov <timur.pocheptsov@qt.io>
Date: Wed, 3 Jul 2019 15:26:31 +0200
Subject: [PATCH] Core/IO/Bluetooth - fix ambiguous conversions
... somewhat prospective fix (I do not have the new iOS yet), so far build
never failed with my current SDK.
Fixes: QTBUG-76847
Change-Id: Iab75c3cd47144cd83b679b1dbf82339e29c07bd1
---
src/bluetooth/osx/osxbtperipheralmanager.mm | 4 ++--
src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm | 6 +++---
src/bluetooth/qlowenergycontroller_osx.mm | 6 +++---
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git x/qtconnectivity/src/bluetooth/osx/osxbtperipheralmanager.mm y/qtconnectivity/src/bluetooth/osx/osxbtperipheralmanager.mm
index 1998340a..39f9808c 100644
--- x/qtconnectivity/src/bluetooth/osx/osxbtperipheralmanager.mm
+++ y/qtconnectivity/src/bluetooth/osx/osxbtperipheralmanager.mm
@@ -340,7 +340,7 @@ bool qt_validate_value_range(const QLowEnergyCharacteristicData &data)
- (void)startAdvertising
{
state = PeripheralState::waitingForPowerOn;
- if (manager)
+ if (manager.data())
[manager setDelegate:nil];
manager.reset([[CBPeripheralManager alloc] initWithDelegate:self
queue:OSXBluetooth::qt_LE_queue()]);
@@ -405,7 +405,7 @@ bool qt_validate_value_range(const QLowEnergyCharacteristicData &data)
- (void) addServicesToPeripheral
{
- Q_ASSERT(manager);
+ Q_ASSERT(manager.data());
if (nextServiceToAdd < services.size())
[manager addService:services[nextServiceToAdd++]];
diff --git x/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm y/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm
index c50d546d..557785b4 100644
--- x/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm
+++ y/qtconnectivity/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm
@@ -132,7 +132,7 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(con
QBluetoothDeviceDiscoveryAgentPrivate::~QBluetoothDeviceDiscoveryAgentPrivate()
{
- if (inquiryLE) {
+ if (inquiryLE.data()) {
// We want the LE scan to stop as soon as possible.
if (dispatch_queue_t leQueue = OSXBluetooth::qt_LE_queue()) {
// Local variable to be retained ...
@@ -151,7 +151,7 @@ bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const
if (stopPending)
return false;
- return inquiryLE;
+ return !!inquiryLE.data();
}
void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent::DiscoveryMethods /*methods*/)
@@ -178,7 +178,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent
this, &QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceFound);
inquiryLE.reset([[LEDeviceInquiryObjC alloc] initWithNotifier:notifier.data()]);
- if (inquiryLE)
+ if (inquiryLE.data())
notifier.take(); // Whatever happens next, inquiryLE is already the owner ...
dispatch_queue_t leQueue(qt_LE_queue());
diff --git x/qtconnectivity/src/bluetooth/qlowenergycontroller_osx.mm y/qtconnectivity/src/bluetooth/qlowenergycontroller_osx.mm
index 8bcdc22e..9aaee855 100644
--- x/qtconnectivity/src/bluetooth/qlowenergycontroller_osx.mm
+++ y/qtconnectivity/src/bluetooth/qlowenergycontroller_osx.mm
@@ -165,7 +165,7 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl
#endif
} else {
centralManager.reset([[ObjCCentralManager alloc] initWith:notifier.data()]);
- if (!centralManager) {
+ if (!centralManager.data()) {
qCWarning(QT_BT_OSX) << "failed to initialize central manager";
return;
}
@@ -200,9 +200,9 @@ QLowEnergyControllerPrivateOSX::~QLowEnergyControllerPrivateOSX()
bool QLowEnergyControllerPrivateOSX::isValid() const
{
#ifdef Q_OS_TVOS
- return centralManager;
+ return centralManager.data();
#else
- return centralManager || peripheralManager;
+ return centralManager.data() || peripheralManager.data();
#endif
}
--
2.22.0

View File

@ -0,0 +1,32 @@
From 9040ffde6a172f634249af58cd7f1bd3fcc33a00 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Tue, 30 Jul 2019 10:42:57 +0200
Subject: [PATCH] Disable qmltime for shared build
=== BUILD TARGET qmltime OF PROJECT qmltime WITH CONFIGURATION Release ===
Code Signing Error: Signing for "qmltime" requires a development team. Select a development team in the Signing & Capabilities editor.
Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 13.0'
** BUILD FAILED **
Fixes: QTBUG-67135
---
tools/tools.pro | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git x/qtdeclarative/tools/tools.pro y/qtdeclarative/tools/tools.pro
index d3ec38071..d431ee835 100644
--- x/qtdeclarative/tools/tools.pro
+++ y/qtdeclarative/tools/tools.pro
@@ -20,8 +20,7 @@ qtConfig(thread):!android|android_app {
qtHaveModule(quick) {
!static: {
SUBDIRS += \
- qmlscene \
- qmltime
+ qmlscene
qtConfig(regularexpression):qtConfig(process) {
SUBDIRS += \
--
2.22.0

View File

@ -0,0 +1,27 @@
From 2674afcd19c8ce6a23a3c69bb9d41d82838adf86 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Tue, 18 Jun 2019 07:47:39 +0200
Subject: Disable unused imageformats
Change-Id: Iace4d751b615d1e54d94e9f8ab774ef39b111a79
---
src/plugins/imageformats/imageformats.pro | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git x/qtimageformats/src/plugins/imageformats/imageformats.pro y/qtimageformats/src/plugins/imageformats/imageformats.pro
index be1e20a..06feab3 100644
--- x/qtimageformats/src/plugins/imageformats/imageformats.pro
+++ y/qtimageformats/src/plugins/imageformats/imageformats.pro
@@ -22,8 +22,7 @@ qtConfig(jasper) {
SUBDIRS += macjp2
}
-winrt {
SUBDIRS -= tiff \
tga \
+ wbmp \
webp
-}
--
2.21.0

View File

@ -0,0 +1,68 @@
From fc591411928c982f763c2fee060c0665a5b6b8b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Tue, 10 Oct 2017 13:44:48 +0200
Subject: [PATCH] Enable debug output for OpenSSL
---
src/network/ssl/qsslsocket.cpp | 2 +-
src/network/ssl/qsslsocket_mac.cpp | 1 +
src/network/ssl/qsslsocket_mac_shared.cpp | 4 ++--
src/network/ssl/qsslsocket_openssl.cpp | 2 +-
4 files changed, 5 insertions(+), 4 deletions(-)
diff --git x/qtbase/src/network/ssl/qsslsocket.cpp y/qtbase/src/network/ssl/qsslsocket.cpp
index 5c9ebac283..b843191e89 100644
--- x/qtbase/src/network/ssl/qsslsocket.cpp
+++ y/qtbase/src/network/ssl/qsslsocket.cpp
@@ -39,7 +39,7 @@
****************************************************************************/
-//#define QSSLSOCKET_DEBUG
+#define QSSLSOCKET_DEBUG
/*!
\class QSslSocket
diff --git x/qtbase/src/network/ssl/qsslsocket_mac.cpp y/qtbase/src/network/ssl/qsslsocket_mac.cpp
index 68c8ccff89..15d887c1f9 100644
--- x/qtbase/src/network/ssl/qsslsocket_mac.cpp
+++ y/qtbase/src/network/ssl/qsslsocket_mac.cpp
@@ -37,6 +37,7 @@
**
****************************************************************************/
+#define QSSLSOCKET_DEBUG
#include "qsslsocket.h"
#include "qssl_p.h"
diff --git x/qtbase/src/network/ssl/qsslsocket_mac_shared.cpp y/qtbase/src/network/ssl/qsslsocket_mac_shared.cpp
index d239fe23dd..59436ca276 100644
--- x/qtbase/src/network/ssl/qsslsocket_mac_shared.cpp
+++ y/qtbase/src/network/ssl/qsslsocket_mac_shared.cpp
@@ -38,8 +38,8 @@
**
****************************************************************************/
-//#define QSSLSOCKET_DEBUG
-//#define QT_DECRYPT_SSL_TRAFFIC
+#define QSSLSOCKET_DEBUG
+#define QT_DECRYPT_SSL_TRAFFIC
#include "qssl_p.h"
#include "qsslsocket.h"
diff --git x/qtbase/src/network/ssl/qsslsocket_openssl.cpp y/qtbase/src/network/ssl/qsslsocket_openssl.cpp
index 2d771b5637..beb361d744 100644
--- x/qtbase/src/network/ssl/qsslsocket_openssl.cpp
+++ y/qtbase/src/network/ssl/qsslsocket_openssl.cpp
@@ -53,7 +53,7 @@
**
****************************************************************************/
-//#define QSSLSOCKET_DEBUG
+#define QSSLSOCKET_DEBUG
#include "qssl_p.h"
#include "qsslsocket_openssl_p.h"
--
2.14.2

View File

@ -0,0 +1,159 @@
From fdb01d0c01261008f9055339db55c6e9693f18c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Tue, 23 Jul 2019 12:44:45 +0200
Subject: [PATCH 2/2] Fix build with -no-feature-printer on macOS
Fixes: QTBUG-62675
Change-Id: I3bfcd6d78c3124769ff8662941472333c795fdbe
---
src/plugins/platforms/cocoa/cocoa.pro | 42 +++++++++++--------
.../platforms/cocoa/qcocoanativeinterface.mm | 6 +--
.../platforms/cocoa/qpaintengine_mac.mm | 4 ++
3 files changed, 32 insertions(+), 20 deletions(-)
diff --git x/qtbase/src/plugins/platforms/cocoa/cocoa.pro y/qtbase/src/plugins/platforms/cocoa/cocoa.pro
index 083b7c1655..4249bae2b1 100644
--- x/qtbase/src/plugins/platforms/cocoa/cocoa.pro
+++ y/qtbase/src/plugins/platforms/cocoa/cocoa.pro
@@ -20,8 +20,6 @@ SOURCES += main.mm \
qcocoamenuloader.mm \
qcocoahelpers.mm \
qmultitouch_mac.mm \
- qcocoaaccessibilityelement.mm \
- qcocoaaccessibility.mm \
qcocoacursor.mm \
qcocoaclipboard.mm \
qcocoadrag.mm \
@@ -55,8 +53,6 @@ HEADERS += qcocoaintegration.h \
qcocoamenuloader.h \
qcocoahelpers.h \
qmultitouch_mac_p.h \
- qcocoaaccessibilityelement.h \
- qcocoaaccessibility.h \
qcocoacursor.h \
qcocoaclipboard.h \
qcocoadrag.h \
@@ -81,15 +77,24 @@ qtConfig(vulkan) {
HEADERS += qcocoavulkaninstance.h
}
+qtConfig(accessibility) {
+ SOURCES += qcocoaaccessibilityelement.mm \
+ qcocoaaccessibility.mm
+ HEADERS += qcocoaaccessibilityelement.h \
+ qcocoaaccessibility.h
+}
+
RESOURCES += qcocoaresources.qrc
LIBS += -framework AppKit -framework CoreServices -framework Carbon -framework IOKit -framework QuartzCore -framework CoreVideo -framework Metal -framework IOSurface -lcups
QT += \
core-private gui-private \
- accessibility_support-private clipboard_support-private theme_support-private \
+ clipboard_support-private theme_support-private \
fontdatabase_support-private graphics_support-private
+qtConfig(accessibility): QT += accessibility_support-private
+
qtConfig(vulkan): QT += vulkan_support-private
CONFIG += no_app_extension_api_only
@@ -97,17 +102,19 @@ CONFIG += no_app_extension_api_only
qtHaveModule(widgets) {
QT_FOR_CONFIG += widgets
- SOURCES += \
- qpaintengine_mac.mm \
- qprintengine_mac.mm \
- qcocoaprintersupport.mm \
- qcocoaprintdevice.mm \
-
- HEADERS += \
- qpaintengine_mac_p.h \
- qprintengine_mac_p.h \
- qcocoaprintersupport.h \
- qcocoaprintdevice.h \
+ SOURCES += qpaintengine_mac.mm
+ HEADERS += qpaintengine_mac_p.h
+
+ qtHaveModule(printsupport) {
+ SOURCES += \
+ qprintengine_mac.mm \
+ qcocoaprintersupport.mm \
+ qcocoaprintdevice.mm
+ HEADERS += \
+ qcocoaprintersupport.h \
+ qcocoaprintdevice.h \
+ qprintengine_mac_p.h
+ }
qtConfig(colordialog) {
SOURCES += qcocoacolordialoghelper.mm
@@ -124,7 +131,8 @@ qtHaveModule(widgets) {
HEADERS += qcocoafontdialoghelper.h
}
- QT += widgets-private printsupport-private
+ QT += widgets-private
+ qtHaveModule(printsupport): QT += printsupport-private
}
OTHER_FILES += cocoa.json
diff --git x/qtbase/src/plugins/platforms/cocoa/qcocoanativeinterface.mm y/qtbase/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 7979e430ac..8c0bd1d158 100644
--- x/qtbase/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ y/qtbase/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -59,7 +59,7 @@
#include "qguiapplication.h"
#include <qdebug.h>
-#ifndef QT_NO_WIDGETS
+#if !defined(QT_NO_WIDGETS) && defined(QT_PRINTSUPPORT_LIB)
#include "qcocoaprintersupport.h"
#include "qprintengine_mac_p.h"
#include <qpa/qplatformprintersupport.h>
@@ -153,7 +153,7 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter
QPlatformPrinterSupport *QCocoaNativeInterface::createPlatformPrinterSupport()
{
-#if !defined(QT_NO_WIDGETS) && !defined(QT_NO_PRINTER)
+#if !defined(QT_NO_WIDGETS) && !defined(QT_NO_PRINTER) && defined(QT_PRINTSUPPORT_LIB)
return new QCocoaPrinterSupport();
#else
qFatal("Printing is not supported when Qt is configured with -no-widgets");
@@ -163,7 +163,7 @@ QPlatformPrinterSupport *QCocoaNativeInterface::createPlatformPrinterSupport()
void *QCocoaNativeInterface::NSPrintInfoForPrintEngine(QPrintEngine *printEngine)
{
-#if !defined(QT_NO_WIDGETS) && !defined(QT_NO_PRINTER)
+#if !defined(QT_NO_WIDGETS) && !defined(QT_NO_PRINTER) && defined(QT_PRINTSUPPORT_LIB)
QMacPrintEnginePrivate *macPrintEnginePriv = static_cast<QMacPrintEngine *>(printEngine)->d_func();
if (macPrintEnginePriv->state == QPrinter::Idle && !macPrintEnginePriv->isPrintSessionInitialized())
macPrintEnginePriv->initialize();
diff --git x/qtbase/src/plugins/platforms/cocoa/qpaintengine_mac.mm y/qtbase/src/plugins/platforms/cocoa/qpaintengine_mac.mm
index 3677877538..00b2267f0d 100644
--- x/qtbase/src/plugins/platforms/cocoa/qpaintengine_mac.mm
+++ y/qtbase/src/plugins/platforms/cocoa/qpaintengine_mac.mm
@@ -38,14 +38,18 @@
****************************************************************************/
#include "qpaintengine_mac_p.h"
+#if defined(QT_PRINTSUPPORT_LIB)
#include "qprintengine_mac_p.h"
+#endif
#include <qbitmap.h>
#include <qpaintdevice.h>
#include <qpainterpath.h>
#include <qpixmapcache.h>
#include <private/qpaintengine_raster_p.h>
+#if defined(QT_PRINTSUPPORT_LIB)
#include <qprinter.h>
+#endif
#include <qstack.h>
#include <qwidget.h>
#include <qvarlengtharray.h>
--
2.22.0

View File

@ -0,0 +1,54 @@
From d8ac3ad8e4dfc26c6b2f4bb696d4ec8cc23d8cbf Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@qt.io>
Date: Tue, 9 Jul 2019 17:19:26 +0200
Subject: [PATCH 1/2] Fix build with -no-feature-printer
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Skip printsupport subdirectory if printer feature is disabled. Also
removed android-embedded condition for the plugin: Such a
configuration should just disable the printer feature.
Fixes: QTBUG-76941
Change-Id: Ifca7d2311a575c1589ad6a87a775bd016591ee2c
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
---
src/src.pro | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git x/qtbase/src/src.pro y/qtbase/src/src.pro
index 1c76a2e46f..b704ccd7ab 100644
--- x/qtbase/src/src.pro
+++ y/qtbase/src/src.pro
@@ -1,8 +1,10 @@
TEMPLATE = subdirs
-QT_FOR_CONFIG += core-private gui-private
+QT_FOR_CONFIG += core-private gui-private printsupport
+
include($$OUT_PWD/corelib/qtcore-config.pri)
include($$OUT_PWD/gui/qtgui-config.pri)
+include($$OUT_PWD/printsupport/qtprintsupport-config.pri)
force_bootstrap|!qtConfig(commandlineparser): \
CONFIG += force_dbus_bootstrap
@@ -221,11 +223,13 @@ qtConfig(gui) {
src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers
qtConfig(widgets) {
SUBDIRS += src_tools_uic src_widgets
- !android-embedded: SUBDIRS += src_printsupport
TOOLS += src_tools_uic
src_plugins.depends += src_widgets
- !android-embedded: src_plugins.depends += src_printsupport
src_testlib.depends += src_widgets # if QtWidgets is enabled, QtTest requires QtWidgets's headers
+ qtConfig(printer) {
+ SUBDIRS += src_printsupport
+ src_plugins.depends += src_printsupport
+ }
qtConfig(opengl) {
SUBDIRS += src_opengl
src_plugins.depends += src_opengl
--
2.22.0

View File

@ -0,0 +1,25 @@
From c69fef8cde15345cb53748456a2e7136258f42a4 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Mon, 16 Apr 2018 08:34:42 +0200
Subject: Remove Qt Labs specific plugins from the build
Change-Id: I8f1444d4be2806e983979ceff73223c7452da5c2
---
src/imports/imports.pro | 1 -
1 file changed, 1 deletion(-)
diff --git x/qtquickcontrols2/src/imports/imports.pro y/qtquickcontrols2/src/imports/imports.pro
index e32bded7..2345616e 100644
--- x/qtquickcontrols2/src/imports/imports.pro
+++ y/qtquickcontrols2/src/imports/imports.pro
@@ -1,7 +1,6 @@
TEMPLATE = subdirs
SUBDIRS += \
controls \
- calendar \
platform \
templates
--
2.21.0

View File

@ -0,0 +1,37 @@
From 0aa601d4cfdded1bd1c9924244795c4bb3d1b227 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Mon, 16 Apr 2018 08:53:54 +0200
Subject: Remove unused plugins from the build
Change-Id: I780168aa4481c4bc6c9570effd80d34ce097d08a
---
src/imports/imports.pro | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git x/qtdeclarative/src/imports/imports.pro y/qtdeclarative/src/imports/imports.pro
index 24e93fec1..aced2e417 100644
--- x/qtdeclarative/src/imports/imports.pro
+++ y/qtdeclarative/src/imports/imports.pro
@@ -3,10 +3,8 @@ TEMPLATE = subdirs
SUBDIRS += \
builtins \
qtqml \
- models \
- labsmodels
+ models
-qtConfig(thread): SUBDIRS += folderlistmodel
qtHaveModule(sql): SUBDIRS += localstorage
qtConfig(settings): SUBDIRS += settings
qtConfig(statemachine): SUBDIRS += statemachine
@@ -21,7 +19,6 @@ qtHaveModule(quick) {
wavefrontmesh
qtHaveModule(testlib): SUBDIRS += testlib
- qtConfig(systemsemaphore): SUBDIRS += sharedimage
qtConfig(quick-particles): \
SUBDIRS += particles
--
2.21.0

View File

@ -0,0 +1,52 @@
From 0b9dc418d21a54b748637f4853dbe340c2dbc33e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Tue, 16 Oct 2018 17:55:29 +0200
Subject: [PATCH] disable designer
---
src/linguist/linguist.pro | 9 ---------
src/src.pro | 7 -------
2 files changed, 16 deletions(-)
diff --git x/qttools/src/linguist/linguist.pro y/qttools/src/linguist/linguist.pro
index 3f54c396..61903c08 100644
--- x/qttools/src/linguist/linguist.pro
+++ y/qttools/src/linguist/linguist.pro
@@ -3,16 +3,7 @@ SUBDIRS = \
lrelease \
lupdate \
lconvert
-!no-png:qtHaveModule(widgets) {
- QT_FOR_CONFIG += widgets
- qtConfig(process):qtConfig(pushbutton):qtConfig(toolbutton) {
- SUBDIRS += linguist
- }
-}
-qtNomakeTools( \
- linguist \
-)
equals(QMAKE_HOST.os, Windows): CMAKE_BIN_SUFFIX = ".exe"
diff --git x/qttools/src/src.pro y/qttools/src/src.pro
index 7a1af007..a9d4ac4b 100644
--- x/qttools/src/src.pro
+++ y/qttools/src/src.pro
@@ -5,13 +5,6 @@ qtHaveModule(widgets) {
message("Some graphics-related tools are unavailable without PNG support")
} else {
QT_FOR_CONFIG += widgets
- qtConfig(pushbutton):qtConfig(toolbutton) {
- SUBDIRS = assistant \
- designer \
- pixeltool
-
- linguist.depends = designer
- }
qtHaveModule(quick):qtConfig(thread):qtConfig(toolbutton): SUBDIRS += distancefieldgenerator
}
}
--
2.19.1

98
libs/qt-install.qs 100644
View File

@ -0,0 +1,98 @@
function Controller()
{
installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes);
installer.setMessageBoxAutomaticAnswer("TargetDirectoryInUse", QMessageBox.Ok);
installer.setMessageBoxAutomaticAnswer("cancelInstallation", QMessageBox.Yes);
}
Controller.prototype.WelcomePageCallback = function()
{
console.log("Welcome");
var widget = gui.currentPageWidget();
gui.clickButton(buttons.NextButton);
widget.completeChanged.connect(function()
{
gui.clickButton(buttons.NextButton);
});
}
Controller.prototype.CredentialsPageCallback = function()
{
console.log("Credentials");
gui.clickButton(buttons.NextButton);
}
Controller.prototype.IntroductionPageCallback = function()
{
console.log("Introduction");
gui.clickButton(buttons.NextButton);
}
Controller.prototype.TargetDirectoryPageCallback = function()
{
console.log("TargetDirectory: " + installer.value("TargetDir"));
gui.clickButton(buttons.NextButton);
}
Controller.prototype.ComponentSelectionPageCallback = function()
{
var packages = installer.value("Packages")
console.log("ComponentSelection: " + packages);
var widget = gui.currentPageWidget();
widget.deselectAll();
packages = packages.split(",");
var components = installer.components();
for (var i in packages)
{
pkg = packages[i];
for (var j in components)
{
if (components[j].name === pkg)
{
widget.selectComponent(pkg);
break;
}
}
}
gui.clickButton(buttons.NextButton);
}
Controller.prototype.LicenseAgreementPageCallback = function()
{
console.log("LicenseAgreement");
var widget = gui.currentPageWidget();
widget.AcceptLicenseRadioButton.setChecked(true);
gui.clickButton(buttons.NextButton);
}
Controller.prototype.ReadyForInstallationPageCallback = function()
{
console.log("ReadyForInstallation");
gui.clickButton(buttons.CommitButton);
}
Controller.prototype.PerformInstallationPageCallback = function()
{
console.log("PerformInstallation");
installer.installationFinished.connect(function()
{
gui.clickButton(buttons.NextButton);
});
}
Controller.prototype.FinishedPageCallback = function()
{
console.log("Finished");
var widget = gui.currentPageWidget();
if (widget.LaunchQtCreatorCheckBoxForm)
{
widget.LaunchQtCreatorCheckBoxForm.launchQtCreatorCheckBox.setChecked(false);
}
else if (widget.RunItCheckBox)
{
widget.RunItCheckBox.setChecked(false);
}
gui.clickButton(buttons.FinishButton);
}

95
libs/qt.cmake 100644
View File

@ -0,0 +1,95 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.11.0)
###########################################
# Usage: cmake -DVERSION=5.10.0 -P qt.cmake
###########################################
IF(NOT PACKAGES_DIR)
SET(PACKAGES_DIR $ENV{PACKAGES_DIR})
IF(NOT PACKAGES_DIR)
SET(PACKAGES_DIR ${CMAKE_BINARY_DIR})
ENDIF()
ENDIF()
MESSAGE(STATUS "Use PACKAGES_DIR: ${PACKAGES_DIR}")
IF(NOT VERSION)
MESSAGE(FATAL_ERROR "Please provide Qt version (-DVERSION=5.10.0)")
ENDIF()
FUNCTION(READ_FILE _filename _regex _out)
FILE(STRINGS "${CMAKE_BINARY_DIR}/${_filename}" content REGEX "${_regex}")
STRING(REGEX MATCH "${_regex}" _unused "${content}")
SET(${_out} ${CMAKE_MATCH_1} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(FETCH_XML _url _out_url)
SET(_filename Updates.xml)
FILE(DOWNLOAD "${_url}/${_filename}" "${CMAKE_BINARY_DIR}/${_filename}")
READ_FILE("${_filename}" "<DownloadableArchives>(.+)</DownloadableArchives>" archive)
READ_FILE("${_filename}" "<Name>(.+)</Name>" name)
READ_FILE("${_filename}" "<Version>([-|\.|0-9]+)<\/Version>" version)
SET(${_out_url} "${_url}/${name}/${version}${archive}" PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(FETCH_HASH _url _hash_algo _out_hash)
STRING(TOLOWER "${_hash_algo}" suffix)
GET_FILENAME_COMPONENT(filename "${_url}" NAME)
FILE(DOWNLOAD "${_url}.${suffix}" "${CMAKE_BINARY_DIR}/${filename}.${suffix}")
FILE(STRINGS ${CMAKE_BINARY_DIR}/${filename}.${suffix} content)
STRING(REGEX MATCH "^[a-z|0-9]+" hash "${content}")
IF(NOT hash)
MESSAGE(FATAL_ERROR "Cannot fetch hash: ${_url}.${suffix}")
ENDIF()
SET(${_out_hash} ${hash} PARENT_SCOPE)
ENDFUNCTION()
INCLUDE(FetchContent)
SET(FETCHCONTENT_QUIET FALSE)
SET(HASH_ALGO SHA256)
SET(QT_SDK_URL https://download.qt.io/online/qtsdkrepository)
############################ OpenSSL
SET(OPENSSL_URL ${QT_SDK_URL}/linux_x64/desktop/tools_openssl_x64)
FETCH_XML("${OPENSSL_URL}" OPENSSL_URL)
FETCH_HASH("${OPENSSL_URL}" ${HASH_ALGO} OPENSSL_HASH)
FetchContent_Populate(openssl
URL ${OPENSSL_URL}
URL_HASH SHA256=${OPENSSL_HASH}
DOWNLOAD_DIR ${PACKAGES_DIR}
)
FetchContent_GetProperties(openssl)
FILE(COPY "${openssl_SOURCE_DIR}/OpenSSL/binary/" DESTINATION b/${VERSION}/gcc_64)
############################ Qt
STRING(SUBSTRING ${VERSION} 0 4 SUBVERSION)
SET(QT_FILE qt-opensource-linux-x64-${VERSION}.run)
SET(QT_URL https://download.qt.io/archive/qt/${SUBVERSION}/${VERSION}/${QT_FILE})
FETCH_HASH("${QT_URL}" ${HASH_ALGO} QT_HASH)
FetchContent_Populate(qt
URL ${QT_URL}
URL_HASH SHA256=${QT_HASH}
DOWNLOAD_DIR ${PACKAGES_DIR}
DOWNLOAD_NO_EXTRACT TRUE
)
SET(ENV{XDG_DATA_HOME} ${CMAKE_BINARY_DIR})
SET(ENV{XDG_DATA_DIRS} ${CMAKE_BINARY_DIR})
SET(ENV{HOME} ${CMAKE_BINARY_DIR})
STRING(REPLACE "." "" PKGVERSION "${VERSION}")
GET_FILENAME_COMPONENT(source_dir "${CMAKE_SCRIPT_MODE_FILE}" DIRECTORY)
EXECUTE_PROCESS(COMMAND chmod +x ${PACKAGES_DIR}/${QT_FILE})
EXECUTE_PROCESS(COMMAND ${PACKAGES_DIR}/${QT_FILE} --script ${source_dir}/qt-install.qs -v --platform minimal TargetDir=b Packages=qt.qt5.${PKGVERSION}.gcc_64)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink b/${VERSION}/gcc_64 dist)

View File

@ -1,75 +0,0 @@
From aeae7469061c1675d651224789fc664d6809b0d9 Mon Sep 17 00:00:00 2001
From: "Dr. Stephen Henson" <steve@openssl.org>
Date: Sat, 16 Jan 2016 16:11:34 +0000
Subject: [PATCH] fix no-engine build
Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Richard Levitte <levitte@openssl.org>
---
crypto/ts/ts.h | 2 ++
util/libeay.num | 4 ++--
util/mk1mf.pl | 3 +--
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git x/crypto/ts/ts.h y/crypto/ts/ts.h
index 2daa1b2fb5..fc8c14b2d0 100644
--- x/crypto/ts/ts.h
+++ y/crypto/ts/ts.h
@@ -737,9 +737,11 @@ EVP_PKEY *TS_CONF_load_key(const char *file, const char *pass);
const char *TS_CONF_get_tsa_section(CONF *conf, const char *section);
int TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb,
TS_RESP_CTX *ctx);
+#ifndef OPENSSL_NO_ENGINE
int TS_CONF_set_crypto_device(CONF *conf, const char *section,
const char *device);
int TS_CONF_set_default_engine(const char *name);
+#endif
int TS_CONF_set_signer_cert(CONF *conf, const char *section,
const char *cert, TS_RESP_CTX *ctx);
int TS_CONF_set_certs(CONF *conf, const char *section, const char *certs,
diff --git x/util/libeay.num y/util/libeay.num
index fddfe1cbb2..a76424ceab 100755
--- x/util/libeay.num
+++ y/util/libeay.num
@@ -3874,7 +3874,7 @@ b2i_PVK_bio 4250 EXIST::FUNCTION:RC4
ASN1_UTCTIME_adj 4251 EXIST::FUNCTION:
TS_TST_INFO_new 4252 EXIST::FUNCTION:
EVP_MD_do_all_sorted 4253 EXIST::FUNCTION:
-TS_CONF_set_default_engine 4254 EXIST::FUNCTION:
+TS_CONF_set_default_engine 4254 EXIST::FUNCTION:ENGINE
TS_ACCURACY_set_seconds 4255 EXIST::FUNCTION:
TS_TST_INFO_get_time 4256 EXIST::FUNCTION:
PKCS8_pkey_get0 4257 EXIST::FUNCTION:
@@ -4099,7 +4099,7 @@ EVP_PKEY_meth_find 4469 EXIST::FUNCTION:
EVP_PKEY_id 4470 EXIST::FUNCTION:
TS_TST_INFO_set_serial 4471 EXIST::FUNCTION:
a2i_GENERAL_NAME 4472 EXIST::FUNCTION:
-TS_CONF_set_crypto_device 4473 EXIST::FUNCTION:
+TS_CONF_set_crypto_device 4473 EXIST::FUNCTION:ENGINE
EVP_PKEY_verify_init 4474 EXIST::FUNCTION:
TS_CONF_set_policies 4475 EXIST::FUNCTION:
ASN1_PCTX_new 4476 EXIST::FUNCTION:
diff --git x/util/mk1mf.pl y/util/mk1mf.pl
index 6b31496ed1..ccfb24ca55 100755
--- x/util/mk1mf.pl
+++ y/util/mk1mf.pl
@@ -428,7 +428,6 @@ EOF
{
$extra_install .= <<"EOF"
\$(MKDIR) \"\$(INSTALLTOP)${o}lib${o}engines\"
- \$(CP) \$(E_SHLIB) \"\$(INSTALLTOP)${o}lib${o}engines\"
EOF
}
}
@@ -597,7 +596,7 @@ init: \$(TMP_D) \$(LIB_D) \$(INC_D) \$(INCO_D) \$(BIN_D) \$(TEST_D) headers
headers: \$(HEADER) \$(EXHEADER)
-lib: \$(LIBS_DEP) \$(E_SHLIB)
+lib: \$(LIBS_DEP)
exe: \$(T_EXE) \$(BIN_D)$o\$(E_EXE)$exep
--
2.15.0

View File

@ -1,12 +0,0 @@
diff -ruN openssl-1.0.1j.orig/crypto/ui/ui_openssl.c openssl-1.0.1j/crypto/ui/ui_openssl.c
--- openssl-1.0.1j.orig/crypto/ui/ui_openssl.c 2014-10-15 14:53:39.000000000 +0200
+++ openssl-1.0.1j/crypto/ui/ui_openssl.c 2014-11-05 13:10:13.574510723 +0100
@@ -410,7 +410,7 @@
return 1;
}
-static volatile sig_atomic_t intr_signal;
+static volatile int intr_signal;
#endif
static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)

View File

@ -1,917 +0,0 @@
From e681bc2125a396ff34aab4c3f629683dd0ce28bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Thu, 23 Apr 2015 20:59:30 +0200
Subject: [PATCH] Introduce TLS-RSA-PSK support
Build on the existing PSK support and introduce RSA-PSK
(cf. RFC 4279, 5487).
Based on the original patch by Christian J. Dietrich.
This work has been sponsored by Governikus GmbH & Co. KG.
PR: 2464
---
doc/apps/ciphers.pod | 12 +++
ssl/s3_clnt.c | 106 ++++++++++++++++++++----
ssl/s3_lib.c | 206 +++++++++++++++++++++++++++++++++++++++++++++-
ssl/s3_srvr.c | 226 ++++++++++++++++++++++++++++++++++++++++++++++++---
ssl/ssl.h | 2 +
ssl/ssl_ciph.c | 9 +-
ssl/ssl_lib.c | 6 ++
ssl/ssl_locl.h | 2 +
ssl/tls1.h | 36 ++++++++
9 files changed, 572 insertions(+), 33 deletions(-)
diff --git x/doc/apps/ciphers.pod y/doc/apps/ciphers.pod
index fa16124d08..45db06c168 100644
--- x/doc/apps/ciphers.pod
+++ y/doc/apps/ciphers.pod
@@ -585,10 +585,22 @@ Note: these ciphers can also be used in SSL v3.
=head2 Pre shared keying (PSK) cipheruites
+ TLS_RSA_PSK_WITH_RC4_128_SHA RSA-PSK-RC4-SHA
+ TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA RSA-PSK-3DES-EDE-CBC-SHA
+ TLS_RSA_PSK_WITH_AES_128_CBC_SHA RSA-PSK-AES128-CBC-SHA
+ TLS_RSA_PSK_WITH_AES_256_CBC_SHA RSA-PSK-AES256-CBC-SHA
+ TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 RSA-PSK-AES128-CBC-SHA256
+ TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 RSA-PSK-AES256-CBC-SHA384
+ TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 RSA-PSK-AES128-GCM-SHA256
+ TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 RSA-PSK-AES256-GCM-SHA384
TLS_PSK_WITH_RC4_128_SHA PSK-RC4-SHA
TLS_PSK_WITH_3DES_EDE_CBC_SHA PSK-3DES-EDE-CBC-SHA
TLS_PSK_WITH_AES_128_CBC_SHA PSK-AES128-CBC-SHA
TLS_PSK_WITH_AES_256_CBC_SHA PSK-AES256-CBC-SHA
+ TLS_PSK_WITH_AES_128_CBC_SHA256 PSK-AES128-CBC-SHA256
+ TLS_PSK_WITH_AES_256_CBC_SHA384 PSK-AES256-CBC-SHA384
+ TLS_PSK_WITH_AES_128_GCM_SHA256 PSK-AES128-GCM-SHA256
+ TLS_PSK_WITH_AES_256_GCM_SHA384 PSK-AES256-GCM-SHA384
=head2 Deprecated SSL v2.0 cipher suites.
diff --git x/ssl/s3_clnt.c y/ssl/s3_clnt.c
index 5b8b2da59f..ae0d4d840c 100644
--- x/ssl/s3_clnt.c
+++ y/ssl/s3_clnt.c
@@ -342,7 +342,7 @@ int ssl3_connect(SSL *s)
}
#endif
/* Check if it is anon DH/ECDH, SRP auth */
- /* or PSK */
+ /* or plain PSK */
if (!
(s->s3->tmp.
new_cipher->algorithm_auth & (SSL_aNULL | SSL_aSRP))
@@ -1424,9 +1424,9 @@ int ssl3_get_key_exchange(SSL *s)
}
#ifndef OPENSSL_NO_PSK
/*
- * In plain PSK ciphersuite, ServerKeyExchange can be omitted if no
- * identity hint is sent. Set session->sess_cert anyway to avoid
- * problems later.
+ * In PSK ciphersuites, ServerKeyExchange can be omitted if no
+ * identity hint is sent. Set session->sess_cert for plain PSK
+ * anyway to avoid problems later.
*/
if (alg_k & SSL_kPSK) {
s->session->sess_cert = ssl_sess_cert_new();
@@ -1471,7 +1471,12 @@ int ssl3_get_key_exchange(SSL *s)
al = SSL_AD_DECODE_ERROR;
#ifndef OPENSSL_NO_PSK
- if (alg_k & SSL_kPSK) {
+ /* handle PSK identity hint */
+ if (alg_k & SSL_kPSK
+#ifndef OPENSSL_NO_RSA
+ || alg_k & SSL_kRSAPSK
+#endif
+ ) {
param_len = 2;
if (param_len > n) {
SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
@@ -2041,7 +2046,7 @@ int ssl3_get_key_exchange(SSL *s)
}
} else {
/* aNULL, aSRP or kPSK do not need public keys */
- if (!(alg_a & (SSL_aNULL | SSL_aSRP)) && !(alg_k & SSL_kPSK)) {
+ if (!(alg_a & (SSL_aNULL | SSL_aSRP)) && !(alg_k & SSL_kPSK) && !(alg_k & SSL_kRSAPSK)) {
/* Might be wrong key type, check it */
if (ssl3_check_cert_and_algorithm(s))
/* Otherwise this shouldn't happen */
@@ -3130,7 +3135,11 @@ int ssl3_send_client_key_exchange(SSL *s)
}
#endif
#ifndef OPENSSL_NO_PSK
- else if (alg_k & SSL_kPSK) {
+ else if (alg_k & SSL_kPSK
+#ifndef OPENSSL_NO_RSA
+ || alg_k & SSL_kRSAPSK
+#endif
+ ) {
/*
* The callback needs PSK_MAX_IDENTITY_LEN + 1 bytes to return a
* \0-terminated identity. The last byte is for us for simulating
@@ -3138,8 +3147,8 @@ int ssl3_send_client_key_exchange(SSL *s)
*/
char identity[PSK_MAX_IDENTITY_LEN + 2];
size_t identity_len;
- unsigned char *t = NULL;
unsigned char psk_or_pre_ms[PSK_MAX_PSK_LEN * 2 + 4];
+ unsigned char *t = psk_or_pre_ms;
unsigned int pre_ms_len = 0, psk_len = 0;
int psk_err = 1;
@@ -3171,14 +3180,34 @@ int ssl3_send_client_key_exchange(SSL *s)
ERR_R_INTERNAL_ERROR);
goto psk_err;
}
- /* create PSK pre_master_secret */
- pre_ms_len = 2 + psk_len + 2 + psk_len;
- t = psk_or_pre_ms;
- memmove(psk_or_pre_ms + psk_len + 4, psk_or_pre_ms, psk_len);
- s2n(psk_len, t);
- memset(t, 0, psk_len);
- t += psk_len;
- s2n(psk_len, t);
+
+ if (alg_k & SSL_kPSK) {
+ /* create PSK pre_master_secret */
+ pre_ms_len = 2 + psk_len + 2 + psk_len;
+ memmove(psk_or_pre_ms + psk_len + 4, psk_or_pre_ms, psk_len);
+ s2n(psk_len, t);
+ memset(t, 0, psk_len);
+ t += psk_len;
+ s2n(psk_len, t);
+ }
+#ifndef OPENSSL_NO_RSA
+ else if (alg_k & SSL_kRSAPSK) {
+ const unsigned int pre_ms_prefix = 48;
+
+ pre_ms_len = 2 + 2 + 46 + 2 + psk_len;
+ memmove(psk_or_pre_ms + 52, psk_or_pre_ms, psk_len);
+ s2n(pre_ms_prefix, t);
+
+ psk_or_pre_ms[2] = s->client_version >> 8;
+ psk_or_pre_ms[3] = s->client_version & 0xff;
+ t += 2;
+
+ if (RAND_bytes(psk_or_pre_ms + 4, 46) <= 0)
+ goto psk_err;
+ t += 46;
+ s2n(psk_len, t);
+ }
+#endif
if (s->session->psk_identity_hint != NULL)
OPENSSL_free(s->session->psk_identity_hint);
@@ -3208,8 +3237,41 @@ int ssl3_send_client_key_exchange(SSL *s)
pre_ms_len);
s2n(identity_len, p);
memcpy(p, identity, identity_len);
+ p += identity_len;
n = 2 + identity_len;
+
+#ifndef OPENSSL_NO_RSA
+ if (alg_k & SSL_kRSAPSK) {
+ RSA *rsa;
+ int enc_n;
+
+ if (s->session->sess_cert->peer_rsa_tmp != NULL) {
+ rsa = s->session->sess_cert->peer_rsa_tmp;
+ } else {
+ pkey = X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
+ if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA) || (pkey->pkey.rsa == NULL)) {
+ SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
+ goto psk_err;
+ }
+ rsa = pkey->pkey.rsa;
+ EVP_PKEY_free(pkey);
+ }
+
+ enc_n = RSA_public_encrypt(48, psk_or_pre_ms + 2, p + 2, rsa, RSA_PKCS1_PADDING);
+ if (enc_n <= 0) {
+ SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, SSL_R_BAD_RSA_ENCRYPT);
+ goto psk_err;
+ }
+
+ n += enc_n;
+
+ s2n(enc_n, p);
+ n += 2;
+ }
+#endif
+
psk_err = 0;
+
psk_err:
OPENSSL_cleanse(identity, sizeof(identity));
OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms));
@@ -3580,7 +3642,11 @@ int ssl3_check_cert_and_algorithm(SSL *s)
}
#endif
#ifndef OPENSSL_NO_RSA
- if (alg_k & SSL_kRSA) {
+ if (alg_k & SSL_kRSA
+#ifndef OPENSSL_NO_PSK
+ || alg_k & SSL_kRSAPSK
+#endif
+ ) {
if (!SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
!has_bits(i, EVP_PK_RSA | EVP_PKT_ENC)) {
SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
@@ -3647,7 +3713,11 @@ int ssl3_check_cert_and_algorithm(SSL *s)
if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
pkey_bits > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) {
#ifndef OPENSSL_NO_RSA
- if (alg_k & SSL_kRSA) {
+ if (alg_k & SSL_kRSA
+#ifndef OPENSSL_NO_PSK
+ || alg_k & SSL_kRSAPSK
+#endif
+ ) {
if (rsa == NULL) {
SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
diff --git x/ssl/s3_lib.c y/ssl/s3_lib.c
index 1014a3fce1..0187d508a1 100644
--- x/ssl/s3_lib.c
+++ y/ssl/s3_lib.c
@@ -1765,6 +1765,74 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = {
256,
256,
},
+
+
+#ifndef OPENSSL_NO_RSA
+ /* RSA-PSK ciphersuites from RFC4279 */
+ /* Cipher 92 */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_RC4_128_SHA,
+ TLS1_CK_RSA_PSK_WITH_RC4_128_SHA,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_RC4,
+ SSL_SHA1,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_MEDIUM,
+ SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+ 128,
+ 128,
+ },
+
+ /* Cipher 93 */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
+ TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_3DES,
+ SSL_SHA1,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+ 112,
+ 168,
+ },
+
+ /* Cipher 94 */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA,
+ TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_AES128,
+ SSL_SHA1,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+ 128,
+ 128,
+ },
+
+ /* Cipher 95 */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA,
+ TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_AES256,
+ SSL_SHA1,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
+ 256,
+ 256,
+ },
+#endif /* OPENSSL_NO_RSA */
#endif /* OPENSSL_NO_PSK */
#ifndef OPENSSL_NO_SEED
@@ -2077,6 +2145,142 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] = {
0},
#endif
+#ifndef OPENSSL_NO_PSK
+ /* PSK ciphersuites from RFC5487 */
+
+ /* Cipher A8 */
+ {
+ 1,
+ TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256,
+ TLS1_CK_PSK_WITH_AES_128_GCM_SHA256,
+ SSL_kPSK,
+ SSL_aPSK,
+ SSL_AES128GCM,
+ SSL_AEAD,
+ SSL_TLSV1_2,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+ 128,
+ 128,
+ },
+
+ /* Cipher A9 */
+ {
+ 1,
+ TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384,
+ TLS1_CK_PSK_WITH_AES_256_GCM_SHA384,
+ SSL_kPSK,
+ SSL_aPSK,
+ SSL_AES256GCM,
+ SSL_AEAD,
+ SSL_TLSV1_2,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+ 256,
+ 256,
+ },
+
+ #ifndef OPENSSL_NO_RSA
+ /* Cipher AC */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_AES_128_GCM_SHA256,
+ TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_AES128GCM,
+ SSL_AEAD,
+ SSL_TLSV1_2,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+ 128,
+ 128,
+ },
+
+ /* Cipher AD */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_AES_256_GCM_SHA384,
+ TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_AES256GCM,
+ SSL_AEAD,
+ SSL_TLSV1_2,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+ 256,
+ 256,
+ },
+#endif /* OPENSSL_NO_RSA */
+
+ /* Cipher AE */
+ {
+ 1,
+ TLS1_TXT_PSK_WITH_AES_128_CBC_SHA256,
+ TLS1_CK_PSK_WITH_AES_128_CBC_SHA256,
+ SSL_kPSK,
+ SSL_aPSK,
+ SSL_AES128,
+ SSL_SHA256,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+ 128,
+ 128,
+ },
+
+ /* Cipher AF */
+ {
+ 1,
+ TLS1_TXT_PSK_WITH_AES_256_CBC_SHA384,
+ TLS1_CK_PSK_WITH_AES_256_CBC_SHA384,
+ SSL_kPSK,
+ SSL_aPSK,
+ SSL_AES256,
+ SSL_SHA384,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+ 256,
+ 256,
+ },
+
+ #ifndef OPENSSL_NO_RSA
+ /* Cipher B6 */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA256,
+ TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_AES128,
+ SSL_SHA256,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+ 128,
+ 128,
+ },
+
+ /* Cipher B7 */
+ {
+ 1,
+ TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA384,
+ TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384,
+ SSL_kRSAPSK,
+ SSL_aRSA,
+ SSL_AES256,
+ SSL_SHA384,
+ SSL_TLSV1,
+ SSL_NOT_EXP|SSL_HIGH,
+ SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+ 256,
+ 256,
+ },
+#endif /* OPENSSL_NO_RSA */
+#endif /* OPENSSL_NO_PSK */
+
#ifndef OPENSSL_NO_ECDH
/* Cipher C001 */
{
@@ -4169,7 +4373,7 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
#endif /* OPENSSL_NO_KRB5 */
#ifndef OPENSSL_NO_PSK
/* with PSK there must be server callback set */
- if ((alg_k & SSL_kPSK) && s->psk_server_callback == NULL)
+ if ((alg_k & SSL_kPSK || alg_k & SSL_kRSAPSK) && s->psk_server_callback == NULL)
continue;
#endif /* OPENSSL_NO_PSK */
diff --git x/ssl/s3_srvr.c y/ssl/s3_srvr.c
index 0fb4845d44..3498836e7d 100644
--- x/ssl/s3_srvr.c
+++ y/ssl/s3_srvr.c
@@ -467,19 +467,22 @@ int ssl3_accept(SSL *s)
/*
* only send if a DH key exchange, fortezza or RSA but we have a
- * sign only certificate PSK: may send PSK identity hints For
- * ECC ciphersuites, we send a serverKeyExchange message only if
+ * sign only certificate
+ *
+ * PSK|RSAPSK: may send PSK identity hints.
+ * Send ServerKeyExchange if PSK identity hint is provided.
+ *
+ * For ECC ciphersuites, we send a serverKeyExchange message only if
* the cipher suite is either ECDH-anon or ECDHE. In other cases,
* the server certificate contains the server's public key for
* key exchange.
*/
if (0
- /*
- * PSK: send ServerKeyExchange if PSK identity hint if
- * provided
- */
#ifndef OPENSSL_NO_PSK
- || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint)
+ || (alg_k & SSL_kPSK && s->ctx->psk_identity_hint)
+#ifndef OPENSSL_NO_RSA
+ || (alg_k & SSL_kRSAPSK && s->ctx->psk_identity_hint)
+#endif
#endif
#ifndef OPENSSL_NO_SRP
/* SRP: send ServerKeyExchange */
@@ -535,11 +538,14 @@ int ssl3_accept(SSL *s)
(s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5) ||
/* don't request certificate for SRP auth */
(s->s3->tmp.new_cipher->algorithm_auth & SSL_aSRP)
+#ifndef OPENSSL_NO_PSK
/*
- * With normal PSK Certificates and Certificate Requests
+ * With normal PSK, Certificates and Certificate Requests
* are omitted
*/
- || (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
+ || (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)
+#endif
+ ) {
/* no cert request */
skip = 1;
s->s3->tmp.cert_request = 0;
@@ -1835,7 +1841,11 @@ int ssl3_send_server_key_exchange(SSL *s)
} else
#endif /* !OPENSSL_NO_ECDH */
#ifndef OPENSSL_NO_PSK
- if (type & SSL_kPSK) {
+ if (type & SSL_kPSK
+#ifndef OPENSSL_NO_RSA
+ || type & SSL_kRSAPSK
+#endif
+ ) {
/*
* reserve size for record length and PSK identity hint
*/
@@ -1884,7 +1894,8 @@ int ssl3_send_server_key_exchange(SSL *s)
}
if (!(s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aSRP))
- && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
+ && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)
+ && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kRSAPSK)) {
if ((pkey = ssl_get_sign_pkey(s, s->s3->tmp.new_cipher, &md))
== NULL) {
al = SSL_AD_DECODE_ERROR;
@@ -1899,6 +1910,12 @@ int ssl3_send_server_key_exchange(SSL *s)
} else {
pkey = NULL;
kn = 0;
+ /* Allow space for signature algorithm */
+ if (SSL_USE_SIGALGS(s)) {
+ kn += 4;
+ const unsigned char *sig;
+ kn += tls12_get_psigalgs(s, 1, &sig);
+ }
}
if (!BUF_MEM_grow_clean(buf, n + SSL_HM_HEADER_LENGTH(s) + kn)) {
@@ -1958,7 +1975,11 @@ int ssl3_send_server_key_exchange(SSL *s)
#endif
#ifndef OPENSSL_NO_PSK
- if (type & SSL_kPSK) {
+ if (type & SSL_kPSK
+#ifndef OPENSSL_NO_RSA
+ || type & SSL_kRSAPSK
+#endif
+ ) {
/* copy PSK identity hint */
s2n(strlen(s->ctx->psk_identity_hint), p);
strncpy((char *)p, s->ctx->psk_identity_hint,
@@ -1974,7 +1995,11 @@ int ssl3_send_server_key_exchange(SSL *s)
* points to the space at the end.
*/
#ifndef OPENSSL_NO_RSA
- if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s)) {
+ if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s)
+#ifndef OPENSSL_NO_PSK
+ && !(type & SSL_kRSAPSK)
+#endif
+ ) {
q = md_buf;
j = 0;
for (num = 2; num > 0; num--) {
@@ -2870,6 +2895,181 @@ int ssl3_get_client_key_exchange(SSL *s)
goto f_err;
} else
#endif
+#ifndef OPENSSL_NO_RSA
+#ifndef OPENSSL_NO_PSK
+ if (alg_k & SSL_kRSAPSK) {
+ unsigned char rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
+ int decrypt_len;
+ unsigned char decrypt_good, version_good;
+ unsigned char *orig_p = p;
+
+ unsigned int psk_len;
+
+ const unsigned int pre_master_secret_prefix = 48;
+ unsigned char psk_or_pre_ms[PSK_MAX_PSK_LEN * 2 + 4];
+ unsigned int pre_ms_len;
+ unsigned char *t = psk_or_pre_ms;
+
+ char identity[PSK_MAX_IDENTITY_LEN + 1];
+ int identity_len;
+
+ int epms_len;
+ int psk_err = 1;
+
+ /* No server callback? Bail out */
+ if (s->psk_server_callback == NULL) {
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, SSL_R_PSK_NO_SERVER_CB);
+ goto f_err;
+ }
+
+ /* FIX THIS UP EAY EAY EAY EAY */
+ if (s->s3->tmp.use_rsa_tmp) {
+ if ((s->cert != NULL) && (s->cert->rsa_tmp != NULL))
+ rsa=s->cert->rsa_tmp;
+ /*
+ * Don't do a callback because rsa_tmp should be sent already
+ */
+ if (rsa == NULL) {
+ al=SSL_AD_HANDSHAKE_FAILURE;
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_MISSING_TMP_RSA_PKEY);
+ goto f_err;
+ }
+ } else {
+ pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
+ if ((pkey == NULL) ||
+ (pkey->type != EVP_PKEY_RSA) || (pkey->pkey.rsa == NULL)) {
+ al=SSL_AD_HANDSHAKE_FAILURE;
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_MISSING_RSA_CERTIFICATE);
+ goto f_err;
+ }
+ rsa = pkey->pkey.rsa;
+ }
+
+ /* Extract the PSK identity */
+ if (n < (2 + 2)) { /* 2 bytes for the identity len, 2 bytes for the epms len */
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_LENGTH_MISMATCH);
+ goto f_err;
+ }
+
+ n2s(p, identity_len);
+
+ if (identity_len > PSK_MAX_IDENTITY_LEN) {
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_DATA_LENGTH_TOO_LONG);
+ goto f_err;
+ }
+
+ if (n < (2 + identity_len + 2)) { /* as above, plus the identity len */
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_LENGTH_MISMATCH);
+ goto f_err;
+ }
+
+ memset(identity, 0, sizeof(identity));
+ memcpy(identity, p, identity_len);
+ p += identity_len;
+
+ /* fill the pre master secret with random bytes */
+ if (RAND_pseudo_bytes(psk_or_pre_ms, sizeof(psk_or_pre_ms)) <= 0)
+ goto err;
+
+ /* read the psk (into the beginning of the psk_or_pre_ms buffer */
+ psk_len = s->psk_server_callback(s, identity, psk_or_pre_ms, sizeof(psk_or_pre_ms));
+
+ if (psk_len > PSK_MAX_PSK_LEN) {
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ ERR_R_INTERNAL_ERROR);
+ goto rsapsk_err;
+ } else if (psk_len == 0) {
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_PSK_IDENTITY_NOT_FOUND);
+ al=SSL_AD_UNKNOWN_PSK_IDENTITY;
+ goto rsapsk_err;
+ }
+
+ /* move on onto decoding the 48 encrypted bytes */
+
+ /* how many bytes to decode? */
+ n2s(p, epms_len);
+
+ if (n != (2 + identity_len + 2 + epms_len)) { /* as above */
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
+ SSL_R_LENGTH_MISMATCH);
+ goto rsapsk_err;
+ }
+
+ /* decode in place into p */
+ decrypt_len = RSA_private_decrypt(epms_len, p, p, rsa, RSA_PKCS1_PADDING);
+ decrypt_good = constant_time_eq_int_8(decrypt_len, 48);
+
+ /* check the version sent by the client */
+ version_good = constant_time_eq_8(p[0], (unsigned)(s->client_version>>8));
+ version_good &= constant_time_eq_8(p[1], (unsigned)(s->client_version&0xff));
+
+ decrypt_good &= version_good;
+
+ for (i = 0; i < (int) sizeof(rand_premaster_secret); i++)
+ p[i] = constant_time_select_8(decrypt_good, p[i], rand_premaster_secret[i]);
+
+ /*
+ * build the pre master secret. it should look like this:
+ * 48 (2b) + version (2b) + random (46b) + psk_len (2b) + psk
+ */
+ pre_ms_len = 2 + 2 + 46 + 2 + psk_len;
+
+ /* the PSK is at the beginning of psk_or_pre_ms, move at the end */
+ memmove(psk_or_pre_ms + 52, psk_or_pre_ms, psk_len);
+
+ /* fill the "48" in */
+ s2n(pre_master_secret_prefix, t);
+
+ /* fill the 2 bytes version + the 46 random bytes (decrypted earlier with RSA) */
+ memcpy(t, p, 48);
+ t += 48;
+
+ /* fill the psk_len */
+ s2n(psk_len, t);
+
+ /* psk_or_pre_ms now contains the pre master secret */
+
+ /* set the identity in the session */
+ if (s->session->psk_identity != NULL)
+ OPENSSL_free(s->session->psk_identity);
+
+ s->session->psk_identity = BUF_strdup(identity);
+ OPENSSL_cleanse(identity, sizeof(identity));
+
+ if (s->session->psk_identity == NULL) {
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
+ goto rsapsk_err;
+ }
+
+ /* set the identity hint in the session */
+ if (s->session->psk_identity_hint != NULL)
+ OPENSSL_free(s->session->psk_identity_hint);
+ s->session->psk_identity_hint = BUF_strdup(s->ctx->psk_identity_hint);
+ if (s->ctx->psk_identity_hint != NULL && s->session->psk_identity_hint == NULL) {
+ SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
+ goto rsapsk_err;
+ }
+
+ /* set the premaster key */
+ s->session->master_key_length =
+ s->method->ssl3_enc->generate_master_secret(s,
+ s->session->master_key,
+ psk_or_pre_ms, pre_ms_len);
+
+ psk_err = 0;
+ rsapsk_err:
+ OPENSSL_cleanse(orig_p, n); /* clear the whole payload area */
+ if (psk_err != 0)
+ goto f_err;
+ } else
+#endif
+#endif
#ifndef OPENSSL_NO_SRP
if (alg_k & SSL_kSRP) {
int param_len;
diff --git x/ssl/ssl.h y/ssl/ssl.h
index 90aeb0ce4e..78cf2212ed 100644
--- x/ssl/ssl.h
+++ y/ssl/ssl.h
@@ -254,6 +254,7 @@ extern "C" {
# define SSL_TXT_kEECDH "kEECDH"
# define SSL_TXT_kECDHE "kECDHE"/* alias for kEECDH */
# define SSL_TXT_kPSK "kPSK"
+# define SSL_TXT_kRSAPSK "kRSAPSK"
# define SSL_TXT_kGOST "kGOST"
# define SSL_TXT_kSRP "kSRP"
@@ -282,6 +283,7 @@ extern "C" {
# define SSL_TXT_ECDSA "ECDSA"
# define SSL_TXT_KRB5 "KRB5"
# define SSL_TXT_PSK "PSK"
+# define SSL_TXT_RSAPSK "RSAPSK"
# define SSL_TXT_SRP "SRP"
# define SSL_TXT_DES "DES"
diff --git x/ssl/ssl_ciph.c y/ssl/ssl_ciph.c
index ccdf00fa1b..19c4ac0656 100644
--- x/ssl/ssl_ciph.c
+++ y/ssl/ssl_ciph.c
@@ -263,6 +263,7 @@ static const SSL_CIPHER cipher_aliases[] = {
0, 0, 0},
{0, SSL_TXT_kPSK, 0, SSL_kPSK, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, SSL_TXT_kRSAPSK, 0, SSL_kRSAPSK, 0, 0, 0, 0, 0, 0, 0, 0},
{0, SSL_TXT_kSRP, 0, SSL_kSRP, 0, 0, 0, 0, 0, 0, 0, 0},
{0, SSL_TXT_kGOST, 0, SSL_kGOST, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -294,6 +295,7 @@ static const SSL_CIPHER cipher_aliases[] = {
{0, SSL_TXT_ADH, 0, SSL_kEDH, SSL_aNULL, 0, 0, 0, 0, 0, 0, 0},
{0, SSL_TXT_AECDH, 0, SSL_kEECDH, SSL_aNULL, 0, 0, 0, 0, 0, 0, 0},
{0, SSL_TXT_PSK, 0, SSL_kPSK, SSL_aPSK, 0, 0, 0, 0, 0, 0, 0},
+ {0, SSL_TXT_RSAPSK, 0, SSL_kRSAPSK, SSL_aRSA, 0, 0, 0, 0, 0, 0, 0},
{0, SSL_TXT_SRP, 0, SSL_kSRP, 0, 0, 0, 0, 0, 0, 0, 0},
/* symmetric encryption aliases */
@@ -756,7 +758,7 @@ static void ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth,
*auth |= SSL_aECDH;
#endif
#ifdef OPENSSL_NO_PSK
- *mkey |= SSL_kPSK;
+ *mkey |= SSL_kPSK | SSL_kRSAPSK;
*auth |= SSL_aPSK;
#endif
#ifdef OPENSSL_NO_SRP
@@ -1555,6 +1557,8 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method, STACK
*/
ssl_cipher_apply_rule(0, SSL_kRSA, 0, 0, 0, 0, 0, CIPHER_ORD, -1, &head,
&tail);
+ ssl_cipher_apply_rule(0, SSL_kRSAPSK, 0, 0, 0, 0, 0, CIPHER_ORD, -1, &head,
+ &tail);
ssl_cipher_apply_rule(0, SSL_kPSK, 0, 0, 0, 0, 0, CIPHER_ORD, -1, &head,
&tail);
ssl_cipher_apply_rule(0, SSL_kKRB5, 0, 0, 0, 0, 0, CIPHER_ORD, -1, &head,
@@ -1731,6 +1735,9 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
case SSL_kPSK:
kx = "PSK";
break;
+ case SSL_kRSAPSK:
+ kx = "RSAPSK";
+ break;
case SSL_kSRP:
kx = "SRP";
break;
diff --git x/ssl/ssl_lib.c y/ssl/ssl_lib.c
index 3539f4b8d2..df6a45bdc4 100644
--- x/ssl/ssl_lib.c
+++ y/ssl/ssl_lib.c
@@ -2442,8 +2442,14 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)
#ifndef OPENSSL_NO_PSK
mask_k |= SSL_kPSK;
+#ifndef OPENSSL_NO_RSA
+ mask_k |= SSL_kRSAPSK;
+#endif
mask_a |= SSL_aPSK;
emask_k |= SSL_kPSK;
+#ifndef OPENSSL_NO_RSA
+ emask_k |= SSL_kRSAPSK;
+#endif
emask_a |= SSL_aPSK;
#endif
diff --git x/ssl/ssl_locl.h y/ssl/ssl_locl.h
index aeffc00634..25b9f1d5b1 100644
--- x/ssl/ssl_locl.h
+++ y/ssl/ssl_locl.h
@@ -314,6 +314,8 @@
# define SSL_kGOST 0x00000200L
/* SRP */
# define SSL_kSRP 0x00000400L
+/* RSA PSK */
+# define SSL_kRSAPSK 0x00000800L
/* Bits for algorithm_auth (server authentication) */
/* RSA auth */
diff --git x/ssl/tls1.h y/ssl/tls1.h
index dd1d8c109e..e04e7ddabc 100644
--- x/ssl/tls1.h
+++ y/ssl/tls1.h
@@ -410,6 +410,24 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA 0x0300008C
# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA 0x0300008D
+/* PSK ciphersuites from 5487 */
+# define TLS1_CK_PSK_WITH_AES_128_GCM_SHA256 0x030000A8
+# define TLS1_CK_PSK_WITH_AES_256_GCM_SHA384 0x030000A9
+# define TLS1_CK_PSK_WITH_AES_128_CBC_SHA256 0x030000AE
+# define TLS1_CK_PSK_WITH_AES_256_CBC_SHA384 0x030000AF
+
+/* RSA-PSK ciphersuites from 4279 */
+# define TLS1_CK_RSA_PSK_WITH_RC4_128_SHA 0x03000092
+# define TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x03000093
+# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA 0x03000094
+# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA 0x03000095
+
+/* RSA-PSK ciphersuites from 5487 */
+# define TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256 0x030000AC
+# define TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384 0x030000AD
+# define TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256 0x030000B6
+# define TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384 0x030000B7
+
/*
* Additional TLS ciphersuites from expired Internet Draft
* draft-ietf-tls-56-bit-ciphersuites-01.txt (available if
@@ -629,6 +647,24 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA "PSK-AES128-CBC-SHA"
# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA "PSK-AES256-CBC-SHA"
+/* PSK ciphersuites from RFC 5487 */
+# define TLS1_TXT_PSK_WITH_AES_128_GCM_SHA256 "PSK-AES128-GCM-SHA256"
+# define TLS1_TXT_PSK_WITH_AES_256_GCM_SHA384 "PSK-AES256-GCM-SHA384"
+# define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA256 "PSK-AES128-CBC-SHA256"
+# define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA384 "PSK-AES256-CBC-SHA384"
+
+/* RSA-PSK ciphersuites from RFC 4279 */
+# define TLS1_TXT_RSA_PSK_WITH_RC4_128_SHA "RSA-PSK-RC4-SHA"
+# define TLS1_TXT_RSA_PSK_WITH_3DES_EDE_CBC_SHA "RSA-PSK-3DES-EDE-CBC-SHA"
+# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA "RSA-PSK-AES128-CBC-SHA"
+# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA "RSA-PSK-AES256-CBC-SHA"
+
+/* RSA-PSK ciphersuites from RFC 5487 */
+# define TLS1_TXT_RSA_PSK_WITH_AES_128_GCM_SHA256 "RSA-PSK-AES128-GCM-SHA256"
+# define TLS1_TXT_RSA_PSK_WITH_AES_256_GCM_SHA384 "RSA-PSK-AES256-GCM-SHA384"
+# define TLS1_TXT_RSA_PSK_WITH_AES_128_CBC_SHA256 "RSA-PSK-AES128-CBC-SHA256"
+# define TLS1_TXT_RSA_PSK_WITH_AES_256_CBC_SHA384 "RSA-PSK-AES256-CBC-SHA384"
+
/* SRP ciphersuite from RFC 5054 */
# define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA "SRP-3DES-EDE-CBC-SHA"
# define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA "SRP-RSA-3DES-EDE-CBC-SHA"
--
2.15.0

View File

@ -1,25 +0,0 @@
From e06d2d0d163501fdb0926175d7c539c7bb413d70 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Wed, 22 Nov 2017 07:35:56 +0100
Subject: Add IsoDep to the techList on Android
Change-Id: I26c183c1344cd0d9323fcedde82347487eebdffb
---
src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java | 1 +
1 file changed, 1 insertion(+)
diff --git x/qtconnectivity/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java y/qtconnectivity/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
index 345b87d3..a1ae5c37 100644
--- x/qtconnectivity/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
+++ y/qtconnectivity/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
@@ -127,6 +127,7 @@ public class QtNfc
filters[2] = new IntentFilter();
filters[2].addAction(NfcAdapter.ACTION_TECH_DISCOVERED);
String[][] techList = new String[][]{
+ {"android.nfc.tech.IsoDep"},
{"android.nfc.tech.Ndef"},
{"android.nfc.tech.NdefFormatable"}
};
--
2.14.2

View File

@ -1,73 +0,0 @@
From 26383dba15ceed74b36dd71e5b1837c63aade927 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Thu, 14 Sep 2017 12:47:11 +0200
Subject: Avoid using deprecated APIs on iOS 10.0+
Change-Id: Ic9dc6a24ef793a29c2652ad37bc11120e2e6ceef
---
src/gui/util/qdesktopservices.cpp | 13 +++++++++++++
src/plugins/platforms/ios/qiosservices.mm | 14 ++++++++++++--
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git x/qtbase/src/gui/util/qdesktopservices.cpp y/qtbase/src/gui/util/qdesktopservices.cpp
index c9747877f7..77ccc02aa5 100644
--- x/qtbase/src/gui/util/qdesktopservices.cpp
+++ y/qtbase/src/gui/util/qdesktopservices.cpp
@@ -177,6 +177,19 @@ void QOpenUrlHandlerRegistry::handlerDestroyed(QObject *handler)
still fail to launch or fail to open the requested URL. This result will not be reported back
to the application.
+ \warning URLs passed to this function on iOS will not load unless their schemes are
+ listed in the \c LSApplicationQueriesSchemes key of the application's Info.plist file.
+ For more information, see the Apple Developer Documentation for
+ \l{https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl}{canOpenURL(_:)}.
+ For example, the following lines enable URLs with the HTTPS scheme:
+
+ \code
+ <key>LSApplicationQueriesSchemes</key>
+ <array>
+ <string>https</string>
+ </array>
+ \endcode
+
\sa setUrlHandler()
*/
bool QDesktopServices::openUrl(const QUrl &url)
diff --git x/qtbase/src/plugins/platforms/ios/qiosservices.mm y/qtbase/src/plugins/platforms/ios/qiosservices.mm
index 0ecc8e123f..a963a5c05d 100644
--- x/qtbase/src/plugins/platforms/ios/qiosservices.mm
+++ y/qtbase/src/plugins/platforms/ios/qiosservices.mm
@@ -41,6 +41,7 @@
#include <QtCore/qurl.h>
#include <QtGui/qdesktopservices.h>
+#include <QOperatingSystemVersion>
#import <UIKit/UIApplication.h>
@@ -55,11 +56,20 @@ bool QIOSServices::openUrl(const QUrl &url)
return openDocument(url);
NSURL *nsUrl = url.toNSURL();
+ UIApplication *application = [UIApplication sharedApplication];
- if (![[UIApplication sharedApplication] canOpenURL:nsUrl])
+ if (![application canOpenURL:nsUrl])
return false;
- return [[UIApplication sharedApplication] openURL:nsUrl];
+#if QT_DARWIN_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_NA, 100000, 100000, __WATCHOS_NA)
+ if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 10)) {
+ [application openURL:nsUrl options:@{} completionHandler:nil];
+ return true;
+ } else
+#endif
+ {
+ return [application openURL:nsUrl];
+ }
}
bool QIOSServices::openDocument(const QUrl &url)
--
2.14.1

View File

@ -1,32 +0,0 @@
From 1f505127d1dba4b755fc00360a5bffff8163acb7 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Wed, 19 Jul 2017 09:44:01 +0200
Subject: Change build configuration for Qt on iOS
---
mkspecs/macx-ios-clang/qmake.conf | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git x/qtbase/mkspecs/macx-ios-clang/qmake.conf y/qtbase/mkspecs/macx-ios-clang/qmake.conf
index 825e03aa85..fe783faee3 100644
--- x/qtbase/mkspecs/macx-ios-clang/qmake.conf
+++ y/qtbase/mkspecs/macx-ios-clang/qmake.conf
@@ -2,13 +2,13 @@
# qmake configuration for macx-ios-clang
#
-QMAKE_IOS_DEPLOYMENT_TARGET = 8.0
+QMAKE_IOS_DEPLOYMENT_TARGET = 10.0
# Universal target (iPhone and iPad)
QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 1,2
-QMAKE_APPLE_DEVICE_ARCHS = armv7 arm64
-QMAKE_APPLE_SIMULATOR_ARCHS = i386 x86_64
+QMAKE_APPLE_DEVICE_ARCHS = arm64
+QMAKE_APPLE_SIMULATOR_ARCHS = x86_64
include(../common/ios.conf)
include(../common/gcc-base-mac.conf)
--
2.13.2

View File

@ -1,26 +0,0 @@
From 978caa044d4e1c52c90a87490defbac387db58d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Mon, 25 Sep 2017 14:10:56 +0200
Subject: [PATCH] Disable unused imageformats
---
src/plugins/imageformats/imageformats.pro | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git x/qtimageformats/src/plugins/imageformats/imageformats.pro y/qtimageformats/src/plugins/imageformats/imageformats.pro
index 8c79379..2aa80f5 100644
--- x/qtimageformats/src/plugins/imageformats/imageformats.pro
+++ y/qtimageformats/src/plugins/imageformats/imageformats.pro
@@ -16,8 +16,7 @@ config_jasper {
SUBDIRS += macjp2
}
-winrt {
SUBDIRS -= tiff \
tga \
+ wbmp \
webp
-}
--
2.14.1

View File

@ -1,54 +0,0 @@
From 5cad7717db911f113355b353a6eeb3687f6fbf9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
Date: Thu, 23 Jul 2015 12:16:01 +0200
Subject: [PATCH] Enable debug output for OpenSSL
---
src/network/ssl/qsslsocket.cpp | 2 +-
src/network/ssl/qsslsocket_mac.cpp | 1 +
src/network/ssl/qsslsocket_openssl.cpp | 4 ++--
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git x/qtbase/src/network/ssl/qsslsocket.cpp y/qtbase/src/network/ssl/qsslsocket.cpp
index 3e7a30a..61ff7a1 100644
--- x/qtbase/src/network/ssl/qsslsocket.cpp
+++ y/qtbase/src/network/ssl/qsslsocket.cpp
@@ -39,7 +39,7 @@
****************************************************************************/
-//#define QSSLSOCKET_DEBUG
+#define QSSLSOCKET_DEBUG
/*!
\class QSslSocket
diff --git x/qtbase/src/network/ssl/qsslsocket_mac.cpp y/qtbase/src/network/ssl/qsslsocket_mac.cpp
index 99ae792..13339c8 100644
--- x/qtbase/src/network/ssl/qsslsocket_mac.cpp
+++ y/qtbase/src/network/ssl/qsslsocket_mac.cpp
@@ -37,6 +37,7 @@
**
****************************************************************************/
+#define QSSLSOCKET_DEBUG
#include "qsslsocket.h"
#include "qssl_p.h"
diff --git x/qtbase/src/network/ssl/qsslsocket_openssl.cpp y/qtbase/src/network/ssl/qsslsocket_openssl.cpp
index 4f62f53..f8d8174 100644
--- x/qtbase/src/network/ssl/qsslsocket_openssl.cpp
+++ y/qtbase/src/network/ssl/qsslsocket_openssl.cpp
@@ -53,8 +53,8 @@
**
****************************************************************************/
-//#define QSSLSOCKET_DEBUG
-//#define QT_DECRYPT_SSL_TRAFFIC
+#define QSSLSOCKET_DEBUG
+#define QT_DECRYPT_SSL_TRAFFIC
#include "qssl_p.h"
#include "qsslsocket_openssl_p.h"
--
2.8.0

View File

@ -1,49 +0,0 @@
From d9c149dbc2021ed1e82cd34ae30dfd39f7d82a8d Mon Sep 17 00:00:00 2001
From: Jens Trillmann <jens.trillmann@governikus.de>
Date: Mon, 12 Mar 2018 12:06:05 +0100
Subject: [PATCH] Fix reopening on macOS
When a user reopens an application while the application is already
running, then macOS does not run the application a second time but
sends kAEReopenApplication to inform the running instance.
Qt ignores this event and the application does not open. To handle this
event a new event handler is registered. The application state is set
to Qt::ApplicationActive when the handler is called. An application that
wants to react to reopening has to react to QEvent::ApplicationActivate
in the running QApplication.
Change-Id: Ic3adeb6b334c85f36671c254657170c71a2dfb59
---
src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git x/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm y/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
index a94e0dc517..ccf16addea 100644
--- x/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
+++ y/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
@@ -259,6 +259,10 @@ - (void) applicationWillFinishLaunching:(NSNotification *)notification
andSelector:@selector(appleEventQuit:withReplyEvent:)
forEventClass:kCoreEventClass
andEventID:kAEQuitApplication];
+ [eventManager setEventHandler:self
+ andSelector:@selector(appleEventReopen:withReplyEvent:)
+ forEventClass:kCoreEventClass
+ andEventID:kAEReopenApplication];
[eventManager setEventHandler:self
andSelector:@selector(getUrl:withReplyEvent:)
forEventClass:kInternetEventClass
@@ -438,4 +442,11 @@ - (void)appleEventQuit:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEv
[NSApp terminate:self];
}
+- (void)appleEventReopen:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
+{
+ Q_UNUSED(event);
+ Q_UNUSED(replyEvent);
+ QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true);
+}
+
@end
--
2.14.3 (Apple Git-98)

View File

@ -1,261 +0,0 @@
From b0404383ab573d7550a6564405bb9b1316ff193a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20L=C3=B6sch?= <Sebastian.Loesch@governikus.de>
Date: Thu, 21 Apr 2016 09:19:19 +0200
Subject: [PATCH] Make server side signature algorithms configurable
Signature algorithms are used during the TLS handshake phase to protect
transferred security parameters, e.g the message ServerKeyExchange.
This patch enables the configuration of allowed algorithms used by the
server side.
Change-Id: Ia178efd4778b91863fcc919bf50219115b300d77
---
src/network/ssl/qsslconfiguration.cpp | 42 ++++++++++++++++++++++++
src/network/ssl/qsslconfiguration.h | 8 ++++-
src/network/ssl/qsslconfiguration_p.h | 5 +++
src/network/ssl/qsslcontext_openssl.cpp | 45 ++++++++++++++++++++++++++
src/network/ssl/qsslcontext_openssl_p.h | 1 +
src/network/ssl/qsslsocket.cpp | 2 ++
src/network/ssl/qsslsocket_openssl_symbols_p.h | 5 +++
7 files changed, 107 insertions(+), 1 deletion(-)
diff --git x/qtbase/src/network/ssl/qsslconfiguration.cpp y/qtbase/src/network/ssl/qsslconfiguration.cpp
index 75a880f115..37f99feef1 100644
--- x/qtbase/src/network/ssl/qsslconfiguration.cpp
+++ y/qtbase/src/network/ssl/qsslconfiguration.cpp
@@ -221,6 +221,7 @@ bool QSslConfiguration::operator==(const QSslConfiguration &other) const
d->peerVerifyMode == other.d->peerVerifyMode &&
d->peerVerifyDepth == other.d->peerVerifyDepth &&
d->allowRootCertOnDemandLoading == other.d->allowRootCertOnDemandLoading &&
+ d->signatureAndHashAlgorithms == other.d->signatureAndHashAlgorithms &&
d->sslOptions == other.d->sslOptions &&
d->sslSession == other.d->sslSession &&
d->sslSessionTicketLifeTimeHint == other.d->sslSessionTicketLifeTimeHint &&
@@ -263,6 +264,7 @@ bool QSslConfiguration::isNull() const
d->privateKey.isNull() &&
d->peerCertificate.isNull() &&
d->peerCertificateChain.count() == 0 &&
+ d->signatureAndHashAlgorithms.isEmpty() &&
d->sslOptions == QSslConfigurationPrivate::defaultSslOptions &&
d->sslSession.isNull() &&
d->sslSessionTicketLifeTimeHint == -1 &&
@@ -869,6 +871,46 @@ void QSslConfiguration::setDiffieHellmanParameters(const QSslDiffieHellmanParame
d->dhParams = dhparams;
}
+/*!
+ \since 5.9
+
+ Returns the connection's current list of supported signature
+ algorithms if enabled. Enable it by calling
+ setSignatureAndHashAlgorithms().
+
+ \sa setSignatureAndHashAlgorithms()
+ */
+QVector<QPair<QSsl::KeyAlgorithm, QCryptographicHash::Algorithm> > QSslConfiguration::signatureAndHashAlgorithms() const
+{
+ return d->signatureAndHashAlgorithms;
+}
+
+/*!
+ \since 5.9
+
+ Sets the list of signature algorithms to be used for the current
+ connection. The algorithms are expected to be ordered by descending
+ preference (i.e., the first algorithm is the most preferred one).
+ Notice that this restricts the list of supported ciphers (e.g.
+ configuring the signature algorithm RSA+SHA1 will restrict the ciphers
+ to RSA ciphers).
+
+ When configuring the client side this are the algorithms set in the
+ Signature Algorithms TLS extension, see RFC 5246 for details. Although
+ this extension will be ignored for TLS protocol versions prior 1.2
+ this still restricts the supported ciphers as mentioned above.
+
+ By default, the handshake phase can choose any of the algorithms
+ supported by this system's SSL libraries, which may vary from
+ system to system.
+
+ \sa signatureAndHashAlgorithms()
+ */
+void QSslConfiguration::setSignatureAndHashAlgorithms(const QVector<QPair<QSsl::KeyAlgorithm, QCryptographicHash::Algorithm> > &algorithms)
+{
+ d->signatureAndHashAlgorithms = algorithms;
+}
+
/*!
\since 5.3
diff --git x/qtbase/src/network/ssl/qsslconfiguration.h y/qtbase/src/network/ssl/qsslconfiguration.h
index 1c57bebd65..4d3e5129d5 100644
--- x/qtbase/src/network/ssl/qsslconfiguration.h
+++ y/qtbase/src/network/ssl/qsslconfiguration.h
@@ -56,10 +56,13 @@
#ifndef QSSLCONFIGURATION_H
#define QSSLCONFIGURATION_H
-#include <QtNetwork/qtnetworkglobal.h>
+#include <QtCore/qcryptographichash.h>
+#include <QtCore/qpair.h>
#include <QtCore/qshareddata.h>
+#include <QtCore/qvector.h>
#include <QtNetwork/qsslsocket.h>
#include <QtNetwork/qssl.h>
+#include <QtNetwork/qtnetworkglobal.h>
#ifndef QT_NO_SSL
@@ -149,6 +152,9 @@ public:
QSslDiffieHellmanParameters diffieHellmanParameters() const;
void setDiffieHellmanParameters(const QSslDiffieHellmanParameters &dhparams);
+ QVector<QPair<QSsl::KeyAlgorithm, QCryptographicHash::Algorithm> > signatureAndHashAlgorithms() const;
+ void setSignatureAndHashAlgorithms(const QVector<QPair<QSsl::KeyAlgorithm, QCryptographicHash::Algorithm> > &algorithms);
+
static QSslConfiguration defaultConfiguration();
static void setDefaultConfiguration(const QSslConfiguration &configuration);
diff --git x/qtbase/src/network/ssl/qsslconfiguration_p.h y/qtbase/src/network/ssl/qsslconfiguration_p.h
index 6adf2c9b54..7be253973b 100644
--- x/qtbase/src/network/ssl/qsslconfiguration_p.h
+++ y/qtbase/src/network/ssl/qsslconfiguration_p.h
@@ -75,6 +75,9 @@
#include "qsslkey.h"
#include "qsslellipticcurve.h"
#include "qssldiffiehellmanparameters.h"
+#include <QtCore/qcryptographichash.h>
+#include <QtCore/qpair.h>
+#include <QtCore/qvector.h>
QT_BEGIN_NAMESPACE
@@ -123,6 +126,8 @@ public:
QSslDiffieHellmanParameters dhParams;
+ QVector<QPair<QSsl::KeyAlgorithm, QCryptographicHash::Algorithm> > signatureAndHashAlgorithms;
+
QByteArray sslSession;
int sslSessionTicketLifeTimeHint;
diff --git x/qtbase/src/network/ssl/qsslcontext_openssl.cpp y/qtbase/src/network/ssl/qsslcontext_openssl.cpp
index c92d8fc3f8..29df53abc0 100644
--- x/qtbase/src/network/ssl/qsslcontext_openssl.cpp
+++ y/qtbase/src/network/ssl/qsslcontext_openssl.cpp
@@ -42,6 +42,7 @@
#include <QtNetwork/qsslsocket.h>
#include <QtNetwork/qssldiffiehellmanparameters.h>
+#include <QtCore/qmetaobject.h>
#include <QtCore/qmutex.h>
#include "private/qssl_p.h"
@@ -78,6 +79,11 @@ QSslContext::~QSslContext()
q_SSL_SESSION_free(session);
}
+static inline QString msgErrorSettingSignatureAlgorithms(const QString &why)
+{
+ return QSslSocket::tr("Error when setting the signature algorithms (%1)").arg(why);
+}
+
static inline QString msgErrorSettingEllipticCurves(const QString &why)
{
return QSslSocket::tr("Error when setting the elliptic curves (%1)").arg(why);
@@ -371,6 +377,45 @@ init_context:
sslContext->errorCode = QSslError::UnspecifiedError;
}
}
+
+ const auto& sigAndHashAlgorithms = sslContext->sslConfiguration.signatureAndHashAlgorithms();
+ if (!sigAndHashAlgorithms.isEmpty()) {
+#if OPENSSL_VERSION_NUMBER >= 0x10002000L
+ if (q_SSLeay() >= 0x10002000L) {
+ QMetaEnum hashMetaEnum = QMetaEnum::fromType<QCryptographicHash::Algorithm>();
+ QByteArrayList algorithmList;
+ for (int i=0; i < sigAndHashAlgorithms.size(); ++i) {
+ QByteArray sig;
+ switch (sigAndHashAlgorithms[i].first) {
+ case QSsl::KeyAlgorithm::Rsa:
+ sig = QByteArrayLiteral("RSA");
+ break;
+ case QSsl::KeyAlgorithm::Dsa:
+ sig = QByteArrayLiteral("DSA");
+ break;
+ case QSsl::KeyAlgorithm::Ec:
+ sig = QByteArrayLiteral("ECDSA");
+ break;
+ case QSsl::KeyAlgorithm::Opaque:
+ qCWarning(lcSsl, "Invalid value KeyAlgorithm::Opaque will be ignored");
+ continue;
+ }
+ QByteArray hash = QByteArray(hashMetaEnum.valueToKey(sigAndHashAlgorithms[i].second)).toUpper();
+ algorithmList += sig + QByteArrayLiteral("+") + hash;
+ }
+ QByteArray algorithms = algorithmList.join(':');
+ if (!q_SSL_CTX_set1_sigalgs_list(sslContext->ctx, algorithms.data())) {
+ sslContext->errorStr = msgErrorSettingSignatureAlgorithms(QSslSocketBackendPrivate::getErrorsFromOpenSsl());
+ sslContext->errorCode = QSslError::UnspecifiedError;
+ }
+ } else
+#endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
+ {
+ // specific algorithms requested, but not possible to set -> error
+ sslContext->errorStr = msgErrorSettingSignatureAlgorithms(QSslSocket::tr("OpenSSL version too old, need at least v1.0.2"));
+ sslContext->errorCode = QSslError::UnspecifiedError;
+ }
+ }
}
QSslContext* QSslContext::fromConfiguration(QSslSocket::SslMode mode, const QSslConfiguration &configuration, bool allowRootCertOnDemandLoading)
diff --git x/qtbase/src/network/ssl/qsslcontext_openssl_p.h y/qtbase/src/network/ssl/qsslcontext_openssl_p.h
index 06a31af5e5..c8c8e1941b 100644
--- x/qtbase/src/network/ssl/qsslcontext_openssl_p.h
+++ y/qtbase/src/network/ssl/qsslcontext_openssl_p.h
@@ -54,6 +54,7 @@
//
#include <QtNetwork/private/qtnetworkglobal_p.h>
+#include <QtCore/qobjectdefs.h>
#include <QtCore/qvariant.h>
#include <QtNetwork/qsslcertificate.h>
#include <QtNetwork/qsslconfiguration.h>
diff --git x/qtbase/src/network/ssl/qsslsocket.cpp y/qtbase/src/network/ssl/qsslsocket.cpp
index 8eba5db9fe..c0aa8b9bdf 100644
--- x/qtbase/src/network/ssl/qsslsocket.cpp
+++ y/qtbase/src/network/ssl/qsslsocket.cpp
@@ -922,6 +922,7 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
d->configuration.peerVerifyDepth = configuration.peerVerifyDepth();
d->configuration.peerVerifyMode = configuration.peerVerifyMode();
d->configuration.protocol = configuration.protocol();
+ d->configuration.signatureAndHashAlgorithms = configuration.signatureAndHashAlgorithms();
d->configuration.sslOptions = configuration.d->sslOptions;
d->configuration.sslSession = configuration.sessionTicket();
d->configuration.sslSessionTicketLifeTimeHint = configuration.sessionTicketLifeTimeHint();
@@ -2249,6 +2250,7 @@ void QSslConfigurationPrivate::deepCopyDefaultConfiguration(QSslConfigurationPri
ptr->peerVerifyDepth = global->peerVerifyDepth;
ptr->sslOptions = global->sslOptions;
ptr->ellipticCurves = global->ellipticCurves;
+ ptr->signatureAndHashAlgorithms = global->signatureAndHashAlgorithms;
}
/*!
diff --git x/qtbase/src/network/ssl/qsslsocket_openssl_symbols_p.h y/qtbase/src/network/ssl/qsslsocket_openssl_symbols_p.h
index b35a895d38..d4cd493c45 100644
--- x/qtbase/src/network/ssl/qsslsocket_openssl_symbols_p.h
+++ y/qtbase/src/network/ssl/qsslsocket_openssl_symbols_p.h
@@ -517,6 +517,11 @@ int q_EC_curve_nist2nid(const char *name);
#define q_SSL_get_server_tmp_key(ssl, key) q_SSL_ctrl((ssl), SSL_CTRL_GET_SERVER_TMP_KEY, 0, (char *)key)
#endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
+// Signature algorithm extension
+#if OPENSSL_VERSION_NUMBER >= 0x10002000L
+#define q_SSL_CTX_set1_sigalgs_list(ctx, s) q_SSL_CTX_ctrl((ctx), SSL_CTRL_SET_SIGALGS_LIST, 0, (char *)s)
+#endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
+
// PKCS#12 support
int q_PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);
PKCS12 *q_d2i_PKCS12_bio(BIO *bio, PKCS12 **pkcs12);
--
2.15.0

View File

@ -1,123 +0,0 @@
From 3885257e655cefd1f8b18247aff76020c75379e1 Mon Sep 17 00:00:00 2001
From: Lars Schmertmann <Lars.Schmertmann@governikus.de>
Date: Fri, 24 Mar 2017 11:20:14 +0100
Subject: [PATCH] Register additional meta types
Register QLowEnergyCharacteristic and QLowEnergyDescriptor
as meta types because they are used in signals.
[ChangeLog][QtBluetooth] Register QLowEnergyCharacteristic
and QLowEnergyDescriptor as meta types. It is therefore
necessary to declare them as meta types in the header files.
This commit will cause conflicts with existing meta type
declarations in applications using Qt. These declarations
need to be removed.
Change-Id: I18f33b1b2f159cffd6efbacc37178286b86a06e0
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
---
src/bluetooth/osx/osxbtcentralmanager.mm | 2 --
src/bluetooth/qlowenergycharacteristic.h | 2 ++
src/bluetooth/qlowenergycontroller_p.h | 5 -----
src/bluetooth/qlowenergydescriptor.h | 2 ++
src/bluetooth/qlowenergyservice.cpp | 2 ++
.../test/tst_qlowenergycontroller-gattserver.cpp | 4 ----
tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp | 3 ---
7 files changed, 6 insertions(+), 14 deletions(-)
diff --git x/qtconnectivity/src/bluetooth/osx/osxbtcentralmanager.mm y/qtconnectivity/src/bluetooth/osx/osxbtcentralmanager.mm
index ec046d1b..70473f1f 100644
--- x/qtconnectivity/src/bluetooth/osx/osxbtcentralmanager.mm
+++ y/qtconnectivity/src/bluetooth/osx/osxbtcentralmanager.mm
@@ -48,8 +48,6 @@
#include <algorithm>
#include <limits>
-Q_DECLARE_METATYPE(QLowEnergyCharacteristic)
-Q_DECLARE_METATYPE(QLowEnergyDescriptor)
Q_DECLARE_METATYPE(QLowEnergyHandle)
QT_BEGIN_NAMESPACE
diff --git x/qtconnectivity/src/bluetooth/qlowenergycharacteristic.h y/qtconnectivity/src/bluetooth/qlowenergycharacteristic.h
index b991e9a2..154c9936 100644
--- x/qtconnectivity/src/bluetooth/qlowenergycharacteristic.h
+++ y/qtconnectivity/src/bluetooth/qlowenergycharacteristic.h
@@ -107,4 +107,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QLowEnergyCharacteristic::PropertyTypes)
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QLowEnergyCharacteristic)
+
#endif // QLOWENERGYCHARACTERISTIC_H
diff --git x/qtconnectivity/src/bluetooth/qlowenergycontroller_p.h y/qtconnectivity/src/bluetooth/qlowenergycontroller_p.h
index b92716e9..6e866144 100644
--- x/qtconnectivity/src/bluetooth/qlowenergycontroller_p.h
+++ y/qtconnectivity/src/bluetooth/qlowenergycontroller_p.h
@@ -497,11 +497,6 @@ Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivate::Attribute, Q_MOVABLE_TYPE);
QT_END_NAMESPACE
-#ifdef QT_WINRT_BLUETOOTH
-Q_DECLARE_METATYPE(QLowEnergyCharacteristic)
-Q_DECLARE_METATYPE(QLowEnergyDescriptor)
-#endif // QT_WINRT_BLUETOOTH
-
#endif // QT_OSX_BLUETOOTH || QT_IOS_BLUETOOTH
#endif // QLOWENERGYCONTROLLERPRIVATE_P_H
diff --git x/qtconnectivity/src/bluetooth/qlowenergydescriptor.h y/qtconnectivity/src/bluetooth/qlowenergydescriptor.h
index 1dfe1c35..9e71fc56 100644
--- x/qtconnectivity/src/bluetooth/qlowenergydescriptor.h
+++ y/qtconnectivity/src/bluetooth/qlowenergydescriptor.h
@@ -89,4 +89,6 @@ protected:
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QLowEnergyDescriptor)
+
#endif // QLOWENERGYDESCRIPTOR_H
diff --git x/qtconnectivity/src/bluetooth/qlowenergyservice.cpp y/qtconnectivity/src/bluetooth/qlowenergyservice.cpp
index 6e33c565..9d3129fd 100644
--- x/qtconnectivity/src/bluetooth/qlowenergyservice.cpp
+++ y/qtconnectivity/src/bluetooth/qlowenergyservice.cpp
@@ -380,6 +380,8 @@ QLowEnergyService::QLowEnergyService(QSharedPointer<QLowEnergyServicePrivate> p,
qRegisterMetaType<QLowEnergyService::ServiceError>();
qRegisterMetaType<QLowEnergyService::ServiceType>();
qRegisterMetaType<QLowEnergyService::WriteMode>();
+ qRegisterMetaType<QLowEnergyCharacteristic>();
+ qRegisterMetaType<QLowEnergyDescriptor>();
connect(p.data(), SIGNAL(error(QLowEnergyService::ServiceError)),
this, SIGNAL(error(QLowEnergyService::ServiceError)));
diff --git x/qtconnectivity/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp y/qtconnectivity/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
index 3df27d92..e01457eb 100644
--- x/qtconnectivity/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
+++ y/qtconnectivity/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
@@ -243,10 +243,6 @@ void TestQLowEnergyControllerGattServer::advertisedData()
QVERIFY(m_serverInfo.serviceUuids().contains(QBluetoothUuid(quint16(0x2000))));
}
-// TODO: Why on earth is this not in the library???
-Q_DECLARE_METATYPE(QLowEnergyCharacteristic)
-Q_DECLARE_METATYPE(QLowEnergyDescriptor)
-
void TestQLowEnergyControllerGattServer::serverCommunication()
{
qRegisterMetaType<QLowEnergyCharacteristic>();
diff --git x/qtconnectivity/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp y/qtconnectivity/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
index 7b02dbcd..c6fd83e6 100644
--- x/qtconnectivity/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
+++ y/qtconnectivity/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
@@ -91,9 +91,6 @@ private:
QList<QBluetoothUuid> foundServices;
};
-Q_DECLARE_METATYPE(QLowEnergyCharacteristic)
-Q_DECLARE_METATYPE(QLowEnergyDescriptor)
-
tst_QLowEnergyController::tst_QLowEnergyController()
{
qRegisterMetaType<QLowEnergyCharacteristic>();
--
2.14.2

View File

@ -1,90 +0,0 @@
From 13f25c979fe4396e6d5a76bf183341229da2bacd Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Thu, 30 Nov 2017 15:00:26 +0100
Subject: [PATCH] macOS/iOS: Fix garbled text under some conditions
There seems to be an issue in CoreText which may cause an existing
font descriptor to give unreliable results if it refers to one of
the system theme fonts. Since we do not know all function calls
or events that may trigger this bug, the safe route is to always
create fresh font descriptors when creating fonts for these
descriptors. The impact on performance should be small, as Qt has
its own internal caches.
[ChangeLog][macOS/iOS][Text] Fixed an issue where text using
one of the system theme fonts would under certain circumstances
display random glyphs.
Task-number: QTBUG-63476
Change-Id: I9e9b253018c63976345eec1439a6b78de2cab869
---
.../fontdatabases/mac/qcoretextfontdatabase.mm | 24 ++++++++++++++--------
.../fontdatabases/mac/qcoretextfontdatabase_p.h | 4 +++-
2 files changed, 19 insertions(+), 9 deletions(-)
diff --git x/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm y/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index 6347d4d231..237e8a89a5 100644
--- x/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ y/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -416,7 +416,19 @@ extern CGAffineTransform qt_transform_from_fontdef(const QFontDef &fontDef);
template <>
QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine(const QFontDef &fontDef, void *usrPtr)
{
- CTFontDescriptorRef descriptor = static_cast<CTFontDescriptorRef>(usrPtr);
+ QCFType<CTFontDescriptorRef> descriptor = QCFType<CTFontDescriptorRef>::constructFromGet(
+ static_cast<CTFontDescriptorRef>(usrPtr));
+
+ // CoreText will sometimes invalidate information in font descriptors that refer
+ // to system fonts in certain function calls or application states. While the descriptor
+ // looks the same from the outside, some internal plumbing is different, causing the results
+ // of creating CTFonts from those descriptors unreliable. The work-around for this
+ // is to copy the attributes of those descriptors each time we make a new CTFont
+ // from them instead of referring to the original, as that may trigger the CoreText bug.
+ if (m_systemFontDescriptors.contains(descriptor)) {
+ QCFType<CFDictionaryRef> attributes = CTFontDescriptorCopyAttributes(descriptor);
+ descriptor = CTFontDescriptorCreateWithAttributes(attributes);
+ }
// Since we do not pass in the destination DPI to CoreText when making
// the font, we need to pass in a point size which is scaled to include
@@ -427,14 +439,10 @@ QFontEngine *QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>::fontEngine
qreal scaledPointSize = fontDef.pixelSize;
CGAffineTransform matrix = qt_transform_from_fontdef(fontDef);
- CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix);
- if (font) {
- QFontEngine *engine = new QCoreTextFontEngine(font, fontDef);
- CFRelease(font);
- return engine;
- }
+ if (QCFType<CTFontRef> font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix))
+ return new QCoreTextFontEngine(font, fontDef);
- return NULL;
+ return nullptr;
}
#ifndef QT_NO_FREETYPE
diff --git x/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h y/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
index 9612b909f1..e14d1d6e6e 100644
--- x/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
+++ y/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase_p.h
@@ -91,12 +91,14 @@ public:
QFont *themeFont(QPlatformTheme::Font) const;
const QHash<QPlatformTheme::Font, QFont *> &themeFonts() const;
+protected:
+ mutable QSet<CTFontDescriptorRef> m_systemFontDescriptors;
+
private:
void populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName = QString());
mutable QString defaultFontName;
- mutable QSet<CTFontDescriptorRef> m_systemFontDescriptors;
mutable QHash<QPlatformTheme::Font, QFont *> m_themeFonts;
bool m_hasPopulatedAliases;
};
--
2.15.1

View File

@ -14,17 +14,20 @@ SET(QRC_FILES "ausweisapp.qrc")
IF(IOS OR ANDROID OR ${CMAKE_BUILD_TYPE} STREQUAL "DEBUG")
LIST(APPEND QRC_FILES "ausweisapp_mobile.qrc")
SET(ausweisapp_qml.qrc "${CMAKE_CURRENT_BINARY_DIR}/ausweisapp_qml.qrc")
WRITE_QRC("${ausweisapp_qml.qrc}" "${CMAKE_CURRENT_SOURCE_DIR}/qml" "qml")
LIST(APPEND QRC_FILES "${ausweisapp_qml.qrc}")
ENDIF()
IF(DESKTOP)
LIST(APPEND QRC_FILES "ausweisapp_desktop.qrc")
ENDIF()
IF(TARGET Qt5::Qml)
SET(ausweisapp_qml.qrc "${CMAKE_CURRENT_BINARY_DIR}/ausweisapp_qml.qrc")
WRITE_QRC("${ausweisapp_qml.qrc}" "${CMAKE_CURRENT_SOURCE_DIR}/qml" "qml")
LIST(APPEND QRC_FILES "${ausweisapp_qml.qrc}")
SET(QML_IMPORT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/qml CACHE STRING "qml files" FORCE)
ENDIF()
SET(RCC ${CMAKE_BINARY_DIR}/src/${PROJECT_NAME}.rcc)
SET(RCC ${RCC} PARENT_SCOPE)
qt5_add_binary_resources(AusweisAppRcc "${QRC_FILES}" DESTINATION ${RCC})
SET(QML_IMPORT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/qml ${CMAKE_CURRENT_SOURCE_DIR}/qml_stationary CACHE string "qml files" FORCE)

View File

@ -1,7 +1,9 @@
# Recommended usage:
# LSAN_OPTIONS=suppressions=/home/dev/src/asan_blacklist ./AusweisApp2
# LSAN_OPTIONS=suppressions=/home/dev/AusweisApp2.src/resources/asan_blacklist ./AusweisApp2
leak:g_malloc*
leak:CRYPTO_malloc
leak:libxcb*
leak:Q*
leak:QQuick*
leak:QKde*
leak:QQml*

View File

@ -10,52 +10,38 @@
<file>images/bt_3b.svg</file>
<file>images/bt_4.svg</file>
<file>images/bt_4b.svg</file>
<file>images/bspd1.svg</file>
<file>images/canHint.png</file>
<file>images/icon_attention.svg</file>
<file>images/icon_ok.png</file>
<file>images/icon_cancelled.png</file>
<file>images/Icon_Checked.svg</file>
<file>images/android/search_icon.svg</file>
<file>images/android/search_cancel.svg</file>
<file>images/iOS/search_icon.svg</file>
<file>images/iOS/search_cancel.svg</file>
<file>images/back-chevron.png</file>
<file>images/iOS/tabBar/Anbieter-off.png</file>
<file>images/iOS/tabBar/Anbieter-on.png</file>
<file>images/iOS/tabBar/Ausweisen-off.png</file>
<file>images/iOS/tabBar/Ausweisen-on.png</file>
<file>images/iOS/tabBar/Pin-off.png</file>
<file>images/iOS/tabBar/Pin-on.png</file>
<file>images/iOS/tabBar/Verlauf-off.png</file>
<file>images/iOS/tabBar/Verlauf-on.png</file>
<file>images/cancel.svg</file>
<file>images/check.svg</file>
<file>images/icon_Pin.svg</file>
<file>images/iOS/tabBar/More-off.svg</file>
<file>images/iOS/tabBar/More-on.svg</file>
<file>images/rotes_X.svg</file>
<file>images/gruener_Haken.svg</file>
<file>images/status_error.svg</file>
<file>images/status_info.svg</file>
<file>images/status_ok.svg</file>
<file>images/iOS/CheckedCheckbox.png</file>
<file>images/iOS/Header-Ausweisapp@3x.png</file>
<file>images/delete.png</file>
<file>images/delete.svg</file>
<file>images/NFCPhoneCard.png</file>
<file>images/submit.png</file>
<file>images/submit.svg</file>
<file>images/ausweis.png</file>
<file>images/provider/information.svg</file>
<file>images/provider/purpose.svg</file>
<file>images/provider/adresse.png</file>
<file>images/provider/+tablet/adresse.png</file>
<file>images/provider/mail.png</file>
<file>images/provider/+tablet/mail.png</file>
<file>images/provider/telefon.png</file>
<file>images/provider/+tablet/telefon.png</file>
<file>images/provider/url.png</file>
<file>images/provider/+tablet/url.png</file>
<file>images/provider/adresse.svg</file>
<file>images/provider/mail.svg</file>
<file>images/provider/telefon.svg</file>
<file>images/provider/url.svg</file>
<file>images/provider/gradient-citizen.png</file>
<file>images/provider/gradient-insurance.png</file>
<file>images/provider/gradient-finance.png</file>
<file>images/provider/gradient-other.png</file>
<file>images/provider/categoryIcons/general.svg</file>
<file>images/provider/categoryIcons/citizen.svg</file>
<file>images/provider/categoryIcons/finance.svg</file>
<file>images/provider/categoryIcons/insurance.svg</file>
<file>images/provider/categoryIcons/other.svg</file>
<file alias="images/provider/categoryIcons/general_bg.svg">images/provider/categoryIcons/+android/general_bg.svg</file>
<file>images/provider/categoryIcons/+android/general.svg</file>
<file>images/provider/categoryIcons/+android/citizen.svg</file>
<file>images/provider/categoryIcons/+android/finance.svg</file>
@ -79,12 +65,27 @@
<file>updatable-files/supported-providers.json</file>
<file>images/icon_nfc.svg</file>
<file>images/icon_remote.svg</file>
<file>images/icon_remote_inactive.svg</file>
<file>images/icon_remote_0.svg</file>
<file>images/icon_remote_25.svg</file>
<file>images/icon_remote_50.svg</file>
<file>images/icon_remote_75.svg</file>
<file>images/icon_remote_100.svg</file>
<file>images/icon_bluetooth.svg</file>
<file>images/phone_to_pc.svg</file>
<file>images/phone_nfc.svg</file>
<file>images/phone_remote.svg</file>
<file>images/phone_bluetooth.svg</file>
<file>images/location_flag_de.svg</file>
<file>images/location_flag_en.svg</file>
<file>images/siteWithLogo.png</file>
<file>images/icon_pair.svg</file>
<file>images/icon_settings.svg</file>
<file>images/trash_icon_white.svg</file>
<file>images/trash_icon.svg</file>
<file>images/icon_save.svg</file>
<file>images/info.svg</file>
<file>images/info_filled.svg</file>
<file>images/triangle.svg</file>
</qresource>
</RCC>

View File

@ -4,18 +4,42 @@
<file>html_templates/error.html</file>
<file>stylesheets/desktop.qss</file>
<file>images/beta.svg</file>
<file>images/green_check_mark.svg</file>
<file>images/MenuSelected.png</file>
<file>images/MenuUnselected.png</file>
<file>images/MenuUnselectedDisabled.png</file>
<file>images/npa.ico</file>
<file>images/Logo_AutentApp2_2014.png</file>
<file>images/AppLogo_AutentApp2_2014.png</file>
<file>images/Logo_Governikus.png</file>
<file>images/Logo_AusweisApp2.png</file>
<file>images/start_nPA_eAT.png</file>
<file>images/busy_animation.gif</file>
<file>images/html_message_section.jpg</file>
<file>images/padlock.svg</file>
<file>images/padlock_empty.svg</file>
<file>images/search_icon.svg</file>
<file>images/search_cancel.svg</file>
<file>images/desktop/bell_white.svg</file>
<file>images/desktop/bell_green.svg</file>
<file>images/desktop/bell_red.svg</file>
<file>images/desktop/id_card.png</file>
<file>images/desktop/pin-letter-page1.png</file>
<file>images/desktop/pin-letter-page2.png</file>
<file>images/desktop/help_icon.svg</file>
<file>images/desktop/main_history.svg</file>
<file>images/desktop/main_identify.svg</file>
<file>images/desktop/main_info.svg</file>
<file>images/desktop/main_pin.svg</file>
<file>images/desktop/main_provider.svg</file>
<file>images/desktop/sandglass.svg</file>
<file>images/desktop/settings_icon.svg</file>
<file>images/desktop/titlebar_arrow.svg</file>
<file>images/desktop/continue_arrow.svg</file>
<file>images/desktop/info_questions.svg</file>
<file>images/desktop/info_application_log.svg</file>
<file>images/desktop/info_diagnosis.svg</file>
<file>images/desktop/info_license.svg</file>
<file>images/desktop/info_manual.svg</file>
<file>images/desktop/info_rate_application.svg</file>
<file>images/desktop/info_report_error.svg</file>
<file>images/desktop/info_setup.svg</file>
<file>images/desktop/info_version.svg</file>
<file>images/randompin/btn_normal_0.png</file>
<file>images/randompin/btn_normal_1.png</file>
<file>images/randompin/btn_normal_2.png</file>
@ -30,6 +54,7 @@
<file>images/randompin/btn_ok.png</file>
<file>images/randompin/btn_cancel.png</file>
<file>images/randompin/btn_clear.png</file>
<file>images/reader/default_card_position.png</file>
<file>images/reader/default_more_reader.png</file>
<file>images/reader/default_no_card.png</file>
<file>images/reader/default_no_reader.png</file>
@ -56,14 +81,12 @@
<file>updatable-files/reader/img_Gemalto_Prox_SU_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Global_OMNIKEY_5321_V2.png</file>
<file>updatable-files/reader/img_HID_Global_OMNIKEY_5321_V2_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Omnikey_5421.png</file>
<file>updatable-files/reader/img_HID_Omnikey_5421_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Omnikey_542x.png</file>
<file>updatable-files/reader/img_HID_Omnikey_542x_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_502X_CL.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_502X_CL_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_4121_CL_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_5021_CL.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_5021_CL_mit_ausweis.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_5022_CL.png</file>
<file>updatable-files/reader/img_HID_Omnikey_Mobile_Reader_5022_CL_mit_ausweis.png</file>
<file>updatable-files/reader/img_Identive_Cloud_3700_F.png</file>
<file>updatable-files/reader/img_Identive_Cloud_3700_F_mit_ausweis.png</file>
<file>updatable-files/reader/img_Identive_Cloud_4700_F.png</file>
@ -88,5 +111,9 @@
<file>updatable-files/reader/img_Reiner_SCT_cyberjack_RFID_standard_mit_ausweis.png</file>
<file>updatable-files/reader/img_RemoteReader.png</file>
<file>updatable-files/reader/img_RemoteReader_mit_ausweis.png</file>
<file>updatable-files/reader/img_Cherry_ST_1275.png</file>
<file>updatable-files/reader/img_Cherry_ST_1275_mit_ausweis.png</file>
<file>updatable-files/reader/img_Signotec_Omega_Pad.png</file>
<file>updatable-files/reader/img_Signotec_Omega_Pad_mit_ausweis.png</file>
</qresource>
</RCC>

View File

@ -2,50 +2,154 @@
<qresource prefix="/">
<file>qtquickcontrols2.conf</file>
<file>images/zahnraeder.svg</file>
<file>images/check.svg</file>
<file>images/iOS/arrowLeft.svg</file>
<file>images/iOS/arrowRight.svg</file>
<file>images/iOS/list_item_arrow.svg</file>
<file>images/iOS/radio_button_check_ios.svg</file>
<file>images/iOS/toggle_on.png</file>
<file>images/iOS/toggle_off.png</file>
<file>images/iOS/toggle_disabled.png</file>
<file>images/arrowLeft.svg</file>
<file>images/arrowRight.svg</file>
<file>images/share.svg</file>
<file>images/android/navigation/ausweisen.svg</file>
<file>images/android/navigation/anbieter.svg</file>
<file>images/android/navigation/balloon.svg</file>
<file>images/android/navigation/remoteleser.svg</file>
<file>images/android/navigation/verlauf.svg</file>
<file>images/android/navigation/pin.svg</file>
<file>images/android/navigation/versionsinformation.svg</file>
<file>images/android/navigation/faq.svg</file>
<file>images/android/navigation/support.svg</file>
<file>images/android/navigation/bewerten.svg</file>
<file>images/android/navigation/teilen.svg</file>
<file>images/android/checkbox_0.svg</file>
<file>images/android/checkbox_1.svg</file>
<file>images/android/tabDivider.svg</file>
<file>images/android/arrowRight.svg</file>
<file>images/android/arrowLeft.svg</file>
<file>images/android/arrowRightWhite.svg</file>
<file>images/android/arrowLeftWhite.svg</file>
<file>images/android/android_toggle_on.png</file>
<file>images/android/android_toggle_off.png</file>
<file>images/android/android_toggle_on_disabled.png</file>
<file>images/android/android_toggle_off_disabled.png</file>
<file>images/android/android_arrow_back.svg</file>
<file>images/android/android_arrow_back_white.svg</file>
<file>images/android/navigation/tutorial.svg</file>
<file>images/android/search_icon.svg</file>
<file>images/iOS/search_icon.svg</file>
<file>images/iOS/search_cancel.svg</file>
<file>images/iOS/more/icon_mehr_npa.svg</file>
<file>images/iOS/more/icon_mehr_favorit.svg</file>
<file>images/iOS/more/icon_mehr_fragen.svg</file>
<file>images/iOS/more/icon_mehr_info.svg</file>
<file>images/iOS/more/icon_mehr_license.svg</file>
<file>images/iOS/more/icon_mehr_remotereader.svg</file>
<file>images/iOS/more/icon_mehr_verlauf.svg</file>
<file>images/iOS/more/icon_mehr_upload.svg</file>
<file>images/provider/categoryIcons/general.svg</file>
<file>images/provider/categoryIcons/citizen.svg</file>
<file>images/provider/categoryIcons/finance.svg</file>
<file>images/provider/categoryIcons/insurance.svg</file>
<file>images/provider/categoryIcons/other.svg</file>
<file alias="images/provider/categoryIcons/general_bg.svg">images/provider/categoryIcons/+android/general_bg.svg</file>
<file>images/iOS/more/icon_mehr_log.svg</file>
<file>images/iOS/more/icon_mehr_tutorial.svg</file>
<file>images/iOS/more/icon_mehr_report.svg</file>
<file>images/tutorial/main_menu_what_caret.svg</file>
<file>images/tutorial/main_menu_where_caret.svg</file>
<file>images/tutorial/main_menu_how_caret.svg</file>
<file>images/tutorial/main_menu_important_caret.svg</file>
<file>images/tutorial/icon_box.svg</file>
<file>images/tutorial/icon_circle.svg</file>
<file>images/tutorial/icon_diamond.svg</file>
<file>images/tutorial/icon_star.svg</file>
<file>images/tutorial/arrow_blue.svg</file>
<file>images/tutorial/arrows.svg</file>
<file>images/tutorial/button_de.png</file>
<file>images/tutorial/button_en.png</file>
<file>images/tutorial/idcard.svg</file>
<file>images/tutorial/identify.svg</file>
<file>images/tutorial/questionmark.svg</file>
<file>images/tutorial/hint.svg</file>
<file>images/tutorial/thumb_up.svg</file>
<file>images/tutorial/hand.svg</file>
<file>images/tutorial/check.svg</file>
<file>images/tutorial/cross.svg</file>
<file>images/tutorial/click.svg</file>
<file>images/tutorial/save.svg</file>
<file>images/tutorial/bva.svg</file>
<file>images/tutorial/provider_home.svg</file>
<file>images/tutorial/rectangles.svg</file>
<file>images/tutorial/zoom_triangle.svg</file>
<file>images/tutorial/laptop.svg</file>
<file>images/tutorial/tablet.svg</file>
<file>images/tutorial/tablet-nfc.svg</file>
<file>images/tutorial/tablet-no-nfc.svg</file>
<file>images/tutorial/reader.svg</file>
<file>images/tutorial/desktop.svg</file>
<file>images/tutorial/phone.svg</file>
<file>images/tutorial/phone_list.svg</file>
<file>images/tutorial/phone-screen.svg</file>
<file>images/tutorial/nfc.svg</file>
<file>images/tutorial/no-nfc.svg</file>
<file>images/tutorial/wifi.svg</file>
<file>images/tutorial/bluetooth.svg</file>
<file>images/tutorial/letters.svg</file>
<file>images/tutorial/usb.svg</file>
<file>images/tutorial/circle-1.svg</file>
<file>images/tutorial/circle-2.svg</file>
<file>images/tutorial/circle-3.svg</file>
<file>images/tutorial/circle-4.svg</file>
<file>images/tutorial/circle-lock.svg</file>
<file>images/tutorial/circle-lock-2.svg</file>
<file>images/tutorial/up_icon.svg</file>
<file>images/tutorial/phone_screen_de.jpg</file>
<file>images/tutorial/phone_screen_en.jpg</file>
<file>images/tutorial/pin-5@2x.png</file>
<file>images/tutorial/pin-6@2x.png</file>
<file>images/tutorial/user-tine@3x.png</file>
<file>images/tutorial/providericons.png</file>
<file>images/tutorial/play_movie.png</file>
<file>images/tutorial/screenshot_cert_android_de.png</file>
<file>images/tutorial/screenshot_cert_android_en.png</file>
<file>images/tutorial/screenshot_cert_ios_de.png</file>
<file>images/tutorial/screenshot_cert_ios_en.png</file>
<file>images/tutorial/screenshot_providerlist_android_de.png</file>
<file>images/tutorial/screenshot_providerlist_android_en.png</file>
<file>images/tutorial/screenshot_providerlist_ios_de.png</file>
<file>images/tutorial/screenshot_providerlist_ios_en.png</file>
<file>images/tutorial/screenshot_remoteservice_ios_en.png</file>
<file>images/tutorial/screenshot_remoteservice_ios_de.png</file>
<file>images/tutorial/screenshot_menu_providerlist_android_de.png</file>
<file>images/tutorial/screenshot_menu_providerlist_android_en.png</file>
<file>images/tutorial/screenshot_pairing_de.png</file>
<file>images/tutorial/screenshot_pairing_en.png</file>
<file>images/tutorial/screenshot_sac_menu_android_de.png</file>
<file>images/tutorial/screenshot_sac_menu_android_en.png</file>
<file>images/tutorial/screenshot_choose_reader_android_de.png</file>
<file>images/tutorial/screenshot_choose_reader_android_en.png</file>
<file>images/tutorial/screenshot_choose_reader_ios_de.png</file>
<file>images/tutorial/screenshot_choose_reader_ios_en.png</file>
<file>images/tutorial/screenshot_pin_management_menu_android_en.png</file>
<file>images/tutorial/screenshot_pin_management_menu_android_de.png</file>
<file>images/tutorial/screenshot_pin_management_menu_ios_en.png</file>
<file>images/tutorial/screenshot_pin_management_menu_ios_de.png</file>
<file>images/tutorial/section_seperator_what.svg</file>
<file>images/tutorial/section_seperator_where.svg</file>
<file>images/tutorial/section_seperator_how.svg</file>
<file>images/tutorial/section_seperator_important.svg</file>
<file>images/tutorial/generated/where_overview_question.svg</file>
<file>images/tutorial/generated/where_providerlist_screenshot_android_de.svg</file>
<file>images/tutorial/generated/where_providerlist_screenshot_android_en.svg</file>
<file>images/tutorial/generated/where_identify_now_de.svg</file>
<file>images/tutorial/generated/where_identify_now_en.svg</file>
<file>images/tutorial/generated/where_userdata_example_de.svg</file>
<file>images/tutorial/generated/where_userdata_example_en.svg</file>
<file>images/tutorial/generated/where_lay_down_id.svg</file>
<file>images/tutorial/generated/where_pin6.svg</file>
<file>images/tutorial/generated/how_questions_everywhere.svg</file>
<file>images/tutorial/generated/how_device_lineup.svg</file>
<file>images/tutorial/generated/how_method_nfc.svg</file>
<file>images/tutorial/generated/how_method_sac_desktop.svg</file>
<file>images/tutorial/generated/how_method_sac_mobile.svg</file>
<file>images/tutorial/generated/how_method_bluetooth.svg</file>
<file>images/tutorial/generated/how_form_no_fun.svg</file>
<file>images/tutorial/generated/how_desktop.svg</file>
<file>images/tutorial/generated/important_pin5.svg</file>
<file>images/tutorial/generated/important_pin6.svg</file>
<file>images/tutorial/generated/important_lets_go.svg</file>
<file>images/tutorial/generated/important_space_questionmark.svg</file>
<file>images/tutorial/generated/reader_nfc_provider_on_smartphone.svg</file>
<file>images/tutorial/generated/reader_nfc_npa_on_smartphone.svg</file>
<file>images/tutorial/generated/reader_nfc_smartphone_nfc_position.svg</file>
<file>images/tutorial/generated/reader_nfc_finished.svg</file>
<file>images/tutorial/generated/reader_nfc_pin6.svg</file>
<file>images/tutorial/generated/reader_nfc_userdata_example_de.svg</file>
<file>images/tutorial/generated/reader_nfc_userdata_example_en.svg</file>
<file>images/tutorial/generated/reader_sac_provider_on_laptop.svg</file>
<file>images/tutorial/generated/reader_sac_npa_on_laptop.svg</file>
<file>images/tutorial/generated/reader_sac_aa2_ok.svg</file>
<file>images/tutorial/generated/reader_sac_menu_android_de.svg</file>
<file>images/tutorial/generated/reader_sac_menu_android_en.svg</file>
<file>images/tutorial/generated/reader_sac_menu_ios_de.svg</file>
<file>images/tutorial/generated/reader_sac_menu_ios_en.svg</file>
<file>images/tutorial/generated/reader_sac_no_nfc_devices.svg</file>
<file>images/tutorial/generated/reader_sac_no_nfc_provider.svg</file>
<file>images/tutorial/generated/reader_bluetooth_card_inserted.svg</file>
<file>images/tutorial/generated/reader_bluetooth_connection.svg</file>
<file alias="images/provider/categoryIcons/general_button.svg">images/provider/categoryIcons/+android/general_button.svg</file>
<file alias="images/provider/categoryIcons/citizen_bg.svg">images/provider/categoryIcons/+android/citizen_bg.svg</file>
<file alias="images/provider/categoryIcons/citizen_button.svg">images/provider/categoryIcons/+android/citizen_button.svg</file>
@ -55,8 +159,12 @@
<file alias="images/provider/categoryIcons/insurance_button.svg">images/provider/categoryIcons/+android/insurance_button.svg</file>
<file alias="images/provider/categoryIcons/other_bg.svg">images/provider/categoryIcons/+android/other_bg.svg</file>
<file alias="images/provider/categoryIcons/other_button.svg">images/provider/categoryIcons/+android/other_button.svg</file>
<file>images/phone_to_pc.svg</file>
<file>images/android/navigation/remotesettings.svg</file>
<file>images/trash_icon.svg</file>
<file>images/trash_icon_all.svg</file>
<file>images/iOS/tabBar/anbieter.svg</file>
<file>images/iOS/tabBar/ausweisen.svg</file>
<file>images/iOS/tabBar/more.svg</file>
<file>images/iOS/tabBar/pin.svg</file>
<file>images/iOS/tabBar/remoteleser.svg</file>
</qresource>
</RCC>

View File

@ -3,11 +3,13 @@
"_comment_1": "array of CVCs; hex encoded",
"_comment_2": [
"DECVCAeID00104_DECVCAeID00105",
"DECVCAeID00103_DECVCAeID00104",
"DECVCAeID00102_DECVCAeID00103",
"DECVCAeID00102"
],
"cvRootCertificates": [
"7F218201B67F4E82016E5F290100420E44454356434165494430303130347F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A786410459D1A08A2572022E17FED831982A9CB904518003CF83DABED88DBED28963768B88DBA22A153558BD21DDAA99318378B7CD7EBFE849557CD43F8526ABE72734538701015F200E44454356434165494430303130357F4C12060904007F0007030102025305FC0F13FFFF5F25060108000601025F24060201000601025F37402FBEEAE1B1ADE6CFB6CAB9D9B19F6A6EFACB7D9701997F43CF608BF72CF496F485F691E75190DEC25C672B92CF9BA917883659A6DC16793D22BBEC4019C616CC",
"7F218201B67F4E82016E5F290100420E44454356434165494430303130337F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7864104241D8627338B64F20077FFD558909A096C635DDB222852038EAAE642E869A40173D588F817D95DB2A6A0F077EA5EE63596A20F85BC3CB176D2F98D88D90219AA8701015F200E44454356434165494430303130347F4C12060904007F0007030102025305FC0F13FFFF5F25060105000901045F24060108000901045F3740313A81ED8734E7A8C45F16B55FB603E63027B7F44C2DE3A8E782552D35949DB221CA33BD41A01DA6A1288C7885714FC3A03FA45683B75D3884930EC6738AF8A0",
"7F218201B67F4E82016E5F290100420E44454356434165494430303130327F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641048925419FC7F194922CFC6B8DD25AE6A19C1B59216E6CF06270E5D75CFD64205F55CF867BBFEFEEFD6E680E1FD197F18AB684484901362568EFC9ADB5C6018D728701015F200E44454356434165494430303130337F4C12060904007F0007030102025305FC0F13FFFF5F25060102010200035F24060105010200035F37404D6F08A86A4F18409F6685387DD3C6A7FF5D68EA4F7714A861BBB3BB721D05D3014ADF1763C9292F715D8E94EE9B3E1B73AB1382414EBF39DFB3B0FB6C09DBEB",
"7F218201B67F4E82016E5F290100420E44454356434165494430303130327F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641043347ECF96FFB4BD9B8554EFBCCFC7D0B242F1071E29B4C9C622C79E339D840AF67BEB9B912692265D9C16C62573F4579FFD4DE2DE92BAB409DD5C5D48244A9F78701015F200E44454356434165494430303130327F4C12060904007F0007030102025305FE0F01FFFF5F25060100010001085F24060103010001085F37405067145C68CAE9520F5BB34817F1CA9C43593DB56406C6A3B006CBF3F314E7349ACF0CC6BFEBCBDEFD10B4DCF0F231DA56977D88F9F90182D199076A56506451"
@ -15,59 +17,50 @@
"_comment_3": "array of Test-CVCs; hex encoded",
"_comment_4": [
"DETESTeID00001",
"DETESTeID00001_DETESTeID00002",
"DETESTeID00002_DETESTeID00004",
"DETESTeID00005_DETESTeID00006",
"DETESTeID00004_DETESTeID00005",
"DETESTeID00002_DETESTeID00004",
"DETESTeID00001_DETESTeID00002",
"DETESTeID00001",
"DECVCAeIDCTL0402_DECVCAeIDCTL0403",
"DECVCAeIDCTL0401_DECVCAeIDCTL0402",
"DECVCAeIDCT00001_DECVCAeIDCTL0401",
"DECVCAeIDCT00001_DECVCAeIDCT00001"
],
"cvRootCertificatesTest": [
"7F218201B67F4E82016E5F290100420E44455445535465494430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7864104184BB519FC2A8F52DC0DC73112FACFE914F2A49B678DD5799A2B1DFE95E1A66359014E22FA8D66438413CEBA6CF0E215576B673376BF617AF4DFE9761D2290148701015F200E44455445535465494430303030317F4C12060904007F0007030102025305FE0F01FFFF5F25060100000801035F24060103000801035F37409F25EBFAF4B91E4C60A1683754C5DC076A3179753EF97D9F8CB01FE1DCD3B8C83E7A26602AB1F344BE5706006D79A9FF6A9716404DC83B9F30E1213B393128A2",
"7F218201B67F4E82016E5F290100420E44455445535465494430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7864104096EB58BFD86252238EC2652185C43C3A56C320681A21E37A8E69DDC387C0C5F5513856EFE2FDC656E604893212E29449B365E304605AC5413E75BE31E641F128701015F200E44455445535465494430303030327F4C12060904007F0007030102025305FE0F01FFFF5F25060100000902015F24060103000902015F3740141120A0FDFC011A52F3F72B387A3DC7ACA88B4868D5AE9741780B6FF8A0B49E5F55169A2D298EF5CF95935DCA0C3DF3E9D42DC45F74F2066317154961E6C746",
"7F218201B67F4E82016E5F290100420E44455445535465494430303030327F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A786410474FF63AB838C73C303AC003DFEE95CF8BF55F91E8FEBCB7395D942036E47CF1845EC786EC95BB453AAC288AD023B6067913CF9B63F908F49304E5CFC8B3050DD8701015F200E44455445535465494430303030347F4C12060904007F0007030102025305FC0F13FFFF5F25060102000501015F24060105000501015F37405C035A0611B6C58F0B5261FDD009DECAB7DC7A79482D5248CCA119059B7D82B2157CF0C4A499BCF441EFDD35E294A58C0AF19A34A0762159533285ACF170A505",
"7F218201B67F4E82016E5F290100420E44455445535465494430303030357F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A786410425AB80F9C7BCA0AB1759D8E469F911CC006D02131552AA5F248B2A38D7C72CFB3317EA6881FD24D8B31A2E75FBEDA87964B60787095F75C753CD8BC5264D3C9A8701015F200E44455445535465494430303030367F4C12060904007F0007030102025305FC0F13FFFF5F25060108000200055F24060201000200055F37402E55923ED687CB104D609DD183402E8292DB03C3EFFE5EF3FAC597D2A8DB27370269EAAD7341D72447C9184CD817AE0E2BD4DF6FCF89DC52F455D490F077E5E9",
"7F218201B67F4E82016E5F290100420E44455445535465494430303030347F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641049BFEBA8DC7FAAB6E3BDEB3FF794DBB800848FE4F6940A4CC7EECB5159C87DA5395505892026D420A22596CD014ED1FD872DADA597DB0F8D64441041198F62D448701015F200E44455445535465494430303030357F4C12060904007F0007030102025305FC0F13FFFF5F25060105000500045F24060108000500045F37402D2468416D66BCBE259B9B907A73395BC1EF94ED75F9C17615210246E9EFB06E6753E9055CE76623B7699B9EFB1A7D3A9DD83F6E6E09E55A33EA0A5F62A1C719",
"7F218201BA7F4E8201725F290100421044454356434165494443544C303430317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641043EE15015916563E31459045924DE804C1D93A77652AA25D0B753730DBA3233886A9A9B28A06AF84CC5A40F78E9167CA40B8098724A3A0332283D0A52C5453FE08701015F201044454356434165494443544C303430327F4C12060904007F0007030102025305FE1FFFFFFF5F25060106000300015F24060109000300015F374068261CEB4DC915301371C9B273377F33CEB25AFA07E70EDB3498ACF0327DC13B9AF99A9D694A6D048F0DB6FF1774E882CA8F41C8A0B96FDDF6F6DDABFD55CB43",
"7F218201BA7F4E8201725F2901004210444543564341654944435430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641042C037C6CF8C0B62E36E220B7D411404AF248A2C83C569A49FAB02FC232D2395B3A5FF80DDB01D0DFAFCEF55E54ACCBA4C56E528F0746BEF1108E7D9B0122EBA78701015F201044454356434165494443544C303430317F4C12060904007F0007030102025305FE1FFFFFFF5F25060106000300015F24060109000300015F37404FB2F9F17D38656EEC2846CBB1711E07D739E6A584D487B3AFBA5C723C73A10236995E6A19499DE941DFE3CC044E2AACB6B5869C0E46C9585AEF892E2236F62E",
"7F218201BA7F4E8201725F2901004210444543564341654944435430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7864104206160B85B82B2BE249DCD7B15FD1AD46CA03F39FE675C07535806E57CE24349392BBB9F73B364672F12243F18083DCC49ACA613767F0873AEB60715FC605A288701015F2010444543564341654944435430303030317F4C12060904007F0007030102025305FE1FFFFFFF5F25060106000300015F24060109000300015F37402B62927D46BF675DB387FC4A425FF3B604B20DD5ED6FFCDAFA9DA1DD920DC996245B358167C66A721DF39C6897864E4D648746339A97D22D08659885F92BDE21"
"7F218201B67F4E82016E5F290100420E44455445535465494430303030327F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A786410474FF63AB838C73C303AC003DFEE95CF8BF55F91E8FEBCB7395D942036E47CF1845EC786EC95BB453AAC288AD023B6067913CF9B63F908F49304E5CFC8B3050DD8701015F200E44455445535465494430303030347F4C12060904007F0007030102025305FC0F13FFFF5F25060102000501015F24060105000501015F37405C035A0611B6C58F0B5261FDD009DECAB7DC7A79482D5248CCA119059B7D82B2157CF0C4A499BCF441EFDD35E294A58C0AF19A34A0762159533285ACF170A505",
"7F218201B67F4E82016E5F290100420E44455445535465494430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7864104096EB58BFD86252238EC2652185C43C3A56C320681A21E37A8E69DDC387C0C5F5513856EFE2FDC656E604893212E29449B365E304605AC5413E75BE31E641F128701015F200E44455445535465494430303030327F4C12060904007F0007030102025305FE0F01FFFF5F25060100000902015F24060103000902015F3740141120A0FDFC011A52F3F72B387A3DC7ACA88B4868D5AE9741780B6FF8A0B49E5F55169A2D298EF5CF95935DCA0C3DF3E9D42DC45F74F2066317154961E6C746",
"7F218201B67F4E82016E5F290100420E44455445535465494430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7864104184BB519FC2A8F52DC0DC73112FACFE914F2A49B678DD5799A2B1DFE95E1A66359014E22FA8D66438413CEBA6CF0E215576B673376BF617AF4DFE9761D2290148701015F200E44455445535465494430303030317F4C12060904007F0007030102025305FE0F01FFFF5F25060100000801035F24060103000801035F37409F25EBFAF4B91E4C60A1683754C5DC076A3179753EF97D9F8CB01FE1DCD3B8C83E7A26602AB1F344BE5706006D79A9FF6A9716404DC83B9F30E1213B393128A2",
"7F218201BA7F4E8201725F290100421044454356434165494443544C303430327F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641040DC10C2E105D1CFC84CCDAB7AC0A37F161234D9F5549D83FD29E1D3B3A1455DC5F5464FE69E7B1F18F57AD6A0BBB3B2F673A356B3AC8AB525A96A78E71EC20B38701015F201044454356434165494443544C303430337F4C12060904007F0007030102025305FE1FFFFFFF5F25060108000900025F24060201000900015F37407D738AA07BBC24E4969ABC424CC75B1BBE9F4A8AEB497544516F32D2284A6F785BFC630BE9C6D96C6DE8FFF377FE68A3950DE140953DEFAFADA92A201774C0BB",
"7F218201BA7F4E8201725F290100421044454356434165494443544C303430317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641044EDF23187A2E4535AB7AA3C29AD43E3ACFB7C38230CCC7B705829E60DE14946D7A0257527E1488D9EBB967D5734FCBCFBA3A1085798AFA7883FDAF88605A46008701015F201044454356434165494443544C303430327F4C12060904007F0007030102025305FE1FFFFFFF5F25060108000900025F24060201000900015F3740A2CC27745E141CE871645178F5D8B55B9ECAA690A7975EF7AB518145D9CE9FA31C326F923EDDC6AD58CF0E644CDF86FC2EAF4D059B0598C2CEB6C713D825CD69",
"7F218201BA7F4E8201725F2901004210444543564341654944435430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641048A50D5902E9E63D103974E9FBE1D7E61BA186585E2A12A4643FFA57DFF0613FE213A7C3793C8C5C6C095224DDCA409AFE92998E3F372D826AD008FC6A0981DE18701015F201044454356434165494443544C303430317F4C12060904007F0007030102025305FE1FFFFFFF5F25060108000900025F24060201000900015F3740767C88881693C2AA936EC55FC0104EFF92FAD1AB9B1CF26ECCFA49AE98E9F9EA5BDD60AFFA6FFC6526AFE47BB6897E67241F2170A51F635EBC8AA8414748562C",
"7F218201BA7F4E8201725F2901004210444543564341654944435430303030317F4982011D060A04007F000702020202038120A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537782207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9832026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B68441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F0469978520A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A78641041A47FE0DA706867F877AB071E8867778EDB6E7C12B13FA13ED93D54C86A44E3BA9F93D1B978B54841202B14A924BBA1A56C76B9E596614C66A9D2CBCDC8B29B18701015F2010444543564341654944435430303030317F4C12060904007F0007030102025305FE1FFFFFFF5F25060108000900025F24060201000900015F37407CDC52ADB660CC0EB56841EF9D5773DDE84A5581853CCF3DCF24D555C2FDE8F31D2128B5D6A0A528BF07CFDA005DBCACFFCDB14755BB132E47CFA0E34233A290"
],
"_comment_5": "array of certificates for checking the authenticity of updates; DER format, hex encoded",
"updateCertificates": [
"308208673082074fa00302010202086b5eeeb3f0155141300d06092a864886f70d01010b05003081d8310b300906035504061302444531253023060355040a131c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311e301c060355040b131554727573742043656e7465722053657276696365733120301e0603550403131754656c6553656320536572766572506173732043412032311c301a060355040813134e6f7264726865696e205765737466616c656e310e300c0603550411130535373235303110300e060355040713074e65747068656e3120301e06035504091317556e7465726520496e647573747269657374722e203230301e170d3135303532303039353335315a170d3138303532353233353935395a3081a6310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e3124302206092a864886f70d01090116156265747269656240676f7665726e696b75732e6465311f301d060355040313166170706c2e676f7665726e696b75732d6173702e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100c1d969514392105ce65b089b7357f75356f076b21168233d1eb57ae81f826c74258ec4814c48a3e99633fcac1fb444412cba421c1569d21b6317b6614b096203ab5b605128671764d30186dec09716d2173bfab911a9ad3d2d0b850ff2595dd9c72113bd64879c39c39b3debbfdd7f8d68e8d1bdaf2cca0508583bd59b965ec5f4950e4fbbe48b7be351237d478253bc34ac5aed9448f5ae31878067bdad75179cb776ef19f8e49e62b830de8279142233030189c20008345553847b7edc6471bf7c15c98b087159b44faa5a35fe16adc285e4d8266fab49b7b4e7fbcbd91767e05dbb45a5564cb11abcbeb0ff66869ca72dd7919eae796340fb5b26fb8ecc65b8380d3eb30e46150725e2156ad156773a79b482133b846b247868a6d3fcc18f96cfc6044fb7678fd79c04fb580b7bfb86e3252554b9a97dfd6fb9ae0e0d8d663a56b471d37752fc88a172151494553d78a39ade4669076e5ddfa13fd684b7eb800efedf9af8f90d4bab6d80378b950d43ef6de6f9ca5dccb81ecbbf820126d90923c5b87462af2acf0fc460599b2d7022e488f20069e2b3e80e057ebbd1454891929c2e0252688a1c0e801eb8bec795251087a755a6edcd22759a5c1869550d63b0596cb5ac20a7e5cb11f5412598990092cbe058b4ec67b98dd9ed2b2a5f8b7994e92b89a1ef51517beb2e2594cb8007d514f988968c52246a18945fba0adf0203010001a38203633082035f301f0603551d2304183016801415bbded6256fbdf2319f6213dc5ca6f465b46df2300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e041604148c76a1377b9cad8059a5d4126a53bc633671ca1c30590603551d2004523050304406092b06010401bd470d023037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202308201220603551d1f04820119308201153045a043a041863f687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f54656c655365635f536572766572506173735f43415f322e63726c3081cba081c8a081c58681c26c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f636e3d54656c65536563253230536572766572506173732532304341253230322c6f753d547275737425323043656e74657225323053657276696365732c6f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c633d64653f63657274696669636174655265766f636174696f6e6c6973743f626173653f63657274696669636174655265766f636174696f6e6c6973743d2a3082013a06082b060105050701010482012c30820128303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072304c06082b060105050730028640687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f43415f322e6365723081a206082b060105050730028681956c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f636e3d54656c65536563253230536572766572506173732532304341253230322c6f753d547275737425323043656e74657225323053657276696365732c6f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c633d64653f63414365727469666963617465300c0603551d130101ff0402300030210603551d11041a301882166170706c2e676f7665726e696b75732d6173702e6465300d06092a864886f70d01010b050003820101005f35f8a5ed5fe3879dbb137d1505768bff7635e3c7824735bf8c0b1bdd02335de7928f484192925c29738b034b152805935aa54d92abc3be5c7cfec5017ca506a33c2b15fdb2762037b0b4615e39d7697f64dba763ad0b6e05b7e8b6dd29c7ace3ec86ea74a82ce9a5575166375849afbd48cebdbd18bfdab0f905b094b4e686649bee5fba153ff5786cbb5926807891ae07871127a887c2e2747dcfd1bd18d34b0642eb2fa8309e8b434b2cf91ab0e918c3f3c59d70aa096a46abfc50b3e66baacd7748b7ef98110760cce271c1528ed4e84ae9144983ad26aa27f00a527053c50739d2592ad13179a33eb1d299081be8b9824bc63ac70e1ad518380df08a56%",
"308205633082044ba00302010202135100000749e339b5a8a2ecb8e8000000000749300d06092a864886f70d01010b0500304431153013060a0992268993f22c64011916056c6f63616c31153013060a0992268993f22c6401191605626f736b67311430120603550403130b676f766b67726f6f746361301e170d3136313232393039343930325a170d3138313232393039353930325a307c310b3009060355040613024445310b3009060355040813024445310f300d060355040713064272656d656e31163014060355040a130d476f7665726e696b7573204b47311c301a060355040b131353797374656d7320456e67696e656572696e6731193017060355040314102a2e74662e626f732d746573742e646530820122300d06092a864886f70d01010105000382010f003082010a0282010100c2ce4b611d136b4a99f43bd6487c323f812f00c433ed7ec3d343b93c1b064ba12ff3f950634bbba55283ea48bf91d3a6736ee17c3467918b22d9ba1d55f9b8593461b42ed54454d15577abe0ec286203c4c33a82aae8216c802f8f81f1d06473f85acbf6ba69357828030a97086aa1bc6836cae3916d2d83f24c153a05402e13828a30822e7a861395be7d7c511b84baf4bc4a5daeb3db755b37e8ffb5dd18f8ac22c018801e212ab59b96e64b85c3d418c577c33ef73cc0ba5fef68041ba39fa0b795e7b5eabfa408c36ca582572ca2adde4cd104ccad376eaa06b41e737121f349eedb063438b406bd32dc032659e9cbad809afb5679d8a7d776a916ead35b0203010001a382021430820210300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b0601050507030130240603551d11041d301b82102a2e74662e626f732d746573742e646582012a87040ad2f861301d0603551d0e04160414262451b4431de1ccdb523d93038d7e01c4a3d153301f0603551d230418301680144b7e48a7b2f2db121642634bcd7e1c0deee96285303b0603551d1f043430323030a02ea02c862a687474703a2f2f676f7663726c2e676f7665726e696b75732e64652f63726c2f7265766f6b652e63726c3081eb06082b060105050701010481de3081db3081aa06082b0601050507300286819d6c6461703a2f2f2f434e3d676f766b67726f6f7463612c434e3d4149412c434e3d5075626c69632532304b657925323053657276696365732c434e3d53657276696365732c434e3d436f6e66696775726174696f6e2c44433d626f736b672c44433d6c6f63616c3f634143657274696669636174653f626173653f6f626a656374436c6173733d63657274696669636174696f6e417574686f72697479302c06082b060105050730018620687474703a2f2f676f7663726c2e676f7665726e696b75732e64652f6f637370303b06092b0601040182371507042e302c06242b060104018237150887a4920efcad6b83a98117819cb41586e9ea5a1791ff2e87b7af7c020164020109301b06092b060104018237150a040e300c300a06082b06010505070301300d06092a864886f70d01010b05000382010100a41dd5971c9b983bc3369bc9f3046481ff05aab5b47fac27a8cb7f917585b15c5acfbc8d083375a459b0642974968f4e00ad501d715dfb8a9e098437459ddcbba5a7d49f0278bd841b89fb93e86683bd89334f6b5ab556834e1fb4ec86647e812438e17512ee87b01bd0679b3abf4a67fe7272eae0c4cd9ed174d70b2728e72361cded46a42d445dfe244efb55feb1eee13f614d30237ee399b4108bc596b8aab377ad98d22c87ce4ce976ec1ceac512c33d6941b715d9fa60882b4644f9a066dcd51ff6c429af37cfa38f06444e6682d09643b2866a23a42da0ae21a787e8fe40aa2b21aa55a10aa42097c9a219528ac4968eb12cec5f223791a40d21fcce05",
"3082083a30820722a003020102020900d5b6a4dc1fd8854a300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3137313230313130343733325a170d3230313230363233353935395a308180310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e311f301d060355040313166170706c2e676f7665726e696b75732d6173702e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100c1d969514392105ce65b089b7357f75356f076b21168233d1eb57ae81f826c74258ec4814c48a3e99633fcac1fb444412cba421c1569d21b6317b6614b096203ab5b605128671764d30186dec09716d2173bfab911a9ad3d2d0b850ff2595dd9c72113bd64879c39c39b3debbfdd7f8d68e8d1bdaf2cca0508583bd59b965ec5f4950e4fbbe48b7be351237d478253bc34ac5aed9448f5ae31878067bdad75179cb776ef19f8e49e62b830de8279142233030189c20008345553847b7edc6471bf7c15c98b087159b44faa5a35fe16adc285e4d8266fab49b7b4e7fbcbd91767e05dbb45a5564cb11abcbeb0ff66869ca72dd7919eae796340fb5b26fb8ecc65b8380d3eb30e46150725e2156ad156773a79b482133b846b247868a6d3fcc18f96cfc6044fb7678fd79c04fb580b7bfb86e3252554b9a97dfd6fb9ae0e0d8d663a56b471d37752fc88a172151494553d78a39ade4669076e5ddfa13fd684b7eb800efedf9af8f90d4bab6d80378b950d43ef6de6f9ca5dccb81ecbbf820126d90923c5b87462af2acf0fc460599b2d7022e488f20069e2b3e80e057ebbd1454891929c2e0252688a1c0e801eb8bec795251087a755a6edcd22759a5c1869550d63b0596cb5ac20a7e5cb11f5412598990092cbe058b4ec67b98dd9ed2b2a5f8b7994e92b89a1ef51517beb2e2594cb8007d514f988968c52246a18945fba0adf0203010001a382035430820350301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e041604148c76a1377b9cad8059a5d4126a53bc633671ca1c305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202308201030603551d1f0481fb3081f83040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c3081b3a081b0a081ad8681aa6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f43657274696669636174655265766f636174696f6e4c6973743082014906082b060105050701010482013b30820137303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e6365723081ab06082b0601050507300286819e6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f63414365727469666963617465300c0603551d130101ff0402300030210603551d11041a301882166170706c2e676f7665726e696b75732d6173702e6465300d06092a864886f70d01010b050003820101006376f829a32345d2d590176bf2294d9ab6fe44e6c7db3b467bd597eebda4121d6e8795ec33de253ff9f271857c4a1ddf4b80b080464a51741a53de5137be13fc482e41b3649afbb571bfec2a894022d933ca60c691a99f31fe40209e7ca2e7fcd15d33baf8c1d20e107750cbd8628bc883af062a622f29c36574decaf97ef00471bbbe81380042ab82e46788491e4f77e58168f154d5210748263bfb8b2c3c82937436f758e1b2360c22458803a304eb90a4617bdcaa591176f4002e63dce3c9a3c7dcec83472dec70346544105118227fce63bae6a6686950846f65f30de621c1e5d6b7b20f3ce7d8ebbd95667c89123adb9efcbdd5ea1ba6e71b152bea43d3"
"3082083a30820722a003020102020900d5b6a4dc1fd8854a300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3137313230313130343733325a170d3230313230363233353935395a308180310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e311f301d060355040313166170706c2e676f7665726e696b75732d6173702e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100c1d969514392105ce65b089b7357f75356f076b21168233d1eb57ae81f826c74258ec4814c48a3e99633fcac1fb444412cba421c1569d21b6317b6614b096203ab5b605128671764d30186dec09716d2173bfab911a9ad3d2d0b850ff2595dd9c72113bd64879c39c39b3debbfdd7f8d68e8d1bdaf2cca0508583bd59b965ec5f4950e4fbbe48b7be351237d478253bc34ac5aed9448f5ae31878067bdad75179cb776ef19f8e49e62b830de8279142233030189c20008345553847b7edc6471bf7c15c98b087159b44faa5a35fe16adc285e4d8266fab49b7b4e7fbcbd91767e05dbb45a5564cb11abcbeb0ff66869ca72dd7919eae796340fb5b26fb8ecc65b8380d3eb30e46150725e2156ad156773a79b482133b846b247868a6d3fcc18f96cfc6044fb7678fd79c04fb580b7bfb86e3252554b9a97dfd6fb9ae0e0d8d663a56b471d37752fc88a172151494553d78a39ade4669076e5ddfa13fd684b7eb800efedf9af8f90d4bab6d80378b950d43ef6de6f9ca5dccb81ecbbf820126d90923c5b87462af2acf0fc460599b2d7022e488f20069e2b3e80e057ebbd1454891929c2e0252688a1c0e801eb8bec795251087a755a6edcd22759a5c1869550d63b0596cb5ac20a7e5cb11f5412598990092cbe058b4ec67b98dd9ed2b2a5f8b7994e92b89a1ef51517beb2e2594cb8007d514f988968c52246a18945fba0adf0203010001a382035430820350301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e041604148c76a1377b9cad8059a5d4126a53bc633671ca1c305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202308201030603551d1f0481fb3081f83040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c3081b3a081b0a081ad8681aa6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f43657274696669636174655265766f636174696f6e4c6973743082014906082b060105050701010482013b30820137303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e6365723081ab06082b0601050507300286819e6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f63414365727469666963617465300c0603551d130101ff0402300030210603551d11041a301882166170706c2e676f7665726e696b75732d6173702e6465300d06092a864886f70d01010b050003820101006376f829a32345d2d590176bf2294d9ab6fe44e6c7db3b467bd597eebda4121d6e8795ec33de253ff9f271857c4a1ddf4b80b080464a51741a53de5137be13fc482e41b3649afbb571bfec2a894022d933ca60c691a99f31fe40209e7ca2e7fcd15d33baf8c1d20e107750cbd8628bc883af062a622f29c36574decaf97ef00471bbbe81380042ab82e46788491e4f77e58168f154d5210748263bfb8b2c3c82937436f758e1b2360c22458803a304eb90a4617bdcaa591176f4002e63dce3c9a3c7dcec83472dec70346544105118227fce63bae6a6686950846f65f30de621c1e5d6b7b20f3ce7d8ebbd95667c89123adb9efcbdd5ea1ba6e71b152bea43d3",
"3082093a30820822a0030201020210042e5dd11e0c69cdec3882747019081c300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3139303330373131343530325a170d3231303331323233353935395a3074310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e3113301106035504030c0a2a2e676f766b672e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100b03a180c094b52a862ef5fce194147f705d3340d79282a103a14d14fabe3d849a62df93b5f09eed3ad60e6ae5570a3823370aeeb888df9e0fc9a513be26308d783cc7cefd4ef43337e2c854b03ef399c647a19d31c39fe2b1d08c9cc27462ba5e43bc97e494ac62059496579967fa3fe8b1111e016d6dd37eda00e5617bb571cbb042e6750d17dd3acf1055b8dd6a1130214992a673bfc671e2586355378dfbb14a2910d37faa221178cb2dba0e87544ed6acbb2344ac439dbd16c05e1c0f76fa757305c0c38f3ccab420fd49603717986c8d748ce4ea2863260da6a832df53bb6247ada2431239b0a9815b89d6bb0f58a4da508695637c0b10368260cbf7dd8d469fb81d21b560a25125e9cfc8ae09a8b9e7a1cc688a8e49c045f1dc397a7c28e637b11c5205d8375ccfb627b071a813665de2fe172de97671dfecce44d9545a6f083cff4c7e2df4780b9073b19ca93b97561ca0c9bc5687ec0a1de993b199eca2576e820f26ce043fbab092f6e0bbc510b14d4b2489733e28cd38f40928cce16f4f3b6bba6277cff19312ad5771507ae729b6c083924c53d1c1fc33e370af1a0060307b3ef83880886334133c2e645bbf7f14a26acbce1609daceac1ed8d5d2bff8d8ed095a7af79f608134256f1e4a34650225595dd9fa5746448417d7a2f8f0c5ef001b5e4780e6d8caf818b314fb708447f70f3844d39a7ff437ebbf6a70203010001a382045a30820456301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e04160414db05538bd26c0bea1bcb5cde439b81e6ab8aa40b305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202304b0603551d1f044430423040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c30819906082b0601050507010104818c308189303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e636572300c0603551d130101ff04023000301f0603551d1104183016820a2a2e676f766b672e64658208676f766b672e64653082026f060a2b06010401d6790204020482025f0482025b02590076006f5376ac31f03119d89900a45115ff77151c11d902c10029068db2089a37d9130000016957f896900000040300473045022046b42ef57f79c932690c6558eb52f354b8e4f5c49c7dc50616a351dbbe823785022100957c17a3f70a7ee20a920a29bb123e186b425a4c0c4dbd5372ab5163abe88284007600ee4bbdb775ce60bae142691fabe19e66a30f7e5fb072d88300c47b897aa8fdcb0000016957f89686000004030047304502210085921f55932ee2b42b7b6cd1b9627f9d376485024210f8f4358d60ebc25b6d6d022069f72703fc8d7added3f8cc041aee457d011e22425ecdfbebcfd1b312c0ad6220077005581d4c2169036014aea0b9b573c53f0c0e43878702508172fa3aa1d0713d30c0000016957f897e400000403004830460221009c4b1fdcfde4bacba79665a77da038ab42399578dbc80c9ce21ab5054217edf2022100d23970d124e0f1ee384f6cc2e53d76df6069190dc91b9be5be24219898081ad9007600a4b90990b418581487bb13a2cc67700a3c359804f91bdfb8e377cd0ec80ddc100000016957f8968c000004030047304502210099ca67064864c67ab92b4f13c11fd8be58453585f80e4e3d9a1d18a191aba1670220603bc43ad9700dd891e1bb135b2cd0fad041a6f63bed0d9c778a3e96d6082f33007600bbd9dfbc1f8a71b593942397aa927b473857950aab52e81a909664368e1ed1850000016957f896870000040300473045022100e6810cf7ec2ee244d5ae516246973f46c7710bf075c923b21451abc6622b9dee02202ccd410f907ba8176bcb12198f1b0821cf95a550e2486a0292cadca7a670dac2300d06092a864886f70d01010b05000382010100103ab77dff430d59dcd9d5c94b9c2ea44d829d0a70777c42a137ea627eca87881ce9131f00ea7282f7fe7cd7ac8f154f84622023183aac3f02ce4a5925cfb771961e114b78cec3950c0a4aa7726c01ba69c60cf3a4c68ea63e92f8dd0bf2f1e033bb91c536df9945ba281abae1bde75f920f94df2fa2c2ff708a57291114889e374eb9c8f7da0bb8a0d19bda964b3ac32e174cbb9d956c9693f0a6326a80d7019cbc8e54949981d5bf231f85c6ff5be5bc0fcaeb637bf84a8be424ebe2cefdef4c89d2a4682efda5c8010e432977d26e6f30e7e9ed13f612fea99dbd9799e6460ca780a109ff3dc7a86887479832baac8589aebeadf50759077aadfd2d467d06"
],
"tlsSettings": {
"protocolVersion": "TlsV1_0OrLater",
"protocolVersion": "TlsV1_2",
"_comment_1": "ciphers are ordered by preference",
"ciphers": [
"ECDHE-ECDSA-AES256-GCM-SHA384",
"ECDHE-RSA-AES256-GCM-SHA384",
"DHE-DSS-AES256-GCM-SHA384",
"DHE-RSA-AES256-GCM-SHA384",
"ECDHE-ECDSA-AES256-SHA384",
"ECDHE-RSA-AES256-SHA384",
"DHE-DSS-AES256-SHA256",
"DHE-RSA-AES256-SHA256",
"ECDHE-ECDSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES128-GCM-SHA256",
"DHE-DSS-AES128-GCM-SHA256",
"DHE-RSA-AES128-GCM-SHA256",
"ECDHE-ECDSA-AES128-SHA256",
"ECDHE-RSA-AES128-SHA256",
"DHE-DSS-AES128-SHA256",
"DHE-RSA-AES128-SHA256",
"ECDHE-ECDSA-AES256-SHA",
"ECDHE-RSA-AES256-SHA",
"DHE-DSS-AES256-SHA",
"DHE-RSA-AES256-SHA",
"ECDHE-ECDSA-AES128-SHA",
"ECDHE-RSA-AES128-SHA",
"DHE-DSS-AES128-SHA",
"DHE-RSA-AES128-SHA"
"DHE-RSA-AES128-SHA256"
],
"_comment_2": "prime256v1 := secp256r1",
"ellipticCurves": [
@ -79,23 +72,23 @@
"secp224r1"
],
"signatureAlgorithms": [
"Rsa+Sha512",
"Dsa+Sha512",
"Ec+Sha512",
"Rsa+Sha384",
"Dsa+Sha384",
"Ec+Sha384",
"Rsa+Sha256",
"Dsa+Sha256",
"Ec+Sha256",
"Rsa+Sha224",
"Dsa+Sha224",
"Ec+Sha224"
"RSA+SHA512",
"DSA+SHA512",
"ECDSA+SHA512",
"RSA+SHA384",
"DSA+SHA384",
"ECDSA+SHA384",
"RSA+SHA256",
"DSA+SHA256",
"ECDSA+SHA256",
"RSA+SHA224",
"DSA+SHA224",
"ECDSA+SHA224"
]
},
"tlsSettingsPsk": {
"protocolVersion": "TlsV1_1OrLater",
"protocolVersion": "TlsV1_2",
"_comment_1": "ciphers are ordered by preference",
"ciphers": [
"RSA-PSK-AES256-GCM-SHA384",
@ -106,15 +99,15 @@
],
"_comment_2": "ellipticCurves not needed",
"signatureAlgorithms": [
"Rsa+Sha512",
"Rsa+Sha384",
"Rsa+Sha256",
"Rsa+Sha224"
"RSA+SHA512",
"RSA+SHA384",
"RSA+SHA256",
"RSA+SHA224"
]
},
"tlsSettingsRemoteReader": {
"protocolVersion": "TlsV1_2OrLater",
"protocolVersion": "TlsV1_2",
"_comment_1": "ciphers are ordered by preference",
"ciphers": [
"ECDHE-RSA-AES256-GCM-SHA384",
@ -134,14 +127,14 @@
"secp224r1"
],
"signatureAlgorithms": [
"Rsa+Sha512",
"Rsa+Sha384",
"Rsa+Sha256"
"RSA+SHA512",
"RSA+SHA384",
"RSA+SHA256"
]
},
"tlsSettingsRemoteReaderPairing": {
"protocolVersion": "TlsV1_2OrLater",
"protocolVersion": "TlsV1_2",
"_comment_1": "ciphers are ordered by preference",
"ciphers": [
"RSA-PSK-AES256-GCM-SHA384",
@ -151,35 +144,41 @@
"RSA-PSK-AES256-CBC-SHA"
],
"signatureAlgorithms": [
"Rsa+Sha512",
"Rsa+Sha384",
"Rsa+Sha256"
"RSA+SHA512",
"RSA+SHA384",
"RSA+SHA256"
]
},
"minStaticKeySizes": {
"Rsa": 2000,
"Dsa": 2000,
"Dh": 2000,
"Ec": 224
},
"minEphemeralKeySizes": {
"Rsa": 2000,
"Dsa": 2000,
"Dh": 2000,
"Ec": 224
},
"selfAuthentication": {
"_comment_1": "TCTokenURL for self authentication (AusweisAuskunft)",
"url": "https://www.autentapp.de/AusweisAuskunft/WebServiceRequesterServlet?mode=xml",
"testUrl": "https://test.governikus-eid.de/AusweisAuskunft/WebServiceRequesterServlet?mode=xml"
"_comment_1": "TCTokenURL for self-authentication (AusweisAuskunft)",
"url": "https://www.autentapp.de/AusweisAuskunft/WebServiceRequesterServlet?mode=json",
"testUrl": "https://test.governikus-eid.de/AusweisAuskunft/WebServiceRequesterServlet?mode=json"
},
"updateServer": {
"baseUrl": "@REMOTE_CONFIG_URL@/updatable-files"
},
"whitelistServer": {
"baseUrl": "https://appl.governikus-asp.de/whitelistserver"
},
"updates": {
"release": "@REMOTE_CONFIG_URL@@REMOTE_CONFIG_PATH_APPCAST@/Appcast.json",
"beta": "@REMOTE_CONFIG_URL@@REMOTE_CONFIG_PATH_APPCAST_BETA@/Appcast.json"

View File

@ -81,7 +81,7 @@
<div class="header_section" >
<div>
<a title="AusweisApp2" href="https://www.ausweisapp.bund.de/">
<img src="/images/AppLogo_AutentApp2_2014.png" alt="AusweisApp2 Logo" width="256" height="48" />
<img src="/images/Logo_AusweisApp2.png" alt="AusweisApp2 Logo" width="256" height="48" />
</a>
</div>
</div>

View File

@ -81,7 +81,7 @@
<div class="header_section" >
<div>
<a title="AusweisApp2" href="https://www.ausweisapp.bund.de/">
<img src="/images/AppLogo_AutentApp2_2014.png" alt="AusweisApp2 Logo" width="256" height="48" />
<img src="/images/Logo_AusweisApp2.png" alt="AusweisApp2 Logo" width="256" height="48" />
</a>
</div>
</div>

View File

@ -1,224 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="188px" height="40.5px" viewBox="0 0 188 40.5" enable-background="new 0 0 188 40.5" xml:space="preserve">
<g>
<defs>
<rect id="SVGID_1_" x="-0.026" width="232.784" height="40.5"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_2_)">
<defs>
<rect id="SVGID_3_" x="-0.026" width="232.784" height="40.5"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_4_)" fill="#FFFFFF" d="M4.798,4.205c0,0-4.212,0-4.212,4.213v25.037c0,0,0,4.213,4.212,4.213h25.038
c0,0,4.212,0,4.212-4.213V8.418c0,0,0-4.213-4.212-4.213H4.798z"/>
</g>
<g clip-path="url(#SVGID_2_)">
<defs>
<path id="SVGID_5_" d="M4.89,21.283c0,6.68,5.088,12.109,11.589,12.779v-4.551c-3.985-0.639-7.038-4.063-7.038-8.229
c0-4.165,3.053-7.591,7.038-8.228V8.504C9.978,9.176,4.89,14.604,4.89,21.283"/>
</defs>
<clipPath id="SVGID_6_">
<use xlink:href="#SVGID_5_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_6_)">
<defs>
<rect id="SVGID_7_" x="4.844" y="8.47" width="11.719" height="25.636"/>
</defs>
<clipPath id="SVGID_8_">
<use xlink:href="#SVGID_7_" overflow="visible"/>
</clipPath>
<g transform="matrix(1 0 0 1 -1.810140e-007 1.930745e-006)" clip-path="url(#SVGID_8_)">
<image overflow="visible" width="176" height="385" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEEOQQ5AAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFkb2JlAGTAAAAAAQMA
EAMCAwYAAAU+AAAGxAAACZX/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoX
Hh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoa
JjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIAYYAwwMBIgACEQEDEQH/
xAChAAEBAQEBAQAAAAAAAAAAAAAAAQUEBgcBAQADAQEAAAAAAAAAAAAAAAACAwQFARAAAAMIAwEB
AQAAAAAAAAAAADIFEDBAAhIDMzQEFQYBITERAAEBBwQCAQQDAQAAAAAAAAIBABBAccGCA6LSMzQR
BLExgRJyIUEUJBIAAQMEAgMAAAcBAAAAAAAAAQAQMHGBkQIxQrEyQxFBUWHRcoIz/9oADAMBAAIR
AxEAAAD6Bm6WTXHCcjm5OtyDrcg63IOtyDrcg63IOtyDrcg63IOvb8z6G6e6OhqZWrlVx8url44o
iiKIoiiKIoiiKJ6DA377N0dHUytXKrj5hXMyRRFEURRFEURRFEUT0GBv3T3B0dTL1MuuPmRzMgAA
AAAAAADewd+6zbHR0svUy64+aVzcsURRFEURRFEURRFE3sLduntjoaWZp5lcfNK52WKIoiiKIoii
KIoiib2Fu2z2h0NLM08yuPnBzswAAAAAAAADcw926eyN+hmaebXHziudmiiKIoiiKIoiiKIom5ib
d09kb9DN0s2EfOq52aKIoiiKIoiiKIoiibeLt2z2Bv0M3SzYR88rnZ4oiiKIoiiKIoiiKJt4u1bP
YG+9naOdCPnlc/PFEURRFEURRFEURRNrG2rZ643Xs7RzoR8+rn0RRFEURRFEURRFEUTaxtm2WuN1
7O0c6EcBXPoiiKIoiiKIoiiKIomzj7NstYbr2foZ8I4CsFEURRFEURRFEURRFE2cfYsnrDdcz9DP
h5gqwZ4oiiKIoiiKIoiiKJsZGvbPWG25n6GfDzCVgoiiKIoiiKIoiiKIomxka9stUbbmfocEPMIY
aAAAAAAAAAGvka9ktUbbnB38EPMMYaAAAAAAAAAGtk61ktUbbnB38EPMMYaAAAAAAAAAGvka9stQ
bLnB38EPMMYaAAAAAAAAAGvka9stQbLnB38EPMMYaAAAAAAAAAGvka9stQbLnB38EPMMYaAAAAAA
AAAGvka9stQbLnB38EPMMYaAAAAAAAAAGvka9stQbLnB38EPMMYaAAAAAAAAAGvka9stQbLnMR84
BRAAAAAAAAAB2EvewXz/AP/aAAgBAgABBQC99+/Ldc4rnFc4rnFc4rnFc4rnFc4rnHHnm+3Rexuu
NlF7G642UXsbrj5RexuuPlF7G64+UXcbrj5RdxuuPlF3G64+UXcbqxkF3G6sZBdxurGQXcbqxkF0
jqxkF0jqxkF0jqxkF0jqxkFwjqzkFwjqzkFwjqzkFwjqzkFwjqzkFwjqzkFwjqzkExfwfg/B+D8H
4Pwfg/B+C2Yf/9oACAEDAAEFAJy1TCqYVTCqYVTCqYVTCqYVTCqYWvv37OLhHVo4nK6tHE5XVo4n
K6tHE5XVs4nK6tnE5XVswnK6tmE5XVswmK6tmExXVswmK6kMJiupDCYrqQwmK6kMJiupDCb+OpDC
b+OpDCYrqQwmK6kMJiupDCYrqQwmK6kMPv8AHUv9H//aAAgBAQABBQALnIvcfh9spDtlIdspDtlI
dspDtlIdspDtlIdspDtlIdspDtlIdspDtlIdspDtlIdspDtlIdspDtlIdspDz3K5HJkZ6LQhfL42
ei0IXzGNnotCF8xjZ6HRhfMkZ6HRhfMkZ6DRhfNEZ6DRhfNEZ6DRhfNkYv6ML5sjF/ShfNkYv6UL
5wjF7ShfOEYvaUL50jF7ShfOkYu6UL50jF3ShfPEYu6cL54jFzThfPEYuacL58jFzThfPkYt6cL5
8jFvThUAjFvThUAjFvThUAjFrUhUEjFrUhUEjFrUhUEjFnUhUIjFnUhUIjFnUhUIjFnUhUMjFnUh
UMjFjUhUMjFjVhUMjFjVhUMjFjVhUQjFjVhUQjFjVhUQjFjVhUQjFjVhUQjFjVhUQjFjVhUQjFjV
hUQjFjVhUQjFjVhUQjFjVhUQjFjVhUQjOb8432zQiihFFCKKEUUIooRRQiihFFCKKEUUIooRRQii
hFFCKKEUUIooRRQiihFFCKOB84fz4P/aAAgBAgIGPwDYj9F7bZXttle22V7bZXttle22V7bZXttl
e22V7bZWoOxPP5/s2/8AWPW/ht/6x638NtSPW/htqR638NtSPW/htqR638NtSPW/htqRi/htqRi/
htqRi7bUjF22pGLttSMXbakYu21IxdtqRi7bUjF22pGLttSMXbakYu21IxdtqRi7bUjF2PF+F8V8
V8V8V8V8V8V8V8V8UP8Al/nlv//aAAgBAwIGPwA0XJyuTlcnK5OVycrk5XJyuTlcnK5OUPxJY0jD
GkYY0jDGkYY0jDGkYY0jDGkYY0jDGMMYwxjDGMMYwxjDGMMYwxjDGMMYwxjDGMMYw38roui6Loui
6Loui6Loutm//9oACAEBAQY/AG/PCagf5InlG7Bt2DbsG3YNuwbdg27Bt2DbsG3YNuwbdg27Bt2D
bsG3YNuwbdg27Bt2DbsG2dc+Rciio/j5/rz5fekN7Ew+CfekN7Ex+CfekN7Ex+Fen7pDexMfhX3p
DexMfhX3pDexMfhXp+6Q3sTH4V9yQ3sTGr7khs8xq+5IbPMavuSGzzGr7khs8xq+5IbPMavuSGzz
Gr7khs8xq+5IbPMavuSGzzGr7khs8xq+5IbPMavuSGzzGr7khs8xq+5IbNMavuSGzTGr7khs0xq+
5IbNMavuSGzTGr7khs0xq+5IbNMavuSGzTGr7khs0xq+5IbNMavuSGzTGr7khs0xq+5IbNMavuSG
zTGr7khs0xq+5IbNMavuSGzTGr7khs0xq+5IbNMavuSGzTGr7khs0xq+5IbNMavuSGzTGr7khs0x
q+5IbNMavuSGzTGr/wDpVRx+U/lPP1+zchatrchatrchatrchatrchatrchatrchatrchatrchat
rchatrchatrchatrchatrchatrchatrchatrchatrchatrchatrchatrchatrH/kJSTyn5efP2+q
I7//2Q==" transform="matrix(0.0666 0 0 -0.0666 4.8438 34.1055)">
</image>
</g>
</g>
</g>
<g clip-path="url(#SVGID_2_)">
<defs>
<path id="SVGID_9_" d="M18.859,13.056c3.984,0.637,7.038,4.063,7.038,8.228c0,4.166-3.053,7.59-7.038,8.229v4.551
c6.5-0.67,11.589-6.1,11.589-12.779c0-6.679-5.089-12.107-11.589-12.779V13.056z"/>
</defs>
<clipPath id="SVGID_10_">
<use xlink:href="#SVGID_9_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_10_)">
<defs>
<rect id="SVGID_11_" x="18.767" y="8.47" width="11.852" height="25.636"/>
</defs>
<clipPath id="SVGID_12_">
<use xlink:href="#SVGID_11_" overflow="visible"/>
</clipPath>
<g transform="matrix(1 0 0 1 7.456483e-007 1.930745e-006)" clip-path="url(#SVGID_12_)">
<image overflow="visible" width="178" height="385" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEEOQQ5AAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFkb2JlAGTAAAAAAQMA
EAMCAwYAAATzAAAGdwAACSv/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoX
Hh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoa
JjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIAYYAwwMBIgACEQEDEQH/
xACPAAEBAQEBAQAAAAAAAAAAAAAAAQUEBgcBAQEBAQAAAAAAAAAAAAAAAAAEAgMQAAAFBAMBAQEA
AAAAAAAAAAAyAzMFEDBAEgIVBgQBEREAAAUEAwEAAgMAAAAAAAAAAbECcgMAEEAyotI0ETFBgSIU
EgABAwUBAQEBAAAAAAAAAAABABAwMYGRMkMCEYJC/9oADAMBAAIRAxEAAAD6Bka+HvGO5FsvW5B1
uQdbkHW5B1uQdbkHW5B1uQdbkHXu+X9Hy3uCSph7mJ0x5wWxgAAAAAAAAPRed9Hy67YjqYm3idMe
dVbHFEURRFEURRFEURRPRee9Dy67YjqYu1i9MeeFsYAAAAAAAAD0PnvQ8uu0I6mNs43THnlWSRRF
EURRFEURRFEUT0Pn/Qc+myI6mNs43TGALJAAAAAAAAAG/gb/AD6bIjqY+xj7xgKtkiiKIoiiKIoi
iKIom/g73LpsCSpj7GRvGCq2SKIoiiKIoiiKIoiibuHu8umuJKmRr5G8YSrJIoiiKIoiiKIoiiKJ
u4e5z6a4kqZOtk7xhKskiiKIoiiKIoiiKIom7h7nPprCSpk62TvGILJAAAAAAAAAG3ibfPprCSpl
auVvGILJAAAAAAAAAG3ibfPpqiSplauVvGKLJAAAAAAAAAG1i7XLpqiWpl6mXvGKK5AAAAAAAAAG
1i7XPpqCWpl6mXvGMK5AAAAAAAAAGzjbPPpqCWpl6mZvGMK5AAAAAAAAAGxj7PPppiWpmaeZvGOK
5AAAAAAAAAGxj7HPppiWpmaeZvGOquSKIoiiKIoiiKIoiibGRr8+mmJamZp5u8Y6qpIoiiKIoiiK
IoiiKJr5OvjppCWpm6WbvGQKpAAAAAAAAAGvka+OmkJambpZu8ZCqpIoiiKIoiiKIoiiKJr5Otjp
pCWpm6WbvGSKpQAAAAAAAAGtk62N6QlqZulm7xkiqUAAAAAAAABrZOtjekJambpZu8ZIqkAAAAAA
AAAa2Trc+mkJqnKazxjrxAAAAAAAAAdhnXUOXb//2gAIAQIAAQUAS/P7z04jTiNOI04jTiNOI04j
TiNOI04hbjx/OARctLthJy0u2EnLS7YSctLNhI9pYgSPaWIEj2liBI9pYgSPaWIEj2liBI9pYgSP
aWIEj2liBI9pYgTPaVIEz2lSBM9pUgTPaVIEz2lSBM9pUgTPaVIEz2lSBM9pUg4mtcyj/9oACAED
AAEFAFCbchtyG3IbchtyG3IbchtyG3Ibcgly/f3mFSWkThUlpE4VJaROFSWkThUlpE4VJaROFSWk
ThUlpI4VJaSOFCWkjhQlpI4UJaSOFCWkjhQlpI4UJaSOFCWkjhQlpI4UJaSOFCWkjhQlpI4UJaSO
FCWkjhQlpI45FtcDD//aAAgBAQABBQAeh+r6PmR7eSHbyQ7eSHbyQ7eSHbyQ7eSHbyQ7eSHbyQ7e
SHbyQ7eSHbyQ7eSHbyQ7eSHbyQ7eSHbyQ7eSHnvq+j6UaeoYxfLsU9Oxi+YYp6djF8wxT0zGL5li
npmMXzLFPSsYvmmKelYxfNMU9Ixi+bYp6RjF82xT0bGL5xino2MXzjFPRM4vnWaeiZxfOs09Czi+
eZp6FnF88zT0LOL55mnoGcXz7NPQM4vn2aT7OLAM0n2cWAZpPs4sAzSeZxYFmk8ziwLNJ5nFgWaT
rWLBNUnWsWCapOtYsE1ScaxYNqk41iwbVJxrFg2qTbWLCNUm2sWEapNtYsI1SbaxYRqk01iwrVJp
rFhWqTTWLCtUmmsWFapNNYsK1SZaxYZqky1iwzVJlrFhmqTLWLDNUmWsWGapMtYsM1SZaxYZqky1
iwzVPu/Pk/eGkONIcaQ40hxpDjSHGkONIcaQ40hxpDjSHGkONIcaQ40hxpDjSHGkONIcaQ4+H8+T
84D/2gAIAQICBj8A8/VqMLUYWowtRhajC1GFqMLUYWowtRhH4AKN5jNm8xmzeYzZvMZs3mM2bzGb
N5jNm8xmzCM2YRlhGWEZYRlhGWEZYRlhGWEZYRlhGWEZYRlhGWFbVXVdV1XVdV1XVdV1XVf3+qN/
/9oACAEDAgY/ACqnKqcqpyqnKqcqpyqnKqcqpyqnKH0ljGGMYYxhjGGMYYxhjGGMYYxhjGGMYYxh
jGGMYYxhjGGMYYxhjGGMYYxhjGGMYY0vRclyXJclyXJclyXJclz/ADVv/9oACAEBAQY/AKhVBIMY
qUICIfsPlehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdehdTKnk
GQUqAAEf0Hy8DxLGneBXgeJY07wK8DxLGneBXgeJY07wK8DxLGneBXheJY0zwK8LxLGmeBXhcJY0
zgK8LhLGmcBXhcJY0zgK8LhLGmcBXhcJY0zgK8LhLGmcBXhcJY0zgK8LhLGmcBXhcJY0zgK8LhLG
mcBXhcJY0zgK8ThLGlcBXicJY0rgK8ThLGlcBXicJY0rgK8ThLGlcBXicJY0rgK8ThLGlcBXicJY
0rgK8ThLGlcBXicJY0rgK8ThLGlcBXicJY0rgK8ThLGlcBXicJY0rgK8ThLGlcBXicJY0rgK8ThL
GlcBXicJY0rgK8bhLGkcBXjcJY0jgK8bhLGkcBXjcJY0jgK8bhLGkcBXjcJY0jgK8bhLGkcBXjcJ
Y0jgK8bhLGkcBXjcJY0jgK8bhLGkcBXT/qEUp+/1+ffz/Fbq5da3Vy61url1rdXLrW6uXWt1cutb
q5da3Vy61url1rdXLrW6uXWt1cutbq5da3Vy61url1rdXLrW6uXWt1cutbq5da3Vy61url1pX+UR
Un7/AG+/fz/Nv//Z" transform="matrix(0.0666 0 0 -0.0666 18.7666 34.1055)">
</image>
</g>
</g>
</g>
<g clip-path="url(#SVGID_2_)">
<defs>
<rect id="SVGID_13_" x="-0.026" width="232.784" height="40.5"/>
</defs>
<clipPath id="SVGID_14_">
<use xlink:href="#SVGID_13_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_14_)" fill="#5286C1" d="M33.628,33.143c0,4.105-4.104,4.105-4.104,4.105H5.111
c-4.105,0-4.105-4.105-4.105-4.105V8.73c0-4.104,4.105-4.104,4.105-4.104h24.413c4.104,0,4.104,4.104,4.104,4.104V33.143z
M34.66,33.354V8.52c0,0,0-4.926-4.926-4.926H4.9c0,0-4.926,0-4.926,4.926v24.834c0,0,0,4.926,4.926,4.926h24.833
C29.733,38.279,34.66,38.279,34.66,33.354"/>
<g opacity="0.8" clip-path="url(#SVGID_14_)">
<g>
<defs>
<rect id="SVGID_15_" x="31.426" width="201.332" height="40.5"/>
</defs>
<clipPath id="SVGID_16_">
<use xlink:href="#SVGID_15_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_16_)">
<path fill="#5288C1" d="M54.316,30.701l-1.209-4.072H48.07l-1.21,4.072h-3.604l5.629-17.208h3.728l5.407,17.208H54.316z
M51.329,20.307l-0.691-3.037c-0.099,0.396-0.518,2.173-0.814,3.309c-0.321,1.235-0.543,2.05-0.914,3.185h3.358
C52.144,23.394,51.6,21.492,51.329,20.307z"/>
<path fill="#5288C1" d="M67.522,31.047c-0.42-0.295-0.766-0.715-0.988-1.234c-0.814,0.791-2,1.211-3.333,1.211
c-1.778,0-3.309-0.84-3.728-2.051c-0.198-0.566-0.272-1.234-0.272-2.518v-8.099l3.259-0.617v8.124
c0,1.135,0.099,1.729,0.271,2.073c0.173,0.346,0.667,0.594,1.16,0.594c0.815,0,1.802-0.594,2.049-1.211V18.43l3.16-0.666v9.654
c0,0.84,0.271,1.703,0.765,2.297L67.522,31.047z"/>
<path fill="#5288C1" d="M75.839,31.096c-1.555,0-3.259-0.492-5.11-1.455l1.185-2.42c1.012,0.617,2.765,1.432,4.197,1.432
c0.938,0,1.679-0.617,1.679-1.432c0-0.865-0.617-1.309-1.951-1.555l-1.481-0.271c-0.84-0.148-1.876-0.742-2.321-1.285
s-0.716-1.457-0.716-2.271c0-2.469,1.951-4.123,4.889-4.123c2.024,0,3.357,0.617,4.518,1.186l-1.086,2.222
c-1.259-0.642-2.173-0.914-3.111-0.914c-0.963,0-1.604,0.494-1.604,1.236c0,0.642,0.419,0.988,1.58,1.283l1.53,0.396
c1.556,0.395,2.074,0.863,2.519,1.432c0.469,0.592,0.691,1.309,0.691,2.147C81.247,29.318,79.074,31.096,75.839,31.096z"/>
<path fill="#5288C1" d="M94.897,30.701H91.86l-1.136-4.346c-0.271-1.012-0.568-2.221-0.716-3.061l-0.197-1.26
c-0.074,0.543-0.099,0.717-0.296,1.631c-0.247,1.086-0.79,3.258-1.086,4.444l-0.642,2.592h-3.086l-3.457-12.418l3.284-0.371
l1.037,4.865c0.296,1.309,0.642,3.432,0.716,3.924c0.148-0.963,0.518-2.987,0.913-4.395l1.185-4.246h3.111l1.012,4.174
c0.494,2.098,0.864,4.049,0.938,4.467c0.074-0.543,0.346-2.518,0.691-4.124l0.963-4.518h3.407L94.897,30.701z"/>
<path fill="#5288C1" d="M103.312,25.417v0.1c0,1.95,0.963,3.061,2.667,3.061c1.136,0,2.197-0.42,3.21-1.26l1.283,1.977
c-1.457,1.184-2.987,1.752-4.766,1.752c-3.628,0-5.974-2.566-5.974-6.543c0-2.27,0.469-3.777,1.58-5.012
c1.037-1.16,2.296-1.703,3.975-1.703c1.456,0,2.839,0.494,3.653,1.333c1.161,1.186,1.68,2.89,1.68,5.53v0.766H103.312z
M107.189,22.851c0-0.939-0.1-1.433-0.396-1.902c-0.321-0.494-0.79-0.741-1.456-0.741c-1.26,0-1.976,0.988-1.976,2.741v0.049
h3.827V22.851z"/>
<path fill="#5288C1" d="M113.902,16.628c-1.111,0-2.025-0.914-2.025-2.05s0.938-2.049,2.074-2.049c1.111,0,2,0.913,2,2.049
S115.037,16.628,113.902,16.628z M112.248,30.701V18.283l3.309-0.519v12.937H112.248z"/>
<path fill="#5288C1" d="M122.294,31.096c-1.555,0-3.259-0.492-5.11-1.455l1.185-2.42c1.013,0.617,2.766,1.432,4.197,1.432
c0.938,0,1.68-0.617,1.68-1.432c0-0.865-0.617-1.309-1.951-1.555l-1.48-0.271c-0.84-0.148-1.877-0.742-2.321-1.285
s-0.716-1.457-0.716-2.271c0-2.469,1.95-4.123,4.889-4.123c2.023,0,3.357,0.617,4.518,1.186l-1.086,2.222
c-1.26-0.642-2.174-0.914-3.111-0.914c-0.963,0-1.604,0.494-1.604,1.236c0,0.642,0.419,0.988,1.58,1.283l1.53,0.396
c1.556,0.395,2.074,0.863,2.519,1.432c0.469,0.592,0.691,1.309,0.691,2.147C127.702,29.318,125.529,31.096,122.294,31.096z"/>
<path fill="#5288C1" d="M139.549,30.701l-1.209-4.072h-5.037l-1.209,4.072h-3.604l5.63-17.208h3.727l5.408,17.208H139.549z
M136.563,20.307l-0.691-3.037c-0.1,0.396-0.518,2.173-0.814,3.309c-0.32,1.235-0.543,2.05-0.914,3.185h3.357
C137.377,23.394,136.834,21.492,136.563,20.307z"/>
<path fill="#5288C1" d="M154.188,29.541c-0.865,0.914-2,1.432-3.383,1.432c-0.988,0-1.926-0.246-2.641-0.666
c0.049,0.297,0.049,0.666,0.049,1.037v3.949l-3.186,0.84V21.517c0-1.654-0.023-2.124-0.197-3.185l2.938-0.519
c0.123,0.444,0.197,0.79,0.223,1.186c0.568-0.691,1.826-1.186,3.111-1.186c0.889,0,1.803,0.297,2.492,0.766
c1.359,0.913,2.346,2.543,2.346,5.456C155.939,26.752,155.496,28.135,154.188,29.541z M152.014,21.566
c-0.246-0.692-0.764-1.062-1.58-1.062c-0.814,0-1.604,0.346-2.197,0.963v6.147c0.445,0.371,1.162,0.74,1.828,0.74
c1.629,0,2.271-1.109,2.271-3.999C152.336,23.146,152.236,22.183,152.014,21.566z"/>
<path fill="#5288C1" d="M166.578,29.541c-0.863,0.914-2,1.432-3.381,1.432c-0.988,0-1.926-0.246-2.643-0.666
c0.049,0.297,0.049,0.666,0.049,1.037v3.949l-3.184,0.84V21.517c0-1.654-0.025-2.124-0.197-3.185l2.938-0.519
c0.123,0.444,0.197,0.79,0.223,1.186c0.566-0.691,1.826-1.186,3.109-1.186c0.889,0,1.803,0.297,2.494,0.766
c1.357,0.913,2.346,2.543,2.346,5.456C168.332,26.752,167.887,28.135,166.578,29.541z M164.406,21.566
c-0.246-0.692-0.766-1.062-1.58-1.062s-1.605,0.346-2.197,0.963v6.147c0.443,0.371,1.16,0.74,1.826,0.74
c1.631,0,2.271-1.109,2.271-3.999C164.727,23.146,164.629,22.183,164.406,21.566z"/>
</g>
<g clip-path="url(#SVGID_16_)">
<path fill="#5288C1" d="M185.299,30.701h-12.586v-3.076l3.734-2.417c3.453-2.229,4.99-3.672,4.99-5.557
c0-1.569-1.129-2.385-2.887-2.385c-1.947,0-3.768,1.381-4.52,1.978l-1.854-2.009c2.262-2.009,4.457-3.014,7.314-3.014
c3.516,0,5.9,1.915,5.9,4.896c0,2.699-2.229,5.055-6.717,7.786l-1.758,1.066c0.283-0.031,1.57-0.125,3.17-0.125h5.932
L185.299,30.701z"/>
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path fill="#010202" d="M20,11H7.828l5.586-5.586L12,4l-8,8l8,8l1.414-1.414L7.828,13H20V11z"/>
</svg>

Before

Width:  |  Height:  |  Size: 466 B

Some files were not shown because too many files have changed in this diff Show More