From 5b6a4a1f9e722ece8e09e1c9dfffabfe9f14a69f Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Fri, 8 Jan 2021 14:37:54 +0100 Subject: [PATCH] * Fri Jan 08 2021 Miroslav Rezanina - 20200602gitca407c7246bf-1.el9 - Include fixes to build in RHEL 9 environment (bz#1906468) - Resolves: bz#1906468 ([RHEL9][FTBFS] edk2 FTBFS on Red Hat Enterprise Linux 9.0.0 Alpha) --- .gitignore | 1 + ...EFI_D_VERBOSE-0x00400000-in-the-DXE-.patch | 57 - 0003-OvmfPkg-enable-DEBUG_VERBOSE.patch | 54 - ...ease-max-debug-message-length-to-512.patch | 30 - ...L-on-TianoCore-splash-screen-boot-lo.patch | 3123 ----------------- ...-do-not-build-BrotliCompress-RH-only.patch | 22 +- ...ove-package-private-Brotli-include-p.patch | 43 + ...L-on-TianoCore-splash-screen-boot-lo.patch | 614 ++++ ...-max-debug-message-length-to-512-RHE.patch | 76 + ...oDxe-enable-debug-messages-in-VbeShi.patch | 60 +- ...minalDxe-add-other-text-resolutions-.patch | 65 +- ...minalDxe-set-xterm-resolution-on-mod.patch | 78 +- ...tPkg-set-early-hello-message-RH-only.patch | 40 - ...ResizeXterm-from-the-QEMU-command-li.patch | 98 +- ...PcdResizeXterm-from-the-QEMU-command.patch | 195 +- ...tools_def-to-support-cross-compiling.patch | 75 - ...clusion-of-the-shell-from-the-firmwa.patch | 95 +- ...ntroduce-fixed-PCD-for-early-hello-m.patch | 56 +- ...rePeiCore-write-early-hello-message-.patch | 68 +- ...tPkg-set-early-hello-message-RH-only.patch | 76 + ...mfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch | 102 + ...DEBUG_VERBOSE-0x00400000-in-QemuVide.patch | 147 + ...ce-DEBUG_VERBOSE-0x00400000-in-QemuR.patch | 91 + ...bDxe-Do-not-report-DXE-failure-on-Aa.patch | 89 + ...EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch | 89 +- ...lLib-list-RHEL8-specific-OpenSSL-fil.patch | 99 + ...oadImageLib-handle-EFI_ACCESS_DENIED.patch | 83 + ...se-generic-QEMU-image-loader-for-sec.patch | 184 + ...elLoaderFsDxe-suppress-error-on-no-k.patch | 85 + ...emuLoadImageLib-log-Not-Found-at-INF.patch | 49 + ...Dxe-suppress-error-on-no-swtpm-in-si.patch | 84 + ...CpuDxeSmm-pause-in-WaitForSemaphore-.patch | 105 + ...ol2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch | 139 + ...ugSmm-fix-CPU-hotplug-race-just-befo.patch | 90 + ...ugSmm-fix-CPU-hotplug-race-just-afte.patch | 119 + ...OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch | 386 ++ ...Tools-fix-ucs-2-lookup-on-python-3.9.patch | 53 + ...round-array.array.tostring-removal-i.patch | 51 + ...e-issue-caused-by-tostring-removal-o.patch | 75 + 40-edk2-ovmf-ia32-sb-enrolled.json | 35 - 50-edk2-ovmf-ia32-sb.json | 34 - 60-edk2-ovmf-ia32.json | 33 - 60-edk2-ovmf-x64.json | 34 - LICENSE.qosb | 21 + build-iso.sh | 26 - ...-verbose.json => edk2-aarch64-verbose.json | 2 +- 70-edk2-arm-verbose.json => edk2-aarch64.json | 10 +- ...-x64-sb-enrolled.json => edk2-ovmf-sb.json | 2 +- 50-edk2-ovmf-x64-sb.json => edk2-ovmf.json | 2 +- edk2.spec | 1814 ++++++---- hobble-openssl | 40 - openssl-patch-to-tarball.sh | 63 - ovmf-vars-generator | 295 ++ sources | 6 +- update-tarball.sh | 54 - 55 files changed, 4801 insertions(+), 4716 deletions(-) delete mode 100644 0002-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-the-DXE-.patch delete mode 100644 0003-OvmfPkg-enable-DEBUG_VERBOSE.patch delete mode 100644 0004-OvmfPkg-increase-max-debug-message-length-to-512.patch delete mode 100644 0005-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch rename 0016-BaseTools-do-not-build-BrotliCompress-RH-only.patch => 0007-BaseTools-do-not-build-BrotliCompress-RH-only.patch (61%) create mode 100644 0008-MdeModulePkg-remove-package-private-Brotli-include-p.patch create mode 100644 0009-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch create mode 100644 0010-OvmfPkg-increase-max-debug-message-length-to-512-RHE.patch rename 0006-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch => 0011-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch (93%) rename 0007-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch => 0012-MdeModulePkg-TerminalDxe-add-other-text-resolutions-.patch (79%) rename 0008-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch => 0013-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch (68%) delete mode 100644 0014-ArmVirtPkg-set-early-hello-message-RH-only.patch rename 0009-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch => 0014-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch (51%) rename 0010-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch => 0015-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch (53%) delete mode 100644 0015-Tweak-the-tools_def-to-support-cross-compiling.patch rename 0011-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch => 0016-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch (60%) rename 0012-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch => 0017-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch (61%) rename 0013-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch => 0018-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch (70%) create mode 100644 0019-ArmVirtPkg-set-early-hello-message-RH-only.patch create mode 100644 0020-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch create mode 100644 0021-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch create mode 100644 0022-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch create mode 100644 0023-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch rename 0001-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch => 0024-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch (56%) create mode 100644 0025-CryptoPkg-OpensslLib-list-RHEL8-specific-OpenSSL-fil.patch create mode 100644 0026-OvmfPkg-X86QemuLoadImageLib-handle-EFI_ACCESS_DENIED.patch create mode 100644 0027-Revert-OvmfPkg-use-generic-QEMU-image-loader-for-sec.patch create mode 100644 0038-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch create mode 100644 0039-OvmfPkg-GenericQemuLoadImageLib-log-Not-Found-at-INF.patch create mode 100644 0040-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch create mode 100644 0042-UefiCpuPkg-PiSmmCpuDxeSmm-pause-in-WaitForSemaphore-.patch create mode 100644 0045-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch create mode 100644 0046-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-befo.patch create mode 100644 0047-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-afte.patch create mode 100644 0048-CryptoPkg-OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch create mode 100644 0052-BaseTools-fix-ucs-2-lookup-on-python-3.9.patch create mode 100644 0053-BaseTools-Work-around-array.array.tostring-removal-i.patch create mode 100644 0054-BaseTools-Fix-the-issue-caused-by-tostring-removal-o.patch delete mode 100644 40-edk2-ovmf-ia32-sb-enrolled.json delete mode 100644 50-edk2-ovmf-ia32-sb.json delete mode 100644 60-edk2-ovmf-ia32.json delete mode 100644 60-edk2-ovmf-x64.json create mode 100644 LICENSE.qosb delete mode 100644 build-iso.sh rename 70-edk2-aarch64-verbose.json => edk2-aarch64-verbose.json (88%) rename 70-edk2-arm-verbose.json => edk2-aarch64.json (60%) rename 40-edk2-ovmf-x64-sb-enrolled.json => edk2-ovmf-sb.json (89%) rename 50-edk2-ovmf-x64-sb.json => edk2-ovmf.json (90%) delete mode 100755 hobble-openssl delete mode 100644 openssl-patch-to-tarball.sh create mode 100755 ovmf-vars-generator delete mode 100644 update-tarball.sh diff --git a/.gitignore b/.gitignore index 52494ca..ac92c69 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /softfloat-20180726-gitb64af41.tar.xz /qemu-ovmf-secureboot-20190521-gitf158f12.tar.xz /qemu-ovmf-secureboot-20200228-gitc3e16b3.tar.xz +/openssl-rhel-bdd048e929dcfcf2f046d74e812e0e3d5fc58504.tar.xz diff --git a/0002-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-the-DXE-.patch b/0002-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-the-DXE-.patch deleted file mode 100644 index 502a11a..0000000 --- a/0002-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-the-DXE-.patch +++ /dev/null @@ -1,57 +0,0 @@ -From f8f04bc629c0874a4e7a361a55053005f9196152 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 27 Jan 2016 03:05:18 +0100 -Subject: [PATCH] OvmfPkg: silence EFI_D_VERBOSE (0x00400000) in the DXE core - -The DXE core logs a bunch of Properties Table and Memory Attributes Table -related information, on the EFI_D_VERBOSE level, that I am at the moment -not interested in. Suppress said output. - -Contributed-under: TianoCore Contribution Agreement 1.0 -Signed-off-by: Laszlo Ersek -Signed-off-by: Paolo Bonzini ---- - OvmfPkg/OvmfPkgIa32.dsc | 2 ++ - OvmfPkg/OvmfPkgIa32X64.dsc | 2 ++ - OvmfPkg/OvmfPkgX64.dsc | 2 ++ - 3 files changed, 6 insertions(+) - -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 3ddc0c5edb..146e429126 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -704,6 +704,8 @@ - - NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F - } - - MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index aba4a6cc24..cdf5abba99 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -718,6 +718,8 @@ - - NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F - } - - MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 99c0ba4465..7d59d768fa 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -714,6 +714,8 @@ - - NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F - } - - MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf diff --git a/0003-OvmfPkg-enable-DEBUG_VERBOSE.patch b/0003-OvmfPkg-enable-DEBUG_VERBOSE.patch deleted file mode 100644 index def6e7a..0000000 --- a/0003-OvmfPkg-enable-DEBUG_VERBOSE.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 5b0813e1885c0234deafcb828f1747c766287c51 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Sun, 8 Jul 2012 14:26:07 +0200 -Subject: [PATCH] OvmfPkg: enable DEBUG_VERBOSE - -Enable verbose debug logs. - -Signed-off-by: Laszlo Ersek -Signed-off-by: Paolo Bonzini ---- - OvmfPkg/OvmfPkgIa32.dsc | 2 +- - OvmfPkg/OvmfPkgIa32X64.dsc | 2 +- - OvmfPkg/OvmfPkgX64.dsc | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 146e429126..fce6051e47 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -514,7 +514,7 @@ - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index cdf5abba99..983eebfaa7 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -518,7 +518,7 @@ - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 7d59d768fa..ea62b82ff7 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -518,7 +518,7 @@ - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error -- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F - - !if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 diff --git a/0004-OvmfPkg-increase-max-debug-message-length-to-512.patch b/0004-OvmfPkg-increase-max-debug-message-length-to-512.patch deleted file mode 100644 index 8685bbe..0000000 --- a/0004-OvmfPkg-increase-max-debug-message-length-to-512.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 04d5e4e3e7c8444dbb52784a2d71cf284c9e05a0 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Thu, 20 Feb 2014 22:54:45 +0100 -Subject: [PATCH] OvmfPkg: increase max debug message length to 512 - -Upstream prefers short debug messages (sometimes even limited to 80 -characters), but any line length under 512 characters is just unsuitable -for effective debugging. (For example, config strings in HII routing, -logged by the platform driver "OvmfPkg/PlatformDxe" on DEBUG_VERBOSE -level, can be several hundred characters long.) 512 is an empirically good -value. - -Signed-off-by: Laszlo Ersek ---- - OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c -index dffb20822d..0577c43c3d 100644 ---- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c -+++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c -@@ -21,7 +21,7 @@ - // - // Define the maximum debug and assert message length that this library supports - // --#define MAX_DEBUG_MESSAGE_LENGTH 0x100 -+#define MAX_DEBUG_MESSAGE_LENGTH 0x200 - - // - // VA_LIST can not initialize to NULL for all compiler, so we use this to diff --git a/0005-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch b/0005-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch deleted file mode 100644 index a922618..0000000 --- a/0005-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch +++ /dev/null @@ -1,3123 +0,0 @@ -From 0dfff83988439363624c5cbf5cf182e755307bf8 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 11 Jun 2014 23:33:33 +0200 -Subject: [PATCH] advertise OpenSSL on TianoCore splash screen / boot logo - -Because we may include the OpenSSL library in our OVMF and AAVMF builds -now, we should advertise it as required by its license. This patch takes -the original TianoCore logo, shifts it up by 20 pixels, and adds the -horizontally centered message - - This product includes software developed by the OpenSSL Project - for use in the OpenSSL Toolkit (http://www.openssl.org/) - -below. - -Logo-OpenSSL.bmp: PC bitmap, Windows 3.x format, 469 x 111 x 24 -Logo.bmp: PC bitmap, Windows 3.x format, 193 x 58 x 8 - -Downstream only because upstream edk2 does not intend to release a -secure-boot-enabled OVMF build. (However the advertising requirement in -the OpenSSL license, -"CryptoPkg/Library/OpensslLib/openssl-1.0.2*/LICENSE", has been discussed -nonetheless, which is why I'm changing the logo.) - -Notes about the 9ece15a -> c9e5618 rebase: -- Logo.bmp is no longer modified in-place; instead a modified copy is - created. That's because AAVMF includes the logo too, but it doesn't - include OpenSSL / Secure Boot, so we need the original copy too. - -Notes about the c9e5618 -> b9ffeab rebase: -- AAVMF gained Secure Boot support, therefore the logo is again modified - in the common location, and no FDF changes are necessary. - -Notes about the d7c0dfa -> 90bb4c5 rebase: - -- squash in the following downstream-only commits (made originally for - ): - - - eef9eb0 restore TianoCore splash logo without OpenSSL advertisment - (RHEL only) - - - 25842f0 OvmfPkg, ArmVirtPkg: show OpenSSL-less logo without Secure - Boot (RH only) - - The reason is that ideas keep changing when and where to include the - Secure Boot feature, so the logo must be controllable directly on the - build command line, from the RPM spec file. See the following - references: - - - https://post-office.corp.redhat.com/mailman/private/virt-devel/2016-March/msg00253.html - - https://post-office.corp.redhat.com/mailman/private/virt-devel/2016-April/msg00118.html - - https://bugzilla.redhat.com/show_bug.cgi?id=1323363 - -- This squashed variant should remain the final version of this patch. - -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- For more fun, upstream completely changed the way logo bitmaps are - embedded in the firmware binary (see for example commit ab970515d2c6, - "OvmfPkg: Use the new LogoDxe driver", 2016-09-26). Therefore in this - rebase, we reimplement the previous downstream-only commit e775fb20c999, - as described below. - -- Beyond the new bitmap file (which we preserve intact from the last - downstream branch), we introduce: - - - a new IDF (image description file) referencing the new BMP, - - - a new driver INF file, referencing the new BMP and new IDF (same C - source code though), - - - a new UNI (~description) file for the new driver INF file. - -- In the OVMF DSC and FDF files, we select the new driver INF for - inclusion if either SECURE_BOOT_ENABLE, NETWORK_IP6_ENABLE, or - TLS_ENABLE is set, as they all make use of OpenSSL (although - different subsets of it). - -- In the AAVMF DSC and FDF files, we only look at SECURE_BOOT_ENABLE, - or NETWORK_IP6_ENABLE, because the ArmVirtQemu platform does not - support TLS_ENABLE yet. - -- This patch is best displayed with "git show --find-copies-harder". - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- After picking previous downstream-only commit 32192c62e289, carry new - upstream commit e01e9ae28250 ("MdeModulePkg/LogoDxe: Add missing - dependency gEfiHiiImageExProtocolGuid", 2017-03-16) over to - "LogoOpenSSLDxe.inf". - -Signed-off-by: Laszlo Ersek -(cherry picked from commit 32192c62e289f261f5ce74acee48e5a94561f10b) -Signed-off-by: Paolo Bonzini ---- - ArmVirtPkg/ArmVirtQemu.dsc | 4 + - ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 4 + - ArmVirtPkg/ArmVirtQemuKernel.dsc | 4 + - MdeModulePkg/Logo/Logo-OpenSSL.bmp.b64 | 2743 ++++++++++++++++++++++++ - MdeModulePkg/Logo/Logo-OpenSSL.idf | 15 + - MdeModulePkg/Logo/LogoOpenSSLDxe.inf | 61 + - MdeModulePkg/Logo/LogoOpenSSLDxe.uni | 22 + - OvmfPkg/OvmfPkgIa32.dsc | 4 + - OvmfPkg/OvmfPkgIa32.fdf | 4 + - OvmfPkg/OvmfPkgIa32X64.dsc | 4 + - OvmfPkg/OvmfPkgIa32X64.fdf | 4 + - OvmfPkg/OvmfPkgX64.dsc | 4 + - OvmfPkg/OvmfPkgX64.fdf | 4 + - 13 files changed, 2877 insertions(+) - create mode 100644 MdeModulePkg/Logo/Logo-OpenSSL.bmp.b64 - create mode 100644 MdeModulePkg/Logo/Logo-OpenSSL.idf - create mode 100644 MdeModulePkg/Logo/LogoOpenSSLDxe.inf - create mode 100644 MdeModulePkg/Logo/LogoOpenSSLDxe.uni - -diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc -index 3f649c91d8..2405636af6 100644 ---- a/ArmVirtPkg/ArmVirtQemu.dsc -+++ b/ArmVirtPkg/ArmVirtQemu.dsc -@@ -424,7 +424,11 @@ - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf - MdeModulePkg/Universal/BdsDxe/BdsDxe.inf -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) -+ MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - MdeModulePkg/Logo/LogoDxe.inf -+!endif - MdeModulePkg/Application/UiApp/UiApp.inf { - - NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf -diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc -index a2f4bd62c8..89b04cd7a4 100644 ---- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc -+++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc -@@ -193,7 +193,11 @@ READ_LOCK_STATUS = TRUE - # - # TianoCore logo (splash screen) - # -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) -+ INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - INF MdeModulePkg/Logo/LogoDxe.inf -+!endif - - # - # Ramdisk support -diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc -index 9449a01d6e..9fb79d30a1 100644 ---- a/ArmVirtPkg/ArmVirtQemuKernel.dsc -+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc -@@ -361,7 +361,11 @@ - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf - MdeModulePkg/Universal/BdsDxe/BdsDxe.inf -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) -+ MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - MdeModulePkg/Logo/LogoDxe.inf -+!endif - MdeModulePkg/Application/UiApp/UiApp.inf { - - NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf -diff --git a/MdeModulePkg/Logo/Logo-OpenSSL.bmp.b64 b/MdeModulePkg/Logo/Logo-OpenSSL.bmp.b64 -new file mode 100644 -index 0000000000..567ca32f05 ---- /dev/null -+++ b/MdeModulePkg/Logo/Logo-OpenSSL.bmp.b64 -@@ -0,0 +1,2743 @@ -+Qk22YgIAAAAAADYAAAAoAAAA1QEAAG8AAAABABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWlpav7+/CQkJAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUoKCg6enp7+/vrKys -+PT09AAAAAAAAAAAAAAAAAAAAAAAACQkJwMDAWlpaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAERERN3d3RUVFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vHp6ehAQEAYGBi8vL8HBwWpqagAAAAAAAAAAAAAA -+AAAAAAAAABYWFt/f30NDQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgLU1NRU -+VFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAxMTEEBAQAAAAAAAAAAAAoKCjd3d0AAAAAAAAAAAAAAAAAAAAAAAAAAABXV1fS0tIB -+AQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAA////AAAAAAAAAAAAAAAAaGho3t7e+vr629vbZWVlAAAAAAAAAAAA////AAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAALy8vzs7O9/f309PTPj4+6urqAgICAAAAMzMzxcXF9fX18PDws7OzHx8f -+AAAAAAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA -+AAAA////AAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAARkZG5eXl6urqAAAAAAAA -+////AAAAAAAAAAAAAAAA////AAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAgICaGhozMzM9fX19fX1ycnJYmJiAQEBAAAAAAAAAAAA////PDw8zMzM+Pj4 -+5OTkYGBgAAAAAAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAA////AAAAAAAAAAAAAAAA -+////AAAAAAAAAAAARUVFtLS05eXl+vr68fHxxMTEU1NTAAAAAAAAAAAAAAAARUVFtLS05eXl+vr6 -+8fHxxMTEU1NTAAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAA////AAAAAAAAAAAAAAAAaGho3t7e+vr629vbZWVlAAAAAAAAAAAAAAAAaGho3t7e -++vr629vbZWVlAAAAAAAAAAAAAAAA////AAAAAAAA////AAAAAAAAAAAAAAAAYWFhw8PDCAgI//// -+AAAAAAAAAAAARkZG5eXl6urqAAAAAAAAAAAAAAAAAAAAT09Pzc3NAAAAAAAAAAAAAAAA////AAAA -+AAAAAAAAAAAA////AAAAAAAARkZG5eXl6urqAAAAAAAARkZG5eXl6urqAAAA////PDw8zMzM+Pj4 -+5OTkYGBgAAAAAAAAAAAAAAAA////AAAAAAAA3NzcFRUVAAAAAAAA3NzcFRUVAAAAAAAAAAAAAAAA -+AAAAKysr////Ly8vAAAALy8v////KysrAAAAAAAAAAAAAAAAKysr////Ly8vAAAALy8v////Kysr -+AAAAAAAAAAAAAAAAAAAAKysr////Ly8vAAAALy8v////KysrAAAAAAAAAAAA////AAAAAAAAAAAA -+aGho3t7e+vr629vbZWVlAAAAAAAAAAAAAAAA////PDw8zMzM+Pj45OTkYGBgAAAAAAAAAAAAAAAA -+V1dX09PT+vr67+/vq6urICAgAAAAAAAA////AAAAAAAAAAAAAAAA////AAAAAAAAMzMzxcXF9fX1 -+8PDws7OzHx8fAAAAAAAAMzMzxcXF9fX18PDws7OzHx8fAAAAAAAAAAAA////AAAAAAAAAAAA//// -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 -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBqampw8PDQEBACwsLCgoKQUFBxcXFpqamAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFxcxMTEQUFBDw8PBAQEGBgYVlZW39/fb29vAAAA -+AAAAXFxcxMTEQUFBDw8PBAQEGBgYVlZW39/fb29vAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA////AAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEB0tLS -+VVVVAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7eAAAAAAAAAAAAAAAA3t7eAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAenp6XV1d -+AAAAAAAAenp6XV1dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAenp6XV1dAAAAWFhY0NDQ -+AQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAPLy8j4+PgcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALq6ugAAAAAAAAAAAAAA -+AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAICAmlpacvLy/X19fX19cvLy2hoaAICAgAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAE1NTcfHx+rq6vv7+/Hx8cjIyGZmZgAAAAAAAAAAAAAAAE1NTcfHx+rq6vv7 -++/Hx8cjIyGZmZgAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// -+/////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAALq6ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJCQt7e3hYWFgAAAAAAAP///wAA -+AAAAAAAAAAAAAAAAAAAAAAAAALq6ugAAAAAAAAAAAAAAALq6ugAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2Np6engAAAAAAADY2Np6engAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2Np6enhcXF+Dg4EFBQQAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSnU1NT39/cAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAD///8AAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZWVnAwMAJCQkAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAACAgLOzs4AAAAAAAACAgLOzs4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAACAgLX19fCwsJZWVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+fn55eXlbW1tAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -++Pj4a2trAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBUdHR/Pz81NTUwAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJe7u7gAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAB5eXnLy8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA -+AAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAA////AAAAAAAA////AAAAAAAAAAAAMzMzxcXF -+9fX18PDws7OzHx8fAAAAAAAAAAAAAAAAAAAAAAAAAAAA////PDw8zMzM+Pj45OTkYGBgAAAAAAAA -+AAAA////AAAAAAAAAAAAAAAAAAAAaGho3t7e+vr629vbZWVlAAAAAAAAAAAAAAAAU1NTx8fH9/f3 -+zs7OPj4+9vb2AgICAAAALy8vzs7O9/f309PTPj4+6urqAgICAAAAAAAAX19f5ubm9PT0vLy8Jycn -+AAAAAAAAAAAARkZG5eXl6urqAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAA////AAAAAAAA -+AAAAAAAA////AAAAAAAAAAAAX19f5ubm9PT0vLy8JycnAAAAAAAA////AAAAAAAALy8vzs7O9/f3 -+09PTPj4+6urqAgICAAAAAAAAAAAAU1NTx8fH9/f3zs7OPj4+9vb2AgICAAAAAAAAV1dX09PT+vr6 -+7+/vq6urICAgAAAAAAAAMzMzxcXF9fX18PDws7OzHx8fAAAAAAAAAAAAAAAAAAAAAAAAMzMzxcXF -+9fX18PDws7OzHx8fAAAAAAAAAAAAaGho3t7e+vr629vbZWVlAAAAAAAAAAAA////AAAAAAAAAAAA -+AAAARkZG5eXl6urqAAAAAAAAKysr////Ly8vAAAALy8v////KysrAAAAAAAAAAAAMTExxsbG9fX1 -+6+vroaGhFBQUenp69fX1AAAAAAAA////AAAAAAAAAAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAg -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAU1NTx8fH9/f3zs7OPj4+9vb2AgICAAAAAAAAV1dX09PT+vr6 -+7+/vq6urICAgAAAAAAAAAAAAfn5+////REREAAAAAAAAAAAAAAAAAAAAV1dX09PT+vr67+/vq6ur -+ICAgAAAAAAAA////AAAAAAAAAAAAaGho3t7e+vr629vbZWVlAAAAAAAAAAAA////PDw8zMzM+Pj4 -+5OTkYGBgAAAAAAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAAAAAAU1NTx8fH9/f3zs7O -+Pj4+9vb2AgICAAAAAAAAAAAAAAAABQUF8/PzPDw8zs7O+Pj44+PjZ2dnAAAAAAAAAAAAAAAAAAAA -+Pz8//v7+ExMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZG5eXl6urqAAAA////AAAAAAAAAAAA -+AAAA////AAAAAAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AgICaGhozMzM9fX19fX1ycnJYmJiAQEBAAAAAAAAAAAAAAAA////PDw8zMzM+Pj45OTkYGBgAAAA -+AAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAA////AAAAAAAAAAAAAAAA////AAAAAAAA -+AAAARUVFtLS05eXl+vr68fHxxMTEU1NTAAAAAAAAAAAAAAAARUVFtLS05eXl+vr68fHxxMTEU1NT -+AAAAAAAAAAAA////////////////////////////AAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAaGho3t7e+vr629vbZWVlAAAA -+AAAAAAAAAAAA////AAAAAAAAAAAAV1dX09PT+vr67+/vq6urICAgAAAAAAAAAAAAX19f5ubm9PT0 -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 -+AAAAAPr6+gQEBAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAP///wAAAAAAAAAAAAAAAP///wAA -+AAAAAAAAAPr6+gICAgAAAAAAAAAAAAMDA////wAAAAAAAPz8/P////////////////////j4+AAA -+AAAAAAoKCn5+ftra2v7+/re3tyMjIwAAAAAAAAAAAAAAAAAAAAAAAAoKCn5+ftra2v7+/re3tyMj -+IwAAAAAAAPz8/AICAgAAAAAAAAAAAAMDA/z8/AAAAAAAAP///wAAAAAAAAAAAAAAAP///wAAAAAA -+AAAAACYmJu/v7wkJCfX19RYWFvT09AgICOvr6yUlJQAAAAAAAAcHB4GBgdDQ0O3t7fr6+v7+/v// -+/wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAPz8/P////////////////////j4+AAAAAAAAAAAAAAA -+AAAAAAAAAPr6+gICAgAAAAAAAAAAAAMDA////wAAAAAAAPz8/P////////////////////j4+AAA -+AAAAAMrKylVVVQAAAFFRUaurqwAAAAAAAAAAAPz8/P////////////////////j4+AAAAAAAAP// -+/wAAAAAAAPz8/AICAgAAAAAAAAAAAAMDA/z8/AAAAAAAAP///wMDAwAAAAAAAAAAAAUFBfn5+QAA -+AAAAAPz8/P////////////////////j4+AAAAAAAAPr6+gICAgAAAAAAAAAAAAMDA////wAAAAAA -+AAAAAAAAAAAAAAAAAP///wICAgAAAAAAAAAAAAICAvr6+gAAAAAAAAAAAJSUlGhoaAAAADo6OouL -+iwAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAP///wAAAAAAAAAAAAAAAP///wAAAAAA -+AAAAAPz8/P////////////////////j4+AAAAAAAAAAAAAAAAAAAAAAAAOvr6xcXFwAAAAAAAAAA -+AAAAAAAAAAAAACIiIunp6QAAAAAAAAAAAP///wMDAwAAAAAAAAAAAAUFBfn5+QAAAAAAAPz8/P// -+//////////////////j4+AAAAAAAAP///wAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA -+AAAAABMTE1hYWNXV1V5eXgAAAAAAAAAAAAAAAAAAAAAAAAAAABMTE1hYWNXV1V5eXgAAAAAAAP// -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 -+zs5ZWVkAAAAAAAAFBQXz8/M8PDzPz8/5+fnk5ORmZmYAAAAAAAAAAAAAAABfX1/R0dH29vba2tpf -+X18AAAAAAAAGBgbn5+c+Pj7R0dH29vbLy8suLi4AAAAAAADs7OwaGhoAAAAAAAAAAAAAAAAAAAAq -+KiqUlJQAAAAAAADs7OwaGhoAAAAAAAAAAAAAAAAAAAAqKiqUlJQAAAAAAAD///8AAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAMDAzw8PAAAAAHBwfo -+6Og7Ozvb29v5+fkAAAAAAABpaWnc3Nz6+vrb29tWVlYAAAAAAAAAAAAAAAD///8AAAAAAAAAAABf -+X1/R0dH29vba2tpfX18AAAAAAAAAAAAAAABgYGDk5OTz8/O4uLgkJCQAAAD4+Pj///////+QkJAA -+AAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAwMD////AAAAAAAAAAAAAAAA3t7eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7eAAAA -+AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAQEBqampw8PDQEBACwsLCgoKQUFBxcXFpqamAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAXFxcxMTEQUFBDw8PBAQEGBgYVlZW39/fb29vAAAAAAAAXFxcxMTE -+QUFBDw8PBAQEGBgYVlZW39/fb29vAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAA////AAAAAAAAAAAAAAAACQkJICAghoaGjo6OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7eAAAAAAAAAP////////////////////// -+/////////////wAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAALq6ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8j4+PgcHBwAA -+AAAAALq6ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALq6ugAAAAAAAAAAAP///wAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAICAmlpacvLy/X19fX19cvLy2hoaAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAE1NTcfHx+rq6vv7+/Hx8cjIyGZmZgAAAAAAAAAAAAAAAE1NTcfHx+rq6vv7+/Hx8cjIyGZm -+ZgAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// -+//////b29s/Pz3NzcwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAALq6ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ -+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSnU1NT39/cAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAA -+AAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAA//////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////////////////////////////////////wAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+OcGdtRTltRTlvSD5tRTltRTlz -+TUBtRTlvSD5tRTltRTlzTUD///+pkoqOcGeUdm2Udm2Udm2Udm2Udm2Udm2Udm2Udm2Udm2Udm3/ -+///Qw761oZu1oZu1oZu9q6W1oZu1oZu1oZu1oZu1oZu1oZu1oZv9/f3n4d/az8zaz8zaz8zaz8za -+z8zaz8zaz8zaz8zaz8zaz8zaz8z9/f3z8O7n4d/n4d/r5uTn4d/r5uTr5uTv6+rr5uTr5uTn4d/n -+4d/9/Pz7+vr39fT39fT39fT59/f39fT39fT59/f39fT59/f59/f39fT9/f3///////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAA////////////b0g+PAcAQQ0APAcAPAcAQQ0APAcAPAcAPAcAQQ0APAcATBwN -+////lHZtZTsubUU5bUU5bUU5bUU5b0g+b0g+b0g+bUU5b0g+bUU5////vaulmn92oYd+oYd+mn92 -+oYd+oYd+oYd+mn92oYd+mn92mn92/fz82s/M0MO+0MO+0MO+0MO+xrey0MO+0MO+0MO+xreyxrey -+0MO+/fz87+vq4tvY4tvY4tvY4tvY4tvY4tvYxrey0MO+4tvY4tvY4tvY/Pv7+vn58/Du9fPy9fPy -+9fPy9fPy9fPy9fPy9fPy9fPy9fPy9fPy/f39//////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+2s/M5+Hf//////////////////////////////////////////////////////////////////// -+////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////// -+/////21FOUENAEQSAUQSAUQSAUQSAUQSAUQSAUQSAUENAEQSAUQSAf///5p/dm1FOXNNQHNNQHNN -+QHNNQHNNQHNNQHNNQHNNQHNNQHNNQP///72rpZp/dqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqmS -+ipp/dv38/OLb2NDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvv38/O/r6uLb2Ovm5OLb -+2OLb2Ovm5Ovm5IFfVaGHfu/r6ufh3+Lb2Pz7+/38/P39/ff19Pn39/f19Pf19Pf19PXz8vXz8vf1 -+9Pn39/Pw7v39/f////////////////////////////7+/v////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////////////////4trYbWhm/////////////// -+//////////////////////////////////////////////////////////////7+/v////////// -+/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////9zTUA8BwBEEgFEEgFB -+DQBEEgFEEgFBDQBEEgFEEgFEEgFEEgH///+Udm1tRTlzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBz -+TUBzTUD///+9q6Waf3ahh36hh36hh36hh36hh36hh36hh36pkoqhh36hh379/Pzi29jQw77Qw77Q -+w77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw779/Pzv6+ri29ipkopvSD5tRTmaf3bn4d+La2FdMSN8 -+WU21oZvr5uS1oZuBX1Wpkorv6+qaf3bn4d+9q6W9q6X59/f6+fnaz8yhh3759/f9/f3////n4d+h -+h37r5uSLa2GOcGeUdm3r5uShh36pkoq1oZvaz8zn4d+GZVuOcGfr5uTQw761oZv///+pkori29jG -+t7LGt7Lr5uShh37//v7////39fShh37v6+r///////+9q6XQw769q6XGt7L///+hh37z8O6pkorn -+4d/Qw761oZv18/KUdm3i29ipkorQw77///+hh36GZVuUdm3Gt7Kpkorr5uT///+1oZt8WU21oZv9 -+/Pz///////+9q6V8WU2BX1WUdm3v6+r///+9q6V8WU2pkor////39fSGZVvn4d/////Gt7J8WU2a -+f3b39fSpkoraz8zi29iBX1WUdm339fSOcGdtRTmGZVvaz8zQw761oZv18/Khh3759/epkori29jQ -+w76BX1Waf3b39fS9q6XQw77n4d+hh3739fSOcGe9q6X///////////////8AAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAA////////////bUU5PAcARBIBRBIBRBIBRBIBRBIBRBIBRBIBRBIB -+RBIBRBIB////mn92bUU5c01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01A////vauloYd+oYd+ -+qZKKoYd+oYd+oYd+oYd+oYd+oYd+oYd+mn92/fz84tvYxrey0MO+0MO+0MO+0MO+0MO+0MO+0MO+ -+0MO+0MO+0MO+/fz88/DuvaulTBwNtaGbxreyVScYqZKKjnBnXTEjoYd+XTEjtaGbXTEjvaulZTsu -+xreyZTsu4tvYmn92lHZt/Pv7/v79vaulb0g+////////////2s/MbUU5i2thfFlNqZKKPAcA4tvY -+VScY5+Hfb0g+xreyfFlNlHZthmVbjnBntaGbgV9V////b0g+0MO+oYd+lHZt2s/Mb0g+/v79//// -+7+vqXTEj5+Hf////////jnBnqZKKjnBnqZKK////VScY6+bkb0g+0MO+qZKKi2th0MO+PAcAqZKK -+VScYgV9V2s/MTBwNvaulTBwNqZKKbUU52s/M2s/MVScYxreyZTsu2s/M////////i2thi2th4tvY -+i2thd1JG2s/MVScYxreybUU50MO+2s/MPAcAqZKK9fPyVScYvauld1JGvaulgV9VtaGbc01AoYd+ -+fFlNlHZtmn92ZTsuqZKKbUU5oYd+hmVb6+bkZTsu9/X0ZTsuxreyXTEjtaGbfFlNtaGbhmVbtaGb -+2s/MZTsu2s/MVScY7+vq////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AP///////////29IPjwHAEQSAUENAEENAEQSAUQSAUQSAUQSAUQSAUQSAUQSAf///5p/dm1FOXNN -+QHNNQHNNQHNNQHNNQHNNQHNNQHNNQHNNQHNNQP///8a3spp/dqGHfqGHfqGHfqGHfqGHfqGHfqGH -+fqGHfqGHfpp/dv38/NrPzNDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvv38/PPw7nxZ -+TZp/du/r6u/r6qmSim1FOYZlW6GHfvf19G1FOXdSRl0xI4trYW9IPsa3smU7LuLb2KGHfpR2bfv6 -++v39/ca3sl0xI7Whm7Whm/Xz8trPzG1FOdDDvmU7LnxZTUwcDeLb2F0xI////3dSRrWhm21FOevm -+5Ofh32U7LqmSiotrYf///3dSRtrPzKmSiqGHftrPzG1FOf7+/v////Pw7mU7LtDDvuvm5P///5R2 -+bamSipR2bamSiv///10xI+/r6ndSRtDDvrWhm45wZ6GHfl0xI2U7Ll0xI2U7LtrPzHdSRnxZTVUn -+GLWhm3NNQOLb2KmSilUnGItrYXdSRtrPzP///////45wZ6mSiv////Xz8m9IPqGHfkwcDYZlW3dS -+RtDDvpR2bW1FOXxZTdDDvkwcDYZlW3xZTb2rpYFfVbWhm2U7LvPw7tDDvnNNQItrYbWhm////21F -+OYZlW45wZ+/r6mU7Lvn393dSRqmSil0xI4FfVXxZTbWhm45wZ7Whm9rPzG9IPtDDvm1FOf////// -+/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////9tRTk8BwBE -+EgFEEgFEEgFEEgFEEgFEEgFEEgFEEgFEEgFMHA3///+af3ZtRTlzTUBzTUBzTUBzTUBzTUBzTUBz -+TUBzTUBzTUBzTUD////Gt7Kaf3ahh36hh36hh36pkoqhh36hh36hh36hh36hh36hh379/Pzi29jQ -+w77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw779/Pzz8O5zTUCpkorr5uTn4d+9q6VlOy6G -+ZVtvSD7Qw75dMSOhh35dMSPQw75dMSO1oZtVJxjGt7KGZVuaf3b8+/v9/f29q6VdMSOpkop8WU2B -+X1Xaz8xvSD7Qw76OcGe9q6VMHA3az8xVJxjr5uRvSD61oZtlOy7Gt7Kpkop8WU21oZttRTnn4d9t -+RTm1oZuUdm18WU3Gt7JvSD7////////z8O5dMSNtRTlvSD7Gt7KUdm2pkoqOcGeGZVvr5uRMHA3Q -+w75tRTm1oZuhh36BX1VdMSPGt7JBDQCOcGeGZVupkoqOcGfGt7JtRTmpkoptRTm9q6W1oZtlOy7G -+t7JdMSPGt7L///////+OcGehh37///////93Ukahh35VJxjQw75lOy6pkoptRTnQw75lOy61oZtd -+MSPGt7JvSD6pkoqGZVu1oZtlOy7Qw76hh36BX1WOcGd8WU3i29hlOy6af3ZtRTnaz8xVJxjaz8xl -+Oy69q6VdMSO9q6V8WU2hh36La2GUdm3Gt7JlOy7Gt7JlOy77+vr///////////////8AAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////bUU5QQ0AQQ0ARBIBQQ0ARBIBRBIBQQ0A -+RBIBRBIBRBIBRBIB////mn92bUU5c01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01A////vaul -+oYd+oYd+oYd+oYd+oYd+qZKKoYd+oYd+oYd+oYd+oYd+/fz84tvY0MO+0MO+0MO+0MO+0MO+0MO+ -+0MO+0MO+0MO+0MO+0MO+/fz88/Dumn92c01A6+bk7+vqi2thd1JGqZKKZTsuXTEjlHZt4tvYlHZt -+ZTsuhmVb8/DuhmVbb0g+ZTsu0MO++vn5/f39vaulc01A////5+HfVScYxreybUU56+bkc01AbUU5 -+lHZtvaulQQ0AlHZtVScYfFlNtaGbbUU5ZTsu0MO+2s/MXTEjc01AjnBnb0g+ZTsui2thXTEjqZKK -+////////8/DuZTsu5+Hf////////taGbxreytaGbXTEji2thd1JGc01Ac01AfFlNbUU5vaullHZt -+7+vqjnBn0MO+xreyqZKKmn92bUU5d1JG5+HflHZtVScYtaGbhmVbbUU5jnBn+/r6////////i2th -+qZKK////4tvYVScY6+bklHZtZTsujnBn2s/Mi2th////oYd+xreyoYd+ZTsufFlN7+vqgV9Vvaul -+0MO+ZTsubUU54tvYtaGbbUU5ZTsuqZKK2s/Mc01AZTsugV9Vc01AfFlN9/X0qZKKZTsud1JG8/Du -+taGbb0g+ZTsuqZKKoYd+PAcA0MO+////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAP///////////29IPjwHAEQSAUENAEQSAUQSAUQSAUQSAUQSAUQSAUQSAUQSAf///5p/ -+dm1FOXNNQHNNQHNNQHNNQHNNQHNNQHNNQHNNQHNNQHNNQP///72rpZp/dqGHfqGHfqGHfqmSiqGH -+fqmSiqGHfqGHfqGHfpp/dv38/OLb2NDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvv38 -+/PPw7trPzGU7LndSRoFfVVUnGMa3sufh3+Lb2NrPzOfh3+Lb2Pv6+u/r6vXz8vn39/Xz8u/r6vPw -+7vn39/Xz8v39/b2rpV0xI45wZ3dSRotrYdrPzGU7Lv38/P38/PXz8v///+/r6m9IPv///4FfVWU7 -+Luvm5Pv6+vn39/////////z7+/f19P////r5+fn39/38/Pf19P////////////Pw7l0xI4ZlW5R2 -+baGHfr2rpca3sv////r5+fn39/////f19Pr5+fr5+fn39/////7+/v////////////////7+/v// -+//Xz8vz7+/////////f19Pz7+/39/fXz8v38/P///////////5R2bWU7LpR2bV0xI6GHfv////// -+//Xz8v7+/f7+/v7+/v/////+/v7+/v/+//Xz8vv6+v///3xZTb2rpf////f19Pn39/////////z7 -++/Xz8v/+//////39/ff19P////f19Pr5+f/////+//Xz8vv6+v////////38/Pf19P///9rPzHdS -+Rv///////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////9t -+RTlBDQBBDQBEEgFEEgFEEgFEEgFEEgFBDQBEEgFEEgFMHA3///+af3ZtRTlzTUBzTUBzTUBzTUBz -+TUBzTUBzTUBzTUBzTUBzTUD///+9q6Whh36hh36hh36hh36hh36hh36hh36hh36hh36pkoqhh379 -+/Pzi29jQw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw779/Pzv6+ri29jaz8ypkoqpkorQ -+w77n4d/i29ji29jn4d/i29ji29j8+/v7+vr18/L18/L39fT39fT18/L18/L18/L59/fn4d/Gt7K9 -+q6XQw7739fT39fTaz8z+/v7////////////////v6+r////v6+rGt7Lz8O7///////////////// -+///////////////////////////////////////9/PzQw77Gt7LGt7LQw77az8zi29j///////// -+//////////////////////////////////////////////////////////////////////////// -+///////////////////////////n4d/Qw77Gt7Laz8z9/Pz///////////////////////////// -+///////////////////////i29jr5uT///////////////////////////////////////////// -+///////////////////////////////////////////////////r5uT///////////////////8A -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////b0g+PAcARBIBQQ0ARBIBRBIB -+RBIBRBIBQQ0ARBIBQQ0ATBwN////mn92bUU5c01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01A -+////vaulmn92oYd+qZKKoYd+oYd+oYd+oYd+oYd+oYd+oYd+oYd+/fz84tvY0MO+0MO+0MO+0MO+ -+0MO+0MO+0MO+0MO+0MO+0MO+0MO+/fz87+vq4tvY5+Hf6+bk6+bk5+Hf4tvY4tvY4tvY4tvY4tvY -+4tvY/Pv7+vn59fPy9fPy9fPy9fPy9fPy9fPy9fPy9fPy+ff3/Pv7/fz8/v7+//////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAP///////////3NNQEENAEQSAUwcDUQSAUQSAUQSAUQSAUwcDUQSAUwcDUwc -+Df///5p/dm1FOXdSRndSRndSRndSRndSRndSRndSRndSRnNNQHdSRv///72rpaGHfqmSiqGHfqGH -+fqmSiqmSiqGHfqmSiqGHfqmSiqGHfv38/OLb2NDDvtrPzNDDvtDDvtDDvtDDvtDDvtDDvtDDvtDD -+vtDDvv38/O/r6uLb2Ofh3+Lb2OLb2OLb2Ofh3+Lb2OLb2OLb2OLb2OLb2Pz7+/r5+fXz8vXz8vXz -+8vXz8vXz8vXz8vXz8vXz8vXz8vXz8vXz8v39/f////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////v7//v7//v7//v7//v7//v7//v7//v7//v7//v7//v7//v7///////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////taGblHZtmn92mn92 -+mn92lHZtmn92mn92lHZtmn92mn92mn92////0MO+taGbtaGbvaultaGbvaulvaulvaulvaulvaul -+taGbvaul////5+Hf2s/M2s/M2s/M2s/M2s/M2s/M2s/M4tvY2s/M4tvY2s/M/fz8//////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAP///////////45wZ2U7Lm1FOW1FOW1FOW1FOW1FOW1FOW1FOW1F -+OW1FOXNNQP///7Whm5p/dqGHfqGHfpp/dqGHfqGHfpp/dqGHfpp/dqGHfqGHfv///9rPzNDDvtDD -+vtDDvtDDvtDDvtDDvtDDvsa3stDDvtDDvtDDvvz7+/////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAD///////////+OcGdzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUD///+9q6Waf3ah -+h36hh36hh36hh36hh36pkoqhh36pkoqhh36hh37////i29jQw77Qw77Qw77Qw77Qw77Qw77Qw77Q -+w77Qw77Qw77Qw778+/v////////////////9/Pz39fT39fT39fT7+vr///////////////////// -+///////////6+fn39fT39fT39fT9/f3////////////////////6+fnv6+rz8O7v6+rv6+r59/f/ -+///////////6+fn39fT59/fz8O79/Pz////+/v759/f39fT39fT59/f///////////////////// -+///7+vr39fT39fT39fT+/v7////////////////////////////7+vrv6+rz8O7v6+rz8O739fT/ -+///////////////////////////////////////////////////////////4+v/r8v/r8v/r8v/r -+8v/r8v/1+f/////////////////////////////////////////////////////+/v/y9v/r8v/r -+8v/r8v/y9v/8/f/////////////////////////////8/f/y9v/1+f/1+f/8/f////////////// -+///////////////////////////////1+f/r8v/r8v/r8v/r8v/1+f////////////////////// -+//////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////lHZtbUU5 -+c01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ad1JG////vauloYd+oYd+oYd+oYd+oYd+oYd+oYd+ -+oYd+oYd+oYd+oYd+////4tvY0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+/Pv7//// -+////////////2s/MVScYVScYVScYoYd+////////////////////////////////qZKKTBwNVScY -+XTEj5+Hf////////////+ff3oYd+ZTsuTBwNPAcAPAcAQQ0AXTEji2th0MO+/fz8d1JGVScYVScY -+bUU58/Du////9fPyd1JGTBwNVScYi2th////////////////////////qZKKVScYXTEjVScY6+bk -+////////////////////6+bkoYd+ZTsuTBwNPAcAPAcAPAcAVScYjnBnxrey//////////////// -+/////////////////////////P3/wtj/Toz/LHb/AFX/AFX/AFX/AFX/AFX/E2X/ZJr/q8n/+vz/ -+////////////////////////////////9fn/q8n/Toz/E2X/AFX/AFX/AFX/E2X/PoL/lLr/6/L/ -+////////////////////wtj/E2X/LHb/AFX/0+L///////////////////////////////////// -+q8n/ZJr/LHb/E2X/AFX/AFX/AFX/LHb/Toz/wtj/////////////////////////////AAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////45wZ29IPnNNQHNNQHNNQHNNQHNNQHNN -+QHNNQHNNQHNNQHNNQP///72rpZp/dqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfv///+Lb -+2NDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvvz7+////////////////9DDvjwHAEEN -+ADwHAJp/dv///////////////////////////////5p/djwHADwHAEQSAeLb2P////////Xz8m1F -+OTwHAEENAEENADwHADwHADwHADwHADwHAEwcDWU7LkwcDTwHADwHAKmSiv////////Pw7l0xIzwH -+ADwHAHdSRv///////////////////////6mSijwHAEENADwHAO/r6v///////////////8a3skwc -+DTwHADwHADwHADwHADwHADwHAEENADwHAEENAIZlW/n39////////////////////////////8LY -+/z6C/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/xNl/wBV/wBV/z6C/9Pi//////////////////// -+/////+vy/z6C/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/yx2/8LY/////////////////6vJ -+/wBV/wBV/wBV/8LY//////////////////////////////X5/3am/wBV/wBV/wBV/wBV/wBV/wBV -+/wBV/wBV/wBV/wBV/3am/////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAD///////////+Udm1tRTlzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUB3Ukb///+9 -+q6Whh36hh36hh36hh36hh36hh36hh36hh36hh36hh36hh37////i29jGt7LQw77Qw77Qw77Qw77Q -+w77Qw77Qw77Qw77Qw77Gt7L8+/v////////////////az8xBDQBEEgE8BwCaf3b///////////// -+//////////////////+af3ZBDQBBDQBMHA3i29j///////+pkoo8BwBEEgFBDQBVJxiOcGepkoqh -+h36GZVtEEgE8BwBBDQBEEgFEEgFEEgHaz8z////////z8O5lOy48BwA8BwB8WU3///////////// -+//////////+pkoo8BwBEEgE8BwDr5uT////////////Qw75MHA1BDQBBDQA8BwBlOy6OcGeaf3Z3 -+UkZEEgE8BwBEEgE8BwB8WU38+/v///////////////////+ryf8TZf8AVf8TZf8AVf8AVf8TZf8+ -+gv8+gv8+gv8TZf8AVf8AVf8AVf8AVf8TZf/C2P/////////////////y9v8sdv8AVf8AVf8AVf8T -+Zf9OjP92pv9kmv8sdv8AVf8AVf8AVf8TZf/C2P////////////+ryf8AVf8TZf8AVf/C2P////// -+//////////////////////92pv8AVf8AVf8AVf8AVf8+gv92pv9kmv8+gv8AVf8AVf8AVf8AVf92 -+pv////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// -+lHZtb0g+c01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01A////vaulmn92oYd+oYd+oYd+oYd+ -+oYd+oYd+oYd+oYd+oYd+oYd+////2s/M0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+ -+/Pv7////////////////2s/MPAcARBIBPAcAmn92////////////////////////////////oYd+ -+PAcAQQ0ATBwN4tvY////+/r6b0g+PAcAQQ0ATBwNxrey////////////////4tvYc01APAcARBIB -+QQ0AVScY6+bk////////8/DuZTsuPAcAPAcAd1JG////////////////////////oYd+PAcARBIB -+PAcA7+vq/////////fz8XTEjPAcARBIBQQ0AoYd++ff3/////////v7+2s/MZTsuPAcARBIBPAcA -+taGb////////////////0+L/E2X/AFX/E2X/AFX/E2X/q8n/6/L/9fn/+Pr/+Pr/4uz/q8n/E2X/ -+AFX/E2X/AFX/E2X/4uz/////////////dqb/AFX/E2X/AFX/PoL/4uz/////////////8vb/dqb/ -+AFX/AFX/AFX/PoL//f7/////////lLr/AFX/AFX/AFX/wtj/////////////////////////q8n/ -+AFX/AFX/AFX/E2X/q8n/////////////////q8n/E2X/AFX/AFX/AFX/wtj///////////////// -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////5R2bW9IPnNNQHNNQHNNQHNN -+QHNNQHNNQHNNQHNNQHNNQHdSRv///7Whm6GHfqGHfqGHfqmSiqGHfqGHfqGHfqGHfqGHfqGHfqGH -+fv///9rPzNDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvvz7+////////////////9DD -+vkENAEQSATwHAJp/dv///////////////////////////////5p/dkENAEENAEwcDeLb2P////n3 -+921FOTwHAEENAF0xI/Xz8v///////////////////+/r6kwcDUQSAUENAFUnGO/r6v////////Pw -+7mU7LkENADwHAHxZTf///////////////////////6mSijwHAEQSATwHAO/r6v///////72rpTwH -+AEQSATwHAI5wZ////////////////////////9rPzEwcDUQSAUENAGU7Lv7+/v///////////z6C -+/wBV/wBV/wBV/06M//X5/////////////////////////////+Ls/yx2/wBV/wBV/wBV/06M//// -+//////r8/yx2/wBV/wBV/xNl/+vy/////////////////////////z6C/wBV/wBV/wBV/8LY//// -+/////6vJ/wBV/xNl/wBV/8LY/////////////////////////06M/wBV/wBV/wBV/5S6//////// -+/////////////////5S6/wBV/wBV/wBV/2Sa/////////////////wAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAD///////////+Udm1tRTlzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBzTUBz -+TUD///+9q6Waf3apkoqhh36hh36hh36hh36hh36hh36pkoqhh36pkor////i29jGt7LQw77Qw77Q -+w77Qw77Qw77Qw77Qw77Qw77Qw77Qw778+/v////////////////az8xBDQBBDQA8BwCaf3b///// -+//////////////////////////+hh348BwBBDQBMHA3i29j///////+BX1U8BwBEEgFBDQCGZVvi -+29jr5uT8+/v///////////+La2E8BwBBDQBVJxjv6+r////////z8O5lOy5BDQA8BwB8WU3///// -+//////////////////+hh348BwBBDQA8BwDr5uT///////+OcGc8BwBEEgFEEgHaz8z///////// -+//////////////////98WU1BDQBBDQBEEgHv6+r////////C2P8AVf8AVf8AVf8TZf/y9v////// -+///////////////////////////////T4v8TZf8AVf8TZf8TZf/T4v/////C2P8AVf8AVf8AVf+U -+uv/////////////////////////////C2P8AVf8TZf8AVf92pv////////+ryf8AVf8AVf8AVf/C -+2P/////////////////////y9v8sdv8AVf8AVf8+gv/////////////////////////////+/v+r -+yf/T4v/r8v/6/P/+/v////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//// -+////////lHZtbUU5c01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ac01Ad1JG////taGboYd+oYd+qZKK -+oYd+oYd+oYd+oYd+qZKKoYd+oYd+oYd+////2s/M0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+ -+0MO+0MO+/Pv7////////////////0MO+QQ0ARBIBPAcAmn92//////////////////////////// -+////mn92QQ0AQQ0ATBwN4tvY////////2s/MTBwNPAcARBIBQQ0APAcAXTEjc01AgV9Vmn92xrey -+hmVbPAcAQQ0ATBwN7+vq////////8/DuZTsuQQ0APAcAfFlN////////////////////////oYd+ -+PAcARBIBPAcA7+vq////////d1JGPAcAPAcAXTEj7+vq////////////////////////////qZKK -+PAcARBIBQQ0A2s/M////////Toz/AFX/AFX/AFX/lLr///////////////////////////////// -+////////////ZJr/AFX/AFX/AFX/lLr/////lLr/AFX/E2X/AFX/q8n///////////////////// -+////////4uz/E2X/AFX/AFX/ZJr/////////q8n/AFX/E2X/AFX/wtj///////////////////// -+0+L/E2X/AFX/AFX/E2X/dqb/ZJr/dqb/ZJr/dqb/ZJr/ZJr/ZJr/dqb/dqb/ZJr/q8n///////// -+////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////5R2bXNNQHNNQHNN -+QHNNQHNNQHNNQHNNQHNNQHNNQHNNQHdSRv///72rpZp/dqmSiqGHfqGHfqGHfqGHfqGHfqGHfqGH -+fqGHfqGHfv///9rPzMa3stDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvvz7+/////////// -+/////9DDvkENAEQSATwHAJp/dv///////////////////////////////6GHfjwHAEENAEwcDeLb -+2P///////////9rPzGU7LjwHADwHADwHADwHADwHADwHADwHAEENAEQSAUQSAUENAFUnGO/r6v// -+//////Pw7mU7LjwHADwHAHxZTf///////////////////////6mSijwHAEQSATwHAOvm5P////38 -+/HNNQDwHAEENAF0xI+/r6v///////////////////////////72rpTwHAEQSAUQSAdrPzP////r8 -+/yx2/wBV/wBV/wBV/+Ls/////////////////////////////////////////////8LY/2Sa/6vJ -+/+Ls//r8/////5S6/wBV/wBV/xNl/8LY/////////////////////////////+vy/xNl/wBV/wBV -+/2Sa/////////6vJ/wBV/wBV/wBV/8LY/////////////////////+Ls/wBV/wBV/wBV/wBV/wBV -+/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/z6C//7//////////////wAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+Udm1tRTlzTUBzTUBzTUBzTUBzTUBzTUBzTUBz -+TUBzTUB3Ukb///+9q6Whh36hh36hh36hh36hh36hh36hh36hh36hh36hh36hh37////i29jQw77Q -+w77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw778+/v////////////////Qw75BDQBEEgE8BwCa -+f3b///////////////////////////////+hh348BwBBDQBMHA3i29j////////////////59/fQ -+w76Udm13UkZdMSNMHA1BDQBBDQBBDQBBDQBEEgFBDQBVJxjv6+r////////z8O5lOy5BDQA8BwB3 -+Ukb///////////////////////+hh35BDQBBDQA8BwDv6+r///////93UkY8BwA8BwBdMSPv6+r/ -+//////////////////////////+pkoo8BwBBDQBBDQDaz8z////i7P8TZf8AVf8AVf8sdv/y9v// -+//////////////////////////////////////////////////////////////////+Uuv8AVf8A -+Vf8AVf+ryf/////////////////////////////i7P8AVf8AVf8AVf9kmv////////+ryf8AVf8A -+Vf8AVf/C2P/////////////////////i7P8TZf8AVf8AVf8AVf8AVf8AVf8AVf8TZf8AVf8AVf8A -+Vf8AVf8AVf8TZf8AVf9kmv////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAA//////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////////v7+/f39/f39/f39/f39/f39/f39/f39 -+/f39/f39/f39/f39////////////////////2s/MQQ0AQQ0APAcAmn92//////////////////// -+////////////oYd+PAcAQQ0ATBwN4tvY////////8/Du4tvY2s/M2s/M+ff3/////fz8+vn57+vq -+0MO+taGbZTsuQQ0AQQ0ATBwN7+vq////////8/DuXTEjPAcAQQ0AZTsu+ff3//////////////// -+////qZKKPAcARBIBPAcA6+bk////////jnBnPAcARBIBQQ0A2s/M//////////////////////// -+////fFlNQQ0ARBIBRBIB7+vq////0+L/AFX/E2X/AFX/Toz///////////////////////////// -+////////////////////////////////////////////wtj/AFX/AFX/AFX/dqb///////////// -+////////////////q8n/AFX/AFX/AFX/dqb/////////q8n/AFX/AFX/AFX/lLr///////////// -+////////8vb/LHb/AFX/AFX/LHb/wtj/wtj/0+L/wtj/0+L/0+L/0+L/lLr/AFX/AFX/AFX/dqb/ -+////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////8a3sr2r -+pb2rpb2rpb2rpb2rpb2rpb2rpb2rpb2rpb2rpb2rpf///+fh39rPzOLb2NrPzOLb2OLb2NrPzOLb -+2NrPzNrPzOLb2NrPzP7+/f////////////////////////////////////////////////////// -+/////////////9DDvkENAEQSATwHAJp/dv///////////////////////////////5p/dkENAEEN -+AEwcDeLb2P///////7Whm0wcDUQSATwHAMa3sv///////////////////////5R2bTwHAEQSAVUn -+GOvm5P////////Pw7mU7LkENAEENAEQSAdDDvv///////////////////45wZzwHAEQSATwHAO/r -+6v///////8a3sjwHAEQSATwHAIFfVf///////////////////////9DDvkwcDUQSATwHAHNNQP// -+/////8LY/wBV/wBV/wBV/06M//////////////////////////////////////////////////// -+//////////////////////7//xNl/wBV/wBV/xNl/+Ls//////////////////////j6/z6C/wBV -+/wBV/wBV/9Pi/////////6vJ/wBV/xNl/wBV/yx2//7+/////////////////////2Sa/wBV/xNl -+/wBV/5S6/////////////////////////2Sa/wBV/wBV/wBV/8LY/////////////////wAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+pkoqaf3aaf3ahh36af3aaf3aaf3ah -+h36hh36af3aaf3ahh37////i29jGt7LQw77Qw77Gt7LQw77Gt7LQw77Qw77Qw77Gt7LQw779/f3/ -+///////////////////////////////////////////////////////////////////Qw75BDQBE -+EgE8BwCaf3b///////////////////////////////+af3ZBDQBBDQBMHA3i29j////////i29hM -+HA08BwBBDQBVJxjaz8z9/f3////////9/PzGt7JMHA1EEgFBDQBdMSP8+/v////////z8O5lOy48 -+BwBEEgFBDQBdMSPGt7L18/L////8+/u9q6VMHA1BDQBBDQBVJxjv6+r////////+/v1lOy5BDQBE -+EgFBDQCOcGfr5uT////////6+fm9q6VMHA1BDQBBDQA8BwDGt7L////////T4v8sdv8AVf8AVf8+ -+gv/1+f////////////////////////////////////////////////////////////////////// -+//+Uuv8AVf8AVf8AVf8sdv/C2P/+/v/////////T4v8+gv8AVf8AVf8AVf9OjP////////////+U -+uv8AVf8AVf8AVf8AVf9OjP/C2P/C2P9kmv+ryf/////T4v8TZf8AVf8AVf8TZf+Uuv/4+v////// -+///i7P92pv8AVf8AVf8AVf8+gv////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAA////////////vaulmn92oYd+oYd+oYd+oYd+oYd+oYd+oYd+qZKKoYd+qZKK//// -+2s/M0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+/f39//////////////////////// -+////////////////////////////////////////////2s/MQQ0ARBIBPAcAmn92//////////// -+////////////////////oYd+PAcAQQ0ATBwN4tvY////////////mn92PAcAQQ0AQQ0ARBIBbUU5 -+c01Ac01AZTsuTBwNQQ0ARBIBPAcAjnBn////////////8/DuZTsuQQ0AQQ0AQQ0APAcATBwNXTEj -+bUU5ZTsuRBIBQQ0AQQ0APAcAjnBn////////////////0MO+TBwNPAcARBIBPAcAVScYbUU5c01A -+ZTsuQQ0ARBIBQQ0APAcAmn92////////////6/L/E2X/AFX/AFX/E2X/4uz///////////////// -+////////////////////////////////////////////////////////+Pr/Toz/AFX/AFX/AFX/ -+AFX/LHb/Toz/PoL/E2X/AFX/AFX/AFX/E2X/4uz/////////////q8n/AFX/AFX/AFX/AFX/AFX/ -+AFX/AFX/AFX/PoL/+vz/////lLr/AFX/AFX/AFX/AFX/LHb/PoL/PoL/LHb/AFX/AFX/AFX/E2X/ -+4uz/////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////// -+/7Whm6GHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfv///9rPzNDDvtDDvtDDvtDDvtDD -+vtDDvtDDvtDDvtDDvtDDvtDDvv39/f////////////////////////////////////////////// -+/////////////////////9DDvkENAEENAEENAJp/dv///////////////////////////////5p/ -+djwHADwHAEQSAeLb2P////////////n395R2bUENADwHAEENADwHADwHADwHADwHAEENAEENADwH -+AG1FOfXz8v////////////Pw7mU7LjwHAEENAF0xI0wcDTwHADwHADwHADwHAEENAEENADwHAG9I -+Pu/r6v///////////////////9DDvmU7LjwHADwHAEENADwHADwHADwHAEENADwHAEQSAaGHfv// -+/////////////////06M/wBV/wBV/wBV/6vJ//////////////////////////////////////// -+/////5S6/3am/6vJ/9Pi//j6//////////////X5/2Sa/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV -+/wBV/z6C/+Ls/////////////////6vJ/wBV/wBV/xNl/xNl/wBV/wBV/wBV/wBV/wBV/8LY//// -+/////6vJ/xNl/wBV/wBV/wBV/wBV/wBV/wBV/wBV/wBV/yx2/8LY//////////////////////// -+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+9q6Waf3apkoqhh36hh36h -+h36hh36hh36hh36hh36hh36hh37////i29jQw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Q -+w779/f3////////////////////////////////////////////////////////////////////a -+z8w8BwBEEgE8BwCaf3b///////////////////////////////+1oZtzTUBzTUB8WU3r5uT///// -+///////////////az8yUdm1lOy5MHA1VJxhMHA1MHA1VJxhtRTm1oZvz8O7////////////////3 -+9fSLa2FzTUBzTUC1oZvaz8yBX1VVJxhMHA1MHA1VJxhtRTm1oZv18/L///////////////////// -+///////39fS1oZt3UkZMHA1MHA1MHA1MHA1dMSOUdm3i29j///////////////////////+ryf8A -+Vf8TZf8AVf8sdv/9/v/////////////////////////////////////i7P8TZf8AVf8AVf8sdv/i -+7P/////////////////9/v/C2P9kmv8sdv8TZf8TZf8TZf8TZf8+gv/C2P/4+v////////////// -+//////+ryf9OjP8+gv9kmv/T4v8+gv8AVf8TZf8TZf9kmv/i7P/////////////i7P+Uuv8sdv8T -+Zf8TZf8TZf8TZf8+gv+ryf/y9v////////////////////////////8AAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAA////////////taGboYd+oYd+oYd+oYd+oYd+oYd+oYd+oYd+oYd+oYd+ -+qZKK////2s/M0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+/f39//////////////// -+////////////////////////////////////////////////////2s/MQQ0AQQ0APAcAmn92//// -+//////////////////////////////////////////////////////////////////////////// -+////8/Du5+Hf6+bk6+bk+ff3//////////////////////////////////////////////////// -+/////f396+bk5+Hf8/Du/////////////////////////////////////////////////////f39 -+6+bk6+bk8/Du////////////////////////////////////+vz/LHb/AFX/E2X/AFX/ZJr///// -+////////////////////////////+Pr/Toz/AFX/AFX/AFX/PoL///////////////////////// -+/////////v7/4uz/4uz/4uz/+vz///////////////////////////////////////////////// -+////////6/L/4uz/+vz/////////////////////////////////6/L/4uz/4uz/8vb///////// -+////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// -+/////////72rpZp/dqGHfqGHfqGHfqmSiqGHfqGHfqGHfqGHfqGHfqGHfv///+Lb2NDDvtDDvtDD -+vtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvv39/f////////////////////////////////////// -+//Xz8u/r6vPw7u/r6vPw7u/r6vXz8sa3skENAEQSATwHAJR2bfXz8u/r6u/r6u/r6vPw7u/r6u/r -+6v///9DDvqGHfqGHfqmSiu/r6v////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////8LY/xNl/wBV/wBV/wBV/z6C/9Pi//L2//3+//////////j6 -+/9Pi/06M/wBV/wBV/wBV/wBV/9Pi//////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+1oZuhh36hh36h -+h36hh36hh36hh36hh36hh36hh36hh36pkor////az8zQw77Qw77Qw77Qw77Qw77Qw77Qw77Qw77Q -+w77Qw77Qw779/f3///////////////////////////////////////+hh35MHA1MHA1VJxhVJxhM -+HA1VJxhMHA1EEgFEEgFEEgFMHA1VJxhVJxhVJxhVJxhVJxhVJxhVJxj///+af3Y8BwA8BwBBDQDi -+29j///////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////+ryf8TZf8AVf8TZf8AVf8AVf8sdv9OjP9kmv9kmv8+gv8AVf8AVf8AVf8AVf8AVf+r -+yf////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////8AAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////vaulmn92oYd+qZKKoYd+oYd+oYd+oYd+oYd+ -+oYd+oYd+qZKK////2s/M0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+/f39//////// -+////////////////////////////////lHZtPAcAQQ0APAcAPAcAPAcAPAcAPAcAQQ0AQQ0AQQ0A -+PAcAPAcAPAcAPAcAPAcAPAcAPAcAPAcA////mn92PAcAPAcATBwN4tvY//////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////////////////////////wtj/PoL/ -+AFX/AFX/AFX/AFX/AFX/AFX/AFX/AFX/AFX/AFX/AFX/E2X/q8n///////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAP///////////7Whm6GHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfqGHfv///+Lb2NDD -+vtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvtDDvv39/f////////////////////////////// -+/////////6GHflUnGFUnGF0xI10xI1UnGF0xI1UnGFUnGFUnGFUnGF0xI1UnGF0xI1UnGFUnGF0x -+I1UnGFUnGP///6mSilUnGF0xI10xI+fh3/////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////z9/8LY/2Sa/yx2/wBV/wBV/wBV -+/wBV/wBV/wBV/yx2/3am/+vy//////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////+1oZua -+f3ahh36hh36pkoqhh36hh36hh36hh36hh36hh36hh37////az8zGt7LQw77Qw77Qw77Qw77Qw77Q -+w77Qw77Qw77Qw77Qw779/f3////////////////////////////////////////6+fn39fT39fT3 -+9fT39fT39fT39fT39fT39fT39fT39fT39fT39fT39fT39fT39fT39fT39fT39fT////7+vr39fT3 -+9fT39fT9/f3///////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+///////////////////////////////////////1+f/i7P/C2P+ryf/C2P/C2P/i7P/6/P////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////8AAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////taGboYd+oYd+oYd+oYd+oYd+oYd+ -+oYd+oYd+oYd+oYd+oYd+////2s/M0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+0MO+/f39 -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAP////////////39/f38/P38/P38/P38/P38/P38/P38/P38/P38/P38/P38/P// -+//39/f38/P38/P38/P38/P38/P38/P38/P38/P38/P38/P38/P////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// -+///z8O7r5uTr5uTr5uTr5uTv6+rr5uTv6+rr5uTv6+rr5uTr5uT///////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////5+Hf4tvY4tvY4tvY4tvY -+4tvY4tvY4tvY4tvY4tvY4tvY4tvY//////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAP///////////+fh3+Lb2OLb2OLb2OLb2Ofh3+Lb2OLb2OLb2OLb2OLb -+2OLb2P////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ -+///////////r5uTi29ji29ji29ji29ji29ji29jn4d/i29ji29ji29jn4d////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////5+Hf4tvY4tvY -+4tvY4tvY4tvY5+Hf4tvY5+Hf4tvY4tvY4tvY//////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////////////////////AAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////+vm5OLb2OLb2OLb2OLb2OLb2OLb2Ofh3+Lb -+2Ofh3+Lb2OLb2P////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAD////////////n4d/i29ji29ji29ji29ji29ji29ji29ji29ji29ji29ji29j///////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////6+bk -+4tvY4tvY4tvY4tvY4tvY4tvY4tvY4tvY5+Hf4tvY4tvY//////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////////////////////////////////////////////////////////////////AAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////+fh3+Lb2OLb2OLb2OLb2Ofh3+Lb -+2Ofh3+Lb2OLb2OLb2OLb2P////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAD////////////r5uTi29ji29jn4d/i29ji29jn4d/i29ji29ji29ji29ji29j/ -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// -+////5+Hf4tvY4tvY4tvY5+Hf4tvY4tvY4tvY4tvY4tvY4tvY5+Hf//////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////+vm5OLb2OLb2OLb2OLb -+2OLb2OLb2OLb2OLb2OLb2OLb2OLb2P////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAD////////////9/f39/Pz9/Pz9/Pz9/Pz9/Pz9/Pz9/Pz9/Pz9/Pz9 -+/Pz9/Pz///////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+/////////////////////////////////////////////////////////////////wAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -diff --git a/MdeModulePkg/Logo/Logo-OpenSSL.idf b/MdeModulePkg/Logo/Logo-OpenSSL.idf -new file mode 100644 -index 0000000000..e527cff79b ---- /dev/null -+++ b/MdeModulePkg/Logo/Logo-OpenSSL.idf -@@ -0,0 +1,15 @@ -+// /** @file -+// Platform Logo image definition file. -+// -+// Copyright (c) 2016, Intel Corporation. All rights reserved.
-+// -+// This program and the accompanying materials -+// are licensed and made available under the terms and conditions of the BSD License -+// which accompanies this distribution. The full text of the license may be found at -+// http://opensource.org/licenses/bsd-license.php -+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -+// -+// **/ -+ -+#image IMG_LOGO Logo-OpenSSL.bmp -diff --git a/MdeModulePkg/Logo/LogoOpenSSLDxe.inf b/MdeModulePkg/Logo/LogoOpenSSLDxe.inf -new file mode 100644 -index 0000000000..2f79d873e2 ---- /dev/null -+++ b/MdeModulePkg/Logo/LogoOpenSSLDxe.inf -@@ -0,0 +1,61 @@ -+## @file -+# The default logo bitmap picture shown on setup screen. -+# -+# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
-+# -+# This program and the accompanying materials -+# are licensed and made available under the terms and conditions of the BSD License -+# which accompanies this distribution. The full text of the license may be found at -+# http://opensource.org/licenses/bsd-license.php -+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -+# -+# -+## -+ -+[Defines] -+ INF_VERSION = 0x00010005 -+ BASE_NAME = LogoOpenSSLDxe -+ MODULE_UNI_FILE = LogoOpenSSLDxe.uni -+ FILE_GUID = 9CAE7B89-D48D-4D68-BBC4-4C0F1D48CDFF -+ MODULE_TYPE = DXE_DRIVER -+ VERSION_STRING = 1.0 -+ -+ ENTRY_POINT = InitializeLogo -+# -+# This flag specifies whether HII resource section is generated into PE image. -+# -+ UEFI_HII_RESOURCE_SECTION = TRUE -+ -+# -+# The following information is for reference only and not required by the build tools. -+# -+# VALID_ARCHITECTURES = IA32 X64 -+# -+ -+[Sources] -+ Logo-OpenSSL.bmp -+ Logo.c -+ Logo-OpenSSL.idf -+ -+[Packages] -+ MdeModulePkg/MdeModulePkg.dec -+ MdePkg/MdePkg.dec -+ -+[LibraryClasses] -+ UefiBootServicesTableLib -+ UefiDriverEntryPoint -+ DebugLib -+ -+[Protocols] -+ gEfiHiiDatabaseProtocolGuid ## CONSUMES -+ gEfiHiiImageExProtocolGuid ## CONSUMES -+ gEfiHiiPackageListProtocolGuid ## PRODUCES CONSUMES -+ gEdkiiPlatformLogoProtocolGuid ## PRODUCES -+ -+[Depex] -+ gEfiHiiDatabaseProtocolGuid AND -+ gEfiHiiImageExProtocolGuid -+ -+[UserExtensions.TianoCore."ExtraFiles"] -+ LogoDxeExtra.uni -diff --git a/MdeModulePkg/Logo/LogoOpenSSLDxe.uni b/MdeModulePkg/Logo/LogoOpenSSLDxe.uni -new file mode 100644 -index 0000000000..7227ac3910 ---- /dev/null -+++ b/MdeModulePkg/Logo/LogoOpenSSLDxe.uni -@@ -0,0 +1,22 @@ -+// /** @file -+// The logo bitmap picture (with OpenSSL advertisment) shown on setup screen. -+// -+// This module provides the logo bitmap picture (with OpenSSL advertisment) -+// shown on setup screen, through EDKII Platform Logo protocol. -+// -+// Copyright (c) 2016, Intel Corporation. All rights reserved.
-+// -+// This program and the accompanying materials -+// are licensed and made available under the terms and conditions of the BSD License -+// which accompanies this distribution. The full text of the license may be found at -+// http://opensource.org/licenses/bsd-license.php -+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -+// -+// **/ -+ -+ -+#string STR_MODULE_ABSTRACT #language en-US "Provides the logo bitmap picture (with OpenSSL advertisment) shown on setup screen." -+ -+#string STR_MODULE_DESCRIPTION #language en-US "This module provides the logo bitmap picture (with OpenSSL advertisment) shown on setup screen, through EDKII Platform Logo protocol." -+ -diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index fce6051e47..2886c10b1b 100644 ---- a/OvmfPkg/OvmfPkgIa32.dsc -+++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -755,7 +755,11 @@ - NULL|OvmfPkg/Csm/LegacyBootManagerLib/LegacyBootManagerLib.inf - !endif - } -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) -+ MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - MdeModulePkg/Logo/LogoDxe.inf -+!endif - MdeModulePkg/Application/UiApp/UiApp.inf { - - NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf -diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf -index 2b9a6b5801..6e1e7f5f44 100644 ---- a/OvmfPkg/OvmfPkgIa32.fdf -+++ b/OvmfPkg/OvmfPkgIa32.fdf -@@ -297,7 +297,11 @@ INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf - !endif - INF ShellPkg/Application/Shell/Shell.inf - -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) -+INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - INF MdeModulePkg/Logo/LogoDxe.inf -+!endif - - # - # Network modules -diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 983eebfaa7..5a9e9a707a 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.dsc -+++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -769,7 +769,11 @@ - NULL|OvmfPkg/Csm/LegacyBootManagerLib/LegacyBootManagerLib.inf - !endif - } -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) -+ MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - MdeModulePkg/Logo/LogoDxe.inf -+!endif - MdeModulePkg/Application/UiApp/UiApp.inf { - - NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf -diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf -index 83ff6aef2e..1fab3d5014 100644 ---- a/OvmfPkg/OvmfPkgIa32X64.fdf -+++ b/OvmfPkg/OvmfPkgIa32X64.fdf -@@ -298,7 +298,11 @@ INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf - !endif - INF ShellPkg/Application/Shell/Shell.inf - -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) -+INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - INF MdeModulePkg/Logo/LogoDxe.inf -+!endif - - # - # Network modules -diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index ea62b82ff7..70c2c3e3b9 100644 ---- a/OvmfPkg/OvmfPkgX64.dsc -+++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -765,7 +765,11 @@ - NULL|OvmfPkg/Csm/LegacyBootManagerLib/LegacyBootManagerLib.inf - !endif - } -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) -+ MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - MdeModulePkg/Logo/LogoDxe.inf -+!endif - MdeModulePkg/Application/UiApp/UiApp.inf { - - NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf -diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf -index 8da59037e5..6dc48977a0 100644 ---- a/OvmfPkg/OvmfPkgX64.fdf -+++ b/OvmfPkg/OvmfPkgX64.fdf -@@ -307,7 +307,11 @@ INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf - !endif - INF ShellPkg/Application/Shell/Shell.inf - -+!if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) -+INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf -+!else - INF MdeModulePkg/Logo/LogoDxe.inf -+!endif - - # - # Network modules diff --git a/0016-BaseTools-do-not-build-BrotliCompress-RH-only.patch b/0007-BaseTools-do-not-build-BrotliCompress-RH-only.patch similarity index 61% rename from 0016-BaseTools-do-not-build-BrotliCompress-RH-only.patch rename to 0007-BaseTools-do-not-build-BrotliCompress-RH-only.patch index 8c7eb44..0a9aeb5 100644 --- a/0016-BaseTools-do-not-build-BrotliCompress-RH-only.patch +++ b/0007-BaseTools-do-not-build-BrotliCompress-RH-only.patch @@ -1,7 +1,7 @@ -From cab35d13e43ef37e746befaa1f3c8200edf4e420 Mon Sep 17 00:00:00 2001 +From db8ccca337e2c5722c1d408d2541cf653d3371a2 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 4 Jun 2020 13:34:12 +0200 -Subject: [PATCH] BaseTools: do not build BrotliCompress (RH only) +Subject: BaseTools: do not build BrotliCompress (RH only) Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: @@ -18,8 +18,7 @@ Do not attempt to build BrotliCompress. Signed-off-by: Laszlo Ersek --- BaseTools/Source/C/GNUmakefile | 1 - - MdeModulePkg/MdeModulePkg.dec | 1 - - 2 files changed, 2 deletions(-) + 1 file changed, 1 deletion(-) diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index df4eb64ea9..52777eaff1 100644 @@ -33,15 +32,6 @@ index df4eb64ea9..52777eaff1 100644 VfrCompile \ EfiRom \ GenFfs \ -diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec -index e562bed57e..7367adbaa3 100644 ---- a/MdeModulePkg/MdeModulePkg.dec -+++ b/MdeModulePkg/MdeModulePkg.dec -@@ -25,7 +25,6 @@ - Include - - [Includes.Common.Private] -- Library/BrotliCustomDecompressLib/brotli/c/include - - [LibraryClasses] - ## @libraryclass Defines a set of methods to reset whole system. +-- +2.18.4 + diff --git a/0008-MdeModulePkg-remove-package-private-Brotli-include-p.patch b/0008-MdeModulePkg-remove-package-private-Brotli-include-p.patch new file mode 100644 index 0000000..ee1f329 --- /dev/null +++ b/0008-MdeModulePkg-remove-package-private-Brotli-include-p.patch @@ -0,0 +1,43 @@ +From e05e0de713c4a2b8adb6ff9809611f222bfe50ed Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Thu, 4 Jun 2020 13:39:08 +0200 +Subject: MdeModulePkg: remove package-private Brotli include path (RH only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- New patch. + +Originating from upstream commit 58802e02c41b +("MdeModulePkg/BrotliCustomDecompressLib: Make brotli a submodule", +2020-04-16), "MdeModulePkg/MdeModulePkg.dec" contains a package-internal +include path into a Brotli submodule. + +The edk2 build system requires such include paths to resolve successfully, +regardless of the firmware platform being built. Because +BrotliCustomDecompressLib is not consumed by any OvmfPkg or ArmVirtPkg +platforms, and we've removed the submodule earlier in this patch set, +remove the include path too. + +Signed-off-by: Laszlo Ersek +--- + MdeModulePkg/MdeModulePkg.dec | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec +index 4f44af6948..031043ec28 100644 +--- a/MdeModulePkg/MdeModulePkg.dec ++++ b/MdeModulePkg/MdeModulePkg.dec +@@ -24,9 +24,6 @@ + [Includes] + Include + +-[Includes.Common.Private] +- Library/BrotliCustomDecompressLib/brotli/c/include +- + [LibraryClasses] + ## @libraryclass Defines a set of methods to reset whole system. + ResetSystemLib|Include/Library/ResetSystemLib.h +-- +2.18.4 + diff --git a/0009-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch b/0009-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch new file mode 100644 index 0000000..472e4ae --- /dev/null +++ b/0009-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch @@ -0,0 +1,614 @@ +From cee80878b19e51d9b3c63335c681f152dcc59764 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 11 Jun 2014 23:33:33 +0200 +Subject: advertise OpenSSL on TianoCore splash screen / boot logo (RHEL only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- Replace the open-coded BSDL with "SPDX-License-Identifier: + BSD-2-Clause-Patent" in the following files: + + - MdeModulePkg/Logo/Logo-OpenSSL.idf + - MdeModulePkg/Logo/LogoOpenSSLDxe.inf + - MdeModulePkg/Logo/LogoOpenSSLDxe.uni + + (This should have been done in the previous rebase, because the same + license block changes had been applied to MdeModulePkg/Logo/ in upstream + commit 9d510e61fcee ("MdeModulePkg: Replace BSD License with BSD+Patent + License", 2019-04-09), part of tag edk2-stable201905.) + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- trivial context update (performed silently by git-cherry-pick) for + upstream commit 3207a872a405 ("OvmfPkg: Update DSC/FDF files to consume + CSM components in OvmfPkg", 2019-06-14) + +- A note for the future: the logo could change completely in a subsequent + rebase. See (in + CONFIRMED status at the time of writing). + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- Upstream edk2 removed the obsoleted network drivers in MdeModulePkg. The + OvmfPkg platforms were adapted in commit d2f1f6423bd1 ("OvmfPkg: Replace + obsoleted network drivers from platform DSC/FDF.", 2018-11-06). The + ArmVirtPkg platforms were adapted in commit 9a67ba261fe9 ("ArmVirtPkg: + Replace obsoleted network drivers from platform DSC/FDF.", 2018-12-14). + + Consequently, because the NetworkPkg iSCSI driver requires OpenSSL + unconditionally, as explained in + , this patch now + builds LogoOpenSSLDxe unconditionally, squashing and updating previous + downstream commits + + - 8e8ea8811e26 advertise OpenSSL on TianoCore splash screen / boot logo + (RHEL only) + - 02ed2c501cdd advertise OpenSSL due to IPv6 enablement too (RHEL only) + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- Adapted to upstream 25184ec33c36 ("MdeModulePkg/Logo.idf: Remove + incorrect comments.", 2018-02-28) + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- After picking previous downstream-only commit 32192c62e289, carry new + upstream commit e01e9ae28250 ("MdeModulePkg/LogoDxe: Add missing + dependency gEfiHiiImageExProtocolGuid", 2017-03-16) over to + "LogoOpenSSLDxe.inf". + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- For more fun, upstream completely changed the way logo bitmaps are + embedded in the firmware binary (see for example commit ab970515d2c6, + "OvmfPkg: Use the new LogoDxe driver", 2016-09-26). Therefore in this + rebase, we reimplement the previous downstream-only commit e775fb20c999, + as described below. + +- Beyond the new bitmap file (which we preserve intact from the last + downstream branch), we introduce: + + - a new IDF (image description file) referencing the new BMP, + + - a new driver INF file, referencing the new BMP and new IDF (same C + source code though), + + - a new UNI (~description) file for the new driver INF file. + +- In the OVMF DSC and FDF files, we select the new driver INF for + inclusion if either SECURE_BOOT_ENABLE or TLS_ENABLE is set, as they + both make use of OpenSSL (although different subsets of it). + +- In the AAVMF DSC and FDF files, we only look at SECURE_BOOT_ENABLE, + because the ArmVirtQemu platform does not support TLS_ENABLE yet. + +- This patch is best displayed with "git show --find-copies-harder". + +Notes about the d7c0dfa -> 90bb4c5 rebase: + +- squash in the following downstream-only commits (made originally for + ): + + - eef9eb0 restore TianoCore splash logo without OpenSSL advertisment + (RHEL only) + + - 25842f0 OvmfPkg, ArmVirtPkg: show OpenSSL-less logo without Secure + Boot (RH only) + + The reason is that ideas keep changing when and where to include the + Secure Boot feature, so the logo must be controllable directly on the + build command line, from the RPM spec file. See the following + references: + + - https://post-office.corp.redhat.com/mailman/private/virt-devel/2016-March/msg00253.html + - https://post-office.corp.redhat.com/mailman/private/virt-devel/2016-April/msg00118.html + - https://bugzilla.redhat.com/show_bug.cgi?id=1323363 + +- This squashed variant should remain the final version of this patch. + +Notes about the c9e5618 -> b9ffeab rebase: +- AAVMF gained Secure Boot support, therefore the logo is again modified + in the common location, and no FDF changes are necessary. + +Notes about the 9ece15a -> c9e5618 rebase: +- Logo.bmp is no longer modified in-place; instead a modified copy is + created. That's because AAVMF includes the logo too, but it doesn't + include OpenSSL / Secure Boot, so we need the original copy too. + +Because we may include the OpenSSL library in our OVMF and AAVMF builds +now, we should advertise it as required by its license. This patch takes +the original TianoCore logo, shifts it up by 20 pixels, and adds the +horizontally centered message + + This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/) + +below. + +Logo-OpenSSL.bmp: PC bitmap, Windows 3.x format, 469 x 111 x 24 +Logo.bmp: PC bitmap, Windows 3.x format, 193 x 58 x 8 + +Downstream only because upstream edk2 does not intend to release a +secure-boot-enabled OVMF build. (However the advertising requirement in +the OpenSSL license, +"CryptoPkg/Library/OpensslLib/openssl-1.0.2*/LICENSE", has been discussed +nonetheless, which is why I'm changing the logo.) + +Signed-off-by: Laszlo Ersek +(cherry picked from commit 32192c62e289f261f5ce74acee48e5a94561f10b) +(cherry picked from commit 33a710cd613c2ca7d534b8401e2f9f2178af05be) +(cherry picked from commit 0b2d90347cb016cc71c2de62e941a2a4ab0f35a3) +(cherry picked from commit 8e8ea8811e269cdb31103c70fcd91d2dcfb1755d) +(cherry picked from commit 727c11ecd9f34990312e14f239e6238693619849) +(cherry picked from commit 740d239222c2656ae8eeb2d1cc4802ce5b07f3d2) +--- + ArmVirtPkg/ArmVirtQemu.dsc | 2 +- + ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 2 +- + ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 +- + MdeModulePkg/Logo/Logo-OpenSSL.bmp | Bin 0 -> 156342 bytes + MdeModulePkg/Logo/Logo-OpenSSL.idf | 10 +++++ + MdeModulePkg/Logo/LogoOpenSSLDxe.inf | 56 +++++++++++++++++++++++++++ + MdeModulePkg/Logo/LogoOpenSSLDxe.uni | 17 ++++++++ + OvmfPkg/OvmfPkgIa32.dsc | 2 +- + OvmfPkg/OvmfPkgIa32.fdf | 2 +- + OvmfPkg/OvmfPkgIa32X64.dsc | 2 +- + OvmfPkg/OvmfPkgIa32X64.fdf | 2 +- + OvmfPkg/OvmfPkgX64.dsc | 2 +- + OvmfPkg/OvmfPkgX64.fdf | 2 +- + 13 files changed, 92 insertions(+), 9 deletions(-) + create mode 100644 MdeModulePkg/Logo/Logo-OpenSSL.bmp + create mode 100644 MdeModulePkg/Logo/Logo-OpenSSL.idf + create mode 100644 MdeModulePkg/Logo/LogoOpenSSLDxe.inf + create mode 100644 MdeModulePkg/Logo/LogoOpenSSLDxe.uni + +diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc +index 3f649c91d8..360094ab6a 100644 +--- a/ArmVirtPkg/ArmVirtQemu.dsc ++++ b/ArmVirtPkg/ArmVirtQemu.dsc +@@ -424,7 +424,7 @@ + MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf + MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf + MdeModulePkg/Universal/BdsDxe/BdsDxe.inf +- MdeModulePkg/Logo/LogoDxe.inf ++ MdeModulePkg/Logo/LogoOpenSSLDxe.inf + MdeModulePkg/Application/UiApp/UiApp.inf { + + NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf +diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +index a2f4bd62c8..9b94043085 100644 +--- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc ++++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +@@ -193,7 +193,7 @@ READ_LOCK_STATUS = TRUE + # + # TianoCore logo (splash screen) + # +- INF MdeModulePkg/Logo/LogoDxe.inf ++ INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + + # + # Ramdisk support +diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc +index 2a6fd6bc06..d186263e18 100644 +--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc ++++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc +@@ -363,7 +363,7 @@ + MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf + MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf + MdeModulePkg/Universal/BdsDxe/BdsDxe.inf +- MdeModulePkg/Logo/LogoDxe.inf ++ MdeModulePkg/Logo/LogoOpenSSLDxe.inf + MdeModulePkg/Application/UiApp/UiApp.inf { + + NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf +diff --git a/MdeModulePkg/Logo/Logo-OpenSSL.bmp b/MdeModulePkg/Logo/Logo-OpenSSL.bmp +new file mode 100644 +index 0000000000000000000000000000000000000000..4af5740232ce484a939a5852604e35711ea88a29 +GIT binary patch +literal 156342 +zcmeI5d(>~$xW~&aw_M64NYZ7LkVerMIgB$pYT%5)88Oa?KguvP +zI4QXdhfYMHh=?MQLQ0BCrP`(4zMRjyzxCbEZ>}}xTJLYa@9y1uKfkf|+RvQxna_OY +zcg^)(&zft#YrS&!|2yzL>&^VO;olbgyJY?K);pa4*I#cF_W4_@5Lmu^`C8SVd%H7l +zd)wQ-|NZYj=s^#f&XKk6aIEP)deoyH_4&_#{_lVP`%O39^p&rC<)truY4^x-xPS12 +zA8_cqMVXTbv=CU+PmfmLR(siwJMQ?$KmPI2kAC#jEw6otV@>bT_rCYN4}IuEk9fo* +z9`Jw%JnwnW`{56N_@4K?r+a)K^O(n6am5v{dey7CMVXTbR1sLyPmgNHR(rvH?sK2t +z{N^`rdefU$rRBBnaIEP)+Is7)?{~lZ`Iv68#THy*os7a;-tv}T|N7VKug`SBI`Auw +z>$~3du0Q?hPm32XzWnmb4?g%{15l_rUji4jU;gr!cieHu#TQ?^!wx%KcinZIMHId8 +zg)jW^kAJ*q(W0AgzWJNq{N|IN{Nz{>pwXu-Zb?o%?X;&ns#NVBjEGTfBy4FKl;%d-}uI8v#o%s?k`p^WRzo0Z5W`_D6$a? +zvU$J(2b_EExet8c17m)1nB4m7UiZ3R{Nfi*BE(uTSy+fksx%IV4gTQ|e{hr?Ww-vE +z=R5~xhBrCvk;!o>!l1&Sj-5fXjcubxvmIcy6SJ0&Z_&>v*L;pTROffdA%`%YZ@cZb +zGtWE|{#~+UiSoP1LngcKx~odp@_mG9&pr2qcDLDP8zy2n62JT1?|jZjwJsve+I;xK +zAAazIAN<_sKKHD%&VqxabIv*Ey!XBD-EhMVIrk1f{P45SKHGJ7*<}|lfG>O5%V_KI +zkAM6}Kl)MV#-$cwyHQ4=NV*F2hx0h2oI=gXkq*en7r*#LxRv|jhdksVSmqi7p`3W) +ziEeb+vSmN}+0U5OqLfQL(CxO{ZYpgwWM>Lj-}=_KUVr`d?|kPwH`!#9``-7y%$@DN +z`|iK}?Qi$mYcFXIDioIOXHAIujbYFz!m^E6AoC4xcmv_gBOm$5sDNA?CUW!x)en5& +z1NWq6{*TsTvak@7jl&TwoN&SkhBV4Et*-cSkBlh=BJ7dh{qA?)Q#kYgpu(Vzd)LOc +z(W5B_Snb5D<LCly@%?cI>&^Fp=BPF>?_bNldT>4z)+u#27YhLpjCu>496=n2` +zq%9Qrwd6<#Fw4C#mkJZQ8rook4H!=ZYf93}YhU|X`v8nwlay>URP*iUKmR$=oUKWC +z#xtIA)m2wX9#kkS7pA(&sNWa{jUsH?hy^C{fbL08dXidnepD`;;WG1r7rY>5##*sr +zEnhmd!x1e*1U}EBY@Jh2J@qF)`H3#H?75jc<&;xgiZG}!QU|p`Y->H5Vt~ai6ep&O +ziu?j?sWp5q^a*LXW3%!1z3+Wi=ps)D$Ti!_YqMY!=;Vzz-e?*niA;_Zd>bsq6mZAOCpR!ye{jO^BwVjDC@{g(AO}9O(dN&p6|Zcf8{rwr>Gm +zcFayIJX>%P5$iSAT%%;8p_*^Ryf$TlM-$gxd##d#3Wa4GsR>cPF$@|-Shf*_BaS%Y +z#V>v_F)6o1Zqy1<*`*SIi=M{JSSwbn7Jr_# +zunqzWPDZ&XvQ9U@R%@gK7-TBov5$RhY(g?)l=U={X(e*v{qKMOJMX+xMU94Pz7=gT +zK$&oWDS9shD0dYK%Z0&iGV0@SZ5T9)uxTR*oS96Nzv30Ih;3ORDn|w6yY9LR^kQbL +z6)V>ArBgc`(K0eOF`Vtnj50aTeC9KGGQs>99pRF|-5VhxgMk|n=?^N5F(Om!2eGa7 +zXo>+=J27kdxL2Spw;Mhe`W)6csCX6^6$<28Bf(=2BeOOO5d}tDyv8E)+)SNE?coo9 +zcnyeX1RW>8{N*n*xx=HXCqD6sMO`e%SeuE?E3dq=(21rbGd`rlvoE(&)GG2xa@ttO +zr6V1nB10!Wy0xh|N-zrvx`?j*?Qefmve6K=YCQscrpy44UjIu+>&u@o@F|&wqYw*9uWNDj@g9zr9B=S}P1vR686+b07cs$M@cQ +zZ)HZA9HQN?fBowS=bd-nQAZucL9U`|p;R#QO1`FiZ(fF4s%Qz?d>Q}#-r%VDGuz30;xx0^0QtBkc5pOzT +zMP`$;+{w6 +zH{5W8a%j}gD#>B0jui_kYBW^q5l}N;zx1Uqap~gzJqA9qIjB&8pjwT6)Nc%fMiIts +zL;~RA-VBcb3QU(O`l6 +zIy(Q$Di$8xzvx9TA}Aw%VZuw#mk2g_!UjJ+^{G$gxsyS(5TPW~N!DpGeTFqynDq~e +zAXJM7`Yc8PcUBaz3W6s~uYBbzZP0>Ek#qa)w{yJVBdQ#G?6LfPl+~gTtB}u)3HMf%xC9#(>mO=IFj^}NHV#Lj +z$@Btox_pQ-IgClIHe-zhH`?@_%%?y7>Aq1LR2XAKO|x%f+vw301FUvp*79+$KwECt +zeC{#^7{VZHYZoc{E-}%mW2voVQLYHuQRNHUA{h)X_hzVlkSY+9jx!LDA1`EGb +zg#`eGHC15}Sv~sHr#__|W)Fy(d7O&p)Q#&m$2fqIefHUh=5WAXA%F>lD`sK7lE(`y +z{J8MK3u%RiPAnaZ%DoLWdPG>wn!IQMnYBB|AAh_u2NjH4VWgHU^m~Va>NbjO!~#{A +zSpxPWk316D`Q5{0$CzeeHqc3g-XmC8h{?gjVK>wY5AiqMbkjm6)bI=vrBw0ib@-RH +z>Vpax9HXOlwXb12*rVAFu-b`P%g4O}G`rpFb1!2Mze6DWl>m3uET-nfk2AvYC~#)Q +z#U5^JZ4wkHy#0}}mC!ZV}nnU^RZ+|=Y +zYqY`)8dJ|u7}r83g1LuKD}xHN?e%Q+dpm0*7JAi`SsW&7f;JaRFUuvrX05PLByDg| +zAllk@-+iSP<-v;UltS$&%oPYmp6Hm>!3=}Bvb><}5SbEG_RcCSXus>u@z*u6a8AYz +z7izBaM8PwE{kCWk0uRUH)jPI0Co(scOxLgqhv<*VAC~SFF?CyEOs~z)>P3# +z!%lISq9!v@kf~Rp)vOg3iexm{mYHq*+~+98SlwjuW6_)6kV?67iuJ#*kP`pX+h-iwYql3 +z-vj~g?13`Eld^&4y-;r^w2{Wh%;l|SjUgq +zSeR08fgx~jjawGs@)w~j^p1arwm`7Cw=h{C-RF%Qyl-TII5XCbb^Mr(g(>wG7y|e1 +zxc%ShrZ`6<0RHgQodrAoh +zSgFbiHWu-)l-PgPQu`y9%`-LB*)t +z0JfJO;vrkhX;mA~d>btkWqVqn>;_z44NA{74Ak~PcLuen4MjgBgk{AzSHT(Yy+ZOeZa@tiM7kUSc0hsS^LlI)1XD +zu-16XJ)ss?51ZxhVqLfPQ4C%L5#O@rx(KctGrRePnv*rlR;al|6OE2EzAq5{Y(Qp|I9?%YE^} +zI*hok1sdfQXioAP9eoWfIwRRSMNyGoOV%t~-$LOM$wo&S-xsi-ZK$PI=rmA`ep0tc +z(oF(eLQ9I+7awKdm9>0KkF$k?%PW5P#p+R}`k1bvHXS&GicEk|{j;C_EWrzcevL-$ +zUK^a+xNTT&bm1PqX8y;4XdIcl2P^Puz~BG=_e@jpx6Zr{$@x)m7i6tg)NnOc8T0KG +zH5A>B=W?T==xX$~`@U03=lt_4MeDKGk_&~#kciGV`a8%E6FwBp_xfZV3#dVMwXaUZ +z2B;E&W>opzX3-i|8gIELz=^Lxh%fXhj5tY^-q)GakaeP;-TXq$$(m&=SdjggY;>gY +zeStAh*K``FM#qZo4}NojNb{Iuj$sypfk>ygGmX}wjO9kx1d;aBfx`z$^%@;M!5Lrf +z+-TJ9wZW;4+lJ*v7h+FwAdY8bDq4Z}&uQj?7ma@66Q6K?6x;4>S +zKTO5P2=S8*6vcPfH{Np3Gm5CmMc8gzP@_&Vq*guth16s=KKiU#cGDILmq<1`()hl> +z7^rJH4OAO`j``+-dZ#@M60IS}YFFFf)W&VY +za-$2er#KLe<3FBAfjbEXm_Akn+3^P3!IK$ly=N;18?Huw#(aAP{le{dE;kyYR_}R) +zK~7|@Gz{JO`}_*6#~(K+ykd}PdUv1FI93}&LI|j0qrZdv;HGB;nx9CoNRT=BEr8-y +zt7}9#n2J+f%pdua4HU&^);zX~Gqy})`@0yYpMHAO+;!Jo?Y0FsCxJJh*WPbbRI%qp +zKFQt>Vbm=t6%*pub_){ +zCA$l<)_b;6)NnQ04>SzuFu1i70ta6~A`DdXC=j +zVqk`4D7>weC&k1#JZWL!jyLuB?XwXz%QkDF +zYqrr5PP5vlI>ta<(`lgE@N@8+3#4^wr`@sI7!sJZ +zwFa<*{1Dw+X))&ZehVNrkKA~Py-jg));`(L`|f%k_;kOEA#2R>F-&>v&SO*N#SDZ6 +zsm0{}`|r=14;04_w9-uBbSZj=1wN7F69NU_jq_;m>nei^@i<1$qui^bsVeoc`^}x+ +zAt9U5S_9ZFKNN>-rH9d?b9*ygx)6j_@o?%-7_>V+olDczYI`!KG(N+W{yf1l#+jPV +zJb^P$W_x?l+g5L8Z}nPcJXou4jWBREe|v>~4Sro^P+?5R3mxu;`Kr^$KK3!bc3Q)B +zp7K{7GJLB2)HbE_`RQDmu2$QVk)=!-$B&ZC6D%X0=~bI2aOTPE +z_%5uv1My(3x-~rK2`X_PQSi){S60inS7?;G_|^RR6>cv1OD?_>7#DK%9=JKrjE8K% +zcXytO^3f +zh{|LlkO+)LU{y}MteXgcz}TUddWk?HP#};Dk_fCK0>y~RWFn9Vj77lb-f>49a@bDW +zvK_w54ib*s{pCdx`+U+ +zL?96;5bzlY?QXxpdau}UJ@!$syxXQ5q73aGyxmqJXzi(}&18)loO{B59Cgxv9?fRK +zGC6E8Cd>;{dpqxp|BbSes6n+?U4Ch?snnTE?z(I7op-|2i*CK8u_gaB`L?96ui-6BS*c0;IaijISoAXhIH_;?CZfvMU{uK+yJwdei7xpya)&%n}p|03g +zVec{f?S)OK87d(k{zVgdCG2(Zi!3fyChT0}-(|~|8H%-D_{5vhUWL{rld#LnSaW +zdl(rV7+DHj1K8kV;$k8`8bucWQk^8VFrw)cWOAsE9fgMChaRR3Q`NWYVa52T-<54&6jk +z&Cv=uR6zkZFhVQH*dZSr$fT4W(VQxhqq!!O$+t`R2|g(6prEYk>W&aoU2^1)_Qi}i57aDByd`it`*14L?zOuC7O`Zb +zMM~LYoFcX8D~-GwJJeDy5l93I1au0qhakki#Jok=YdS`4B>zGjXmW1XHcBB@&gTa6 +zs!05+XpS?VO~e5&U>wSTeIObr16HCJ=3h$T8Xn3K^O7k}fl8n!+7)NPDOiU7AT<=| +zAg0iv6iR|pQJ^_2tB8suu`CO^6X)`P8r~{yrBQUWrxs@M8M7#08Fr>RnN-mpQfr!>mb@vk@wzKEOR +zUl^giiGN`YjEEEA6vzVN5FLCf^F!?L~r8=F3M#awb7i(l9P#3zPvj~*JI}jH6 +zvH&a53YyTC%;Eq!I3V;C|9bv`y0Dc3iAGIIQD!bNZhJgfN!PI&Qb?_NaASq*^_Otm-EAV*Ox +z71_`i=aOjw!h&w#6gGH-O)`5(2Q@emuc)h1sN`V1TtIb}6UZ^3OpwW>AaE8mtNaaDbuBl=~Wik;+1jZuZ^Q{*DihtS9mVXuh#+bL@ +z;@R>q?8C{=X3m9KyurT&nC9FPkxLoM|ZfkdD{z-Jwk38Gqf +zHpah7vXA`BO=$0i5#66E{x$h3ZiRo9qrLf;XpXS1wxOo@H_~pDMZsiV>B`L?96ui-1pi)&}t0pQmuO +zjkyJsVOUMgmwe@7qN10I9 +zJnQFaaaNa1)QE6v^SRD1_?K{4D-+mj;go%g0uR}&)}73yl*wXNFR*9xaw{yTA~}>Q +z^yXO{Nm+}UZVorxR_(zZI&Klm=)3wD;a`iFUw_NQw&>0=^=5RKxw+-`m35JqR3^8{ +zrxeRA9$jrv$M08l~3*$q$_%GvhQ_IVEC`YEO>5ms|O#*GH +zA@<#MSL75e(kPl-$q4fcQ$-RIJm=Eod;Hh(Est8h-d+>i#s@Dy=!E5`oxgl>eR>8$ +zM1krkyE^g?$1Xqq%o*w|ezZlY+Pe6vqHrRKSz1RkS|&+b80r0u9crnU2qXdp0zRW) +z4VIvFX*cGe+#CNEER5O|{0mEpG}#kk+p$8R2n9A4Y0!#FVNzIC)uCM}cn`xyUWQdw +z3l@f;rKYP((H5Gr$(|rLmcp6r6t4$t%^Y9|aV;zhXpXG7(4w#v;g_pi8C^6vkSC$P`*s&}yzMDvEz)yfEm_ +z7UYXRGFxzcmx9L*wbV-l5`h8%pMLP~9LB%3=Wpg;go2x>0+)%o8vF~Zq89m=8Cd=C +zh%$?Ne>j>DUY1daGYOG@d*ffVC6^rkGL@mInS2bQ<2aW&VtOG?S1le_8es(DS&^Xk +zFeC9Su_qJ3Y**b-5;U4*`X`oDb(k?0LCujvDP6ka&x@(cq=c!tmw#h`jB%3jM^Y`y +zNMWHEQJG8x5`nP@_%s{jUojMf0^?{?jOnBWY)-+yFfw#D$iGlCYHW^wp+8SPz>LgA +zxKk3KPLxHL@UNLv{EI2rc`*KUEoNYRognNj+EU-$99$e9+{IXuxV83N3s#LmE}Hr= +zBkX(#u{+O;T5Q5ZDS8!$I`eL$EB>Pi6EtMq{Y3^R){eiiLoM|ZfkdD{z$en+`~y)W +z%9{V}WnN{nM~$enJ^#=f|B6^)w^_x%G{;MG9N{wOK>c$Hz0j310?+`MpPyffka>|0zQid`L~FF3kr@&Y_87uSIrS}iWU{m5(sm_ +zfR~|it^|;>m=rY=;$ZwM{#8isTHt^wHkxpzVUz$GcE%h%7-JSj2s6#sVp|2F;#SzO +z_ebn31?oCbZO6anda6(t)}~_IlT?l}i>Aj8wbV-l5`h8%pTqEPTzaT>uOf~q|a}+cx{*6-y +z&|I9i^&uz(0##TKvO`&G(L4zNOLoIpRVO~J@vqptTM_#z8o4J%4&iUU|F<}$GMNaB +zM!@I%$oLm#G0)ZnY{HE2X?u(F15{Z>{>1_l!5E<AqhNaBmwkID7H=H#8LX<@iYMn@?(6@eye;fR3%8nG=%~X!f%J}H9 +zmWqi$A~1=7&)c~bc<96*r?r1Yi|~}mZnpEk%p}10SYXp?1Oiq4EgX!@GebgS887A^ +zplJoOD0mrz9rH8-I^FqS42oN=Z$b0F3c5wy+~Y%S;x9i>v;Ihd(AE6tx!s~}q+095 +zOig9PT5`Z>N@_#zD%)aez~YZ +z5<7N=$qFe%>YSQ?x$AdKia@Aa{8+&j*FV6U`iXy47lw^b&!j*|>&ruzpwW?n*q^?{ +z-{`THiitoXFo}RqBw{_Njg6ab36h;eKpBSh#I6J<;T_3@y*4{uSQY-oD<}^_giK*r +zE(Z32Kp3w?h?ElWdfvn9e<5ELp{eC-=x`~bme@J2n&9f9Xj--4Xoto`+_4t^U{DA^ +zgdamB9JKZss5qfIuEVafQ{8IFHZ(DOQ1 +zL2xbpxXzOgb_Q=@TibUgI`Lgj(=e> +zMU)Nx~l!_3pH4%7MB!8D7Ym`!#`P^=;NZCbo +zYOx$bt!NLA<3PMHxQa+n1P7P-kAtlc1qjqsh;qTF)Ya?(MW}frTqQq}wQSO~Vq}Qh +z(-f*jPBe}T?|02&p|)mY^jJ&9L?98EM8M}fR1&GSE3cmU2gQ#K{RlEdP#0v4%e#ImMtXlgq`3qxe(=XJ#6JYIXtR@d=>u^LP`e(>mc9&@wKiE +zc&HqAVc`n|ry^h7)I+R9qY#{9VVIYkI8%WpISctWdaR{lB9I77BH$Byb;iFCsAmRr +zzpp*yt4)&zWELCVdj1!(?!C=-j~1rjIaU)fH~SDS;V>JF?Dc?VD+y4lwj$q2yfy#A(Q6|A(gmX6F3%RUOA>-!_~c7> +zMvt{rOau~vNd(NlgYhpEjPjh!KVV9MEl;c1khOQTTV%Qv2e=GKpUn9EA$Mer5cK^a +z0$zgOF7uMf$_Hj(*NETbfXY-NkO+)Mz-Ku8OK1r*D%6!w>``Ws028(CB@lz_AM`0q +zf7)`qfCKTHn1cVw*|W7Di!H#8j2>&Lm&Lm +z3nA`FS~-P8zz9qZs7xgSiNI(Cd=~L6i)U-?&B`ex0!Co;SWCr3AQ6~Ez-LjxzeQ5K +zY~>UZ0V6OupfZ&RBm$!m@L9z4LO1x0ER1aB6cPa=FnX+|Vj_?TOd{a3C{nG6SUEA@ +z$|)oQMqqM4WhxO!1V$s^v#1gOnu4vILLy)UMvt{rOau~vNd$ZrnPj`O5YDl33Wf`WzQnLf`< +zN(2&t(Fph~a{Oz~wUF}&Lm ++// ++// SPDX-License-Identifier: BSD-2-Clause-Patent ++// ++// **/ ++ ++#image IMG_LOGO Logo-OpenSSL.bmp +diff --git a/MdeModulePkg/Logo/LogoOpenSSLDxe.inf b/MdeModulePkg/Logo/LogoOpenSSLDxe.inf +new file mode 100644 +index 0000000000..d1207663b2 +--- /dev/null ++++ b/MdeModulePkg/Logo/LogoOpenSSLDxe.inf +@@ -0,0 +1,56 @@ ++## @file ++# The default logo bitmap picture shown on setup screen. ++# ++# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
++# ++# SPDX-License-Identifier: BSD-2-Clause-Patent ++# ++# ++## ++ ++[Defines] ++ INF_VERSION = 0x00010005 ++ BASE_NAME = LogoOpenSSLDxe ++ MODULE_UNI_FILE = LogoOpenSSLDxe.uni ++ FILE_GUID = 9CAE7B89-D48D-4D68-BBC4-4C0F1D48CDFF ++ MODULE_TYPE = DXE_DRIVER ++ VERSION_STRING = 1.0 ++ ++ ENTRY_POINT = InitializeLogo ++# ++# This flag specifies whether HII resource section is generated into PE image. ++# ++ UEFI_HII_RESOURCE_SECTION = TRUE ++ ++# ++# The following information is for reference only and not required by the build tools. ++# ++# VALID_ARCHITECTURES = IA32 X64 ++# ++ ++[Sources] ++ Logo-OpenSSL.bmp ++ Logo.c ++ Logo-OpenSSL.idf ++ ++[Packages] ++ MdeModulePkg/MdeModulePkg.dec ++ MdePkg/MdePkg.dec ++ ++[LibraryClasses] ++ UefiBootServicesTableLib ++ UefiDriverEntryPoint ++ DebugLib ++ ++[Protocols] ++ gEfiHiiDatabaseProtocolGuid ## CONSUMES ++ gEfiHiiImageExProtocolGuid ## CONSUMES ++ gEfiHiiPackageListProtocolGuid ## PRODUCES CONSUMES ++ gEdkiiPlatformLogoProtocolGuid ## PRODUCES ++ ++[Depex] ++ gEfiHiiDatabaseProtocolGuid AND ++ gEfiHiiImageExProtocolGuid ++ ++[UserExtensions.TianoCore."ExtraFiles"] ++ LogoDxeExtra.uni +diff --git a/MdeModulePkg/Logo/LogoOpenSSLDxe.uni b/MdeModulePkg/Logo/LogoOpenSSLDxe.uni +new file mode 100644 +index 0000000000..6439502b6a +--- /dev/null ++++ b/MdeModulePkg/Logo/LogoOpenSSLDxe.uni +@@ -0,0 +1,17 @@ ++// /** @file ++// The logo bitmap picture (with OpenSSL advertisment) shown on setup screen. ++// ++// This module provides the logo bitmap picture (with OpenSSL advertisment) ++// shown on setup screen, through EDKII Platform Logo protocol. ++// ++// Copyright (c) 2016, Intel Corporation. All rights reserved.
++// ++// SPDX-License-Identifier: BSD-2-Clause-Patent ++// ++// **/ ++ ++ ++#string STR_MODULE_ABSTRACT #language en-US "Provides the logo bitmap picture (with OpenSSL advertisment) shown on setup screen." ++ ++#string STR_MODULE_DESCRIPTION #language en-US "This module provides the logo bitmap picture (with OpenSSL advertisment) shown on setup screen, through EDKII Platform Logo protocol." ++ +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index d0df9cbbfb..f8317a4f5d 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -750,7 +750,7 @@ + NULL|OvmfPkg/Csm/LegacyBootManagerLib/LegacyBootManagerLib.inf + !endif + } +- MdeModulePkg/Logo/LogoDxe.inf ++ MdeModulePkg/Logo/LogoOpenSSLDxe.inf + MdeModulePkg/Application/UiApp/UiApp.inf { + + NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf +diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf +index e2b759aa8d..ec64551bcb 100644 +--- a/OvmfPkg/OvmfPkgIa32.fdf ++++ b/OvmfPkg/OvmfPkgIa32.fdf +@@ -294,7 +294,7 @@ INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf + !endif + INF ShellPkg/Application/Shell/Shell.inf + +-INF MdeModulePkg/Logo/LogoDxe.inf ++INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + + # + # Network modules +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index b3ae62fee9..55423d356c 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -764,7 +764,7 @@ + NULL|OvmfPkg/Csm/LegacyBootManagerLib/LegacyBootManagerLib.inf + !endif + } +- MdeModulePkg/Logo/LogoDxe.inf ++ MdeModulePkg/Logo/LogoOpenSSLDxe.inf + MdeModulePkg/Application/UiApp/UiApp.inf { + + NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf +diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf +index bfca1eff9e..2f02ac2d73 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.fdf ++++ b/OvmfPkg/OvmfPkgIa32X64.fdf +@@ -295,7 +295,7 @@ INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf + !endif + INF ShellPkg/Application/Shell/Shell.inf + +-INF MdeModulePkg/Logo/LogoDxe.inf ++INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + + # + # Network modules +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index f7fe75ebf5..17aeeed96e 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -760,7 +760,7 @@ + NULL|OvmfPkg/Csm/LegacyBootManagerLib/LegacyBootManagerLib.inf + !endif + } +- MdeModulePkg/Logo/LogoDxe.inf ++ MdeModulePkg/Logo/LogoOpenSSLDxe.inf + MdeModulePkg/Application/UiApp/UiApp.inf { + + NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf +diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf +index bfca1eff9e..2f02ac2d73 100644 +--- a/OvmfPkg/OvmfPkgX64.fdf ++++ b/OvmfPkg/OvmfPkgX64.fdf +@@ -295,7 +295,7 @@ INF OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf + !endif + INF ShellPkg/Application/Shell/Shell.inf + +-INF MdeModulePkg/Logo/LogoDxe.inf ++INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + + # + # Network modules +-- +2.18.4 + diff --git a/0010-OvmfPkg-increase-max-debug-message-length-to-512-RHE.patch b/0010-OvmfPkg-increase-max-debug-message-length-to-512-RHE.patch new file mode 100644 index 0000000..f746230 --- /dev/null +++ b/0010-OvmfPkg-increase-max-debug-message-length-to-512-RHE.patch @@ -0,0 +1,76 @@ +From a95cff0b9573bf23699551beb4786383f697ff1e Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Thu, 20 Feb 2014 22:54:45 +0100 +Subject: OvmfPkg: increase max debug message length to 512 (RHEL only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- trivial context difference due to upstream commit 2fe5f2f52918 + ("OvmfPkg/PlatformDebugLibIoPort: Add new APIs", 2019-04-02), resolved + by git-cherry-pick automatically + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no changes + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no changes + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes + +Upstream prefers short debug messages (sometimes even limited to 80 +characters), but any line length under 512 characters is just unsuitable +for effective debugging. (For example, config strings in HII routing, +logged by the platform driver "OvmfPkg/PlatformDxe" on DEBUG_VERBOSE +level, can be several hundred characters long.) 512 is an empirically good +value. + +Signed-off-by: Laszlo Ersek +(cherry picked from commit bfe568d18dba15602604f155982e3b73add63dfb) +(cherry picked from commit 29435a32ec9428720c74c454ce9817662e601fb6) +(cherry picked from commit 58e1d1ebb78bfdaf05f4c6e8abf8d4908dfa038a) +(cherry picked from commit 1df2c822c996ad767f2f45570ab2686458f7604a) +(cherry picked from commit 22c9b4e971c70c69b4adf8eb93133824ccb6426a) +(cherry picked from commit a1260c9122c95bcbef1efc5eebe11902767813c2) +(cherry picked from commit e949bab1268f83f0f5815a96cd1cb9dd3b21bfb5) +--- + OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c +index dffb20822d..0577c43c3d 100644 +--- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c ++++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c +@@ -21,7 +21,7 @@ + // + // Define the maximum debug and assert message length that this library supports + // +-#define MAX_DEBUG_MESSAGE_LENGTH 0x100 ++#define MAX_DEBUG_MESSAGE_LENGTH 0x200 + + // + // VA_LIST can not initialize to NULL for all compiler, so we use this to +-- +2.18.4 + diff --git a/0006-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch b/0011-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch similarity index 93% rename from 0006-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch rename to 0011-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch index 7173be1..833bb05 100644 --- a/0006-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch +++ b/0011-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch @@ -1,7 +1,42 @@ -From 31dcc494a7c3ce1bbb1d35b42ba3b6359ca971cf Mon Sep 17 00:00:00 2001 +From 99da4393139d428baf09d751af3d072229839126 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 12 Jun 2014 00:17:59 +0200 -Subject: [PATCH] OvmfPkg: QemuVideoDxe: enable debug messages in VbeShim +Subject: OvmfPkg: QemuVideoDxe: enable debug messages in VbeShim (RHEL only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no changes + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no changes + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no changes + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- update commit message as requested in + + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes The Int10h VBE Shim is capable of emitting short debug messages when the win2k8r2 UEFI guest uses (emulates) the Video BIOS. In upstream the quiet @@ -11,18 +46,20 @@ For this patch, the DEBUG macro is enabled in the assembly file, and then the header file is regenerated from the assembly, by running "OvmfPkg/QemuVideoDxe/VbeShim.sh". -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- no changes - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- no changes +"VbeShim.h" is not auto-generated; it is manually generated. The patch +does not add "VbeShim.h", it just updates both "VbeShim.asm" and (the +manually re-generated) "VbeShim.h" atomically. Doing so helps with local +downstream builds, with bisection, and also keeps redhat/README a bit +simpler. Signed-off-by: Laszlo Ersek (cherry picked from commit ccda46526bb2e573d9b54f0db75d27e442b4566f) (cherry picked from commit ed45b26dbeadd63dd8f2edf627290957d8bbb3b2) -Signed-off-by: Paolo Bonzini +(cherry picked from commit 9a8a034ebc082f86fdbb54dc1303a5059508e14c) +(cherry picked from commit 7046d6040181bb0f76a5ebd680e0dc701c895dba) +(cherry picked from commit 4dd1cc745bc9a8c8b32b5810b40743fed1e36d7e) +(cherry picked from commit bd264265a99c60f45cadaa4109a9db59ae218471) +(cherry picked from commit 3aa0316ea1db5416cb528179a3ba5ce37c1279b7) --- OvmfPkg/QemuVideoDxe/VbeShim.asm | 2 +- OvmfPkg/QemuVideoDxe/VbeShim.h | 481 ++++++++++++++++++++----------- @@ -538,3 +575,6 @@ index cc9b6e14cd..325d6478a1 100644 + /* 00000459 or al,[fs:bx+si] */ 0x64, 0x0A, 0x00, }; #endif +-- +2.18.4 + diff --git a/0007-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch b/0012-MdeModulePkg-TerminalDxe-add-other-text-resolutions-.patch similarity index 79% rename from 0007-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch rename to 0012-MdeModulePkg-TerminalDxe-add-other-text-resolutions-.patch index b40f0a5..a48000c 100644 --- a/0007-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch +++ b/0012-MdeModulePkg-TerminalDxe-add-other-text-resolutions-.patch @@ -1,7 +1,44 @@ -From 3b413c99f3a5087710f4932b4ba61c2646ae84b9 Mon Sep 17 00:00:00 2001 +From 82b9edc5fef3a07227a45059bbe821af7b9abd69 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Tue, 25 Feb 2014 18:40:35 +0100 -Subject: [PATCH] MdeModulePkg: TerminalDxe: add other text resolutions +Subject: MdeModulePkg: TerminalDxe: add other text resolutions (RHEL only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no changes + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no changes + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- update commit message as requested in + + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- adapt commit 0bc77c63de03 (code and commit message) to upstream commit + 390b95a49c14 ("MdeModulePkg/TerminalDxe: Refine + InitializeTerminalConsoleTextMode", 2017-01-10). When the console output is multiplexed to several devices by ConSplitterDxe, then ConSplitterDxe builds an intersection of text modes @@ -54,23 +91,16 @@ the most frequent (1d) values from the intersection, and eg. the MODE command in the UEFI shell will offer the "best" (ie. full screen) resolution too. -Upstream status: three calendar months (with on-and-off discussion and -patches) have not been enough to find a solution to this problem that -would please all stakeholders. - -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- adapt commit 0bc77c63de03 (code and commit message) to upstream commit - 390b95a49c14 ("MdeModulePkg/TerminalDxe: Refine - InitializeTerminalConsoleTextMode", 2017-01-10). - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- no changes +Upstreaming efforts for this patch have been discontinued; it was clear +from the off-list thread that consensus was impossible to reach. Signed-off-by: Laszlo Ersek (cherry picked from commit 99dc3720ac86059f60156197328cc433603c536e) -Signed-off-by: Paolo Bonzini +(cherry picked from commit d2066c1748f885043026c51dec1bc8d6d406ae8f) +(cherry picked from commit 1facdd58e946c584a3dc1e5be8f2f837b5a7c621) +(cherry picked from commit 28faeb5f94b4866b9da16cf2a1e4e0fc09a26e37) +(cherry picked from commit 4e4e15b80a5b2103eadd495ef4a830d46dd4ed51) +(cherry picked from commit 12cb13a1da913912bd9148ce8f2353a75be77f18) --- .../Universal/Console/TerminalDxe/Terminal.c | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) @@ -127,3 +157,6 @@ index a98b690c8b..ded5513c74 100644 // // New modes can be added here. // +-- +2.18.4 + diff --git a/0008-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch b/0013-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch similarity index 68% rename from 0008-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch rename to 0013-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch index 78bf511..3ee3335 100644 --- a/0008-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch +++ b/0013-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch @@ -1,8 +1,52 @@ -From 50b53194f7caea602e04df663358617c280f299c Mon Sep 17 00:00:00 2001 +From bc2266f20de5db1636e09a07e4a72c8dbf505f5a Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Tue, 25 Feb 2014 22:40:01 +0100 -Subject: [PATCH] MdeModulePkg: TerminalDxe: set xterm resolution on mode - change (RH only) +Subject: MdeModulePkg: TerminalDxe: set xterm resolution on mode change (RH + only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- Resolve trivial conflict in "MdeModulePkg/MdeModulePkg.dec", arising + from upstream commit 166830d8f7ca ("MdeModulePkg/dec: add + PcdTcgPfpMeasurementRevision PCD", 2020-01-06). + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- Conflict in "MdeModulePkg/MdeModulePkg.dec" due to upstream commits + - 1103ba946aee ("MdeModulePkg: Add Capsule On Disk related definition.", + 2019-06-26), + - 1c7b3eb84631 ("MdeModulePkg/DxeIpl: Introduce PCD + PcdUse5LevelPageTable", 2019-08-09), + with easy manual resolution. + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no change + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- Refresh downstream-only commit 2909e025db68 against "MdeModulePkg.dec" + context change from upstream commits e043f7895b83 ("MdeModulePkg: Add + PCD PcdPteMemoryEncryptionAddressOrMask", 2017-02-27) and 76081dfcc5b2 + ("MdeModulePkg: Add PROMPT&HELP string of pcd to UNI file", 2017-03-03). + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- refresh commit 519b9751573e against various context changes The @@ -14,22 +58,15 @@ escape sequence serves for window manipulation. We can use the sequence to adapt eg. the xterm window size to the selected console mode. -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- refresh commit 519b9751573e against various context changes - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- Refresh downstream-only commit 2909e025db68 against "MdeModulePkg.dec" - context change from upstream commits e043f7895b83 ("MdeModulePkg: Add - PCD PcdPteMemoryEncryptionAddressOrMask", 2017-02-27) and 76081dfcc5b2 - ("MdeModulePkg: Add PROMPT&HELP string of pcd to UNI file", 2017-03-03). - Reference: Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek (cherry picked from commit 2909e025db6878723b49644a8a0cf160d07e6444) -Signed-off-by: Paolo Bonzini +(cherry picked from commit b9c5c901f25e48d68eef6e78a4abca00e153f574) +(cherry picked from commit b7f6115b745de8cbc5214b6ede33c9a8558beb90) +(cherry picked from commit 67415982afdc77922aa37496c981adeb4351acdb) +(cherry picked from commit cfccb98d13e955beb0b93b4a75a973f30c273ffc) +(cherry picked from commit a11602f5e2ef930be5b693ddfd0c789a1bd4c60c) --- MdeModulePkg/MdeModulePkg.dec | 4 +++ .../Console/TerminalDxe/TerminalConOut.c | 30 +++++++++++++++++++ @@ -37,12 +74,12 @@ Signed-off-by: Paolo Bonzini 3 files changed, 36 insertions(+) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec -index cb30a79758..e562bed57e 100644 +index 031043ec28..3978a500e5 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec -@@ -2013,6 +2013,10 @@ - # @Prompt Enable StatusCode via memory. - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE|BOOLEAN|0x00010023 +@@ -1998,6 +1998,10 @@ + # @Prompt TCG Platform Firmware Profile revision. + gEfiMdeModulePkgTokenSpaceGuid.PcdTcgPfpMeasurementRevision|0|UINT32|0x00010077 + ## Controls whether TerminalDxe outputs an XTerm resize sequence on terminal + # mode change. @@ -126,3 +163,6 @@ index b2a8aeba85..eff6253465 100644 # [Event] # # Relative timer event set by UnicodeToEfiKey(), used to be one 2 seconds input timeout. +-- +2.18.4 + diff --git a/0014-ArmVirtPkg-set-early-hello-message-RH-only.patch b/0014-ArmVirtPkg-set-early-hello-message-RH-only.patch deleted file mode 100644 index e9cafd2..0000000 --- a/0014-ArmVirtPkg-set-early-hello-message-RH-only.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 34a88714097996e34811d27b32e77ff71ca763a6 Mon Sep 17 00:00:00 2001 -From: Laszlo Ersek -Date: Wed, 14 Oct 2015 14:07:17 +0200 -Subject: [PATCH] ArmVirtPkg: set early hello message (RH only) - -Print a friendly banner on QEMU, regardless of debug mask settings. - -RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1270279 -Downstream only: -. - -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- no changes - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- no changes - -Contributed-under: TianoCore Contribution Agreement 1.0 -Signed-off-by: Laszlo Ersek -(cherry picked from commit 5d4a15b9019728b2d96322bc679099da49916925) -(cherry picked from commit 179df76dbb0d199bd905236e98775b4059c6502a) -Signed-off-by: Paolo Bonzini ---- - ArmVirtPkg/ArmVirtQemu.dsc | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc -index 24c6ea2e64..ad6af7f1c6 100644 ---- a/ArmVirtPkg/ArmVirtQemu.dsc -+++ b/ArmVirtPkg/ArmVirtQemu.dsc -@@ -125,6 +125,7 @@ - gArmVirtTokenSpaceGuid.PcdTpm2SupportEnabled|$(TPM2_ENABLE) - - [PcdsFixedAtBuild.common] -+ gArmPlatformTokenSpaceGuid.PcdEarlyHelloMessage|"UEFI firmware starting.\r\n" - !if $(ARCH) == AARCH64 - gArmTokenSpaceGuid.PcdVFPEnabled|1 - !endif diff --git a/0009-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch b/0014-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch similarity index 51% rename from 0009-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch rename to 0014-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch index 591a4e3..63d6e8e 100644 --- a/0009-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch +++ b/0014-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch @@ -1,12 +1,35 @@ -From 0616c1d69ef552bd35700992fae37263ddd8c4ce Mon Sep 17 00:00:00 2001 +From 51e0de961029af84b5bdbfddcc9762b1819d500f Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 14 Oct 2015 15:59:06 +0200 -Subject: [PATCH] OvmfPkg: take PcdResizeXterm from the QEMU command line (RH - only) +Subject: OvmfPkg: take PcdResizeXterm from the QEMU command line (RH only) -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: -- no changes +- Resolve contextual conflict in the DSC files, from upstream commit + b0ed7ebdebd1 ("OvmfPkg: set fixed FlashNvStorage base addresses with -D + SMM_REQUIRE", 2020-03-12). + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no change Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: @@ -15,11 +38,19 @@ Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: ("OvmfPkg/PlatformPei: don't allocate reserved mem varstore if SMM_REQUIRE", 2017-03-12). +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes + Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek (cherry picked from commit 6fa0c4d67c0bb8bde2ddd6db41c19eb0c40b2721) (cherry picked from commit 8abc2a6ddad25af7e88dc0cf57d55dfb75fbf92d) -Signed-off-by: Paolo Bonzini +(cherry picked from commit b311932d3841c017a0f0fec553edcac365cc2038) +(cherry picked from commit 61914fb81cf624c9028d015533b400b2794e52d3) +(cherry picked from commit 2ebf3cc2ae99275d63bb6efd3c22dec76251a853) +(cherry picked from commit f9b73437b9b231773c1a20e0c516168817a930a2) +(cherry picked from commit 2cc462ee963d0be119bc97bfc9c70d292a40516f) --- OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + @@ -29,41 +60,41 @@ Signed-off-by: Paolo Bonzini 5 files changed, 5 insertions(+) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 2886c10b1b..b974740e2f 100644 +index f8317a4f5d..6ce8a46d4e 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -577,6 +577,7 @@ - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0 - !endif +@@ -574,6 +574,7 @@ + # ($(SMM_REQUIRE) == FALSE) + gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 + + gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|800 - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600 + !if $(SMM_REQUIRE) == FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 5a9e9a707a..65a8c6764c 100644 +index 55423d356c..89d414cda7 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -586,6 +586,7 @@ - gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|800 - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600 +@@ -580,6 +580,7 @@ + # ($(SMM_REQUIRE) == FALSE) + gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 + + gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable|FALSE - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId|0 - gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase|0x0 + !if $(SMM_REQUIRE) == FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index 70c2c3e3b9..72bc289f26 100644 +index 17aeeed96e..e567eb76e0 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -582,6 +582,7 @@ - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0 - !endif - gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|FALSE +@@ -578,6 +578,7 @@ + # ($(SMM_REQUIRE) == FALSE) + gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 + + gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|800 - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600 - gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable|FALSE + !if $(SMM_REQUIRE) == FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c index 96468701e3..14efbabe39 100644 --- a/OvmfPkg/PlatformPei/Platform.c @@ -77,10 +108,10 @@ index 96468701e3..14efbabe39 100644 InstallClearCacheCallback (); diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf -index c53be2f492..e5744ed818 100644 +index ff397b3ee9..3a012a7fa4 100644 --- a/OvmfPkg/PlatformPei/PlatformPei.inf +++ b/OvmfPkg/PlatformPei/PlatformPei.inf -@@ -97,6 +97,7 @@ +@@ -93,6 +93,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration @@ -88,3 +119,6 @@ index c53be2f492..e5744ed818 100644 gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack +-- +2.18.4 + diff --git a/0010-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch b/0015-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch similarity index 53% rename from 0010-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch rename to 0015-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch index 6843988..975f13d 100644 --- a/0010-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch +++ b/0015-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch @@ -1,15 +1,62 @@ -From 4de2ee915d9f3eea6d32cd010ab856ac176f3983 Mon Sep 17 00:00:00 2001 +From a5f7a57bf390f1f340ff1d1f1884a73716817ef1 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Sun, 26 Jul 2015 08:02:50 +0000 -Subject: [PATCH] ArmVirtPkg: take PcdResizeXterm from the QEMU command line - (RH only) +Subject: ArmVirtPkg: take PcdResizeXterm from the QEMU command line (RH only) -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: -- Adapt commit 6b97969096a3 to the fact that upstream has deprecated such - setter functions for dynamic PCDs that don't return a status code (such - as PcdSetBool()). Employ PcdSetBoolS(), and assert that it succeeds -- - there's really no circumstance in this case when it could fail. +- Resolve leading context divergence in "ArmVirtPkg/ArmVirtQemu.dsc", + arising from upstream commits: + + - 82662a3b5f56 ("ArmVirtPkg/PlatformPeiLib: discover the TPM base + address from the DT", 2020-03-04) + + - ddd34a818315 ("ArmVirtPkg/ArmVirtQemu: enable TPM2 support in the PEI + phase", 2020-03-04) + + - cdc3fa54184a ("ArmVirtPkg: control PXEv4 / PXEv6 boot support from the + QEMU command line", 2020-04-28) + +- Rework the downstream patch quite a bit, paralleling the upstream work + done for in commit + range 64ab457d1f21..cdc3fa54184a: + + - Refresh copyright year in TerminalPcdProducerLib.{inf,c}. Also replace + open-coded BSDL with "SPDX-License-Identifier: BSD-2-Clause-Patent". + + - Simplify LIBRARY_CLASS: this lib instance is meant to be consumed only + via NULL class resolution (basically: as a plugin), so use NULL for + LIBRARY_CLASS, not "TerminalPcdProducerLib|DXE_DRIVER". + + - Sort the [Packages] section alphabetically in the INF file. + + - Replace the open-coded GetNamedFwCfgBoolean() function with a call to + QemuFwCfgParseBool(), from QemuFwCfgSimpleParserLib. + + - Add the SOMETIMES_PRODUCES usage comment in the [Pcd] section of the + INF file. + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no change Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: @@ -18,31 +65,43 @@ Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: ("ArmVirtPkg/PlatformHasAcpiDtDxe: allow guest level ACPI disable override", 2017-03-29). +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- Adapt commit 6b97969096a3 to the fact that upstream has deprecated such + setter functions for dynamic PCDs that don't return a status code (such + as PcdSetBool()). Employ PcdSetBoolS(), and assert that it succeeds -- + there's really no circumstance in this case when it could fail. + Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek (cherry picked from commit d4564d39dfdbf74e762af43314005a2c026cb262) -Signed-off-by: Paolo Bonzini +(cherry picked from commit c9081ebe3bcd28e5cce4bf58bd8d4fca12f9af7c) +(cherry picked from commit 8e92730c8e1cdb642b3b3e680e643ff774a90c65) +(cherry picked from commit 9448b6b46267d8d807fac0c648e693171bb34806) +(cherry picked from commit 232fcf06f6b3048b7c2ebd6931f23186b3852f04) +(cherry picked from commit 8338545260fbb423f796d5196faaaf8ff6e1ed99) --- - ArmVirtPkg/ArmVirtQemu.dsc | 6 +- - .../TerminalPcdProducerLib.c | 87 +++++++++++++++++++ - .../TerminalPcdProducerLib.inf | 41 +++++++++ - 3 files changed, 133 insertions(+), 1 deletion(-) + ArmVirtPkg/ArmVirtQemu.dsc | 7 +++- + .../TerminalPcdProducerLib.c | 34 +++++++++++++++++++ + .../TerminalPcdProducerLib.inf | 33 ++++++++++++++++++ + 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c create mode 100644 ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc -index 2405636af6..24c6ea2e64 100644 +index 360094ab6a..3345987503 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc -@@ -249,6 +249,7 @@ - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600 - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640 - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480 -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE +@@ -272,6 +272,8 @@ + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask|0 + !endif - # - # SMBIOS entry point version -@@ -374,7 +375,10 @@ ++ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE ++ + [PcdsDynamicHii] + gArmVirtTokenSpaceGuid.PcdForceNoAcpi|L"ForceNoAcpi"|gArmVirtVariableGuid|0x0|FALSE|NV,BS + +@@ -374,7 +376,10 @@ MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf @@ -56,82 +115,29 @@ index 2405636af6..24c6ea2e64 100644 MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf diff --git a/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c new file mode 100644 -index 0000000000..814ad48199 +index 0000000000..bfd3a6a535 --- /dev/null +++ b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.c -@@ -0,0 +1,87 @@ +@@ -0,0 +1,34 @@ +/** @file +* Plugin library for setting up dynamic PCDs for TerminalDxe, from fw_cfg +* -+* Copyright (C) 2015-2016, Red Hat, Inc. ++* Copyright (C) 2015-2020, Red Hat, Inc. +* Copyright (c) 2014, Linaro Ltd. All rights reserved.
+* -+* This program and the accompanying materials are licensed and made available -+* under the terms and conditions of the BSD License which accompanies this -+* distribution. The full text of the license may be found at -+* http://opensource.org/licenses/bsd-license.php -+* -+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR -+* IMPLIED. -+* ++* SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include -+#include -+ -+STATIC -+RETURN_STATUS -+GetNamedFwCfgBoolean ( -+ IN CONST CHAR8 *FwCfgFileName, -+ OUT BOOLEAN *Setting -+ ) -+{ -+ RETURN_STATUS Status; -+ FIRMWARE_CONFIG_ITEM FwCfgItem; -+ UINTN FwCfgSize; -+ UINT8 Value[3]; -+ -+ Status = QemuFwCfgFindFile (FwCfgFileName, &FwCfgItem, &FwCfgSize); -+ if (RETURN_ERROR (Status)) { -+ return Status; -+ } -+ if (FwCfgSize > sizeof Value) { -+ return RETURN_BAD_BUFFER_SIZE; -+ } -+ QemuFwCfgSelectItem (FwCfgItem); -+ QemuFwCfgReadBytes (FwCfgSize, Value); -+ -+ if ((FwCfgSize == 1) || -+ (FwCfgSize == 2 && Value[1] == '\n') || -+ (FwCfgSize == 3 && Value[1] == '\r' && Value[2] == '\n')) { -+ switch (Value[0]) { -+ case '0': -+ case 'n': -+ case 'N': -+ *Setting = FALSE; -+ return RETURN_SUCCESS; -+ -+ case '1': -+ case 'y': -+ case 'Y': -+ *Setting = TRUE; -+ return RETURN_SUCCESS; -+ -+ default: -+ break; -+ } -+ } -+ return RETURN_PROTOCOL_ERROR; -+} ++#include + +#define UPDATE_BOOLEAN_PCD_FROM_FW_CFG(TokenName) \ + do { \ + BOOLEAN Setting; \ + RETURN_STATUS PcdStatus; \ + \ -+ if (!RETURN_ERROR (GetNamedFwCfgBoolean ( \ ++ if (!RETURN_ERROR (QemuFwCfgParseBool ( \ + "opt/org.tianocore.edk2.aavmf/" #TokenName, &Setting))) { \ + PcdStatus = PcdSetBoolS (TokenName, Setting); \ + ASSERT_RETURN_ERROR (PcdStatus); \ @@ -149,25 +155,17 @@ index 0000000000..814ad48199 +} diff --git a/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf new file mode 100644 -index 0000000000..fecb37bcdf +index 0000000000..a51dbd1670 --- /dev/null +++ b/ArmVirtPkg/Library/TerminalPcdProducerLib/TerminalPcdProducerLib.inf -@@ -0,0 +1,41 @@ +@@ -0,0 +1,33 @@ +## @file +# Plugin library for setting up dynamic PCDs for TerminalDxe, from fw_cfg +# -+# Copyright (C) 2015-2016, Red Hat, Inc. ++# Copyright (C) 2015-2020, Red Hat, Inc. +# Copyright (c) 2014, Linaro Ltd. All rights reserved.
+# -+# This program and the accompanying materials are licensed and made available -+# under the terms and conditions of the BSD License which accompanies this -+# distribution. The full text of the license may be found at -+# http://opensource.org/licenses/bsd-license.php -+# -+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR -+# IMPLIED. -+# ++# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] @@ -176,21 +174,24 @@ index 0000000000..fecb37bcdf + FILE_GUID = 4a0c5ed7-8c42-4c01-8f4c-7bf258316a96 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 -+ LIBRARY_CLASS = TerminalPcdProducerLib|DXE_DRIVER ++ LIBRARY_CLASS = NULL + CONSTRUCTOR = TerminalPcdProducerLibConstructor + +[Sources] + TerminalPcdProducerLib.c + +[Packages] ++ MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec -+ MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + DebugLib + PcdLib -+ QemuFwCfgLib ++ QemuFwCfgSimpleParserLib + +[Pcd] -+ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm ++ gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm ## SOMETIMES_PRODUCES +-- +2.18.4 + diff --git a/0015-Tweak-the-tools_def-to-support-cross-compiling.patch b/0015-Tweak-the-tools_def-to-support-cross-compiling.patch deleted file mode 100644 index b36f1e4..0000000 --- a/0015-Tweak-the-tools_def-to-support-cross-compiling.patch +++ /dev/null @@ -1,75 +0,0 @@ -From d8b75ad1013b21c089a1af579b510f32c49c5b14 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Thu, 16 Aug 2018 15:45:47 -0400 -Subject: [PATCH] Tweak the tools_def to support cross-compiling. - -These files are meant for customization, so this is not upstream. - -Signed-off-by: Paolo Bonzini -Signed-off-by: Cole Robinson ---- - BaseTools/Conf/tools_def.template | 44 +++++++++++++++---------------- - 1 file changed, 22 insertions(+), 22 deletions(-) - -diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template -index 933b3160fd..e62ccc322d 100755 ---- a/BaseTools/Conf/tools_def.template -+++ b/BaseTools/Conf/tools_def.template -@@ -2350,17 +2350,17 @@ RELEASE_GCC49_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 - ################## - # GCC5 IA32 definitions - ################## --*_GCC5_IA32_OBJCOPY_PATH = DEF(GCC5_IA32_PREFIX)objcopy --*_GCC5_IA32_CC_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_SLINK_PATH = DEF(GCC5_IA32_PREFIX)gcc-ar --*_GCC5_IA32_DLINK_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_ASLDLINK_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_ASM_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_PP_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_VFRPP_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_ASLCC_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_ASLPP_PATH = DEF(GCC5_IA32_PREFIX)gcc --*_GCC5_IA32_RC_PATH = DEF(GCC5_IA32_PREFIX)objcopy -+*_GCC5_IA32_OBJCOPY_PATH = ENV(GCC5_IA32_PREFIX)objcopy -+*_GCC5_IA32_CC_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_SLINK_PATH = ENV(GCC5_IA32_PREFIX)gcc-ar -+*_GCC5_IA32_DLINK_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_ASLDLINK_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_ASM_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_PP_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_VFRPP_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_ASLCC_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_ASLPP_PATH = ENV(GCC5_IA32_PREFIX)gcc -+*_GCC5_IA32_RC_PATH = ENV(GCC5_IA32_PREFIX)objcopy - - *_GCC5_IA32_ASLCC_FLAGS = DEF(GCC5_ASLCC_FLAGS) -m32 - *_GCC5_IA32_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_i386 -no-pie -@@ -2382,17 +2382,17 @@ RELEASE_GCC5_IA32_DLINK_FLAGS = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Os -Wl, - ################## - # GCC5 X64 definitions - ################## --*_GCC5_X64_OBJCOPY_PATH = DEF(GCC5_X64_PREFIX)objcopy --*_GCC5_X64_CC_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_SLINK_PATH = DEF(GCC5_X64_PREFIX)gcc-ar --*_GCC5_X64_DLINK_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_ASLDLINK_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_ASM_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_PP_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_VFRPP_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_ASLCC_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_ASLPP_PATH = DEF(GCC5_X64_PREFIX)gcc --*_GCC5_X64_RC_PATH = DEF(GCC5_X64_PREFIX)objcopy -+*_GCC5_X64_OBJCOPY_PATH = ENV(GCC5_X64_PREFIX)objcopy -+*_GCC5_X64_CC_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_SLINK_PATH = ENV(GCC5_X64_PREFIX)gcc-ar -+*_GCC5_X64_DLINK_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_ASLDLINK_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_ASM_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_PP_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_VFRPP_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_ASLCC_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_ASLPP_PATH = ENV(GCC5_X64_PREFIX)gcc -+*_GCC5_X64_RC_PATH = ENV(GCC5_X64_PREFIX)objcopy - - *_GCC5_X64_ASLCC_FLAGS = DEF(GCC5_ASLCC_FLAGS) -m64 - *_GCC5_X64_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_x86_64 diff --git a/0011-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch b/0016-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch similarity index 60% rename from 0011-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch rename to 0016-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch index 21e1f26..77773d4 100644 --- a/0011-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch +++ b/0016-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch @@ -1,7 +1,55 @@ -From c1d277217b6d4115277cac4de26943fde3b7f170 Mon Sep 17 00:00:00 2001 +From c2812d7189dee06c780f05a5880eb421c359a687 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Tue, 4 Nov 2014 23:02:53 +0100 -Subject: [PATCH] OvmfPkg: allow exclusion of the shell from the firmware image +Subject: OvmfPkg: allow exclusion of the shell from the firmware image (RH + only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- context difference from upstream commit ec41733cfd10 ("OvmfPkg: add the + 'initrd' dynamic shell command", 2020-03-04) correctly auto-resolved + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- update the patch against the following upstream commits: + - 4b888334d234 ("OvmfPkg: Remove EdkShellBinPkg in FDF", 2018-11-19) + - 277a3958d93a ("OvmfPkg: Don't include TftpDynamicCommand in XCODE5 + tool chain", 2018-11-27) + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no change + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes + +Message-id: <1415138578-27173-14-git-send-email-lersek@redhat.com> +Patchwork-id: 62119 +O-Subject: [RHEL-7.1 ovmf PATCH v2 13/18] OvmfPkg: allow exclusion of the shell + from the firmware image (RH only) +Bugzilla: 1147592 +Acked-by: Andrew Jones +Acked-by: Gerd Hoffmann +Acked-by: Vitaly Kuznetsov When '-D EXCLUDE_SHELL_FROM_FD' is passed to 'build', exclude the shell binary from the firmware image. @@ -36,29 +84,25 @@ Intended use of the new build option: is specified, the shell binary needs to be built the same, only it will be included in UefiShell.iso. -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- no changes - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- no changes - Signed-off-by: Laszlo Ersek (cherry picked from commit 9c391def70366cabae08e6008814299c3372fafd) (cherry picked from commit d9dd9ee42937b2611fe37183cc9ec7f62d946933) -Signed-off-by: Paolo Bonzini +(cherry picked from commit 23df46ebbe7b09451d3a05034acd4d3a25e7177b) +(cherry picked from commit f0303f71d576c51b01c4ff961b429d0e0e707245) +(cherry picked from commit bbd64eb8658e9a33eab4227d9f4e51ad78d9f687) +(cherry picked from commit 8628ef1b8d675ebec39d83834abbe3c8c8c42cf4) +(cherry picked from commit 229c88dc3ded9baeaca8b87767dc5c41c05afd6e) --- OvmfPkg/OvmfPkgIa32.fdf | 2 ++ - OvmfPkg/OvmfPkgIa32X64.fdf | 3 +++ - OvmfPkg/OvmfPkgX64.fdf | 3 +++ - 3 files changed, 8 insertions(+) + OvmfPkg/OvmfPkgIa32X64.fdf | 2 ++ + OvmfPkg/OvmfPkgX64.fdf | 2 ++ + 3 files changed, 6 insertions(+) diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf -index 6e1e7f5f44..07c1cdbe81 100644 +index ec64551bcb..44178a0da7 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf -@@ -291,11 +291,13 @@ INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResour +@@ -288,11 +288,13 @@ INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResour INF FatPkg/EnhancedFatDxe/Fat.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf @@ -70,13 +114,13 @@ index 6e1e7f5f44..07c1cdbe81 100644 INF ShellPkg/Application/Shell/Shell.inf +!endif - !if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf -index 1fab3d5014..b1560d6218 100644 +index 2f02ac2d73..06259c43d2 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf -@@ -292,11 +292,14 @@ INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResour +@@ -289,11 +289,13 @@ INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResour INF FatPkg/EnhancedFatDxe/Fat.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf @@ -87,15 +131,14 @@ index 1fab3d5014..b1560d6218 100644 !endif INF ShellPkg/Application/Shell/Shell.inf +!endif -+ - !if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf -index 6dc48977a0..34cd97aac4 100644 +index 2f02ac2d73..06259c43d2 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf -@@ -301,11 +301,14 @@ INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResour +@@ -289,11 +289,13 @@ INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResour INF FatPkg/EnhancedFatDxe/Fat.inf INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf @@ -106,7 +149,9 @@ index 6dc48977a0..34cd97aac4 100644 !endif INF ShellPkg/Application/Shell/Shell.inf +!endif -+ - !if ($(SECURE_BOOT_ENABLE) == TRUE) || ($(NETWORK_IP6_ENABLE) == TRUE) || ($(TLS_ENABLE) == TRUE) INF MdeModulePkg/Logo/LogoOpenSSLDxe.inf + +-- +2.18.4 + diff --git a/0012-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch b/0017-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch similarity index 61% rename from 0012-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch rename to 0017-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch index a37d5ac..f73c0e3 100644 --- a/0012-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch +++ b/0017-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch @@ -1,8 +1,41 @@ -From cdd42dea1b59285def15d38feaf2093f9f1688dd Mon Sep 17 00:00:00 2001 +From c75aea7a738ac7fb944c0695a4bfffc3985afaa9 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 14 Oct 2015 13:49:43 +0200 -Subject: [PATCH] ArmPlatformPkg: introduce fixed PCD for early hello message - (RH only) +Subject: ArmPlatformPkg: introduce fixed PCD for early hello message (RH only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no changes + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes Drew has proposed that ARM|AARCH64 platform firmware (especially virtual machine firmware) print a reasonably early, simple hello message to the @@ -17,20 +50,16 @@ RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1270279 Downstream only: . -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- no changes - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- no changes - Suggested-by: Drew Jones Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek (cherry picked from commit 7ce97b06421434c82095f01a1753a8c9c546cc30) (cherry picked from commit 20b1f1cbd0590aa71c6d99d35e23cf08e0707750) -Signed-off-by: Paolo Bonzini +(cherry picked from commit 6734b88cf7abcaf42632e3d2fc469b2169dd2f16) +(cherry picked from commit ef77da632559e9baa1c69869e4cbea377068ef27) +(cherry picked from commit 58755c51d3252312d80cbcb97928d71199c2f5e1) +(cherry picked from commit c3f07e323e76856f1b42ea7b8c598ba3201c28a2) +(cherry picked from commit 9f756c1ad83cc81f7d892cd036d59a2b567b02dc) --- ArmPlatformPkg/ArmPlatformPkg.dec | 7 +++++++ 1 file changed, 7 insertions(+) @@ -53,3 +82,6 @@ index 696d636aac..1553e1ae92 100644 [PcdsFixedAtBuild.common,PcdsDynamic.common] ## PL031 RealTimeClock gArmPlatformTokenSpaceGuid.PcdPL031RtcBase|0x0|UINT32|0x00000024 +-- +2.18.4 + diff --git a/0013-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch b/0018-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch similarity index 70% rename from 0013-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch rename to 0018-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch index b5ecd43..d1c7623 100644 --- a/0013-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch +++ b/0018-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch @@ -1,8 +1,44 @@ -From f9b6876cb7e14d4e863cc33c8999ece2cf399ff6 Mon Sep 17 00:00:00 2001 +From 49fe5596cd79c94d903c4d506c563d642ccd69aa Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 14 Oct 2015 13:59:20 +0200 -Subject: [PATCH] ArmPlatformPkg: PrePeiCore: write early hello message to the - serial port (RH) +Subject: ArmPlatformPkg: PrePeiCore: write early hello message to the serial + port (RH) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- adapt to upstream commit 7e2a8dfe8a9a ("ArmPlatformPkg/PrePeiCore: seed + temporary stack before entering PEI core", 2017-11-09) -- conflict + resolution in "ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf" + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes The FixedPcdGetSize() macro expands to an integer constant, therefore an optimizing compiler can eliminate the new code, if the platform DSC @@ -13,19 +49,15 @@ RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1270279 Downstream only: . -Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: - -- no changes - -Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: - -- no changes - Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek (cherry picked from commit b16c4c505ce0e27305235533eac9236aa66f132e) (cherry picked from commit 742e5bf6d5ce5a1e73879d6e5c0dd00feda7a9ac) -Signed-off-by: Paolo Bonzini +(cherry picked from commit 93d69eb9393cf05af90676253875c59c1bec67fd) +(cherry picked from commit 638594083b191f84f5d9333eb6147a31570f5a5a) +(cherry picked from commit f4b7aae411d88b2b83f85d20ef06a4032a57e7de) +(cherry picked from commit bb71490fdda3b38fa9f071d281b863f9b64363bf) +(cherry picked from commit 8d5a8827aabc67cb2a046697e1a750ca8d9cc453) --- ArmPlatformPkg/PrePeiCore/MainMPCore.c | 5 +++++ ArmPlatformPkg/PrePeiCore/MainUniCore.c | 5 +++++ @@ -92,12 +124,16 @@ index fb01dd1a11..a6681c1032 100644 gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase gArmTokenSpaceGuid.PcdGicSgiIntId diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf -index e9eb092d3a..a02ff39b7a 100644 +index e9eb092d3a..c98dc82f0c 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf -@@ -68,3 +68,5 @@ +@@ -67,4 +67,6 @@ + gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize - gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack -+ + gArmPlatformTokenSpaceGuid.PcdEarlyHelloMessage ++ + gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack +-- +2.18.4 + diff --git a/0019-ArmVirtPkg-set-early-hello-message-RH-only.patch b/0019-ArmVirtPkg-set-early-hello-message-RH-only.patch new file mode 100644 index 0000000..3268425 --- /dev/null +++ b/0019-ArmVirtPkg-set-early-hello-message-RH-only.patch @@ -0,0 +1,76 @@ +From 72550e12ae469012a505bf5b98a6543a754028d3 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 14 Oct 2015 14:07:17 +0200 +Subject: ArmVirtPkg: set early hello message (RH only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- context difference from upstream commit f5cb3767038e + ("ArmVirtPkg/ArmVirtQemu: add ResetSystem PEIM for upcoming TPM2 + support", 2020-03-04) automatically resolved correctly + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- resolve context conflict with upstream commit eaa1e98ae31d ("ArmVirtPkg: + don't set PcdCoreCount", 2019-02-13) + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no changes + +Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase: + +- no changes + +Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase: + +- no changes + +Print a friendly banner on QEMU, regardless of debug mask settings. + +RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1270279 +Downstream only: +. + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +(cherry picked from commit 5d4a15b9019728b2d96322bc679099da49916925) +(cherry picked from commit 179df76dbb0d199bd905236e98775b4059c6502a) +(cherry picked from commit ce3f59d0710c24c162d5222bbf5cd7e36180c80c) +(cherry picked from commit c201a8e6ae28d75f7ba581828b533c3b26fa7f18) +(cherry picked from commit 2d4db6ec70e004cd9ac147615d17033bee5d3b18) +(cherry picked from commit fb2032bbea7e02c426855cf86a323556d493fd8a) +(cherry picked from commit ba73b99d5cb38f87c1a8f0936d515eaaefa3f04b) +--- + ArmVirtPkg/ArmVirtQemu.dsc | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc +index 3345987503..57c5b3f898 100644 +--- a/ArmVirtPkg/ArmVirtQemu.dsc ++++ b/ArmVirtPkg/ArmVirtQemu.dsc +@@ -125,6 +125,7 @@ + gArmVirtTokenSpaceGuid.PcdTpm2SupportEnabled|$(TPM2_ENABLE) + + [PcdsFixedAtBuild.common] ++ gArmPlatformTokenSpaceGuid.PcdEarlyHelloMessage|"UEFI firmware starting.\r\n" + !if $(ARCH) == AARCH64 + gArmTokenSpaceGuid.PcdVFPEnabled|1 + !endif +-- +2.18.4 + diff --git a/0020-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch b/0020-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch new file mode 100644 index 0000000..d41e723 --- /dev/null +++ b/0020-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch @@ -0,0 +1,102 @@ +From 5ecc18badaabe774d9d0806b027ab63a30c6a2d7 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Tue, 21 Nov 2017 00:57:45 +0100 +Subject: OvmfPkg: enable DEBUG_VERBOSE (RHEL only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- context difference from upstream commit 46bb81200742 ("OvmfPkg: Make + SOURCE_DEBUG_ENABLE actually need to be set to TRUE", 2019-10-22) + resolved automatically + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no changes + +Message-id: <20171120235748.29669-5-pbonzini@redhat.com> +Patchwork-id: 77760 +O-Subject: [PATCH 4/7] OvmfPkg: enable DEBUG_VERBOSE (RHEL only) +Bugzilla: 1488247 +Acked-by: Laszlo Ersek +Acked-by: Thomas Huth + +From: Laszlo Ersek + +Set the DEBUG_VERBOSE bit (0x00400000) in the log mask. We want detailed +debug messages, and code in OvmfPkg logs many messages on the +DEBUG_VERBOSE level. + +Signed-off-by: Laszlo Ersek +Signed-off-by: Paolo Bonzini +(this patch was previously applied as commit 78d3ed73172b5738e32d2b0bc03f7984b9584117) +(cherry picked from commit 7aeeaabc9871f657e65d2b99d81011b4964a1ce9) +(cherry picked from commit a0617a6be1a80966099ddceb010f89202a79ee76) +(cherry picked from commit 759bd3f591e2db699bdef4c7ea4e97c908e7f027) +(cherry picked from commit 7e6d5dc4078c64be6d55d8fc3317c59a91507a50) +(cherry picked from commit 3cb92f9ba18ac79911bd5258ff4f949cc617ae89) +--- + OvmfPkg/OvmfPkgIa32.dsc | 2 +- + OvmfPkg/OvmfPkgIa32X64.dsc | 2 +- + OvmfPkg/OvmfPkgX64.dsc | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index 6ce8a46d4e..765ffff312 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -516,7 +516,7 @@ + # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may + # // significantly impact boot performance + # DEBUG_ERROR 0x80000000 // Error +- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F + + !if $(SOURCE_DEBUG_ENABLE) == TRUE + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index 89d414cda7..277297a964 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -520,7 +520,7 @@ + # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may + # // significantly impact boot performance + # DEBUG_ERROR 0x80000000 // Error +- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F + + !if $(SOURCE_DEBUG_ENABLE) == TRUE + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index e567eb76e0..5c1597fe3c 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -520,7 +520,7 @@ + # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may + # // significantly impact boot performance + # DEBUG_ERROR 0x80000000 // Error +- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8040004F + + !if $(SOURCE_DEBUG_ENABLE) == TRUE + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 +-- +2.18.4 + diff --git a/0021-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch b/0021-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch new file mode 100644 index 0000000..fecf55c --- /dev/null +++ b/0021-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch @@ -0,0 +1,147 @@ +From 1355849ad97c1e4a5c430597a377165a5cc118f7 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Tue, 21 Nov 2017 00:57:46 +0100 +Subject: OvmfPkg: silence DEBUG_VERBOSE (0x00400000) in + QemuVideoDxe/QemuRamfbDxe (RH) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- Due to upstream commit 4b04d9d73604 ("OvmfPkg: Don't build in + QemuVideoDxe when we have CSM", 2019-06-26), the contexts of + "QemuVideoDxe.inf" / "QemuRamfbDxe.inf" have changed in the DSC files. + Resolve the conflict manually. + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- Upstream commit 1d25ff51af5c ("OvmfPkg: add QemuRamfbDxe", 2018-06-14) + introduced another GOP driver that consumes FrameBufferBltLib, and + thereby produces a large number of (mostly useless) debug messages at + the DEBUG_VERBOSE level. Extend the patch to suppress those messages in + both QemuVideoDxe and QemuRamfbDxe; update the subject accordingly. + QemuRamfbDxe itself doesn't log anything at the VERBOSE level (see also + the original commit message at the bottom of this downstream patch). + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no changes + +Message-id: <20171120235748.29669-6-pbonzini@redhat.com> +Patchwork-id: 77761 +O-Subject: [PATCH 5/7] OvmfPkg: silence EFI_D_VERBOSE (0x00400000) in + QemuVideoDxe (RH only) +Bugzilla: 1488247 +Acked-by: Laszlo Ersek +Acked-by: Thomas Huth + +From: Laszlo Ersek + +In commit 5b2291f9567a ("OvmfPkg: QemuVideoDxe uses +MdeModulePkg/FrameBufferLib"), QemuVideoDxe was rebased to +FrameBufferBltLib. + +The FrameBufferBltLib instance added in commit b1ca386074bd +("MdeModulePkg: Add FrameBufferBltLib library instance") logs many +messages on the VERBOSE level; for example, a normal boot with OVMF can +produce 500+ "VideoFill" messages, dependent on the progress bar, when the +VERBOSE bit is set in PcdDebugPrintErrorLevel. + +QemuVideoDxe itself doesn't log anything at the VERBOSE level, so we lose +none of its messages this way. + +Signed-off-by: Laszlo Ersek +Signed-off-by: Paolo Bonzini +(this patch was previously applied as commit 9b0d031dee7e823f6717bab73e422fbc6f0a6c52) +(cherry picked from commit 9122d5f2e8d8d289064d1e1700cb61964d9931f3) +(cherry picked from commit 7eb3be1d4ccafc26c11fe5afb95cc12b250ce6f0) +(cherry picked from commit bd650684712fb840dbcda5d6eaee065bd9e91fa1) +(cherry picked from commit b06b87f8ffd4fed4ef7eacb13689a9b6d111f850) +(cherry picked from commit c8c3f893e7c3710afe45c46839e97954871536e4) +--- + OvmfPkg/OvmfPkgIa32.dsc | 10 ++++++++-- + OvmfPkg/OvmfPkgIa32X64.dsc | 10 ++++++++-- + OvmfPkg/OvmfPkgX64.dsc | 10 ++++++++-- + 3 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index 765ffff312..f5c6cceb4f 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -811,9 +811,15 @@ + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf + + !ifndef $(CSM_ENABLE) +- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf ++ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } + !endif +- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf ++ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } + OvmfPkg/VirtioGpuDxe/VirtioGpu.inf + + # +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index 277297a964..c1e52b0acd 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -825,9 +825,15 @@ + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf + + !ifndef $(CSM_ENABLE) +- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf ++ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } + !endif +- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf ++ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } + OvmfPkg/VirtioGpuDxe/VirtioGpu.inf + + # +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index 5c1597fe3c..e65165b9f0 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -821,9 +821,15 @@ + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf + + !ifndef $(CSM_ENABLE) +- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf ++ OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } + !endif +- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf ++ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } + OvmfPkg/VirtioGpuDxe/VirtioGpu.inf + + # +-- +2.18.4 + diff --git a/0022-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch b/0022-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch new file mode 100644 index 0000000..ec0d3c1 --- /dev/null +++ b/0022-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch @@ -0,0 +1,91 @@ +From e7f57f154439c1c18ea5030b01f8d7bc492698b2 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 27 Jan 2016 03:05:18 +0100 +Subject: ArmVirtPkg: silence DEBUG_VERBOSE (0x00400000) in QemuRamfbDxe (RH + only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- The previous version of this patch (downstream commit 76b4ac28e975) + caused a regression (RHBZ#1714446), which was fixed up in downstream + commit 5a216abaa737 ("ArmVirtPkg: silence DEBUG_VERBOSE masking + ~0x00400000 in QemuRamfbDxe (RH only)", 2019-08-05). + + Squash the fixup into the original patch. Fuse the commit messages. + (Acked-by tags are not preserved, lest we confuse ourselves while + reviewing this rebase.) + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- new patch, due to upstream commit c64688f36a8b ("ArmVirtPkg: add + QemuRamfbDxe", 2018-06-14) + +QemuRamfbDxe uses FrameBufferLib. The FrameBufferBltLib instance added in +commit b1ca386074bd ("MdeModulePkg: Add FrameBufferBltLib library +instance") logs many messages on the VERBOSE level; for example, a normal +boot with ArmVirtQemu[Kernel] can produce 500+ "VideoFill" messages, +dependent on the progress bar, when the VERBOSE bit is set in +PcdDebugPrintErrorLevel. + +Clear the VERBOSE bit without touching other bits -- those other bits +differ between the "silent" and "verbose" builds, so we can't set them as +constants. + +QemuRamfbDxe itself doesn't log anything at the VERBOSE level, so we lose +none of its messages, with the VERBOSE bit clear. + +Signed-off-by: Laszlo Ersek +(cherry picked from commit 76b4ac28e975bd63c25db903a1d42c47b38cc756) +Reported-by: Andrew Jones +Suggested-by: Laszlo Ersek +Signed-off-by: Philippe Mathieu-Daude +(cherry picked from commit 5a216abaa737195327235e37563b18a6bf2a74dc) +Signed-off-by: Laszlo Ersek +(cherry picked from commit e5b8152bced2364a1ded0926dbba4d65e23e3f84) +--- + ArmVirtPkg/ArmVirtQemu.dsc | 5 ++++- + ArmVirtPkg/ArmVirtQemuKernel.dsc | 5 ++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc +index 57c5b3f898..dda887b2ae 100644 +--- a/ArmVirtPkg/ArmVirtQemu.dsc ++++ b/ArmVirtPkg/ArmVirtQemu.dsc +@@ -494,7 +494,10 @@ + # + # Video support + # +- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf ++ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|($(DEBUG_PRINT_ERROR_LEVEL)) & 0xFFBFFFFF ++ } + OvmfPkg/VirtioGpuDxe/VirtioGpu.inf + OvmfPkg/PlatformDxe/Platform.inf + +diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc +index d186263e18..711dd63e20 100644 +--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc ++++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc +@@ -427,7 +427,10 @@ + # + # Video support + # +- OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf ++ OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|($(DEBUG_PRINT_ERROR_LEVEL)) & 0xFFBFFFFF ++ } + OvmfPkg/VirtioGpuDxe/VirtioGpu.inf + OvmfPkg/PlatformDxe/Platform.inf + +-- +2.18.4 + diff --git a/0023-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch b/0023-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch new file mode 100644 index 0000000..7f9e40f --- /dev/null +++ b/0023-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch @@ -0,0 +1,89 @@ +From deb3451034326b75fd760aba47a5171493ff055e Mon Sep 17 00:00:00 2001 +From: Philippe Mathieu-Daude +Date: Thu, 1 Aug 2019 20:43:48 +0200 +Subject: OvmfPkg: QemuRamfbDxe: Do not report DXE failure on Aarch64 silent + builds (RH only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- We have to carry this downstream-only patch -- committed originally as + aaaedc1e2cfd -- indefinitely. + +- To avoid confusion, remove the tags from the commit message that had + been added by the downstream maintainer scripts, such as: Message-id, + Patchwork-id, O-Subject, Acked-by. These remain available on the + original downstream commit. The Bugzilla line is preserved, as it + doesn't relate to a specific posting, but to the problem. + +Bugzilla: 1714446 + +To suppress an error message on the silent build when ramfb is +not configured, change QemuRamfbDxe to return EFI_SUCCESS even +when it fails. +Some memory is wasted (driver stays resident without +any good use), but it is mostly harmless, as the memory +is released by the OS after ExitBootServices(). + +Suggested-by: Laszlo Ersek +Signed-off-by: Philippe Mathieu-Daude +(cherry picked from commit aaaedc1e2cfd55ef003fb1b5a37c73a196b26dc7) +Signed-off-by: Laszlo Ersek +(cherry picked from commit aa2b66b18a62d652bdbefae7b5732297294306ca) +--- + OvmfPkg/QemuRamfbDxe/QemuRamfb.c | 14 ++++++++++++++ + OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf | 1 + + 2 files changed, 15 insertions(+) + +diff --git a/OvmfPkg/QemuRamfbDxe/QemuRamfb.c b/OvmfPkg/QemuRamfbDxe/QemuRamfb.c +index 0d49d8bbab..dbf9bcbe16 100644 +--- a/OvmfPkg/QemuRamfbDxe/QemuRamfb.c ++++ b/OvmfPkg/QemuRamfbDxe/QemuRamfb.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -242,6 +243,19 @@ InitializeQemuRamfb ( + + Status = QemuFwCfgFindFile ("etc/ramfb", &mRamfbFwCfgItem, &FwCfgSize); + if (EFI_ERROR (Status)) { ++#if defined (MDE_CPU_AARCH64) ++ // ++ // RHBZ#1714446 ++ // If no ramfb device was configured, this platform DXE driver should ++ // returns EFI_NOT_FOUND, so the DXE Core can unload it. However, even ++ // using a silent build, an error message is issued to the guest console. ++ // Since this confuse users, return success and stay resident. The wasted ++ // guest RAM still gets freed later after ExitBootServices(). ++ // ++ if (GetDebugPrintErrorLevel () == DEBUG_ERROR) { ++ return EFI_SUCCESS; ++ } ++#endif + return EFI_NOT_FOUND; + } + if (FwCfgSize != sizeof (RAMFB_CONFIG)) { +diff --git a/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf b/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf +index e3890b8c20..6ffee5acb2 100644 +--- a/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf ++++ b/OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf +@@ -29,6 +29,7 @@ + BaseLib + BaseMemoryLib + DebugLib ++ DebugPrintErrorLevelLib + DevicePathLib + FrameBufferBltLib + MemoryAllocationLib +-- +2.18.4 + diff --git a/0001-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch b/0024-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch similarity index 56% rename from 0001-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch rename to 0024-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch index c806986..182ed62 100644 --- a/0001-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch +++ b/0024-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch @@ -1,14 +1,56 @@ -From 46e9cd5dd6cb731d33e79b22619b217ba1600e52 Mon Sep 17 00:00:00 2001 +From ed89844b47f46cfe911f1bf2bda40e537a908502 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Tue, 21 Nov 2017 00:57:47 +0100 +Subject: OvmfPkg: silence EFI_D_VERBOSE (0x00400000) in NvmExpressDxe (RH + only) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- no change + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- no change + +Notes about the RHEL-8.0/20180508-ee3198e672e2 -> +RHEL-8.1/20190308-89910a39dcfd rebase: + +- no change + +Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 -> +RHEL-8.0/20180508-ee3198e672e2 rebase: + +- reorder the rebase changelog in the commit message so that it reads like + a blog: place more recent entries near the top +- no changes to the patch body + +Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase: + +- no changes + +Message-id: <20171120235748.29669-7-pbonzini@redhat.com> +Patchwork-id: 77759 +O-Subject: [PATCH 6/7] OvmfPkg: silence EFI_D_VERBOSE (0x00400000) in + NvmExpressDxe (RH only) +Bugzilla: 1488247 +Acked-by: Laszlo Ersek +Acked-by: Thomas Huth + From: Laszlo Ersek -Date: Wed, 27 Jan 2016 03:05:18 +0100 -Subject: [PATCH] OvmfPkg: silence EFI_D_VERBOSE (0x00400000) in NvmExpressDxe NvmExpressDxe logs all BlockIo read & write calls on the EFI_D_VERBOSE level. -Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Signed-off-by: Paolo Bonzini +(this patch was previously applied as commit 5f432837b9c60c2929b13dda1a1b488d5c3a6d2f) +(cherry picked from commit 33e00146eb878588ad1395d7b1ae38f401729da4) +(cherry picked from commit bd10cabcfcb1bc9a32b05062f4ee3792e27bc2d8) +(cherry picked from commit 5a27af700f49e00608f232f618dedd7bf5e9b3e6) +(cherry picked from commit 58bba429b9ec7b78109940ef945d0dc93f3cd958) +(cherry picked from commit b8d0ebded8c2cf5b266c807519e2d8ccfd66fee6) --- OvmfPkg/OvmfPkgIa32.dsc | 5 ++++- OvmfPkg/OvmfPkgIa32X64.dsc | 5 ++++- @@ -16,50 +58,53 @@ Signed-off-by: Paolo Bonzini 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc -index 133a9a93c0..3ddc0c5edb 100644 +index f5c6cceb4f..e8868136d8 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc -@@ -809,7 +809,10 @@ +@@ -804,7 +804,10 @@ OvmfPkg/SataControllerDxe/SataControllerDxe.inf MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf - MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } ++ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc -index 338c38db29..aba4a6cc24 100644 +index c1e52b0acd..d05275a324 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc -@@ -823,7 +823,10 @@ +@@ -818,7 +818,10 @@ OvmfPkg/SataControllerDxe/SataControllerDxe.inf MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf - MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } ++ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc -index b80710fbdc..99c0ba4465 100644 +index e65165b9f0..cac4cecf18 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc -@@ -819,7 +819,10 @@ +@@ -814,7 +814,10 @@ OvmfPkg/SataControllerDxe/SataControllerDxe.inf MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf - MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -+ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { -+ -+ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F -+ } ++ MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf { ++ ++ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F ++ } MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf +-- +2.18.4 + diff --git a/0025-CryptoPkg-OpensslLib-list-RHEL8-specific-OpenSSL-fil.patch b/0025-CryptoPkg-OpensslLib-list-RHEL8-specific-OpenSSL-fil.patch new file mode 100644 index 0000000..7c41c9b --- /dev/null +++ b/0025-CryptoPkg-OpensslLib-list-RHEL8-specific-OpenSSL-fil.patch @@ -0,0 +1,99 @@ +From 56c4bb81b311dfcee6a34c81d3e4feeda7f88995 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Sat, 16 Nov 2019 17:11:27 +0100 +Subject: CryptoPkg/OpensslLib: list RHEL8-specific OpenSSL files in the INFs + (RH) + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- "OpensslLib.inf": + + - Automatic leading context refresh against upstream commit c72ca4666886 + ("CryptoPkg/OpensslLib: Add "sort" keyword to header file parsing + loop", 2020-03-10). + + - Manual trailing context refresh against upstream commit b49a6c8f80d9 + ("CryptoPkg/OpensslLib: improve INF file consistency", 2019-12-02). + +- "OpensslLibCrypto.inf": + + - Automatic leading context refresh against upstream commits + 8906f076de35 ("CryptoPkg/OpensslLib: Add missing header files in INF + file", 2019-08-16) and 9f4fbd56d430 ("CryptoPkg/OpensslLib: Update + process_files.pl to generate .h files", 2019-10-30). + +Notes about the RHEL-8.1/20190308-89910a39dcfd [edk2-stable201903] -> +RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] rebase: + +- new patch + +The downstream changes in RHEL8's OpenSSL package, for example in +"openssl-1.1.1-evp-kdf.patch", introduce new files, and even move some +preexistent code into those new files. In order to avoid undefined +references in link editing, we have to list the new files. + +Note: "process_files.pl" is not re-run at this time manually, because + +(a) "process_files.pl" would pollute the file list (and some of the + auto-generated header files) with RHEL8-specific FIPS artifacts, which + are explicitly unwanted in edk2, + +(b) The RHEL OpenSSL maintainer, Tomas Mraz, identified this specific set + of files in , + and will help with future changes too. + +Signed-off-by: Laszlo Ersek +(cherry picked from commit 57bd3f146590df8757865d8f2cdd1db3cf3f4d40) +--- + CryptoPkg/Library/OpensslLib/OpensslLib.inf | 11 +++++++++++ + CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 11 +++++++++++ + 2 files changed, 22 insertions(+) + +diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf +index c8ec9454bd..24e790b538 100644 +--- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf ++++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf +@@ -570,6 +570,17 @@ + $(OPENSSL_PATH)/ssl/statem/statem.h + $(OPENSSL_PATH)/ssl/statem/statem_locl.h + # Autogenerated files list ends here ++# RHEL8-specific OpenSSL file list starts here ++ $(OPENSSL_PATH)/crypto/evp/kdf_lib.c ++ $(OPENSSL_PATH)/crypto/evp/pkey_kdf.c ++ $(OPENSSL_PATH)/crypto/kdf/kbkdf.c ++ $(OPENSSL_PATH)/crypto/kdf/kdf_local.h ++ $(OPENSSL_PATH)/crypto/kdf/kdf_util.c ++ $(OPENSSL_PATH)/crypto/kdf/krb5kdf.c ++ $(OPENSSL_PATH)/crypto/kdf/pbkdf2.c ++ $(OPENSSL_PATH)/crypto/kdf/sshkdf.c ++ $(OPENSSL_PATH)/crypto/kdf/sskdf.c ++# RHEL8-specific OpenSSL file list ends here + buildinf.h + rand_pool_noise.h + ossl_store.c +diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +index 2f232e3e12..52e70a2d03 100644 +--- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf ++++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +@@ -519,6 +519,17 @@ + $(OPENSSL_PATH)/crypto/x509v3/standard_exts.h + $(OPENSSL_PATH)/crypto/x509v3/v3_admis.h + # Autogenerated files list ends here ++# RHEL8-specific OpenSSL file list starts here ++ $(OPENSSL_PATH)/crypto/evp/kdf_lib.c ++ $(OPENSSL_PATH)/crypto/evp/pkey_kdf.c ++ $(OPENSSL_PATH)/crypto/kdf/kbkdf.c ++ $(OPENSSL_PATH)/crypto/kdf/kdf_local.h ++ $(OPENSSL_PATH)/crypto/kdf/kdf_util.c ++ $(OPENSSL_PATH)/crypto/kdf/krb5kdf.c ++ $(OPENSSL_PATH)/crypto/kdf/pbkdf2.c ++ $(OPENSSL_PATH)/crypto/kdf/sshkdf.c ++ $(OPENSSL_PATH)/crypto/kdf/sskdf.c ++# RHEL8-specific OpenSSL file list ends here + buildinf.h + rand_pool_noise.h + ossl_store.c +-- +2.18.4 + diff --git a/0026-OvmfPkg-X86QemuLoadImageLib-handle-EFI_ACCESS_DENIED.patch b/0026-OvmfPkg-X86QemuLoadImageLib-handle-EFI_ACCESS_DENIED.patch new file mode 100644 index 0000000..613f802 --- /dev/null +++ b/0026-OvmfPkg-X86QemuLoadImageLib-handle-EFI_ACCESS_DENIED.patch @@ -0,0 +1,83 @@ +From bf88198555ce964377a56176de8e5e9b45e43e25 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Sat, 6 Jun 2020 01:16:09 +0200 +Subject: OvmfPkg/X86QemuLoadImageLib: handle EFI_ACCESS_DENIED from + LoadImage() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- new patch + +- the patch is being upstreamed; it's not a backport because the rebase + deadline is close + +- upstream references: + - https://bugzilla.tianocore.org/show_bug.cgi?id=2785 + - http://mid.mail-archive.com/20200605235242.32442-1-lersek@redhat.com + - https://edk2.groups.io/g/devel/message/60825 + - https://www.redhat.com/archives/edk2-devel-archive/2020-June/msg00344.html + +[downstream note ends, upstream commit message starts] + +When an image fails Secure Boot validation, LoadImage() returns +EFI_SECURITY_VIOLATION if the platform policy is +DEFER_EXECUTE_ON_SECURITY_VIOLATION. + +If the platform policy is DENY_EXECUTE_ON_SECURITY_VIOLATION, then +LoadImage() returns EFI_ACCESS_DENIED (and the image does not remain +loaded). + +(Before , this +difference would be masked, as DxeImageVerificationLib would incorrectly +return EFI_SECURITY_VIOLATION for DENY_EXECUTE_ON_SECURITY_VIOLATION as +well.) + +In X86QemuLoadImageLib, proceed to the legacy Linux/x86 Boot Protocol upon +seeing EFI_ACCESS_DENIED too. + +Cc: Ard Biesheuvel +Cc: Jordan Justen +Cc: Philippe Mathieu-DaudĂ© +Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2785 +Signed-off-by: Laszlo Ersek +--- + .../X86QemuLoadImageLib/X86QemuLoadImageLib.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c +index ef753be7ea..931553c0c1 100644 +--- a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c ++++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c +@@ -320,15 +320,21 @@ QemuLoadKernelImage ( + + case EFI_SECURITY_VIOLATION: + // +- // We are running with UEFI secure boot enabled, and the image failed to +- // authenticate. For compatibility reasons, we fall back to the legacy +- // loader in this case. Since the image has been loaded, we need to unload +- // it before proceeding ++ // Since the image has been loaded, we need to unload it before proceeding ++ // to the EFI_ACCESS_DENIED case below. + // + gBS->UnloadImage (KernelImageHandle); + // + // Fall through + // ++ case EFI_ACCESS_DENIED: ++ // ++ // We are running with UEFI secure boot enabled, and the image failed to ++ // authenticate. For compatibility reasons, we fall back to the legacy ++ // loader in this case. ++ // ++ // Fall through ++ // + case EFI_UNSUPPORTED: + // + // The image is not natively supported or cross-type supported. Let's try +-- +2.18.4 + diff --git a/0027-Revert-OvmfPkg-use-generic-QEMU-image-loader-for-sec.patch b/0027-Revert-OvmfPkg-use-generic-QEMU-image-loader-for-sec.patch new file mode 100644 index 0000000..01c44ae --- /dev/null +++ b/0027-Revert-OvmfPkg-use-generic-QEMU-image-loader-for-sec.patch @@ -0,0 +1,184 @@ +From 74e5313dfa6719f7990c7e175e035d17c9b3f657 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Fri, 5 Jun 2020 23:44:43 +0200 +Subject: Revert "OvmfPkg: use generic QEMU image loader for secure boot + enabled builds" + +Notes about the RHEL-8.2/20190904-37eef91017ad [edk2-stable201908] -> +RHEL-8.3/20200603-ca407c7246bf [edk2-stable202005] rebase: + +- new patch (to be dropped later, hopefully) + +This reverts commit ced77332cab626f35fbdb36630be27303d289d79. + +Upstream commit ced77332cab6 ("OvmfPkg: use generic QEMU image loader for +secure boot enabled builds", 2020-03-05) changes the "Secure Boot threat +model" in a way that is incompatible with at least two use cases. + +Namely, OVMF has always considered kernel images direct-booted via fw_cfg +as trusted, bypassing Secure Boot validation. While that approach is +rooted in a technicality (namely, OVMF doesn't load such images with the +LoadImage() UEFI boot service / through the UEFI stub, but with the +Linux/x86 Boot Protocol), that doesn't mean it's wrong. The direct-booted +kernel from fw_cfg comes from the host side, and Secure Boot in the guest +is a barrier between the guest firmware and the guest operating system -- +it's not a barrier between host and guest. + +Upstream commit ced77332cab6 points out that the above (historical) OVMF +behavior differs from ArmVirtQemu's -- the latter direct-boots kernels +from fw_cfg with the LoadImage() / StartImage() boot services. While that +difference indeed exists between OVMF and ArmVirtQemu, it's not relevant +for RHEL downstream. That's because we never build the ArmVirtQemu +firmware with the Secure Boot feature, so LoadImage() can never reject the +direct-booted kernel due to a signing issue. + +Subjecting a kernel direct-booted via fw_cfg to Secure Boot verification +breaks at least two use cases with OVMF: + +- It breaks the %check stage in the SPEC file. + + In that stage, we use the "ovmf-vars-generator" utility from the + "qemu-ovmf-secureboot" project, for verifying whether the Secure Boot + operational mode is enabled. The guest kernel is supposed to boot, and + to print "Secure boot enabled". + + As guest kernel, we pick whatever host kernel is available in the Brew + build root. The kernel in question may be a publicly released RHEL + kernel, signed with "Red Hat Secure Boot (signing key 1)", or a + development build, signed for example with "Red Hat Secure Boot Signing + 3 (beta)". Either way, none of these keys are accepted by the + certificates that were enrolled by "ovmf-vars-generator" / + "EnrollDefaultKeys.efi" in the %build stage. Therefore, the %check stage + fails. + +- It breaks "virt-install --location NETWORK-URL" Linux guest + installations, if the variable store template used for the new domain + has the Secure Boot operational mode enabled. "virt-install --location" + fetches the kernel from the remote OS tree, and passes it to the guest + firmware via fw_cfg. Therefore the above symptom appears (even for + publicly released OSes). + + Importantly, if the user downloads the installer ISO of the publicly + released Fedora / RHEL OS, and exposes the ISO to the guest for example + as a virtio-scsi CD-ROM, then the installation with "virt-install" + (without "--location") does succeed. That's because that way, "shim" is + booted first, from the UEFI-bootable CD-ROM. "Shim" does pass Secure + Boot verification against the Microsoft certificates, and then it is + "shim" that accepts the "Red Hat Secure Boot (signing key 1)" signature + on the guest kernel. + +Some ways to approach this problem (without reverting upstream commit +ced77332cab6): + +- Equip "ovmf-vars-generator" / "EnrollDefaultKeys.efi" to enroll the + public half of "Red Hat Secure Boot (signing key 1)" in the %build + stage. Use a publicly released RHEL kernel in the %check stage. + + Downsides: + + - The Brew build root does not offer any particular released RHEL + kernel, so either the %check stage would have to download it, or the + SRPM would have to bundle it. However, Brew build environments do not + have unfettered network access (rightly so), so the download wouldn't + work. Furthermore, for bundling with the SRPM, such a kernel image + could be considered too large. + + - Does not solve the "virt-install --location" issue for other vendors' + signed kernels. + +- Invoke "ovmf-vars-generator" / "EnrollDefaultKeys.efi" multiple times + during %build, to create multiple varstore templates. One that would + accept publicly released RHEL kernels, and another to accept development + kernels. Don't try to use a particular guest kernel for verification; + instead, check what kernel Brew offers in the build environment, and use + the varstore template matching *that* kernel. + + Downsides: + + - It may be considered useless to perform %check with a varstore + template that is *not* the one that we ship. + + - Does not solve the "virt-install --location" issue for other vendors' + signed kernels. + +- Sign the RHEL kernels such that the currently enrolled certificates + accept them. + + Downsides: + + - Not feasible at all; it would require Microsoft to sign our kernels. + "Shim" exists exactly to eliminate such signing requirements. + +- Modify "virt-install --location NETWORK-URL" such that it download a + complete (UEFI-bootable) installer ISO image, rather than broken-out + vmlinuz / initrd files. In other words, replace direct (fw_cfg) kernel + boot with a CD-ROM / "shim" boot, internally to "virt-install". + + Downsides: + + - Defeats the goal of "virt-install --location NETWORK-URL", and defeats + the network installation method of (for example) Anaconda. + +For now, revert upstream commit ced77332cab6, in order to return to the +model we had used in RHEL-8.2 and before. The following ticket has been +filed to investigate the problem separately: +. + +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/OvmfPkgIa32.dsc | 4 ---- + OvmfPkg/OvmfPkgIa32X64.dsc | 4 ---- + OvmfPkg/OvmfPkgX64.dsc | 4 ---- + 3 files changed, 12 deletions(-) + +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index e8868136d8..5b1e757cb9 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -379,11 +379,7 @@ + PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf + MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf + QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +-!if $(SECURE_BOOT_ENABLE) == TRUE +- QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf +-!else + QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf +-!endif + !if $(TPM_ENABLE) == TRUE + Tpm12DeviceLib|SecurityPkg/Library/Tpm12DeviceLibTcg/Tpm12DeviceLibTcg.inf + Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index d05275a324..5dffc32105 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -383,11 +383,7 @@ + PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf + MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf + QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +-!if $(SECURE_BOOT_ENABLE) == TRUE +- QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf +-!else + QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf +-!endif + !if $(TPM_ENABLE) == TRUE + Tpm12DeviceLib|SecurityPkg/Library/Tpm12DeviceLibTcg/Tpm12DeviceLibTcg.inf + Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index cac4cecf18..a2a76fdeea 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -383,11 +383,7 @@ + PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf + MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf + QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +-!if $(SECURE_BOOT_ENABLE) == TRUE +- QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf +-!else + QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf +-!endif + !if $(TPM_ENABLE) == TRUE + Tpm12DeviceLib|SecurityPkg/Library/Tpm12DeviceLibTcg/Tpm12DeviceLibTcg.inf + Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf +-- +2.18.4 + diff --git a/0038-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch b/0038-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch new file mode 100644 index 0000000..efc1d36 --- /dev/null +++ b/0038-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch @@ -0,0 +1,85 @@ +From 9adcdf493ebbd11efb74e2905ab5f6c8996e096d Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 24 Jun 2020 11:31:36 +0200 +Subject: OvmfPkg/QemuKernelLoaderFsDxe: suppress error on no "-kernel" in + silent aa64 build (RH) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek +Message-id: <20200615080105.11859-2-lersek@redhat.com> +Patchwork-id: 97532 +O-Subject: [RHEL-8.3.0 edk2 PATCH 1/3] OvmfPkg/QemuKernelLoaderFsDxe: suppress error on no "-kernel" in silent aa64 build (RH) +Bugzilla: 1844682 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina +RH-Acked-by: Philippe Mathieu-DaudĂ© + +If the "-kernel" QEMU option is not used, then QemuKernelLoaderFsDxe +should return EFI_NOT_FOUND, so that the DXE Core can unload it. However, +the associated error message, logged by the DXE Core to the serial +console, is not desired in the silent edk2-aarch64 build, given that the +absence of "-kernel" is nothing out of the ordinary. Therefore, return +success and stay resident. The wasted guest RAM still gets freed after +ExitBootServices(). + +(Inspired by RHEL-8.1.0 commit aaaedc1e2cfd.) + +Signed-off-by: Laszlo Ersek +Signed-off-by: Miroslav Rezanina +--- + .../QemuKernelLoaderFsDxe.c | 17 +++++++++++++++++ + .../QemuKernelLoaderFsDxe.inf | 1 + + 2 files changed, 18 insertions(+) + +diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c +index b09ff6a359..ec0244d61b 100644 +--- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c ++++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1039,6 +1040,22 @@ QemuKernelLoaderFsDxeEntrypoint ( + + if (KernelBlob->Data == NULL) { + Status = EFI_NOT_FOUND; ++#if defined (MDE_CPU_AARCH64) ++ // ++ // RHBZ#1844682 ++ // ++ // If the "-kernel" QEMU option is not being used, this platform DXE driver ++ // should return EFI_NOT_FOUND, so that the DXE Core can unload it. ++ // However, the associated error message, logged by the DXE Core to the ++ // serial console, is not desired in the silent edk2-aarch64 build, given ++ // that the absence of "-kernel" is nothing out of the ordinary. Therefore, ++ // return success and stay resident. The wasted guest RAM still gets freed ++ // after ExitBootServices(). ++ // ++ if (GetDebugPrintErrorLevel () == DEBUG_ERROR) { ++ Status = EFI_SUCCESS; ++ } ++#endif + goto FreeBlobs; + } + +diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf +index 7b35adb8e0..e0331c6e2c 100644 +--- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf ++++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf +@@ -28,6 +28,7 @@ + BaseLib + BaseMemoryLib + DebugLib ++ DebugPrintErrorLevelLib + DevicePathLib + MemoryAllocationLib + QemuFwCfgLib +-- +2.18.4 + diff --git a/0039-OvmfPkg-GenericQemuLoadImageLib-log-Not-Found-at-INF.patch b/0039-OvmfPkg-GenericQemuLoadImageLib-log-Not-Found-at-INF.patch new file mode 100644 index 0000000..f2324a3 --- /dev/null +++ b/0039-OvmfPkg-GenericQemuLoadImageLib-log-Not-Found-at-INF.patch @@ -0,0 +1,49 @@ +From 135d3d4b4ff12927f7b0c44e067fd42ceae83bb7 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 24 Jun 2020 11:37:50 +0200 +Subject: OvmfPkg/GenericQemuLoadImageLib: log "Not Found" at INFO level +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek +Message-id: <20200615080105.11859-3-lersek@redhat.com> +Patchwork-id: 97533 +O-Subject: [RHEL-8.3.0 edk2 PATCH 2/3] OvmfPkg/GenericQemuLoadImageLib: log "Not Found" at INFO level +Bugzilla: 1844682 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina +RH-Acked-by: Philippe Mathieu-DaudĂ© + +gBS->LoadImage() returning EFI_NOT_FOUND is an expected condition; it +means that QEMU wasn't started with "-kernel". Log this status code as +INFO rather than ERROR. + +Cc: Ard Biesheuvel +Cc: Jordan Justen +Cc: Philippe Mathieu-DaudĂƒÂƒĂ‚Â© +Signed-off-by: Laszlo Ersek +Message-Id: <20200609105414.12474-1-lersek@redhat.com> +Acked-by: Ard Biesheuvel +(cherry picked from commit 14c7ed8b51f60097ad771277da69f74b22a7a759) +--- + .../Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c b/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c +index 14c8417d43..114db7e844 100644 +--- a/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c ++++ b/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c +@@ -106,7 +106,8 @@ QemuLoadKernelImage ( + goto UnloadImage; + + default: +- DEBUG ((DEBUG_ERROR, "%a: LoadImage(): %r\n", __FUNCTION__, Status)); ++ DEBUG ((Status == EFI_NOT_FOUND ? DEBUG_INFO : DEBUG_ERROR, ++ "%a: LoadImage(): %r\n", __FUNCTION__, Status)); + return Status; + } + +-- +2.18.4 + diff --git a/0040-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch b/0040-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch new file mode 100644 index 0000000..daa223f --- /dev/null +++ b/0040-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch @@ -0,0 +1,84 @@ +From cbce29f7749477e271f9764fed82de94724af5df Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 24 Jun 2020 11:40:09 +0200 +Subject: SecurityPkg/Tcg2Dxe: suppress error on no swtpm in silent aa64 build + (RH) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek +Message-id: <20200615080105.11859-4-lersek@redhat.com> +Patchwork-id: 97534 +O-Subject: [RHEL-8.3.0 edk2 PATCH 3/3] SecurityPkg/Tcg2Dxe: suppress error on no swtpm in silent aa64 build (RH) +Bugzilla: 1844682 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina +RH-Acked-by: Philippe Mathieu-DaudĂ© + +If swtpm / vTPM2 is not being used, Tcg2Dxe should return EFI_UNSUPPORTED, +so that the DXE Core can unload it. However, the associated error message, +logged by the DXE Core to the serial console, is not desired in the silent +edk2-aarch64 build, given that the absence of swtpm / vTPM2 is nothing out +of the ordinary. Therefore, return success and stay resident. The wasted +guest RAM still gets freed after ExitBootServices(). + +(Inspired by RHEL-8.1.0 commit aaaedc1e2cfd.) + +Signed-off-by: Laszlo Ersek +Signed-off-by: Miroslav Rezanina +--- + SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 17 +++++++++++++++++ + SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf | 1 + + 2 files changed, 18 insertions(+) + +diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +index 9a5f987e68..da2153cb25 100644 +--- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c ++++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +@@ -28,6 +28,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent + #include + + #include ++#include + #include + #include + #include +@@ -2642,6 +2643,22 @@ DriverEntry ( + if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceNoneGuid) || + CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm12Guid)){ + DEBUG ((DEBUG_INFO, "No TPM2 instance required!\n")); ++#if defined (MDE_CPU_AARCH64) ++ // ++ // RHBZ#1844682 ++ // ++ // If swtpm / vTPM2 is not being used, this driver should return ++ // EFI_UNSUPPORTED, so that the DXE Core can unload it. However, the ++ // associated error message, logged by the DXE Core to the serial console, ++ // is not desired in the silent edk2-aarch64 build, given that the absence ++ // of swtpm / vTPM2 is nothing out of the ordinary. Therefore, return ++ // success and stay resident. The wasted guest RAM still gets freed after ++ // ExitBootServices(). ++ // ++ if (GetDebugPrintErrorLevel () == DEBUG_ERROR) { ++ return EFI_SUCCESS; ++ } ++#endif + return EFI_UNSUPPORTED; + } + +diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf +index 576cf80d06..851471afb7 100644 +--- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf ++++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf +@@ -55,6 +55,7 @@ + UefiRuntimeServicesTableLib + BaseMemoryLib + DebugLib ++ DebugPrintErrorLevelLib + Tpm2CommandLib + PrintLib + UefiLib +-- +2.18.4 + diff --git a/0042-UefiCpuPkg-PiSmmCpuDxeSmm-pause-in-WaitForSemaphore-.patch b/0042-UefiCpuPkg-PiSmmCpuDxeSmm-pause-in-WaitForSemaphore-.patch new file mode 100644 index 0000000..ef28605 --- /dev/null +++ b/0042-UefiCpuPkg-PiSmmCpuDxeSmm-pause-in-WaitForSemaphore-.patch @@ -0,0 +1,105 @@ +From 70c9d989107c6ac964bb437c5a4ea6ffe3214e45 Mon Sep 17 00:00:00 2001 +From: Miroslav Rezanina +Date: Mon, 10 Aug 2020 07:52:28 +0200 +Subject: UefiCpuPkg/PiSmmCpuDxeSmm: pause in WaitForSemaphore() before + re-fetch +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek +Message-id: <20200731141037.1941-2-lersek@redhat.com> +Patchwork-id: 98121 +O-Subject: [RHEL-8.3.0 edk2 PATCH 1/1] UefiCpuPkg/PiSmmCpuDxeSmm: pause in WaitForSemaphore() before re-fetch +Bugzilla: 1861718 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Eduardo Habkost + +Most busy waits (spinlocks) in "UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c" +already call CpuPause() in their loop bodies; see SmmWaitForApArrival(), +APHandler(), and SmiRendezvous(). However, the "main wait" within +APHandler(): + +> // +> // Wait for something to happen +> // +> WaitForSemaphore (mSmmMpSyncData->CpuData[CpuIndex].Run); + +doesn't do so, as WaitForSemaphore() keeps trying to acquire the semaphore +without pausing. + +The performance impact is especially notable in QEMU/KVM + OVMF +virtualization with CPU overcommit (that is, when the guest has +significantly more VCPUs than the host has physical CPUs). The guest BSP +is working heavily in: + + BSPHandler() [MpService.c] + PerformRemainingTasks() [PiSmmCpuDxeSmm.c] + SetUefiMemMapAttributes() [SmmCpuMemoryManagement.c] + +while the many guest APs are spinning in the "Wait for something to +happen" semaphore acquisition, in APHandler(). The guest APs are +generating useless memory traffic and saturating host CPUs, hindering the +guest BSP's progress in SetUefiMemMapAttributes(). + +Rework the loop in WaitForSemaphore(): call CpuPause() in every iteration +after the first check fails. Due to Pause Loop Exiting (known as Pause +Filter on AMD), the host scheduler can favor the guest BSP over the guest +APs. + +Running a 16 GB RAM + 512 VCPU guest on a 448 PCPU host, this patch +reduces OVMF boot time (counted until reaching grub) from 20-30 minutes to +less than 4 minutes. + +The patch should benefit physical machines as well -- according to the +Intel SDM, PAUSE "Improves the performance of spin-wait loops". Adding +PAUSE to the generic WaitForSemaphore() function is considered a general +improvement. + +Cc: Eric Dong +Cc: Philippe Mathieu-DaudĂƒÂƒĂ‚Â© +Cc: Rahul Kumar +Cc: Ray Ni +Ref: https://bugzilla.redhat.com/show_bug.cgi?id=1861718 +Signed-off-by: Laszlo Ersek +Message-Id: <20200729185217.10084-1-lersek@redhat.com> +Reviewed-by: Eric Dong +(cherry picked from commit 9001b750df64b25b14ec45a2efa1361a7b96c00a) +Signed-off-by: Miroslav Rezanina +--- + UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +index 57e788c01b..4bcd217917 100644 +--- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c ++++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +@@ -40,14 +40,18 @@ WaitForSemaphore ( + { + UINT32 Value; + +- do { ++ for (;;) { + Value = *Sem; +- } while (Value == 0 || +- InterlockedCompareExchange32 ( +- (UINT32*)Sem, +- Value, +- Value - 1 +- ) != Value); ++ if (Value != 0 && ++ InterlockedCompareExchange32 ( ++ (UINT32*)Sem, ++ Value, ++ Value - 1 ++ ) == Value) { ++ break; ++ } ++ CpuPause (); ++ } + return Value - 1; + } + +-- +2.18.4 + diff --git a/0045-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch b/0045-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch new file mode 100644 index 0000000..8a10cf3 --- /dev/null +++ b/0045-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch @@ -0,0 +1,139 @@ +From a5efebddb858c739d4a67865a4f8d836ba989d30 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Tue, 14 Jul 2020 20:43:05 +0200 +Subject: OvmfPkg/SmmControl2Dxe: negotiate ICH9_LPC_SMI_F_CPU_HOTPLUG +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek (lersek) +RH-MergeRequest: 1: [RHEL-8.4.0] complete the "VCPU hotplug with SMI" OVMF feature +RH-Commit: [1/3] 33d820d43a1be2ece09044b0cf105275f3fcc9ce (lersek/edk2) +RH-Bugzilla: 1849177 + +The ICH9_LPC_SMI_F_BROADCAST and ICH9_LPC_SMI_F_CPU_HOTPLUG feature flags +cause QEMU to behave as follows: + + BROADCAST CPU_HOTPLUG use case / behavior + --------- ----------- ------------------------------------------------ + clear clear OVMF built without SMM_REQUIRE; or very old OVMF + (from before commit a316d7ac91d3 / 2017-02-07). + QEMU permits CPU hotplug operations, and does + not cause the OS to inject an SMI upon hotplug. + Firmware is not expected to be aware of hotplug + events. + + clear set Invalid feature set; QEMU rejects the feature + negotiation. + + set clear OVMF after a316d7ac91d3 / 2017-02-07, built with + SMM_REQUIRE, but no support for CPU hotplug. + QEMU gracefully refuses hotplug operations. + + set set OVMF after a316d7ac91d3 / 2017-02-07, built with + SMM_REQUIRE, and supporting CPU hotplug. QEMU + permits CPU hotplug operations, and causes the + OS to inject an SMI upon hotplug. Firmware is + expected to deal with hotplug events. + +Negotiate ICH9_LPC_SMI_F_CPU_HOTPLUG -- but only if SEV is disabled, as +OvmfPkg/CpuHotplugSmm can't deal with SEV yet. + +Cc: Ard Biesheuvel +Cc: Boris Ostrovsky +Cc: Igor Mammedov +Cc: Jordan Justen +Cc: Liran Alon +Cc: Philippe Mathieu-DaudĂ© +Signed-off-by: Laszlo Ersek +Message-Id: <20200714184305.9814-1-lersek@redhat.com> +Acked-by: Ard Biesheuvel +Reviewed-by: Philippe Mathieu-DaudĂ© +(cherry picked from commit 5ba203b54e5953572e279e5505cd65e4cc360e34) +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/SmmControl2Dxe/SmiFeatures.c | 26 +++++++++++++++++++++-- + OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf | 1 + + 2 files changed, 25 insertions(+), 2 deletions(-) + +diff --git a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c +index 6210b7515e..c9d8755432 100644 +--- a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c ++++ b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c +@@ -9,6 +9,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -21,6 +22,12 @@ + // "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg files. + // + #define ICH9_LPC_SMI_F_BROADCAST BIT0 ++// ++// The following bit value stands for "enable CPU hotplug, and inject an SMI ++// with control value ICH9_APM_CNT_CPU_HOTPLUG upon hotplug", in the ++// "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg files. ++// ++#define ICH9_LPC_SMI_F_CPU_HOTPLUG BIT1 + + // + // Provides a scratch buffer (allocated in EfiReservedMemoryType type memory) +@@ -67,6 +74,7 @@ NegotiateSmiFeatures ( + UINTN SupportedFeaturesSize; + UINTN RequestedFeaturesSize; + UINTN FeaturesOkSize; ++ UINT64 RequestedFeaturesMask; + + // + // Look up the fw_cfg files used for feature negotiation. The selector keys +@@ -104,9 +112,16 @@ NegotiateSmiFeatures ( + QemuFwCfgReadBytes (sizeof mSmiFeatures, &mSmiFeatures); + + // +- // We want broadcast SMI and nothing else. ++ // We want broadcast SMI, SMI on CPU hotplug, and nothing else. + // +- mSmiFeatures &= ICH9_LPC_SMI_F_BROADCAST; ++ RequestedFeaturesMask = ICH9_LPC_SMI_F_BROADCAST; ++ if (!MemEncryptSevIsEnabled ()) { ++ // ++ // For now, we only support hotplug with SEV disabled. ++ // ++ RequestedFeaturesMask |= ICH9_LPC_SMI_F_CPU_HOTPLUG; ++ } ++ mSmiFeatures &= RequestedFeaturesMask; + QemuFwCfgSelectItem (mRequestedFeaturesItem); + QemuFwCfgWriteBytes (sizeof mSmiFeatures, &mSmiFeatures); + +@@ -144,6 +159,13 @@ NegotiateSmiFeatures ( + DEBUG ((DEBUG_INFO, "%a: using SMI broadcast\n", __FUNCTION__)); + } + ++ if ((mSmiFeatures & ICH9_LPC_SMI_F_CPU_HOTPLUG) == 0) { ++ DEBUG ((DEBUG_INFO, "%a: CPU hotplug not negotiated\n", __FUNCTION__)); ++ } else { ++ DEBUG ((DEBUG_INFO, "%a: CPU hotplug with SMI negotiated\n", ++ __FUNCTION__)); ++ } ++ + // + // Negotiation successful (although we may not have gotten the optimal + // feature set). +diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf +index 3abed141e6..b8fdea8deb 100644 +--- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf ++++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf +@@ -46,6 +46,7 @@ + BaseLib + DebugLib + IoLib ++ MemEncryptSevLib + MemoryAllocationLib + PcdLib + PciLib +-- +2.18.4 + diff --git a/0046-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-befo.patch b/0046-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-befo.patch new file mode 100644 index 0000000..3ac775e --- /dev/null +++ b/0046-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-befo.patch @@ -0,0 +1,90 @@ +From 4e5edfcdf5986d9e0801a976a3aa558b5f370099 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Thu, 27 Aug 2020 00:21:28 +0200 +Subject: OvmfPkg/CpuHotplugSmm: fix CPU hotplug race just before SMI broadcast +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek (lersek) +RH-MergeRequest: 1: [RHEL-8.4.0] complete the "VCPU hotplug with SMI" OVMF feature +RH-Commit: [2/3] ea3ff703dfb7bd4f77b6807f06c89e754cc9d980 (lersek/edk2) +RH-Bugzilla: 1849177 + +The "virsh setvcpus" (plural) command may hot-plug several VCPUs in quick +succession -- it means a series of "device_add" QEMU monitor commands, +back-to-back. + +If a "device_add" occurs *just before* ACPI raises the broadcast SMI, +then: + +- OVMF processes the hot-added CPU well. + +- However, QEMU's post-SMI ACPI loop -- which clears the pending events + for the hot-added CPUs that were collected before raising the SMI -- is + unaware of the stray CPU. Thus, the pending event is not cleared for it. + +As a result of the stuck event, at the next hot-plug, OVMF tries to re-add +(relocate for the 2nd time) the already-known CPU. At that time, the AP is +already in the normal edk2 SMM busy-wait however, so it doesn't respond to +the exchange that the BSP intends to do in SmbaseRelocate(). Thus the VM +gets stuck in SMM. + +(Because of the above symptom, this is not considered a security patch; it +doesn't seem exploitable by a malicious guest OS.) + +In CpuHotplugMmi(), skip the supposedly hot-added CPU if it's already +known. The post-SMI ACPI loop will clear the pending event for it this +time. + +Cc: Ard Biesheuvel +Cc: Igor Mammedov +Cc: Jordan Justen +Cc: Philippe Mathieu-DaudĂ© +Fixes: bc498ac4ca7590479cfd91ad1bb8a36286b0dc21 +Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2929 +Signed-off-by: Laszlo Ersek +Message-Id: <20200826222129.25798-2-lersek@redhat.com> +Reviewed-by: Ard Biesheuvel +(cherry picked from commit 020bb4b46d6f6708bb3358e1c738109b7908f0de) +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/CpuHotplugSmm/CpuHotplug.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplug.c b/OvmfPkg/CpuHotplugSmm/CpuHotplug.c +index 20e6bec04f..cfe698ed2b 100644 +--- a/OvmfPkg/CpuHotplugSmm/CpuHotplug.c ++++ b/OvmfPkg/CpuHotplugSmm/CpuHotplug.c +@@ -193,9 +193,28 @@ CpuHotplugMmi ( + NewSlot = 0; + while (PluggedIdx < PluggedCount) { + APIC_ID NewApicId; ++ UINT32 CheckSlot; + UINTN NewProcessorNumberByProtocol; + + NewApicId = mPluggedApicIds[PluggedIdx]; ++ ++ // ++ // Check if the supposedly hot-added CPU is already known to us. ++ // ++ for (CheckSlot = 0; ++ CheckSlot < mCpuHotPlugData->ArrayLength; ++ CheckSlot++) { ++ if (mCpuHotPlugData->ApicId[CheckSlot] == NewApicId) { ++ break; ++ } ++ } ++ if (CheckSlot < mCpuHotPlugData->ArrayLength) { ++ DEBUG ((DEBUG_VERBOSE, "%a: APIC ID " FMT_APIC_ID " was hot-plugged " ++ "before; ignoring it\n", __FUNCTION__, NewApicId)); ++ PluggedIdx++; ++ continue; ++ } ++ + // + // Find the first empty slot in CPU_HOT_PLUG_DATA. + // +-- +2.18.4 + diff --git a/0047-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-afte.patch b/0047-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-afte.patch new file mode 100644 index 0000000..e0af2ae --- /dev/null +++ b/0047-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-afte.patch @@ -0,0 +1,119 @@ +From 08a95c3541cbe2b3a1c671fa683bd6214ad996f0 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Thu, 27 Aug 2020 00:21:29 +0200 +Subject: OvmfPkg/CpuHotplugSmm: fix CPU hotplug race just after SMI broadcast +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RH-Author: Laszlo Ersek (lersek) +RH-MergeRequest: 1: [RHEL-8.4.0] complete the "VCPU hotplug with SMI" OVMF feature +RH-Commit: [3/3] 40521ea89725b8b0ff8ca3f0a610ff45431e610e (lersek/edk2) +RH-Bugzilla: 1849177 + +The "virsh setvcpus" (plural) command may hot-plug several VCPUs in quick +succession -- it means a series of "device_add" QEMU monitor commands, +back-to-back. + +If a "device_add" occurs *just after* ACPI raises the broadcast SMI, then: + +- the CPU_FOREACH() loop in QEMU's ich9_apm_ctrl_changed() cannot make the + SMI pending for the new CPU -- at that time, the new CPU doesn't even + exist yet, + +- OVMF will find the new CPU however (in the CPU hotplug register block), + in QemuCpuhpCollectApicIds(). + +As a result, when the firmware sends an INIT-SIPI-SIPI to the new CPU in +SmbaseRelocate(), expecting it to boot into SMM (due to the pending SMI), +the new CPU instead boots straight into the post-RSM (normal mode) "pen", +skipping its initial SMI handler. + +The CPU halts nicely in the pen, but its SMBASE is never relocated, and +the SMRAM message exchange with the BSP falls apart -- the BSP gets stuck +in the following loop: + + // + // Wait until the hot-added CPU is just about to execute RSM. + // + while (Context->AboutToLeaveSmm == 0) { + CpuPause (); + } + +because the new CPU's initial SMI handler never sets the flag to nonzero. + +Fix this by sending a directed SMI to the new CPU just before sending it +the INIT-SIPI-SIPI. The various scenarios are documented in the code -- +the cases affected by the patch are documented under point (2). + +Note that this is not considered a security patch, as for a malicious +guest OS, the issue is not exploitable -- the symptom is a hang on the +BSP, in the above-noted loop in SmbaseRelocate(). Instead, the patch fixes +behavior for a benign guest OS. + +Cc: Ard Biesheuvel +Cc: Igor Mammedov +Cc: Jordan Justen +Cc: Philippe Mathieu-DaudĂ© +Fixes: 51a6fb41181529e4b50ea13377425bda6bb69ba6 +Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2929 +Signed-off-by: Laszlo Ersek +Message-Id: <20200826222129.25798-3-lersek@redhat.com> +Reviewed-by: Ard Biesheuvel +(cherry picked from commit cbccf995920a28071f5403b847f29ebf8b732fa9) +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/CpuHotplugSmm/Smbase.c | 35 ++++++++++++++++++++++++++++------ + 1 file changed, 29 insertions(+), 6 deletions(-) + +diff --git a/OvmfPkg/CpuHotplugSmm/Smbase.c b/OvmfPkg/CpuHotplugSmm/Smbase.c +index 170571221d..d8f45c4313 100644 +--- a/OvmfPkg/CpuHotplugSmm/Smbase.c ++++ b/OvmfPkg/CpuHotplugSmm/Smbase.c +@@ -220,14 +220,37 @@ SmbaseRelocate ( + // + // Boot the hot-added CPU. + // +- // If the OS is benign, and so the hot-added CPU is still in RESET state, +- // then the broadcast SMI is still pending for it; it will now launch +- // directly into SMM. ++ // There are 2*2 cases to consider: + // +- // If the OS is malicious, the hot-added CPU has been booted already, and so +- // it is already spinning on the APIC ID gate. In that case, the +- // INIT-SIPI-SIPI below will be ignored. ++ // (1) The CPU was hot-added before the SMI was broadcast. + // ++ // (1.1) The OS is benign. ++ // ++ // The hot-added CPU is in RESET state, with the broadcast SMI pending ++ // for it. The directed SMI below will be ignored (it's idempotent), ++ // and the INIT-SIPI-SIPI will launch the CPU directly into SMM. ++ // ++ // (1.2) The OS is malicious. ++ // ++ // The hot-added CPU has been booted, by the OS. Thus, the hot-added ++ // CPU is spinning on the APIC ID gate. In that case, both the SMI and ++ // the INIT-SIPI-SIPI below will be ignored. ++ // ++ // (2) The CPU was hot-added after the SMI was broadcast. ++ // ++ // (2.1) The OS is benign. ++ // ++ // The hot-added CPU is in RESET state, with no SMI pending for it. The ++ // directed SMI will latch the SMI for the CPU. Then the INIT-SIPI-SIPI ++ // will launch the CPU into SMM. ++ // ++ // (2.2) The OS is malicious. ++ // ++ // The hot-added CPU is executing OS code. The directed SMI will pull ++ // the hot-added CPU into SMM, where it will start spinning on the APIC ++ // ID gate. The INIT-SIPI-SIPI will be ignored. ++ // ++ SendSmiIpi (ApicId); + SendInitSipiSipi (ApicId, PenAddress); + + // +-- +2.18.4 + diff --git a/0048-CryptoPkg-OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch b/0048-CryptoPkg-OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch new file mode 100644 index 0000000..a9946cc --- /dev/null +++ b/0048-CryptoPkg-OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch @@ -0,0 +1,386 @@ +From e81751a1c303f5cd4bcae0ed1a38c60c38a0cf38 Mon Sep 17 00:00:00 2001 +From: Guomin Jiang +Date: Fri, 10 Jul 2020 09:47:31 +0800 +Subject: CryptoPkg/OpensslLib: Upgrade OpenSSL to 1.1.1g + +RH-Author: Laszlo Ersek (lersek) +RH-MergeRequest: 2: [RHEL-8.4.0] bump OpenSSL dist-git submodule to 1.1.1g +RH-Commit: [1/2] 36d4bc34a3b5c421819e94c58ff84fd779a93bae (lersek/edk2) +RH-Bugzilla: 1893806 + +--v-- RHEL8 notes --v-- + +- The "CryptoPkg/Library/OpensslLib/openssl" hunk, advancing upstream + edk2's OpenSSL submodule reference, has been stripped from this + backport. (Refer to downstream commit c5d729df70f8 ("remove upstream + edk2's openssl submodule (RH only)", 2020-06-05), as basis.) The + corresponding RHEL8 OpenSSL dist-git bump is implemented in a subsequent + patch in this series. + + This cherry-pick and the RHEL8 OpenSSL dist-git submodule bump are kept + separate for easing the next rebase, even at the cost of introducing a + brief interval in the git history where the downstream exploded tree + does not build. + +- Contextual difference in "OpensslLib.inf" due to downstream commit + 56c4bb81b311 ("CryptoPkg/OpensslLib: list RHEL8-specific OpenSSL files + in the INFs (RH)", 2020-06-05); automatically resolved by + git-cherry-pick. + +--^-- RHEL8 notes --^-- + +Upgrade openssl to 1.1.1g. the directory have been reorganized, +openssl moved crypto/include/internal to include/crypto folder. +So we change directory to match the re-organization. + +The dso_conf.h and opensslconf.h will generated in UNIX format, +change process_files.pl to covent the EOL automatically. + +Cc: Jian J Wang +Cc: Xiaoyu Lu +Signed-off-by: Guomin Jiang +Reviewed-by: Laszlo Ersek +Tested-by: Laszlo Ersek +Reviewed-by: Jian J Wang +(cherry picked from commit 8c30327debb28c0b6cfa2106b736774e0b20daac) +Signed-off-by: Laszlo Ersek +--- + CryptoPkg/CryptoPkg.dec | 1 - + .../Library/BaseCryptLib/Hash/CryptSm3.c | 2 +- + .../BaseCryptLib/Pk/CryptPkcs7VerifyEku.c | 4 +- + .../Include/{internal => crypto}/dso_conf.h | 32 +++++----- + .../Library/Include/openssl/opensslconf.h | 3 - + CryptoPkg/Library/OpensslLib/OpensslLib.inf | 58 +++++++++---------- + .../Library/OpensslLib/OpensslLibCrypto.inf | 50 ++++++++-------- + CryptoPkg/Library/OpensslLib/process_files.pl | 25 +++++--- + CryptoPkg/Library/OpensslLib/rand_pool.c | 2 +- + 9 files changed, 90 insertions(+), 87 deletions(-) + rename CryptoPkg/Library/Include/{internal => crypto}/dso_conf.h (76%) + +diff --git a/CryptoPkg/CryptoPkg.dec b/CryptoPkg/CryptoPkg.dec +index 4d1a1368a8..5888941bab 100644 +--- a/CryptoPkg/CryptoPkg.dec ++++ b/CryptoPkg/CryptoPkg.dec +@@ -23,7 +23,6 @@ + Private + Library/Include + Library/OpensslLib/openssl/include +- Library/OpensslLib/openssl/crypto/include + + [LibraryClasses] + ## @libraryclass Provides basic library functions for cryptographic primitives. +diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c +index eacf4826c4..235331c2a0 100644 +--- a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c ++++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c +@@ -7,7 +7,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent + **/ + + #include "InternalCryptLib.h" +-#include "internal/sm3.h" ++#include "crypto/sm3.h" + + /** + Retrieves the size, in bytes, of the context buffer required for SM3 hash operations. +diff --git a/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEku.c b/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEku.c +index 229c244b26..c9fdb65b99 100644 +--- a/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEku.c ++++ b/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEku.c +@@ -15,13 +15,13 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include + #include + #include +-#include ++#include + + /** + This function will return the leaf signer certificate in a chain. This is +diff --git a/CryptoPkg/Library/Include/internal/dso_conf.h b/CryptoPkg/Library/Include/crypto/dso_conf.h +similarity index 76% +rename from CryptoPkg/Library/Include/internal/dso_conf.h +rename to CryptoPkg/Library/Include/crypto/dso_conf.h +index 43c891588b..95f4db2b15 100644 +--- a/CryptoPkg/Library/Include/internal/dso_conf.h ++++ b/CryptoPkg/Library/Include/crypto/dso_conf.h +@@ -1,16 +1,16 @@ +-/* WARNING: do not edit! */ +-/* Generated from crypto/include/internal/dso_conf.h.in */ +-/* +- * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. +- * +- * Licensed under the OpenSSL license (the "License"). You may not use +- * this file except in compliance with the License. You can obtain a copy +- * in the file LICENSE in the source distribution or at +- * https://www.openssl.org/source/license.html +- */ +- +-#ifndef HEADER_DSO_CONF_H +-# define HEADER_DSO_CONF_H +-# define DSO_NONE +-# define DSO_EXTENSION ".so" +-#endif ++/* WARNING: do not edit! */ ++/* Generated from include/crypto/dso_conf.h.in */ ++/* ++ * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. ++ * ++ * Licensed under the OpenSSL license (the "License"). You may not use ++ * this file except in compliance with the License. You can obtain a copy ++ * in the file LICENSE in the source distribution or at ++ * https://www.openssl.org/source/license.html ++ */ ++ ++#ifndef OSSL_CRYPTO_DSO_CONF_H ++# define OSSL_CRYPTO_DSO_CONF_H ++# define DSO_NONE ++# define DSO_EXTENSION ".so" ++#endif +diff --git a/CryptoPkg/Library/Include/openssl/opensslconf.h b/CryptoPkg/Library/Include/openssl/opensslconf.h +index 62c2736cb0..3a2544ea5c 100644 +--- a/CryptoPkg/Library/Include/openssl/opensslconf.h ++++ b/CryptoPkg/Library/Include/openssl/opensslconf.h +@@ -247,9 +247,6 @@ extern "C" { + #ifndef OPENSSL_NO_DYNAMIC_ENGINE + # define OPENSSL_NO_DYNAMIC_ENGINE + #endif +-#ifndef OPENSSL_NO_AFALGENG +-# define OPENSSL_NO_AFALGENG +-#endif + + + /* +diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf +index 24e790b538..4c21b11d0a 100644 +--- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf ++++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf +@@ -477,45 +477,45 @@ + $(OPENSSL_PATH)/crypto/s390x_arch.h + $(OPENSSL_PATH)/crypto/sparc_arch.h + $(OPENSSL_PATH)/crypto/vms_rms.h +- $(OPENSSL_PATH)/crypto/aes/aes_locl.h ++ $(OPENSSL_PATH)/crypto/aes/aes_local.h + $(OPENSSL_PATH)/crypto/asn1/asn1_item_list.h +- $(OPENSSL_PATH)/crypto/asn1/asn1_locl.h ++ $(OPENSSL_PATH)/crypto/asn1/asn1_local.h + $(OPENSSL_PATH)/crypto/asn1/charmap.h + $(OPENSSL_PATH)/crypto/asn1/standard_methods.h + $(OPENSSL_PATH)/crypto/asn1/tbl_standard.h +- $(OPENSSL_PATH)/crypto/async/async_locl.h ++ $(OPENSSL_PATH)/crypto/async/async_local.h + $(OPENSSL_PATH)/crypto/async/arch/async_null.h + $(OPENSSL_PATH)/crypto/async/arch/async_posix.h + $(OPENSSL_PATH)/crypto/async/arch/async_win.h +- $(OPENSSL_PATH)/crypto/bio/bio_lcl.h +- $(OPENSSL_PATH)/crypto/bn/bn_lcl.h ++ $(OPENSSL_PATH)/crypto/bio/bio_local.h ++ $(OPENSSL_PATH)/crypto/bn/bn_local.h + $(OPENSSL_PATH)/crypto/bn/bn_prime.h + $(OPENSSL_PATH)/crypto/bn/rsaz_exp.h +- $(OPENSSL_PATH)/crypto/comp/comp_lcl.h ++ $(OPENSSL_PATH)/crypto/comp/comp_local.h + $(OPENSSL_PATH)/crypto/conf/conf_def.h +- $(OPENSSL_PATH)/crypto/conf/conf_lcl.h +- $(OPENSSL_PATH)/crypto/dh/dh_locl.h +- $(OPENSSL_PATH)/crypto/dso/dso_locl.h +- $(OPENSSL_PATH)/crypto/evp/evp_locl.h +- $(OPENSSL_PATH)/crypto/hmac/hmac_lcl.h +- $(OPENSSL_PATH)/crypto/lhash/lhash_lcl.h +- $(OPENSSL_PATH)/crypto/md5/md5_locl.h +- $(OPENSSL_PATH)/crypto/modes/modes_lcl.h ++ $(OPENSSL_PATH)/crypto/conf/conf_local.h ++ $(OPENSSL_PATH)/crypto/dh/dh_local.h ++ $(OPENSSL_PATH)/crypto/dso/dso_local.h ++ $(OPENSSL_PATH)/crypto/evp/evp_local.h ++ $(OPENSSL_PATH)/crypto/hmac/hmac_local.h ++ $(OPENSSL_PATH)/crypto/lhash/lhash_local.h ++ $(OPENSSL_PATH)/crypto/md5/md5_local.h ++ $(OPENSSL_PATH)/crypto/modes/modes_local.h + $(OPENSSL_PATH)/crypto/objects/obj_dat.h +- $(OPENSSL_PATH)/crypto/objects/obj_lcl.h ++ $(OPENSSL_PATH)/crypto/objects/obj_local.h + $(OPENSSL_PATH)/crypto/objects/obj_xref.h +- $(OPENSSL_PATH)/crypto/ocsp/ocsp_lcl.h +- $(OPENSSL_PATH)/crypto/pkcs12/p12_lcl.h +- $(OPENSSL_PATH)/crypto/rand/rand_lcl.h +- $(OPENSSL_PATH)/crypto/rsa/rsa_locl.h +- $(OPENSSL_PATH)/crypto/sha/sha_locl.h ++ $(OPENSSL_PATH)/crypto/ocsp/ocsp_local.h ++ $(OPENSSL_PATH)/crypto/pkcs12/p12_local.h ++ $(OPENSSL_PATH)/crypto/rand/rand_local.h ++ $(OPENSSL_PATH)/crypto/rsa/rsa_local.h ++ $(OPENSSL_PATH)/crypto/sha/sha_local.h + $(OPENSSL_PATH)/crypto/siphash/siphash_local.h +- $(OPENSSL_PATH)/crypto/sm3/sm3_locl.h +- $(OPENSSL_PATH)/crypto/store/store_locl.h +- $(OPENSSL_PATH)/crypto/ui/ui_locl.h +- $(OPENSSL_PATH)/crypto/x509/x509_lcl.h ++ $(OPENSSL_PATH)/crypto/sm3/sm3_local.h ++ $(OPENSSL_PATH)/crypto/store/store_local.h ++ $(OPENSSL_PATH)/crypto/ui/ui_local.h ++ $(OPENSSL_PATH)/crypto/x509/x509_local.h + $(OPENSSL_PATH)/crypto/x509v3/ext_dat.h +- $(OPENSSL_PATH)/crypto/x509v3/pcy_int.h ++ $(OPENSSL_PATH)/crypto/x509v3/pcy_local.h + $(OPENSSL_PATH)/crypto/x509v3/standard_exts.h + $(OPENSSL_PATH)/crypto/x509v3/v3_admis.h + $(OPENSSL_PATH)/ssl/bio_ssl.c +@@ -562,13 +562,13 @@ + $(OPENSSL_PATH)/ssl/t1_trce.c + $(OPENSSL_PATH)/ssl/tls13_enc.c + $(OPENSSL_PATH)/ssl/tls_srp.c +- $(OPENSSL_PATH)/ssl/packet_locl.h ++ $(OPENSSL_PATH)/ssl/packet_local.h + $(OPENSSL_PATH)/ssl/ssl_cert_table.h +- $(OPENSSL_PATH)/ssl/ssl_locl.h ++ $(OPENSSL_PATH)/ssl/ssl_local.h + $(OPENSSL_PATH)/ssl/record/record.h +- $(OPENSSL_PATH)/ssl/record/record_locl.h ++ $(OPENSSL_PATH)/ssl/record/record_local.h + $(OPENSSL_PATH)/ssl/statem/statem.h +- $(OPENSSL_PATH)/ssl/statem/statem_locl.h ++ $(OPENSSL_PATH)/ssl/statem/statem_local.h + # Autogenerated files list ends here + # RHEL8-specific OpenSSL file list starts here + $(OPENSSL_PATH)/crypto/evp/kdf_lib.c +diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +index 52e70a2d03..0c3b210d6a 100644 +--- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf ++++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +@@ -477,45 +477,45 @@ + $(OPENSSL_PATH)/crypto/s390x_arch.h + $(OPENSSL_PATH)/crypto/sparc_arch.h + $(OPENSSL_PATH)/crypto/vms_rms.h +- $(OPENSSL_PATH)/crypto/aes/aes_locl.h ++ $(OPENSSL_PATH)/crypto/aes/aes_local.h + $(OPENSSL_PATH)/crypto/asn1/asn1_item_list.h +- $(OPENSSL_PATH)/crypto/asn1/asn1_locl.h ++ $(OPENSSL_PATH)/crypto/asn1/asn1_local.h + $(OPENSSL_PATH)/crypto/asn1/charmap.h + $(OPENSSL_PATH)/crypto/asn1/standard_methods.h + $(OPENSSL_PATH)/crypto/asn1/tbl_standard.h +- $(OPENSSL_PATH)/crypto/async/async_locl.h ++ $(OPENSSL_PATH)/crypto/async/async_local.h + $(OPENSSL_PATH)/crypto/async/arch/async_null.h + $(OPENSSL_PATH)/crypto/async/arch/async_posix.h + $(OPENSSL_PATH)/crypto/async/arch/async_win.h +- $(OPENSSL_PATH)/crypto/bio/bio_lcl.h +- $(OPENSSL_PATH)/crypto/bn/bn_lcl.h ++ $(OPENSSL_PATH)/crypto/bio/bio_local.h ++ $(OPENSSL_PATH)/crypto/bn/bn_local.h + $(OPENSSL_PATH)/crypto/bn/bn_prime.h + $(OPENSSL_PATH)/crypto/bn/rsaz_exp.h +- $(OPENSSL_PATH)/crypto/comp/comp_lcl.h ++ $(OPENSSL_PATH)/crypto/comp/comp_local.h + $(OPENSSL_PATH)/crypto/conf/conf_def.h +- $(OPENSSL_PATH)/crypto/conf/conf_lcl.h +- $(OPENSSL_PATH)/crypto/dh/dh_locl.h +- $(OPENSSL_PATH)/crypto/dso/dso_locl.h +- $(OPENSSL_PATH)/crypto/evp/evp_locl.h +- $(OPENSSL_PATH)/crypto/hmac/hmac_lcl.h +- $(OPENSSL_PATH)/crypto/lhash/lhash_lcl.h +- $(OPENSSL_PATH)/crypto/md5/md5_locl.h +- $(OPENSSL_PATH)/crypto/modes/modes_lcl.h ++ $(OPENSSL_PATH)/crypto/conf/conf_local.h ++ $(OPENSSL_PATH)/crypto/dh/dh_local.h ++ $(OPENSSL_PATH)/crypto/dso/dso_local.h ++ $(OPENSSL_PATH)/crypto/evp/evp_local.h ++ $(OPENSSL_PATH)/crypto/hmac/hmac_local.h ++ $(OPENSSL_PATH)/crypto/lhash/lhash_local.h ++ $(OPENSSL_PATH)/crypto/md5/md5_local.h ++ $(OPENSSL_PATH)/crypto/modes/modes_local.h + $(OPENSSL_PATH)/crypto/objects/obj_dat.h +- $(OPENSSL_PATH)/crypto/objects/obj_lcl.h ++ $(OPENSSL_PATH)/crypto/objects/obj_local.h + $(OPENSSL_PATH)/crypto/objects/obj_xref.h +- $(OPENSSL_PATH)/crypto/ocsp/ocsp_lcl.h +- $(OPENSSL_PATH)/crypto/pkcs12/p12_lcl.h +- $(OPENSSL_PATH)/crypto/rand/rand_lcl.h +- $(OPENSSL_PATH)/crypto/rsa/rsa_locl.h +- $(OPENSSL_PATH)/crypto/sha/sha_locl.h ++ $(OPENSSL_PATH)/crypto/ocsp/ocsp_local.h ++ $(OPENSSL_PATH)/crypto/pkcs12/p12_local.h ++ $(OPENSSL_PATH)/crypto/rand/rand_local.h ++ $(OPENSSL_PATH)/crypto/rsa/rsa_local.h ++ $(OPENSSL_PATH)/crypto/sha/sha_local.h + $(OPENSSL_PATH)/crypto/siphash/siphash_local.h +- $(OPENSSL_PATH)/crypto/sm3/sm3_locl.h +- $(OPENSSL_PATH)/crypto/store/store_locl.h +- $(OPENSSL_PATH)/crypto/ui/ui_locl.h +- $(OPENSSL_PATH)/crypto/x509/x509_lcl.h ++ $(OPENSSL_PATH)/crypto/sm3/sm3_local.h ++ $(OPENSSL_PATH)/crypto/store/store_local.h ++ $(OPENSSL_PATH)/crypto/ui/ui_local.h ++ $(OPENSSL_PATH)/crypto/x509/x509_local.h + $(OPENSSL_PATH)/crypto/x509v3/ext_dat.h +- $(OPENSSL_PATH)/crypto/x509v3/pcy_int.h ++ $(OPENSSL_PATH)/crypto/x509v3/pcy_local.h + $(OPENSSL_PATH)/crypto/x509v3/standard_exts.h + $(OPENSSL_PATH)/crypto/x509v3/v3_admis.h + # Autogenerated files list ends here +diff --git a/CryptoPkg/Library/OpensslLib/process_files.pl b/CryptoPkg/Library/OpensslLib/process_files.pl +index 65d07a2aed..57ce195394 100755 +--- a/CryptoPkg/Library/OpensslLib/process_files.pl ++++ b/CryptoPkg/Library/OpensslLib/process_files.pl +@@ -111,8 +111,8 @@ BEGIN { + # Generate dso_conf.h per config data + system( + "perl -I. -Mconfigdata util/dofile.pl " . +- "crypto/include/internal/dso_conf.h.in " . +- "> include/internal/dso_conf.h" ++ "include/crypto/dso_conf.h.in " . ++ "> include/crypto/dso_conf.h" + ) == 0 || + die "Failed to generate dso_conf.h!\n"; + +@@ -263,14 +263,21 @@ print "Done!"; + # Copy opensslconf.h and dso_conf.h generated from OpenSSL Configuration + # + print "\n--> Duplicating opensslconf.h into Include/openssl ... "; +-copy($OPENSSL_PATH . "/include/openssl/opensslconf.h", +- $OPENSSL_PATH . "/../../Include/openssl/") || +- die "Cannot copy opensslconf.h!"; ++system( ++ "perl -pe 's/\\n/\\r\\n/' " . ++ "< " . $OPENSSL_PATH . "/include/openssl/opensslconf.h " . ++ "> " . $OPENSSL_PATH . "/../../Include/openssl/opensslconf.h" ++ ) == 0 || ++ die "Cannot copy opensslconf.h!"; + print "Done!"; +-print "\n--> Duplicating dso_conf.h into Include/internal ... "; +-copy($OPENSSL_PATH . "/include/internal/dso_conf.h", +- $OPENSSL_PATH . "/../../Include/internal/") || +- die "Cannot copy dso_conf.h!"; ++ ++print "\n--> Duplicating dso_conf.h into Include/crypto ... "; ++system( ++ "perl -pe 's/\\n/\\r\\n/' " . ++ "< " . $OPENSSL_PATH . "/include/crypto/dso_conf.h" . ++ "> " . $OPENSSL_PATH . "/../../Include/crypto/dso_conf.h" ++ ) == 0 || ++ die "Cannot copy dso_conf.h!"; + print "Done!\n"; + + print "\nProcessing Files Done!\n"; +diff --git a/CryptoPkg/Library/OpensslLib/rand_pool.c b/CryptoPkg/Library/OpensslLib/rand_pool.c +index 9f3983f7c3..9e0179b034 100644 +--- a/CryptoPkg/Library/OpensslLib/rand_pool.c ++++ b/CryptoPkg/Library/OpensslLib/rand_pool.c +@@ -7,7 +7,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent + + **/ + +-#include "internal/rand_int.h" ++#include "crypto/rand.h" + #include + + #include +-- +2.18.4 + diff --git a/0052-BaseTools-fix-ucs-2-lookup-on-python-3.9.patch b/0052-BaseTools-fix-ucs-2-lookup-on-python-3.9.patch new file mode 100644 index 0000000..aae5e80 --- /dev/null +++ b/0052-BaseTools-fix-ucs-2-lookup-on-python-3.9.patch @@ -0,0 +1,53 @@ +From 87c2f21837e15c51ddb1cf3aac218a24c997362d Mon Sep 17 00:00:00 2001 +From: Miroslav Rezanina +Date: Wed, 12 Aug 2020 01:28:17 +0800 +Subject: BaseTools: fix ucs-2 lookup on python 3.9 + +python3.9 changed/fixed codec.register behavior to always replace +hyphen with underscore for passed in codec names: + + https://bugs.python.org/issue37751 + +So the custom Ucs2Search needs to be adapted to handle 'ucs_2' in +addition to existing 'ucs-2' for back compat. + +This fixes test failures on python3.9, example: + +====================================================================== +FAIL: testUtf16InUniFile (CheckUnicodeSourceFiles.Tests) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/builddir/build/BUILD/edk2-edk2-stable202002/BaseTools/Source/Python/AutoGen/UniClassObject.py", line 375, in PreProcess + FileIn = UniFileClassObject.OpenUniFile(LongFilePath(File.Path)) + File "/builddir/build/BUILD/edk2-edk2-stable202002/BaseTools/Source/Python/AutoGen/UniClassObject.py", line 303, in OpenUniFile + UniFileClassObject.VerifyUcs2Data(FileIn, FileName, Encoding) + File "/builddir/build/BUILD/edk2-edk2-stable202002/BaseTools/Source/Python/AutoGen/UniClassObject.py", line 312, in VerifyUcs2Data + Ucs2Info = codecs.lookup('ucs-2') +LookupError: unknown encoding: ucs-2 + +Signed-off-by: Cole Robinson +Reviewed-by: Yuwei Chen +Reviewed-by: Bob Feng + +(cherry picked from commit 5d8648345cd9ad729837118c731063c59edea192) +Signed-off-by: Miroslav Rezanina +--- + BaseTools/Source/Python/AutoGen/UniClassObject.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/BaseTools/Source/Python/AutoGen/UniClassObject.py b/BaseTools/Source/Python/AutoGen/UniClassObject.py +index b2895f7e5c..883c2356e0 100644 +--- a/BaseTools/Source/Python/AutoGen/UniClassObject.py ++++ b/BaseTools/Source/Python/AutoGen/UniClassObject.py +@@ -152,7 +152,7 @@ class Ucs2Codec(codecs.Codec): + + TheUcs2Codec = Ucs2Codec() + def Ucs2Search(name): +- if name == 'ucs-2': ++ if name in ['ucs-2', 'ucs_2']: + return codecs.CodecInfo( + name=name, + encode=TheUcs2Codec.encode, +-- +2.18.4 + diff --git a/0053-BaseTools-Work-around-array.array.tostring-removal-i.patch b/0053-BaseTools-Work-around-array.array.tostring-removal-i.patch new file mode 100644 index 0000000..3cd5bbb --- /dev/null +++ b/0053-BaseTools-Work-around-array.array.tostring-removal-i.patch @@ -0,0 +1,51 @@ +From 866640ccf29f6572bed1c201cdbf73774cb8649b Mon Sep 17 00:00:00 2001 +From: Miroslav Rezanina +Date: Wed, 12 Aug 2020 01:28:18 +0800 +Subject: BaseTools: Work around array.array.tostring() removal in python 3.9 + +In python3, array.array.tostring() was a compat alias for tobytes(). +tostring() was removed in python 3.9. + +Convert this to use tolist() which should be valid for all python +versions. + +This fixes this build error on python3.9: + +(Python 3.9.0b5 on linux) Traceback (most recent call last): + File "/root/edk2/edk2-edk2-stable202002/BaseTools/BinWrappers/PosixLike/../../Source/Python/Trim/Trim.py", line 593, in Main + GenerateVfrBinSec(CommandOptions.ModuleName, CommandOptions.DebugDir, CommandOptions.OutputFile) + File "/root/edk2/edk2-edk2-stable202002/BaseTools/BinWrappers/PosixLike/../../Source/Python/Trim/Trim.py", line 449, in GenerateVfrBinSec + VfrUniOffsetList = GetVariableOffset(MapFileName, EfiFileName, VfrNameList) + File "/root/edk2/edk2-edk2-stable202002/BaseTools/Source/Python/Common/Misc.py", line 88, in GetVariableOffset + return _parseForGCC(lines, efifilepath, varnames) + File "/root/edk2/edk2-edk2-stable202002/BaseTools/Source/Python/Common/Misc.py", line 151, in _parseForGCC + efisecs = PeImageClass(efifilepath).SectionHeaderList + File "/root/edk2/edk2-edk2-stable202002/BaseTools/Source/Python/Common/Misc.py", line 1638, in __init__ + if ByteArray.tostring() != b'PE\0\0': +AttributeError: 'array.array' object has no attribute 'tostring' + +Signed-off-by: Cole Robinson +Reviewed-by: Yuwei Chen +Reviewed-by: Bob Feng +(cherry picked from commit 43bec9ea3d56f3662ede78023baa2a791b66acac) +Signed-off-by: Miroslav Rezanina +--- + BaseTools/Source/Python/Common/Misc.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py +index ad55671080..4be7957138 100755 +--- a/BaseTools/Source/Python/Common/Misc.py ++++ b/BaseTools/Source/Python/Common/Misc.py +@@ -1635,7 +1635,7 @@ class PeImageClass(): + ByteArray = array.array('B') + ByteArray.fromfile(PeObject, 4) + # PE signature should be 'PE\0\0' +- if ByteArray.tostring() != b'PE\0\0': ++ if ByteArray.tolist() != [ord('P'), ord('E'), 0, 0]: + self.ErrorInfo = self.FileName + ' has no valid PE signature PE00' + return + +-- +2.18.4 + diff --git a/0054-BaseTools-Fix-the-issue-caused-by-tostring-removal-o.patch b/0054-BaseTools-Fix-the-issue-caused-by-tostring-removal-o.patch new file mode 100644 index 0000000..ba0b35b --- /dev/null +++ b/0054-BaseTools-Fix-the-issue-caused-by-tostring-removal-o.patch @@ -0,0 +1,75 @@ +From 28bd5e98630cc22830ed352c248bafdb60794391 Mon Sep 17 00:00:00 2001 +From: Miroslav Rezanina +Date: Tue, 29 Dec 2020 17:03:53 +0800 +Subject: BaseTools: Fix the issue caused by tostring() removal on Py39 + +REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3136 + +Python 3.9 remove the array.array.tostring and +array.array.fromstring() function. This patch +is to use other method to replace tostring() and +fromstring() + +Signed-off-by: Bob Feng + +Cc: Liming Gao +Cc: Yuwei Chen +Cc: Mingyue Liang +Reviewed-by: Liming Gao +(cherry picked from commit 20b292d0cdf7dce58d824fdf9ab1613c2a1ad2ec) +Signed-off-by: Miroslav Rezanina +--- + .../Python/GenFds/GenFdsGlobalVariable.py | 23 ++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +index dc1727c466..3019ec63c3 100644 +--- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py ++++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +@@ -27,10 +27,11 @@ from Common.TargetTxtClassObject import TargetTxtDict + from Common.ToolDefClassObject import ToolDefDict + from AutoGen.BuildEngine import ToolBuildRule + import Common.DataType as DataType +-from Common.Misc import PathClass ++from Common.Misc import PathClass,CreateDirectory + from Common.LongFilePathSupport import OpenLongFilePath as open + from Common.MultipleWorkspace import MultipleWorkspace as mws + import Common.GlobalData as GlobalData ++from Common.BuildToolError import * + + ## Global variables + # +@@ -463,12 +464,28 @@ class GenFdsGlobalVariable: + GenFdsGlobalVariable.SecCmdList.append(' '.join(Cmd).strip()) + else: + SectionData = array('B', [0, 0, 0, 0]) +- SectionData.fromstring(Ui.encode("utf_16_le")) ++ SectionData.fromlist(array('B',Ui.encode('utf-16-le')).tolist()) + SectionData.append(0) + SectionData.append(0) + Len = len(SectionData) + GenFdsGlobalVariable.SectionHeader.pack_into(SectionData, 0, Len & 0xff, (Len >> 8) & 0xff, (Len >> 16) & 0xff, 0x15) +- SaveFileOnChange(Output, SectionData.tostring()) ++ ++ ++ DirName = os.path.dirname(Output) ++ if not CreateDirectory(DirName): ++ EdkLogger.error(None, FILE_CREATE_FAILURE, "Could not create directory %s" % DirName) ++ else: ++ if DirName == '': ++ DirName = os.getcwd() ++ if not os.access(DirName, os.W_OK): ++ EdkLogger.error(None, PERMISSION_FAILURE, "Do not have write permission on directory %s" % DirName) ++ ++ try: ++ with open(Output, "wb") as Fd: ++ SectionData.tofile(Fd) ++ Fd.flush() ++ except IOError as X: ++ EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X) + + elif Ver: + Cmd += ("-n", Ver) +-- +2.18.4 + diff --git a/40-edk2-ovmf-ia32-sb-enrolled.json b/40-edk2-ovmf-ia32-sb-enrolled.json deleted file mode 100644 index 08b95ee..0000000 --- a/40-edk2-ovmf-ia32-sb-enrolled.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "description": "OVMF for i386, with SB+SMM, SB enabled, MS certs enrolled", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "executable": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_CODE.secboot.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_VARS.secboot.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "i386", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "enrolled-keys", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/50-edk2-ovmf-ia32-sb.json b/50-edk2-ovmf-ia32-sb.json deleted file mode 100644 index df80f1e..0000000 --- a/50-edk2-ovmf-ia32-sb.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "description": "OVMF for i386, with SB+SMM, empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "executable": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_CODE.secboot.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "i386", - "machines": [ - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "requires-smm", - "secure-boot", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/60-edk2-ovmf-ia32.json b/60-edk2-ovmf-ia32.json deleted file mode 100644 index d804b2e..0000000 --- a/60-edk2-ovmf-ia32.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "description": "OVMF for i386, without SB, without SMM, with empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "executable": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_CODE.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf-ia32/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "i386", - "machines": [ - "pc-i440fx-*", - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/60-edk2-ovmf-x64.json b/60-edk2-ovmf-x64.json deleted file mode 100644 index 355691b..0000000 --- a/60-edk2-ovmf-x64.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "description": "OVMF for x86_64, without SB, without SMM, with empty varstore", - "interface-types": [ - "uefi" - ], - "mapping": { - "device": "flash", - "executable": { - "filename": "/usr/share/edk2/ovmf/OVMF_CODE.fd", - "format": "raw" - }, - "nvram-template": { - "filename": "/usr/share/edk2/ovmf/OVMF_VARS.fd", - "format": "raw" - } - }, - "targets": [ - { - "architecture": "x86_64", - "machines": [ - "pc-i440fx-*", - "pc-q35-*" - ] - } - ], - "features": [ - "acpi-s3", - "amd-sev", - "verbose-dynamic" - ], - "tags": [ - - ] -} diff --git a/LICENSE.qosb b/LICENSE.qosb new file mode 100644 index 0000000..9849381 --- /dev/null +++ b/LICENSE.qosb @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Patrick Uiterwijk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +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. diff --git a/build-iso.sh b/build-iso.sh deleted file mode 100644 index 413c119..0000000 --- a/build-iso.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -# args -dir="$1" - -# cfg -shell="$dir/Shell.efi" -enroll="$dir/EnrollDefaultKeys.efi" -root="$dir/image" -vfat="$dir/shell.img" -iso="$dir/UefiShell.iso" - -# create non-partitioned (1.44 MB floppy disk) FAT image -mkdir "$root" -mkdir "$root"/efi -mkdir "$root"/efi/boot -cp "$shell" "$root"/efi/boot/bootx64.efi -cp "$enroll" "$root" -qemu-img convert --image-opts \ - driver=vvfat,floppy=on,fat-type=12,label=UEFI_SHELL,dir="$root/" \ - $vfat - -# build ISO with FAT image file as El Torito EFI boot image -genisoimage -input-charset ASCII -J -rational-rock \ - -efi-boot "${vfat##*/}" -no-emul-boot -o "$iso" -- "$vfat" -rm -rf "$root/" "$vfat" diff --git a/70-edk2-aarch64-verbose.json b/edk2-aarch64-verbose.json similarity index 88% rename from 70-edk2-aarch64-verbose.json rename to edk2-aarch64-verbose.json index a553dc1..ceec878 100644 --- a/70-edk2-aarch64-verbose.json +++ b/edk2-aarch64-verbose.json @@ -1,5 +1,5 @@ { - "description": "UEFI firmware for aarch64, verbose logs", + "description": "UEFI firmware for ARM64 virtual machines, verbose logs", "interface-types": [ "uefi" ], diff --git a/70-edk2-arm-verbose.json b/edk2-aarch64.json similarity index 60% rename from 70-edk2-arm-verbose.json rename to edk2-aarch64.json index 9e2cb0d..c5a73cb 100644 --- a/70-edk2-arm-verbose.json +++ b/edk2-aarch64.json @@ -1,29 +1,29 @@ { - "description": "UEFI firmware for arm, verbose logs", + "description": "UEFI firmware for ARM64 virtual machines", "interface-types": [ "uefi" ], "mapping": { "device": "flash", "executable": { - "filename": "/usr/share/edk2/arm/QEMU_EFI-pflash.raw", + "filename": "/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw", "format": "raw" }, "nvram-template": { - "filename": "/usr/share/edk2/arm/vars-template-pflash.raw", + "filename": "/usr/share/edk2/aarch64/vars-template-pflash.raw", "format": "raw" } }, "targets": [ { - "architecture": "arm", + "architecture": "aarch64", "machines": [ "virt-*" ] } ], "features": [ - "verbose-static" + ], "tags": [ diff --git a/40-edk2-ovmf-x64-sb-enrolled.json b/edk2-ovmf-sb.json similarity index 89% rename from 40-edk2-ovmf-x64-sb-enrolled.json rename to edk2-ovmf-sb.json index 6c2225c..a0203e8 100644 --- a/40-edk2-ovmf-x64-sb-enrolled.json +++ b/edk2-ovmf-sb.json @@ -1,5 +1,5 @@ { - "description": "OVMF for x86_64, with SB+SMM, SB enabled, MS certs enrolled", + "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled", "interface-types": [ "uefi" ], diff --git a/50-edk2-ovmf-x64-sb.json b/edk2-ovmf.json similarity index 90% rename from 50-edk2-ovmf-x64-sb.json rename to edk2-ovmf.json index 99345ca..74d00e3 100644 --- a/50-edk2-ovmf-x64-sb.json +++ b/edk2-ovmf.json @@ -1,5 +1,5 @@ { - "description": "OVMF for x86_64, with SB+SMM, empty varstore", + "description": "OVMF with SB+SMM, empty varstore", "interface-types": [ "uefi" ], diff --git a/edk2.spec b/edk2.spec index 1636f63..77cbf9f 100644 --- a/edk2.spec +++ b/edk2.spec @@ -1,416 +1,400 @@ -# RPM doesn't detect that code in /usr/share is python3, this forces it -# https://fedoraproject.org/wiki/Changes/Avoid_usr_bin_python_in_RPM_Build#Python_bytecompilation -%global __python %{__python3} +ExclusiveArch: x86_64 aarch64 -%global edk2_stable_date 202008 -%global edk2_stable_str edk2-stable%{edk2_stable_date} -%global openssl_version 1.1.1g -%global qosb_version 20200228-gitc3e16b3 -%global softfloat_version 20180726-gitb64af41 +%define GITDATE 20200602 +%define GITCOMMIT ca407c7246bf +%define TOOLCHAIN GCC5 +%define OPENSSL_VER 1.1.1g -# Enable this to skip secureboot enrollment, if problems pop up -%global skip_enroll 0 +Name: edk2 +Version: %{GITDATE}git%{GITCOMMIT} +Release: 1%{?dist} +Summary: UEFI firmware for 64-bit virtual machines +Group: Applications/Emulators +License: BSD-2-Clause-Patent and OpenSSL and MIT +URL: http://www.tianocore.org -%define qosb_testing 0 +# The source tarball is created using following commands: +# COMMIT=%{GITCOMMIT} +# git archive --format=tar --prefix=edk2-$COMMIT/ $COMMIT \ +# | xz -9ev >/tmp/edk2-$COMMIT.tar.xz +Source0: http://batcave.lab.eng.brq.redhat.com/www/edk2-%{GITCOMMIT}.tar.xz +Source1: ovmf-whitepaper-c770f8c.txt +Source2: openssl-rhel-bdd048e929dcfcf2f046d74e812e0e3d5fc58504.tar.xz +Source3: ovmf-vars-generator +Source4: LICENSE.qosb +Source5: RedHatSecureBootPkKek1.pem -%ifarch x86_64 -%define qosb_testing 1 -%endif -%if 0%{?fedora:1} -%define cross 1 -%endif +Source10: edk2-aarch64-verbose.json +Source11: edk2-aarch64.json +Source12: edk2-ovmf-sb.json +Source13: edk2-ovmf.json -%ifarch %{ix86} x86_64 -%if 0%{?fedora:1} -%define build_ovmf_ia32 1 -%endif -%ifarch x86_64 -%define build_ovmf_x64 1 -%endif -%endif -%ifarch aarch64 -%define build_aavmf_aarch64 1 -%endif -%ifarch %{arm} -%define build_aavmf_arm 1 -%endif -%if 0%{?cross:1} -%define build_ovmf_x64 1 -%define build_ovmf_ia32 1 -%define build_aavmf_aarch64 1 -%define build_aavmf_arm 1 -%endif +Patch0007: 0007-BaseTools-do-not-build-BrotliCompress-RH-only.patch +Patch0008: 0008-MdeModulePkg-remove-package-private-Brotli-include-p.patch +Patch0009: 0009-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch +Patch0010: 0010-OvmfPkg-increase-max-debug-message-length-to-512-RHE.patch +Patch0011: 0011-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch +Patch0012: 0012-MdeModulePkg-TerminalDxe-add-other-text-resolutions-.patch +Patch0013: 0013-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch +Patch0014: 0014-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch +Patch0015: 0015-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch +Patch0016: 0016-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch +Patch0017: 0017-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch +Patch0018: 0018-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch +Patch0019: 0019-ArmVirtPkg-set-early-hello-message-RH-only.patch +Patch0020: 0020-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch +Patch0021: 0021-OvmfPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuVide.patch +Patch0022: 0022-ArmVirtPkg-silence-DEBUG_VERBOSE-0x00400000-in-QemuR.patch +Patch0023: 0023-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch +Patch0024: 0024-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch +Patch0025: 0025-CryptoPkg-OpensslLib-list-RHEL8-specific-OpenSSL-fil.patch +Patch0026: 0026-OvmfPkg-X86QemuLoadImageLib-handle-EFI_ACCESS_DENIED.patch +Patch0027: 0027-Revert-OvmfPkg-use-generic-QEMU-image-loader-for-sec.patch +Patch0038: 0038-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch +Patch0039: 0039-OvmfPkg-GenericQemuLoadImageLib-log-Not-Found-at-INF.patch +Patch0040: 0040-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch +Patch0042: 0042-UefiCpuPkg-PiSmmCpuDxeSmm-pause-in-WaitForSemaphore-.patch +Patch0045: 0045-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch +Patch0046: 0046-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-befo.patch +Patch0047: 0047-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-afte.patch +Patch0048: 0048-CryptoPkg-OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch +Patch0052: 0052-BaseTools-fix-ucs-2-lookup-on-python-3.9.patch +Patch0053: 0053-BaseTools-Work-around-array.array.tostring-removal-i.patch +Patch0054: 0054-BaseTools-Fix-the-issue-caused-by-tostring-removal-o.patch -Name: edk2 -# Even though edk2 stable releases are YYYYMM, we need -# to use YYYMMDD to avoid needing to bump package epoch -# due to previous 'git' Version: -Version: %{edk2_stable_date}01stable -Release: 3%{dist} -Summary: EFI Development Kit II -License: BSD-2-Clause-Patent -URL: http://www.tianocore.org/edk2/ - -Source0: https://github.com/tianocore/edk2/archive/%{edk2_stable_str}.tar.gz#/%{edk2_stable_str}.tar.gz -Source1: openssl-%{openssl_version}-hobbled.tar.xz -Source2: ovmf-whitepaper-c770f8c.txt -#Source3: https://github.com/puiterwijk/qemu-ovmf-secureboot/archive/v{qosb_version}/qemu-ovmf-secureboot-{qosb_version}.tar.gz -Source3: qemu-ovmf-secureboot-%{qosb_version}.tar.xz -Source4: softfloat-%{softfloat_version}.tar.xz -Source5: RedHatSecureBootPkKek1.pem -Source10: hobble-openssl -Source11: build-iso.sh -Source12: update-tarball.sh -Source13: openssl-patch-to-tarball.sh - -# Fedora-specific JSON "descriptor files" -Source14: 40-edk2-ovmf-x64-sb-enrolled.json -Source15: 50-edk2-ovmf-x64-sb.json -Source16: 60-edk2-ovmf-x64.json -Source17: 40-edk2-ovmf-ia32-sb-enrolled.json -Source18: 50-edk2-ovmf-ia32-sb.json -Source19: 60-edk2-ovmf-ia32.json -Source20: 70-edk2-aarch64-verbose.json -Source21: 70-edk2-arm-verbose.json - -# non-upstream patches -Patch0001: 0001-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch -Patch0002: 0002-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-the-DXE-.patch -Patch0003: 0003-OvmfPkg-enable-DEBUG_VERBOSE.patch -Patch0004: 0004-OvmfPkg-increase-max-debug-message-length-to-512.patch -Patch0005: 0005-advertise-OpenSSL-on-TianoCore-splash-screen-boot-lo.patch -Patch0006: 0006-OvmfPkg-QemuVideoDxe-enable-debug-messages-in-VbeShi.patch -Patch0007: 0007-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch -Patch0008: 0008-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch -Patch0009: 0009-OvmfPkg-take-PcdResizeXterm-from-the-QEMU-command-li.patch -Patch0010: 0010-ArmVirtPkg-take-PcdResizeXterm-from-the-QEMU-command.patch -Patch0011: 0011-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch -Patch0012: 0012-ArmPlatformPkg-introduce-fixed-PCD-for-early-hello-m.patch -Patch0013: 0013-ArmPlatformPkg-PrePeiCore-write-early-hello-message-.patch -Patch0014: 0014-ArmVirtPkg-set-early-hello-message-RH-only.patch -Patch0015: 0015-Tweak-the-tools_def-to-support-cross-compiling.patch -Patch0016: 0016-BaseTools-do-not-build-BrotliCompress-RH-only.patch - -%if 0%{?cross:1} -%endif - -%if 0%{?fedora:1} -# -# actual firmware builds support cross-compiling. edk2-tools -# in theory should build everywhere without much trouble, but -# in practice the edk2 build system barfs on archs it doesn't know -# (such as ppc), so lets limit things to the known-good ones. -# -ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 -%else -ExclusiveArch: x86_64 aarch64 -%endif - -BuildRequires: gcc gcc-c++ -BuildRequires: python3 python3-devel +# python3-devel and libuuid-devel are required for building tools. +# python3-devel is also needed for varstore template generation and +# verification with "ovmf-vars-generator". +BuildRequires: python3-devel BuildRequires: libuuid-devel -%if 0%{?cross:1} -BuildRequires: gcc-aarch64-linux-gnu -BuildRequires: gcc-arm-linux-gnu -BuildRequires: gcc-x86_64-linux-gnu -%endif -BuildRequires: iasl +BuildRequires: /usr/bin/iasl +BuildRequires: binutils gcc git gcc-c++ + +%ifarch x86_64 +# Only OVMF includes 80x86 assembly files (*.nasm*). BuildRequires: nasm -BuildRequires: qemu-img + +# Only OVMF includes the Secure Boot feature, for which we need to separate out +# the UEFI shell. +BuildRequires: dosfstools +BuildRequires: mtools BuildRequires: genisoimage -BuildRequires: bc -BuildRequires: sed -BuildRequires: perl -BuildRequires: findutils -# These are for QOSB -BuildRequires: python3-requests -BuildRequires: qemu-system-x86 -%if %{?qosb_testing} -# This is used for testing the enrollment: builds are run in a chroot, lacking -# a kernel. The testing is only performed on x86_64 for now, but we can't make -# the BuildRequires only on a specific arch, as that'd come through in the SRPM -# NOTE: The actual enrollment needs to happen in all builds for all architectures, -# because OVMF is built as noarch, which means that koji enforces that the build -# results don't actually differ per arch, and then it picks a random arches' build -# for the actual RPM. -BuildRequires: kernel-core +# For generating the variable store template with the default certificates +# enrolled, we need qemu-kvm. +BuildRequires: qemu-kvm >= 2.12.0-89 + +# For verifying SB enablement in the above variable store template, we need a +# guest kernel that prints "Secure boot enabled". +BuildRequires: kernel-core >= 4.18.0-161 +BuildRequires: rpmdevtools + +%package ovmf +Summary: UEFI firmware for x86_64 virtual machines +BuildArch: noarch +Provides: OVMF = %{version}-%{release} +Obsoletes: OVMF < 20180508-100.gitee3198e672e2.el7 + +# OVMF includes the Secure Boot and IPv6 features; it has a builtin OpenSSL +# library. +Provides: bundled(openssl) = %{OPENSSL_VER} +License: BSD-2-Clause-Patent and OpenSSL + +# URL taken from the Maintainers.txt file. +URL: http://www.tianocore.org/ovmf/ + +%description ovmf +OVMF (Open Virtual Machine Firmware) is a project to enable UEFI support for +Virtual Machines. This package contains a sample 64-bit UEFI firmware for QEMU +and KVM. + +%else +%package aarch64 +Summary: UEFI firmware for aarch64 virtual machines +BuildArch: noarch +Provides: AAVMF = %{version}-%{release} +Obsoletes: AAVMF < 20180508-100.gitee3198e672e2.el7 + +# No Secure Boot for AAVMF yet, but we include OpenSSL for the IPv6 stack. +Provides: bundled(openssl) = %{OPENSSL_VER} +License: BSD-2-Clause-Patent and OpenSSL + +# URL taken from the Maintainers.txt file. +URL: https://github.com/tianocore/tianocore.github.io/wiki/ArmVirtPkg + +%description aarch64 +AAVMF (ARM Architecture Virtual Machine Firmware) is an EFI Development Kit II +platform that enables UEFI support for QEMU/KVM ARM Virtual Machines. This +package contains a 64-bit build. %endif -%description -EDK II is a development code base for creating UEFI drivers, applications -and firmware images. - %package tools Summary: EFI Development Kit II Tools +Group: Development/Tools +License: BSD-2-Clause-Patent +URL: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools %description tools This package provides tools that are needed to build EFI executables and ROMs using the GNU tools. -%package tools-python -Summary: EFI Development Kit II Tools -Requires: python3 -BuildArch: noarch - -%description tools-python -This package provides tools that are needed to build EFI executables -and ROMs using the GNU tools. You do not need to install this package; -you probably want to install edk2-tools only. - %package tools-doc Summary: Documentation for EFI Development Kit II Tools +Group: Development/Tools BuildArch: noarch +License: BSD-2-Clause-Patent +URL: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools %description tools-doc This package documents the tools that are needed to build EFI executables and ROMs using the GNU tools. -%package qosb -Summary: Tool to enroll secureboot -Requires: python3 -Buildarch: noarch -%description qosb -This package contains QOSB (QEMU OVMF Secure Boot), which can enroll OVMF -variable files to enforce Secure Boot. - - -%if 0%{?build_ovmf_x64:1} -%package ovmf -Summary: Open Virtual Machine Firmware -# OVMF includes the Secure Boot and IPv6 features; it has a builtin OpenSSL -# library. -License: BSD-2-Clause-Patent and OpenSSL -Provides: bundled(openssl) -Provides: OVMF = %{version}-%{release} -Obsoletes: OVMF < %{version}-%{release} -BuildArch: noarch -%description ovmf -EFI Development Kit II -Open Virtual Machine Firmware (x64) -%endif - -%if 0%{?build_ovmf_ia32:1} -%package ovmf-ia32 -Summary: Open Virtual Machine Firmware -# OVMF includes the Secure Boot and IPv6 features; it has a builtin OpenSSL -# library. -License: BSD-2-Clause-Patent and OpenSSL -Provides: bundled(openssl) -BuildArch: noarch -%description ovmf-ia32 -EFI Development Kit II -Open Virtual Machine Firmware (ia32) -%endif - -%if 0%{?build_aavmf_aarch64:1} -%package aarch64 -Summary: AARCH64 Virtual Machine Firmware -Provides: AAVMF = %{version}-%{release} -Obsoletes: AAVMF < %{version}-%{release} -BuildArch: noarch -# No Secure Boot for AAVMF yet, but we include OpenSSL for the IPv6/HTTP boot stack. -License: BSD-2-Clause-Patent and OpenSSL -Provides: bundled(openssl) -%description aarch64 -EFI Development Kit II -AARCH64 UEFI Firmware -%endif - -%if 0%{?build_aavmf_arm:1} -%package arm -Summary: ARM Virtual Machine Firmware -BuildArch: noarch -# No Secure Boot for ARMv7, but we include OpenSSL for the IPv6/HTTP boot stack. -License: BSD-2-Clause-Patent and OpenSSL -%description arm -EFI Development Kit II -ARMv7 UEFI Firmware -%endif - +%description +EDK II is a modern, feature-rich, cross-platform firmware development +environment for the UEFI and PI specifications. This package contains sample +64-bit UEFI firmware builds for QEMU and KVM. %prep -%setup -q -n edk2-%{edk2_stable_str} +%setup -q -n edk2-%{GITCOMMIT} -# Ensure old shell and binary packages are not used -rm -rf EdkShellBinPkg -rm -rf EdkShellPkg -rm -rf FatBinPkg -rm -rf ShellBinPkg +%{lua: + tmp = os.tmpname(); + f = io.open(tmp, "w+"); + count = 0; + for i, p in ipairs(patches) do + f:write(p.."\n"); + count = count + 1; + end; + f:close(); + print("PATCHCOUNT="..count.."\n") + print("PATCHLIST="..tmp.."\n") +} -# copy whitepaper into place -cp -a -- %{SOURCE2} . -# extract openssl into place -tar -xf %{SOURCE1} --strip-components=1 --directory CryptoPkg/Library/OpensslLib/openssl -(cd CryptoPkg/Library/OpensslLib && perl process_files.pl) -# extract softfloat into place -tar -xf %{SOURCE4} --strip-components=1 --directory ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3/ +git init -q +git config user.name rpm-build +git config user.email rpm-build +git config core.whitespace cr-at-eol +git config am.keepcr true +git add -A . +git commit -q -a --author 'rpm-build ' \ + -m '%{name}-%{GITCOMMIT} base' -# Extract QOSB -tar -xf %{SOURCE3} -mv qemu-ovmf-secureboot-%{qosb_version}/README.md README.qosb -mv qemu-ovmf-secureboot-%{qosb_version}/LICENSE LICENSE.qosb +COUNT=$(grep '\.patch$' $PATCHLIST | wc -l) +if [ $COUNT -ne $PATCHCOUNT ]; then + echo "Found $COUNT patches in $PATCHLIST, expected $PATCHCOUNT" + exit 1 +fi +if [ $COUNT -gt 0 ]; then + for pf in `cat $PATCHLIST`; do + git am $pf + done +fi +echo "Applied $COUNT patches" +rm -f $PATCHLIST -%autopatch -p1 -base64 --decode < MdeModulePkg/Logo/Logo-OpenSSL.bmp.b64 > MdeModulePkg/Logo/Logo-OpenSSL.bmp +cp -a -- %{SOURCE1} %{SOURCE3} . +cp -a -- %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} . +tar -C CryptoPkg/Library/OpensslLib -a -f %{SOURCE2} -x -# Extract OEM string from the RH cert, as described here -# https://bugzilla.tianocore.org/show_bug.cgi?id=1747#c2 +# Format the Red Hat-issued certificate that is to be enrolled as both Platform +# Key and first Key Exchange Key, as an SMBIOS OEM String. This means stripping +# the PEM header and footer, and prepending the textual representation of the +# GUID that identifies this particular OEM String to "EnrollDefaultKeys.efi", +# plus the separator ":". For details, see +# comments 2, 7, 14. sed \ -e 's/^-----BEGIN CERTIFICATE-----$/4e32566d-8e9e-4f52-81d3-5bb9715f9727:/' \ -e '/^-----END CERTIFICATE-----$/d' \ - %{_sourcedir}/RedHatSecureBootPkKek1.pem \ -| tr -d '\n' \ -> PkKek1.oemstr + %{SOURCE5} \ + > PkKek1.oemstr +# Done by %setup, but we do not use it for the auxiliary tarballs +chmod -Rf a+rX,u+w,g-w,o-w . %build export PYTHON_COMMAND=%{__python3} source ./edksetup.sh - -# compiler -CC_FLAGS="-t GCC5" - -# parallel builds -JOBS="%{?_smp_mflags}" -JOBS="${JOBS#-j}" -if test "$JOBS" != ""; then - CC_FLAGS="${CC_FLAGS} -n $JOBS" -fi - -# common features -CC_FLAGS="$CC_FLAGS --cmd-len=65536 -b DEBUG --hash" -CC_FLAGS="$CC_FLAGS -D NETWORK_IP6_ENABLE" -CC_FLAGS="$CC_FLAGS -D NETWORK_TLS_ENABLE" -CC_FLAGS="$CC_FLAGS -D NETWORK_HTTP_BOOT_ENABLE" -CC_FLAGS="$CC_FLAGS -D TPM_ENABLE" - -# ovmf features -OVMF_FLAGS="${CC_FLAGS}" -OVMF_FLAGS="${OVMF_FLAGS} -D FD_SIZE_2MB" - -# ovmf + secure boot features -OVMF_SB_FLAGS="${OVMF_FLAGS}" -OVMF_SB_FLAGS="${OVMF_SB_FLAGS} -D SECURE_BOOT_ENABLE" -OVMF_SB_FLAGS="${OVMF_SB_FLAGS} -D SMM_REQUIRE" -OVMF_SB_FLAGS="${OVMF_SB_FLAGS} -D EXCLUDE_SHELL_FROM_FD" - -# arm firmware features -ARM_FLAGS="${CC_FLAGS}" - -unset MAKEFLAGS -%make_build -C BaseTools \ +make -C "$EDK_TOOLS_PATH" \ + %{?_smp_mflags} \ EXTRA_OPTFLAGS="%{optflags}" \ EXTRA_LDFLAGS="%{__global_ldflags}" -sed -i -e 's/-Werror//' Conf/tools_def.txt +SMP_MFLAGS="%{?_smp_mflags}" +if [[ x"$SMP_MFLAGS" = x-j* ]]; then + CC_FLAGS="$CC_FLAGS -n ${SMP_MFLAGS#-j}" +elif [ -n "%{?jobs}" ]; then + CC_FLAGS="$CC_FLAGS -n %{?jobs}" +fi -%if 0%{?cross:1} -export GCC5_IA32_PREFIX="x86_64-linux-gnu-" -export GCC5_X64_PREFIX="x86_64-linux-gnu-" -export GCC5_AARCH64_PREFIX="aarch64-linux-gnu-" -export GCC5_ARM_PREFIX="arm-linux-gnu-" -%endif +CC_FLAGS="$CC_FLAGS --cmd-len=65536 -t %{TOOLCHAIN} -b DEBUG --hash" +CC_FLAGS="$CC_FLAGS -D NETWORK_IP6_ENABLE" +CC_FLAGS="$CC_FLAGS -D NETWORK_HTTP_BOOT_ENABLE -D NETWORK_TLS_ENABLE" -# build ovmf (x64) -%if 0%{?build_ovmf_x64:1} -mkdir -p ovmf -build ${OVMF_FLAGS} -a X64 -p OvmfPkg/OvmfPkgX64.dsc -cp Build/OvmfX64/*/FV/OVMF_*.fd ovmf/ -rm -rf Build/OvmfX64 +%ifarch x86_64 +# Build with neither SB nor SMM; include UEFI shell. +build ${CC_FLAGS} -D TPM_ENABLE -D FD_SIZE_4MB -a X64 \ + -D PVSCSI_ENABLE=FALSE -D MPT_SCSI_ENABLE=FALSE \ + -p OvmfPkg/OvmfPkgX64.dsc -# build ovmf (x64) with secure boot -build ${OVMF_SB_FLAGS} -a IA32 -a X64 -p OvmfPkg/OvmfPkgIa32X64.dsc -cp Build/Ovmf3264/*/FV/OVMF_CODE.fd ovmf/OVMF_CODE.secboot.fd +# Build with SB and SMM; exclude UEFI shell. +build -D SECURE_BOOT_ENABLE -D EXCLUDE_SHELL_FROM_FD ${CC_FLAGS} \ + -a IA32 -a X64 -p OvmfPkg/OvmfPkgIa32X64.dsc -D SMM_REQUIRE \ + -D PVSCSI_ENABLE=FALSE -D MPT_SCSI_ENABLE=FALSE \ + -D TPM_ENABLE -D FD_SIZE_4MB -# build ovmf (x64) shell iso with EnrollDefaultKeys -cp Build/Ovmf3264/*/X64/Shell.efi ovmf/ -cp Build/Ovmf3264/*/X64/EnrollDefaultKeys.efi ovmf -sh %{_sourcedir}/build-iso.sh ovmf/ +# Sanity check: the varstore templates must be identical. +cmp Build/OvmfX64/DEBUG_%{TOOLCHAIN}/FV/OVMF_VARS.fd \ + Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/FV/OVMF_VARS.fd + +# Prepare an ISO image that boots the UEFI shell. +( + UEFI_SHELL_BINARY=Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/X64/Shell.efi + ENROLLER_BINARY=Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/X64/EnrollDefaultKeys.efi + UEFI_SHELL_IMAGE=uefi_shell.img + ISO_IMAGE=UefiShell.iso + + UEFI_SHELL_BINARY_BNAME=$(basename -- "$UEFI_SHELL_BINARY") + UEFI_SHELL_SIZE=$(stat --format=%s -- "$UEFI_SHELL_BINARY") + ENROLLER_SIZE=$(stat --format=%s -- "$ENROLLER_BINARY") + + # add 1MB then 10% for metadata + UEFI_SHELL_IMAGE_KB=$(( + (UEFI_SHELL_SIZE + ENROLLER_SIZE + 1 * 1024 * 1024) * 11 / 10 / 1024 + )) + + # create non-partitioned FAT image + rm -f -- "$UEFI_SHELL_IMAGE" + mkdosfs -C "$UEFI_SHELL_IMAGE" -n UEFI_SHELL -- "$UEFI_SHELL_IMAGE_KB" + + # copy the shell binary into the FAT image + export MTOOLS_SKIP_CHECK=1 + mmd -i "$UEFI_SHELL_IMAGE" ::efi + mmd -i "$UEFI_SHELL_IMAGE" ::efi/boot + mcopy -i "$UEFI_SHELL_IMAGE" "$UEFI_SHELL_BINARY" ::efi/boot/bootx64.efi + mcopy -i "$UEFI_SHELL_IMAGE" "$ENROLLER_BINARY" :: + mdir -i "$UEFI_SHELL_IMAGE" -/ :: + + # build ISO with FAT image file as El Torito EFI boot image + genisoimage -input-charset ASCII -J -rational-rock \ + -efi-boot "$UEFI_SHELL_IMAGE" -no-emul-boot \ + -o "$ISO_IMAGE" -- "$UEFI_SHELL_IMAGE" +) + +# Enroll the default certificates in a separate variable store template. +%{__python3} ovmf-vars-generator --verbose --verbose \ + --qemu-binary /usr/libexec/qemu-kvm \ + --ovmf-binary Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/FV/OVMF_CODE.fd \ + --ovmf-template-vars Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/FV/OVMF_VARS.fd \ + --uefi-shell-iso UefiShell.iso \ + --oem-string "$(< PkKek1.oemstr)" \ + --skip-testing \ + OVMF_VARS.secboot.fd -%if !%{skip_enroll} -python3 qemu-ovmf-secureboot-%{qosb_version}/ovmf-vars-generator \ - --qemu-binary /usr/bin/qemu-system-x86_64 \ - --ovmf-binary ovmf/OVMF_CODE.secboot.fd \ - --ovmf-template-vars ovmf/OVMF_VARS.fd \ - --uefi-shell-iso ovmf/UefiShell.iso \ - --oem-string "$(< PkKek1.oemstr)" \ - --skip-testing \ - ovmf/OVMF_VARS.secboot.fd %else -# This isn't going to actually give secureboot, but makes json files happy -# if we need to test disabling ovmf-vars-generator -cp ovmf/OVMF_VARS.fd ovmf/OVMF_VARS.secboot.fd +# Build with a verbose debug mask first, and stash the binary. +build ${CC_FLAGS} -a AARCH64 \ + -p ArmVirtPkg/ArmVirtQemu.dsc \ + -D TPM2_ENABLE \ + -D DEBUG_PRINT_ERROR_LEVEL=0x8040004F +cp -a Build/ArmVirtQemu-AARCH64/DEBUG_%{TOOLCHAIN}/FV/QEMU_EFI.fd \ + QEMU_EFI.verbose.fd + +# Rebuild with a silent (errors only) debug mask. +build ${CC_FLAGS} -a AARCH64 \ + -p ArmVirtPkg/ArmVirtQemu.dsc \ + -D TPM2_ENABLE \ + -D DEBUG_PRINT_ERROR_LEVEL=0x80000000 %endif -%endif - - -# build ovmf-ia32 -%if 0%{?build_ovmf_ia32:1} -mkdir -p ovmf-ia32 -build ${OVMF_FLAGS} -a IA32 -p OvmfPkg/OvmfPkgIa32.dsc -cp Build/OvmfIa32/*/FV/OVMF_CODE*.fd ovmf-ia32/ -# cp VARS files from from ovmf/, which are all we need -cp ovmf/OVMF_VARS*.fd ovmf-ia32/ -rm -rf Build/OvmfIa32 - -# build ovmf-ia32 with secure boot -build ${OVMF_SB_FLAGS} -a IA32 -p OvmfPkg/OvmfPkgIa32.dsc -cp Build/OvmfIa32/*/FV/OVMF_CODE.fd ovmf-ia32/OVMF_CODE.secboot.fd - -# build ovmf-ia32 shell iso with EnrollDefaultKeys -cp Build/OvmfIa32/*/IA32/Shell.efi ovmf-ia32/Shell.efi -cp Build/OvmfIa32/*/IA32/EnrollDefaultKeys.efi ovmf-ia32/EnrollDefaultKeys.efi -sh %{_sourcedir}/build-iso.sh ovmf-ia32/ -%endif - - -# build aarch64 firmware -%if 0%{?build_aavmf_aarch64:1} -mkdir -p aarch64 -build $ARM_FLAGS -a AARCH64 -p ArmVirtPkg/ArmVirtQemu.dsc -cp Build/ArmVirtQemu-AARCH64/DEBUG_*/FV/*.fd aarch64 -dd of="aarch64/QEMU_EFI-pflash.raw" if="/dev/zero" bs=1M count=64 -dd of="aarch64/QEMU_EFI-pflash.raw" if="aarch64/QEMU_EFI.fd" conv=notrunc -dd of="aarch64/vars-template-pflash.raw" if="/dev/zero" bs=1M count=64 -%endif - - -# build ARMv7 firmware -%if 0%{?build_aavmf_arm:1} -mkdir -p arm -build $ARM_FLAGS -a ARM -p ArmVirtPkg/ArmVirtQemu.dsc -cp Build/ArmVirtQemu-ARM/DEBUG_*/FV/*.fd arm -dd of="arm/QEMU_EFI-pflash.raw" if="/dev/zero" bs=1M count=64 -dd of="arm/QEMU_EFI-pflash.raw" if="arm/QEMU_EFI.fd" conv=notrunc -dd of="arm/vars-template-pflash.raw" if="/dev/zero" bs=1M count=64 -%endif - - - -%check -%if 0%{?build_ovmf_x64:1} -%if 0%{?qosb_testing} -%if !%{skip_enroll} -KERNELPATH="$(find /lib/modules -name vmlinuz | head -1)" -python3 qemu-ovmf-secureboot-%{qosb_version}/ovmf-vars-generator \ - --qemu-binary /usr/bin/qemu-system-x86_64 \ - --ovmf-binary ovmf/OVMF_CODE.secboot.fd \ - --ovmf-template-vars ovmf/OVMF_VARS.fd \ - --uefi-shell-iso ovmf/UefiShell.iso \ - --skip-enrollment \ - --print-output \ - --no-download \ - -vv \ - --kernel-path "$KERNELPATH" \ - ovmf/OVMF_VARS.secboot.fd -%endif -%endif -%endif - - %install -cp CryptoPkg/Library/OpensslLib/openssl/LICENSE LICENSE.openssl + +cp -a OvmfPkg/License.txt License.OvmfPkg.txt +mkdir -p $RPM_BUILD_ROOT%{_datadir}/qemu/firmware + +%ifarch x86_64 +mkdir -p \ + $RPM_BUILD_ROOT%{_datadir}/OVMF \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf + +# We don't ship the SB-less, SMM-less binary. +%if 0 +install -m 0644 Build/OvmfX64/DEBUG_%{TOOLCHAIN}/FV/OVMF_CODE.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/OVMF_CODE.fd +ln -s ../%{name}/ovmf/OVMF_CODE.fd $RPM_BUILD_ROOT%{_datadir}/OVMF/ +%endif +install -m 0644 Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/FV/OVMF_CODE.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/OVMF_CODE.secboot.fd + +install -m 0644 Build/OvmfX64/DEBUG_%{TOOLCHAIN}/FV/OVMF_VARS.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/OVMF_VARS.fd +install -m 0644 OVMF_VARS.secboot.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/OVMF_VARS.secboot.fd +install -m 0644 UefiShell.iso \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/UefiShell.iso + +ln -s ../%{name}/ovmf/OVMF_CODE.secboot.fd $RPM_BUILD_ROOT%{_datadir}/OVMF/ +ln -s ../%{name}/ovmf/OVMF_VARS.fd $RPM_BUILD_ROOT%{_datadir}/OVMF/ +ln -s ../%{name}/ovmf/OVMF_VARS.secboot.fd $RPM_BUILD_ROOT%{_datadir}/OVMF/ +ln -s ../%{name}/ovmf/UefiShell.iso $RPM_BUILD_ROOT%{_datadir}/OVMF/ + +install -m 0644 Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/X64/Shell.efi \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/Shell.efi +install -m 0644 Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/X64/EnrollDefaultKeys.efi \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/ovmf/EnrollDefaultKeys.efi + +install -m 0644 edk2-ovmf-sb.json \ + $RPM_BUILD_ROOT%{_datadir}/qemu/firmware/40-edk2-ovmf-sb.json +install -m 0644 edk2-ovmf.json \ + $RPM_BUILD_ROOT%{_datadir}/qemu/firmware/50-edk2-ovmf.json + +%else +mkdir -p \ + $RPM_BUILD_ROOT%{_datadir}/AAVMF \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64 + +# Pad and install the verbose binary. +cat QEMU_EFI.verbose.fd \ + /dev/zero \ +| head -c 64m \ + > $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64/QEMU_EFI-pflash.raw + +# Pad and install the silent (default) binary. +cat Build/ArmVirtQemu-AARCH64/DEBUG_%{TOOLCHAIN}/FV/QEMU_EFI.fd \ + /dev/zero \ +| head -c 64m \ + > $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64/QEMU_EFI-silent-pflash.raw + +# Create varstore template. +cat Build/ArmVirtQemu-AARCH64/DEBUG_%{TOOLCHAIN}/FV/QEMU_VARS.fd \ + /dev/zero \ +| head -c 64m \ + > $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64/vars-template-pflash.raw + +ln -s ../%{name}/aarch64/QEMU_EFI-pflash.raw \ + $RPM_BUILD_ROOT%{_datadir}/AAVMF/AAVMF_CODE.verbose.fd +ln -s ../%{name}/aarch64/QEMU_EFI-silent-pflash.raw \ + $RPM_BUILD_ROOT%{_datadir}/AAVMF/AAVMF_CODE.fd +ln -s ../%{name}/aarch64/vars-template-pflash.raw \ + $RPM_BUILD_ROOT%{_datadir}/AAVMF/AAVMF_VARS.fd + +chmod 0644 -- $RPM_BUILD_ROOT%{_datadir}/AAVMF/AAVMF_*.fd + +install -m 0644 QEMU_EFI.verbose.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64/QEMU_EFI.fd +install -m 0644 Build/ArmVirtQemu-AARCH64/DEBUG_%{TOOLCHAIN}/FV/QEMU_EFI.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64/QEMU_EFI.silent.fd +install -m 0644 Build/ArmVirtQemu-AARCH64/DEBUG_%{TOOLCHAIN}/FV/QEMU_VARS.fd \ + $RPM_BUILD_ROOT%{_datadir}/%{name}/aarch64/QEMU_VARS.fd + +install -m 0644 edk2-aarch64.json \ + $RPM_BUILD_ROOT%{_datadir}/qemu/firmware/60-edk2-aarch64.json +install -m 0644 edk2-aarch64-verbose.json \ + $RPM_BUILD_ROOT%{_datadir}/qemu/firmware/70-edk2-aarch64-verbose.json + +%endif + +cp -a CryptoPkg/Library/OpensslLib/openssl/LICENSE LICENSE.openssl + +# install the tools mkdir -p %{buildroot}%{_bindir} \ %{buildroot}%{_datadir}/%{name}/Conf \ %{buildroot}%{_datadir}/%{name}/Scripts @@ -425,80 +409,62 @@ install BaseTools/Conf/*.template \ install BaseTools/Scripts/GccBase.lds \ %{buildroot}%{_datadir}/%{name}/Scripts -cp -R BaseTools/Source/Python %{buildroot}%{_datadir}/%{name}/Python -for i in build BPDG Ecc GenDepex GenFds GenPatchPcdTable PatchPcdValue TargetTool Trim UPT; do -echo '#!/bin/sh -export PYTHONPATH=%{_datadir}/%{name}/Python -exec python3 '%{_datadir}/%{name}/Python/$i/$i.py' "$@"' > %{buildroot}%{_bindir}/$i - chmod +x %{buildroot}%{_bindir}/$i -done - -# For distro-provided firmware packages, the specification -# (https://git.qemu.org/?p=qemu.git;a=blob;f=docs/interop/firmware.json) -# says the JSON "descriptor files" to be searched in this directory: -# `/usr/share/firmware/`. Create it. -mkdir -p %{buildroot}/%{_datadir}/qemu/firmware - -mkdir -p %{buildroot}/usr/share/%{name} -%if 0%{?build_ovmf_x64:1} -cp -a ovmf %{buildroot}/usr/share/%{name} -# Libvirt hardcodes this directory name -mkdir %{buildroot}/usr/share/OVMF -ln -sf ../%{name}/ovmf/OVMF_CODE.fd %{buildroot}/usr/share/OVMF -ln -sf ../%{name}/ovmf/OVMF_CODE.secboot.fd %{buildroot}/usr/share/OVMF -ln -sf ../%{name}/ovmf/OVMF_VARS.fd %{buildroot}/usr/share/OVMF -ln -sf ../%{name}/ovmf/OVMF_VARS.secboot.fd %{buildroot}/usr/share/OVMF -ln -sf ../%{name}/ovmf/UefiShell.iso %{buildroot}/usr/share/OVMF - -for f in %{_sourcedir}/*edk2-ovmf-x64*.json; do - install -pm 644 $f %{buildroot}/%{_datadir}/qemu/firmware -done +%ifarch x86_64 +%files ovmf +%else +%files aarch64 %endif +%defattr(-,root,root,-) +%license License.txt +%license License.OvmfPkg.txt +%license License-History.txt +%license LICENSE.openssl +%dir %{_datadir}/%{name}/ +%dir %{_datadir}/qemu +%dir %{_datadir}/qemu/firmware -%if 0%{?build_ovmf_ia32:1} -cp -a ovmf-ia32 %{buildroot}/usr/share/%{name} - -for f in %{_sourcedir}/*edk2-ovmf-ia32*.json; do - install -pm 644 $f %{buildroot}/%{_datadir}/qemu/firmware -done +%ifarch x86_64 +%doc OvmfPkg/README +%doc ovmf-whitepaper-c770f8c.txt +%dir %{_datadir}/OVMF/ +%dir %{_datadir}/%{name}/ovmf/ +%if 0 +%{_datadir}/%{name}/ovmf/OVMF_CODE.fd +%{_datadir}/OVMF/OVMF_CODE.fd %endif +%{_datadir}/%{name}/ovmf/OVMF_CODE.secboot.fd +%{_datadir}/%{name}/ovmf/OVMF_VARS.fd +%{_datadir}/%{name}/ovmf/OVMF_VARS.secboot.fd +%{_datadir}/%{name}/ovmf/UefiShell.iso +%{_datadir}/OVMF/OVMF_CODE.secboot.fd +%{_datadir}/OVMF/OVMF_VARS.fd +%{_datadir}/OVMF/OVMF_VARS.secboot.fd +%{_datadir}/OVMF/UefiShell.iso +%{_datadir}/%{name}/ovmf/Shell.efi +%{_datadir}/%{name}/ovmf/EnrollDefaultKeys.efi +%{_datadir}/qemu/firmware/40-edk2-ovmf-sb.json +%{_datadir}/qemu/firmware/50-edk2-ovmf.json - -%if 0%{?build_aavmf_aarch64:1} -cp -a aarch64 %{buildroot}/usr/share/%{name} -# Libvirt hardcodes this directory name -mkdir %{buildroot}/usr/share/AAVMF -ln -sf ../%{name}/aarch64/QEMU_EFI-pflash.raw %{buildroot}/usr/share/AAVMF/AAVMF_CODE.fd -ln -sf ../%{name}/aarch64/vars-template-pflash.raw %{buildroot}/usr/share/AAVMF/AAVMF_VARS.fd - -for f in %{_sourcedir}/*edk2-aarch64*.json; do - install -pm 644 $f %{buildroot}/%{_datadir}/qemu/firmware -done +%else +%dir %{_datadir}/AAVMF/ +%dir %{_datadir}/%{name}/aarch64/ +%{_datadir}/%{name}/aarch64/QEMU_EFI-pflash.raw +%{_datadir}/%{name}/aarch64/QEMU_EFI-silent-pflash.raw +%{_datadir}/%{name}/aarch64/vars-template-pflash.raw +%{_datadir}/AAVMF/AAVMF_CODE.verbose.fd +%{_datadir}/AAVMF/AAVMF_CODE.fd +%{_datadir}/AAVMF/AAVMF_VARS.fd +%{_datadir}/%{name}/aarch64/QEMU_EFI.fd +%{_datadir}/%{name}/aarch64/QEMU_EFI.silent.fd +%{_datadir}/%{name}/aarch64/QEMU_VARS.fd +%{_datadir}/qemu/firmware/60-edk2-aarch64.json +%{_datadir}/qemu/firmware/70-edk2-aarch64-verbose.json %endif - -%if 0%{?build_aavmf_arm:1} -cp -a arm %{buildroot}/usr/share/%{name} -ln -sf ../%{name}/arm/QEMU_EFI-pflash.raw %{buildroot}/usr/share/AAVMF/AAVMF32_CODE.fd - -for f in %{_sourcedir}/*edk2-arm*.json; do - install -pm 644 $f %{buildroot}/%{_datadir}/qemu/firmware -done -%endif - -%if 0%{?py_byte_compile:1} -# https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#manual-bytecompilation -%py_byte_compile %{python3} %{buildroot}%{_datadir}/edk2/Python -%endif - - -install qemu-ovmf-secureboot-%{qosb_version}/ovmf-vars-generator %{buildroot}%{_bindir} - - %files tools %license License.txt -%license LICENSE.openssl +%license License-History.txt %{_bindir}/DevicePath %{_bindir}/EfiRom %{_bindir}/GenCrc32 @@ -517,326 +483,692 @@ install qemu-ovmf-secureboot-%{qosb_version}/ovmf-vars-generator %{buildroot}%{_ %{_datadir}/%{name}/Conf %{_datadir}/%{name}/Scripts -%files tools-python -%{_bindir}/build -%{_bindir}/BPDG -%{_bindir}/Ecc -%{_bindir}/GenDepex -%{_bindir}/GenFds -%{_bindir}/GenPatchPcdTable -%{_bindir}/PatchPcdValue -%{_bindir}/TargetTool -%{_bindir}/Trim -%{_bindir}/UPT -%dir %{_datadir}/%{name} -%{_datadir}/%{name}/Python - %files tools-doc %doc BaseTools/UserManuals/*.rtf -%files qosb -%license LICENSE.qosb -%doc README.qosb -%{_bindir}/ovmf-vars-generator +%check + +%ifarch x86_64 +# Of the installed host kernels, boot the one with the highest Version-Release +# under OVMF, and check if it prints "Secure boot enabled". +KERNEL_PKG=$(rpm -q kernel-core | rpmdev-sort | tail -n 1) +KERNEL_IMG=$(rpm -q -l $KERNEL_PKG | egrep '^/lib/modules/[^/]+/vmlinuz$') + +%{__python3} ovmf-vars-generator --verbose --verbose \ + --qemu-binary /usr/libexec/qemu-kvm \ + --ovmf-binary Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/FV/OVMF_CODE.fd \ + --ovmf-template-vars Build/Ovmf3264/DEBUG_%{TOOLCHAIN}/FV/OVMF_VARS.fd \ + --uefi-shell-iso UefiShell.iso \ + --kernel-path $KERNEL_IMG \ + --skip-enrollment \ + --no-download \ + OVMF_VARS.secboot.fd + +%else +true -%if 0%{?build_ovmf_x64:1} -%files ovmf -%license OvmfPkg/License.txt -%license LICENSE.openssl -%doc OvmfPkg/README -%doc ovmf-whitepaper-c770f8c.txt -%dir /usr/share/%{name} -%dir /usr/share/%{name}/ovmf -%dir /usr/share/qemu/firmware -/usr/share/%{name}/ovmf/OVMF*.fd -/usr/share/%{name}/ovmf/*.efi -/usr/share/%{name}/ovmf/*.iso -/usr/share/qemu/firmware/*edk2-ovmf-x64*.json -/usr/share/OVMF %endif -%if 0%{?build_ovmf_ia32:1} -%files ovmf-ia32 -%license OvmfPkg/License.txt -%license LICENSE.openssl -%doc OvmfPkg/README -%doc ovmf-whitepaper-c770f8c.txt -%dir /usr/share/%{name} -%dir /usr/share/%{name}/ovmf-ia32 -%dir /usr/share/qemu/firmware -/usr/share/%{name}/ovmf-ia32/OVMF*.fd -/usr/share/%{name}/ovmf-ia32/*.efi -/usr/share/%{name}/ovmf-ia32/*.iso -/usr/share/qemu/firmware/*edk2-ovmf-ia32*.json -%endif - -%if 0%{?build_aavmf_aarch64:1} -%files aarch64 -%license OvmfPkg/License.txt -%license LICENSE.openssl -%dir /usr/share/%{name} -%dir /usr/share/%{name}/aarch64 -%dir /usr/share/qemu/firmware -/usr/share/%{name}/aarch64/QEMU*.fd -/usr/share/%{name}/aarch64/*.raw -/usr/share/qemu/firmware/*edk2-aarch64*.json -/usr/share/AAVMF/AAVMF_* -%endif - -%if 0%{?build_aavmf_arm:1} -%files arm -%license OvmfPkg/License.txt -%license LICENSE.openssl -%dir /usr/share/%{name} -%dir /usr/share/%{name}/arm -%dir /usr/share/qemu/firmware -/usr/share/%{name}/arm/QEMU*.fd -/usr/share/%{name}/arm/*.raw -/usr/share/qemu/firmware/*edk2-arm*.json -/usr/share/AAVMF/AAVMF32_* -%endif - - %changelog -* Thu Dec 03 2020 Cole Robinson - 20200801stable-3 -- Really fix TPM breakage (bz 1897367) - -* Tue Nov 24 2020 Cole Robinson - 20200801stable-2 -- Fix openssl usage, unbreak TPM (bz 1897367) - -* Wed Sep 16 2020 Cole Robinson - 20200801stable-1 -- Update to edk2 stable 202008 - -* Sat Sep 12 2020 Peter Robinson - 20200201stable-6 -- Tweaks for aarch64/ARMv7 builds -- Minor cleanups - -* Tue Aug 04 2020 Cole Robinson - 20200201stable-5 -- Fix build failures on rawhide - -* Sat Aug 01 2020 Fedora Release Engineering - 20200201stable-4 -- Second attempt - Rebuilt for - https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jul 27 2020 Fedora Release Engineering - 20200201stable-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Mon Jul 13 2020 Tom Stellard - 20200201stable-2 -- Use make macros -- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro - -* Mon Apr 13 2020 Cole Robinson - 20200201stable-1 -- Update to stable-202002 - -* Tue Jan 28 2020 Fedora Release Engineering - 20190501stable-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Fri Sep 06 2019 Patrick Uiterwijk - 20190501stable-4 -- Updated HTTP_BOOT option to new upstream value - -* Wed Jul 24 2019 Fedora Release Engineering - 20190501stable-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Mon Jul 15 2019 Cole Robinson - 20190501stable-2 -- License is now BSD-2-Clause-Patent -- Re-enable secureboot enrollment -- Use qemu-ovmf-secureboot from git - -* Thu Jul 11 2019 Cole Robinson - 20190501stable-1 -- Update to stable-201905 -- Update to openssl-1.1.1b -- Ship VARS file for ovmf-ia32 (bug 1688596) -- Ship Fedora-variant JSON "firmware descriptor files" -- Resolves rhbz#1728652 - -* Mon Mar 18 2019 Cole Robinson - 20190308stable-1 -- Use YYYYMMDD versioning to fix upgrade path - -* Fri Mar 15 2019 Cole Robinson - 201903stable-1 -- Update to stable-201903 -- Update to openssl-1.1.0j -- Move to python3 deps - -* Thu Jan 31 2019 Fedora Release Engineering - 20180815gitcb5f4f45ce-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Wed Nov 14 2018 Patrick Uiterwijk - 20180815gitcb5f4f45ce-5 -- Add -qosb dependency on python3 - -* Fri Nov 9 2018 Paolo Bonzini - 20180815gitcb5f4f45ce-4 -- Fix network boot via grub (bz 1648476) - -* Wed Sep 12 2018 Paolo Bonzini - 20180815gitcb5f4f45ce-3 -- Explicitly compile the scripts using py_byte_compile - -* Fri Aug 31 2018 Cole Robinson - 20180815gitcb5f4f45ce-2 -- Fix passing through RPM build flags (bz 1540244) - -* Tue Aug 21 2018 Cole Robinson - 20180815gitcb5f4f45ce-1 -- Update to edk2 git cb5f4f45ce, edk2-stable201808 -- Update to qemu-ovmf-secureboot-1.1.3 -- Enable TPM2 support - -* Mon Jul 23 2018 Paolo Bonzini - 20180529gitee3198e672e2-5 -- Fixes for AMD SEV on OVMF_CODE.fd -- Add Provides for bundled OpenSSL - -* Wed Jul 18 2018 Paolo Bonzini - 20180529gitee3198e672e2-4 -- Enable IPv6 - -* Thu Jul 12 2018 Fedora Release Engineering - 20180529gitee3198e672e2-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Wed Jun 20 2018 Paolo Bonzini - 20180529gitee3198e672e2-2 -- Backport two bug fixes from RHEL: connect again virtio-rng devices, and - connect consoles unconditionally in OVMF (ARM firmware already did it) - -* Tue May 29 2018 Paolo Bonzini - 20180529gitee3198e672e2-1 -- Rebase to ee3198e672e2 - -* Tue May 01 2018 Cole Robinson - 20171011git92d07e4-7 -- Bump release for new build - -* Fri Mar 30 2018 Patrick Uiterwijk - 20171011git92d07e4-6 -- Add qemu-ovmf-secureboot (qosb) -- Generate pre-enrolled Secure Boot OVMF VARS files - -* Wed Mar 07 2018 Paolo Bonzini - 20171011git92d07e4-5 -- Fix GCC 8 compilation -- Replace dosfstools and mtools with qemu-img vvfat - -* Wed Feb 07 2018 Fedora Release Engineering - 20171011git92d07e4-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Fri Jan 19 2018 Paolo Bonzini - 20170209git296153c5-3 -- Add OpenSSL patches from Fedora -- Enable TLS_MODE - -* Fri Nov 17 2017 Paolo Bonzini - 20170209git296153c5-2 -- Backport patches 19-21 from RHEL -- Add patches 22-24 to fix SEV slowness -- Add fedora conditionals - -* Tue Nov 14 2017 Paolo Bonzini - 20171011git92d07e4-1 -- Import source and patches from RHEL version -- Update OpenSSL to 1.1.0e -- Refresh 0099-Tweak-the-tools_def-to-support-cross-compiling.patch - -* Mon Nov 13 2017 Paolo Bonzini - 20170209git296153c5-6 -- Allow non-cross builds -- Install /usr/share/OVMF and /usr/share/AAVMF - -* Wed Aug 02 2017 Fedora Release Engineering - 20170209git296153c5-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 20170209git296153c5-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Wed Mar 15 2017 Cole Robinson - 20170209git296153c5-3 -- Ship ovmf-ia32 package (bz 1424722) - -* Thu Feb 16 2017 Cole Robinson - 20170209git296153c5-2 -- Update EnrollDefaultKeys patch (bz #1398743) - -* Mon Feb 13 2017 Paolo Bonzini - 20170209git296153c5-1 -- Rebase to git master -- New patch 0010 fixes failure to build from source. - -* Fri Feb 10 2017 Fedora Release Engineering - 20161105git3b25ca8-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Sun Nov 06 2016 Cole Robinson - 20161105git3b25ca8-1 -- Rebase to git master - -* Fri Sep 9 2016 Tom Callaway - 20160418gita8c39ba-5 -- replace legally problematic openssl source with "hobbled" tarball - -* Thu Jul 21 2016 Gerd Hoffmann - 20160418gita8c39ba-4 -- Also build for armv7. - -* Tue Jul 19 2016 Gerd Hoffmann 20160418gita8c39ba-3 -- Update EnrollDefaultKeys patch. - -* Fri Jul 8 2016 Paolo Bonzini - 20160418gita8c39ba-2 -- Distribute edk2-ovmf on aarch64 - -* Sat May 21 2016 Cole Robinson - 20160418gita8c39ba-1 -- Distribute edk2-aarch64 on x86 (bz #1338027) - -* Mon Apr 18 2016 Gerd Hoffmann 20160418gita8c39ba-0 -- Update to latest git. -- Add firmware builds (FatPkg is free now). - -* Mon Feb 15 2016 Cole Robinson 20151127svn18975-3 -- Fix FTBFS gcc warning (bz 1307439) - -* Wed Feb 03 2016 Fedora Release Engineering - 20151127svn18975-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Fri Nov 27 2015 Paolo Bonzini - 20151127svn18975-1 -- Rebase to 20151127svn18975-1 -- Linker script renamed to GccBase.lds - -* Wed Jun 17 2015 Fedora Release Engineering - 20150519svn17469-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Tue May 19 2015 Paolo Bonzini - 20150519svn17469-1 -- Rebase to 20150519svn17469-1 -- edk2-remove-tree-check.patch now upstream - -* Sat May 02 2015 Kalev Lember - 20140724svn2670-6 -- Rebuilt for GCC 5 C++11 ABI change - -* Sat Aug 16 2014 Fedora Release Engineering - 20140724svn2670-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Thu Jul 24 2014 Paolo Bonzini - 20140724svn2670-1 -- Rebase to 20140724svn2670-1 - -* Tue Jun 24 2014 Paolo Bonzini - 20140624svn2649-1 -- Use standalone .tar.xz from buildtools repo - -* Tue Jun 24 2014 Paolo Bonzini - 20140328svn15376-4 -- Install BuildTools/BaseEnv - -* Mon Jun 23 2014 Paolo Bonzini - 20140328svn15376-3 -- Rebase to get GCC48 configuration -- Package EDK_TOOLS_PATH as /usr/share/edk2 -- Package "build" and LzmaF86Compress too, as well as the new - tools Ecc and TianoCompress. - -* Sat Jun 07 2014 Fedora Release Engineering - 20131114svn14844-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Thu Nov 14 2013 Paolo Bonzini - 20131114svn14844-1 -- Upgrade to r14844. -- Remove upstreamed parts of patch 1. - -* Fri Nov 8 2013 Paolo Bonzini - 20130515svn14365-7 -- Make BaseTools compile on ARM. - -* Fri Aug 30 2013 Paolo Bonzini - 20130515svn14365-6 -- Revert previous change; firmware packages should be noarch, and building - BaseTools twice is simply wrong. - -* Mon Aug 19 2013 Kay Sievers - 20130515svn14365-5 -- Add sub-package with EFI shell - -* Sat Aug 03 2013 Fedora Release Engineering - 20130515svn14365-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Thu May 23 2013 Dan HorĂ¡k 20130515svn14365-3 -- set ExclusiveArch - -* Thu May 16 2013 Paolo Bonzini 20130515svn14365-2 -- Fix edk2-tools-python Requires - -* Wed May 15 2013 Paolo Bonzini 20130515svn14365-1 -- Split edk2-tools-doc and edk2-tools-python -- Fix Python BuildRequires -- Remove FatBinPkg at package creation time. -- Use fully versioned dependency. -- Add comment on how to generate the sources. - -* Thu May 2 2013 Paolo Bonzini 20130502.g732d199-1 -- Create. +* Fri Jan 08 2021 Miroslav Rezanina - 20200602gitca407c7246bf-1.el9 +- Include fixes to build in RHEL 9 environment (bz#1906468) +- Resolves: bz#1906468 + ([RHEL9][FTBFS] edk2 FTBFS on Red Hat Enterprise Linux 9.0.0 Alpha) + +* Mon Nov 23 2020 Miroslav Rezanina - 20200602gitca407c7246bf-4.el8 +- edk2-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch [bz#1849177] +- edk2-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-befo.patch [bz#1849177] +- edk2-OvmfPkg-CpuHotplugSmm-fix-CPU-hotplug-race-just-afte.patch [bz#1849177] +- edk2-CryptoPkg-OpensslLib-Upgrade-OpenSSL-to-1.1.1g.patch [bz#1893806] +- edk2-redhat-bump-OpenSSL-dist-git-submodule-to-1.1.1g-RHE.patch [bz#1893806] +- Resolves: bz#1849177 + (OVMF: negotiate "SMI on VCPU hotplug" with QEMU) +- Resolves: bz#1893806 + (attempt advancing RHEL8 edk2's OpenSSL submodule to RHEL8 OpenSSL 1.1.1g (or later)) + +* Mon Aug 10 2020 Miroslav Rezanina - 20200602gitca407c7246bf-3.el8 +- edk2-UefiCpuPkg-PiSmmCpuDxeSmm-pause-in-WaitForSemaphore-.patch [bz#1861718] +- Resolves: bz#1861718 + (Very slow boot when overcommitting CPU) + +* Wed Jun 24 2020 Miroslav Rezanina - 20200602gitca407c7246bf-2.el8 +- edk2-OvmfPkg-QemuKernelLoaderFsDxe-suppress-error-on-no-k.patch [bz#1844682] +- edk2-OvmfPkg-GenericQemuLoadImageLib-log-Not-Found-at-INF.patch [bz#1844682] +- edk2-SecurityPkg-Tcg2Dxe-suppress-error-on-no-swtpm-in-si.patch [bz#1844682] +- Resolves: bz#1844682 + (silent build of edk2-aarch64 logs DEBUG_ERROR messages that don't actually report serious errors) + +* Sat Jun 13 2020 Miroslav Rezanina - 20200602gitca407c7246bf-1.el8 +- Rebase to edk2-stable202005 [bz#1817035] +- Resolves: bz#1817035 + ((edk2-rebase-rhel-8.3) - rebase edk2 to upstream tag edk2-stable202005 for RHEL-8.3) + +* Fri Mar 27 2020 Miroslav Rezanina - 20190829git37eef91017ad-9.el8 +- edk2-OvmfPkg-QemuVideoDxe-unbreak-secondary-vga-and-bochs.patch [bz#1806359] +- Resolves: bz#1806359 + (bochs-display cannot show graphic wihout driver attach) + +* Tue Feb 18 2020 Miroslav Rezanina - 20190829git37eef91017ad-8.el8 +- edk2-MdeModulePkg-Enable-Disable-S3BootScript-dynamically.patch [bz#1801274] +- edk2-MdeModulePkg-PiDxeS3BootScriptLib-Fix-potential-nume.patch [bz#1801274] +- Resolves: bz#1801274 + (CVE-2019-14563 edk2: numeric truncation in MdeModulePkg/PiDxeS3BootScriptLib [rhel-8]) + +* Tue Feb 11 2020 Miroslav Rezanina - 20190829git37eef91017ad-7.el8 +- edk2-SecurityPkg-Fix-spelling-errors-PARTIAL-PICK.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-simplify-Ver.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-remove-else-.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-keep-PE-COFF.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-narrow-down-.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-fix-retval-o.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-remove-super.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-unnest-AddIm.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-eliminate-St.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-fix-retval-f.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-fix-imgexec-.patch [bz#1751993] +- edk2-SecurityPkg-DxeImageVerificationHandler-fix-defer-vs.patch [bz#1751993] +- Resolves: bz#1751993 + (DxeImageVerificationLib handles "DENY execute on security violation" like "DEFER execute on security violation" [rhel8]) + +* Tue Jan 21 2020 Miroslav Rezanina - 20190829git37eef91017ad-6.el8 +- edk2-UefiCpuPkg-PiSmmCpuDxeSmm-fix-2M-4K-page-splitting-r.patch [bz#1789335] +- Resolves: bz#1789335 + (VM with edk2 can't boot when setting memory with '-m 2001') + +* Thu Jan 16 2020 Miroslav Rezanina - 20190829git37eef91017ad-5.el8 +- edk2-MdeModulePkg-UefiBootManagerLib-log-reserved-mem-all.patch [bz#1789797] +- edk2-NetworkPkg-HttpDxe-fix-32-bit-truncation-in-HTTPS-do.patch [bz#1789797] +- Resolves: bz#1789797 + (Backport upstream patch series: "UefiBootManagerLib, HttpDxe: tweaks for large HTTP(S) downloads" to improve HTTP(S) Boot experience with large (4GiB+) files) + +* Wed Dec 11 2019 Miroslav Rezanina - 20190829git37eef91017ad-4.el8 +- edk2-redhat-set-guest-RAM-size-to-768M-for-SB-varstore-te.patch [bz#1778301] +- edk2-redhat-re-enable-Secure-Boot-varstore-template-verif.patch [bz#1778301] +- Resolves: bz#1778301 + (re-enable Secure Boot (varstore template) verification in %check) + +* Thu Dec 05 2019 Miroslav Rezanina - 20190829git37eef91017ad-3.el8 +- Update used openssl version [bz#1616029] +- Resolves: bz#1616029 + (rebuild edk2 against the final RHEL-8.2.0 version of OpenSSL-1.1.1) + +* Mon Dec 02 2019 Miroslav Rezanina - 20190829git37eef91017ad-2.el8 +- edk2-MdePkg-Include-Protocol-Tls.h-Add-the-data-type-of-E.patch [bz#1536624] +- edk2-CryptoPkg-TlsLib-Add-the-new-API-TlsSetVerifyHost-CV.patch [bz#1536624] +- edk2-CryptoPkg-Crt-turn-strchr-into-a-function-CVE-2019-1.patch [bz#1536624] +- edk2-CryptoPkg-Crt-satisfy-inet_pton.c-dependencies-CVE-2.patch [bz#1536624] +- edk2-CryptoPkg-Crt-import-inet_pton.c-CVE-2019-14553.patch [bz#1536624] +- edk2-CryptoPkg-TlsLib-TlsSetVerifyHost-parse-IP-address-l.patch [bz#1536624] +- edk2-NetworkPkg-TlsDxe-Add-the-support-of-host-validation.patch [bz#1536624] +- edk2-NetworkPkg-HttpDxe-Set-the-HostName-for-the-verifica.patch [bz#1536624] +- edk2-redhat-enable-HTTPS-Boot.patch [bz#1536624] +- Resolves: bz#1536624 + (HTTPS enablement in OVMF) + +* Fri Nov 29 2019 Miroslav Rezanina - 20190829git37eef91017ad-1.el8 +- Rebase to edk2-stable201908 [bz#1748180] +- Resolves: bz#1748180 + ((edk2-rebase-rhel-8.2) - rebase edk2 to upstream tag edk2-stable201908 for RHEL-8.2) + +* Mon Aug 05 2019 Miroslav Rezanina - 20190308git89910a39dcfd-6.el8 +- edk2-ArmVirtPkg-silence-DEBUG_VERBOSE-masking-0x00400000-.patch [bz#1714446] +- edk2-OvmfPkg-QemuRamfbDxe-Do-not-report-DXE-failure-on-Aa.patch [bz#1714446] +- edk2-ArmPkg-DebugPeCoffExtraActionLib-debugger-commands-a.patch [bz#1714446] +- Resolves: bz#1714446 + (edk2-aarch64 silent build is not silent enough) + +* Tue Jul 02 2019 Miroslav Rezanina - 20190308git89910a39dcfd-5.el8 +- edk2-redhat-add-D-TPM2_ENABLE-to-the-edk2-ovmf-build-flag.patch [bz#1693205] +- Resolves: bz#1693205 + (edk2: Enable TPM2 support) + +* Tue Jun 11 2019 Miroslav Rezanina - 20190308git89910a39dcfd-4.el8 +- edk2-OvmfPkg-raise-the-PCIEXBAR-base-to-2816-MB-on-Q35.patch [bz#1666941] +- edk2-OvmfPkg-PlatformPei-set-32-bit-UC-area-at-PciBase-Pc.patch [bz#1666941] +- Resolves: bz#1666941 + (UEFI guest cannot boot into os when setting some special memory size) + +* Tue Apr 09 2019 Danilo Cesar Lemes de Paula - 20190308git89910a39dcfd-2.el8 +- edk2-redhat-provide-firmware-descriptor-meta-files.patch [bz#1600230] +- Resolves: bz#1600230 + ([RHEL 8.1] RFE: provide firmware descriptor meta-files for the edk2-ovmf and edk2-aarch64 firmware images) + +* Mon Apr 08 2019 Danilo Cesar Lemes de Paula - 20190308git89910a39dcfd-1.el8 +- Rebase to edk2-20190308git89910a39dcfd + +* Mon Jan 21 2019 Danilo Cesar Lemes de Paula - 20180508gitee3198e672e2-9.el8 +- edk2-BaseTools-Fix-UEFI-and-Tiano-Decompression-logic-iss.patch [bz#1662184] +- edk2-MdePkg-BaseUefiDecompressLib-Fix-UEFI-Decompression-.patch [bz#1662184] +- edk2-IntelFrameworkModulePkg-Fix-UEFI-and-Tiano-Decompres.patch [bz#1662184] +- edk2-git-Use-HTTPS-support.patch [] +- Resolves: bz#1662184 + (backport fix for (theoretical?) regression introduced by earlier CVE fixes) + +* Wed Nov 21 2018 Danilo Cesar Lemes de Paula - 20180508gitee3198e672e2-8.el8 +- edk2-NetworkPkg-UefiPxeBcDxe-Add-EXCLUSIVE-attribute-when.patch [bz#1643377] +- Resolves: bz#1643377 + (Exception when grubx64.efi used for UEFI netboot) + +* Tue Nov 06 2018 Danilo Cesar Lemes de Paula - 20180508gitee3198e672e2-5.el8 +- edk2-MdeModulePkg-Variable-Fix-Timestamp-zeroing-issue-on.patch [bz#1641436] +- edk2-MdePkg-Add-more-checker-in-UefiDecompressLib-to-acce.patch [bz#1641449 bz#1641453 bz#1641464 bz#1641469] +- edk2-IntelFrameworkModulePkg-Add-more-checker-in-UefiTian.patch [bz#1641453 bz#1641464 bz#1641469] +- edk2-BaseTools-Add-more-checker-in-Decompress-algorithm-t.patch [bz#1641445 bz#1641453 bz#1641464 bz#1641469] +- Resolves: bz#1641436 + (CVE-2018-3613 edk2: Logic error in MdeModulePkg in EDK II firmware allows for privilege escalation by authenticated users [rhel-8]) +- Resolves: bz#1641445 + (CVE-2017-5731 edk2: Privilege escalation via processing of malformed files in TianoCompress.c [rhel-8]) +- Resolves: bz#1641449 + (CVE-2017-5732 edk2: Privilege escalation via processing of malformed files in BaseUefiDecompressLib.c [rhel-8]) +- Resolves: bz#1641453 + (CVE-2017-5733 edk2: Privilege escalation via heap-based buffer overflow in MakeTable() function [rhel-8]) +- Resolves: bz#1641464 + (CVE-2017-5734 edk2: Privilege escalation via stack-based buffer overflow in MakeTable() function [rhel-8]) +- Resolves: bz#1641469 + (CVE-2017-5735 edk2: Privilege escalation via heap-based buffer overflow in Decode() function [rhel-8]) + +* Tue Sep 04 2018 Danilo Cesar Lemes de Paula - 20180508gitee3198e672e2-5.el8 +- edk2-BaseTools-footer.makefile-expand-BUILD_CFLAGS-last-f.patch [bz#1607906] +- edk2-BaseTools-header.makefile-remove-c-from-BUILD_CFLAGS.patch [bz#1607906] +- edk2-BaseTools-Source-C-split-O2-to-BUILD_OPTFLAGS.patch [bz#1607906] +- edk2-BaseTools-Source-C-take-EXTRA_OPTFLAGS-from-the-call.patch [bz#1607906] +- edk2-BaseTools-Source-C-take-EXTRA_LDFLAGS-from-the-calle.patch [bz#1607906] +- edk2-BaseTools-VfrCompile-honor-EXTRA_LDFLAGS.patch [bz#1607906] +- edk2-redhat-inject-the-RPM-compile-and-link-options-to-th.patch [bz#1607906] +- Resolves: bz#1607906 + (edk2-tools: Does not use RPM build flags) + +* Wed Aug 08 2018 Danilo Cesar Lemes de Paula - 20180508gitee3198e672e2-4.el8 +- edk2-redhat-provide-virtual-bundled-OpenSSL-in-edk2-ovmf-.patch [bz#1607801] +- Resolves: bz#1607801 + (add 'Provides: bundled(openssl) = 1.1.0h' to the spec file) + +* Tue Jul 24 2018 Danilo Cesar Lemes de Paula - 20180508gitee3198e672e2-3.el8 +- edk2-redhat-Provide-and-Obsolete-OVMF-and-AAVMF.patch [bz#1596148] +- edk2-ArmVirtPkg-unify-HttpLib-resolutions-in-ArmVirt.dsc..patch [bz#1536627] +- edk2-ArmVirtPkg-ArmVirtQemu-enable-the-IPv6-stack.patch [bz#1536627] +- edk2-advertise-OpenSSL-due-to-IPv6-enablement-too-RHEL-on.patch [bz#1536627] +- edk2-redhat-add-D-NETWORK_IP6_ENABLE-to-the-build-flags.patch [bz#1536627] +- edk2-redhat-update-license-fields-and-files-in-the-spec-f.patch [bz#1536627] +- Resolves: bz#1536627 + (IPv6 enablement in OVMF) +- Resolves: bz#1596148 + (restore Provides/Obsoletes macros for OVMF and AAVMF, from RHEL-8 Alpha) + +* Tue Jul 10 2018 Danilo C. L. de Paula - 20180508gitee3198e672e2-2.el8 +- Rebase edk2 on top of 20180508gitee3198e672e2 + +* Fri Jun 08 2018 Miroslav Rezanina - 20180508-2.gitee3198e672e2 +- OvmfPkg/PlatformBootManagerLib: connect consoles unconditionally [bz#1577546] +- build OVMF varstore template with SB enabled / certs enrolled [bz#1561128] +- connect Virtio RNG devices again [bz#1579518] +- Resolves: bz#1577546 + (no input consoles connected under certain circumstances) +- Resolves: bz#1561128 + (OVMF Secure boot enablement (enrollment of default keys)) +- Resolves: bz#1579518 + (EFI_RNG_PROTOCOL no longer produced for virtio-rng) +* Wed Dec 06 2017 Miroslav Rezanina - 20171011-4.git92d07e48907f.el7 +- ovmf-MdeModulePkg-Core-Dxe-log-informative-memprotect-msg.patch [bz#1520485] +- ovmf-MdeModulePkg-BdsDxe-fall-back-to-a-Boot-Manager-Menu.patch [bz#1515418] +- Resolves: bz#1515418 + (RFE: Provide diagnostics for failed boot) +- Resolves: bz#1520485 + (AAVMF: two new messages with silent build) + +* Fri Dec 01 2017 Miroslav Rezanina - 20171011-3.git92d07e48907f.el7 +- ovmf-UefiCpuPkg-CpuDxe-Fix-multiple-entries-of-RT_CODE-in.patch [bz#1518308] +- ovmf-MdeModulePkg-DxeCore-Filter-out-all-paging-capabilit.patch [bz#1518308] +- ovmf-MdeModulePkg-Core-Merge-memory-map-after-filtering-p.patch [bz#1518308] +- Resolves: bz#1518308 + (UEFI memory map regression (runtime code entry splitting) introduced by c1cab54ce57c) + +* Mon Nov 27 2017 Miroslav Rezanina - 20171011-2.git92d07e48907f.el7 +- ovmf-MdeModulePkg-Bds-Remove-assertion-in-BmCharToUint.patch [bz#1513632] +- ovmf-MdeModulePkg-Bds-Check-variable-name-even-if-OptionN.patch [bz#1513632] +- ovmf-MdeModulePkg-PciBus-Fix-bug-that-PCI-BUS-claims-too-.patch [bz#1514105] +- ovmf-OvmfPkg-make-it-a-proper-BASE-library.patch [bz#1488247] +- ovmf-OvmfPkg-create-a-separate-PlatformDebugLibIoPort-ins.patch [bz#1488247] +- ovmf-OvmfPkg-save-on-I-O-port-accesses-when-the-debug-por.patch [bz#1488247] +- ovmf-OvmfPkg-enable-DEBUG_VERBOSE-RHEL-only.patch [bz#1488247] +- ovmf-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-QemuVide.patch [bz#1488247] +- ovmf-OvmfPkg-silence-EFI_D_VERBOSE-0x00400000-in-NvmExpre.patch [bz#1488247] +- ovmf-Revert-redhat-introduce-separate-silent-and-verbose-.patch [bz#1488247] +- Resolves: bz#1488247 + (make debug logging no-op unless a debug console is active) +- Resolves: bz#1513632 + ([RHEL-ALT 7.5] AAVMF fails to boot after setting BootNext) +- Resolves: bz#1514105 + (backport edk2 commit 6e3287442774 so that PciBusDxe not over-claim resources) + +* Wed Oct 18 2017 Miroslav Rezanina - 20171011-1.git92d07e48907f.el7 +- Rebase to 92d07e48907f [bz#1469787] +- Resolves: bz#1469787 + ((ovmf-rebase-rhel-7.5) Rebase OVMF for RHEL-7.5) +- Resolves: bz#1434740 + (OvmfPkg/PciHotPlugInitDxe: don't reserve IO space when IO support is disabled) +- Resolves: bz#1434747 + ([Q35] code12 error when hotplug x710 device in win2016) +- Resolves: bz#1447027 + (Guest cannot boot with 240 or above vcpus when using ovmf) +- Resolves: bz#1458192 + ([Q35] recognize "usb-storage" devices in XHCI ports) +- Resolves: bz#1468526 + (>1TB RAM support) +- Resolves: bz#1488247 + (provide "OVMF_CODE.secboot.verbose.fd" for log capturing; silence "OVMF_CODE.secboot.fd") +- Resolves: bz#1496170 + (Inconsistent MOR control variables exposed by OVMF, breaks Windows Device Guard) + +* Fri May 12 2017 Miroslav Rezanina - 20170228-5.gitc325e41585e3.el7 +- ovmf-OvmfPkg-EnrollDefaultKeys-update-SignatureOwner-GUID.patch [bz#1443351] +- ovmf-OvmfPkg-EnrollDefaultKeys-expose-CertType-parameter-.patch [bz#1443351] +- ovmf-OvmfPkg-EnrollDefaultKeys-blacklist-empty-file-in-db.patch [bz#1443351] +- ovmf-OvmfPkg-introduce-the-FD_SIZE_IN_KB-macro-build-flag.patch [bz#1443351] +- ovmf-OvmfPkg-OvmfPkg.fdf.inc-extract-VARS_LIVE_SIZE-and-V.patch [bz#1443351] +- ovmf-OvmfPkg-introduce-4MB-flash-image-mainly-for-Windows.patch [bz#1443351] +- ovmf-OvmfPkg-raise-max-variable-size-auth-non-auth-to-33K.patch [bz#1443351] +- ovmf-OvmfPkg-PlatformPei-handle-non-power-of-two-spare-si.patch [bz#1443351] +- ovmf-redhat-update-local-build-instructions-with-D-FD_SIZ.patch [bz#1443351] +- ovmf-redhat-update-OVMF-build-commands-with-D-FD_SIZE_4MB.patch [bz#1443351] +- Resolves: bz#1443351 + ([svvp][ovmf] job "Secure Boot Logo Test" failed with q35&ovmf) + +* Fri Apr 28 2017 Miroslav Rezanina - 20170228-4.gitc325e41585e3.el7 +- ovmf-ShellPkg-Shell-clean-up-bogus-member-types-in-SPLIT_.patch [bz#1442908] +- ovmf-ShellPkg-Shell-eliminate-double-free-in-RunSplitComm.patch [bz#1442908] +- Resolves: bz#1442908 + (Guest hang when running a wrong command in Uefishell) + +* Tue Apr 04 2017 Miroslav Rezanina - 20170228-3.gitc325e41585e3.el7 +- ovmf-ArmVirtPkg-FdtClientDxe-supplement-missing-EFIAPI-ca.patch [bz#1430262] +- ovmf-ArmVirtPkg-ArmVirtPL031FdtClientLib-unconditionally-.patch [bz#1430262] +- ovmf-MdeModulePkg-RamDiskDxe-fix-C-string-literal-catenat.patch [bz#1430262] +- ovmf-EmbeddedPkg-introduce-EDKII-Platform-Has-ACPI-GUID.patch [bz#1430262] +- ovmf-EmbeddedPkg-introduce-PlatformHasAcpiLib.patch [bz#1430262] +- ovmf-EmbeddedPkg-introduce-EDKII-Platform-Has-Device-Tree.patch [bz#1430262] +- ovmf-ArmVirtPkg-add-PlatformHasAcpiDtDxe.patch [bz#1430262] +- ovmf-ArmVirtPkg-enable-AcpiTableDxe-and-EFI_ACPI_TABLE_PR.patch [bz#1430262] +- ovmf-ArmVirtPkg-FdtClientDxe-install-DT-as-sysconfig-tabl.patch [bz#1430262] +- ovmf-ArmVirtPkg-PlatformHasAcpiDtDxe-don-t-expose-DT-if-Q.patch [bz#1430262] +- ovmf-ArmVirtPkg-remove-PURE_ACPI_BOOT_ENABLE-and-PcdPureA.patch [bz#1430262] +- Resolves: bz#1430262 + (AAVMF: forward QEMU's DT to the guest OS only if ACPI payload is unavailable) + +* Mon Mar 27 2017 Miroslav Rezanina - 20170228-2.gitc325e41585e3.el7 +- ovmf-MdeModulePkg-Core-Dxe-downgrade-CodeSegmentCount-is-.patch [bz#1433428] +- Resolves: bz#1433428 + (AAVMF: Fix error message during ARM guest VM installation) + +* Wed Mar 08 2017 Laszlo Ersek - ovmf-20170228-1.gitc325e41585e3.el7 +- Rebase to upstream c325e41585e3 [bz#1416919] +- Resolves: bz#1373812 + (guest boot from network even set 'boot order=1' for virtio disk with OVMF) +- Resolves: bz#1380282 + (Update OVMF to openssl-1.0.2k-hobbled) +- Resolves: bz#1412313 + (select broadcast SMI if available) +- Resolves: bz#1416919 + (Rebase OVMF for RHEL-7.4) +- Resolves: bz#1426330 + (disable libssl in CryptoPkg) + +* Mon Sep 12 2016 Laszlo Ersek - ovmf-20160608b-1.git988715a.el7 +- rework downstream-only commit dde83a75b566 "setup the tree for the secure + boot feature (RHEL only)", excluding patent-encumbered files from the + upstream OpenSSL 1.0.2g tarball [bz#1374710] +- rework downstream-only commit dfc3ca1ee509 "CryptoPkg/OpensslLib: Upgrade + OpenSSL version to 1.0.2h", excluding patent-encumbered files from the + upstream OpenSSL 1.0.2h tarball [bz#1374710] + +* Thu Aug 04 2016 Miroslav Rezanina - OVMF-20160608-3.git988715a.el7 +- ovmf-MdePkg-PCI-Add-missing-PCI-PCIE-definitions.patch [bz#1332408] +- ovmf-ArmPlatformPkg-NorFlashDxe-accept-both-non-secure-an.patch [bz#1353494] +- ovmf-ArmVirtPkg-ArmVirtQemu-switch-secure-boot-build-to-N.patch [bz#1353494] +- ovmf-ArmPlatformPkg-NorFlashAuthenticatedDxe-remove-this-.patch [bz#1353494] +- ovmf-ArmVirtPkg-add-FDF-definition-for-empty-varstore.patch [bz#1353494] +- ovmf-redhat-package-the-varstore-template-produced-by-the.patch [bz#1353494] +- ovmf-ArmVirtPkg-Re-add-the-Driver-Health-Manager.patch [bz#1353494] +- ovmf-ArmVirtPkg-HighMemDxe-allow-patchable-PCD-for-PcdSys.patch [bz#1353494] +- ovmf-ArmVirtPkg-ArmVirtQemuKernel-make-ACPI-support-AARCH.patch [bz#1353494] +- ovmf-ArmVirtPkg-align-ArmVirtQemuKernel-with-ArmVirtQemu.patch [bz#1353494] +- ovmf-ArmVirtPkg-ArmVirtQemu-factor-out-shared-FV.FvMain-d.patch [bz#1353494] +- ovmf-ArmVirtPkg-factor-out-Rules-FDF-section.patch [bz#1353494] +- ovmf-ArmVirtPkg-add-name-GUIDs-to-FvMain-instances.patch [bz#1353494] +- ovmf-OvmfPkg-add-a-Name-GUID-to-each-Firmware-Volume.patch [bz#1353494] +- ovmf-OvmfPkg-PlatformBootManagerLib-remove-stale-FvFile-b.patch [bz#1353494] +- ovmf-MdePkg-IndustryStandard-introduce-EFI_PCI_CAPABILITY.patch [bz#1332408] +- ovmf-MdeModulePkg-PciBusDxe-look-for-the-right-capability.patch [bz#1332408] +- ovmf-MdeModulePkg-PciBusDxe-recognize-hotplug-capable-PCI.patch [bz#1332408] +- ovmf-OvmfPkg-add-PciHotPlugInitDxe.patch [bz#1332408] +- ovmf-ArmPkg-ArmGicLib-manage-GICv3-SPI-state-at-the-distr.patch [bz#1356655] +- ovmf-ArmVirtPkg-PlatformBootManagerLib-remove-stale-FvFil.patch [bz#1353494] +- ovmf-OvmfPkg-EnrollDefaultKeys-assign-Status-before-readi.patch [bz#1356913] +- ovmf-OvmfPkg-EnrollDefaultKeys-silence-VS2015x86-warning-.patch [bz#1356913] +- ovmf-CryptoPkg-update-openssl-to-ignore-RVCT-3079.patch [bz#1356184] +- ovmf-CryptoPkg-Fix-typos-in-comments.patch [bz#1356184] +- ovmf-CryptoPkg-BaseCryptLib-Avoid-passing-NULL-ptr-to-fun.patch [bz#1356184] +- ovmf-CryptoPkg-BaseCryptLib-Init-the-content-of-struct-Ce.patch [bz#1356184] +- ovmf-CryptoPkg-OpensslLib-Upgrade-OpenSSL-version-to-1.0..patch [bz#1356184] +- Resolves: bz#1332408 + (Q35 machine can not hot-plug scsi controller under switch) +- Resolves: bz#1353494 + ([OVMF] "EFI Internal Shell" should be removed from "Boot Manager") +- Resolves: bz#1356184 + (refresh embedded OpenSSL to 1.0.2h) +- Resolves: bz#1356655 + (AAVMF: stop accessing unmapped gicv3 registers) +- Resolves: bz#1356913 + (fix use-without-initialization in EnrollDefaultKeys.efi) + +* Tue Jul 12 2016 Miroslav Rezanina - OVMF-20160608-2.git988715a.el7 +- ovmf-ArmPkg-ArmGicV3Dxe-configure-all-interrupts-as-non-s.patch [bz#1349407] +- ovmf-ArmVirtPkg-PlatformBootManagerLib-Postpone-the-shell.patch [bz#1353689] +- Resolves: bz#1349407 + (AArch64: backport fix to run over gicv3 emulation) +- Resolves: bz#1353689 + (AAVMF: Drops to shell with uninitialized NVRAM file) + +* Thu Jun 9 2016 Laszlo Ersek - ovmf-20160608-1.git988715a.el7 +- Resolves: bz#1341733 + (prevent SMM stack overflow in OVMF while enrolling certificates in "db") +- Resolves: bz#1257882 + (FEAT: support to boot from virtio 1.0 modern devices) +- Resolves: bz#1333238 + (Q35 machine can not boot up successfully with more than 3 virtio-scsi + storage controller under switch) +- Resolves: bz#1330955 + (VM can not be booted up from hard disk successfully when with a passthrough + USB stick) + +* Thu May 19 2016 Laszlo Ersek - ovmf-20160419-2.git90bb4c5.el7 +- Submit scratch builds from the exploded tree again to + supp-rhel-7.3-candidate, despite FatPkg being OSS at this point; see + bz#1329559. + +* Wed Apr 20 2016 Laszlo Ersek - ovmf-20160419-1.git90bb4c5.el7 +- FatPkg is under the 2-clause BSDL now; "ovmf" has become OSS +- upgrade to openssl-1.0.2g +- Resolves: bz#1323363 + (remove "-D SECURE_BOOT_ENABLE" from AAVMF) +- Resolves: bz#1257882 + (FEAT: support to boot from virtio 1.0 modern devices) +- Resolves: bz#1308678 + (clearly separate SB-less, SMM-less OVMF binary from SB+SMM OVMF binary) + +* Fri Feb 19 2016 Miroslav Rezanina - OVMF-20160202-2.gitd7c0dfa.el7 +- ovmf-restore-TianoCore-splash-logo-without-OpenSSL-advert.patch [bz#1308678] +- ovmf-OvmfPkg-ArmVirtPkg-show-OpenSSL-less-logo-without-Se.patch [bz#1308678] +- ovmf-OvmfPkg-simplify-VARIABLE_STORE_HEADER-generation.patch [bz#1308678] +- ovmf-redhat-bring-back-OVMF_CODE.fd-but-without-SB-and-wi.patch [bz#1308678] +- ovmf-redhat-rename-OVMF_CODE.smm.fd-to-OVMF_CODE.secboot..patch [bz#1308678] + +* Tue Feb 2 2016 Laszlo Ersek - ovmf-20160202-1.gitd7c0dfa.el7 +- rebase to upstream d7c0dfa +- update OpenSSL to 1.0.2e (upstream) +- update FatPkg to SVN r97 (upstream) +- drive NVMe devices (upstream) +- resize xterm on serial console mode change, when requested with + -fw_cfg name=opt/(ovmf|aavmf)/PcdResizeXterm,string=y + (downstream) +- Resolves: bz#1259395 + (revert / roll back AAVMF fix for BZ 1188054) +- Resolves: bz#1202819 + (OVMF: secure boot limitations) +- Resolves: bz#1182495 + (OVMF rejects iPXE oprom when Secure Boot is enabled) + +* Thu Nov 5 2015 Laszlo Ersek - ovmf-20151104-1.gitb9ffeab.el7 +- rebase to upstream b9ffeab +- Resolves: bz#1207554 + ([AAVMF] AArch64: populate SMBIOS) +- Resolves: bz#1270279 + (AAVMF: output improvements) + +* Thu Jun 25 2015 Miroslav Rezanina - OVMF-20150414-2.gitc9e5618.el7 +- ovmf-OvmfPkg-PlatformPei-set-SMBIOS-entry-point-version-d.patch [bz#1232876] +- Resolves: bz#1232876 + (OVMF should install a version 2.8 SMBIOS entry point) + +* Sat Apr 18 2015 Laszlo Ersek - 20150414-1.gitc9e5618.el7 +- rebase from upstream 9ece15a to c9e5618 +- adapt .gitignore files +- update to openssl-0.9.8zf +- create Logo-OpenSSL.bmp rather than modifying Logo.bmp in-place +- update to FatPkg SVN r93 (git 8ff136aa) +- drop the following downstream-only patches (obviated by upstream + counterparts): + "tools_def.template: use forward slash with --add-gnu-debuglink (RHEL only)" + "tools_def.template: take GCC48 prefixes from environment (RHEL only)" + "OvmfPkg: set video resolution of text setup to 640x480 (RHEL only)" + "OvmfPkg: resolve OrderedCollectionLib with base red-black tree instance" + "OvmfPkg: AcpiPlatformDxe: actualize QemuLoader.h comments" + "OvmfPkg: AcpiPlatformDxe: remove current ACPI table loader" + "OvmfPkg: AcpiPlatformDxe: implement QEMU's full ACPI table loader interface" + "OvmfPkg: QemuVideoDxe: fix querying of QXL's drawable buffer size" + "OvmfPkg: disable stale fork of SecureBootConfigDxe" + "OvmfPkg: SecureBootConfigDxe: remove stale fork" + "Try to read key strike even when ..." + "OvmfPkg: BDS: remove dead call to PlatformBdsEnterFrontPage()" + "OvmfPkg: BDS: drop useless return statement" + "OvmfPkg: BDS: don't overwrite the BDS Front Page timeout" + "OvmfPkg: BDS: optimize second argument in PlatformBdsEnterFrontPage() call" + 'OvmfPkg: BDS: drop superfluous "connect first boot option" logic' + "OvmfPkg: BDS: drop custom boot timeout, revert to IntelFrameworkModulePkg's" + "Add comments to clarify mPubKeyStore buffer MemCopy. ..." + "MdeModulePkg/SecurityPkg Variable: Add boundary check..." + "OvmfPkg: AcpiPlatformDxe: make dependency on PCI enumeration explicit" + "MdePkg: UefiScsiLib: do not encode LUN in CDB for READ and WRITE" + "MdePkg: UefiScsiLib: do not encode LUN in CDB for other SCSI commands" +- merge downstream AAVMF patch "adapt packaging to Arm64", which forces us to + rename the main package from "OVMF" to "ovmf" +- drop the following ARM BDS specific tweaks (we'll only build the Intel BDS): + "ArmPlatformPkg/Bds: generate ESP Image boot option if user pref is unset + (Acadia)" + "ArmPlatformPkg/Bds: check for other defaults too if user pref is unset + (Acadia)" + "ArmPlatformPkg/ArmVirtualizationPkg: auto-detect boot path (Acadia)" + "ArmPlatformPkg/Bds: initialize ConIn/ConOut/ErrOut before connecting + terminals" + "ArmPlatformPkg/Bds: let FindCandidate() search all filesystems" + "ArmPlatformPkg/Bds: FindCandidateOnHandle(): log full device path" + "ArmPlatformPkg/Bds: fall back to Boot Menu when no default option was found" + "ArmPlatformPkg/Bds: always connect drivers before looking at boot options" +- drop patch "ArmPlatformPkg/ArmVirtualizationPkg: enable DEBUG_VERBOSE (Acadia + only)", obsoleted by fixed bug 1197141 +- tweak patch "write up build instructions (for interactive, local development) + (RHELSA)". The defaults in "BaseTools/Conf/target.template", ie. + ACTIVE_PLATFORM and TARGET_ARCH, are set for OVMF / X64. The AAVMF build + instructions now spell out the necessary override options (-p and -a, + respectively). +- extend patch "build FAT driver from source (RHELSA)" to the Xen build as well + (only for consistency; we don't build for Xen). +- drop the following downstream-only AAVMF patches, due to the 77d5dac -> + c9e5618 AAVMF rebase & join: + "redhat/process-rh-specific.sh: fix check for hunk-less filtered patches" + "redhat/process-rh-specific.sh: suppress missing files in final 'rm'" + "ArmVirtualizationQemu: build UEFI shell from source (Acadia only)" + "MdePkg: UefiScsiLib: do not encode LUN in CDB for READ and WRITE" + "MdePkg: UefiScsiLib: do not encode LUN in CDB for other SCSI commands" + "ArmVirtualizationPkg: work around cache incoherence on KVM affecting DTB" + "Changed build target to supp-rhel-7.1-candidate" + "ArmVirtualizationPkg: VirtFdtDxe: forward FwCfg addresses from DTB to PCDs" + "ArmVirtualizationPkg: introduce QemuFwCfgLib instance for DXE drivers" + "ArmVirtualizationPkg: clone PlatformIntelBdsLib from ArmPlatformPkg" + "ArmVirtualizationPkg: PlatformIntelBdsLib: add basic policy" + "OvmfPkg: extract QemuBootOrderLib" + "OvmfPkg: QemuBootOrderLib: featurize PCI-like device path translation" + "OvmfPkg: introduce VIRTIO_MMIO_TRANSPORT_GUID" + "ArmVirtualizationPkg: VirtFdtDxe: use dedicated VIRTIO_MMIO_TRANSPORT_GUID" + "OvmfPkg: QemuBootOrderLib: widen ParseUnitAddressHexList() to UINT64" + "OvmfPkg: QemuBootOrderLib: OFW-to-UEFI translation for virtio-mmio" + "ArmVirtualizationPkg: PlatformIntelBdsLib: adhere to QEMU's boot order" + "ArmVirtualizationPkg: identify "new shell" as builtin shell for Intel BDS" + "ArmVirtualizationPkg: Intel BDS: load EFI-stubbed Linux kernel from fw_cfg" + 'Revert "ArmVirtualizationPkg: work around cache incoherence on KVM affecting + DTB"' + "OvmfPkg: QemuBootOrderLib: expose QEMU's "-boot menu=on[, splash-time=N]"" + "OvmfPkg: PlatformBdsLib: get front page timeout from QEMU" + "ArmVirtualizationPkg: PlatformIntelBdsLib: get front page timeout from QEMU" + "ArmPkg: ArmArchTimerLib: clean up comments" + "ArmPkg: ArmArchTimerLib: use edk2-conformant (UINT64 * UINT32) / UINT32" + "ArmPkg: ArmArchTimerLib: conditionally rebase to actual timer frequency" + "ArmVirtualizationQemu: ask the hardware for the timer frequency" + "ArmPkg: DebugPeCoffExtraActionLib: debugger commands are not errors" + "ArmPlatformPkg: PEIM startup is not an error" + "ArmVirtualizationPkg: PlatformIntelBdsLib: lack of QEMU kernel is no error" + "ArmVirtualizationPkg: expose debug message bitmask on build command line" +- tweak patch "rebase to upstream 77d5dac (Acadia only)": update spec changelog + only +- tweak patch "spec: build AAVMF with the Intel BDS driver (RHELSA only)": + apply "-D INTEL_BDS" to manual build instructions in redhat/README too +- tweak patch "spec: build and install verbose and silent (default) AAVMF + binaries": apply DEBUG_PRINT_ERROR_LEVEL setting to interactive build + instructions in redhat/README too +- install OVMF whitepaper as part of the OVMF build's documentation +- Resolves: bz#1211337 + (merge AAVMF into OVMF) +- Resolves: bz#1206523 + ([AAVMF] fix missing cache maintenance) + +* Fri Mar 06 2015 Miroslav Rezanina - AAVMF-20141113-5.git77d5dac.el7_1 +- aavmf-ArmPkg-DebugPeCoffExtraActionLib-debugger-commands-a.patch [bz#1197141] +- aavmf-ArmPlatformPkg-PEIM-startup-is-not-an-error.patch [bz#1197141] +- aavmf-ArmVirtualizationPkg-PlatformIntelBdsLib-lack-of-QEM.patch [bz#1197141] +- aavmf-ArmVirtualizationPkg-expose-debug-message-bitmask-on.patch [bz#1197141] +- aavmf-spec-build-and-install-verbose-and-silent-default-AA.patch [bz#1197141] +- Resolves: bz#1197141 + (create silent & verbose builds) + +* Tue Feb 10 2015 Miroslav Rezanina - AAVMF-20141113-4.git77d5dac.el7 +- aavmf-ArmPkg-ArmArchTimerLib-clean-up-comments.patch [bz#1188247] +- aavmf-ArmPkg-ArmArchTimerLib-use-edk2-conformant-UINT64-UI.patch [bz#1188247] +- aavmf-ArmPkg-ArmArchTimerLib-conditionally-rebase-to-actua.patch [bz#1188247] +- aavmf-ArmVirtualizationQemu-ask-the-hardware-for-the-timer.patch [bz#1188247] +- aavmf-ArmPkg-TimerDxe-smack-down-spurious-timer-interrupt-.patch [bz#1188054] +- Resolves: bz#1188054 + (guest reboot (asked from within AAVMF) regressed in 3.19.0-0.rc5.58.aa7a host kernel) +- Resolves: bz#1188247 + (backport "fix gBS->Stall()" series) + +* Mon Jan 19 2015 Miroslav Rezanina - AAVMF-20141113-3.git77d5dac.el7 +- aavmf-OvmfPkg-QemuBootOrderLib-expose-QEMU-s-boot-menu-on-.patch [bz#1172756] +- aavmf-OvmfPkg-PlatformBdsLib-get-front-page-timeout-from-Q.patch [bz#1172756] +- aavmf-ArmVirtualizationPkg-PlatformIntelBdsLib-get-front-p.patch [bz#1172756] +- Resolves: bz#1172756 + ([RFE]Expose boot-menu shortcut to domain via AAVMF) + +* Wed Jan 14 2015 Miroslav Rezanina - AAVMF-20141113-2.git77d5dac.el7 +- aavmf-ArmVirtualizationPkg-VirtFdtDxe-forward-FwCfg-addres.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-introduce-QemuFwCfgLib-instance.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-clone-PlatformIntelBdsLib-from-.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-PlatformIntelBdsLib-add-basic-p.patch [bz#1172749] +- aavmf-OvmfPkg-extract-QemuBootOrderLib.patch [bz#1172749] +- aavmf-OvmfPkg-QemuBootOrderLib-featurize-PCI-like-device-p.patch [bz#1172749] +- aavmf-OvmfPkg-introduce-VIRTIO_MMIO_TRANSPORT_GUID.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-VirtFdtDxe-use-dedicated-VIRTIO.patch [bz#1172749] +- aavmf-OvmfPkg-QemuBootOrderLib-widen-ParseUnitAddressHexLi.patch [bz#1172749] +- aavmf-OvmfPkg-QemuBootOrderLib-OFW-to-UEFI-translation-for.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-PlatformIntelBdsLib-adhere-to-Q.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-identify-new-shell-as-builtin-s.patch [bz#1172749] +- aavmf-ArmVirtualizationPkg-Intel-BDS-load-EFI-stubbed-Linu.patch [bz#1172749] +- aavmf-spec-build-AAVMF-with-the-Intel-BDS-driver-RHELSA-on.patch [bz#1172749] +- aavmf-Revert-ArmVirtualizationPkg-work-around-cache-incohe.patch [bz#1172910] +- Resolves: bz#1172749 + (implement fw_cfg, boot order handling, and -kernel booting in ArmVirtualizationQemu) +- Resolves: bz#1172910 + (revert Acadia-only workaround (commit df7bca4e) once Acadia host kernel (KVM) is fixed) + +* Fri Dec 05 2014 Miroslav Rezanina - OVMF-20140822-7.git9ece15a.el7 +- ovmf-MdePkg-UefiScsiLib-do-not-encode-LUN-in-CDB-for-READ.patch [bz#1166971] +- ovmf-MdePkg-UefiScsiLib-do-not-encode-LUN-in-CDB-for-othe.patch [bz#1166971] +- Resolves: bz#1166971 + (virtio-scsi disks and cd-roms with nonzero LUN are rejected with errors) + +* Tue Nov 25 2014 Miroslav Rezanina - OVMF-20140822-6.git9ece15a.el7 +- ovmf-OvmfPkg-AcpiPlatformDxe-make-dependency-on-PCI-enume.patch [bz#1166027] +- Resolves: bz#1166027 + (backport "OvmfPkg: AcpiPlatformDxe: make dependency on PCI enumeration explicit") + +* Tue Nov 18 2014 Miroslav Rezanina - OVMF-20140822-4.git9ece15a.el7 +- ovmf-Add-comments-to-clarify-mPubKeyStore-buffer-MemCopy.patch [bz#1162314] +- ovmf-MdeModulePkg-SecurityPkg-Variable-Add-boundary-check.patch [bz#1162314] +- Resolves: bz#1162314 + (EMBARGOED OVMF: uefi: INTEL-TA-201410-001 && INTEL-TA-201410-002 [rhel-7.1]) + +* Thu Nov 13 2014 Laszlo Ersek - AAVMF-20141113-1.git77d5dac +- rebased to upstream 77d5dac + +- patch "ArmVirtualizationPkg: FdtPL011SerialPortLib: support UEFI_APPLICATION" + is now upstream (SVN r16219, git edb5073) + +* Thu Nov 13 2014 Miroslav Rezanina - OVMF-20140822-3.git9ece15a.el7 +- ovmf-Revert-OvmfPkg-set-video-resolution-of-text-setup-to.patch [bz#1153927] +- ovmf-Try-to-read-key-strike-even-when-the-TimeOuts-value-.patch [bz#1153927] +- ovmf-OvmfPkg-BDS-remove-dead-call-to-PlatformBdsEnterFron.patch [bz#1153927] +- ovmf-OvmfPkg-BDS-drop-useless-return-statement.patch [bz#1153927] +- ovmf-OvmfPkg-BDS-don-t-overwrite-the-BDS-Front-Page-timeo.patch [bz#1153927] +- ovmf-OvmfPkg-BDS-optimize-second-argument-in-PlatformBdsE.patch [bz#1153927] +- ovmf-OvmfPkg-BDS-drop-superfluous-connect-first-boot-opti.patch [bz#1153927] +- ovmf-OvmfPkg-BDS-drop-custom-boot-timeout-revert-to-Intel.patch [bz#1153927] +- ovmf-OvmfPkg-set-video-resolution-of-text-setup-to-640x48.patch [bz#1153927] +- Resolves: bz#1153927 + (set NEXTBOOT to uefi setting failed from Windows Recovery console) + +* Tue Nov 11 2014 Miroslav Rezanina - OVMF-20140822-2.git9ece15a +- ovmf-redhat-process-rh-specific.sh-suppress-missing-files.patch [bz#1145784] +- ovmf-Revert-RH-only-OvmfPkg-QemuVideoDxe-fix-querying-of-.patch [bz#1145784] +- ovmf-Revert-RH-only-OvmfPkg-AcpiPlatformDxe-implement-QEM.patch [bz#1145784] +- ovmf-Revert-RH-only-OvmfPkg-AcpiPlatformDxe-remove-curren.patch [bz#1145784] +- ovmf-Revert-RH-only-OvmfPkg-AcpiPlatformDxe-actualize-Qem.patch [bz#1145784] +- ovmf-Revert-RH-only-OvmfPkg-resolve-OrderedCollectionLib-.patch [bz#1145784] +- ovmf-OvmfPkg-QemuVideoDxe-work-around-misreported-QXL-fra.patch [bz#1145784] +- ovmf-OvmfPkg-resolve-OrderedCollectionLib-with-base-red-b.patch [bz#1145784] +- ovmf-OvmfPkg-AcpiPlatformDxe-actualize-QemuLoader.h-comme.patch [bz#1145784] +- ovmf-OvmfPkg-AcpiPlatformDxe-remove-current-ACPI-table-lo.patch [bz#1145784] +- ovmf-OvmfPkg-AcpiPlatformDxe-implement-QEMU-s-full-ACPI-t.patch [bz#1145784] +- ovmf-spec-build-small-bootable-ISO-with-standalone-UEFI-s.patch [bz#1147592] +- ovmf-OvmfPkg-allow-exclusion-of-the-shell-from-the-firmwa.patch [bz#1147592] +- ovmf-spec-exclude-the-UEFI-shell-from-the-SecureBoot-enab.patch [bz#1147592] +- ovmf-OvmfPkg-EnrollDefaultKeys-application-for-enrolling-.patch [bz#1148296] +- ovmf-spec-package-EnrollDefaultKeys.efi-on-UefiShell.iso-.patch [bz#1148296] +- ovmf-OvmfPkg-disable-stale-fork-of-SecureBootConfigDxe.patch [bz#1148294] +- ovmf-OvmfPkg-SecureBootConfigDxe-remove-stale-fork.patch [bz#1148294] +- Resolves: bz#1145784 + (OVMF sync with QXL and ACPI patches up to edk2 7a9612ce) +- Resolves: bz#1147592 + (the binary RPM should include a small ISO file with a directly bootable UEFI shell binary) +- Resolves: bz#1148294 + (drop OvmfPkg's stale fork of SecureBootConfigDxe) +- Resolves: bz#1148296 + (provide a non-interactive way to auto-enroll important SecureBoot certificates) + +* Wed Oct 15 2014 Laszlo Ersek - AAVMF-20141015-1.gitc373687 +- ported packaging to aarch64 / AAVMF + +* Fri Aug 22 2014 Laszlo Ersek - 20140822-1.git9ece15a.el7 +- rebase from upstream 3facc08 to 9ece15a +- update to openssl-0.9.8zb +- update to FatPkg SVN r86 (git 2355ea2c) +- the following patches of Paolo Bonzini have been merged in upstream; drop the + downstream-only copies: + 7bc1421 edksetup.sh: Look for BuildEnv under EDK_TOOLS_PATH + d549344 edksetup.sh: Ensure that WORKSPACE points to the top of an edk2 + checkout + 1c023eb BuildEnv: remove useless check before setting $WORKSPACE +- include the following patches that have been pending review on the upstream + list for a long time: + [PATCH 0/4] OvmfPkg: complete client for QEMU's ACPI loader interface + http://thread.gmane.org/gmane.comp.bios.tianocore.devel/8369 + [PATCH] OvmfPkg: QemuVideoDxe: fix querying of QXL's drawable buffer size + http://thread.gmane.org/gmane.comp.bios.tianocore.devel/8515 +- nasm is a build-time dependency now because upstream BuildTools has started + to call it directly + +* Wed Jul 23 2014 Laszlo Ersek - 20140723-1.git3facc08.el7 +- rebase from upstream a618eaa to 3facc08 +- update to openssl-0.9.8za +- drop downstream-only split varstore patch, rely on upstream's + +* Tue Jun 24 2014 Miroslav Rezanina - 20140619-1.gita618eaa.el7 +- Initial version diff --git a/hobble-openssl b/hobble-openssl deleted file mode 100755 index 9a23ca6..0000000 --- a/hobble-openssl +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -# Quit out if anything fails. -set -e - -# Clean out patent-or-otherwise-encumbered code. -# MDC-2: 4,908,861 13/03/2007 - expired, we do not remove it but do not enable it anyway -# IDEA: 5,214,703 07/01/2012 - expired, we do not remove it anymore -# RC5: 5,724,428 01/11/2015 - expired, we do not remove it anymore -# EC: ????????? ??/??/2020 -# SRP: ????????? ??/??/2017 - expired, we do not remove it anymore - -# Remove assembler portions of IDEA, MDC2, and RC5. -# (find crypto/rc5/asm -type f | xargs -r rm -fv) - -for c in `find crypto/bn -name "*gf2m.c"`; do - echo Destroying $c - > $c -done - -for c in `find crypto/ec -name "ec2*.c" -o -name "ec_curve.c"`; do - echo Destroying $c - > $c -done - -for c in `find test -name "ectest.c"`; do - echo Destroying $c - > $c -done - -for h in `find crypto ssl apps test -name "*.h"` ; do - echo Removing EC2M references from $h - cat $h | \ - awk 'BEGIN {ech=1;} \ - /^#[ \t]*ifndef.*NO_EC2M/ {ech--; next;} \ - /^#[ \t]*if/ {if(ech < 1) ech--;} \ - {if(ech>0) {;print $0};} \ - /^#[ \t]*endif/ {if(ech < 1) ech++;}' > $h.hobbled && \ - mv $h.hobbled $h -done diff --git a/openssl-patch-to-tarball.sh b/openssl-patch-to-tarball.sh deleted file mode 100644 index 5b327ca..0000000 --- a/openssl-patch-to-tarball.sh +++ /dev/null @@ -1,63 +0,0 @@ -#! /bin/sh - -: << \EOF - For importing the hobbled OpenSSL tarball from Fedora, the following - steps are necessary. Note that both the "sources" file format and the - pkgs.fedoraproject.org directory structure have changed, accommodating - SHA512 checksums. - - # in a separate directory - fedpkg clone -a openssl - cd openssl - fedpkg switch-branch master - gitk -- sources - - # the commit that added the 1.1.0h hobbled tarball is 6eb8f620273 - # subject "update to upstream version 1.1.0h" - git checkout 6eb8f620273 - - # fetch the hobbled tarball and verify the checksum - ( - set -e - while read HASH_TYPE FN EQ HASH; do - # remove leading and trailing parens - FN="${FN#(*}" - FN="${FN%*)}" - wget \ - http://pkgs.fedoraproject.org/repo/pkgs/openssl/$FN/sha512/$HASH/$FN - done openssl-${openssl_version}-hobbled.tar.xz - cd tianocore-openssl-${openssl_version} - git init . - git config core.whitespace cr-at-eol - git config am.keepcr true - git am - git archive --format=tar --prefix=tianocore-edk2-${edk2_githash}/ \ - HEAD CryptoPkg/Library/OpensslLib/ | \ - xz -9ev >&3) < $1 -rm -rf tianocore-openssl-${openssl_version} diff --git a/ovmf-vars-generator b/ovmf-vars-generator new file mode 100755 index 0000000..111e438 --- /dev/null +++ b/ovmf-vars-generator @@ -0,0 +1,295 @@ +#!/bin/python3 +# Copyright (C) 2017 Red Hat +# Authors: +# - Patrick Uiterwijk +# - Kashyap Chamarthy +# +# Licensed under MIT License, for full text see LICENSE +# +# Purpose: Launch a QEMU guest and enroll ithe UEFI keys into an OVMF +# variables ("VARS") file. Then boot a Linux kernel with QEMU. +# Finally, perform a check to verify if Secure Boot +# is enabled. + +from __future__ import print_function + +import argparse +import os +import logging +import tempfile +import shutil +import string +import subprocess + + +def strip_special(line): + return ''.join([c for c in str(line) if c in string.printable]) + + +def generate_qemu_cmd(args, readonly, *extra_args): + if args.disable_smm: + machinetype = 'pc' + else: + machinetype = 'q35,smm=on' + machinetype += ',accel=%s' % ('kvm' if args.enable_kvm else 'tcg') + + if args.oem_string is None: + oemstrings = [] + else: + oemstring_values = [ + ",value=" + s.replace(",", ",,") for s in args.oem_string ] + oemstrings = [ + '-smbios', + "type=11" + ''.join(oemstring_values) ] + + return [ + args.qemu_binary, + '-machine', machinetype, + '-display', 'none', + '-no-user-config', + '-nodefaults', + '-m', '768', + '-smp', '2,sockets=2,cores=1,threads=1', + '-chardev', 'pty,id=charserial1', + '-device', 'isa-serial,chardev=charserial1,id=serial1', + '-global', 'driver=cfi.pflash01,property=secure,value=%s' % ( + 'off' if args.disable_smm else 'on'), + '-drive', + 'file=%s,if=pflash,format=raw,unit=0,readonly=on' % ( + args.ovmf_binary), + '-drive', + 'file=%s,if=pflash,format=raw,unit=1,readonly=%s' % ( + args.out_temp, 'on' if readonly else 'off'), + '-serial', 'stdio'] + oemstrings + list(extra_args) + + +def download(url, target, suffix, no_download): + istemp = False + if target and os.path.exists(target): + return target, istemp + if not target: + temped = tempfile.mkstemp(prefix='qosb.', suffix='.%s' % suffix) + os.close(temped[0]) + target = temped[1] + istemp = True + if no_download: + raise Exception('%s did not exist, but downloading was disabled' % + target) + import requests + logging.debug('Downloading %s to %s', url, target) + r = requests.get(url, stream=True) + with open(target, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: + f.write(chunk) + return target, istemp + + +def enroll_keys(args): + shutil.copy(args.ovmf_template_vars, args.out_temp) + + logging.info('Starting enrollment') + + cmd = generate_qemu_cmd( + args, + False, + '-drive', + 'file=%s,format=raw,if=none,media=cdrom,id=drive-cd1,' + 'readonly=on' % args.uefi_shell_iso, + '-device', + 'ide-cd,drive=drive-cd1,id=cd1,' + 'bootindex=1') + p = subprocess.Popen(cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + logging.info('Performing enrollment') + # Wait until the UEFI shell starts (first line is printed) + read = p.stdout.readline() + if b'char device redirected' in read: + read = p.stdout.readline() + # Skip passed QEMU warnings, like the following one we see in Ubuntu: + # qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5] + while b'qemu-system-x86_64: warning:' in read: + read = p.stdout.readline() + if args.print_output: + print(strip_special(read), end='') + print() + # Send the escape char to enter the UEFI shell early + p.stdin.write(b'\x1b') + p.stdin.flush() + # And then run the following three commands from the UEFI shell: + # change into the first file system device; install the default + # keys and certificates, and reboot + p.stdin.write(b'fs0:\r\n') + p.stdin.write(b'EnrollDefaultKeys.efi\r\n') + p.stdin.write(b'reset -s\r\n') + p.stdin.flush() + while True: + read = p.stdout.readline() + if args.print_output: + print('OUT: %s' % strip_special(read), end='') + print() + if b'info: success' in read: + break + p.wait() + if args.print_output: + print(strip_special(p.stdout.read()), end='') + logging.info('Finished enrollment') + + +def test_keys(args): + logging.info('Grabbing test kernel') + kernel, kerneltemp = download(args.kernel_url, args.kernel_path, + 'kernel', args.no_download) + + logging.info('Starting verification') + try: + cmd = generate_qemu_cmd( + args, + True, + '-append', 'console=tty0 console=ttyS0,115200n8', + '-kernel', kernel) + p = subprocess.Popen(cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + logging.info('Performing verification') + while True: + read = p.stdout.readline() + if args.print_output: + print('OUT: %s' % strip_special(read), end='') + print() + if b'Secure boot disabled' in read: + raise Exception('Secure Boot was disabled') + elif b'Secure boot enabled' in read: + logging.info('Confirmed: Secure Boot is enabled') + break + elif b'Kernel is locked down from EFI secure boot' in read: + logging.info('Confirmed: Secure Boot is enabled') + break + p.kill() + if args.print_output: + print(strip_special(p.stdout.read()), end='') + logging.info('Finished verification') + finally: + if kerneltemp: + os.remove(kernel) + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('output', help='Filename for output vars file') + parser.add_argument('--out-temp', help=argparse.SUPPRESS) + parser.add_argument('--force', help='Overwrite existing output file', + action='store_true') + parser.add_argument('--print-output', help='Print the QEMU guest output', + action='store_true') + parser.add_argument('--verbose', '-v', help='Increase verbosity', + action='count') + parser.add_argument('--quiet', '-q', help='Decrease verbosity', + action='count') + parser.add_argument('--qemu-binary', help='QEMU binary path', + default='/usr/bin/qemu-system-x86_64') + parser.add_argument('--enable-kvm', help='Enable KVM acceleration', + action='store_true') + parser.add_argument('--ovmf-binary', help='OVMF secureboot code file', + default='/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd') + parser.add_argument('--ovmf-template-vars', help='OVMF empty vars file', + default='/usr/share/edk2/ovmf/OVMF_VARS.fd') + parser.add_argument('--uefi-shell-iso', help='Path to uefi shell iso', + default='/usr/share/edk2/ovmf/UefiShell.iso') + parser.add_argument('--skip-enrollment', + help='Skip enrollment, only test', action='store_true') + parser.add_argument('--skip-testing', + help='Skip testing generated "VARS" file', + action='store_true') + parser.add_argument('--kernel-path', + help='Specify a consistent path for kernel') + parser.add_argument('--no-download', action='store_true', + help='Never download a kernel') + parser.add_argument('--fedora-version', + help='Fedora version to get kernel for checking', + default='27') + parser.add_argument('--kernel-url', help='Kernel URL', + default='https://download.fedoraproject.org/pub/fedora' + '/linux/releases/%(version)s/Everything/x86_64' + '/os/images/pxeboot/vmlinuz') + parser.add_argument('--disable-smm', + help=('Don\'t restrict varstore pflash writes to ' + 'guest code that executes in SMM. Use this ' + 'option only if your OVMF binary doesn\'t have ' + 'the edk2 SMM driver stack built into it ' + '(possibly because your QEMU binary lacks SMM ' + 'emulation). Note that without restricting ' + 'varstore pflash writes to guest code that ' + 'executes in SMM, a malicious guest kernel, ' + 'used for testing, could undermine Secure ' + 'Boot.'), + action='store_true') + parser.add_argument('--oem-string', + help=('Pass the argument to the guest as a string in ' + 'the SMBIOS Type 11 (OEM Strings) table. ' + 'Multiple occurrences of this option are ' + 'collected into a single SMBIOS Type 11 table. ' + 'A pure ASCII string argument is strongly ' + 'suggested.'), + action='append') + args = parser.parse_args() + args.kernel_url = args.kernel_url % {'version': args.fedora_version} + + validate_args(args) + return args + + +def validate_args(args): + if (os.path.exists(args.output) + and not args.force + and not args.skip_enrollment): + raise Exception('%s already exists' % args.output) + + if args.skip_enrollment and not os.path.exists(args.output): + raise Exception('%s does not yet exist' % args.output) + + verbosity = (args.verbose or 1) - (args.quiet or 0) + if verbosity >= 2: + logging.basicConfig(level=logging.DEBUG) + elif verbosity == 1: + logging.basicConfig(level=logging.INFO) + elif verbosity < 0: + logging.basicConfig(level=logging.ERROR) + else: + logging.basicConfig(level=logging.WARN) + + if args.skip_enrollment: + args.out_temp = args.output + else: + temped = tempfile.mkstemp(prefix='qosb.', suffix='.vars') + os.close(temped[0]) + args.out_temp = temped[1] + logging.debug('Temp output: %s', args.out_temp) + + +def move_to_dest(args): + shutil.copy(args.out_temp, args.output) + os.remove(args.out_temp) + + +def main(): + args = parse_args() + if not args.skip_enrollment: + enroll_keys(args) + if not args.skip_testing: + test_keys(args) + if not args.skip_enrollment: + move_to_dest(args) + if args.skip_testing: + logging.info('Created %s' % args.output) + else: + logging.info('Created and verified %s' % args.output) + else: + logging.info('Verified %s', args.output) + + +if __name__ == '__main__': + main() diff --git a/sources b/sources index 60fe829..f3da4b4 100644 --- a/sources +++ b/sources @@ -1,4 +1,2 @@ -SHA512 (softfloat-20180726-gitb64af41.tar.xz) = f079debd1bfcc0fe64329a8947b0689ef49246793edcdd28a2879f6550c652b0cf0f53ac4f6f5ab61ac4f7933972e0019d0ab63eb9931b6884c2909f3a5ead30 -SHA512 (edk2-stable202008.tar.gz) = c32340104f27b9b85f79e934cc9eeb739d47b01e13975c88f39b053e9bc5a1ecfe579ab3b63fc7747cc328e104b337b53d41deb4470c3f20dbbd5552173a4666 -SHA512 (openssl-1.1.1g-hobbled.tar.xz) = 7cd351d8fd4a028edcdc6804d8b73af7ff5693ab96cafd4f9252534d4e8e9000e22aefa45f51db490da52d89f4e5b41d02452be0b516fbb0fe84e36d5ca54971 -SHA512 (qemu-ovmf-secureboot-20200228-gitc3e16b3.tar.xz) = 123889b9277adda472035f72e4836b6fe8e0cd8e2e87d28400bbc846ea1308378fc7aae413d463e0c1bfda096d85e51be100eb8d7dfb0738707c3412f2855711 +SHA512 (edk2-ca407c7246bf.tar.xz) = c3a4dda1030580b9189e7fbc2cbd3a1080aee886ba2880201fc76f530c4328ee05bb9b9269b73782a4a1c7866c59a086c5d94201bbc3122212ef7a3451e99370 +SHA512 (openssl-rhel-bdd048e929dcfcf2f046d74e812e0e3d5fc58504.tar.xz) = d989bb5591acfa3ede8807210117bd9af24ff83add2d9cf6fc249574bf04335322ecf06b580e7b5f03ec54c6baca1410162a4ef329043ac9e5896dc76908c3a4 diff --git a/update-tarball.sh b/update-tarball.sh deleted file mode 100644 index e414329..0000000 --- a/update-tarball.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -user="tianocore" -repo="edk2" -branch="master" - -uri="https://github.com/${user}/${repo}" -api="${uri/github.com/api.github.com/repos}" -tar="${uri/github.com/codeload.github.com}/legacy.tar.gz" - -if test $# -ge 1; then - hash=$1 - short=$1 -else - hash=$(curl -s "${api}/git/refs/heads/${branch}" | grep '"sha"' | cut -d'"' -f4) - if test "$hash" = ""; then - echo "# failed to fetch $branch hash" - exit 1 - fi - short=$(echo $hash | sed -e 's/^\(.......\).*/\1/') -fi - -if test $# = 2; then - date=$2 -else - date=$(curl -s "${api}/git/commits/$hash" | awk ' - /"committer"/ { c=1 } - /"date"/ { if (c) { print } } - ' | cut -d'"' -f4) - date="${date%T*}" - date="${date//-/}" -fi - -name="${repo}-${date}-${short}.tar.xz" - -if test -f "$name"; then - echo "# exists: $name" - exit 1 -fi - -echo -echo "# specfile update: version $date, release $short" -sed -i.old \ - -e "s/\(%global edk2_date[ \t]\+\)\(.*\)/\1$date/" \ - -e "s/\(%global edk2_githash[ \t]\+\)\(.*\)/\1$short/" \ - edk2.spec -diff -u edk2.spec.old edk2.spec - -echo -echo "# cleanup ..." -rm -vf ${repo}-*.tar* -echo "# fetching $name ..." -curl "$tar/$hash" | zcat | xz -9e > "$name" -exit 0