Compare commits
33 Commits
Author | SHA1 | Date |
---|---|---|
Governikus | 684e3a1f06 | |
Governikus | 53fc9bb552 | |
Governikus | feb2a155e9 | |
Governikus | fb0491a6cb | |
Governikus | 9ba662c3bb | |
Governikus | 9484181f86 | |
André Klitzing | ebe1437537 | |
Christian Grasser | dab96eb2bd | |
André Klitzing | 806a4dc6d7 | |
André Klitzing | 84d957f9a8 | |
Governikus | c9adf39cdc | |
Governikus | b4326788d7 | |
Governikus | 34e33f4aa6 | |
John Paul Adrian Glaubitz | 5914a27069 | |
John Paul Adrian Glaubitz | 5b8016c407 | |
Christian Grasser | 7dd727820c | |
Stephan Linz | 06836ad54b | |
Governikus | 3d08ce3e5f | |
Governikus | e626090014 | |
Governikus | b4c1fbe7a9 | |
André Klitzing | 8fe1abdaf5 | |
André Klitzing | ee73f4b147 | |
André Klitzing | 19b093efcd | |
Christian Grasser | 73d816c247 | |
Governikus | fd71d19839 | |
André Klitzing | a5b97b53eb | |
André Klitzing | 4c82591b8e | |
Governikus | b41ed2ead7 | |
André Klitzing | 38c4245d1c | |
Governikus | 8fce07113d | |
Sebastian Janzen | 2c9ceb430c | |
André Klitzing | 3b90861aa4 | |
André Klitzing | 7a463a2a06 |
|
@ -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
|
13
.travis.yml
13
.travis.yml
|
@ -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
|
||||
|
|
|
@ -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)
|
|
@ -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.3 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 "Ⓒ\; 2014-2019 ${VENDOR}")
|
||||
STRING(REPLACE " \& " " \& " 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)
|
||||
|
|
|
@ -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
|
||||
|
|
236
LICENSE.txt
236
LICENSE.txt
|
@ -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
|
||||
|
|
13
README.rst
13
README.rst
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
37
appveyor.yml
37
appveyor.yml
|
@ -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%"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
@ -24,9 +30,6 @@ ENDIF()
|
|||
IF(ANDROID OR IOS OR WINDOWS_STORE OR "${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
|
||||
FIND_PACKAGE(Qt5Bluetooth ${MIN_QT_VERSION} REQUIRED)
|
||||
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(ANDROID)
|
||||
|
@ -71,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)
|
||||
|
@ -90,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)
|
||||
|
@ -101,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)
|
||||
|
@ -108,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)
|
||||
|
@ -122,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()
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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} 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.67")
|
||||
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,103 +133,138 @@ 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 20x20 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 40x40 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 60x60 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon20@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 29x29 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 58x58 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 87x87 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 40x40 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 80x80 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 180x180 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon60@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 76x76 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 152x152 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon76@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 167x167 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 1024x1024 npa_beta.svg iOS/appIcons/beta/Images.xcassets/AppIcon.appiconset/icon1024.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 20x20 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 40x40 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 60x60 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon20@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 29x29 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 58x58 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 87x87 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 40x40 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 80x80 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/iconSmall40@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 120x120 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 180x180 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon60@3x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 76x76 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 152x152 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon76@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 167x167 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon83.5@2x.png
|
||||
COMMAND ${CONVERT_CMD} -background '${BACKGROUND_COLOR}' -resize 1024x1024 npa.svg iOS/appIcons/Images.xcassets/AppIcon.appiconset/icon1024.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/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
|
||||
|
@ -288,9 +281,15 @@ SET(PNGQUANT_CMD pngquant -f -o)
|
|||
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/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
|
||||
|
@ -302,28 +301,31 @@ SET(PNGQUANT_CMD pngquant -f -o)
|
|||
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/launchImages/Default-568h@2x.png -- iOS/launchImages/Default-568h@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
|
||||
|
@ -332,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
|
||||
|
@ -341,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
|
||||
|
@ -350,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)
|
||||
|
@ -368,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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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>
|
|
@ -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
|
|
@ -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>
|
|
@ -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)@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
|
|
@ -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}
|
|
@ -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}
|
|
@ -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
|
|
@ -0,0 +1,13 @@
|
|||
Table of contents
|
||||
-----------------
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\clearpage
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 3
|
||||
:caption: Installation
|
||||
|
||||
README.de
|
||||
README.en
|
|
@ -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
|
|
@ -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
|
||||
""""""""""
|
|
@ -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.
|
|
@ -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.
|
|
@ -0,0 +1,10 @@
|
|||
AusweisApp2 1.18.1
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
**Releasedatum:** 24. September 2019
|
||||
|
||||
|
||||
|
||||
Entwickler
|
||||
""""""""""
|
||||
- Anpassungen an der Info.plist.
|
|
@ -0,0 +1,15 @@
|
|||
AusweisApp2 1.18.2
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
**Releasedatum:** 26. September 2019
|
||||
|
||||
|
||||
|
||||
Anwender
|
||||
""""""""
|
||||
- Kleinere Fehlerbehebungen.
|
||||
|
||||
|
||||
Entwickler
|
||||
""""""""""
|
||||
- Anpassungen an der Info.plist.
|
|
@ -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">
|
||||
|
|
|
@ -1,19 +1,28 @@
|
|||
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 wird die Unterstützung
|
||||
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-AES128-SHA256
|
||||
- DHE-DSS-AES256-SHA
|
||||
- DHE-DSS-AES128-SHA
|
||||
- ECDHE-ECDSA-AES256-SHA
|
||||
|
|
|
@ -4,9 +4,6 @@ Release Notes
|
|||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
1.14.3
|
||||
1.14.2
|
||||
1.14.1
|
||||
1.14.0
|
||||
1.18.0
|
||||
announce
|
||||
issues
|
||||
|
|
|
@ -42,7 +42,7 @@ master_doc = 'index'
|
|||
|
||||
# General information about the project.
|
||||
project = 'AusweisApp2'
|
||||
copyright = '2016-2018, 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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 61
|
||||
- Firefox 66
|
||||
|
||||
- Chrome 67
|
||||
- Chrome 74
|
||||
|
||||
- Internet Explorer 11
|
||||
|
||||
- Safari 11.1.1
|
||||
- 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 5.2
|
||||
- Firefox Klar 8
|
||||
|
||||
- Chrome 67
|
||||
- Chrome 73
|
||||
|
||||
- Android System WebView 67
|
||||
- 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
|
||||
|
|
|
@ -1,6 +1,26 @@
|
|||
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::
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ master_doc = 'index'
|
|||
|
||||
# General information about the project.
|
||||
project = 'AusweisApp2 SDK'
|
||||
copyright = '2016-2018, 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.
|
||||
|
|
|
@ -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.
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
@ -364,6 +364,7 @@ again but without an error parameter.
|
|||
{
|
||||
"name": "NFC",
|
||||
"attached": true,
|
||||
"keypad": false,
|
||||
"card":
|
||||
{
|
||||
"inoperative": false,
|
||||
|
@ -424,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,
|
||||
|
@ -482,6 +484,7 @@ Please see the note for more information.
|
|||
{
|
||||
"name": "NFC",
|
||||
"attached": true,
|
||||
"keypad": false,
|
||||
"card":
|
||||
{
|
||||
"inoperative": false,
|
||||
|
@ -642,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.
|
||||
|
||||
|
@ -665,6 +674,7 @@ until a card with enabled eID functionality is inserted.
|
|||
"msg": "READER",
|
||||
"name": "NFC",
|
||||
"attached": true,
|
||||
"keypad": false,
|
||||
"card":
|
||||
{
|
||||
"inoperative": false,
|
||||
|
@ -695,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,
|
||||
|
|
|
@ -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"}
|
||||
|
||||
|
|
|
@ -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,165 +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.2o)
|
||||
SET(OPENSSL_HASH ec3f5c9714ba0fd45cb4e087301eb1336c317e0d20b575a125050470e8089e4d)
|
||||
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-Revert-Configure-use-a-better-method-to-identify-gcc.patch &&
|
||||
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/openssl-RSA-key-generation-ensure-BN_mod_inverse-and-BN_mod_.patch &&
|
||||
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/openssl-Reject-excessively-large-primes-in-DH-key-generation.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 -c++std c++11 -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)
|
||||
|
@ -279,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)
|
||||
|
@ -309,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-QCoreTextFontEngine-Fix-build-with-Xcode-9.3.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)
|
||||
|
||||
#########################################################################
|
||||
|
||||
|
@ -331,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)
|
||||
|
@ -352,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})
|
||||
|
@ -370,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}
|
||||
|
@ -383,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})
|
||||
|
|
129
libs/README.rst
129
libs/README.rst
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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)
|
|
@ -1,31 +0,0 @@
|
|||
From 349a41da1ad88ad87825414752a8ff5fdd6a6c3f Mon Sep 17 00:00:00 2001
|
||||
From: Billy Brumley <bbrumley@gmail.com>
|
||||
Date: Wed, 11 Apr 2018 10:10:58 +0300
|
||||
Subject: [PATCH] RSA key generation: ensure BN_mod_inverse and BN_mod_exp_mont
|
||||
both get called with BN_FLG_CONSTTIME flag set.
|
||||
|
||||
CVE-2018-0737
|
||||
|
||||
Reviewed-by: Rich Salz <rsalz@openssl.org>
|
||||
Reviewed-by: Matt Caswell <matt@openssl.org>
|
||||
(cherry picked from commit 6939eab03a6e23d2bd2c3f5e34fe1d48e542e787)
|
||||
---
|
||||
crypto/rsa/rsa_gen.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git x/crypto/rsa/rsa_gen.c y/crypto/rsa/rsa_gen.c
|
||||
index 9ca5dfefb7..42b89a8dfa 100644
|
||||
--- x/crypto/rsa/rsa_gen.c
|
||||
+++ y/crypto/rsa/rsa_gen.c
|
||||
@@ -156,6 +156,8 @@ static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value,
|
||||
if (BN_copy(rsa->e, e_value) == NULL)
|
||||
goto err;
|
||||
|
||||
+ BN_set_flags(rsa->p, BN_FLG_CONSTTIME);
|
||||
+ BN_set_flags(rsa->q, BN_FLG_CONSTTIME);
|
||||
BN_set_flags(r2, BN_FLG_CONSTTIME);
|
||||
/* generate p and q */
|
||||
for (;;) {
|
||||
--
|
||||
2.17.0
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
From 3984ef0b72831da8b3ece4745cac4f8575b19098 Mon Sep 17 00:00:00 2001
|
||||
From: Guido Vranken <guidovranken@gmail.com>
|
||||
Date: Mon, 11 Jun 2018 19:38:54 +0200
|
||||
Subject: [PATCH] Reject excessively large primes in DH key generation.
|
||||
|
||||
CVE-2018-0732
|
||||
|
||||
Signed-off-by: Guido Vranken <guidovranken@gmail.com>
|
||||
|
||||
(cherry picked from commit 91f7361f47b082ae61ffe1a7b17bb2adf213c7fe)
|
||||
|
||||
Reviewed-by: Tim Hudson <tjh@openssl.org>
|
||||
Reviewed-by: Matt Caswell <matt@openssl.org>
|
||||
(Merged from https://github.com/openssl/openssl/pull/6457)
|
||||
---
|
||||
crypto/dh/dh_key.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git x/crypto/dh/dh_key.c y/crypto/dh/dh_key.c
|
||||
index 387558f146..f235e0d682 100644
|
||||
--- x/crypto/dh/dh_key.c
|
||||
+++ y/crypto/dh/dh_key.c
|
||||
@@ -130,10 +130,15 @@ static int generate_key(DH *dh)
|
||||
int ok = 0;
|
||||
int generate_new_key = 0;
|
||||
unsigned l;
|
||||
- BN_CTX *ctx;
|
||||
+ BN_CTX *ctx = NULL;
|
||||
BN_MONT_CTX *mont = NULL;
|
||||
BIGNUM *pub_key = NULL, *priv_key = NULL;
|
||||
|
||||
+ if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) {
|
||||
+ DHerr(DH_F_GENERATE_KEY, DH_R_MODULUS_TOO_LARGE);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
ctx = BN_CTX_new();
|
||||
if (ctx == NULL)
|
||||
goto err;
|
||||
--
|
||||
2.18.0
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
From 2a33b07d56c7e30a18dda5760111af267271c236 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com>
|
||||
Date: Tue, 24 Apr 2018 16:13:56 +0200
|
||||
Subject: [PATCH] Revert "Configure: use a better method to identify gcc and
|
||||
derivates"
|
||||
|
||||
This reverts commit 78e9e3f945935c91d8dfe0e832a95d6ea8d05f34.
|
||||
---
|
||||
Configure | 22 ++++++++--------------
|
||||
1 file changed, 8 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git x/Configure y/Configure
|
||||
index 744b493b96..fe7565ebd9 100755
|
||||
--- x/Configure
|
||||
+++ y/Configure
|
||||
@@ -1269,7 +1269,7 @@ my ($prelflags,$postlflags)=split('%',$lflags);
|
||||
if (defined($postlflags)) { $lflags=$postlflags; }
|
||||
else { $lflags=$prelflags; undef $prelflags; }
|
||||
|
||||
-if ($target =~ /^mingw/ && `$cross_compile_prefix$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
|
||||
+if ($target =~ /^mingw/ && `$cc --target-help 2>&1` !~ m/\-mno\-cygwin/m)
|
||||
{
|
||||
$cflags =~ s/\-mno\-cygwin\s*//;
|
||||
$shared_ldflag =~ s/\-mno\-cygwin\s*//;
|
||||
@@ -1661,25 +1661,18 @@ if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
|
||||
$shlib_minor=$2;
|
||||
}
|
||||
|
||||
-my %predefined;
|
||||
-
|
||||
-# collect compiler pre-defines from gcc or gcc-alike...
|
||||
-open(PIPE, "$cross_compile_prefix$cc -dM -E -x c /dev/null 2>&1 |");
|
||||
-while (<PIPE>) {
|
||||
- m/^#define\s+(\w+(?:\(\w+\))?)(?:\s+(.+))?/ or last;
|
||||
- $predefined{$1} = defined($2) ? $2 : "";
|
||||
-}
|
||||
-close(PIPE);
|
||||
+my $ecc = $cc;
|
||||
+$ecc = "clang" if `$cc --version 2>&1` =~ /clang/;
|
||||
|
||||
if ($strict_warnings)
|
||||
{
|
||||
my $wopt;
|
||||
- die "ERROR --strict-warnings requires gcc or clang" unless defined($predefined{__GNUC__});
|
||||
+ die "ERROR --strict-warnings requires gcc or clang" unless ($ecc =~ /gcc$/ or $ecc =~ /clang$/);
|
||||
foreach $wopt (split /\s+/, $gcc_devteam_warn)
|
||||
{
|
||||
$cflags .= " $wopt" unless ($cflags =~ /(^|\s)$wopt(\s|$)/)
|
||||
}
|
||||
- if (defined($predefined{__clang__}))
|
||||
+ if ($ecc eq "clang")
|
||||
{
|
||||
foreach $wopt (split /\s+/, $clang_devteam_warn)
|
||||
{
|
||||
@@ -1730,14 +1723,15 @@ while (<IN>)
|
||||
s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
|
||||
s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
|
||||
s/^RC=\s*/RC= \$\(CROSS_COMPILE\)/;
|
||||
- s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $predefined{__GNUC__} >= 3;
|
||||
+ s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq "gcc";
|
||||
}
|
||||
else {
|
||||
s/^CC=.*$/CC= $cc/;
|
||||
s/^AR=\s*ar/AR= $ar/;
|
||||
s/^RANLIB=.*/RANLIB= $ranlib/;
|
||||
s/^RC=.*/RC= $windres/;
|
||||
- s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $predefined{__GNUC__} >= 3;
|
||||
+ s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $cc eq "gcc";
|
||||
+ s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $ecc eq "gcc" || $ecc eq "clang";
|
||||
}
|
||||
s/^CFLAG=.*$/CFLAG= $cflags/;
|
||||
s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
|
||||
--
|
||||
2.17.0
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
From 05eed1cd4505bf9912b84ed39ab1ad22846e7d09 Mon Sep 17 00:00:00 2001
|
||||
From: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
|
||||
Date: Fri, 30 Mar 2018 11:58:16 -0700
|
||||
Subject: QCoreTextFontEngine: Fix build with Xcode 9.3
|
||||
|
||||
Apple LLVM version 9.1.0 (clang-902.0.39.1)
|
||||
|
||||
Error message:
|
||||
|
||||
.../qfontengine_coretext.mm:827:20: error: qualified reference to
|
||||
'QFixed' is a constructor name rather than a type in this context
|
||||
return QFixed::QFixed(int(CTFontGetUnitsPerEm(ctfont)));
|
||||
|
||||
Change-Id: Iebe26b3b087a16b10664208fc8851cbddb47f043
|
||||
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
|
||||
---
|
||||
src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git x/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm y/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
|
||||
index 66baf162d9..89794ef109 100644
|
||||
--- x/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
|
||||
+++ y/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
|
||||
@@ -830,7 +830,7 @@ void QCoreTextFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, gl
|
||||
|
||||
QFixed QCoreTextFontEngine::emSquareSize() const
|
||||
{
|
||||
- return QFixed::QFixed(int(CTFontGetUnitsPerEm(ctfont)));
|
||||
+ return QFixed(int(CTFontGetUnitsPerEm(ctfont)));
|
||||
}
|
||||
|
||||
QFontEngine *QCoreTextFontEngine::cloneWithSize(qreal pixelSize) const
|
||||
--
|
||||
2.16.2
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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*
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,8 +81,8 @@
|
|||
<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>
|
||||
|
@ -86,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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,58 +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": [
|
||||
"3082083a30820722a003020102020900d5b6a4dc1fd8854a300d06092a864886f70d01010b05003081df310b300906035504061302444531253023060355040a0c1c542d53797374656d7320496e7465726e6174696f6e616c20476d6248311f301d060355040b0c16542d53797374656d732054727573742043656e746572311c301a06035504080c134e6f7264726865696e205765737466616c656e310e300c06035504110c0535373235303110300e06035504070c074e65747068656e3120301e06035504090c17556e7465726520496e647573747269657374722e2032303126302406035504030c1d54656c65536563205365727665725061737320436c6173732032204341301e170d3137313230313130343733325a170d3230313230363233353935395a308180310b30090603550406130244453121301f060355040a0c18476f7665726e696b757320476d6248202620436f2e204b47310b3009060355040b13025345310f300d060355040813064272656d656e310f300d060355040713064272656d656e311f301d060355040313166170706c2e676f7665726e696b75732d6173702e646530820222300d06092a864886f70d01010105000382020f003082020a0282020100c1d969514392105ce65b089b7357f75356f076b21168233d1eb57ae81f826c74258ec4814c48a3e99633fcac1fb444412cba421c1569d21b6317b6614b096203ab5b605128671764d30186dec09716d2173bfab911a9ad3d2d0b850ff2595dd9c72113bd64879c39c39b3debbfdd7f8d68e8d1bdaf2cca0508583bd59b965ec5f4950e4fbbe48b7be351237d478253bc34ac5aed9448f5ae31878067bdad75179cb776ef19f8e49e62b830de8279142233030189c20008345553847b7edc6471bf7c15c98b087159b44faa5a35fe16adc285e4d8266fab49b7b4e7fbcbd91767e05dbb45a5564cb11abcbeb0ff66869ca72dd7919eae796340fb5b26fb8ecc65b8380d3eb30e46150725e2156ad156773a79b482133b846b247868a6d3fcc18f96cfc6044fb7678fd79c04fb580b7bfb86e3252554b9a97dfd6fb9ae0e0d8d663a56b471d37752fc88a172151494553d78a39ade4669076e5ddfa13fd684b7eb800efedf9af8f90d4bab6d80378b950d43ef6de6f9ca5dccb81ecbbf820126d90923c5b87462af2acf0fc460599b2d7022e488f20069e2b3e80e057ebbd1454891929c2e0252688a1c0e801eb8bec795251087a755a6edcd22759a5c1869550d63b0596cb5ac20a7e5cb11f5412598990092cbe058b4ec67b98dd9ed2b2a5f8b7994e92b89a1ef51517beb2e2594cb8007d514f988968c52246a18945fba0adf0203010001a382035430820350301f0603551d2304183016801494c87446f53ab4464826f82bca341e5626041200300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030206082b06010505070301301d0603551d0e041604148c76a1377b9cad8059a5d4126a53bc633671ca1c305a0603551d20045330513045060a2b06010401bd470d17013037303506082b060105050702011629687474703a2f2f7777772e74656c657365632e64652f736572766572706173732f6370732e68746d6c3008060667810c010202308201030603551d1f0481fb3081f83040a03ea03c863a687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f726c2f536572766572506173735f436c6173735f322e63726c3081b3a081b0a081ad8681aa6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f43657274696669636174655265766f636174696f6e4c6973743082014906082b060105050701010482013b30820137303306082b060105050730018627687474703a2f2f6f6373702e736572766572706173732e74656c657365632e64652f6f63737072305206082b060105050730028646687474703a2f2f63726c2e736572766572706173732e74656c657365632e64652f6372742f54656c655365635f536572766572506173735f436c6173735f325f43412e6365723081ab06082b0601050507300286819e6c6461703a2f2f6c6461702e736572766572706173732e74656c657365632e64652f434e3d54656c6553656325323053657276657250617373253230436c6173732532303225323043412c4f553d542d53797374656d73253230547275737425323043656e7465722c4f3d542d53797374656d73253230496e7465726e6174696f6e616c253230476d62482c433d44453f63414365727469666963617465300c0603551d130101ff0402300030210603551d11041a301882166170706c2e676f7665726e696b75732d6173702e6465300d06092a864886f70d01010b050003820101006376f829a32345d2d590176bf2294d9ab6fe44e6c7db3b467bd597eebda4121d6e8795ec33de253ff9f271857c4a1ddf4b80b080464a51741a53de5137be13fc482e41b3649afbb571bfec2a894022d933ca60c691a99f31fe40209e7ca2e7fcd15d33baf8c1d20e107750cbd8628bc883af062a622f29c36574decaf97ef00471bbbe81380042ab82e46788491e4f77e58168f154d5210748263bfb8b2c3c82937436f758e1b2360c22458803a304eb90a4617bdcaa591176f4002e63dce3c9a3c7dcec83472dec70346544105118227fce63bae6a6686950846f65f30de621c1e5d6b7b20f3ce7d8ebbd95667c89123adb9efcbdd5ea1ba6e71b152bea43d3",
|
||||
"308205633082044ba00302010202135100000749e339b5a8a2ecb8e8000000000749300d06092a864886f70d01010b0500304431153013060a0992268993f22c64011916056c6f63616c31153013060a0992268993f22c6401191605626f736b67311430120603550403130b676f766b67726f6f746361301e170d3136313232393039343930325a170d3138313232393039353930325a307c310b3009060355040613024445310b3009060355040813024445310f300d060355040713064272656d656e31163014060355040a130d476f7665726e696b7573204b47311c301a060355040b131353797374656d7320456e67696e656572696e6731193017060355040314102a2e74662e626f732d746573742e646530820122300d06092a864886f70d01010105000382010f003082010a0282010100c2ce4b611d136b4a99f43bd6487c323f812f00c433ed7ec3d343b93c1b064ba12ff3f950634bbba55283ea48bf91d3a6736ee17c3467918b22d9ba1d55f9b8593461b42ed54454d15577abe0ec286203c4c33a82aae8216c802f8f81f1d06473f85acbf6ba69357828030a97086aa1bc6836cae3916d2d83f24c153a05402e13828a30822e7a861395be7d7c511b84baf4bc4a5daeb3db755b37e8ffb5dd18f8ac22c018801e212ab59b96e64b85c3d418c577c33ef73cc0ba5fef68041ba39fa0b795e7b5eabfa408c36ca582572ca2adde4cd104ccad376eaa06b41e737121f349eedb063438b406bd32dc032659e9cbad809afb5679d8a7d776a916ead35b0203010001a382021430820210300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b0601050507030130240603551d11041d301b82102a2e74662e626f732d746573742e646582012a87040ad2f861301d0603551d0e04160414262451b4431de1ccdb523d93038d7e01c4a3d153301f0603551d230418301680144b7e48a7b2f2db121642634bcd7e1c0deee96285303b0603551d1f043430323030a02ea02c862a687474703a2f2f676f7663726c2e676f7665726e696b75732e64652f63726c2f7265766f6b652e63726c3081eb06082b060105050701010481de3081db3081aa06082b0601050507300286819d6c6461703a2f2f2f434e3d676f766b67726f6f7463612c434e3d4149412c434e3d5075626c69632532304b657925323053657276696365732c434e3d53657276696365732c434e3d436f6e66696775726174696f6e2c44433d626f736b672c44433d6c6f63616c3f634143657274696669636174653f626173653f6f626a656374436c6173733d63657274696669636174696f6e417574686f72697479302c06082b060105050730018620687474703a2f2f676f7663726c2e676f7665726e696b75732e64652f6f637370303b06092b0601040182371507042e302c06242b060104018237150887a4920efcad6b83a98117819cb41586e9ea5a1791ff2e87b7af7c020164020109301b06092b060104018237150a040e300c300a06082b06010505070301300d06092a864886f70d01010b05000382010100a41dd5971c9b983bc3369bc9f3046481ff05aab5b47fac27a8cb7f917585b15c5acfbc8d083375a459b0642974968f4e00ad501d715dfb8a9e098437459ddcbba5a7d49f0278bd841b89fb93e86683bd89334f6b5ab556834e1fb4ec86647e812438e17512ee87b01bd0679b3abf4a67fe7272eae0c4cd9ed174d70b2728e72361cded46a42d445dfe244efb55feb1eee13f614d30237ee399b4108bc596b8aab377ad98d22c87ce4ce976ec1ceac512c33d6941b715d9fa60882b4644f9a066dcd51ff6c429af37cfa38f06444e6682d09643b2866a23a42da0ae21a787e8fe40aa2b21aa55a10aa42097c9a219528ac4968eb12cec5f223791a40d21fcce05"
|
||||
"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": [
|
||||
|
@ -78,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",
|
||||
|
@ -105,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",
|
||||
|
@ -133,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",
|
||||
|
@ -150,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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue