All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support
@ 2013-11-11 16:47 Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 01/15] core: add BR2_HOSTARCH_NEEDS_IA32_COMPILER option Thomas Petazzoni
                   ` (16 more replies)
  0 siblings, 17 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Hello,

This commit brings a number of improvements into the world of x86
bootloaders, and adds support for two x86 boards.

In details:

 * It improves the existing 'grub' package by making sure that we can
   build a 32 bits Grub even if the selected target architecture is
   x86-64. This is done by using the host compiler. It also makes
   various other improvements to the 'grub', and especially adds a
   HOWTO in the Config.in help text to explain how to install Grub
   into a disk image, and test it under Qemu.

 * It adds support for the 'grub2' bootloader, with support for x86
   legacy BIOS, 32 bits EFI BIOS and 64 bits EFI BIOS, all have been
   tested in Qemu, and the 32 bits EFI has been tested on Minnow Board
   and Fri2. A fairly large HOWTO in the Config.in help text also
   explains how to install grub2, for both legacy BIOS and EFI BIOS
   cases. The 32 bits version of 'grub2' can be built just fine with
   the target x86-64 compiler, so there is no problem here.

 * It adds support for the 'gummiboot' bootloader, a simple bootloader
   for EFI BIOSes. However, we only support 32 bits version on x86 and
   the 64 bits version on x86-64, because handling the 32 bits version
   on x86-64 is a bit more complicated.

 * It adds minimal support for the x86 Minnow Board, and the x86
   Kontron Fri2 board.

I must say that the part I'm the most happy with are the little HOWTO
in the Config.in help text: how to install x86 bootloaders is a
question that has often been asked, and we didn't had a good
mini-HOWTO to explain how to install them.

Best regards,

Thomas

Thomas Petazzoni (15):
  core: add BR2_HOSTARCH_NEEDS_IA32_COMPILER option
  package: add objcopy and ranlib to HOST_CONFIGURE_OPTS
  grub: factorize BR2_TARGET_GRUB dependency in Config.in
  grub: support build on x86-64, and misc other improvements
  grub: replace splash screen with a nicer Buildroot splash screen
  grub: sample menu.lst file improvements
  grub: install the sample menu.lst into $(TARGET_DIR)/boot/grub
  grub: adjust splashimage in menu.lst depending on configuration
  grub: add option to configure the list of supported filesystems
  grub: improve help text with detailed instructions to install grub
  grub2: add new package
  gnu-efi: new package
  gummiboot: new package
  board: add support for the MinnowBoard
  board: add support for the Fri2 board

 Config.in                                          |   6 +
 Makefile                                           |   8 +
 board/fri2/grub.cfg                                |   6 +
 board/fri2/linux-3.8.config                        | 336 +++++++++++++++++++++
 board/fri2/post-build.sh                           |   2 +
 board/fri2/readme.txt                              |  40 +++
 board/minnowboard/grub.cfg                         |   6 +
 board/minnowboard/linux-3.8.config                 | 172 +++++++++++
 board/minnowboard/post-build.sh                    |   2 +
 board/minnowboard/readme.txt                       |  40 +++
 boot/Config.in                                     |   2 +
 boot/grub/Config.in                                |  66 ++--
 boot/grub/grub.mk                                  |  55 ++--
 boot/grub/menu.lst                                 |   4 +-
 boot/grub/splash.xpm.gz                            | Bin 45185 -> 16466 bytes
 boot/grub2/Config.in                               | 120 ++++++++
 boot/grub2/grub.cfg                                |   6 +
 boot/grub2/grub2-remove-gets.patch                 |  21 ++
 boot/grub2/grub2.mk                                |  88 ++++++
 boot/gummiboot/Config.in                           |  46 +++
 boot/gummiboot/buildroot.conf                      |   4 +
 boot/gummiboot/gummiboot.mk                        |  44 +++
 boot/gummiboot/loader.conf                         |   2 +
 configs/fri2_defconfig                             |  12 +
 configs/minnowboard_defconfig                      |  12 +
 package/Config.in                                  |   1 +
 package/Makefile.in                                |   2 +
 package/gnu-efi/Config.in                          |  21 ++
 .../gnu-efi/gnu-efi-01-use-override-cflags.patch   |  53 ++++
 package/gnu-efi/gnu-efi.mk                         |  44 +++
 support/dependencies/dependencies.sh               |   9 +
 31 files changed, 1185 insertions(+), 45 deletions(-)
 create mode 100644 board/fri2/grub.cfg
 create mode 100644 board/fri2/linux-3.8.config
 create mode 100755 board/fri2/post-build.sh
 create mode 100644 board/fri2/readme.txt
 create mode 100644 board/minnowboard/grub.cfg
 create mode 100644 board/minnowboard/linux-3.8.config
 create mode 100755 board/minnowboard/post-build.sh
 create mode 100644 board/minnowboard/readme.txt
 create mode 100644 boot/grub2/Config.in
 create mode 100644 boot/grub2/grub.cfg
 create mode 100644 boot/grub2/grub2-remove-gets.patch
 create mode 100644 boot/grub2/grub2.mk
 create mode 100644 boot/gummiboot/Config.in
 create mode 100644 boot/gummiboot/buildroot.conf
 create mode 100644 boot/gummiboot/gummiboot.mk
 create mode 100644 boot/gummiboot/loader.conf
 create mode 100644 configs/fri2_defconfig
 create mode 100644 configs/minnowboard_defconfig
 create mode 100644 package/gnu-efi/Config.in
 create mode 100644 package/gnu-efi/gnu-efi-01-use-override-cflags.patch
 create mode 100644 package/gnu-efi/gnu-efi.mk

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 01/15] core: add BR2_HOSTARCH_NEEDS_IA32_COMPILER option
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 02/15] package: add objcopy and ranlib to HOST_CONFIGURE_OPTS Thomas Petazzoni
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Some bootloaders (such as Grub) need to be built for x86 (i.e IA32)
even if the target architecture is x86-64. However, when the target
architecture is x86-64, the cross-compiler generated by Buildroot is
not able to generate 32 bits code.

To solve this, we will rely on the host compiler being a x86 + x86-64
compiler. Therefore, this commit introduces the
BR2_HOSTARCH_NEEDS_IA32_COMPILER option, which tells the dependency
checking logic to verify that the host compiler is indeed capable of
building x86 32 bits code.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 Config.in                            | 6 ++++++
 support/dependencies/dependencies.sh | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/Config.in b/Config.in
index af720ec..8716687 100644
--- a/Config.in
+++ b/Config.in
@@ -20,6 +20,12 @@ config BR2_HOSTARCH
 config BR2_HOSTARCH_NEEDS_IA32_LIBS
 	bool
 
+# Hidden boolean selected by packages that need to build 32 bits
+# binaries with the host compiler, even on 64 bits build machines (e.g
+# bootloaders).
+config BR2_HOSTARCH_NEEDS_IA32_COMPILER
+	bool
+
 source "arch/Config.in"
 
 menu "Build options"
diff --git a/support/dependencies/dependencies.sh b/support/dependencies/dependencies.sh
index b563f60..32b8fea 100755
--- a/support/dependencies/dependencies.sh
+++ b/support/dependencies/dependencies.sh
@@ -186,6 +186,15 @@ if grep -q ^BR2_HOSTARCH_NEEDS_IA32_LIBS=y $BUILDROOT_CONFIG ; then
     fi
 fi
 
+if grep -q ^BR2_HOSTARCH_NEEDS_IA32_COMPILER=y $BUILDROOT_CONFIG ; then
+    if ! echo "int main(void) {}" | gcc -m32 -x c - ; then
+	/bin/echo -e "\nYour Buildroot configuration needs a compiler capable of building 32 bits binaries."
+	/bin/echo -e "If you're running a Debian/Ubuntu distribution, install the gcc-multilib package."
+	/bin/echo -e "For other distributions, refer to their documentation."
+	exit 1
+    fi
+fi
+
 # Check that the Perl installation is complete enough to build
 # host-autoconf.
 if ! perl  -e "require Data::Dumper" > /dev/null 2>&1 ; then
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 02/15] package: add objcopy and ranlib to HOST_CONFIGURE_OPTS
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 01/15] core: add BR2_HOSTARCH_NEEDS_IA32_COMPILER option Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 03/15] grub: factorize BR2_TARGET_GRUB dependency in Config.in Thomas Petazzoni
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

This commit adds the OBJCOPY and RANLIB variables to
HOST_CONFIGURE_OPTS, since grub legacy will need these defined in
order to build properly.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 Makefile            | 8 ++++++++
 package/Makefile.in | 2 ++
 2 files changed, 10 insertions(+)

diff --git a/Makefile b/Makefile
index 2f7db59..64ae8f5 100644
--- a/Makefile
+++ b/Makefile
@@ -185,6 +185,12 @@ endif
 ifndef HOSTNM
 HOSTNM:=nm
 endif
+ifndef HOSTOBJCOPY
+HOSTOBJCOPY:=objcopy
+endif
+ifndef HOSTRANLIB
+HOSTRANLIB:=ranlib
+endif
 HOSTAR:=$(shell which $(HOSTAR) || type -p $(HOSTAR) || echo ar)
 HOSTAS:=$(shell which $(HOSTAS) || type -p $(HOSTAS) || echo as)
 HOSTFC:=$(shell which $(HOSTLD) || type -p $(HOSTLD) || echo || which g77 || type -p g77 || echo gfortran)
@@ -192,6 +198,8 @@ HOSTCPP:=$(shell which $(HOSTCPP) || type -p $(HOSTCPP) || echo cpp)
 HOSTLD:=$(shell which $(HOSTLD) || type -p $(HOSTLD) || echo ld)
 HOSTLN:=$(shell which $(HOSTLN) || type -p $(HOSTLN) || echo ln)
 HOSTNM:=$(shell which $(HOSTNM) || type -p $(HOSTNM) || echo nm)
+HOSTOBJCOPY:=$(shell which $(HOSTOBJCOPY) || type -p $(HOSTOBJCOPY) || echo objcopy)
+HOSTRANLIB:=$(shell which $(HOSTRANLIB) || type -p $(HOSTRANLIB) || echo ranlib)
 
 export HOSTAR HOSTAS HOSTCC HOSTCXX HOSTFC HOSTLD
 export HOSTCC_NOCCACHE HOSTCXX_NOCCACHE
diff --git a/package/Makefile.in b/package/Makefile.in
index 612f3c7..2499086 100644
--- a/package/Makefile.in
+++ b/package/Makefile.in
@@ -256,6 +256,8 @@ HOST_CONFIGURE_OPTS=PATH=$(HOST_PATH) \
 		GCC="$(HOSTCC)" \
 		CXX="$(HOSTCXX)" \
 		CPP="$(HOSTCPP)" \
+		OBJCOPY="$(HOSTOBJCOPY)" \
+		RANLIB="$(HOSTRANLIB)" \
 		CPPFLAGS="$(HOST_CPPFLAGS)" \
 		CFLAGS="$(HOST_CFLAGS)" \
 		CXXFLAGS="$(HOST_CXXFLAGS)" \
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 03/15] grub: factorize BR2_TARGET_GRUB dependency in Config.in
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 01/15] core: add BR2_HOSTARCH_NEEDS_IA32_COMPILER option Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 02/15] package: add objcopy and ranlib to HOST_CONFIGURE_OPTS Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 04/15] grub: support build on x86-64, and misc other improvements Thomas Petazzoni
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/Config.in | 27 ++++-----------------------
 1 file changed, 4 insertions(+), 23 deletions(-)

diff --git a/boot/grub/Config.in b/boot/grub/Config.in
index ec48d17..fab3323 100644
--- a/boot/grub/Config.in
+++ b/boot/grub/Config.in
@@ -4,9 +4,10 @@ config BR2_TARGET_GRUB
 	help
 	  The GRand Unified Bootloader for x86 systems.
 
+if BR2_TARGET_GRUB
+
 config BR2_TARGET_GRUB_SPLASH
 	bool "Splashimage support"
-	depends on BR2_TARGET_GRUB
 	help
 	  Add support for splashimage.
 
@@ -15,132 +16,112 @@ config BR2_TARGET_GRUB_SPLASH
 
 config BR2_TARGET_GRUB_DISKLESS
 	bool "diskless support"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable diskless support
 
 config BR2_TARGET_GRUB_3c595
 	bool "3Com595 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable 3Com595 driver
 
 config BR2_TARGET_GRUB_3c90x
 	bool "3Com90x driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable 3Com90x driver
 
 config BR2_TARGET_GRUB_davicom
 	bool "Davicom driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Davicom driver
 
 config BR2_TARGET_GRUB_e1000
 	bool "Etherexpress Pro/1000 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Etherexpress Pro/1000 driver
 
 config BR2_TARGET_GRUB_eepro100
 	bool "Etherexpress Pro/100 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Etherexpress Pro/100 driver
 
 config BR2_TARGET_GRUB_epic100
 	bool "SMC 83c170 EPIC/100 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable SMC 83c170 EPIC/100 driver
 
 config BR2_TARGET_GRUB_forcedeth
 	bool "Nvidia Geforce driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Nvidia Geforce driver
 
 config BR2_TARGET_GRUB_natsemi
 	bool "NatSemi DP8381x driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable NatSemi DP8381x driver
 
 config BR2_TARGET_GRUB_ns83820
 	bool "NS83820 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable NS83820 driver
 
 config BR2_TARGET_GRUB_ns8390
 	bool "NE2000 PCI driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable NE2000 PCI driver
 
 config BR2_TARGET_GRUB_pcnet32
 	bool "AMD Lance/PCI PCNet/32 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable AMD Lance/PCI PCNet/32 driver
 
 config BR2_TARGET_GRUB_pnic
 	bool "Bochs Pseudo Nic driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Bochs Pseudo Nic driver
 
 config BR2_TARGET_GRUB_rtl8139
 	bool "Realtek 8139 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Realtek 8139 driver
 
 config BR2_TARGET_GRUB_r8169
 	bool "Realtek 8169 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Realtek 8169 driver
 
 config BR2_TARGET_GRUB_sis900
 	bool "SIS 900 and SIS 7016 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable SIS 900 and SIS 7016 driver
 
 config BR2_TARGET_GRUB_tg3
 	bool "Broadcom Tigon3 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Broadcom Tigon3 driver
 
 config BR2_TARGET_GRUB_tulip
 	bool "Tulip driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Tulip driver
 
 config BR2_TARGET_GRUB_tlan
 	bool "TI ThunderLAN driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable TI ThunderLAN driver
 
 config BR2_TARGET_GRUB_undi
 	bool "PXE UNDI driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable PXE UNDI driver
 
 config BR2_TARGET_GRUB_via_rhine
 	bool "Rhine-I/II driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Rhine-I/II driver
 
 config BR2_TARGET_GRUB_w89c840
 	bool "Winbond W89c840 driver"
-	depends on BR2_TARGET_GRUB
 	help
 	  enable Winbond W89c840 driver
+
+endif # BR2_TARGET_GRUB
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 04/15] grub: support build on x86-64, and misc other improvements
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (2 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 03/15] grub: factorize BR2_TARGET_GRUB dependency in Config.in Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 05/15] grub: replace splash screen with a nicer Buildroot splash screen Thomas Petazzoni
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

This commit brings a number of improvements to the grub packaging:

 * It builds grub with the host compiler, which is needed so that we
   can build a 32 bits grub even if the target architecture is
   x86-64. To make sure we have a host compiler capable of generating
   32 bits code, grub now selects the BR2_HOSTARCH_NEEDS_IA32_COMPILER
   option. Building with the host compiler is done by cheating and
   passing $(HOST_CONFIGURE_OPTS) in GRUB_CONF_ENV.

 * Some additional CFLAGS are added to make sure grub builds properly
   with modern compilers (-O0, --build-id=none, -fno-stack-protector).

 * Removal of the GRUB_INSTALL_STAGING_CMDS which were not used, since
   GRUB_INSTALL_STAGING was not set to YES.

 * Installation of the "grub" binary in $(HOST_DIR) instead of
   $(TARGET_DIR) since it's actually used only on the host to install
   grub into an image or device.

 * Removal of the grub uninstall commands, since they are generally
   considered useless.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/Config.in |  1 +
 boot/grub/grub.mk   | 36 +++++++++++++++++-------------------
 2 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/boot/grub/Config.in b/boot/grub/Config.in
index fab3323..ee92250b 100644
--- a/boot/grub/Config.in
+++ b/boot/grub/Config.in
@@ -1,6 +1,7 @@
 config BR2_TARGET_GRUB
 	bool "grub"
 	depends on BR2_i386 || BR2_x86_64
+	select BR2_HOSTARCH_NEEDS_IA32_COMPILER
 	help
 	  The GRand Unified Bootloader for x86 systems.
 
diff --git a/boot/grub/grub.mk b/boot/grub/grub.mk
index fd27620..229b1a4 100644
--- a/boot/grub/grub.mk
+++ b/boot/grub/grub.mk
@@ -12,10 +12,15 @@ GRUB_SITE   = http://snapshot.debian.org/archive/debian/20080329T000000Z/pool/ma
 GRUB_LICENSE = GPLv2+
 GRUB_LICENSE_FILES = COPYING
 
-GRUB_CFLAGS=-DSUPPORT_LOOPDEV
-ifeq ($(BR2_LARGEFILE),)
-GRUB_CFLAGS+=-U_FILE_OFFSET_BITS
-endif
+# Passing -O0 since the default -O2 passed by Buildroot generates
+# non-working stage2.  Passing --build-id=none to the linker, because
+# the ".note.gnu.build-id" ELF sections generated by default confuse
+# objcopy when generating raw binaries. Passing -fno-stack-protector
+# to avoid undefined references to __stack_chk_fail.
+GRUB_CFLAGS = \
+	-DSUPPORT_LOOPDEV \
+	-O0 -Wl,--build-id=none \
+	-fno-stack-protector
 
 GRUB_CONFIG-$(BR2_TARGET_GRUB_SPLASH) += --enable-graphics
 GRUB_CONFIG-$(BR2_TARGET_GRUB_DISKLESS) += --enable-diskless
@@ -51,24 +56,26 @@ endef
 GRUB_POST_PATCH_HOOKS += GRUB_DEBIAN_PATCHES
 
 GRUB_CONF_ENV = \
-	CFLAGS="$(TARGET_CFLAGS) $(GRUB_CFLAGS)"
+	$(HOST_CONFIGURE_OPTS) \
+	CFLAGS="$(HOST_CFLAGS) $(GRUB_CFLAGS)"
 
 GRUB_CONF_OPT = \
 	--disable-auto-linux-mem-opt \
 	$(GRUB_CONFIG-y)
 
-define GRUB_INSTALL_STAGING_CMDS
-	install -m 0755 -D $(@D)/grub/grub $(STAGING_DIR)/sbin/grub
-endef
-
 ifeq ($(BR2_TARGET_GRUB_SPLASH),y)
 define GRUB_INSTALL_SPLASH
 	cp boot/grub/splash.xpm.gz $(TARGET_DIR)/boot/grub/
 endef
 endif
 
+# We're cheating here as we're installing the grub binary not in the
+# target directory (where it is useless), but in the host
+# directory. This grub binary can be used to install grub into the MBR
+# of a disk or disk image.
+
 define GRUB_INSTALL_TARGET_CMDS
-	install -m 0755 -D $(@D)/grub/grub $(TARGET_DIR)/sbin/grub
+	install -m 0755 -D $(@D)/grub/grub $(HOST_DIR)/sbin/grub
 	mkdir -p $(TARGET_DIR)/boot/grub
 	cp $(@D)/stage1/stage1 $(TARGET_DIR)/boot/grub
 	cp $(@D)/stage2/*1_5   $(TARGET_DIR)/boot/grub
@@ -76,13 +83,4 @@ define GRUB_INSTALL_TARGET_CMDS
 	$(GRUB_INSTALL_SPLASH)
 endef
 
-define GRUB_UNINSTALL_STAGING_CMDS
-	rm -f $(STAGING_DIR)/sbin/grub
-endef
-
-define GRUB_UNINSTALL_TARGET_CMDS
-	rm -f $(TARGET_DIR)/sbin/grub
-	rm -rf $(TARGET_DIR)/boot/grub
-endef
-
 $(eval $(autotools-package))
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 05/15] grub: replace splash screen with a nicer Buildroot splash screen
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (3 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 04/15] grub: support build on x86-64, and misc other improvements Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 06/15] grub: sample menu.lst file improvements Thomas Petazzoni
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/splash.xpm.gz | Bin 45185 -> 16466 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/boot/grub/splash.xpm.gz b/boot/grub/splash.xpm.gz
index 96e88822aad930a062ae153053435336235d522d..6b30d3de001c7bf1606a604685e34268995bc32e 100644
GIT binary patch
literal 16466
zcmeHO^-~<M)}_c|TU-`hoI-JTiWDzSf#O~$u8YeerMSDhyX#WiwYY0>cj)7N|HU`+
ze#uNGHz&zWZsy!%4mb=2C0^BA6%N74-rC6NI}60#2JR$7CyKKzA at l6zBU)uE2WLGL
zc)NfCKN(5y_RdMxFdF?g$Pi#J{@XJE5#@57x)PTVleVO7?n_D6jgRM at SSe#k8F>XR
zp?25nT;l7p at 2bzuk-_t`o$q6l at 5|NgzVE}#dZWS1^L*Fy-?vK9zs{GUlYg&U^Ic1?
z>HjXfUI+d?yFcl?u8SraT(0{BGyA at _b-iA#zn)h8d-Q#MVBH11^*r;fdwH>YD{P<c
zmRbL;vih{x_^#b%`S?EEEnk+gcD>#f`QB5%rVdwi{o6i!y`K?HG;n&jiTbyR*#)yO
zdAR9%-is35ti#}W{d?#8?`b{WK;q#>^sV{dxemlNB*OP!l<)oO*+>=g^EdU(j^}sh
z1iry{kYojPB(GEjbTeS;*AWm`MI!t6Z_Fl>_22rlEgQncW~_*yg>xK$FJ=ET_ at 5vC
zcOL#<#zmHx=Yw5QmW=IU+rwKtqvu~N-3k9<>H2`?i$?^_s?x)YoD>G-ibu-=MG1cP
zZ|tM-wI#P+R(UO^RFaMAr&EA_>+?Qgn*x0 at S+32vtYb)R{c9*%r~?kX at A}EY)H<zq
z;+J3hH*?tUWm~feTx%Vl6UNBZLT(-UDTIiye%rB{oU7q=zf%gLI2Cl?%E-8E)^@-B
zKyaQ0{SNdA5JzDjMLibF^TlJsm{2vn@1W!YfUC$JMji<KBck?DYU+|bW#gjkBHr-7
zCrHv5+_!x;RA)&>_+3))e5+l{ey^nm2Sn<*JmU%R98>%DK?jXBN<#Udvxxl-s1%EW
zpq+1<^sFXu7*A0?XpX?q;fcifJ5WTK@YPC|Za|Ph=%ql+1rz2i4<7*wIqWg;bBNJS
z^c>zeVP^OM9JpZqFAO~s8iBNzsQ<-y1hxbtzE2%qAIK}-_40QX?f92SI}5Z37&3!B
z#XW%c*&JnLgAD#YgYB(bZU<!Jr4tt8M*S1POZwinaT4Se$by(l at +zb`O2MdeulMFv
ztpaQKWA8$INqBZT8bH_k(Ebf+4V`+C at CEPXPtx;ln^l9L=j3dvdo1`fyhe|fGZUl;
z7-s20w~`x7*q_f?diT)IFPHt^2cP8r1Khfye9O?@Jpml~8w_IH*6HzA@1It_2=QfP
z13|2jZ+41EAW{r4^100vjZMUtp!NKgIgnS8+z;{QGWI<u$<L|t^l#HFV#D#G@%OxY
zd2|(=Kw~aEpG&h0huxv<F$oJ`<a2Cmprp0rwvltX8@;XF?R$~bUslJyr*mj(Q9H7Q
z>v_nG{?d(qr?gQqWt-^dMYB#^ERb!-Sy2M}{nr!EPT$r+PowmlV&R6%{yv;kvgaH;
zaUXl0o;>jWwce`R{>65Z%TWJDT76PzS~rDiG8mak$+fG0!_<Z*pRL`oVF~0F=b9?`
z{QVhl>kKbc5Cx|5^=h7X8SLNC2^<=vrznoa*1wTZ@?GD(ur2Lok#|G7>JtqZes=jL
zzNv!M7)I7nfUeLN)mDnvY5XyQ9nzJ}@q%^DC8}<MP2h<|QYEBA9ckQS-)<%I9k^CT
z_UAm?%+$8B<c0uII@H@Vq?~|(6rgthfwFlX__lt}AUKhqB0&?9Axv1hWH-ufQ%Vjw
zY$yR$fw}CEEGs6+Ku^FOCj>sH_Gdd^Qa(e?-QZS4jpUU_N$6X<98>a0ZGg;%-U#{{
z-8p%QvVB&vM2<3r7dK)AtgXH+fMVW^+z%|V;0RF{U3ped8dx!r&lOPJDH&i*A|`>}
z71uL#FO{Z at ZAcHQ?Eu@!9yMLu$gUeb?*4pGwS9?&4)kx>80C$clm<Md!^ROaTXyuA
zHg~!aH#hZdMtec+%!F)slCL5%o0Uht2$q~my39F<K@xTI<KrOa%^yRcc7_8rEa`O7
zKTR4=;r?Q~eo-9{xn#AuRf4s6mg!Ec31lSDCdtfXG|sc&Dym{8BRiy&E~hG{>Il%O
zm04xdWq<z$bC7Zv2bhF;?Fada1Ozw>dmpjLR;o}SyhZAu-}CSDTewtx#0t=6GV-#E
z at kpvSN=>L=0}Tnfwzu7;NZ7KMFS7qBH7ICX2eq at X3}=JK!9+CJa7tbmIh|4CS{mqP
zrlt_2%}Fv=E at NY${@i!K5z3IDq4iel9yX7^^{XQ43cr|bp}Q4e1cyfOX-m^@64cI!
z0pOepS?L%dIDP7j!osL$IQ%J1_VF^xqDqAXv~sjV+rPn$M9;(aQ7L`h2=PIx4_6T4
z?8okzA#Cj%RU{lFC~;4PLJZZMONNc(cO{5f+FHKXw%CdkArO*!M%iQVoxTGb*6+~%
z$zump{e+5XkbBYl2M&lh4CEoKF at SB~Z^LcoXCz?AxQ9AbVPg|R_gg8Fd-0`D4f_7A
zk8c5~Zti7yyk<9Ja{`1B*h&>Ee{DFeFARZ%60nN-)N3}DKd2L&%gI3MrR+Gq@#aC6
zW?N^HSJ7unBVcNJ&-QY%K~R_E9h+x%s}2Tr;MWD3SHaYQy{Rof0|X;JeUp_1kkAY*
zfx;4+mD1b2wfNc>NdYNsa at J%rnD1e;v{?NJofNx*$0LSXSn1Z7(twA<lyohj3t|`#
z8%x>Y^JLr{q!{d<P)aUdiO10UH$nq&0VZP+@4B1RnnxT_ih!>8DP=F^FO+n3k-L$K
ztkI+-P<mCU^HwOj*I940mxamYp_5g<;v9U`w~9R(`_aq+&0N-V>k}F;<F}}4nFP{B
z82-5mTbH78yB+IrKrlxzxcaUpTpq$l)>PJV5vL<=VqZB~NW*{movhZ4*PG0A9<(#7
zx!fYL``hWxE8%%wi(vtjeq;<#Q|)Yat?4u=H|;DO$N?QM<CG4iakx`6tFY>X1x|$J
zvhyY6mGd<qmhxC3UMP~f-z1m0Ry%UXm!=T}=eQZ^)6k%_NZptJ_gdBcWN3lxa`k6f
zF3@inUs}Ms)Fz7`z;?v0$V?frAnd&zz|I%fw$s}gf!rc9_~6i<C0^r~CtnFX{C=+7
z&`p#kA$=4|n=gJ-H&Mq4pl6hIfJelor%}-?O*_8Fz;P#P3N0wZ;(@y0Uhe7X6>YmX
zZ~O$3Pqbr1u=8P4FWfTO%Zbn5Vcg;c1djL-<T!GflHG`Mi`Qx<39$##voZzS-|%-(
znb=by^E+5kiM#f5SdFgR)<JCic^fq&$l_HStcpswN*!<B17P?weyg|=-+_udswJab
zU#m;TD1y=Y)3Bt*BktllgTA(^bJ{Vrk6=v4(2{$pVno0~(??2N`WnKBi#?ZjT63K2
zhc_sDL%D?nz}^9e6-kLI+w=+Se2ky?l37w}SX5>(@o at H<!V`}h<d{KH5fd#$<+hsA
z!Mte}-_WvzIC%ilFs+)qmT%(0%2t67%t)z`otzSbqc@9o%-E48^aD141~M;2ln9tu
zj;vHXZzXpRjCS46o&Xg`0w4dTm_;coZP4?WVrOf-#bP|-&5Xq#f7VsmxMxWOcU?D6
zWGD(B>QP<k(xhj8DP_<uT1U_G=5g0*tYUca+x}^}3=Qf{8@wO>_QpVbD6YJwp!wbj
z)a_IAM~VCR5egz`#PhDW``1gZZ at F<M+@^$QRaj^qO^*cMo(m6Frv?N<&b7bfuopMn
z9B%b2T#tXaz2wF*E3VZ3z8Meub8U(CwAt!8JUcCQ-+m<&AyyHP5%O>2UnJ~<fgrry
zUoM79xCq at bpBZJ0_qv+;`d@5009m@rd&6V)!|>?4uRnuee{keJeJEsI7u!}$xe($m
zL6Pe#AV5^oX`~}H at Q)@Y%;e<e0W`2o1|_2fT!<TWJ_|%H4E<Yr(ciVNT7&SIQuSNK
zpOWFptP^AEM|!IpJO>6(f at YT*(LGQ$kowV~xNr%oX0dH;<CNtGV;(3@*#-f%fe4WZ
z-p|V}h!Ppg*ItOk(28GVOwagkUNwFPVR3Y9Qc5|wV4UO;lUE?ZP9XpBGJ&dZ`n$$O
z1UHf%y;9CHrE~TEYyvhAk;Hi)lq|hQ)1?pV)+t=WT!?h9_i;=r?92}<F>^8V50(fu
zv^~D|qwq<+>*6b|KX6HGgH1&!`N<E9jLRCA!M43R)O|Ev%rf^Y?lJK?=?FWu)H_;G
zF_6Pah^4(u!0l7J?Lv20cgKk2_WsNaJ7jg#I_pSDPAD0x+c8hE7HVn8wiDY*Gn@qz
zFAUh`7A#&Mffu)btRdw{M9^RB7cuP}@bUTTRZ_TL=E}x**7>OD>c--E?+nzJj{fxA
zPKcQt)$NNq2|6*9;fG@`@yd}Tw%#uxn{}5x`*nw7(sS|i&=`3jCq~#>59{!0eWFK2
zqu`YTu)5pf&Qvds=xsJbZ;CZctz6_pIoaTVm8T~%>@_WV(ueCYXPnS2w7W(!LlSrb
z-)4KCIexOySyqFyDi2!3i2cHhJUmQT*34>SL8KI_%Ak>Ihhv((Gg7``$T!aG%>y7y
zlxESyA90Q*8B{ulJPPTcAi)OJOCZ&isNp~=FKbR}9HI%(N{d at z#S~X(vg3v0_o8iB
zYD6Gs57Ot2$^B3wpa(37)l&C^U7%=}{n-D3h6(mAq^mn3w9i6zH*=qqa<NXZ>H3r7
zb|^nGEO$SJYE1;IQdxsn7-+4g@)oJ=@1 at mfzHPzu=JFn%9;WbvcYE_u0~_4-!kCQi
z%nia}IO`@diOKxkRAPgXCDiINBHMlPzr+$!6!>KiiI|k6eKeoZ{UC}%<Df<qDRZ_t
zKl{P3&|dq)u!d<wakjuYB44DSCv?u{Jl0769`EX(F-QHezk=UrQL~znAPQ?zk%>#n
z(LyK_;VUVnZgVPO7_BM!4}UD1kF<Q+AZux<6-%Ucl?TY)=6kOP5A>6g!Kz+E2fk2r
zJIEIt&0}~iah6;?mS*4UGLv#?-ja_ZF~T)xpmxb3{+UA6(V^}Q`xpEWZXET>6j0#Y
z-ub5no;;T<vi5`6Ea$}PUMM5QGa8z~0*0y(C|R@?;~;VB5D}xB9E=kn3~!cI%o7)P
zc0yt8w@izMMEPm(us7<1+}$V$yVj<!)$P!meGw+OCDys|l4yv`Yn{O^2$3hOjs-4F
z4-ysTVB47dipR|#2nm!BGZIjoMiIqRHUJ1FAE_6S|L*vT+UA}~8<@917^36x`s<5O
z)!6lL2QP+=@iP+MEjXFbWRlZ0{ug59fQo^}m<-q!MGrZ7fVe^0BK)?RWU!?je>`#u
z<93GuaqhXb`NzcQD;W+eDSeKXGXG9mLki=%%{MGW!SC)D!m&$0bJ$k0`!#%yf_)#k
z9SRv!%jeT(xTHx!-qU2lm!HWr^gc=2ABHXqJ{u(+2jb!yv2ACO^kMMWpzWr$En{E=
zV_{w-@DHtZENU88?_A3+w(ra&4qsDAHxS7nqR8LfKaL`ao3puBNy{<@(}HtiZ+2H>
zjrJ~#wJ}Y98O<w<6-Gl12ivnn`2I$;2-5q at ui3PP2z+azpm%S8uzhCe2;$-sks&UI
zkddE-vl7aI5YbT#kmY5Z(l{_qKVxW at v6?@6pdD$Ed2Y*e@=Yy_EbvnE%l@9*rQR|M
zUr=hrcMO9&_OT|k^I{JMxBG8-w?*B+u3j>u#d0w#(1XoLcq2=<i~?(Fq<!=81EMjX
z=ol<HcXZd_-hVV^k5lw&A|1?*#=U{*zXC^PSyT!T$$GQ(5p8iW>9}u(F{`*1#JH7J
zf3Na}g9XV;@77k;lE}O+<k=5C+#}>=Tk~ZKCFOEyA{odBR>leJBotlO-N&taY3v0C
zs>aH~1dwZn39V9a&_G3ag*;`lp#!pP4F39|wyQ|WNrd#)8w^<qHpd$0dgi*;wxKM+
zqyH|4n^;0OisBj;^_{7l;3owE5_`BAa_ZU9UOWIdP-hVnwv^#bonop2J8uclR%dx|
zCu2=EQ#`y)LO*6cvC1G3-^)SqofE2a?p3Jk;X4jp@-NJ<I3>Lj5-#t4%$71ajh;~0
zyhDOv^fW5GAJg$H^~G&3*ol_)T?I`mlK(qQCfe~AZv|Mh3IhJBxOa9Q)Up3`XV-33
zSM5F31~-$3Ah=#iW)J}Bhf2I#MFi)`9ZZzgeV0bE2?qi?2rFH&X0*c%+CB-%Rj~2S
ziyt1Z`1s$5S at s$UE|do?4nU_jHQ+}&K{M<>BRB^Q?*4XnJ+G+rSj at U@v%I?_W+A)B
za-``XyN<|AhcV41VLfGL8E+Nnd~UO{-}LWSMN7X?x;|IWk7?jzONQ`XpVgZMy1R5f
z8fzoTo@(Qiu?7n<$m=Wo!>r`{eG|`%JLGT2r6_JHU{pO4)}|hJvVk$*>|N2Bt#_O0
zJiAfInMYS-(MkB{P_K!(bN2Z2wT>8FR;pM at r{o}4ngtobPP3EPvKZK`ipS`-&(*j#
zA}DHaG{M45D7E!>wgtAwLxI5RB8(VQ^-=vc_F}8N)+7Qzm5ehGHCwsMI~s;M{HeO(
z6heT>5s>uHW6$x<lX%tTX=fJP_QP{`s$eBsX-JeGs-Ba*q;OR(VL<B8U1`KtBJOJK
z?eOcF26A`W%g_Br*T at PaQ@m=D@*%N=CW1;^4mc&tgFiERCglw<T!yCknvvr#zDOPD
z1dbsKF0daU!MtSxb?EN2rRTZRmHS-xt~xxNyU?LrURlkwX5q;EtexqqeKWML4l&1C
zr``_6gsW*X{8RuF4!I2bT-6$A=O5GlWHzHXi9nv^al(Pe&*N?FPcm0u2Xmj8|G;vT
z-K`Q$K*!nA@HLmK?<SXEUSx&1C|BhNGcoyh9_Ub|(=f7z25D0FNu|SfJ}!iQE?gRw
zksQ0@?4&JJJP`qdbUtAjf9Vo6EC6REnvhHX?(`hPm(WM^+WU=L_?}JmuSzcghLEE+
z>8CPRT)>sKzL0zEXs;b=8wM_oyte{mUEh)CsrEX8EGrd8A)L!z?~3*K^)F-L0>ldL
z3;fgUvKX;Pq-F7sBuI2&h<!|Qq{=AMXiBeu%S?0jmKg90wFW2bdY2)P1Q5lpjzK-~
zO-2 at N76-GD@xoB_Spz%0*Z1&FTk|OJmyO-@wjfq-$00^jQ<WXVh|fen#Vk*aCRRYX
zO<BWkgz?>=H`jZpZeHG0Ww4mY#w_7{Xpc)g at w$X1?Rlv~A<jV%>_b*E#f_Nb at 7-T0
zu_yrxI+g+o3f{dU;apk74Fe+dLt9~Y3yU2Kf6Slfw5rLgm>Zkhq8aHLGl!R#=kKmp
zT%(`a+?NZDlky4XHziAuv<4Oe04iFsKGp2xI}9fW@n(&r*VT!86>;exB87q{B2OFl
zau#VK<$i+)oTN2tF5g)y+;eG;e6E5W>tEk9_i5lZC)tY!WGi<XPcGVk+m#)ukb_LJ
z`xjw;=nlGByB3_f&qr~iFYE_qXzJggB3(6c2-E`oP-RWj20el=Bo(5Auxy&aRGBDu
zhb=3dy}l(v1XQ9b{Lv^XYOS;x)qGSP)o+Ja=ticQgeFqcC%HadBe>flX`L8uI0XZx
zr=Db975ipb=zc=heNI9qhGj5vCc61+m62oT`fLgB=qTP2%)~XeGnRk+TK=h#0W(3u
zw>K8t)+=9FhU)jkOU8;t4o4Rq at _~I&|0H5_h3Tefjer1f&O;xm*F}HXSU#om48t&_
zel%?KmQ{HMhc{J>*yi+Z*m(MTB7)DX>e1`mHkZspJCLA=xa2hn!iD(DuGD8hO4{4{
zrEvNe-%g(uMz?9XV(5=3Z23?I2N5a*;tAb;Sq>6K6wCy&Q9OL}c2#nfI1clMvuRdE
z-*r7#wvqFB9&=1aA=2Orb^812r1UAH%V9E4m!jIm?<Cjlz|(ZXkpl!5Zlu)y#P1(k
z(hL={=W30!2<wneh=h2m=5ZBP;-IK8*R_XoE+d8y_A?$q4IvG|&}-jdiMo`2BJCjD
z`>$a~{`zj?hMH+5D!(RP3U6X4DJkLD`i=}J2Omi9E-ShGBCzDF!X<7p0UK@9Bb;1?
zx>enE>=5O?2s(vWhiyOMDF_KhZ6kL5=uO0`pKi+_mo|U+4eYe<#|_37hf>7sP9VNt
zrc-P>!^DSen$C at o{;G=sp<3OeXn4OO)GsQ;_KI7uP9C))QeYY*C!guZ-5`WdoOB<z
zM1u31Gf$`F?^e+TGly-{u1@FaP1zhz%D?8B1>&a at xChztf^qN-RkPymyM-BW1sBMX
z;=Xb<@hMV$7JFBHYY)>RTl$h}+P9{8KO+8l%P9F0TABnQw%D<p(~D>oze{v?k$qV)
zYINZJCqhH6dVIKF2}w4mwfJjVbt-TR%>26ua at I;iZH)|$(T%5KK^ic5LdVbjozEj-
zLbO>(7Vqeie__n!o9PoRXY|I03J*<9f<)<JfK(Oda=s|}g1>O8{&m{-Y^*v7)-|g8
zgi{@P%jxbr(rPROcc==>Tdw at zi>qq?gG{HXRg|a2=E$fW!clxuxi~iG9}L3~Abvau
zQU1o?Kw#h9;MYR6?Ltw!^i;E*m^VqW-S^&)-&p-C;h~j;NR<47OkFSXiJ{f8`o4P3
zL6wq@=jgCuou(kIB^cUq5g!Q^C`x)pC35Dd$dL0_ugROza2@f^E8Q>h3>jhIjOa>V
zf^C at b5uezdfUip>4}v7m`(i6`wLw^_83Im00<xv}mJT$f<}-09;J!fm>Wu8g5nkEf
zrli_c5(@=gg5IB=7`%Kyjdq!xV}@R|0EblSr1(W>t^0OwtW9VorpLFqkHJHHs1q|`
z`@mM+$&F-AMBS_6MitM$dc{WwMXeCFJsO=aGPOGc{FmJv)(M6*0=$I9q}-S17bUEn
zCMQikwz3nPDPnH1{|Y0#>et&kQk}R#^PBOV&8(3-VeIYDIW5Z<W<{o{L_GO}Bij|L
zX!C}YpDsq$lF1xe3-&?-wOlHBtWsA+Wi$HW6t}h)gGRAy6--~TP{U0R2Lq%J1V^or
zVqlL$0XgY=I3o$2n_*Y^>U;!^%a(dR#7ix=Q<JzmA(Uy0E?!1}GH!%qE9}t`JY8ZD
z6)ca@uoeuy+2TAduQ8&Pk#74>1`2uP&49wH>l*5>PHDwa#3A=fkJ*pomh1(OL3&F0
zrmdHZh<uz7w_fOS{!*-9zba>qy=lGBp$CUxf3T#5;d#Qmw!MoFyI!PJ==|n;E}Ejp
z;*{=Au at Sol7UY*)P5}D1jW9JmA7!ta{p at O0EpLYk^M1)2SfMxyphma8yCc*reQ`c!
z=cl$49#H9cLzsU^`4c(l8nviqdY!EBwp4J~emJ-5^Mc3@&HnuJBB-1#$7PW%xId-q
zlTqSjj(Nln at GRCU`@w=r)*_5-UZ;S;4&)^M8D1)^LoWPif*dr;?GKNT*vun=ks=*N
zxwUPQhb)Q4sVg!3;O=GKKd<NRAj&a6m9JZq-s}T4vCsFJUMsyDHu-lH_OzvoeE6vE
z<Hv?5%gzPOyi0vBcHYckH3$<|Y<A?uOoL%@U)#DP8R?V(<WmY3DK5W(wK=dOQ7C^$
za!(ve_Y^<HjI5qb$fjOiGeAB1QjDMo;S2YMZV9b!JZ+JzqZHh8NUht_SJp%o@x&w|
z6G+U`+wKw(OII7ncp>|)lV*o|pWHz1dOodjZFddI#aMxgqA5`LsULK3_`b%-C6p*4
z+704kK;!Ee`}d=JkEr^2WTZ_;z|94LZnt6nI_Q%_2zFZw>>$jbf(KejfbM;Ag`uO9
zAE at fd(;kV}F`wnUyC3{2hQ~v|-zkmp?c;Tyh~^djE|F9WeGziz`v~)D-9LpQYR0OE
zx&52Rvsi&YybWE+&W??QwJi%d15a{#c*?~fIGC=Ow{WYCj;y+1q1g%nHX(54-O6D(
zvZN{ZDjQd+M~YRf;<ngzUrvMcuA^hnk~~)Ni6LEQ%>`zUL_jpWxSUch5I#{!(UyP6
zF)CfsCh+bSGuN>z#iv(Ee)c`IWfcyb?zgBL)EO+?63L69auWy?NHJiqff}M*loV%F
z4&0zaWLGO{pqXcF_5%9HzsQ_pp3Hxiw2q69Nu_4luQGFVPPWmWJ8%t-|8cq{rC=>g
zr at 6v69#PB_!bJ?}OzC+yo4-8vt$P4F;uL^=w+OpnT%|g0Aj(&)04=3B(S*FCj`%mi
z<Yv&Zm>-o|7^Z4+I7;}t!@hbJr)5fHp8s^EV&g|nzr|@9_Ik!!vWDVhD)@7Iy$>((
zoDJ7Ig=k0aQ*)DVw60TTJmN%17%P#j{bQn$$s>CxviF&cT~t8(y~k_~4 at dzd6yF7O
zK_LGdR8>)9A}y`5vqG3Oi(osfJd?3hXJ31+l6$fB$tgbDSDD`!p4~*TXRT37yZGYI
z)Q-XtqvNoz<~s17fOzryoHHT?WU-$XId;>=fVPfSHG<%96IU`jYf2As0RJB--2)M{
zLG~j9z<W#(0EmmXQ9RBLalkIcbOamhxDW`vUnmjh7DLS_3DxnmPY--BaRQ}?*~-eB
zmTm}GfLebaQqB!r>ABZD3*=8d`qxOkM^_8uT`MdHQbShxev&9S`idL)qz772^VRa$
zV&U?ZeU*WMl)Y^Z^7dM+Eo=9%(R3N`5O>Mp&bLY>GnT7#!TF0{SAM5Djma9{^r0?!
zKxp#s8kJi%xt+JPF^~AVv?}d9I~vU15`0Omm<B9Rr0fKI#N5MBUWh<JQ~#m95P3Yu
zMf0Blu@P@Jnn|@UZTuH~IUPR`Swm>PT+`o(RYO%@F#PvjJ#3BfiGL`Gj!EuL)9llj
zqEJ8WZWXBQ1<7=SoE(A~7gV(bCc*|<GVo(uJ#RiuIJui^LS4w9^c^}T>k3Vphe`(@
ztE4;1u(j|{HHLO*t>#KyCuI at z)zT=xTfPgbbHG6s!7nTyF~YeX%V(ib=k5WLJ!k`J
zjGiUplBh9>k{awaly>?*a$wQd|3UsbrF3j~SIrTY1_m0%f}a?N`>@DkN!lvAwdD0)
z^dGHn>b}qcJ0X~5^u}~Q$W`uI)Zs}0)DwKDvQcyVjBqocVOg90f*sOP3CxtId#bUr
zky<L3im{($OlqlAw0~*k36)mjzdH^E{?(J#9m}XR9$#3%XV5|^y4Wb^q1NQfvR)ER
zFwEHe<c;nvU2h8B);~18@jP+6sm?UGq&JNwT#;eiHH2yD6~7OzHRMicY<a2D4mJP%
zb)gr3U^6g>*M(0%{D+$%36Q;5T-*jnxMH;L1yH@@9 at _(q`PrpX7j*4!mri7IFI9u|
zwMJ<mOlb?|&_IMwrMMS&Tp)tLAS;?BIjt!wRH^t)lur1EHss=BYblWX-neNFm2|<d
z53EZc#$ey|<>YIU!%kgIt9_0Ct}L<*Te_IUEZ~m*q9r&`!;pwFZ+D1=68qahu*sJ%
z6n%*pV&_X6jZ>1gx}mwOcHzkT*qf%DrkBPje_i==Cd at 0x%hZw%Oj!%qSw%w5QHgfi
z1L%XB3*ASMPLY5fJ7b$3oH68X&%AB#=`|c}Y#o~>raQkeNkl`~WId at 6b{7$j9F2ne
zcSk>dLbN(jbV*iJ#mx^~=k;mk2}d3Yw9^m8>fD=woX5k~I2a`O at Y+ZCR~+h1K?mD)
zjYU2b9y8#>&7UUUR`zLph~aZGW5kG0;7k^7svq$nNS at a^39yKMlad50=%zrFcNN22
zshgVps>g*fRSZXnYlV-j%(*8#Nn*iYMxzPls%5wlH08wbj9?WJ42aIp at FS*kIMn&-
zA6)YsZ%MZzRnKF0uacd;-LD}nr at F#}X3aGt_YH at tzb@8ImtKko>$p{Q8{La?5iB-d
zDkEsvro*!|_pV}A8YN}Cxw5KuJ5!>1jeqeGyK6!{q0?cm0|gA=R5BEamsTbPMXD+i
zfP6>LPu|@9361On0%YCd_w24okHpX#UPbLm5>WVEIqwYktg|Ej at d>j3`YJThwl*q8
zNi<+DRH8*^B3W`pckNvZ{`@@4@kK3KIPH_``YIM$^vMNSbvy<R5#grg5^2O2m{TPC
zWm<L&jL{IauYI=Yw8<%l8cY1U%%=QGwsk}ZTJrwdJXqQ1fKuT)=M>yY3Y|~@0Vyjy
zX4gwiwH6Y&TDE!XOX<^5FLr>XF=*c^qZD+E(LawjGw?b6O|3Fn9NaXTedPYlM!r55
zIIYT)RNKlZ_MQO9$ga=GjhfcvwRbn7r#qV;R}GPH#hOk~=8cFUgqIikn=C4NcZ2CV
z)Nk0_XoYg7FRP4yQRullq`%yL?Y3QcH8D=1_PelZoPn-r;3dd%2I!$!M2#tcSm at tc
z{Cm)FOGT78No<?2U~;f55N}%nC?^-oMqw%lI?BOXB4z6<h`~vDkPc31MTNfdtCFTZ
z#Fmx$=!1I=l&E`}s)~Q@@3A;v$<{hRVHO4<+_WcOZ-fLQ|Nhu5Wd4j>437^E`S(|W
z*kCm7$Nr6eZg>YR%iaZNG|%1V!}cL#sgh0u>nWIXvfNy4y~@VZ1=25l_dWOt^~~~b
zDWNg9TX%C&<MO{~+dPF2H_1`#*5wTbf3%6Vk%c>3Hvgf2r(O=AR#C5VyEZl8GYU;N
zRHt7XqsL}4{>6S_{|oN}g4-?OZH;^(%Z+~%@He``{pCJ2N1wB%O}U0$eLiSP%8bSf
zA#+{I%FDr)^^V&>NGhhmkaG`PjWM`C at a~wll^kBEjtmHD4YBHhbOLIyn%k-*s?||w
zDbRHbbHe0^7>@ru8K=~cmYU?FDKXn36Q!6~g!5KHjo0Xm@|Ymhg&0-TNftuk10_tT
zixEchq}Yl7Qp=Jaez>WGm=T&oY3r|S?9yM at 7O+pxH+|IZAP3GacNR at hYxUxvupd5%
z_`rT6%CE%z68Thw`IHj=mGRxEx7DPv`O`IYEO^akK;YkpQE#p}LPBZz8?fw8V`b3`
zILFP&?LmFhCnjiYf%%ZTXU~nfBh8~@pQ-ilU#kc$?%6EC7-ts*3ft#XV{@}r8krXI
z-;RXeo^VDrg&o6L`=cW8HRhL;va8DQWg=KVp-S3jaq8qIz>j?xNYvQNmWluSUQ#zo
zIakauhP5{lg8jqFn=&f>dm`?`c7z9&DXxbBsM=w6i0$HE;MC2M!c>0Fw+0qnDBFaQ
zBk%1}B_#^s4qlH%BUH?TK-{HFtVe>e+sLMAJqf6qI41y~fHf2z;i|k>N9)IC0vhm&
zA3y8{;6?Q^phl2N`(s(C at 9N6)gFutSc3ieio4R*{+8XgzF7C|FPE-3$glQ}f?*SIr
zlwAYW83-{?K?$EL^<*mN{_2-|3tHR{olvaVBy-MYZ-h0A^CvFS`-&tgLjz;9#Cm&3
zNg0EUmMnT7+%LbybWvjRVWWbRmcnTU5M^?WodQHOFp!5u8dSrn2YuoSeb{DG04F?J
zREXUn?D!`koG<J61p^Fc?mtmV;(X~*LY at RRY?twq71;%lo2-gR?CD==+5ylfp83C@
zq6l7x6tjc=1i7C1?2ay8ZJ*^@A&<-tOP@A=MNo5`qB3J+o2&Oy%w9Blm1{Yrm1`$s
z_7Pp;#$-M20NQT(4`&GPZZAxIlK8$)*gJL?Abr-Hd03UJ)4q*4aU4c3(cJNzpag!Y
zX*L!n8Z|=HT!!(MYC9LUFvY>lyf_VmX#6*Kv8zFfUA;p`vuNBM%H!KPp37Wb=8pxT
z2OIVWx~J2emB-$$pAA*57TIU$pMtSXhq at uWhR?k~^3&AQ1y7RK>5s at Q)~CW4_*ZxN
zKDS;ZsT=^^N0d3n7ZKi{8&O1r?}xm)a^-!3nwt0ITq3<SB`%_fq?7-4#XllQJ3l~7
ziCw>N5{8mMnk%CA5lW!p%=qI`-uJ&{$!;&*bbm=rG6TjA$9GQ|g}_iSK^0EZ>TjlU
zArvn-9{)2lBtqh0zZ(Jym+<_^xZXAL+g#7K>0<VF)%a85^))>jjrp{PAC+Bwrvsi1
zyn?$lfWMbXdgD_*#r$VZ32lQT`gVJEeBbV#cumil9oag_u8>@KxxMWg6ws^s%hi+e
zE4?x~2T8DMO|dSz9?`+&NQ#E#N~SMfMP3N1`sS%;o?fyI8(dykWte}FEzTWJ-HIl~
zSyQ<KOp$9wSFB6za2&#5!)f-?1Exn>l<GRS`MV3s?v*n|+<}{ye|o&vwm5I{IJG{M
zkKOT?XelmADt;iA|B1IpLORV|WsVgUq>ctv!C<9}dWW}jYJ7%q5>DYG)KfEyLf&sU
zwRZn)obG2|Jc7gm<ArYql~eC+uvV@X)?(aAwB%>LmYdP1 at 28cU5Y{w7?Y)sZj-jhd
zTw1H6=L^gUiqX2hX?wFWLu3R(%IJcy4%SW<vq2PW_hRxe8(r>z;n+xp-4EY=)FD at H
zm;Hopy5qkEOzwYkYN?k3b_iwpR71A=-a&RyD$&50H;tK`7*3zrejkvEW+D}5j~TAY
zmzx;T9W#49_wv`wV at nF6;3eicDKrO5m|)Gf+l$TMA1WKc0fLl1GuVazt`L8ZSH>7f
z!C{O0`Mt0&_oLYn)ZyPUShvv-jd2Qwz**p(HV;KU at yg@)wCE?n;=IONJcFZ`^jQ9}
z6n=vHNIe+Mg9feXxBWGX_&cC3x%!(pyCzYgg_xK?Y4XM8q#~t$fo?jFZGF<aJu4I)
zbUx_G<$~$Y##M`XnqZ0bx}CBcFQ9<IK;3ErWsZ%=u>0jXKFq at l$<i^J at a$*aAJuqf
zbCq-lnzx;wM+l at 5&8wlqvY%BxCI@edckfbah>S8?<2i5Z(_tUO8&xXxdSCefC`Y+k
zt<Yfb;zG@NwCxkP29-ba(rOHRAi#!+0SevQp^3PYwe$1$o5Y_AT37?Ht)&a)2Hr1H
zynSH`C01fJsr4=}&K^W+1uTr<LjBoLMk&Zdw~y+GMtjxVb7=m$l&kFRqKw*y5t85G
z^<*$ndSMQ3IDmt;Wex^z@`1x!s0O_h{ed8SDJ~^5vPw8NNYB@<pI%hTljj-&xNe7>
z)(RAKT-L~_Vu&ot&wvv{LE%7qq;@sx_Q>0O!6n#-MwQr8 at 8OL|U%z!}l)K0GCx-EI
zUr^jMEO<KZhoR|rY8(fFVt3|%by_Ax#C$eH9_pYpG6{*uHdkwUCL(#UZDVA1>)C!b
zWBBm?=;KHZMF^aI;5#sUt=o>OwqT>>cYA8Jg$@3zmWJ1r>82UY$Ivx=8}bk2q?(hD
z^>yPOssJ;GIaU*8V(S3o>RCzG%Dv!En6RjYj01Rf&<0(Y`ULDfmiVxpt1;UKoVGe9
ztPD{SCreTSeaM~yFvG;WHnrB*;p@DPiL}X56+8ugVF5>EFvQ0>yc`N0*T-eX!X!XK
zRz;?E&+9$ePB~BBd at +&6;=R?R>7$0l^Nh5b-+QZ`-p!=lZPgCp?HRw^PLE?+=fVO_
zx)I=Y14CHa$Z(q8A(oT_VFxni7 at d5h#%<oIo?PuE(uU#-`d3C&N<NJH8^QQO{71IU
zd;^e<@tbs@K&xl|c9%AH_1_a^S`}zq$Va_~BdZ6K?=A7jsb38tnbH-57>T8%S|u;B
z$bi8Zx8p}99`wSw`Pr167I~MDMTDe0`#A0;v3w%1+;QfJL?(D!CZbK$MR9tH;KS(*
zsbiHR?YZND at ZgmHC)1|q9idK!Lz{kFU#nwtbkeD;d1pd-68cP|{pG9m>eqB&E at dy6
z5$f!6<9ZD(H(XZss5Y^?6+8(1LfYXZ<QhWo@ffFZMB1;V*?!w)+0pNlQge><u*9^{
znCbRSza`S8a;%BxFHxw^7!mY|r6r`te&0=*h{-Nk$zVE%p`&`cIy*hmUKiDG9OUc_
zfoI-mtDHehe{H@C@l^$kyr1j_O+O_tDBL_-Z&e>%hL5}8fA*;r(vO16T;#@O(0y6o
z<adsw{?z)(XMkV8FM9beFW5D`NwuAo;=l-I;f@%Ilu6JnWG{^=LTpitgPIhAA=3zL
zH$}7NTqU<KGB9HpZaP+daPp2o7Vextz$mzb!UW9O&Rdo$d%f!RcSb$TfFH`7SLbrk
zCy)Q-0|{Qapkp(Yw(}GymmOp@7TF>(wQDDQ%poJDW_cY<^An^!W!+|I at zfjmHybht
ziD+)s^MtXk$*OxJYRKX)SPov*6iMFOV74ffU&Db8sRJh@aQs((yu+^1hdw<Zd?Qy@
z)`NtpqZ0~ulOoa7t1_ouZMWJ4css}?15qHZ%2(awW~BMo4B-H3=&I7m&;cd}UT`Iz
zjw%*Ks49vUl1T{hO)vvz55ohOeVY*ulfns}8T`=e2Yxsa$;2rYj*;MM)t*sDZL=cg
z3kCz<ocbj2d?(+gh`+a+a4YWbu(f-}0PgW+^JSYk-Y>UtS*=R1SL_FY%#Ulr>(3bo
z0Vfznrst_ at lV@U_%^}cABFef==B5v>A4e(qcX2}U?w9SOhh!5fC*cO*@SfZtJWx2u
zbp7`u?t at 8JWq%o<YFp`ivL(Qz0g5aE8JS)kGW0dy&ABKS1w+3N at _kTgNJ)k7KBLcC
zbUn#@Y|rwNT<(CDh9_8%eys at 8bM{vNQAjYLr%Eucz-jJcBi}}VQ6C at A5Lf6hH)Al&
zpB5g9H%3<dtw|GL!Mv|r^;o4f0+A#naZ3wg3f?%IC|R*bNT2xF?fFwfC@U>1zxaZh
zGL{DSP3+_NCdeYtPegpI^Y_}owVK{5E)x at 1T^UV1)W{%M?vJlyMh=CMRr-cMrj?jh
zF_B2myseF|u|#@n9}r-Jtr-;YSvs#jH}fRwj0aq+iG|J2v-j`%8NtaNy5pmNza*F!
zl|Pha_(&=t6$#Ui?>~U9-+SGVM5(y~Z+%rfV at ruLyn#i)OU`S{0V8#`5qxlaYze{D
z`TlswZz+5}ISP!eN-arzLswud8Dg4;^57rA)$Q*JD=ZaSle`ia8<Cw5D`b-ujnm)3
z=T@ReJMsSSt*atZ_bPa=4o4Y<!O-VU{;Lmmx>Z+yIQjO*X4Y+=wisC=kdK+2ui at t3
zqyNIg6d=EFOlR{X9{cUzM1b=Xw>Ozl5M`Yrnn{fITw4w4azvWjFGNe+BX1b+>*=PA
z&ji!$C|`WEKL&gv&Wh+s)_&ZhW5s!x6U;xamw7_d?Q0CUu{)fIuP=S}HVQ{+Vj*w0
zMOJ#$Ye?$XB|1SU!kSaBx$)oR3P;v~?s^({6>s9;Q+ZTF0vF#6)on}T%;E12K37zX
z9hchHIS3UW8 at i0>*+{KLm`pehZ)oNH8E>F>hLU~}<sU)FiV`dOC&%jrd0c4xSNCG-
z*5K||T$lM{X?PQ>bonnL)o1^5h3{(f*@qn(m94Fxy7{?6*u>>ei7t)F7RUsRTDI2_
zFS3oFlp6 at Vv=XY_$S_Y;7GeC*=S+T at WE!&7P=0q)$X9A)-=oo+H*&e{XLr?PGmMdF
z=dJN?lyIb^<10A*SULq&sGB8aup|#dkl&Kb-BLbe!JeJXP)_aq(v<jPqUn0CNn8;|
zfF6Qz#hBzN^U=V0u3~_T5a^~T1iTU{U@MeoUk~*$24mdFs97f$`cDjOgt8W{A8i0c
z_sj)n*F6kYBI9%|q6f0=O{DQ!KIOIV>fo5fUb_{TpTGBmT2XX=HmO&QE-}ZFGFpKZ
zq!43b1UgOhR5H%4Zl}>us4R+k<?YVo^~>Jdtl1$~5xxxQ$6PeOjbfes`-rk>t;9A$
zUYL6N$91bj1aW3bW|nK8{_8J&8{zISF!atbCg&iXXRQ>>DwT#t-I_#CW{YSJefvn1
z`JKCGVJ=I(cuTuQja|VRxpT3M{#|G4rErguG)d at hTWUJT1>21TbIXlAx4Fgh1IT)f
zF2p+RJI=y|><1-ziEzcTkTDg_M~OzMNCYc3znw6cDz_eoVBf!$+^rZ?t#`@u73BoT
zOLD_5(syBCR3UP6T2F6pc8%IVoIY;|f@G@cj(<H3*~iuU`rc3>nx8LU)8hgo40gZG
z^w=9ayJLx@)#8hgw`R~I`-lMc5jq1l$_H!bsEj>5B0YQuS*-n;E3*!V=cg9MXmFm2
z9nitO*m7kAOR$Ao%+pw at -#W^!;jNu~;&_U~lU&pyJa43*P5y*BHv5?UD|iffKi{&9
zk|w_AHV&dZ|Ea9O$yvOuRr`rZ)c@%LbWB*{d_!LZR$1mhj!P6dSb`nRowgdx-I&n5
zq-FCM@)L}~hpfAvItNwmW9d?eL*7MjXcIkF-B6opjTU6Y1xLeQ`_e{&F&EGZk&2~p
zoN)xeE^B2=78`%oxgHoL><s;oan_>ww}Io)&3OQGMzsp8b(opvGc!L=eU7uQii%ac
zz)gGe-qfuX*`xcPcB~68pifREW<+GJGd8l)u;rQ_7U81ntr4Kx>8Dk#GH=O<$sY#t
zqF;H~>dd-h!6(q;I(N at C=EKZ?9u)5X{GS%cTV8usfUlFl%)7A_>QwZ<_C7NE)J4@?
zP9Hy_Uw+=0@;k2SVdu9hkp7uOMExxOxUJGPvLe7Ay>w}eCTesOh1+$7z%i)e$miC_
z`&j}~j7q|(Psdd6U9zOb<7(saiN7>FWN;p|44x<u0gdfFMf$Ew at C%XP-oGPK|GN@0
z&L+V4{j}A)=1lGA)5NGj9kO=^w5h2hW`I=|@-6tDlE`|dwTaO_Jn#r{(|S@`*DZAV
ze!lHPuMN2JTnlC5aOSfp1+>=spJm*No-`$=42HW0az5{m`SBYjY@*u-(v}bwl#uuO
zSNlGn0Ab|&Cd~wRmCTK<Av7G@&wc<25saB9ynM8)YBiTaa6BwzFowH#7rm<T-c4fo
zd`@7(#^O2D@3dC#W`6|a)m7~ARTDLZWzb=rHiUKO*N=t^3`Efxd=h9C)xb7Ac=SuY
zZd2Ly&RY4-l-!#8RUd1v74Tgz=I0<Qkc3Be6(O>c?^E`$_j50X&j+_QiT(|VonC5R
zCNTo==(<LUd8=97g9)DTt=X>hh^)T6Q0#N|H_CalRQBeFL`)Xt-?hIKD;gdr-)*;q
z!!XMT%0qiFzgqsfHk2iOdt?pY8VFS5GJ3Znw?VJ=rpA&{tra1M&#9bb3&rI1=ztg4
ze9u<jeoq_JB5VJ<qimfeB~RVcVsCSERH0LTGZvM;c at z2zX^gNd@ph?C*?JQ>rZ|JU
zHRvc`x6XG^q*WexFoh6?OYreK|4^80lk-%Clt^h}SM!;Trtgf%JqwT$)t_6Ow<s=#
z)v2$414>)*2lFS|oq$#C$cMG$0(Gf%45L=RJqGl@;T!X-uyN2cqJzXdGG#p7Q?py=
zJvQ|R*zS%zL#lE29{~CB&n`Gglk=Kfa)52&11PZOap_0uocZ{}ie8Inp8T)&3I<g2
z)Sjy7Hvt=W+?WU{-sKjmTlPXBiy9T{x|8g(9?^Ti<uew7&x?&|1WYN$Q at z6@$|CX}
zEf`^7(3Iuwu;tUfFyBU|NP5Z;!DL1i|JC<5;U0y46WSx%`uZgPb}wA;Ln|jPTtT;1
zXF{5Q0EdqV|Ab<56np{F_M5iXC$SgLCtH1C^yRajSapvkxOG7!gqI2SZ)vt^MC^W@
z at NEZta(C8Nz@N@ZTlNyMtgm`?d)`Omu7%<0Rc$ogh$JT!-?wt*$FSe?mp(WUwR?gC
zS55CejyLIjd-sQ!p|R>-FC+!okhjK9h+mnT{@7sbO|7 at c=#~swzpoj!PUYJ?9Ws9S
za5_R%I!>+{^}ft^eB%B`_&OSb3<p3|V|w{9lWJ at fSc+|GUbPZ~Y)g}6&qA8?!nc|H
zO|(;##`ob+NOA=9Y%QCxH%1rj15ZL|MX0&$B0s at USsT<i?rAIhAxa@4Ye95=pFHdX
z7eG`^Xe$5NGfZ?ZAxyDHtlhwkg_a=lkth9KEyD;e!g=v^N$^0Q#SrM3i~ofhG0072
zVXSl+p~70rHVSx73w+=^fPSBF+U?W$2r+&#)qu?%goeW=5<xw=Sl^VEv!&6MRmW?7
zzif{PN3*V&4LZl=iSbxAt>>R*7N-H*W%oAgH$92p1cj_>ddYMHq)`1k93pi?0%iGB
z72q0e8Z4zVFv~8btrGf!b-?|?PB^@OgHVPI4ns}6ou&Asp$0(k4sZ@{i<jR at uOX7L
zXX_NTtR;Hl^AIuVylL@YJ(Z>`bE-Cq1eP8hxf<g~xuRGT`_B_$+c&D~%ay6!P@Ak-
z-9z27!jJ!CH>ioA1~hIT08<TU3X?+${6U21nqf?u&z0ZW^z=722tYoY^d^-_?DuA|
zYo>i0h0 at c-ojo&xD>vC^-+hIy#qa0f|Je59`(Ao;0J_9Ws~T#80+tE`+T2Y>@Wi;i
zKOgIn-9U_wiQk4PcK!P&)OOlUrd at M@f3{S90I_|aehTy~F!$$ATX=dnciB3l7h3-|
z<UT{PQ at wv9N$ze)a{=(EYvY%|HZezhWj`sE<NLb!c4ixr^N9zBl#I`2MLS*`K9p&C
zvw at q3Wb|eFH;7A4-{Bu<Y%FnPv9OD3xIa*G05prG?3NfypT5kF(bWt8sCejjo2;%4
z-AK2?B)v7`{)lMM_C3prB at uK)vISZev!XRqM!9w;p=1iIoNW(%Alc at bWA(lG_qxsc
ODtb`4@y@v!5$-=D(bw1j

literal 45185
zcmYIvWmFVg5H?avgCHS|lnT<#0s;!sB1$)cbax6%w}N!1bayT(-CavA%`Umb?tbsr
zKb~{$nfuJScjm{O^V~bb6oZF{e5Ck*iRI>OZ{}vr<L&H#afZ}OU>mt(50|o&9wZeK
z<n5i1`nUbm65Nj^Vt5c2!ia+x@}3Oy^?O2=OWB`!7u9?X9a(-8KmpsM^TYGVO7@n~
z@=>7Ax#xKsdjBB-y^G!sLJU8cpgPbuL61!67W5kWIsttYgknN(p>@&l9uzP74h;`N
z=AwDgx#<1>mJc%M-KSyn-4>D>eW`(7kU<@7p(=u&9)nQBJ!szMpgWVN-Jm-e<Zcie
z{SbsQIk{>XzS{oJS>|ah2x+oJ?G^wxL0!ophtV*m<Cx-ZgcEwA=Rf}k=!5xRUes_9
zDiwXLah7f2chd8p%OfwktUK*E27T1?u=F44wuSqw3VmCHe#%|VHCl^7U)P{-w@?NF
zaC=@<L=f`gzi7I<TbHQOH$CW<p#K7aKI~|kJUOB7Wl(E9sNsj5u5QHEQv at 23i?;BC
zR&^mR(3$`7nn-V|y8pB7%b-t!P)oNxk3i`J85kT4f&L!=K)J*J2UC6j*9e9C`12wD
zHyD|S0{<8OA8+{o(*QsbU+y&|+%2DJtX?`tn&t@@NKLfKg-SuG$V1w%e=MDWz*D=a
z6vo9Z5B*Y$9#t|YyOjw6K~LVm<F&vi-bYi|m2-l+1F~#*ZKCh<`{iK7PxF9OCaa~#
z|9Puez|sWS_F|Bp4z^i@*)I5||372Rfa%2jVwm?d&h8*{qP24k4HC|M1p@c*uPhL>
z)EjViE&$a7t$xwN43WFRGCupHH~|H#DA9SS?F14G*(w>WGC5y<-&&>W3>A+sNa%Qs
z1iL}KP|t{}4bXmcsHvvm$Nx?bVr7h-|DoqMZ&~T_Ihz$13iL)1k&0YjiN5cLAp8I4
z{`y-e8L<cr-?c*Jx9{f^WUu&w(g3NXq^PF0YSBlL>et~^W0-B5N*Y{90?qVCKAz7@
zx2ArU`?DA2&T6>5Y`RQv_y^ujy@@9<g!I54IHG&6(^sfXPY76xuf8(Gu{~Q!Qh_j*
z5Wl?D@%kLN)mbDQL>3a-hd{^*e|ano;zKM!z{5J3Z>K#VV6~iYBtkZ(LFsFJDXezV
ztyeKk#a98q*2?gNwVvu(NCW__FU|yqys|$WW}uB>e<65YMEs7%aC@RB8~|sU?WGpB
zLBJrn`1WxE=gId~%gP5ePB^3Lnx1gVL7T{_&ho&&NhT*-9s8iC)r<G48egbUx|QAA
zov=_M{viZUG6D>_syPBde2-fi#cRS$9|^R|BWQj at Y@I!JE^ZQX43jYk(#ih-m at Lo6
zfS(HRn7 at G`=BN!RSwnqMBnk|Xlu60C-DsMr*QGLiAyHkVYa|JyFJX&eS42^i-U1#g
zx<P=bx_b+9LY^;w4PF__01?m~@C0=hHrpFlwU1z+_eapvuSPqItz0NumsCU5)-dQn
z^H~Uwe5J5*RoOWcQMXp9lYuIEQzhFEJ*#ZX<3_}ew%D2bd at E1V%MqCF;l}MKXltu<
zu^WMK@)XDB_ceT&Lz3?G_ekRA&)s2|g{hrfxu{s6n&v~}J|*(w74rxqnQ=OPZeS!B
zC%KaaisCvveY@tpwwO_F>k8-B1*|g>p|*j#!HD-tS~~AePGf9nRDCB^eS2f36Pxe1
zQppV4M)`#hZ*kXTkiv{?jTG1xRVW#nCn<|_J|oGxFxPmOC6CmpIhR+YK$?tMn52WU
zceTZw0$q5i!Y%SCUw7SAHpzu&95mox4xO!y?ZA=Y)_pRCjfK=T{qZSZT;=XcYF5SI
zXA7bL|IwjwW^m4V{k!gC#2`z-^4B@4P^g!wbHn$J<x3+>eqtEk<G$m>C7`heEe-U(
z$h2#0Z?4Rw=HnvHF at fjVNy~F<pHqlcM-H1Yn_I(#1Z+(gbu8exVRzW!8RT-dtvq>l
z%l}n?Gw<3NQ!N_q`5!NZuB-Jo@>WDu at D#(qWk<{q*Z^sObXoilpm)wzD(TL!0SEWr
zn}4tNl>)@&_)w-WD0z1@{p7>3&h)$LxIfj(+RO|cd*EQKCLRR|NuyP7ee6D>m&HcY
zWt(kEYC*SQllW6d>TGgh+vWzL6_H5lthY%I4|jh=p1$$D#%HQhZ&p_^iQlu9w at q>Q
zH>jSu*QVTOMivU-QqTyaja^M<dPkXa0(<3;5j%YC$or2<`<OUqbxowohT>2D{hmbL
z^`c+EL$>XH4;ksEU#--~37wvBwUt=|s^1}x516!XL)zT*e_H=CeVCu7OMV}_U$-zR
zCM|VVSuLZKkWp&Kd&#^oSQ^)zLZU;|7bC#d!_*b{2!oKa`6t8cv=pG=IL|ff==OJG
zAO8 at 7NGRf_+!PF^|A51r-p~DX5hlld&-C>TO_kcxqX(m*9p7RP_!FhSL#HiM;7cmx
zU+H at o<Xc3-Er&<YOyyCu;XsS}sq*t;WJlo2pXnT_%BK|)wHMCO$N492zUSZ6&<)wY
zscFir`pyJR-L$QBd0S|9B_<O%wO~9x$n4oZ8Dd=V?HC8GP6Mp6$Up-YuyM*t=u!b>
zAWA>!9btU6q|f;0)kOZVe{Y)JO~RS+3W2x}@1geKR^&?drdd!hpvBEVPtw|){{_2C
z8~?#64c^)cw@=(PBOES{Hl6lF=nl(C?wxS-IKbXCnJhE7`x4|ErP-%uow<_%Ij4VK
zPwDjQhh)8Gz1CltOCFmWYQl%{?tw__fd=IEGE~3Us|cF&h!}5#w2ha0Do%c&K(eQ>
z!SIjKLq+*p-m0rH##=vUM#41H7f}&<Co~64C;vdYFgXe`Z|5e$SGYfTUi#NxMt$>I
zA`861mk_7AD;-SfJJTZPBFzvVVdJ@@Hbd at -Zm9<H61k2>BpLk}!%T2{KXNqFC(Pl(
zP~^a=E>@IZu#vdnk<H@PfBEuwXRbcKc%7pCCv3;J&wlD4!AkoMlay!uD_Z|$UHeS-
z6rE*w<yjwx9U`t4VMWuq)aO}I^(N<(ClTgCw;ferNt4g=!85;Rj#&<DdiP%4dr)`6
zJm2C7J`e?$aL41%6k2FK+39T=u=9Y|uc{Z>eX*$UO^^Q~^lc!+hs9&U=^IB61F48?
z at ZX0+w>qUw&e<Z%`+}cRbxY0dull?+m}4_&alOfGp$oSd8uFplRCU<+@_()x{Uuq<
zCYX$OWH<H<YG;kD_5c&d3m4hktK!L1-eC|Y;UT~OQZTE?VH3msxj-x_XQg`wOyN_z
z(Ea5H<_XO#ICxm>neoKt^KMC8kKjpnO$usB4f)23iB}qPZ+uyZ9F1z7C;QJZ8EjRt
z9ZsBGR7PlHGbe9&`#~9(8!JIRvS+wI0_k2*Lw(EGzQtDI;lJ$EyXk!$Ew1=+{Kz0i
z_udxMMoS80UJ;aUsn#E={gW7Nh>|(V3hmy{2~;=evAx%4?|3gtJF)HjsIGOfFtNI(
zV7=e}m`e|uKRoHr!{HWu|IwY at JjZ=DZzNU at 80*peA}#1cIQD@{#Xf76`La5T7(yM_
z3rd!#qlKOQ8RN>NfmI}xiXtaSy>JlHrjD(z3?k&F(WU)vNA{6f)TYP*F_uk)CS$Bb
z6J8z}gaPP?l)ikVvtJ`~o{HfZvZZDPFn$O)3VV&)K34ioYx|IhtaWw$+?}sKg*e@=
zZNn`0wcI||)y~y_^}StU!fR0gD$8 at 0GPpEA*v{s|xCb9WQbWUnut{%CV>L1l?;8b2
zb5k7(#Bx5F)DB=P9Ywo1am>raA;T}8)Ba0m6zY7;^VD-tnpI?|lK(zN`Px#ubQAOG
zcJJ;eRjT<}3C$aC_#zG|k0*{s^g-m#@nq;1o)%qy^c)N_M7R?NJ5LOTh_Z;PQa@}m
ze83rN4_FBTU*3Fi!Es0r_6o03iwuK-*9OC@PX%$Nd~#S(e5vb5XI;9FQ0}p1qZ~w7
ztOsAmFG~qt+D2fh+jIOr<seif4r(NWTKkK?7ty9)O!0H0(+c`Y?+~ix)w_F7e%Y<+
z$DgHlBWV?=Ni%1=lYI{bzmop?g7+Sxdh2hShNfdvsJ(t(y(KPu*33cLbi!t0?i^N)
z-1+>8iN><>gJTK_5QCUa_HoG4HQ+%IW;$qQKU72*mK?S?WK-y0xCojxO2SaL6=$t6
zi948jgJCpyGSphC!>EeeC%- at TX>%&uNUTV{A-8)^SMBXGV6Jq7k6$0juVYzRQ&Z&?
zjq}hZ!Lk at Kc2jE@o9aVPy2{vu`Fo39gwYW70=Rs<MH`hWN%%-RtFH7@^jM}Q=9TNq
z%<{ECfr$9ANtaWnuR+a)o$Y6ZFP~>ftd57VQ03AJFR{qG3-jAroNdmED|vWv7NIaf
zT<W~T-u|oIjp+kQ{XNiNt|#m^88`$JjHvRS-V4}`)cJ1xj>hZL&2KC_{>SCT3!f}U
zmnBCB#J{uA^*Q&{r5Wih4!=@#BAK{Z={f!L!_qeuqIjN+X`EAD-Myx31up1wOJQa@
z*Z18c7VZm)1$K6xhieKbzDj;J$4+!U%|IvVivahZ*8EMM01$J8!|u;m*cz^w<J|Gy
zwI4Liz^4mrqck_2sr}Be0s+)9A-2$(iK6=a4}yx`7;)78%H2M?_kt|PBs;R#kT#%;
z87(*nw@n33^r~B3lI522*<U>UtN-VSgr8nUTruwl5MHR&XE<#K#E04aZbsaO9h)}v
zIGs?MO#TVX at Y18~PJA)xt at DE4I&J9o=7@v7)JFC4HX<FK)BL0AD4TjIE&7MBgwxT%
zb&Fxp!x6>ai^TfM#$}dTYJ_}@bDjEeI1a039?Ue=OH<>WBRpX+?;v1^!O$l0$~3B%
z at XB;;fL_VzDz*g}H<fbyblJ+~;IPrY`f}ZeBu3Rr_Ind8>W2Q?3Rm(=Xd2q=nQI^0
z%q2t}h*#sw7*nN9^_Ai9rjA?ti&&|wFist1EN0?AI2<QJ?*49&`M|%{%d|s1lfuRx
zQU1r)Br8{iTf_s_9AYycCIU8vt!owq9g!DOHmTgX%ekzYDf;zqZdm}d*ZdNN3(^AZ
zCsjjl>S`2*+$6;F8{K{y*%W`zJSokM6QB%Lh#g#WgWQ;9%sxl4-I)#5G`_kD>=}NT
z_mWH9dIpM#CZ+)m1O)`O2(G>As3Ynfl()fhR?pxkOdd*A_10%>+}JQ<Gn)$eTN>;l
zx_sukRu=FQ`}eay at 8sS_yUXr}daH_WitGA{&5 at pB&UlT7g(o8WR2`&Nd(7T+mNyjC
z?-r~s;Q5%X$)&&IBfwc;amCtJ5OM91!WC5s{WmomZam$kmqtd=<j_95fXXYdgLBpE
zwB=ESOHNu=<&T*nF=N;Xk^;Q`)SLa=sO8|5_i22FTM875J>^ij!qj=-ollg6$_9m+
z4+=IeCp=@^lRgXaZT$t%`F*3vk_pH54nPLj2<a~69&=xK?Z{pd6$H`p-rPd>lWLXb
zob;aOEk7DGb2bfQUbKvN8EYH7#Ry*yrlpQGODy?Wzu)iM{s$wVPku at J6R5!9)C((8
zrv_K at tR)%-;VDr(32fSWvvmTsJ)@+`WRM8b{!`4W&|mwHC#pzU^KddLk6Fvy<tfgB
zpUCAyHP@C=9%g}O<Irwg$5e&8HPxYFl5Kdt2!AfZS8YeAgh&6?7h|VA1LpJ8C5neu
zA~A-TXV;$o*&lRy!^DFpJc)NDwMPzAmp^4Z24-|{K-<*ZE9la*D~kKajc6Lv6x#PY
zL{^pNXxVv0ScJ|L($+klggemD!w)4}7$CaWlj>JzP0wGX9~CXNyy4 at 2xuPAuQ^3$q
zJa4zPkgMR(naY+mgdQYP at uYV?MTBi-A8L at bbOgJUHfIyY$@Wag*R`138vk<^+j_%s
z(Oh3*8=*C9<RL1|L~jmn_8OcS_~i&odlrYOkF^_3GCxqu_dFOTAPQI-{BS5DrbqQw
znU=kKGGc2C)O*N@UeiOj;GsH&W_=}BG%$mIp}94}y6vpZuPd4t>>gRG*)3ul*xn}1
zj)tzyVL5N{yQ;(qr2OlshdSc9Lp23-WyKiRCu)C44tI}t!(D#5IL+&h=gBz-i}SC#
zf-&)LZOuVBLl!qh&lpeh?>BwJRVp-6bc(D06K>^AG)qmswxzF&X6+1&H1u8Nqh`mV
zvrjBNiH}Ye^Ne1k at I}xuO;1v-U?9OpHiV%By5jP7xHe=J5gw+pJD+ysh#+5M3b(V+
zkx)lZ&5DE&bo8k&(M}dUj<E1{J$DLj0G_d?Ho!L{lK5D=ntK4G3_3g30&EAEF~;^h
zBQ4iUYR>LB at R{>`<RGJnB0>%0xOZ7Ptlf+qsbUy2yvV)%a9|tD<^r&B9$969c|4sd
z`*jq50?5fNb*u0@EGH+2KL(N%{$>cNzT%o^>m{%|PIwMduy9wW3#%p&O25Ti0*rt7
zhJz%MNn8CWA;`f^vy1u0B30ijGXp?=!9V<T!q;lHSo<kcYwaH$o>6Q2G9QX(JZWqv
z^Dm(%X^YP5={J9L8fvY2ex5`v8BEPUr|ygz?>qH<cX&L|0jbnKf*!tyl3X<8HemXk
z((U~II#F3F9EGzjpnhgGcG^D#uWzq;7yX^;2Udu)1<j^`#4>D2c6ris_z^1vu5$oF
zOzklwhWQ1@)~nH79op1me4&0})l0`4o7b(7 at 0H{^$mt!hTt9$49MICl)r{~oRULRf
z2MHu8zTjc9Oi|AP8jEXe;mk^GaA&G}D%+AtaBiL@=6W-_`yT7zEw<QP5!ceCBMdc(
zZrt2B|L)v-Z#nk70Nn)PZ;7MasYs)B?8ys;3j_`5--{hx$S}-SZMOIF7G+y4SucsF
zk?_}Y;2Msee&2!y>u#4iWHCf}q*84a?M9+Y7KGgz-G{u5hSkQ7p##kSWPa$#O~KtF
zAKvxYVH)JZssnr6!v0vS<wgBeR$^Iu<#fg*&6uziNDguU<Lde)8MS(>XtO>klp9q3
zT^ii?_)=q7HE8S;WucPj9DHUo^?CDlSE!!4=sh at 5NP92ai(v4v8!J&~zk9>OfCFc2
zS{1m at TlhXc-Z*9g at Tg>PG*$`S8ydB7(AD80YRnBdov38CFq+W$vn8xf8 at l>27Pe~j
z$8&3yW*^G`X{?%%sveQs(Qx#}i-6MueK>t4H%NK$P9v;B%Y^t<JA-1EzPq;)xZKU`
zo#O2r<-jH9T|fl422RKqHy9H=h1w+Cvp?bFNJJZ#vGE?F(BaNyPu2S{9vxUY1ev&k
z{KMrF4{q(0L+e|ySDa|^&X-r)R+qmueBe<0bGx8_PYr{#>F=`a$X0`>OHp+bZ at yu#
z7y<Uc_?W2+kE;(53z5i|R41Pw&ms3N4|*HApWlB0WK-&itOny6>9?HgBhI0Y?^}KU
zOoq~Wv6(cDz=5r0Eq(Y$d3p&F!{**bR4pj!H(K^FR>G1)p at aOK*Lr3V7LvdHYiOR>
zfvq{qjxwTEp;d<T!hZ?fOQ|l1qa$f=`#ui=;kfjbwe}4yY8zQL?6H4}Yo(+#w?B~#
z+e6R2e?gsLvg3SC3+2mu7#&+vTJ4#OgY!a{4K*Ltbf%)*2JY=!+gdHX_~cC-Ala22
ziiNC(?#}jpLU)6a4CXDoT`i(|+=0}jIT@s*L6#Jnf6Qc$zmihypCD{+EqD_+^(=a#
z#*pINfXoBB`RtBGlG6TB9wmnP7goA0T*tL%uY$h+(H!p1oXKTkc;tAsS5B5>gEfBc
z=2&PwJ+OD=S~t;~&9Yt(Nwss&o}sP`2OoqOwVBfJH+!l%EV$zZK57y<COA3FNpF6o
ziM*j8k{#Fmr{8P_p5+LN(aM<mEGDt4;gk3gpfEsGx~HAFedhV1KGQhv;@P<_w;R$q
zqt7R7m4>44n at aLV6h)=~IJQH%8j!R(^f9ZAvZm$|l7`=AB`oKZJ({9p at Dp)v#wNGN
zUFXOsO#6h-Xh=P$bnEploRG#8F7!@@n^fJ7w83Nh-I+$Ad2#Wl<)fw(D5w2T8vQj5
zQJPI0^Kjg6z(Sm8R*@>UTKgH(jtfpkW`6dm@(_o^b$6oXM2kCd(VAubs;dK!LXS3O
z?5-?l502IfcjE0PmrwXU+66VOT5R!b-bhWN`njC~iTQ~mcMrG|aJI!;<6WUUjj}NB
zZ|RM$zB$c2Y7M1B;Q-5$S9zri%tY7kroVf3y at X;9vq}mQ&B(CKrt{zdH)_8_K8jXy
z5H0@rA<2e%``0AXSo=}DC53RTh_i!xT3ZW%mTjj0arV+A`JYy7z?-()WJVd=s7nyd
zH927rn#h*)DksLlqgtTRPa;85>RHZ-7^T>Zqb$Q~VV3#ExJUku(c%d)N6~!G2w3}x
zyW?viZMHFn+K#c at 5b91otJD6p%kP#%)y~~o9zBbdNA5b_Jo?o!kH at j;Z8o#Z^=#_R
zan#8!F5)|M5drT4?W8(~osMT=8^B03r*4oST3Zy$_$&p&SCG}ZKx+v*ZO)qvj(dTd
z9jCpF9c)BGe=pEenE`pDcK)**SspF@%t=!FMaNm(#d3 at GNWb_lctg#>bLKe-&^nbO
zcH>cE<}<IwoM-cQyDcWq+-fEQ0eW@=yyljz%+(%Q*bg6P{-r6Z*r5{yu9$jL>t?bh
zjSo;i!mo!9NTQfM*J$vXeB5j-Op3D(wH)`sSyX~r>wDU_*NY=Gr><p0gE85+;xmmU
zM9myW%k|wo6_mEE$%9+NFQc3jqbnzA=h~*nN!SJ~U3?eCNC){uZ7L4oKfIk~84c-4
zb0Cz at 3fA{ScuIw91J2!twa+}N=48P7|H{H~+ABI#9?2;6I$r*IQ&YwPHk}o|41ME+
zHBig?Vyf1DNAAi|{}4E3oG-I1jep47FA1pTm6GwUU&a9HH%g3TvAj%n``AP_L&&jO
z6+f25naw%ZfyTxi)@lV6LUyVwhi8jVf@+4qw_oz5E<}#hJ3s`;G3yVPjkQOL0}6y)
zDny%g9zSG{EZ~lK&Z6vmot8}PypLsWWVzJ6z53qHVg8BIUZp27>h_-gA-nPN%VZ8i
zrIWY)$ywJAVln at yvHwZnKHwOlg2+IHLzZ>XL`ksKr1x1y%Un|p)9pNhX;ni)W5E=u
ztIJ=#pl^76PODF*<JaP5!=fChzYN&aQ7d22YTs>i;io8hUMc3q4^8+Mu7-24S+aPh
zPG+1|n#wlkTuI$|@JC1jSRs}-IhEd*Mpb2+`|a`fTkLq$7~4~3&j0p=Txt(ix#HW5
zUI!kH#?9e9B%a1It{{t$AF#OeB{ye;WczL%`wG7qt^69Pd^NM9^U;hpX1irhXj<)p
z?15LV>M7_s<GlZ89~dyM3@+Z%*sygvR(rm;+u*RpOgc2!i3$Pu+4#3mbQmY`;kD!r
zLhyPg5(2;S<29wfEX<vAFh6z9uE-r%D=D;!^S=30ET`!!SOVxgF?B44DJ4*z80`yu
zy<2IVsgBLVwA(Ve37$yXAVzy~-E&52VXBjI&gdf}5m^%-W21wFPljTQknZe}r2S(>
zN?3%P{~{FTaYi#9h8}s#lsIBSME>v*->Y<mbQuX#^_4m)Xh2_AFhx1@k|8wQxUUAc
zy6nwFXDMUL66xQ*6^>ayTRUxVByY)Vj_((|ruDHXpNKt58ImC4(fGmXvU27c^&8q}
zrrnYOQtJzHv1)>IGYy#UZ3aC#J6Y**Xs;>oS_ijQT5uk$cE~>yZnbIK|25+<L;%y?
zmwoZ3QvJS<Pz{SYuU^W9Bm|4{-B-_hvk$0nfKFoLxsbrh-P{q2=RXS1Ni6U88akDe
zQ8TyWL(};%_aVX)fwDNYeQVlz&%D@hXDi1}!}rro_UAI2nJXojJq~Ym7D$>p_vwY{
zQR#Cw<fkmEm-%h8*QBnU+4O#QW-jE<EphZiUWVo1tRo04<#hR1IRC2yu{!>Ou=1ji
zYu-I4LkX8K1t-o;OFiC6V(xgrS+a^`i#OZwWxj~lk89CyUrj!I_wDg}n(?m<B+n9R
z*=p5mpDEUhs#94+FkKN8+&|B9bLE{IwNyX~d78SD4Q0p*P0LyK1wN$XeRnS{)3)bn
z1wEj$KA7Z^oR<uD6%J?GkP$z~HZ(g{MNGL}d!jE5(`E)+`LV*^rTN>e-PwL6w`c^u
zPBLGA7H8zT)vS6h69Rs0ZW9P8svIhkCp0noiAjn029z$vWZSK1Dvx@;nMapk at o@S5
z;|2EoN?|9C5N^sVudEC)qUzFcbFB7_SK0;eKuj&y9|l<6D9gW0Lhb&BzeK1gOnRp_
zC-fpdj%Z3ZRD#4dub8lP{{~2r(#D;Da4QDT0RC2on9Oo~%a#Cgh^*+J&@0T=zWunk
zl>5Jq?mi7Ie|4fd4j3yY!*o0=uB|@iP4{JcAaGt?9>x4#Ai&`i at _s1y_9~C8)3FI9
z6bPsTT2pLa4bH9X>Xld~rqaarz0|XSN+gd<jac;HNOF22!IEdaXlzp7JL{0m)*M^v
zWkn+O5)Wu^MCnw(69Z3>qIWj8?d3Gd!nmZTX6LVQ5(hcXCPtsn0FO_;wVLKzlyjd;
zq>mVh%WWaDBL|fpCqSG|f`099P;X}(9qk@>AdB3KCIV7pwP>|0$5g?0xK4G_O^PPq
z4w(hAw}B#D8wGJmmf4JkCfa<12B{|j>?W@}Dop$BCnbs{NO5Kcvr2i5HOtx)Nayw>
zy at rz|MRM<q96Hr|-n?3@e5}p`zFXGj;#vnhn$}ux=>#bp<9Kya<Ig^wQ-!7A?1fQp
z_DWIB6-sNFE5(y%vs0VZ%EE^H+ilRWD6IPHd{K`bQF?2M&=Wo@Pj+~{`aFTR5m?b;
z`STXoz|4zadTxnjbMOok)NIkRtGmq4GQKgMb140WXW$V_KfWT9)gZMs$#0(1nB7BO
zwPioBn>@C(IQrx!19V;?W%ol{HN0M@&*`^rtXA?PCGMK!;>YQIJ4X6*O&1Oqo)~J`
zg1U=(W0j^MwO{bj-;#f<D-B+kRO>w2EXs^6GpKo!9e6D#Y<lF`e<#}I=@3?P?K+<+
z9^xpQMBrXv6M0>02dSDi&)(1TzdslrW3B|v4%kbpL0^x8RJcDx9Knl(yeB|J;K08f
zU$%9Cc#FaI0`h>KQ%0zBw)<r^v|7K4y1bHKbl#^2^9wR(%Iw=Ddq^!_i^-5VgHfzR
z2Fusn$&szj(Q|xjv&#DrVUOh*f2Ct%w>O&`lmWqbsWlQJ>P*MSyJqU0JXT#4ovk$9
zcLMofaoop3^Izosiuz(+Eg~GMT^vUwf)ZDQ=uz?P$#;=`N%N7ZEVys?Ml9u~N5oX#
zvr<TDtZ7MuDG7fxOE%+9&0(GaIlE*J4J2)v&c+T$OGgN@&FRp38N5U-&Kt6g)MTw<
zQ(>0yOm<IqTXH}7z*NzJ%9NX5gvwUS_J)sRUV#F_N;sQwL8DCVQyYfaL$Q+|-;K4u
zn;aU5Y4|K5M5&)6sPQgn{h)Cv?S%%!aPqnD`nb?0gKqxmkR)w5)8Vejb at oP@{NA*M
zDbvABf2NlzZQK&(h;6Ns%(|&`gzi(A-{xok*c7I2dBG^~%<8+e9MgX0!#3sQv~~V8
zG7v`J5U6Ee;@yB#l3I1Fy)j*sEs;uSsg{bsH%E%HMO$?##3fCP@q${Rb5P5$?CFOk
zl2gxbb>|97*5lax)P^1k=I&40!Mps{o;lxxXeb6Z9I~q;!7fYAGy>U6K(X;d!#T3_
zzE62nLKs7gYK at Y^L+6E`UB-!z`;>M<0g{MFT&F}yX((7apJJ-T!?xU`de`U&rwni;
zW&1zj)m{z#-g70?6rJDZ;as>5*pz?Khx-_Rv~wgeiwjB;XGor*uA?C=-rylRY#dZ0
z1RsVM&#Ny!<K&%m%f5ts6Y(awe_-BY%CxuY at MidK5cuh`H%sX637u;YT%88U*z+1U
zbzelfU@t6%l)7UOKYVs=K;8UFCSz(u#8?6t(Pef~OCVag{e3$cm%s{=N5u=0ja?e=
z{XD>JN#a`-kUJSa6{Eci*>}44=&e7?s)+UQrCD00OOUX2t~V*6O7L89Sstd-=ofdH
zpsk^fd-vJKT8GsEDlrH_N at ILphT-ELJ$}#B*HQ0>?U1<h2vY3N-TR4M`_KZjt0La;
zO(ZY3j^`!zieyg(!wgsaNd%S{0<3b(oafge8+hwR;4#i<@DU^Qh!&Bmk7}Enk`Npe
z@?1ECTZu}sE{;NE#Dv*mXG>F at 3GX3UfVB>v%%Y&fjDx;+#}19Ey10WqYYf4eY^j?H
zhg){nWfdMoq4qXA?2WtCWWF3}SHh94bKi)u*y{B88g_a4T1gv4zY3Sg;uFyMJ^R;;
zXVw+)f=O*$%1Y&|U)2uhLiC{hc&ul6FH!9Q8kjaSN>^kwafr#d9{3ZmWSQQS39uX6
zpH(xfL#Dg6f3~-B(j^h3I}h+>|L`}5?=g_Jj);C+?&f;how4xLk%O+AN5nwo1P6C%
zM7a}xNVoE*83 at MASXdvyOoThU0*91b4vv!`0Xhz!=@=Uc_hXC%Z$o5Xr&@+9mND8=
z9d8AJ!-`Nn2?nS%d`Bw{%7Dg*9kh9suG5NcDXEvtv(DoU^$g9Ui?rPfy!Uj(6My@%
zzs*wqepC07q*7VWbH7$0MW^ym at H0IriE-AKNQ-j&YSLw&g9g9)u>o~6*Q$X8rAEar
zp3SdV8&n12&HzzWDkU6?ir}vBrtYPNc5H=z#GtXpVMqHW>K66OMs3OMpP;hns at Fp;
zj-HY)7}<i(JxYi3s!VQOf<x~Q75Q2x(aSzY`>~TkhzqG1w*{sa1`#9ZovT&Mg;tFF
zDT%&@ZNqM(uY<=qU{LjSJaSR%lsr7XAJD8oB*7TlqDpfO)K%Nl22QrsvOCko<k3 at 8
zBFC_68sgMDlO1`7E3LQIx6GL0&huY-pTDO32+j-s-N5R_8tYTvOwz_|mWVhMCyjTK
z?7EzOO2CU~*25^zhZ`fg%rjPgkvqk<E%$$FoqI8%<T&s2u?7153z+_8XbsG?dxOot
zL)Sj!SmZ at d)_8f(xNEnk3%<-SRKie8 at x$!wLpK&_h8~}gUY7snkojEhGi6Mh?Ml<M
zD at gg~Q_}pjAtPNyR(@#RpKJTz6ZgQw9KxC(9Al@k8;8n~aPR9H0Ui`XdW+>JKw<LW
zM{}3XiCZN@b(%V0+l>w3k?#JMbM<aCidz11PS}#_iul9<wRm;C^>8v?W!rR)FLFye
zdS!BT^+g83nvhhBhy_H1VJMD;a|hg69~Au*P29j)(OF%fMhsLrJNbS+*^^KME#`|6
z_0dLAYVKB4gm{F5g9%x0tsQ^uk(}a@;u5Uwe~hqvSkdKJ5<6P+Y^feUasEuWQ(tbX
zowkw<`Y<HcaMmF5kNs`;U0pR)kVsDcP`MUwcb6gI=*_l10K<&{Mc*z6efauMIL$>b
zg01mDv=|1enojlwCQxX;0r{~@+^1PM>(i+eCVIm*BWuxqlWx&vmYxnDh`;AB?0i5I
zAO6ep1dAG|TQtiUU#$}3-DwKI2z{KtF&ftBhdoL^O7q#gs$5TRdv%8&cXLl*^x(1l
zPTXV%Oqi)Uug+V-`4`w~-pvU-)KOXwA3<V*(AFErHa))2s$`;?zIS&KOZB>0tMT at C
zMR57O^n2|VxcSdemo{c(qnZq)I2@*Z<1cOfm_F at 4$r-p5l;Gj80q;;9B~k@WR2|Hb
zBw3*p1-W<(l9vxIqP6Ek6rlh^<!8|bUzDPR1mW-!%$>m5GU=PblHZoA_1#SlNuPvT
zmwVe2nGed;4ehNa at 0Cj<n4{l&HGq#iMY~kD^nHLh`7>{c7LGN{T^FQo!9fSFv>Ne3
zLDCOZ<v3!x4sG(eb0hF4#+1ygH2i<IUWcv2vKuLuF62iK?%eRa(vl_RH$##lWfyn6
zeBMlaG=5^n)~?hQNe7smik-#TzkX}j{+Vm8?0h|K2;1;-j&i}NS4!dIvrv2hdiCf?
zFP)lnBU9mdTR(%M!5a>F88ey<=+7+{0NIA;{Q5;2w{fW>{4Ik7w5KVFE(v8|Q6-!&
zUOO})O_{SrPj{2X^f?y>Pa%L*JqOkNRyd>?9ANLzTd6>V5W*4XlqY|nVhVwu^HyeT
z^J_B>v43v*n{rzHUhLW-=ly<!1zZQ%x>mkyZ!Sw~?c*Fd2tD=ONwRf$Swk6Y@$9X(
z&YrBb{4halG|4DZ0(-9OOsIGs2x;Un?uLLl#aX7*YL(RKmMR(|V1>I%b{T7er5(@g
z4A6^G!AR_VRAlmO(l_Ra-Hj1wm)!A7_JAO%%WwX;gwF-TL_A3vTo|6%zZ7_XoUqRH
z&*80f=TTU5ivJ;86|yb!;vX>bLhRUKvR{hPW_wrji%mk7+fr$_YfbfzPYwkE?$V%&
zv(D}neBqp^rFq!;lt=Lb8n^@0qZruuF4u9x%fNs<4TQb_2K~U`*5>l$;RLgD%+enA
zEbJ9;+I_E}w88zm_jK7hVUkx;VCY6}NxbmbeD7;Py$Ko)Y5mIYElN|V>OD|^7u$yU
zw>r5q1S~-x7zc2%vFQWNxsxr*dhlVo{i2Yp-bowPy#Y+x6ua3jc1VhyL%H#c7yF at C
z{%1B$FhZj0$8QPN^$X^iXK at HKal#i1Tqz at B?{OIoOFp!wB}M5ved+Z3$~+31Nk?x|
zLu4^_u!7;iy~7ErG at XOPZu_M^FseFF6NTN-?elflnc&qYh7Y82jOfBA(3vMV_LyEB
z=fVOsJPuJ!=i`SV?q81R0Ielc`ze2J;O;W4g;%J*ZZe7Fq==Jgzl1zcl9~%n|GV$-
ztetx$QT{vM^4q>B<2vnSH$SO18RLggQfz5PQdlzJg-I8KWa<nab#+F4Gy1GVYv5|O
zL0-j@YbCd}J)JoqUbKC@`!~Y+C%1D;A$f-mPzyCt93msZx?%#_m8Q0SWc4zpm)z7|
zXG!H3heR=?)?l+j2Q~|NZNi7O956R`6R(e07fJ`jO(%u1k^v`ovfeOC++AVZwH|`#
z?W<(0==L%X%Zp}jfMvyytLc1!1yHoBJ{>h$Hxd6S){PKhO-$lwA?1(KbqN6?Uf}|G
zO&fN*HL~cK3$Ih}iEev&0<6DrFDtrPP~OB~KX-q}V;gdZ9m3!ncdL(^7KK!f*ojL9
z-OVT-WB_=TcdLuRdM-@eD<F5QV~(rBZA8Vh{NTgDRo31v$z8|bEEFR=P=dp~B5Uct
zj#AyAAsFPI6=*#u;l>CQE;I~~u^NEf?}h#+?XadeA$7|D%sI_??;cFE!d`6vbs#2V
ztjrMTj*zj^$MWpvZ(>9RPXu`X7$a$L?`UZdmzJLM6_ at c1b63d7nR-y*GX|ntw_NVT
zr|A2CIzaD0e7SW=#xCpWY%@OSWr<+7nwSk<d(s7G8s;{<cz6mhCPkJui_E~|BGx9e
zWnX9c^#18NW07Q?hMOE}D=VNX3AKdX@0Qo8<-1(!V46KSN>n^IY5DM?^sU1}tKYn5
z*Woq6K~1fv at 5iHrZ(RSqK7Y5FIw}nam|7H){40#%1)V1C%vxTtdrl~XVRPUzuxRG<
z`<XN&OIXIc at Xrv<{3W~X=ss<7uX$DH+ZUiQB2c<pU#7&I@Af!H!>*gB#gf>E?81fX
zvSCy9>eF+Dn^8q4D+Ps}3s+;_;q6z$lms(z+mbT~TQz~$UtTpv*&_o-MpB2&t~Eov
zkUk1;y)27X at yLJ+(r4=dDbJ+&beW2=am~)jDurnLXeQ at B-}4jk2;ynKIM}zM<uede
zI^6siliHtEC_VNma2vvMas2luE!Bz-lIWext!#^FLgV=)^#0WgX&ZI)BCu7`Ld~nO
z&z{AZ$J$6#=QM>@eEY_D?sQtyuJ7|nv6?p*=7mNygp~}>071+U6e?G(q|X;`UUH-2
zooK-iH@!0!W+b#W-rGwlcM)ukuNdC**@@0}i(Q$)J- at D}7S9#Ggj9rtx-pUeyNDmD
zxq{e`=ABwR at AR|Kd7%ecr!l#1oBpE>eoHlwy4&4|IY2Cf7jUBp1p^R_b*=0_KY`L4
zz>G2Y!7 at K(X&HuNoY(7?p^*sUw&}i(M!RsQp}F*n-9K0}`?=15wUzyxe(Ig9n(i}%
zH1B~0l<OfS^*G6-q^r#nc9~1O*8RJJ4LAAgorFewiI~_y9$lZ4?Hf}FpCRU6@P}~H
zLl-tG##pz6BVK+Q-hD#DGrqjrxE_}DWzo{*kQXzrW{r1~-3W10OU3Ji5!w1~1z=pW
z97286%9KfIYWm=g8yfs}KYfpi|IlP`V>RFZd`ZM$dEzUgx%PzoeS(yOtO_H-yQoCR
z0pB#(n!Z?=LeJ)NAQ|YctVoyw_XPd(W;bD2TZY&H8c>&-*(tbULn2Glv2`>fUi$W$
z3j&qSY}x*FN~pOg&Ko<GJ3T$l=iNQ(rLnmn*4Zce8U`t+p=Vnx#~3Fx^eL`2i0EDu
zx|hWJ37C>?Wv- at Ab9K4-G@=>;FDd-ZbO08^VGd68u0^$ohJcj2MOnW$?OwZix{%~6
z5 at w2!)yS`n)18`Bo8(OOAYSKZ*t?=qgh%GWw^i?j at o`VYhmIJ$owH%g3KpZtYHwI;
z2^c`cbYwbUstSDltF_5`XSdi%CRDa>JDI?a+wtr2_M*6RgHmpm)W at ib%Hh?vC`}WI
z+?F|s2U_TZ%i)Dis3tMQt@|pXzJ3d4R%GNBN6jr*bMCWLzeqo=TQ|7xvo)1h13r}v
zkU9Zr(z_WOaM)<I5ezOH;^KR!>(8~lMa<Eg)R@9V0A`A2lk>@&t6n(<wV7{3tayCZ
z$$%5Z#b&1M7n_Fk5;TH7Oa+dvBhC_8k~I<wJro4UUqd5aKQkm^X$*~?$<>G`r#`p`
zk;wJ?2oRp*VUvB4e0aY6@^{<twmQg=82Wa%UE&r-PP)0{u*q4J?7U59+Xu?>YMdJ0
z(N;0kAq&7Ni3e4qXdF$AxA!^`9_=Qbex2Dhb~-_L)~TS57~*7c(%)+XJknKPy5oS$
z^*w*yBRWx1<fgT_Yl&Yt!P0Sst1X@wlBC+>HXqJke9~;4GYy<JeR@MQ`6$Q`n(SeJ
zqt!B<pC$XTJ2pjNNE>%NrRwW;JMnhxBxm)zgQY9m^Z at k)s1tqk)Q_$aH?sMx$3Jy=
zJMgEsR9k-lJw>uAp}{_h)}Os=7ka+w&*|}{5V at o!-<?t3<!*zi5_sEccWRCDtVO@q
zbOoNl>9Q);>|P}q_uXHc5$p4O(@f=Z?6IrAW7zgCu>6aWVLB5%<sqJw?d7rxj}tCQ
zeb(ySU+k9m5=(=rPSmV`j@r#YK`jUkccaM~vdHg~J31E;&N8lLcUu*fD2vE04v98a
zE$^DNZ?4s<%e=gGh4`r-?;y{dt)-5ExO(!$Jh`QBVS_NpW=2qS!}CxhkK)muRezr3
zXQMBcW%*aYpCZhQ2A`XMc=bU-?(T}F)9Cqj6*2Y#m)|j%z_F(v+_vyCyTREC5EOj%
zoA6GBkscpjj~~!Yab7|>&rW*m!&$qvlN9c;)A2#lB@><(zJXgg1gd&r#Yn^m;*We!
z*gp5%_<5V)@-Dol*R)gLwV*xp{h`hDirV9voRw*8Mcpd0fiCyN-jCvpGJLkrkY2n-
z_!`QD*LkHZ0;eQB4v8DV1P6)U(jwx85N8D#KF%hGz<+hEaMRcFV%2G}2MZoXJgkhu
zT;pfU6TH2q4tXYpwSYZa?w!VY=<C&9)L81srthTxrlI7b&Hyy2YaH1wgYXpJE@K^b
z*r2J}dulro|H${@umuvoi;`R8ef~^)AWS`kA&B^UKK4~7z}&G;v||ZQz<K_wF~hq9
zO+d8SvPMZQfNRmWu*<bFZ8OpFgHwcaWJ{VZjwI#45d*lg<Sl{gCx}5l=+FdhGJTQ)
z9J5~9RkkqP?V|o%Hd3|<Tz(>ID3O1C89J5P`}b5+beQ}dMKiD#i_glIs at e4EiTT#c
z6c*U=-v|7#7LvM5X3ljVX!Z0a2L?&RIrk-_Xb$;7cnpnfxvH>PXTlx6@=a*#F<Yx(
z^qxaqTcxxl0$Ti_;L_Pt^`JkHzgL{{qJ1yl&4^=A1$K-pnjfrB#~!uP95uO|QEmpl
z#BH&o-P6s|Za{TQOijC`uRmP%w-UZx4=D5%Q%B;2!(i+8!wr!88>^(x+wD#nfM~22
z`@K&a_TI4aXW49MLRF9y^u$n?&`g1D*s?mt?XL`oaOf-JkB6D7-jXDI%1{<JI~cWT
zBDX*)Cve#rf#B6-{aR}sHa{l5B3wqkjE`{_qr5z>T4_7N?!BdDm*qsBZ}xPR*Ey_3
zC+*M?UAWeA7O+C~-(-SJ_gADQe2w|wBLKzX(kMk&drQ1>XyJ-xaS??&%QuZzMO)@9
zux=%QEdypb>>V<+Q`f<zBWDS%nUU9A;+$QVFk6eyO&tegM}ThVz}Ev(_5XTZ<KmAX
z-PvknmF1g?YV}gyHA@|Lw`(7vZI?!e5<k?D5^hbn%nc^?=|-VECZ6A%VSgfQ`V)=O
zaKS^KAK&5H^wdXzB%mpuS`gVeCif2N1UaSQ7I-PiXKnXfi-QjRWM+c!m%jTipV;G4
zZ%L(J*9x#~nwL-A4qTvOag)9>5r6u2KReG`iE&Cp^!57y=ET9Nv)B*iyk6r3?1T4J
zu@~^W9q_u@@|SPJpp#l1sAu`3{^kkLnqh-air&{Ax&+!z<zR<8<&vKlCIR+CpbGUx
z6jLi&yEW1x{h%%Tt(t|-6ad|GWxn%y>PHysu?j|CFaPqK*+H8j@}&gp=JzV8CEEL?
zO9(}U>9<*TdhMxxt8@}u8fel|J4r&8mG9Fi6}y$)0Dc*<Pb_jXm0btQr0AEVNg6fV
zlASfg`1)(q5z_T=?XugnJuqJ;U9leAB(EXF8{3^nY;z>`<0JjBsnrMBd@E4ht2;YY
zBnED(3dZPq(a`Q=rH1u3hd?GFUZ29oIn~(H1iN4EG7Id<W(&DRlfQOe+?<eWpn-dG
zAxv}CJ=}7Bedj>y;TN_R6b%{FW+nzPgq8U=NI`UhILTa9NwjGuBxouXil`1;_hf^E
zA3<LefyQ^4rhLY?_-_4XT+>J0tc)+}u67!(m{&ZF8m$+%4<q3ZaJb!9RJzB_RhGKy
zrlo>Tet4CQ{*+Bm4OBt1r75?En5;-`><h+EAr!`2)!AzccH3dI{=9F@t@nIW8_~&Q
zr+eVnUxU&Oa>*%_gQRdrNRDQc2!}XsdV)$b)k|;dPxntIe7n^2K^=ESdNbHv+K~v#
z0I(A5>D})(CTte3)aKPNpC?yGq^69M!G33Y&$E{Mf3{fO37>~~??h*qNn%YO1henn
z5`Q81x8TAFoGZ+Ks{YQ=wHy|LH>fzPYxlcX+Q66oR<swAltt!2bdy<eFma~4F_Kyx
z=j#h!MO|efG%u_`Zf7Z4%z6ULl0D($_m9dictrQohg(qS6<YERDr7hJ-H$I&#ZBs>
zrYy|Um+(_!mKAua`^zG%&yW03=6q2Fe&?JuhlI*$*!7<!`YPrvxegVePT^o)?^^u!
zV=r|hmOQI`@oP-rauXW*-I0@8a)Wkbv>30;_GBcPvA>NrGi%D%RfakH9_RI at kfgQG
z)*?)YP?*QpZydQ8xNfwoL6ATI3^&hX`i(QnVWsr$zT$oCf?DkWW3Yv42A+av{N#I(
zK+v3aBQqbKJi+tD)PJT2q<dh-Si79MX>o?Q!XcwSMzXyc#!PGKRuz*6{x?R)8`V~U
z3n;&xr^i?FIWn1;?Z{sb0q)h=fR+q4QL^SeQYJ5kJL#MdY@;$6-<AY(XMj0cll%^Q
zgsGk1<h!&gc|7|)h+VDRCx(wj{)_UiHU<|(v*t*gMiW|u#{XGFm&pc-4iKNXrm7ym
zEh+?MYJ5BZzLG#Z@YhKgcH6&pE8g?nlm{P7-Dm$o2u(mUG=+LKQA^~#PHV`u!Ew;z
zyXuiXnMNX(bFA;t?535lQ=CuH^tmj=McuKjmid=?-`7&k;~me|<=+o)-F^{FEBk=(
zSAS~wPu8F8(6qteObaoq8##o09G*h0iY*VU**|;U;O+}NOsPgpA^l4{5g*gHt<FWY
z>x2AtM2Mtoy;4zQ3}p#+`nDo-S3d<l;j=$)EdFHQ<TS@wG;7Y=^ga6JjK>?*6lvyB
z4BnxBG1hQgvy#tG2=vo)ny+uvtk(h~+7Y=bqPwYVP9Q<{$tzcOEV>zLIWmU3)Y#7t
z>|fmGI&1j7P(=s&^XqhQ)9jyFQg^#UW4Be%z%AG~;Py^;kh2L7P34TGKAO~5#*AYY
z&bFOk68X8{dr6<VN9<sMuuHH+5$iOc*^lW!%PYnp6~@>p{=dW-y3ABgNXAeC>{Q}v
zc3Lh)h2v%u9=@0PQAcB0OXc1m{fPJx<6-AZq~yOD(i;50B1|^7oG=?07_>!89GG-m
zsG>>u{J%+yRytNBjXgex5;h%Pf_g|D^k)|Nt$C3gpRyxO6b`;y6 at rp$OMu*L=!+QE
zb1K^PTivWcNg`?S!re at vn;z8bgt*~8M>U|g<LvCm6VV<GSJ{P`DoHWbe&6%9ppC!c
zJ#O!b!im2YI-$;!x@Z&7>kki%p5o7hNM)RMk(=FH91WyuSZ(;M3w#kfJL}J1brrDw
zig*>Jy-+5kbi5TaabWzMI%{l&he!d!k!hyv-^P2TMN`>+och_j0^RlaN{6jPLBKQy
zKa0}??#NlDssiD1pKKy*xDl69d5n%9GbREbt-g_OhO)K7BWz|tIB6G~YtvrU-gDc)
z1#%1Zx1?p^6DLX1nynvSTyjY~7fC>FCT at Qz#<#40*$<}>!X+ewT<6=EaSUH>(SZH{
zcDcw-8+m|uLyqUt=7L;n(;hzG7*2XY>u>2f(0K{zV&19}tR~hqXP at tqp(4-MvIJ#*
z5pVuMcc}qd8#&)d>tl$V+X@(ftaAHQ@$0OER)5wG8(_)q$fAnjCIGvyzhWyyizszF
zrDdb|R+ZVN{pv3+F2JCc8chTu-nxD9QDF1HFgv|3(9yUB77AFKx13|?>3Dlp+1h*c
zTu>`PCB$7eu;b95j_-KW#O^%>UOFxph7DV)^~xu)cwEM=m0_jae8pn<H|oDhhoqjd
z!HPX++C6OuDBl1}xTgPb=(@Ok5ujqTgvdf<eCdqp?&J6ogHd`v@-|b>&jkd;r;wxL
z7T>y3zBv&~X794=Iu-jq^t)>eYEclXHJEq5WIx4~9Gm;4!r<RJJib-Km7RWx4f>5m
zj`-*K>ANm_(UH79KaMw_nR~cTc2W_+5{_U>=HRA4m7);234Q<lJ3hqzdfEq6m5sUz
zZ0vQsYz1k60#9oV704NBw>5S3CD}J;Nh at KFfkdRy$9E=<WWJK@$J%4UTuh@z;9bKA
z>EVn%-`d7QR(k<eI8!<BQzhaA;~0Y;uO_vf--SLt_?^X`2T33^Qg8w9E#|YILh){<
z^QlVz#+f^N=INerXbihKWNqh?!+2tefss5;g7{0eQ?9XoZ1QvQ&b2FZWIA#o6O+1=
zWpUe{866F4ZpfuY41LL5Qf!`UA*gJXOd~eQ`c+b at vJ<Z;oKh4^{=15?t+e2l@Oaq3
zR8uZa8TokhhsgaRU1Eb^GjZ2VVbV=nY$x7Z+#ol`@0K2Gyw;2uLjU~<HMz54mV$f7
ze(cHi_1ge9CRGR%N&}z{90xLSejH2GYo9=mBIwLX4!Ov+Y~}6ZA3twb+X$-2^*TRo
za#}hYDE|)tOhB{0B9o!Sl}JThi1qi!FO~D6Jar&)bdT~&k;b$&k9HD3oPgwc9|m5F
zJjmX>wNA*d^#*?ygB^#<OAQ)Yxr@uPuEsyc9GvtVIO_{;qB@>$Zz5*4%U}#;v{t*D
z`Doj|!O<=QzHQo+IWhVBW;icN#ZmlFEuq_i79%0JL{A}RlRc}Osn<2{ER1P?s`}v@
z*%sfD!-cqFYl?!cn8>aP2AigTJ>-IqKk+(-ejbCbGzqC)-7Mlxy>6ob+~yecvymMe
zGUxvFjO~0%e%jzhlQ at MSN8L@v949j8h6CXC+G>ACtaluOLGC&8E-y~qdK;QzugINk
zMI!AM!XQrNN({Ca*Z_FQJBHc|Ea+Wnu6bGVgYic&iq#n-ma9PgE*Q)+BJ5U~JS&kq
zLx9P3aQ;0<9+bxPSk9g!jLs(u97?2T&*AJw3a}lF*)~Unr~D;tMXNPm9^tolUG8{U
z0WsKiEkRcRb_dFnfm1zA^Ewa%)VwV(1Qb4aFv?`)@y3Y#XuV>SaXG1s&<fe4g1SI#
z!f@#N8F*#m!8{&oe+M3H|A%S}wXVi<kY)VaKDD@na~vIW>%MBU`22ATqf at KiZ8zk$
z;|S#31hA(I!SE)_gDdu+kq5~Z!-x-L*_UZCV2c_`i5`ZdAH_WqzaX{nBiwfY-W95C
zKo?vdXq^;n<4<bcKyQeXisVT_a%(jBJ7Vy~7L8QLx!Ew-feH8sj_1ln#lIVYmN`p|
ztb}@ot*3;~mMZ%P-ZaK;hAp}1;3xT|<$g_O@a--tmkPRQ8-GFbzsZA}eJtj)oxR>d
z?j64<OxRj5?h$k*9I8UlZX|`#plu+(VzRqZs4kv7=J<;!+RCr@r+*O!Z?6pPvPc-D
zF5#uQ@&1yjfuRq~D=FqgVl$>1Ryp0E;^It`q;=F!+=hG+V5b1BFE`=e-K+iT^HC)S
zJZfw1lF3R>h3mkGtw+uz)3tbz+9i<$u=KLG6~m0ayX1(0`+()54Q<NcA=q+!Mlhmv
z$1?(?DKQnr_qW8L`g7HIEapAq<*yy57O>WC<;>=SLz5&AJDyb7PWyd3M%@#*((oX+
zU$`r?NrKryI5hlf4j47~cJ&l5bASvw$?`{M%FchxbR2}E412rAiZZ;0$`ImwP|}+)
zA<pbM@UV?7He6a*q%h9eMdE;n<Tpp{3zCBROK*i=AB$fDU~e9EEg>wAT>876VE>~$
zSXs{sWHzWy&wX~g>EhDEDH)*9;D+=$p}|dFxy~@ydGJ6U?6*DoUU?AppR`n at EUD>R
zxW|sdj;EdgHWU&e7E%I&Xf?LKNy?DcH4LnY_5d_JY1^E3GvT1KU&R at 2ug_v}*A0Hp
ztoRpU at bZMotW3^z1-{;IysLc=xVD|sGv?wwaMC6?=WsBrt@}XNg$d+^wy(IkhM&5}
zRicw3SZBW9zO^5KJz2Ay at lq&yV9=(7s!R<b4MK!2@r$HFrM;t$v_tr=mBfKc>dJj=
z9Vq*7QJ-}VMK}n)&?1a1=%^2jWq3%}TQjfik^Eu|ejSf9%36DUYz;nCq=%XoE1Ch)
z+jf*KoZFR-A4R2pZnuH at fcM+P>Y&-Z(Cbij(6hcKcBb{VLjZWlVI%f9B^m at 6CXk_;
z#Sokmllrv8qg5b}yzpoUJfa+NjgoJQfp7Cf&0<HS*IdnWa?h*S)^wSR5#rTouGStm
zbeCzNxSa=!e*^}fOZ&5t6Xv>O^58+Y%*l3p?&<@Yo}bEt9WBtCQ6_WJQyKW~_FRdf
zLCpyT$!*d`e;to}o7(Ez@lBe4b@~wwwRbt7rj_wq0jsrOC8|h-;1JU>&C5rf2@?)T
zBpa-Ox3{_b98U`nSk5%9m<&Qy5XTg!PQbJ;x^g7Sa4xprVy{O!4L)9XyQe>d2VbSZ
z&VzS4d(1qztE(z_Y*~qmZBZ-!&eM!AE<Bz6 at eiHQo%#-)`xJwx^58-f-;TX+P5hkL
zUhN28Le<nQMYBQbH7BRZPi_rFsIew?H2@zq6Rbav*k0llCmI6>?QDZFwBS(pgiEnj
zG3eUi>XI^v#bub&^*7xb3sNMGk`BH;EB=KT{K|p`z}PZuYT>Ta;hdAlK=t8+>A9b$
z-$pudjd#a7TPj;XH+P=31;{(UcamK-ivyVa%BrQ!?Gzfasv)auMSW1sCZ=)38asZ6
zNKo6fEp<9%IkfoXa}gXY*2FMj(%ZX`!nk&!6AwoBYahzp$loa5Zuu6!Ymej?W3V=7
zUz{7)Pj}Vz(9C4@HL;Ju=kBcqnfO#M>ZN--40-o)uB$_qP1}Hi#IsvK*Rb0MzsIrh
z#G~hau-G9zK2h%-g*tgXg_D=K4P7P;W)$n=2t-TY{?Q*FvUdpU=pz+z(~qH);Z{g@
zg)u3iSy)muMhD4YyEaj<7jK;Rbvv0Gr-Z7P`QtFS#cg>RgDEV>a#X^e8oq(!G&Z9L
zGijf|`N{6N+l3C#gDCYwE+qG>s<Ns%pf+7#`hgoqU0d}Cnmu)U{7x%uh4k~h#t~E_
z2oO9(x@u+~?M)=PYV=n>PWMWP;@Q#5;b4z5h;w;n9&{oZiMMu#T{FO2!1fK(UhMgw
z6u=d4D3xgy!5_(k at w<4ieo?EQ at PxBq05~6uDR83Ks=1tf?x*+RKLLvyNT6NUX4B9v
zedv?cKJMGdg9nrmL23#zET}=VO*RtqU{OJzESLiihA7IIkOm%v at ZK1Z!g3!ShjuYe
zZ1t11=xuUmHjWtwB$(mFu?1t4GG&nIO9`wrm@N(dF&KPtUeeZ$+m))mNZYL81_Ra#
zgVh?!Nb!2ArfP!*^+^P$wF$f%Ql(Bi+DB`Q_idBmZ!dUz!NHa8aU|!hmYl+`q)veK
zK3oG~l)*=>6^^z`*_V5HgQyLL^@AOWx-EyU0{8JrG{V0$b%nOm4^o+;NZ%`C;#V!e
ztCrxcdrTAPIuIl6a?;cH^#*@2245N*Kavgj!Ztl2FSw5vv*)%$ySoodt-N(A&XR7T
z>QotnTT?pkym)>GceO|Ld7t3U(o}G}9Hot at iYl3z2TM!nXwC+VIEW4+XrUieS3(#;
z2hlc%;ao^RD1v=J&wukqvpMHbuy%>&*2qnUBoU`3?F-*875}jqtaoa^g9q!3sp%Ic
zhhbU9V8UkKY2QvmaH6VSsmZ5R#%4yqMj5lwA8Ce at wf=3}9^mj7=^sdTS70uQs%K)s
z+CQnqLi?7AESKuFaLeM3LMxSBO%U1n%7IXMFhxdcjLEYf0S^IKk0=TLWFbTsmWtn$
z`(hSCkd4!EoLKGyBT_E-{WFq3h6j`3!Fyb_M|jDDr;J9<i~S_8uE&BGq<-621TzTj
zjgMa5Ca_XV9)wDSeP8!zL|9nj*D3G;zk?RrV$$>wX)vJliaIYX<)dxjG)Cbd-517T
zC|(grZyP(%Gvvh=V)4z4NTekg*;k>tz5UU#__f`V`YB{vvu at McYk-|yRW~&O_P#Ku
z%?D{=#E1lOa^j at a!^&^>yJACenA&2~*vS8AiLIcp^Z`IBihDuAzE+Gn>e*DPJc?Es
zkyqaAda$H_;rcv{J7A+nyv!cDNe1m}U;qLINHh|z=vso8u%tR5c7Koi_XFqGVlcjj
z!NT5p_0IUx?|iO2?Epji+1z8BOog}I3hQ~?;T<|oayn4oNshlWgGsGZoxih8;yR at r
zJ#cok3A8BxtCJ1(|Enoud-*8DvXSS${hU{rlpgsi9n6C+YciHI%D@Y&n8~PaMvy4v
ziaa3ZWbt;RzRW%TNidiWGFooF%N2r+2kUKK;x^^M({68Se#bnx!K<dhnAeQ!$88Ho
zY`8(kJ}5CLVHlzXjJ_m%srWbw&wy*)QJ{y?I(pol=}4<%HfF&?O@{!0K~_qVqqppk
z$O#|Lg7uJ+aV65;w3Q16X-<1<H{iuGt5>3f<t+mf_B`zV-F=xq27{S-@SE^prNM>f
z7S?KE->2>!CtCTLT##lc*7S<oh;#$9kAKDPr9S%Q)PVw3Y6^zqn$EShV5>&d<xkQ%
zu87-92VGzw5<GgUS1=eCS9}ByzkWe80}TdD3N!j9DCWvDe-2vP^tJFfoAbmNje4f@
zVEkU~>TiI-J~NK5&5T15;b+y*@a@<K53aH^exh+Mav=R)AtkT2*TKN(xmxUgW1myA
zUS7rvMh1T{z5vh3BGTr>3 at 44~_8jZ1+Q@{;kv=Xt#BTD4vL~0i;O}|F1+4)QA-^q~
z_sy;&gL<s;RS8nAOXu;=Md%b}ZVrBbJ@Tu0aEUM4!PQww5Dc;}T&2H?rBz3Dy3GWd
z{H|r;TKIG;O+6WGnWf0>)p3%}Ea*kS0fH%j*BbU=bTvfwI-=P;C)~Ay<mj50Xp7xK
z21Jb@sZz1U28yXLB4cP(5JD6l7e?#``XJzszB5>Ge5|U$GA`CdTOc><-+l|Ce#igO
z7+hZ5Eot*QdbIP3od;3Ud>TW0(Uoo>i{8vI#2rd}L|w}Hn$6JtuvRbW;G`}&4g?ys
zjhMdqA at mg!@ms`&qe$IB`shdG at ouL<9)L&)X4Omf*Dz6dT3o|f5f`#gAWcP5zVL>z
zIbN7>W%2ehAYjm`2{&f`cpmKe;EVfBIqAu(W}DtEsm-oBY4^Z3m4_m|5NT?Ac%ode
z{t-|;C)#u?;C@#6B3t`yF2YJdIZp(85sf8dfmhd*?|`+;+9r&6Y<he|RXE%7LmDXr
zw+tSsQkeuEmN>E1u&p$C%Pi9?gRz^3ZdA!Mk4K~^xwQdB{4wDCVhqL?6T(`WB!S>j
z?{|_7zx7>f4Z-a^t<R9{5yHmNDZ3@z>-69OoYb6w2!ppN6JHrLu99_5TM3F6j#_Y*
zJvT05wZj)X{CM-1s*XMlp*u*9tZbkq0~mQz$c_bp2SXpxaUr5_^SwdmsX9 at i8YGrH
zNNe<1Nz9o3^}EE}v}U8N_$C<Cna!6d6zu}@pm-{PD_bi&RxV05_MhB%(`YvlS+odi
z<-vuGo?|0I1HsONkqrH8EKX$dCx@p4ZMu~{#+4+G%3AIWCRlIled;tD_h$SB?yu@=
z;X0<IiLMLiWYJ}cw>+Bo<{_d^z1+fFH3QotfIqdLzP$?u34ZYfJ@o+??9&mdGImvK
z)vyY7x|jfV6uJfU)(C73K<+^EeT4?Vpfto?7N?1>uW315Rpu3L&cqO9D?|+M)$?9V
zCK-!uaME=z(L24ERbQV2X6*y&OPJ at u%Yo$ygHGS>ZVD)a?fgYkl9W8zG0CPgeZy+l
zl*PR@^Bx$yfr{sA{Q`DMwwC#wbia~v!LDo>Cc(~p!@QzzWiI!~ioa5%jodAV3c0Ts
z(Mr&IgXvKX#d}c_nGj=J0~UD!>+NG1ntYc^D|Fp}FwAkVOoA!9poXm4m^|MYo;fJk
zExK0(TN9m^*)FbnnHX77SRe0$!P`rfN!QREswG^O?f|EE-PUd+xuKeW+eh4a46YS}
zOS~sh0rv3PK}d%5s;)<^Xw=`x${@0(0a!*yG8Ga^ECRtH0Ou!&G_wpNIw;<ks3(Eg
z25hgz9<`%E46$YIqZ;$5-g?2=h<4d?FNS%w<n{)!7_`*ARDVH3!=>@#nFnY#)@`-J
z<xS7rh|uhlJcZv*Jh;@Zqa0hnQG^~bhf`Y0a0%9rT5ZzBs at CQ2-qnRigb-Z%t(oM9
zz1ddA*)Lue(``WzP6`V<4@PVXIJG$#^1L+|UC%mR%4W(_YlSYSUYgAo?K8a%4@!e3
ze;tdHVzBX`9F^tU#GMC6*Mw(4>=%GzU0FF2%wiLZ0{C7+>2i9~)3do6P1Q`FrpxY`
z8z1k%Mnfg^W;Ojt&gid{ap-ICn6>K+vMZpq0KaA~h at DI;6f-R@#T~ZBo3EB1<Cmd0
z;}&~XPX)F&inLnSzT|&A58gKuj9+M1Q%=}``1q>E^<*H`N at Rm};3g~Xo7BtOX0=%D
zo$Jw($AdlpoDP8G&QYs}pq@m0M}c0=@_VyaPS#faA|b8x#<{e9K*B(6AURcT<3c#Q
z?hPLmmU=m4Z4gdJAr^(@sfBNpG*KzCexmqZc4xhQ;hhc>--L5y&+ZS$;1=&rKlmjM
zGsNQ*kGuMA?NpX<4Sb?8<$ytXO%os1U8F9Ptsk|2Z37z?h@^nLPYHEVuK9AJCrX6D
zbh6W7Ddh7P<QR2^LB^<UF_kZ@fPf~yWOVAtXjK&I7e9~s1Ojq!j90SX;<N~jgQP!>
zPHxLBO04cpXg)<Jzpz%Jf4ScvAKauzO}hnO7st1pC?LlNUMhmtjg(f~DPgx!A{-x7
z6m|smUsN2k-N}W#Hj9;=Dgm}mdf!h2A6^Dsl<RI%o<J5DVTeMRUkn1g=w@qUPKPj!
zuH(Yp7TgRmUBU_lYaS!Hprb*2RT*t$<RIb*y8`)Pt9qB4kqdTAG7m2FWsbMEsYxCs
z$@ZN*cxyRfC&Ie;-VISV=0WWRZnWUJVUt?zh<4$^M={-akV5f6x1mF!o2f)}t^E>o
z64#-46c%6gYYem&90wkhJ0EN{<T}nCgqGI&Zy^JWm<+836}YnIauG%;y-&kG!iBfx
zAX{kH=i<ez#J=g)%MHcka$Csqd?6aFxnOTk)3)&+j={Fq1k@Lm>z>0fv>r{>)Gy23
z*dJj1v9V2-dQd_h=q38p at ZqI5?FO=DK=cFrwl44E^*6M@@9r-Yp!)!YQ$X+WH)e!o
zq(zRnTyJQ%FX+_7)xwnmp+12wa>&^aLm&w>MGC5BoK`hXgE8 at +1mT5-BFrw49=Rz8
z at 9`}#7#$DZZaIHl9~X|t_l1sv=#t2Gnr5^vqaz4aztFs~zHMC`-FMPkB|KcOOyXg{
zak$5A(<DSYj%M`SO<pn%H!^f!?2aWgp@WIJqc^Yor~r$x<T5z8VS(&=HUW!|!D7${
z<MPF&rRX>5+O3Dqe6=JY3|2}FwZaROy4-(cm*ltML5nXs)bvcp^>}Li!ADV2ZGzdu
zSDaAIFiue at nV=2HOEXCLcF3Yq=;N}O%q?kB8bqy%I}ILjo(%HN2boNoawBlU7Oc)7
z<8(I{r*+mIv+pvuFE1RCE0!2dQSFYa8{io#%_9;gX1{Twaa}qO_7JQCl3f4aG0HvU
z>Vy0y7>r1R`SvvktGfy3gmLLP;Hr**GPe`SD&tacr!Vd7mnA${HTsdnrpkk?I6c|{
z8Ro%Aj2V;XLCy&up*V*SrW3eq2EVSP2ufH%(HNAtFawMkTQFF&U@#6dq4baz&S)^|
z;z;xghBycdiS%w<l5oR1_Le{-30tgVskh?6__9&D^k}Gi+*Q(S!F%fH7)Wooy}@tv
z5c&S0cR|ROoc!+T(iRy9F*YB6?XoOwLoSj_j0`~9xx#)?q{L<?4egOgaaK1yun*HC
zF@#8psSu8JRucR?#58EK@pAL?<gaeI&Xug?sy5+Yquyk{b#`ufUsoZ?E<#}c>>tyw
z{^qeb>eF*J6by#MBCVbnZrZh`n5zRh0pYj$L>Rnp>X<+#3EkU(^1nj5s=|IQy&PWZ
zRHYQIUwA8+=6ZZZq>!gMX;Xb4&_m1cn_<B+%!R?C!{nNvWUcQ}k-=oBvDh1$dsRQI
z411fmsrkNHrHk^#dHk2}6 at YF6+JeOKei+2&AU6#2mpoV@vXK+2*s$$NgS*vDZvaB&
z!Mivnq*jsy>I_z^D)N&gH7bd#YJ2*D!9w|ATi0ZWl7XdQu#Lrn03~LF#Q at rR<9JY{
z5Dq5KlST{H6+O8u(FzeL<&0{fpwt$g9u64|R{J`g?O?~t%H&2E?BBB;gt4_t54?-=
zhCHZZR`%=<U&rD{?I}(Q9fCS8VGyEtP=axTq4Z|b5R3cO1XBGm8>YT})O;nEr3YyO
z;875P#auhoe2}c~kp_d^2KJLUC_@}$x{hG9x<QWY4-kfIO5|`sel#C0gBaEM`Ih0@
z2>%j6CBxsAb)c$57{RaUc+*(y+B9FJggx!3&V;=^-EDd0OatHT(vHkG$ps}P{8sNa
zpeGg;87&`V6;=eXR-dz_!V7VYGfl<O7%-#FhPIhoudp4UYxwLCBgQPimpq8mLxjcB
zWGJS7b~^roB13d|D=#Rm2xKwh273>{@v1o!3k`~6?87DF8QWHE3Vr&df_o<n#wh^v
z*CUha!B9_$#bu*wBijZgFhpQ_hVwx4c)X at xPd!BL%!iOt0RbTIXBKvaVeM7)0)$R{
z*_y!ciydx+LK+_j*i(n{A=v3~A7e9~rm{hZ<od3LAaile84bJ99Rt(X!M^6SEGb=@
zko&i1G8YHvzI<t_bTTlZcX(vs at 5h4~5SU-9j~}0#d%U0PIS8Xo64=rCtw&+y!5)#n
z+0R=0UhO=XC?|}xHbSnHjsAM3NRFx=g?U)KBy@I6)O1ds7y6scP0(Z)Wr9J*c7v=x
zcy+6*hlj*(vbbI_wiX=>$LWBit^Cz6{rJ&)e;R)a-<1!1zLC3GwHxt{7^F*yS{%=>
z8>0_MT<#0<A2+0T<iuX2P%PdY4H6IP?Mq$|={FhzmvZFroX8ZFO5$#lT7t+2d;*98
zGW1qW10cj=X2QS)t?l(?sH>&VH(s%EvKq+$g56{vSLb4pWY20>osw%}Fj%QF_8wyQ
zH at 2Pn(uHgNbIRt#t#NvPGaif=Kx5zHC-Jy`>K7HlY+}~C<6u|{kV!QD#?3%dlg7Ys
zsQa3o<l0G@iST)%1k72wCZVXBv_(=PJ&~b?(TQ!6-HAdA7S#h!L$XnKjh$|%sxe6P
zI#wFG%r7N^+NOSLT4z9OUv3|?`zYY3$QqBR8YAj^)msa1$AcMak*r?EUzH}0Pj#b0
z+TFydFb88oVAcA6n><tj*tIQv{y`N)|HSb`q`+b6YzH3P%?mx{qorQs%pv9S<<63^
z?I>4TSJyOzexhq(yLqu)UYZPwDGKAeyNe|vYkOcYvGBKnP at S>OZa*3Yu;8PS<M-WW
z`aLk1A?9X@%=wExVZS9-swLdMVF%_Lx2Jh9vOVX)1UyJw*d@=207-94gVh?itSL4F
zt(FrEn7wKQ&S5a!7>nCc%+=p5suIh!Vl)xWYW_R2;DzNSs36E%tDvApV=&z>3AI5=
zy4+?;a&#4u*_z>vX)$-=enNly_uXdt%`uo=(pO!M2!UVlAf5GGj3#h07#1R&^I&8p
zbb|UJxP1@#B$kQ5xv)krSaYjDB}nFUunbK>;}i%R>k}R{?HH>)ENCc`wTd2yu$XCJ
z9=eh-JE80lj5`l5OS`esY4Bbu5As0 at nOw>eSmK==I6(D2y_tAbb at W}BSo<&e%azX<
zzumt{<_E)IY6<F$_}exxp)_U+wOWF7`l3<%0VZNG0MIXLKyMeAw(+Ebh%h+)^RUA?
z0w)$39~-M8?HL9OV*gP}9t}KXXLGV&j2zppBanDlPx6SRELqeQS%EDDP$-LG5>6 at v
zA1}XGELM+V;YHkzevZM~4X7rmI1Yxv95)6x-=2Ovj>i+9QSZ56*HN>Yx;4L?fZns9
zjhPukrLbe}bGzqj#1nnNSo?--Gz<RLh`IML@?ax6b6+l(f@9%=OYQ=Fp|5s<fIeR>
z4~%^Q;wXIZqHqtDo$ELlb4cm02=~XIeYaRVWQMS!`Ya!;JQ&*r+`C}z8wKB;Q$XZF
z55jMu^WXtVUodznJbksVuud-76Pmq+9tIskE;B9u^z~}1U$7HxT8G at 1%qB+LWKaD9
zi!P94nJXI*;`czKH4 at Bm@9&^la1rdq-ZjPhQiY-miGHJUWJvFY!JDPPtfetrw7AWs
z{vCtqxJxkJ7=iMl42b6-lo<&vbB6Y#eYQ-p)LOA#y;mk4FOI<q(qXw+CRTP0ZYL9T
zsRdm-%#Lx7vthal>Rr#H3CP7BL(BvGi>xoy%X-3siOr$<l>xaZl|*+WmSf~7R^U8o
zXVLf5uo|m361BoN?Nz6+*2ewJ1u)&T2{U=r3)gaNkotqvA(PHaR3@|)aUMq@#+f(R
z!I(?_Vc at 3VbTK}c*)`#k%^s$U;1eSdvp^z$Eb90}cabA)-?w&4jl8i7iVhwnDaVzA
z-j`Mycxa at a6sDOVZce?ET}^o2h6nR}7Mw}juL#tb3~=n_b1XHnBhs4;hPP`B)-$#}
z(dIUuYU8;Z!jp>Fs}V<p<tlW}-PQ)0%w;~U%MS3y<~L8*kzAcKiX9Y(5k=Bb)=k@g
zv>l3yJ@<=}{`D4g>i0$~{Y6gvq>CzM#d10&CFZ}Vc<i3E_jiiL&iW`b6?V^v!p9=>
zla#QIACGTTjC9a#{LA(Pg*Altyha)`EV_e!U1arN*2FNESrer=_zk4wcjbn8-Xv1z
zVuy3~Mo5`d!nW^HU at s1RJR+)3`J1k39Ahsy`VBM+y?mtmC at keYIQ`?REA3Oo{Fk%@
zQ6emqHrCbL_|DobnV8s1dp#QGfe35X_~5}i=X at g%K8eit?amnNpR7y at 5L;7loZ`wP
z7dKeT)1rAgDl4`pV?9)JvGMl_rMl}PvyU#ZIOaUe-<(=n{<f-yY}W!R{_dIp5)bwo
z_-I%<wBaJh^(ZzMXv~;5^{HNXr&t`nTphW!RekaCyp2kRYQGRd`o^*N^~a;0K48*|
zqB~0_Q!vdo*XDDSq222?=5$~-o&Qdn%ovuhR5B8#y<n!2c at z8fO15E(do6umux}n6
zMYLAjLsb{;gQQw=?orNQpq5D6`pk$?3~Jw$2lK2tY0_$8!r@&rSq1l@9LL_5pxC|=
zrQlZgFh9%F<=$xv#S0GXt4H}Bwr=vILpTK>;x3n2BAA^joBs&Pw^-?NL_NIR2fyuS
z=@Z~Y-9LREJtX9kRKX{?5T0~Mtl^kchRwtKEio89w6fSm++1CP?V87HYl`yio3>(J
z=D|8=N=g(SejXGPyU9t9&oN=1 at n9G)bmd_J?7HKsJIGk{&c7>k0K#2G(`IP$=T at RJ
z$cP8I at kfORh_Q;nVeBMXI36dRs|yn*`573Cv3I=d$9-=t|G<oDt9{w6=Kjq0#A24R
zkZ0*^tHTJL^b3xYh*HYD?;P at cG7|E9A{Sww-6o1S;2qoIIS;#@!-%EVy^$KtQgB2f
z!rtd=k7_yJQ at x)1wF4@VFXWkP-lf1qxXm}=5<!ugI1nDWjYta<?~1`ZYZf|V<N0v;
zRxM1lDA``aU<zPne<iq+2<rAOFR3!y;zFhNIp>i>L+9U^$*^toa~q8lF7(l}btU)~
z=$9Dp1VSRdPHja_Fvlv2DcpK)w^RznY<j0cmqX>oy!aZ2WK+PxdtQvfUXyfN&^PD7
ztWvIgV>8cZn%2jg?#FWfst)!TOd;4r%o~?l^<DoeyCH0FTjtKQw~U){R+EqVQR<Lq
zcLt&iLYHBi*ikkLD)<Amb9t$yeDUBj7<`v86{f<atqrEgb70<IE#h;>MvM-CO>U%T
zl_eEa`B9X at xDNT>5rc8;yTI7^rvBP99=zR-<+$sZWP1^VDe%^r;vozyXurBB4=9u9
zIQ3&QCI|CK9JxV0oA#Ee&GhIWV@cC|544-0QUD*(fUt1U+r)uKIe2%!_iCc?o(%z@
zmt+dpJObpxP~!7eSd=vNLI>e{U@*?Gq$Mz*4lb<ZTNfA(TEfR?{M-HhDhnQupK@Hw
zUYE|MhwRD%*(S>Ndb(=()$!S$7nvz$CO(+9z!|`53K4Y?9t7T?cOmauwz%sjnETM9
z#onXGUMYZSdyCr8g*z}s;&Fik2CDLfRR>8E+0M}fXIdM3)BYfs9w7?z%{jea2>Wx>
zF1$#B$G0PRuPa!d%!6UutaW1U27719p>;h<v&=YVIJ)UNEuelGIky<ipTypVKk|~V
zU?cc}XJUJal0rV$U0C^C(b+wC4pBy%_zR_nu%UUKnUf^hLV2+58~P72?5N$+7ugYj
z@Ozk4FO>`G{o!w~6QRyt`LL==4SacQClw*1eA)~=JP}SzX0TidKK2%;j2T)yWmLE1
zEb?sl#yGmb{z!UnGO+^TkiK*52lS{J(^ErQML%ej>tKN@?<t8yS~Y<>pVPe&WyxZ?
z)^Ejwa~jN=49a1FY;Hi>x<z$d^#JzEMal6kSR>Pmrmz`>1U&T-91o6xyGY4B^lqXI
zqd}chvh`h^)x(-Az>o!3NVpYK at pDKh?xhHWFLt at m(N$QS63Xc*zG|B~j5{hDSE9{W
z at hF7)gwCAGN|-9Uhz8%UCW+65sv43<Z7V^x?Uo#*;d%vu_xsH(c7sc4&clcnuKbqC
zQjl4}w4vNu1Hvl6&=a!Y4{ioMwtx6#I@s7oZi+Zn90XkBpFB7ZWLd%i9<;qQ>2(Qc
z5=yrj(;yuD+H06>!6wzsybBLnM~`^BYW<nhkFA|Nnq{^(*S*zOwSy15W;1QgQ~kR)
z*yU(vM5Q@<U!vgU(L>)RUoEKTFcY9oE;3>K?^1j2x^(>AL2z)`W6Q%syb%t*al!lO
zNsY&v;}bju`L&qUYg&_?2`k0gHvVb)gA|*U0=Z6!&?}S;l-&B%uj*ItcNQobx8^+8
zgUVfxQcS<P*f7YOOL#F at K^S#G(^KZ?h^krVd^)WranuCS0SN0)Be7sPlIj41fbcNr
zLsIO9?@`WCvA0B$!a_?BmP?P6XI|Bb^3cNgEqgP!Ya-;*M0hZcve#<ae^0OT;Qd~5
zTT#~jMt(AaoiA(Ptiz^#*u*jSZ{lp)QN(DUmrl$yCO_do?!r*JPiRmDsGbMaY3#5(
zsH^I|U04qGU+g7v1bM2*B0w(id^pSw(#Q9zNuE!MUA@eg=z)9u=%mU)j{8eF;RCJF
z2;2*{{&Jpeh+`I)VN1k&`s(fUU_Kf+>d!733U+gz-OIs%pF415-;zNmPLszZ*!EY3
z;Z1V&hh+Lkq2m|Sqi*7U*6vp(?3V{ZKz){<k4zERZ?APbpLfOJV2YmciC`#Sm9baY
z;_<iR{+ebciqC0{ow{po8Zg;+WODIuEY9ZK%WTlmO$aOu@_$(a*77^R{o(AE-DuUa
z+qowhy-^DqneA{;bg@^kM<uQL1S$X<1+w=ng>xR3Ou8 at pYp?*MS#j*@#dqexvD|>}
zOj}|S^~r7E!T6|+zrBRP$UK<sAUFuo`TBHHv}S*6iOLloBnLe<lKm07iO`=FJbZIg
zbHd<`bT+=C$lC^RcinUYLq)~gF)NG<UjEkW%w4h2x+x8X&3&7s({*+i`ZfFHc`$K(
ztb#4PKiODRZ=Jp^2D6LA!i>m+S(VS$DMWWmUg5z6Y8JuGAcAuG1jCLY+toX_@;+H~
z8=VFH&^hP%1^}uSBmvY_OQu1y1}C#R1IRfRx!*?!X{#d#k9eDUi~PB3tR|b|WJ_Y<
zzGNto{kUmh-2GbL5`(y7oG*fLgCT9nHY=A=OH(tY@a=d>JD4*^KFfSgrw}X_gE65T
zu33-kc0*M%US|&hqdIn*$<>;xhyx!SY7c=LmLSIfw*Fz7EhYV`02DgpX$Td;U1Ly+
zw6G)TV?yG8T9AFuVM>=I3v54G6WdNUy?0IGAeb}sXyPr1$zS{0-&{^uKe^w&2BBh5
z-Rj3(A-^yZMmhd)^5Md?182X!BnidGb}^3={9yz7(1?2^f!=|%ch!*&XcX-_g at p@X
zb`K=cOq(x@@;`Po2QINgP^Cf#V6cI>Zi7YAZE^Se&GW$#ggP|ts+o+QlUD7OZ}rpj
z3I>zGAWHV0wuaGh*UU*Q%@JGyX7YQW!nnXdjzB1enCz$Don714+m3#d-FTDj- at _+?
zV^1ak6bVfQ at 7EJ2N(`pHU^kIz!i5l+1*zFc6XL+VX=jxenF{G#*c<PY%y;IfGp*y2
zdb5u19(5kH!MJ{MzAF|_F8Y@IbU>jh!(c}uFkhRcdc~L_!A~`6E8c*=n%`i11&L5e
z at bCn9%!x1%_>>J9ne3Vx#i=cE432CU6M3i{_^DSXT7?7_5~5s-J!uRNrg!%G7@(M8
zT#~71kse{s<wWpB&sVA37Z{Z7<&blEqE;xy?{5abk`%1(P>~A|=q at O+y5I85s`}&0
zGC2o$Bn-3`d9&K$7 at zfR7^N*e6q2aLGHDbR at KB|MFOXwV&jAxrAZ(4W`$x3vbP$$#
zR#*N+a}v1ciBn at J6s*X<zsn2S1(ZLO>{gd%9457h<c_lO?guDni|Qn)-42*<3G*Qm
zs*D1K-V{h_N&%OjN!b09vg5dly@NeDrGTay>Cg<64APMxEjIWSN_yIuNxeyvx?wkO
z7Dv9YmLe~6lBXW+r}P%#pMwX%3y$e83L`?_7<rHYThCv7)tjN}26j5_IU3(jnR!~V
z0}aWl6^7<$tQ8;D;F^uWIe%MaDS#ipag60Q^a0j?lTNcw1rIwQAshu0h6_Ctq(-LS
zi^5H?Mg at 8@b-EtrOX8xSgJqSjCiOd_)v5QN)m=2Gl?-u$RbeO+2huKl-6L#f*H95(
zxF_ggYx8TiuF)uJMSJM6TFI<%g@twCL1w|k7&KJ~%3E+0a?GY6$CL*{fO<r8LaIx+
z(b6HO^-2o%LA7vTnv`ZtEaHOHd9a8{E5_pZ_WQ+oZZ<dwxi}>pHU9O#`|V<0vUUGe
z$R<%mI6s>%o~6T>q?9r_O6^Xf!(J!+yLk(_KalPOb5d}GV^CQg(`oR<<1nzp>NuE<
zVVc<~R+F}1Bpl0cytqm5i;OtjcaQpOYwz$9%b!EDkVn^r=26WcEXGOYrbCl at XuIlJ
zU3I+4 at 6~q@O*6uH#@vgS?Oki<!|PY_N}03><>Q+hHvL|XsXHL-YCs0<)ph3gv>3+b
zOyGXC8PVyYh=yG)Wr7LZ{T)QIADHF}2)tS=23U~$j`zO2_h*R3Srz@%edbACX!^kj
z#|fPkNadMt$FxJU(LR$<s6@l!HSyUR=KF2qsea-5F0g6)6jevK*gNIHBMm%wxKjAI
zRHedENbC+WyCDV-x=w)MT4Oe|A3fJf7WVPzfj2__*9Oc5Udxwsc#;0iW3l&@$!HNA
zXw_4S1sjVq-Hf=R!N)U4wEz|#RJ(d)!s1V^=4?BF*=~bgUy2*B8O$l0`qexVw4SF#
z=y}kft$-f?$%8N#?CXjfloYN>AOzcXAQjRfd8Z>Sf91HTIq6qF_`P23eDL7A#Nws8
z8GWrF<Vr(52$}S737KkQZs)X5(u@c1Roq27ew6A3G^h&xm*98bLdeqW8?Af;->2iV
z*XE>g=(xkl+n{s_$7N=BT<3nr(-%h#tLkQ=7`yd~x#08!{-m*-39Na=l2}tfIp_!X
zAwqhqd~kXoHqV^;%{~*uEw&%(hm>(I`IhS!aT198?e^myGytP(GeEOFcbn{X$erS#
z$CrZVzkVE%(?w at CP3nVW)CY&j{Eh(p7mi7;cZf&y7mqT$i(4p(+>MqiHtZh51CLf8
z2d$HJ$il-tUVUnKgn~HQ1~spfzUfYrAC0(q9ZDBub}Yjan4%Cn*8l8uk7R2^IM`8&
z;fJ|0J?z-=S;T%2n~q_-8%lDgQ|H0`ta0nJaW*yyyiW=X-;crdkNAW!(^mj2!^dg=
zN@=)I&d4E}SDA<|6FDQnNF<v1oV_y6|I+-<Jb2-11cMU0ZhXt8bqH?iVZ>lFqPah!
zapS at 4*6KLzW9;EXgfqCDIi}KBL(US9>0jqTx>H=#9;6L`k6>u<`O~xL3lOsnnlgKr
zF%&1bu9;B5MZFgq1@mk!z~Mtl3AGy-BTq`Ano#RX9ntJt^B{U1*=-WP=dL>@mK+tR
z6#$3MjrlxDeX2VCo3kb at Lu6+0N-z>ZxL}E#2~!)1#-RJ-aNDBo{dgcSfY3mvZwC`m
zsP6%~!K*E}3j(zEsVI>i;<HK=K=Ox@13U9=C$V{>6E&<l4AFZ`bVP^GU%_JM<MZ^s
z`QWu`0r3XrAI^fofc3E21->G-^iP7JyxAoWr{m9h7&!QPH(0-M!k{i5QKA=*`=csU
z at afo>8IQXn4T99Ox#|X*VccYMz3 at p9J&!v!0}EbN>b5d^WTYfKMW?1Qtzt<5m8xW>
zkV-T<>WE;DflOGd)8bq5pv?xo2b_z#Ip6ZI@&p$C4Ooalb%ooG2M9Y=+JzFBiGY~O
zHwq~qEMEGbA)+e=gP3jb_FK9iMs;Nfu>p$IEeD89XKNuPrR$P}dVS)h1*=Q0N+~?U
zEeDzHlg|gq1_626`;)R6J!PV4NcY=y1q<W$aYK#TIlpZ_nEhf&MjCXMtkWoLnDT-L
z?~Mm<5R5}MH_pwt&6*C%l2Y~t9gYUM$!4=X at O%ONf$KvDdR6Da2@4)ihjQ)X7QSYv
zb*{mlh*pc*7bVdZ(2tmsl(>3`$-8QSike1s;Cy82;=YSt)5iQJJorGu@}0T`uqQN|
z at 92>PTCUQ)xco_3nfBRhT4=Hm#8klydX2y}SYHMnZP~H!G2uIYJ{+bI7>;CH(Z|IQ
zE?m3CAVo&;PCdxM&AdrEGjwvPGN7Tru3FVYU|o7ei5(ez*q!%8SI3h&A0_Ye!ONZT
zT`>5Xg3yXsCFrU(Ch(!bWeu3$?sP!s8=vz$FZ`QrtL7$YVkx}%6yVyCvq@(Rru1y^
zYeffIn1mz9$pvyL=T{vsu-^bs at Xt?^io~albcFb5MsIAVaIhLMkp{mL8D)kku<4OC
z_lVYt8pW*iuW10hy$uG(IZ3`88V~z*(K8`>a`lFF=@|Ux&Kh%c9|mixVF*~KAPw3&
z8DU%dG>y$n(`AN1GZzWa7Hqd_h7RFz)iaDEI)h(PnssrM6zTX^^HE5$J;LXR$(gXz
zX6!yOy71IT#UUCdRBx_v`Mv$w$KMf`KMN1$+jOz%h8mf8^E_xgk{Sm4UD<CMi}x*#
z4Qj3@L?C$Kbf1S7PH_33={yfSs3AF+A|&B~bb9lI{f;s=nf?BzL8#*Ju#gmfEC)Mz
z9ISlNgTv&xFqq9m7WlVbeGK4181<GrBap}I<YwJKczX{FRtNZ}nwdP-DPq%_vmns1
zp%HUE>XKCJl5IOX0?%_hMZc=%1%vznHaSUTz-C(P>H}MsWAHU=AD2W1dr4mpf4}Qd
z0D!!wo>)s?@bC at J)slD~u_B-7uXkJ`4MhUK&}G)GUC65{mif%HEx)WpSdTNl3lA<|
z=7ZVU&@|u?`eMIv4E0K$c?Z|8aF4?~rGs1jF1*e1L9tiWb4r<)KMGBcar-<?@;@B=
zN+`DRSb8!2OA?0}+}t6?H3995$E5ijWoNk8$OO#ZuW7EoZ3-8O^bT%RM=6S1zlNIF
zcoeL^&?Y{mCx)aaEM+)b9A!*bVS6+{zfmk+mKXF}aI6IN3pd#=Apq*{8Ao|XJ@dYC
z7~alxT^AXXpgk&#>Tcjnt%m!zkkM3-R*z;FJdDs at H<8AKPSQViC{Io{ZCB<{p;dfi
z`anUJmLx)Qjl>cY9v8{F079imXFk&=WB>{;Qf<s_YFaw!yr`$aBCmaM)23BiN9|C*
zOHEQ8D_^aPv%OQ|1Y1Ib*_AHzsHHJI9-(++5B2OGwA0ZH4j-Hcf&;V3WAnYkZTX5T
zn<RTQ0Pzv|>riWYgJhjQ9f=GYnT{nQIA6vv;YHJ{CbTt=Ej61a==Ipk$)2p55b>$$
zhZ*%HcMc=*e(@XiX72a6z1$tV!I;>}xXdrvc5#U9?)SU!;I^*ayvryQift1HbpL3;
z6jNueG;r;05E;1LOBZIJ31jAyIR=Xz1y8y%94h-=FwOh`Z}hfy6e30_kf|_<qQ#O~
zGBvJa!Kzm%u;?nN&>(DAM>*v}hXP`GCk)PcFwZVO+(sH4L1_5V at ZiD0xYi_@w?lPJ
zuY>O<MmE0jCt{Ps*S!XPA=&Y-FNvSeH|7dy<iYZ4J<@IuORtX@FjBVH5<WVi8D(Yy
zb_nRUKnJj6;<^G(70aze;XyfzqlQPiRT$L}{axzf^coMUayr^bd%Hz9HNFVP?asTz
z;&pAk!O5vX=02xyMIMv{5Em~877U~A>fp}vmGa8fC8j!I-GL#%V at iZ{+u>+EzkYiY
zL#_(6`lXx#6-;Bg)~6{@f{4{jAH1ai=STuoCY-5=<AS&WXSzecgOdJX-ls0ElIB+t
z*eejKi>XK5ieqPbl=aRcFy`Z{@y%*xEKkDe^Kc8iZa&#|vxXZ3vmN0=gi4ecl3NRo
zhjH$3y}+Z`KVK3Ywoc{C-V6-oI{#rQBSDzd1pRFhE?_6)g#;bv06F03d|n2FbSg|l
zyA{$KVQ|}CtVtreC<p+pP+^dGQGQq7JNC1(ONHP<eVJlp3(y_pjmu*IAq%mf-+Uai
zcsq1rrpca{K#PgxJXW_8N?)Sy$wVcR(YdLt;~^*6kvB=$U;KeiMi_VxqR$(z8%OUs
z6WLt75#jA^FnE6fgTiw02GBDoyx4;0(w8v!0O9%oeal5uh@jd96|Qm)ctwMj2b&%>
zU at NZ?-VrSH!o_N^;kwqkFl^`Z$TFfVKG9YeXY@<Mje}ja5~q1|jilf`rBsj(l?emg
ziPiW^RY+hMChkvz1xR;r?TzwOg){HMgUd^XGo1%XH4}MM*OrX4zNAfR?GtvVxSD=6
z>EO03%Wa7a&zrTIK_y{bsW^rKh)MrO at gK<$Qo7tivO<|78UP)I?{}p`ss%2H;j(72
z4MG%Xp^%0TE@`8%-NjbnVgHv>3Yge)kZNd|wwbuBy%*l|lv5Dkzm;Ucq`!N;${hOz
zTHeBY7ao)y<M@)An%mQ+QG*TaiRzW)FWssvRUh;R3K!oOq!<#$x!V)#U1x)8JP?lH
z7Sf$P<)i^~C at h5uMG1(u(I5-FSQ+WL-$5{v6YbIKW@vfNv=tF`AiRcRxb2yA|0J=f
zX~Vk0hIb}zTUY)>$4T<LXjs+%Ek4NteR*s;F(N6%<r2Nz)E13<y-`1t_gauFc`@y2
zxmw-s10GL62yAD(c;zNA(_Anu>tlYC;i^AKj=O>qX$jI at O#`?xi@}jMHTm+eOA4*R
zp&wr-A}moQ2}Sptlm_K43CCeF{V4o=0b~ANJVRTCFOO9o%x}emUm<Xo@R=5j<3SaB
zF%9N^ROUg0_v&=Q=<7dw)z(J~=^B5>RC}LH5blwfrX#^H=GSJ?2NU5igX5!`WvG{v
zP+7s`va}<_u+Ljkv1y_>C&2z(B*1okpf%J|rtFwa39!iT#i6;B$$C^&)2-M(>+cnd
zUo*o5jg~DvTuE$f3uQH_eJxs5{D{RRX8 at vRE?xnBm>blGvs(i=j-D`n+IHw&%x9)W
z32rTEXS!lbt_xpGNTTd6p=`BiNo+VUh$m)!HbUhrtQTCYm${turIYR)_riqd#p=$Q
z;4*|Hw{Nsh^3rad<HAT4GKSwgoLIbNjme?=&vYG}x$2j|<<#VSEO@aSmlkN)?HfnD
z$Md**kc0UsM394-$uy_aQA~00bYJ*|If_~l>i#I^gp*4T`p0A at SQ5;OtA2qTD8LBW
ze7<#g;H_$s_#z2Ptc{u&##^2|4T)i=!agjQ-b3hR;(-HT7j$QvAf~?1GS?I(VM266
zJ0*@sybiM+GS}S8#7&_SE|je3o0^Pop#Cl{T&4yo?6%KUND+e%3f(9W3oIV&A_me`
zYMAb&N>Y=BW?X%LtGYP8Jgp<Li>%tZfpW{kFPkltkb7fF&7rCibJl8>Y6JB!h6tzD
zyH9(>qdRIloqjPPj#u5klCZc?_aw9x9Ly@&vrQe*<xUP<%qbkK0fXc<lZv9yc(ZcV
zO|=O0t4AIT1+9`g58nTDJed78CvMBco7!=C<ArWk*i|x-7ZtlC?(xZt0WBt<)V??a
zfvq^RqcmQrc at m7V_v|JqP1uU-nASQ$pb{o`Z at gWg7zHLy{FDvV2rdLMJ<{F`8MGGt
zh5IsWgHHNa at KA3A$wbKfM|b9f2IG((QR)76{lVM!Ozdc4l5eb|jyK~+eRJ#a6 at _%;
zLlYRkFmxodXnvRt;OA~@L4Jd0)6_27=m4cNH+@9GB1-e07z^41B$&8CAP&aNSHraY
zHO2G?3G95WJq#mZIL=9Z8N#5NlR->oPOoe3_xqm|gTnx?-*b=oW(;T=J!Vwg)K9>X
zSXUGzX^Y0~;23(&tjCAnE{w1+Lv)yp at zA1|RyvOKWH$*rgah&-=7QH&mrQj984s<b
zlZJ6n=mP$<Et9}gp<xWw(>zmQ1d_3Pu=!wJd}3<`$_MX%Y79nd#6;X^H&-O0s2uvM
z0<BW82tT>;?jZI%Ca<5JUVy3aG3m?DUl8R5Ge3I<q<F-O)#0%c4zqh;8Z;p-L?2b;
zML1H@0xsAxgk-K`ciQWn=zz8!%7eLMu46F+7TK?>E<46QI}b|q%~^)Vm=Jahas}OO
zgZtf${uzWlO1trKh(2&Igz;G*{B}51jB(EItGiGT^Gi=!D)Hcd+(?JC!!`qFF+`XG
z9=J(17W04vs%Aa<r5$Y?+OZ3NAU+Gl>A9LAUQrs%?spuwycZ9~+w1L_VaEjhXl^;r
zVm3dVL at G{UmW(WGZZtkCeJ84z!@v7Mpdvy0D_fk$7w*zf6vGh`tx1wP$w~QPUCqIu
zKX9i7!z>rXrBh?TYwdC-(e+)43E{!S$#!t@?KBHNgh45a1$^j7ZJm>Pf3PqRj^@h!
zEC7%AyfDYNFCSxqr~vGIcsPS+dXHe3QvYz%a$T>o>(2mlyD$sV0RRW+rB at n#VDNfD
zaHbBd-O|2I(M={UT0*f9<Ygx+tt$fW at y|CWnNpmY;GtY$SVJip^- at P{CV;;60z-~b
zhksl(T at IHShEcIfp_O=$bTLPI!nEnxTV`DuxbdJ}LWQ4nrh!Cl$FO5K(5{j}WWcUX
z(JU|sOBTKnL3yAf!rVbf|G@BW{lOpPLFr0sV<z8VR;+&hJTgv2Mr02J#>)cam}G$C
zNiG0T7~lOEu+(bea`4(^dg3Po)kx!OJ54Dj6vG*%gt=cbFqG`i_6 at O8He*0luLc~{
zCBBA}igDdy5vwYy2M~rJc3h!h at V)wjKS+b7LU!}wtjwrvC{5DtZ*YHnsqaZN&QHka
zaEDnhW^gYUb956(mA!<om0Xv*B0Ov}hp`9C8N9NTuq2 at XOw3r!Zm^kdxc!i%NDJMJ
zH2?^uHX-_Jm&E&KL?I^Z`q=Ph`QXoh5c at JW2*-NIL}GP|7hLyZJRWQ~4&Plqyjo#s
z4<1w5g559HNk_bJ$p2EJAHaJxn7l8zfu5m3oyoawAP;}(jQ~A6V=H_VOmaV<zf at E=
zQ=~UTd0-B#DQxg<Bbn-u6#ukyk_-C<CosfrwT_I7=%iap)=Fb7gTv*h_n2280}DR8
zP9v8@x@i6=2%KYR!|)#(>*t^oH8U!P15722SH67e*XdKbJS+xGX&8jC$zUjQE~48?
z#~_x~Rwfv5+qeWiM=I^X{$bxtH}g}$ShQP6e_c^yuOH|7nbjsqe at f68bf&!KOfd8X
z?H=aEIpNFtnRT2%gW)3Z#>wl0HUfh`geYfg3S at ma4}s3K{OQ0qnfOpKQyVg3C?@ku
zh0m8DCF&mm9+dSvofk)Pa(%OWaQX3gobzbY&q97YDRJvdBQC)^u6fNf*fHz*9Zzz{
zr<NXNglo8pzv9+A8QqQN=b$zQ)(fDT>A!VaOQ;w$yTp at qPW79P^oQxPle;4k^qf%8
z!!IQiw6D4U6?)X!_MllHqZV-1ufO}t4BflQFwQpmyjJVtfb}sQeO*;l9MQ7Hg3F*Y
zxVuYmcMI-1xVwblFgOGcPJ##5pn<>ug9LZ?;K5z<xcC0QkNW9VeR`dis$Hk|*+mQN
z=C)%R*RnpRWC*mmCv|2d5nZZ3CH#dr#`5+P=eqPDB~`2cv&3OD3bIB2t2Zx&He#?U
zjf0~=NoHq7>V}ir<xGQtfWj=H+WsJ%Ty;Da9ClTE2SEXaLjiP$<~nZHF<m}$q{VBc
zBd4g|U_lu;F!iZ>XywBiyq6Hk??RfNF-P4olp!C*lxcv)rFG&vs9eydj2YXtt_ZwP
zya!&*b$7ix{D%9z&qUQ068;suILm&Y4oKd1na_-JjBK8P4yL*pM`OcKPV)Y6$%5D?
zOpW}I7E$48`ZXxpg2>&K5zrmq#}=33dp4_DwtcyNbh2nw6{+;frh#z5;r)!0dMRHC
z*gxN2U=v-F;5VZzXtl+}PI*6;!8Mq%35Zw7Bh!BJIQx|Cd^b)oB-8oQYd2|^-4xNN
z!8mEaAV^Tg6R6{C+%%Ztto*JbGKjXrkK6}&l3#la<?|jT%BWig&MVvN*Qo-KS%xJ^
zkV^z>*u{D2ASj^AFQ=AE)P=V%(_8S+W+Y`89<Pd%9AHFdy?Rng6S(Ns&EJJ_3<x)+
zx^Ozw$cDpWs1euUE*_I~F(t)B=4cL3*u2=e_~OTj`D!BW$GegzAZoFHCyqj4y;6m1
zIq1DIWEzt at i#6!=o}~+O04-}VyPGfhGU=T`6c~eqlCEjUaPJ~lV0vr4@I7usoS<P6
zvA;M0tXXL65BHE<>;%>@(NFe_E at I>mjkYgi>M!qCqdGu-?paSnrW_>N62RJgze3YA
z74xO1M5^anm at 1@)R?a;9fMyR=X;|8uL5ALCA&S{bR-&dC#a6Fpgx)quupctq)U}zB
zgRsG15#9c53krPEn<=4!M@ZMU6vI#OV+sFlS+0~g73qRGz?&)MH^>z^Nln at p{c)TV
zs5ea=bcjr2Hm*ZUz`q9&3A$uzy*tGFW}Z2xS~#t-TBJ-opBca54h+lkbA_L*Cp|$P
z|Jwwx+Ni^FdlQcZ_FJSk=3K=54e_P;k-fof(RLWRlci;mrFhemT0WX_xT?^)d+ha2
zMxtWrukJ9Uz6`I{Mf*JOJ6qYvWo~?T88!L)y-P|ZYo4|CG$>`y-RHS59^5cf2JJVT
z{GDU(U)4Ey9%BW)-M#7KanA+heZ-*2iD!vjUyD@%lvZ`y-VL)%oN$1A8xc!`v-~{k
zgJ{W@(bu4tK&?S5w#HJsye9P5PwNEm4J`HuYm}^1F-)l#ZO^!325$oEBKe5KdJ>z#
z*R^~kfdZK887oQZO6Om;ko}Lg`k&<3e81GM7G*o?;&ji(7HKHG;Z39+`!q0H(2TBN
zw~41C@DCoP>Cp=FD1=+6kg_J4&eP!-NKVz5L!F<fRI=6k8&#mQZ!Eot|9R=wuAClJ
zAU31Fk{fZuIRFtP|0Og*yuvh_k0%n-XW2T6JP;-D`R5V0+gE@w`Mg|}YE?9srtK01
z_>W0ld8u)Fnwg_L0nDNb%-3R}k5uJL#-<Oz=a{W%!1QSy=@*k4!F5r7LNTl+3rxPP
zgFr97=HD3A3$j)3GfretuM^c%`?D~*nCHnvbwd9!i;vFrSzCKa7^jl;{j!y$^@<;$
ziHYZ#1sjjN0?%FOy=i%_L_FA!ZalJ9Jvqyz;Y?YFYZgu6&yq@}79qeja at 3XNx_q(P
zh0|^GXp|<2#+r%f+^#}YIW$LILgI0g%WQ1c$wD99+1$GlQe!N_L3@4T6Q0K}?sKb)
z5r{Yuy*VWE4WC$tA3s2%S+1=d6;E^ja?w!ln{`qU^{cArC9GHmz<tr{q3~%CcAWSU
z)DQfGZK|Hp>0nA0VjxjIle!6;jY6r4c~9n0>y>>7H<NYIT;k~X9Zpj-P#fb8Wmx^+
z0Wfttp20=gg?kw$!X72Uj;Dx23<i&MxPQ)Fyokt%eCUFB_#fLcy%Sg=b}R9<7Xujz
zdbEwazR%`NpUt7`&#?MMk264tJy5W2rxT^w;d3m%@4a_kC6?TW?ZW8A$Cpn*{@K4`
zvMz`T>()^ycq*TNuCnQj9WMd)bC)TVzHA!9?i(7irkRQx1CrAw6iFEZJ}|tBQ9o%j
z7;+K&UaFw&y;0)L>7AY4AMls&x$FV_94my at NHsrdsDJGGa&KWFG~yu at b=dB{87e6H
z#M@;x-Oe$cj-;{pdg<3bYt5?PzUKjlbNSLHOR%Krt|%dY;F8r7Hbd23QKprA8Z*CW
z#+5wvDTENVR${BbWu84t9Y{_?)I~V2PBC~r;N$Tu^-$1Mgncr&8NI|c1efDmoW#ji
z!{%Juj2?JWOvo@bCSRmw0s7tpRYEHM6RI5OxXL>BrnQQj67J2t(^+6DCgmbYGt*o`
zhmMHLKlz at kMq=^_67G at Ig&;fMGQb8rN7vtYndq_+2Zfk4d<ilW6zW-1Nt1lF%DhXC
zTFANb+&0*~WpqIRE{RK&Rpi at v)Bfa%Ym8gyCwq=$1j3M(gMS%nX+T2{O_S9MmqEi4
z%(BL<_Jq|+;0qhxT7QJAG0f1lypn$_8=q0mxL;*Igd?U6FMV7RYEKdPx5G<PW%SAM
z!835!qwx#B_A}ur)<DTSKkg$f@nWC!3jSsgmb8?tgT^2=w;oJRAm($Kk(Y!v4~p8M
zmg0P{`N`@ZVP7eenOz~FLt?3QxA7D>)CUr#wIj5U*iRn(ecPgFBkOhDiO15^u~!$4
z4#Kgc7R$O8b7J|Sv{gNZJLe$vInWK<D0`?R@#yT)4d(K`n^c)I)vc50VnDc=UEkOl
z9^Xis6<F3em4_i6bXoYZeTX0`ZOOeS>n!bu*YJDlKvv94_B+3)Ll~Y4B$<XEGwSqi
zO57_SC23(5w}9f1&kw1NTToSrO#v&3hpL)@mIq)gUFFL>Z2C{xF?#(@#^!cZfIubX
zT?bsray+Kt!z^ATJC7AWMu_mE!v|3lQ)O8Q-&-{yZuroN4l{HE-r-y=OpUdXTN2h6
z-H^W3gSKR5*R$t(X)ZS<Yw1|{g;Y%2IBoR%HWAj%lZ=c!aLjU~;d0BX?$K*&2&||W
zgc)TKV!#z9 at 7`LP6ML=x&^E$aws*UV<=!-_*WRsGYl{)ecv at qVv|TQy&rL_fPOzgt
zCND<#Cd2o=w*HM#wPhV?f}-ifa@chWl~Fdkka&y^tKqvpTCsZmfOtdXWV$J!NK6tq
zDmY>+l$6#se4h|)mgUFLj*>EF>ig|TE16G!x=5O^U>a#Z?q6&h?(O^le;{F{yi2!^
z)-}w=C!;D$8&qt9Ulm{CI1*(|XgrErQ)Q_q%NSD13>?LW%vqNX*;+;ph$K}j2fla4
zX)8n*Vo=baGY|b{%08lXm%}^x%SnU7n1+hn4kRiS9L`5E>@!O1?Iyt4E97Zuj*Hs%
zE$B+O%cxY)IwS*g(p}G?Ua?;b&bBEgMa$6|2B+6D2yNDr at os7Q*Zpjh^4gMcv94t3
zK(20-L9^K_qFUzYXIbKmpc9k+#JgsWl0W8`gC7*qK<BE@{M74N;$?USgRBHSG5<9@
zQPt4H6yR-gddV(FK{xX?^70v`7VC?jzVA7%oi=Xhy+?eC1SfAI)?rF9<PXJn!4a7d
z<`2_<c{!}+7|NBkg35GY1L+%w at M_Rk)mG;Bhg{lFiZ?m)aQOLOD?}{136Uw2&Q4YK
zm8wX{HtR#!jlb3?kpGToPdqyw@1YFypNZ^94ebR>^o`5Ym`2~AV5MP8q*liwbqfO5
zHp*qO97$448m3a#Uo4{%px;JMGx15;@Y(4!jSQp0?ZaUOPA5Tn)A8FGn$w?)1p2_M
zzudT@)gUwL-rsOhOgwQ;(q(s{06V+D at 4sJnSY_y#^qw!tOtCUtibC~58|fENJYewk
z2exEaRIlu{ONb$CJ?2wCXINq~b^&THe1}XXEZ*wo(*}f8z2Qps2}YRTaYNXt(n8JE
zedTc-|0Pg9QjS6{Yy*N at l_&&_wEA{a%ZyRqmEB$V%iiq<rx?q9cj1-Q)H&4Wesu=8
zTJ`d|ds>r!(f93IJL at Kd`2$SjyO8JhVb(<W{x~@qSJLTtLiLB53TodX0Cvb_O2mJ#
zrm}GOZM?d>uHWPRGJ3ETT|7#q502hXh?;kR$Sd+3WN4pgsF<2?ghdME)W-i&I!3N#
zeQN>^*C_MPqKG37JO};7rr+KZdDRQ<kG%1e3efZar#P+S=nVACI<|2;QZnECQUChr
zXP!|Mwt~R-j`Ucb(Z;1vkb5pZdtt@myjEuC*y?o8Z@<U?{!vu9Cbv>J=e59h>emsT
z^yNoYT-=1+Ao!zj{77&jB_{fZY&sXxs_p at i2I>S`$m4}i9+pTpU`4xNXOT|k%h(R!
z>D~6MQv5z$&<ky<lA<gQa;a1R!RYWqg%}feH!*xSCC>V{3-I++W~_UM&HhVyg;%*K
zX#bC|s*AW;h5D$FAUS#_0e~OgVFqdCKnpswv&A!c=&brVvC0$3za*pbET(BPp>!(F
zC($+zDNJ%K^2eR#N1bJck(2`4NlAqb!%N=CP`^>jGq>D^AscQDq3z~h=lV4|lJBJT
zEgZ2a1KT|!oXp5R1VB#9jrA`L&{tJcr<A#hNQdDJPbF-iTi*bqAYyT*JQ%jaYQBoQ
zUxh;p0(o~?{;kGJNLW{F<-Rwfy=r(7%?5=@d_PzJb`k3U{5wA3FlXJd6^nZD78~PV
zd=e-?TC0vyj-Gkn5wc{M&~T~5q=!WUR}8)ucdA&3a@x-|OJU;CisS7;)&|UsjQKS7
zL(_JyY^UgojCr9)^wEIFOxd)>L23<ax&Ta?l;HQ-#a^D<i3$1`dB?L)Fs)o!Q>CCj
z1J#TB*UQUP_RtGKHGT_HLcXQ3__fKKEY)?I(dFKPf?D+Ka#ey}u2zg!W|OT_cxu(%
z2w}7V(vv+RBn+gA05;S_&%(*kKdA($pPzmhp>|Dx61LntEhCT?sH`WtK6b58<N5pe
z)>eyRovr2H^=}e=yQHdPu&Gkgcw at +nt989GMnLnX#DF&rP=EL*L%{@P73tcx&)>I1
zwHoE`Yvn1rbh*cW3nq>rKZEgkr4Qc|<zh2v95-1;<B4M~4>)WjY#NNIht7ZiIxBVi
zD~OA(@0d(z*p%LcMZ1U4>@Mag-0l(;)EYFb8nS_dc-=fWd>>_;-veOzaC=~JpNKR?
z&l=V-6UPn)dJwQ$jm-ILX{kVXvQ2PDVTq8uPMD)+E^?3W4<i!Z7bY>v{$iNzZvFue
zoRAjZK=a*KJWo?HxySQbP<7JFh2J5QTE^|BUxk+zBZk(e*Vyme-vHE0HC>I^WW9b>
z8bA4=9EA~EZMIzbwpT&m`VT@`o!un)B8J`Gk49A3-VXp-{f3xgH at u4?9>%2T`06dg
z33I)g<-Qp2JSEZ1 at I~$)BC*x^?cLnS3xhky7Wr4}ch^}8+H}O}^_1lTu*+~!{@BCX
zia~p8Lu6x606uSa@aO!QcP??8v!C{^sZp{u{?hDc#F0^<aiQBf^+Kvmi%zsy>E(|P
zmSN}z3sg>n^WH}4Y>)bOx4oDU9M-W|?M%-uUgQa%kV3{j3i%fL{BPMvUWX<+?am4o
z^Jsf;x?Z!*$yT#fl?r}v_%(3kf|~=O{4;zkG6adH#EOI%g1BLs#-X_u@|dV&VtfnJ
zRswAycH+2@GC~I~W*IdHjROG2PRTMcO>Zk~v%PkIK}I- at v|}vA<7^Gpewi_1J|Gf>
zwoWjtw=P#TLp}y2$Bw?+HbNA{_2bA8uwY)6;%ZDubRMb0u<06sF(YvL=iR21Hls?f
zo<luxy!UOG8{dURjBT<$o@>QWum at M!OrBvnvlt1%rPxO`4y!?M%<c;x1}*l)RXif#
zmt;#MSK?XEUl~j8)*VZ)0Yxu;<p!(s+1VDBmC)9q6`xdG=j#tqw<YcR-z#Htxvy=A
zgwZ$ginSnAhu_#}D-hhbHS-JT5wI0Bc;e@zd%sxfcH84mR<^`v$j>OqbIxO0)(&!>
z{8D?4eG=@(N9OdB_6ktK<{jq#$hb{uJJ8Hhww_>rs-l#MmE)N%$gCs$sUPvxnj5mS
z74e>J;27RQ2fz2Sq+Ioep`|Q!8>V^woEMA_vglsP<eZ03$qAI|N}QF2KTUDx<vKi6
zdsQEzE+<C!;;L0Z^LkSfc}C;%3ohJ}=FH~4wk@`ltn=Q27F~tK>M0uu at Ln{oQgI|o
zUq}|FJ)!7uc(chDNj0n`lTpr197%lbnI+2*%r{{pbpOU(k&o;osIAZ%Pflmimvz>1
z7lKO{c1RLoSYv>qso%|~w=PWS{3g at 64fUHz?a#(0;cl)f(fp~)piiWcp#ES<*2c}?
z at z3kFQsdgvSq&{2h(H%(JCSNy^JDUzRU%bcSQptOYkh at zAZ$3VW8y$6kKzx8yd}IX
zuEj4tQ}2DX(JClD+AHOiLW;H!Ssd+6ckYX7a0ta;lQxMjjlVSn<L(~hM&-?BKV49p
zKNXjZB-HnGMIMNPW!)kzgQ!q_R&ex@-NND_fEqZdX8~js*>X=VAlvdyigK=%$UnsP
zc=o*Xl9~^PWe$?j2A$-1{Qr;_b<Mk0h3csdt6QwQ1+}c|86Zi6-{2s}&2g-bN_cL2
zMn&xMQQ1mYA*?VmAM%A5+bWVN5v9y6^>=keBu{g43a)ZvA at Kyihx7WS914sKww0VK
ziOR*9D(I@#8xTk)FX9bUo+jwCd^7}0#EvI0Wewo+#gX;5M<Sr;J=ndigPXc<O_r7l
z-{bqlh<e*ScRXSFadqHl?mAi+)K&_s(`@KOv=pexfmk)uNBki5U1S{xVORp;yy~33
zc5=s#huV-NJt=k<+)|7->O<MAGky;RLs4W8 at n~cAm<DbFZCZwvnb`Tn4q-4q at GW)R
zGVV!9Q}=QFJ~WUJ@tuaQjGeV*w%c3Siz|4wBVs{@gy7x66vgcTu?-!%(uMz~HHiH)
z>zT8#aFC1D+0HKrLkoL|l(?13bx(^aL)0e_1}z)Q^)hR$VaCpIJn_B5mKx05t<7a7
zd?<fENR>kG2Eis7BN}W2mF+vYwPCv#&av$pmpz-C4g4(szWOl{m>ZY{MkFWnN-jH0
z(*122ebZPPNPMhGQHUl6L5K!Lt;$GmzgAT~YoU2EqL^%>^MTRx<S@Z~oOW5^x`Ryo
zPWx3VY0{>-1>ePq3I{pi2hSp)Pel9SulBpuJS|sm+$fSOoDoPQDP^*(p=AO at g@uA8
zg8g=QIuD}&O^G)9hnid at bvgbo$GY$w2f~x+&;*re*fy?M1&MWG(^~SEHKNGQi_=Z!
zuf7xUaLLw2$PjtKwYDTc7BiL!1?uzd_ufra<;4jyh3sHiLS17V@9%$q&$|t*$6-(6
zw3qc17o^dT8m6sFNpm6Zb|-HJ3sbYDuTvulTEgicp*0eY(u#EsP&iX30;8i1mR?Zs
zSBM(~w9FrHtl4O3G9wmj9;~n{L5PFD^i)Y<h1+#f^+bzW=>OXN+<7<*xABgX61(!k
z0Hz|scKeC7C5w-DoXcdUT^3yGZI5a2Zw-+In0v$ts@In|aDXb%>N%+-?#;z_tTSAO
z_oevDLAh!K7Eq;T{E-hr9D|ZP{ea2!Y1jr)xD!FGtY%2z{ZlU0&RySTBO7bfR$@<S
zlX=7(UOpL$(__XUapTk_ZA`l9D!Ry?$x9Xa%sT{`Hg`_GRPFtHi@hP|sWQU)aX|#@
z^k44??EUvkbYUi-s4`0&c)1NtUwQk|E)INc)ub-tEc?kak3|x!7J(Lmmy2fR5Ms<)
z1`7S?wo)T+SZ?w+k?}+IG*!BqLX$~-MKjuvgOYjiPck(Y!yMW1^+=?ZC<(S)*>~`6
zMb@`+;c{L*H*kd5mfzIi%2&E&LrOXEyu6kTyQjZtk~k9vQl>=P4o(JeX~q6PbY8P=
z{x`2x_6&q>{uWiFfU1nRP>LD^grEEzbIyus2+xZ?FX9OJdFAQBV?xF>#Xqb$8f+s7
zN1;ulvxM<N4$B=rtVDi7ii+UfE;u57aQGuwiybz-+;91)E1-&?dMYb{ujD_r_O~pu
zrV?0uv{10I?S9fd2`oFDJqv-yY?&@G#*fo(wuPiVT3C28cj=}60I}75b-^01pxw-H
z_oM%oF2jq~eBt{8Qyh~k7K16uUB*b#z5dQ&GE^RH7)Ao|`|I_Ewn67EW~)sL-)xws
zA!=REn{N^})DH~7(Ruy_s{SX_{%z)8>(pOjQn6#}uKq-o%S=%aM-`?%!Q##DhRrN&
z6L(=UGIixTx<xiVq`Y59e>GK#jQ+lO6F5Pm5A`#ae<~=x`Wxbbe7*OV!zY!%LzCsL
z=8h&upl2c7&6P{4W~)CH=dI?6h&bb&XrEEWh9E7;sOs at H$%@g1#rXBCRy@kMO_MPZ
zSOV6#Xz1|;FhzF_*`LURkiRyN!BqJHtj-Eqhl2Ir!JQ%R`&lf%Q&nYk><i^}$0qdX
zh5eBS+}$tyk at AstR3qo5_(6UodKJ0zy7{&@<-C7Hu6WCWyL@;t0jclL<7bUTVg#9M
zSQ04I<%P_DK5$P8_371+z6$mH0ioehAbD3)-}#~z#f4m6&~rwW6jBIV<xgWl@KT5W
z*C;x4k>z2)Ll13Ruyz8w0 at dF7r03DOGq1D^Nw;tIY!igk6WXzf;$g0gN{)Rn2p3Z2
z?PSILAdN2X<#HGI;f{Eh&E(5sisiSqn={NKoZk=ILp11S?shX$o>4Si%=gE46jZDY
zr-!YqqU#ut&7X5PTUw|w#A<ys07#Q<WLIjG)Z$Kpw-W1vDo4V=Gt|bZoIvMyf&n!t
z2Dp8bkPH>kz1-zu(X}8O4&xM^@w2GLu|m!qU+v^}4C*_?Rj;I4M*O)4_TH at zULmmz
z?hj_)DK}oRK?%al<Ik}mtmMlBLQw)H!rUM=n&{3^X{{_n<s3iIYBN`;rGzB1m#~$r
zq3mxv)u!+-ro}djy}^9HDH0M0jCr<2ij^HqQP}BPIf4wP@n`nBBK2Ko1#$$^R+8Yp
z%Qx!Ka#Q4^{=)|809uag+HnhO<R{};`?d^zTF_i=zcs{UD4QNqg#uDV^nhhrb|Gc*
zfK__{@JPxzD|{_-&_>yXMwmMM2xm5Y$dxZrx}oi9{m?tx))%*Slk4;z&!GP@%eBGI
zNb5{yvl|6xfPKA)gBO;8lVK?;arx~1*MQ+pgg6h-(fpx}?{gX2kOSur{P;Fcf_-{Z
zX(@HxlXIz|kMYXo!=8n0^)=q`pAlGb%PFyJa|hm64IwCDN<FK~dT;E(xBn|kdOFkb
z>ZC+IYgoEf(5hSa*PE{5_TJ`c_&BLswWW$oA)DTI;ZeYwxdqU378oLox;T<oQlbXs
z`!tM8dlmxn!dw(O@bl6~MQ?lZ00awir#_Boh-YNYl6xH`2YC4H)bALetMRL)FSWuc
zw~MDC+L-*`9mU+)GAEr~s>O0vTvn at RC@cv5xq_vM6Gy|!B;}t>+A=_K?1tOvNEohd
z*|7ESeKPbRZ1h?u1RP}7gD+;cM#Eq<qd8<=sZ$?RQzlm;NaWM3lJEQzrS at 8|1c|P8
zS7`(Itd*^G@%yz4rNh%t%k%NiM-;9ia3k!t=^88aWx+pP at je^7!E*+sANr at QoA1ix
zBXvlAsXOg`nEBeltEKFIPm6}0E^SX0;q@5-L&HB0UvinVD;%xtUE!@SjeM|yv183&
zs%Yt-^m;A;ap}=%zw?%4gIKGJ+mD}N!UBoQ9}~4Q77b0m`csBgckB5EW^%RBLc>Z+
z%K6H>$;-`7`+1g~%QwO=0N$6PKLoaMaKYKYGjio=1>^_yd7;H;h&OjzaU{9C6ziuj
zDjY57l*vywfgywqL_fDMDJ9hQmDRbl`i*o>w*yH@*9WQ%cqJI|oiMxf!CfPSbUgdW
zvn6`4C%zsIZp4q8g+ivc80xRYJV{@gC^3Cu>;p09`F^C&>h63{ZW_HLJ<a;J1g`pG
z4;n%qF(USgJC=F3C#5$fDy~bvqKQW4`TJ_dw=;O!Wy4b0Q48mVknb=3fC$3TlO;$1
z&N8dO#RU1oa_OFnN>|YAm&qds*jIEpE(f&9{ta2_`QCs*6WGBa-rE{Jh_439pX7$l
zMh(S5PC+S7RQ3EuvbI`3PDX#x5h?EQDX>b#ipzi^!mNH^ZvcX-#cRmgVy^8j2y9p%
z=$o7Vp*Frj{Fh at 1g26x9;6Ti$$u-0_pf=(gfOMcVF!I8=698^z;4rN$5%pV5!a<Jq
zBRlb2W8a@bc=1gE`cm+%0(*Cb6+_9UYIKC*RXi~=ci<P9JRgFis?tkF+~r1ZV(;xE
zSf9N0D$g!^z&F*RoheIs{v2|APeTMD?X+z_jPCF7x}TZ3{T4bRT#`ITK`}disn#@h
zUviMxqkjKY<8B*h`w1S7d7PXc8#2Zt34|eWU`(yno}y>;h at 3N*6Nan)(Sq7o=x7y3
zAtV)IS`ND2!g#6|1vqoh9S>i!(0iYr=BV8IAvb|&xE2#=0cZ-r7<)g~X5nLxw(}Zj
zX$?(1rrAq?ygV%*+ohHLqOhHbdU6G}Ej@d9p?m&#AFpTKIzb)@8;i1oPLsI3Byg{4
z?{zQ-LW-M>0}yQwEoTEB!RN=Xs+~&))$)8mju!?{E3$<Scf6|X0Qai<DRqPtn+p=M
z%w)z@k7v#2=il*|f^l>ism&>-zpl~ScW887(C=#s&2rhZv{5<Rh$-8w at C#9g#qjn!
zuhqa1@Z<Sryb$%#(~6D~4w*XRpy8Z(`)0~v)m4>Nn1Q+%BS-TB`h_e_g<%6dzITBB
zbL>4`sskpG=9+pX_*c986pJdKI=o5=O>}1Y`3d;=_snyY&)Jg|;C)S}S>_UOkyHog
zyBIT3z|0duqps*e<@B$<4a-YmXE))+3Eidz!7r^Q9KesY@XyGI*c;MH#ZyLyaX}K|
z6ix)9Uv!!$KLilEX^w&Y?{*>3vwbM(>C&2!Ru+tAQ8f|8>u7nAzpKM??IzxgFWqFa
z at -IYemUwmR2;36C%Vq&Re$UKco<?UNpk7Kh;jUyS7)j30!KP6t$bm+h;5kh~7Q6l8
z_auCO@~M8r&Qi}!+G}=AUCl^bvCnJ{+rZq6UqvR?q0uuqzL!8)-I7f&Hk4WXS~RA`
zI*VqP1tdsIuwTPL!O2g?SRD(-_*zr?G?)<7HmkWfFI6e`8jaFjC!wuxAOdJ6NCbBR
z25S@2ZuXCatZw|3PU|fsmMD<;jqIHDNs|C;(h9f^??YyJvrNgs@*g|*Ro`83#pSy3
znw|(ALiM<J#;m)i#Em6<z8^!R2B_SrYq|!7;21FmALdyU-WCw(JF6!TetV;AU0Zlg
zYY%3iFZ+Jmi&>`9v1>j^q9#1hE3Qj0{Di*QdHZYuSR at CyCP4lEfzR!@?mzfxxJWLB
z56n at uE;atV3F$LLDMvnMh<QJ!=*ki%(u2nS4xdaU?gzh;S88!Tf<vft_J|GX;{Htc
zP}6$-akf05S25zG;Q0G-AEaB9sOn{KF@4yJg3UHM0>93(nghdsRC47VUm4UqhJ4|#
zy&zuvG<a%de(jYO+=U=+4A0@coa5J@w=j8qLu>XgW(@G3aY&+hcnXO=cmruJ?~V69
zJbVrN5~09}VQ?<YEUoC<+K=5=n}_}sC4clWV5RAW#HIV$)wQT+tTtjj!wBblyx$5p
zGY0$sTG&424cqiB1^PiZ0Gak3*wDMTeGMswgD6@jfsDSQW1P<6h$C^Y@|Gt5#>Sr2
zf%-82dXe2EfJ==fhU4H@=$+H5CtemZ&QDl1a{n>E6j?&~L!-`JR at -Xk6AGj|1Er~0
z%IuSXep8cIS%y`-9J>buvr#Ks;-)2Mxv=O8zO~6}dPO~w)4fGoZLLG{G3;epyW!H2
z_?XD4_KPS^8TEQ9qaL&0IN>vx1WWw&cJRCN1Na<hd0vjeFkP9*!#Ru_5&kK;Ze8{h
z6UWA_8nrayooZaW`Df(GHW7zFx`0C!sNmGNADf@+;Ir-?L-Wa40hhEer>z-H)Pw&-
z;h2mk&Oil6KkVe~p58aOjL54*mo3M%j?Ak at -HgZn%hi0wRkTcv|LHQXetZ#5BlNWo
zTT1MVmCRkKUibIhE;%jt4F_*>QjSf=CixP=M{oy9dlvNhw-+WQW+EtI1wkxlJrDk5
z-i5;;G{C|WsQdm=j at A(~10Ew<`{)?fFAmb!W;yWycC3|sc8?>>;`hU#cdF31j<F24
z8Akw>&{7}4r#&#~zZGuKO}AKRsTDvH_)xMRITF4cv}pXH+^Bxvi)2zOR at IhVcGiX2
ze~?2OMMDAl(wrioKT4pHZd7ok+(I_si`AXslvtpb9;jE_4%lt+%O4(S++(A}d`%QZ
zZQm+CpmfC3Qjt5wb9xv#P*Ss1Ps6kn%h(%?u$!b6_*Oh*gEv`V$PgC$d(up;9#wVW
zug;HBnBr;c-g4NO#v*p|%>%dS=ErATSFR8s=DdPHk$YUPVDz^J#!+bl`pY;4ruAIJ
zZxQGg%PWYS&>B33cwMyo6rq{DEVOZF7U)fopv3oL%Si7?=@3J)dTa6sv7vuC{dX;(
zRijU%iF5L5UZkrig%W-vMU;{WNMu%7)6~itS>>I&P6$#!kvn>x3)&3P`|~1?N3fPm
z(jk&<_z~3yAxQwzC7s|gUE8Z~KfzGSB?P*Wf^w#EJT)sP`*GIw*Pg3iJ$E4mJLkZ|
zP-RVAEiL)y$J8IsG;e~PtAJTwRYZmvtKOz>P;;-zPt+`y_3`Zct~oy5Kar(@Xfhv=
zv}cOSaFG9nnpx;{Uyop=ZoN;(uFMJj8L5}P at HuodRFm2>UMtQ%lRhUy<!|ve#Ol{g
zGxwdyFu4U;f7ohHzMt_DRKdRT-KR%m at M#w}(^r!V2H~S&@%<kH+UVfuXFgT75@o^V
z;_1&P{v=E=6fzxaMJ>~{IyUf=@s$|Ci+Zi|bPo3mY|S0lHT(}ppM*Fl5Cik5!*qP&
z_NeiZ;>J^JyL|n$S=9bE^hxCV(2f9mFis2K?D2Vn3UZK7S`-GY|A@~xL`f3VI0 at F4
z-q at Il-8lospS7ZX%)8X-J5t^qB{yR+DPI3V>^JF5$?bJpYrZWwG9Vv4&yx~OCr(tH
zB8(ZqS&Mb$<KzK5V+lmCfNhcrdpxgkEn0vyje_JNOb0iNmbR-+IzZ|R3Asz}T^-6B
zVIT+GvDji(fwlmZpIP|%;}0;Be4KN9cxkS#tUZP79NgCp9Ip^;Oy!S{y=lTbUG>I)
z5Sr2w`lTI%1Qi!ah@)T)`%w;U&lGY$DJz<pNE#wYkFLG|;-Rasa^lmlK(2dNkSYsf
zNhMN(Vbg}QqwHdLt at lSJV&lxgsw)6)JooOTo_A3ZtrU~%NtV3}cf9cffzrGVq%LuP
zHpW#jp$qVOzL|Roc6@Cnv>gv~hXc<CYQ$Sz;Iph1uSX9c?bFGI`J~fL+n=y{S`@K*
zD<Ik^g0&JAnotNDhgCHJw{BU+#cxpXO-rUml%X!2)WqfYCz33$tEZUk@h)q^!gGG3
zrjIB37K)XlgLNw0LKL5$yaT7-Jr5%tSVr6rqm~2_j7tZu+1}RG^gLEsoI`O;`<6|C
zt{#)>tn>r9es$KK;6kzlYBUr{a1swQW85v3a1B<qTM^>kW;UEp?2Tdp2PPU$rT0Y|
z(yO80`MPnd0QXt<?!y$>tsJKzwz(2 at QA1s6<Pyi_?+ at S-sF_D{89as^?U#WQfpS&b
z_a5r6j}v7G&k$GYAg+7Fnj_a1_u@+0+z}tixV31)EP%9!o>!%s3b7ki;Sc$UdFw*@
ztJIhbc}EGW(Wd at d&$q(q!F*1zUew^c4-$fm>C0haZ98quB~Cf2l^gTN;7vRT{o30c
zVg_>CB3Mbfa4N_{IciB+hRb2e`dEDYr>xn08^tTc7BemwIs<N5uF>=KUK81ako({W
z+FC;`$MG}&jEB%^h#XrgLTj$6Fm&+K*qmZCm>z?<?!WhMYK=MD=%v~<?O;BDb;Qc~
zta%DKt=Imr_i>ZyE|ab|4K8B%&y*J$U!qorFdEZnPzt}WN1}!l8jQ-?Pxl1!ew{7M
z<#MuPkUmKv4(pF_S4ZoVin1_iFq?zrS?m+X0~z@+FS}`UoLaPkK&K&t)aT~#kX6Qn
zl5b(gz5<|JzVPZ3oW(S<T7;()>`qb!fn<(T-UzTu6T&xaj_sHvJGWf!RmS^QA1*&D
z-R@hP#|b!}iy9yEN_DqL1?!L@&)xG(_XovPDbrAly`^@1V?4K%o^e!yK;F9Wz=9in
zC^+IuNQd<2?-C$AJvwew(d)$gZ<k~dR*XhQ*42LE&Lzq0NMGeh1-_H(a%Y5)f*W8g
z%y1R8T?CR!yu>*CQt6~UDl0T-qbDL=Kj5}Gn7g^iWya&tu*izLD{Wgq<hL>KH>dh7
zxUqox^EA|*R>UoGffAC*i&wu2yh`7<@b#JgaQ1QQ9;Jt-)8?>7P>#OLaSy>7l(2XY
z%G()~sI$ZA4ENt3cj1_1BAAR4vuRR?9>+=McHL~PF#db`39g?|p^5wxD%R`&Gp&<W
zWx6=r4`I|ySv4&Hpx*g=jQGP_6H{z5N{VMvnB at iI8wIF`9?jfrvkK~dp*3QfdlI(A
zCtUJfr8{tXnQz$lN=5?^TyVVrE7<BaA)PiwM07oDrYp5o{?op4jleo!Zp=7QukTH&
z#^}~?8cIfqySaf6 at wDJy{WI#Z50!k6*7~q);~Q$0BID!emWUkIbgjM{5=0-0njDwB
zV~<{q6Zn=U4Y(H+xi($V^7~cSP=pIg#dG6}ciOvQOFkw|CiNimB7e@dA0&Scbne3@
z-l#`ACk!Zrx;>Lu(AsfE1U{5sTINkn0!s}*#oZAueTSljbyw#^uI3lh$j_M2owv_~
z5t9XIOT;W1!_~7Ud#HE^$uQGlS-`_5L;vK9S0V8x^Iz?&`VHwEBE`+%Y+`_0E*w^!
zsc#&K*##2C*iHawd~xGX>A3A~Z`}Wd>d6QQKEH%gWs~_dcmn8eAgvvFk=j22*fZH-
zDn4A-`BhFNaEBDOA`$DK+ at HX2gPu(MFdcJGTjjFun3a7mt2mrr>fs`Z3m=6+QLT$(
z{;oEt2L~sZ3ssN+SKo;suDZS~EU=dFcKq8!2-=VAnnhWjk=!22z(6j+nk0Ih>Kf=g
zmousC%b#|C$?xa%2(Z*BN_6NmbQ1;Aq=2Zfx17b2_7&&%3(neFXJc{RH*2hHlf`A7
z`pZo_jC%-_7-!n$#PQd%Q2lN7Q+=&&|E;*b@}Ui8OCn}2`yAg}SfRu;8?<T!+v_Z{
z?oQsW8rr(u7##`8HVE8}73b08I&%hk_TV6!2U<7acHb1qI_``jL$?1Ve5H&8CahF4
zt|ApmnYfChQewV^3<R7w>de|~q|5BBW)&ly?Gftg_U|lNXGMdq8_Nq}RY4YSNa at Y5
z7c%~9(3t2cX#f&bim%qvWCcb#{K9m8bD=2}!gap`vc8JU01~x{_uW+;K2lYgS3b?*
zZP6Ld6_f=Ci-VrQ=TBVspVeLC*=<)m7=cAat=U6S5^;pVy4`HeXVYux!Wd;wgUDMD
zC}kpSTlv1+Db0lbFyO263T`tRxr#)@x<frq__6SLG>Qc18J<ksQ?L!JRmc==_W9O~
z7m7N(+4$dChrk2Zi$d$4Itj*5P*9@`{IF{0s3>tq-w-(s#a%^?|CPdpF8ctIJj?cM
zoyCC5AxqW- at E-*Ft!HzJ+iym^P`duy1B^LR^N{J!YWv^}d&>e<6n`=FEkFUk8OLYy
z{;i#T`wzr@^-T))YHmfNE#|n{P*JeHqx|1A1-7BNCR6Ql485{Ue|6o<kT+YOURL(w
zU*14$Kg4td*2YQ}<%Kh(WdGkM`6_R+s77%Yuf`V~Ps#cgcS0rx at mhl+IWLTqI*Y!O
z5-bOA$6A*K*FS9}t`<mSguY$+7iiUfpZ6oN^wIYU3DJA#=Gp80`8o<D<a%cX<?Z!&
z-4eZTfWEB at Bn1V^zMT+E@of+V@;}?ZfNuWJKE0uZ{~5)9T>f9T=L)X-e<H7I|0okK
L{(j7ALxTH1>a5}C

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 06/15] grub: sample menu.lst file improvements
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (4 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 05/15] grub: replace splash screen with a nicer Buildroot splash screen Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 07/15] grub: install the sample menu.lst into $(TARGET_DIR)/boot/grub Thomas Petazzoni
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Two improvements to the menu.lst file:

 * Do not enforce any video mode, let the kernel use whatever it wants
   as the default, or let the user customize it when needed.

 * Use /dev/sda1 instead of /dev/hda1. Nowadays, most hard disk
   controllers are handled using libata, and therefore the disks are
   visible as /dev/sd<X>.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/menu.lst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/boot/grub/menu.lst b/boot/grub/menu.lst
index d76bf63..41e9b62 100644
--- a/boot/grub/menu.lst
+++ b/boot/grub/menu.lst
@@ -4,4 +4,4 @@ splashimage=(hd0,0)/boot/grub/splash.xpm.gz
 hiddenmenu
 title Buildroot
 	root (hd0,0)
-	kernel /boot/bzImage rw root=/dev/hda1 vga=791 
+	kernel /boot/bzImage rw root=/dev/sda1
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 07/15] grub: install the sample menu.lst into $(TARGET_DIR)/boot/grub
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (5 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 06/15] grub: sample menu.lst file improvements Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 08/15] grub: adjust splashimage in menu.lst depending on configuration Thomas Petazzoni
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/grub.mk | 1 +
 1 file changed, 1 insertion(+)

diff --git a/boot/grub/grub.mk b/boot/grub/grub.mk
index 229b1a4..0c2c035 100644
--- a/boot/grub/grub.mk
+++ b/boot/grub/grub.mk
@@ -80,6 +80,7 @@ define GRUB_INSTALL_TARGET_CMDS
 	cp $(@D)/stage1/stage1 $(TARGET_DIR)/boot/grub
 	cp $(@D)/stage2/*1_5   $(TARGET_DIR)/boot/grub
 	cp $(@D)/stage2/stage2 $(TARGET_DIR)/boot/grub
+	cp boot/grub/menu.lst $(TARGET_DIR)/boot/grub
 	$(GRUB_INSTALL_SPLASH)
 endef
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 08/15] grub: adjust splashimage in menu.lst depending on configuration
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (6 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 07/15] grub: install the sample menu.lst into $(TARGET_DIR)/boot/grub Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 09/15] grub: add option to configure the list of supported filesystems Thomas Petazzoni
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Make the splashimage line in menu.lst only active when splashimage
support has really been enabled in the Grub configuration.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/grub.mk  | 1 +
 boot/grub/menu.lst | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/boot/grub/grub.mk b/boot/grub/grub.mk
index 0c2c035..f15d915 100644
--- a/boot/grub/grub.mk
+++ b/boot/grub/grub.mk
@@ -66,6 +66,7 @@ GRUB_CONF_OPT = \
 ifeq ($(BR2_TARGET_GRUB_SPLASH),y)
 define GRUB_INSTALL_SPLASH
 	cp boot/grub/splash.xpm.gz $(TARGET_DIR)/boot/grub/
+	$(SED) 's/^#splashimage/splashimage/' $(TARGET_DIR)/boot/grub/menu.lst
 endef
 endif
 
diff --git a/boot/grub/menu.lst b/boot/grub/menu.lst
index 41e9b62..7845fee 100644
--- a/boot/grub/menu.lst
+++ b/boot/grub/menu.lst
@@ -1,6 +1,6 @@
 default=0
 timeout=5
-splashimage=(hd0,0)/boot/grub/splash.xpm.gz
+#splashimage=(hd0,0)/boot/grub/splash.xpm.gz
 hiddenmenu
 title Buildroot
 	root (hd0,0)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 09/15] grub: add option to configure the list of supported filesystems
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (7 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 08/15] grub: adjust splashimage in menu.lst depending on configuration Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 10/15] grub: improve help text with detailed instructions to install grub Thomas Petazzoni
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Grub can be configured to enable or disable the filesystems supported
in the stage 2. In addition, there are filesystem specific stage
1.5. In order to save space and build time, we provide a new option
that allows to give a space-separated list of filesystems that Grub
should support.

We default to support FAT and ext2, since most of the other
filesystems are fairly unlikely to be used.

We use this option to:

 1) Pass --enable-<fs> or --disable-<fs>, which enables/disables the
    support of <fs> in Grub stage 2.

 2) Install only the stage 1.5 that correspond to the selected
    filesystems.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/Config.in |  8 ++++++++
 boot/grub/grub.mk   | 17 ++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/boot/grub/Config.in b/boot/grub/Config.in
index ee92250b..65b95e1 100644
--- a/boot/grub/Config.in
+++ b/boot/grub/Config.in
@@ -15,6 +15,14 @@ config BR2_TARGET_GRUB_SPLASH
 	  A splashimage is a 14-color indexed .xpm picture which
 	  is displayed as background for the grub menu.
 
+config BR2_TARGET_GRUB_FS_SUPPORT
+	string "Filesystem to support"
+	default "ext2fs fat"
+	help
+	  Space separated list of filesystems to support. Possible
+	  values are ext2fs, fat, ffs, ufs2, minix, reiserfs, vstafs,
+	  jfs, xfs and iso9660.
+
 config BR2_TARGET_GRUB_DISKLESS
 	bool "diskless support"
 	help
diff --git a/boot/grub/grub.mk b/boot/grub/grub.mk
index f15d915..6ba02cd 100644
--- a/boot/grub/grub.mk
+++ b/boot/grub/grub.mk
@@ -46,6 +46,19 @@ GRUB_CONFIG-$(BR2_TARGET_GRUB_undi) += --enable-undi
 GRUB_CONFIG-$(BR2_TARGET_GRUB_via_rhine) += --enable-via-rhine
 GRUB_CONFIG-$(BR2_TARGET_GRUB_w89c840) += --enable-w89c840
 
+GRUB_POSSIBLE_FILESYSTEMS = ext2fs fat ffs ufs2 minix \
+	reiserfs vstafs jfs xfs iso9660
+GRUB_SELECTED_FILESYSTEMS = $(call qstrip,$(BR2_TARGET_GRUB_FS_SUPPORT))
+
+# Calculate the list of stage 1.5 files to install. They are prefixed
+# by the filesystem name, except for ext2fs, where the stage 1.5 is
+# prefixed by e2fs.
+GRUB_STAGE_1_5_TO_INSTALL = $(subst ext2fs,e2fs,$(GRUB_SELECTED_FILESYSTEMS))
+
+GRUB_CONFIG-y = \
+	$(foreach fs,$(GRUB_POSSIBLE_FILESYSTEMS),\
+		$(if $(filter $(fs),$(GRUB_SELECTED_FILESYSTEMS)),--enable-$(fs),--disable-$(fs)))
+
 define GRUB_DEBIAN_PATCHES
 	# Apply the patches from the Debian patch
 	(cd $(@D) ; for f in `cat debian/patches/00list | grep -v ^#` ; do \
@@ -79,7 +92,9 @@ define GRUB_INSTALL_TARGET_CMDS
 	install -m 0755 -D $(@D)/grub/grub $(HOST_DIR)/sbin/grub
 	mkdir -p $(TARGET_DIR)/boot/grub
 	cp $(@D)/stage1/stage1 $(TARGET_DIR)/boot/grub
-	cp $(@D)/stage2/*1_5   $(TARGET_DIR)/boot/grub
+	for f in $(GRUB_STAGE_1_5_TO_INSTALL) ; do \
+		cp $(@D)/stage2/$${f}_stage1_5 $(TARGET_DIR)/boot/grub ; \
+	done
 	cp $(@D)/stage2/stage2 $(TARGET_DIR)/boot/grub
 	cp boot/grub/menu.lst $(TARGET_DIR)/boot/grub
 	$(GRUB_INSTALL_SPLASH)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 10/15] grub: improve help text with detailed instructions to install grub
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (8 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 09/15] grub: add option to configure the list of supported filesystems Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 11/15] grub2: add new package Thomas Petazzoni
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

These instructions should probaby go in the Buildroot manual, but at
this point, it's not clear in which section they should go. So in
order to not loose those notes, add them to the Grub help text.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/grub/Config.in | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/boot/grub/Config.in b/boot/grub/Config.in
index 65b95e1..c90770f 100644
--- a/boot/grub/Config.in
+++ b/boot/grub/Config.in
@@ -5,6 +5,36 @@ config BR2_TARGET_GRUB
 	help
 	  The GRand Unified Bootloader for x86 systems.
 
+	  Some notes on creating a disk image with Grub installed:
+	    1. Create an empty disk image
+	       dd if=/dev/zero of=disk.img bs=1M count=32
+	    2. Create one primary partition
+	       cfdisk -h 16 -s 63 disk.img
+	    3. Set up a loop device
+	       sudo losetup -f disk.img
+	    4. Set up loop devices per partitions
+	       sudo partx -a /dev/loop0
+	    5. Create the ext2 filesystem
+	       sudo mkfs.ext2 -L root /dev/loop0p1
+	    6. Mount the filesystem
+	       mount /dev/loop0p1 /mnt
+	    7. Extract the root filesystem
+	       sudo tar -C /mnt -xf output/images/rootfs.tar
+	    8. Unmount the filesystem, clean up loop device
+	       sudo umount /mnt
+	       sudo partx -d /dev/loop0
+	       sudo losetup -d /dev/loop0
+	    9. Install grub
+	       output/host/sbin/grub --device-map=/dev/null
+	       and in the grub shell, enter:
+		device (hd0) disk.img
+		geometry (hd0) <cylinders> 16 63
+		root (hd0,0)
+		setup (hd0)
+	    10. Image is ready
+		Can be tested in Qemu, with:
+		  qemu-system-{i386,x86-64} -hda disk.img
+
 if BR2_TARGET_GRUB
 
 config BR2_TARGET_GRUB_SPLASH
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 11/15] grub2: add new package
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (9 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 10/15] grub: improve help text with detailed instructions to install grub Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-12-01 22:49   ` Peter Korsgaard
  2013-11-11 16:47 ` [Buildroot] [PATCH 12/15] gnu-efi: " Thomas Petazzoni
                   ` (5 subsequent siblings)
  16 siblings, 1 reply; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/Config.in                     |   1 +
 boot/grub2/Config.in               | 120 +++++++++++++++++++++++++++++++++++++
 boot/grub2/grub.cfg                |   6 ++
 boot/grub2/grub2-remove-gets.patch |  21 +++++++
 boot/grub2/grub2.mk                |  88 +++++++++++++++++++++++++++
 5 files changed, 236 insertions(+)
 create mode 100644 boot/grub2/Config.in
 create mode 100644 boot/grub2/grub.cfg
 create mode 100644 boot/grub2/grub2-remove-gets.patch
 create mode 100644 boot/grub2/grub2.mk

diff --git a/boot/Config.in b/boot/Config.in
index eb5f7cd..71d2fbd 100644
--- a/boot/Config.in
+++ b/boot/Config.in
@@ -6,6 +6,7 @@ source "boot/at91dataflashboot/Config.in"
 source "boot/barebox/Config.in"
 source "boot/boot-wrapper-aarch64/Config.in"
 source "boot/grub/Config.in"
+source "boot/grub2/Config.in"
 source "boot/lpc32xxcdl/Config.in"
 source "boot/mxs-bootlets/Config.in"
 source "boot/syslinux/Config.in"
diff --git a/boot/grub2/Config.in b/boot/grub2/Config.in
new file mode 100644
index 0000000..e59626a
--- /dev/null
+++ b/boot/grub2/Config.in
@@ -0,0 +1,120 @@
+config BR2_TARGET_GRUB2
+	bool "grub2"
+	depends on BR2_i386 || BR2_x86_64
+	help
+	  GNU GRUB is a Multiboot boot loader. It was derived from
+	  GRUB, the GRand Unified Bootloader, which was originally
+	  designed and implemented by Erich Stefan Boleyn. GRUB 2 has
+	  replaced what was formerly known as GRUB (i.e. version
+	  0.9x), which has, in turn, become GRUB Legacy.
+
+	  Amongst others, GRUB2 offers EFI support, which GRUB Legacy
+	  doesn't provide.
+
+	  Notes on using Grub2 for BIOS-based platforms
+	  =============================================
+
+	  1. Create a disk image
+	     dd if=/dev/zero of=disk.img bs=1M count=32
+	  2. Partition it (either legacy or GPT style partitions work)
+	     cfdisk disk.img
+	      - Create one partition, type Linux, for the root
+		filesystem. The only constraint is to make sure there
+		is enough free space *before* the first partition to
+		store Grub2. Leaving 1 MB of free space is safe.
+	  3. Setup loop device and loop partitions
+	     sudo losetup -f disk.img
+	     sudo partx -a disk.img
+	  4. Prepare the root partition
+	     sudo mkfs.ext3 -L root /dev/loop0p1
+	     sudo mount /dev/loop0p1 /mnt
+	     sudo tar -C /mnt -xf output/images/rootfs.tar
+	     sudo umount /mnt
+	  5. Install Grub2
+	     ./output/host/usr/sbin/grub-bios-setup \
+			-b ./output/host/usr/lib/grub/i386-pc/boot.img \
+			-c ./output/images/grub.img -d . /dev/loop0
+	  6. Your disk.img is ready!
+
+	  To test your BIOS image in Qemu:
+
+	  qemu-system-{i386,x86-64} -hda disk.img
+
+	  Notes on using Grub2 for EFI-based platforms
+	  ============================================
+
+	  1. Create a disk image
+	     dd if=/dev/zero of=disk.img bs=1M count=32
+	  2. Partition it with GPT partitions
+	     cgdisk disk.img
+	      - Create a first partition, type EF00, for the
+		bootloader and kernel image
+	      - Create a second partition, type 8300, for the root
+		filesystem.
+	  3. Setup loop device and loop partitions
+	     sudo losetup -f disk.img
+	     sudo partx -a /dev/loop0
+	  4. Prepare the boot partition
+	     sudo mkfs.vfat -n boot /dev/loop0p1
+	     sudo mount /dev/loop0p1 /mnt
+	     sudo cp -a output/images/efi-part/* /mnt/
+	     sudo cp output/images/bzImage /mnt/
+	     sudo umount /mnt
+	  5. Prepare the root partition
+	     sudo mkfs.ext3 -L root /dev/loop0p2
+	     sudo mount /dev/loop0p2 /mnt
+	     sudo tar -C /mnt -xf output/images/rootfs.tar
+	     sudo umount /mnt
+	  6  Cleanup loop device
+	     sudo partx -d /dev/loop0
+	     sudo losetup -d /dev/loop0
+	  7. Your disk.img is ready!
+
+	  To test your EFI image in Qemu:
+
+	  1. Download the EFI BIOS for Qemu
+	     Version IA32 or X64 depending on the chosen Grub2
+	     platform (i386-efi vs. x86-64-efi)
+	     http://sourceforge.net/projects/edk2/files/OVMF/
+	  2. Extract, and rename OVMF.fd to bios.bin and
+	     CirrusLogic5446.rom to vgabios-cirrus.bin.
+	  3. qemu-system-{i386,x86-64} -L ovmf-dir/ -hda disk.img
+          4. Make sure to pass pci=nocrs to the kernel command line,
+             to workaround a bug in the EFI BIOS regarding the
+             EFI framebuffer.
+
+	  http://www.gnu.org/software/grub/
+
+if BR2_TARGET_GRUB2
+
+choice
+	prompt "Platform"
+
+config BR2_TARGET_GRUB2_I386_PC
+	bool "i386-pc"
+	help
+	  Select this option if the platform you're targetting is a
+	  x86 or x86-64 legacy BIOS based platform.
+
+config BR2_TARGET_GRUB2_I386_EFI
+	bool "i386-efi"
+	help
+	  Select this option if the platform you're targetting has a
+	  32 bits EFI BIOS. Note that some x86-64 platforms use a 32
+	  bits EFI BIOS, and this option should be used in this case.
+
+config BR2_TARGET_GRUB2_X86_64_EFI
+	bool "x86-64-efi"
+	help
+	  Select this option if the platform you're targetting has a
+	  64 bits EFI BIOS.
+
+endchoice
+
+config BR2_TARGET_GRUB2_BUILTIN_MODULES
+	string "builtin modules"
+	default "boot linux ext2 fat part_msdos part_gpt normal biosdisk" if BR2_TARGET_GRUB2_I386_PC
+	default "boot linux ext2 fat part_msdos part_gpt normal efi_gop" \
+		if BR2_TARGET_GRUB2_I386_EFI || BR2_TARGET_GRUB2_X86_64_EFI
+
+endif # BR2_TARGET_GRUB2
diff --git a/boot/grub2/grub.cfg b/boot/grub2/grub.cfg
new file mode 100644
index 0000000..9ea5281
--- /dev/null
+++ b/boot/grub2/grub.cfg
@@ -0,0 +1,6 @@
+set default="0"
+set timeout="5"
+
+menuentry "Buildroot" {
+	linux /bzImage root=/dev/sda1 console=tty1
+}
diff --git a/boot/grub2/grub2-remove-gets.patch b/boot/grub2/grub2-remove-gets.patch
new file mode 100644
index 0000000..0da71b3
--- /dev/null
+++ b/boot/grub2/grub2-remove-gets.patch
@@ -0,0 +1,21 @@
+ISO C11 removes the specification of gets() from the C language, eglibc 2.16+ removed it
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+Upstream-Status: Pending
+Index: grub-1.99/grub-core/gnulib/stdio.in.h
+===================================================================
+--- grub-1.99.orig/grub-core/gnulib/stdio.in.h	2010-12-01 06:45:43.000000000 -0800
++++ grub-1.99/grub-core/gnulib/stdio.in.h	2012-07-04 12:25:02.057099107 -0700
+@@ -140,8 +140,10 @@
+ /* It is very rare that the developer ever has full control of stdin,
+    so any use of gets warrants an unconditional warning.  Assume it is
+    always declared, since it is required by C89.  */
++#if defined gets
+ #undef gets
+ _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
++#endif
+ 
+ #if @GNULIB_FOPEN@
+ # if @REPLACE_FOPEN@
diff --git a/boot/grub2/grub2.mk b/boot/grub2/grub2.mk
new file mode 100644
index 0000000..5bb8884
--- /dev/null
+++ b/boot/grub2/grub2.mk
@@ -0,0 +1,88 @@
+################################################################################
+#
+# grub2
+#
+################################################################################
+
+GRUB2_VERSION = 2.00
+GRUB2_SITE = $(BR2_GNU_MIRROR)/grub/
+GRUB2_SOURCE = grub-$(GRUB2_VERSION).tar.xz
+GRUB2_LICENSE = GPLv3+
+GRUB2_LICENSE_FILES = COPYING
+GRUB2_DEPENDENCIES = host-bison host-flex
+
+ifeq ($(BR2_TARGET_GRUB2_I386_PC),y)
+GRUB2_IMAGE = $(BINARIES_DIR)/grub.img
+GRUB2_CFG = $(TARGET_DIR)/boot/grub/grub.cfg
+GRUB2_TUPLE = i386-pc
+GRUB2_TARGET = i386
+GRUB2_PLATFORM = pc
+else ifeq ($(BR2_TARGET_GRUB2_I386_EFI),y)
+GRUB2_IMAGE = $(BINARIES_DIR)/efi-part/EFI/BOOT/bootia32.efi
+GRUB2_CFG = $(BINARIES_DIR)/efi-part/EFI/BOOT/grub.cfg
+GRUB2_PREFIX = /EFI/BOOT
+GRUB2_TUPLE = i386-efi
+GRUB2_TARGET = i386
+GRUB2_PLATFORM = efi
+else ifeq ($(BR2_TARGET_GRUB2_X86_64_EFI),y)
+GRUB2_IMAGE = $(BINARIES_DIR)/efi-part/EFI/BOOT/bootx64.efi
+GRUB2_CFG = $(BINARIES_DIR)/efi-part/EFI/BOOT/grub.cfg
+GRUB2_PREFIX = /EFI/BOOT
+GRUB2_TUPLE = x86_64-efi
+GRUB2_TARGET = x86_64
+GRUB2_PLATFORM = efi
+endif
+
+GRUB2_BUILTIN_MODULES = $(call qstrip,$(BR2_TARGET_GRUB2_BUILTIN_MODULES))
+
+# Grub2 is kind of special: it considers CC, LD and so on to be the
+# tools to build the native tools (i.e to be executed on the build
+# machine), and uses TARGET_CC, TARGET_CFLAGS, TARGET_CPPFLAGS to
+# build the bootloader itself.
+
+GRUB2_CONF_ENV = \
+	$(HOST_CONFIGURE_OPTS) \
+	CPP="$(HOSTCC) -E" \
+	TARGET_CC="$(TARGET_CC)" \
+	TARGET_CFLAGS="$(TARGET_CFLAGS)" \
+	TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)"
+
+GRUB2_CONF_OPT = \
+	--target=$(GRUB2_TARGET) \
+	--with-platform=$(GRUB2_PLATFORM) \
+	--disable-grub-mkfont \
+	--enable-efiemu=no \
+	--enable-liblzma=no \
+	--enable-device-mapper=no \
+	--enable-libzfs=no \
+	--disable-werror
+
+# We don't want all the native tools and Grub2 modules to be installed
+# in the target. So we in fact install everything into the host
+# directory, and the image generation process (below) will use the
+# grub-mkimage tool and Grub2 modules from the host directory.
+
+GRUB2_INSTALL_TARGET_OPT = DESTDIR=$(HOST_DIR) install
+
+define GRUB2_IMAGE_INSTALLATION
+	mkdir -p $(dir $(GRUB2_IMAGE))
+	$(HOST_DIR)/usr/bin/grub-mkimage \
+		-d $(HOST_DIR)/usr/lib/grub/$(GRUB2_TUPLE) \
+		-O $(GRUB2_TUPLE) \
+		-o $(GRUB2_IMAGE) \
+		$(if $(GRUB2_PREFIX),-p $(GRUB2_PREFIX)) \
+		$(GRUB2_BUILTIN_MODULES)
+	mkdir -p $(dir $(GRUB2_CFG))
+	$(INSTALL) -D -m 0644 boot/grub2/grub.cfg $(GRUB2_CFG)
+endef
+GRUB2_POST_INSTALL_TARGET_HOOKS += GRUB2_IMAGE_INSTALLATION
+
+ifeq ($(GRUB2_PLATFORM),efi)
+define GRUB2_EFI_STARTUP_NSH
+	echo $(notdir $(GRUB2_IMAGE)) > \
+		$(BINARIES_DIR)/efi-part/startup.nsh
+endef
+GRUB2_POST_INSTALL_TARGET_HOOKS += GRUB2_EFI_STARTUP_NSH
+endif
+
+$(eval $(autotools-package))
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 12/15] gnu-efi: new package
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (10 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 11/15] grub2: add new package Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 13/15] gummiboot: " Thomas Petazzoni
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot


Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 package/Config.in                                  |  1 +
 package/gnu-efi/Config.in                          | 21 +++++++++
 .../gnu-efi/gnu-efi-01-use-override-cflags.patch   | 53 ++++++++++++++++++++++
 package/gnu-efi/gnu-efi.mk                         | 44 ++++++++++++++++++
 4 files changed, 119 insertions(+)
 create mode 100644 package/gnu-efi/Config.in
 create mode 100644 package/gnu-efi/gnu-efi-01-use-override-cflags.patch
 create mode 100644 package/gnu-efi/gnu-efi.mk

diff --git a/package/Config.in b/package/Config.in
index 311cc6c..faa29f3 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -538,6 +538,7 @@ endmenu
 menu "Hardware handling"
 source "package/ccid/Config.in"
 source "package/dtc/Config.in"
+source "package/gnu-efi/Config.in"
 source "package/lcdapi/Config.in"
 source "package/libaio/Config.in"
 source "package/libatasmart/Config.in"
diff --git a/package/gnu-efi/Config.in b/package/gnu-efi/Config.in
new file mode 100644
index 0000000..a239d4b
--- /dev/null
+++ b/package/gnu-efi/Config.in
@@ -0,0 +1,21 @@
+config BR2_PACKAGE_GNU_EFI
+	bool "gnu-efi"
+	help
+	  Develop EFI applications for IA-64 (IPF), IA-32 (x86), and
+	  x86_64 platforms using the GNU toolchain and the EFI
+	  development environment.
+
+	  http://gnu-efi.sourceforge.net/
+
+if BR2_PACKAGE_GNU_EFI
+
+# Packages using gnu-efi will select whether they want ia32 or
+# x86-64. If two different packages make different choices, the build
+# will error out.
+config BR2_PACKAGE_GNU_EFI_IA32
+	bool
+
+config BR2_PACKAGE_GNU_EFI_X64
+	bool
+
+endif # BR2_PACKAGE_GNU_EFI
diff --git a/package/gnu-efi/gnu-efi-01-use-override-cflags.patch b/package/gnu-efi/gnu-efi-01-use-override-cflags.patch
new file mode 100644
index 0000000..07c3a9f
--- /dev/null
+++ b/package/gnu-efi/gnu-efi-01-use-override-cflags.patch
@@ -0,0 +1,53 @@
+Allow CFLAGS/CPPFLAGS to be completed from the environment
+
+Buildroot passes its own CPPFLAGS and CFLAGS in the environment, so
+the CFLAGS += and CPPFLAGS += statements in gnu-efi Makefile have no
+effect. Change these to override <VARIABLE> += so that they extend the
+flags passed by Buildroot.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+Index: b/Make.defaults
+===================================================================
+--- a/Make.defaults
++++ b/Make.defaults
+@@ -83,25 +83,25 @@
+                                && [ $(GCCMINOR) -ge "7" ] ) ) \
+                         && echo 1)
+ ifeq ($(GCCNEWENOUGH),1)
+-  CPPFLAGS += -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11
++  override CPPFLAGS += -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11
+ endif
+ 
+ # Arch-specific compilation flags
+-CPPFLAGS += -DCONFIG_$(ARCH)
++override CPPFLAGS += -DCONFIG_$(ARCH)
+ 
+ ifeq ($(ARCH),ia64)
+-  CFLAGS += -mfixed-range=f32-f127
++  override CFLAGS += -mfixed-range=f32-f127
+ endif
+ 
+ ifeq ($(ARCH),ia32)
+-  CFLAGS += -mno-mmx -mno-sse
++  override CFLAGS += -mno-mmx -mno-sse
+   ifeq ($(HOSTARCH),x86_64)
+     ARCH3264 = -m32
+   endif
+ endif
+ 
+ ifeq ($(ARCH),x86_64)
+-  CFLAGS += -mno-red-zone -mno-mmx -mno-sse
++  override CFLAGS += -mno-red-zone -mno-mmx -mno-sse
+   ifeq ($(HOSTARCH),ia32)
+     ARCH3264 = -m64
+   endif
+@@ -110,7 +110,7 @@
+ # Generic compilation flags
+ INCDIR  += -I$(SRCDIR) -I$(TOPDIR)/inc -I$(TOPDIR)/inc/$(ARCH) \
+            -I$(TOPDIR)/inc/protocol
+-CFLAGS  += $(ARCH3264) -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing \
++override CFLAGS  += $(ARCH3264) -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing \
+            -fno-merge-constants -ffreestanding -fno-stack-protector       \
+            -fno-stack-check
+ ASFLAGS += $(ARCH3264)
diff --git a/package/gnu-efi/gnu-efi.mk b/package/gnu-efi/gnu-efi.mk
new file mode 100644
index 0000000..8f5c01b
--- /dev/null
+++ b/package/gnu-efi/gnu-efi.mk
@@ -0,0 +1,44 @@
+################################################################################
+#
+# gnu-efi
+#
+################################################################################
+
+GNU_EFI_VERSION = 3.0u
+GNU_EFI_SOURCE = gnu-efi_$(GNU_EFI_VERSION).orig.tar.gz
+GNU_EFI_SITE = http://downloads.sourceforge.net/project/gnu-efi/
+GNU_EFI_INSTALL_STAGING = YES
+GNU_EFI_LICENSE = GPLv2+ (gnuefi), BSD (efilib)
+GNU_EFI_LICENSE_FILES = debian/copyright
+
+ifeq ($(BR2_PACKAGE_GNU_EFI_IA32)$(BR2_PACKAGE_GNU_EFI_X64),yy)
+$(error "Building gnu-efi for both ia32 and x86-64 is not possible")
+endif
+
+ifeq ($(BR2_PACKAGE_GNU_EFI_IA32),y)
+GNU_EFI_PLATFORM=ia32
+else ifeq ($(BR2_PACKAGE_GNU_EFI_X64),y)
+GNU_EFI_PLATFORM=x86_64
+endif
+
+define GNU_EFI_BUILD_CMDS
+	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \
+		$(TARGET_CONFIGURE_OPTS) \
+		ARCH=$(GNU_EFI_PLATFORM)
+endef
+
+define GNU_EFI_INSTALL_TARGET_CMDS
+	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \
+		$(TARGET_CONFIGURE_OPTS) \
+		INSTALLROOT=$(TARGET_DIR) \
+		PREFIX=/usr ARCH=$(GNU_EFI_PLATFORM) install
+endef
+
+define GNU_EFI_INSTALL_STAGING_CMDS
+	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \
+		$(TARGET_CONFIGURE_OPTS) \
+		INSTALLROOT=$(STAGING_DIR) \
+		PREFIX=/usr ARCH=$(GNU_EFI_PLATFORM) install
+endef
+
+$(eval $(generic-package))
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 13/15] gummiboot: new package
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (11 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 12/15] gnu-efi: " Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 14/15] board: add support for the MinnowBoard Thomas Petazzoni
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 boot/Config.in                |  1 +
 boot/gummiboot/Config.in      | 46 +++++++++++++++++++++++++++++++++++++++++++
 boot/gummiboot/buildroot.conf |  4 ++++
 boot/gummiboot/gummiboot.mk   | 44 +++++++++++++++++++++++++++++++++++++++++
 boot/gummiboot/loader.conf    |  2 ++
 5 files changed, 97 insertions(+)
 create mode 100644 boot/gummiboot/Config.in
 create mode 100644 boot/gummiboot/buildroot.conf
 create mode 100644 boot/gummiboot/gummiboot.mk
 create mode 100644 boot/gummiboot/loader.conf

diff --git a/boot/Config.in b/boot/Config.in
index 71d2fbd..21eec37 100644
--- a/boot/Config.in
+++ b/boot/Config.in
@@ -7,6 +7,7 @@ source "boot/barebox/Config.in"
 source "boot/boot-wrapper-aarch64/Config.in"
 source "boot/grub/Config.in"
 source "boot/grub2/Config.in"
+source "boot/gummiboot/Config.in"
 source "boot/lpc32xxcdl/Config.in"
 source "boot/mxs-bootlets/Config.in"
 source "boot/syslinux/Config.in"
diff --git a/boot/gummiboot/Config.in b/boot/gummiboot/Config.in
new file mode 100644
index 0000000..ad04cec
--- /dev/null
+++ b/boot/gummiboot/Config.in
@@ -0,0 +1,46 @@
+config BR2_TARGET_GUMMIBOOT
+	bool "gummiboot"
+	select BR2_PACKAGE_GNU_EFI
+	select BR2_PACKAGE_UTIL_LINUX
+	select BR2_PACKAGE_UTIL_LINUX_LIBBLKID
+	help
+	  gummiboot is a simple UEFI boot manager which executes
+	  configured EFI images. The default entry is selected by a
+	  configured pattern (glob) or an on-screen menu.
+
+	  gummiboot operates on the EFI System Partition (ESP)
+	  only. Configuration file fragments, kernels, initrds, other
+	  EFI images need to reside on the ESP. Linux kernels need to
+	  be built with CONFIG_EFI_STUB to be able to be directly
+	  executed as an EFI image.
+
+	  See the Grub2 help text for details on preparing an EFI
+	  capable disk image using Gummiboot: the instructions are
+	  exactly the same, except that the Gummiboot configuration
+	  files will be located in /loader/ inside the EFI partition.
+
+	  http://freedesktop.org/wiki/Software/gummiboot/
+
+if BR2_TARGET_GUMMIBOOT
+
+choice
+	prompt "Target"
+
+config BR2_TARGET_GUMMIBOOT_I386
+	bool "i386"
+	select BR2_PACKAGE_GNU_EFI_IA32
+	# We unfortunately can't easily build gummiboot 32 bits when
+	# the selected target architecture is x86-64
+	depends on BR2_i386
+
+comment "32 bits gummiboot is only available for i386"
+	depends on BR2_x86_64
+
+config BR2_TARGET_GUMMIBOOT_X86_64
+	bool "x86-64"
+	select BR2_PACKAGE_GNU_EFI_X64
+	depends on BR2_x86_64
+
+endchoice
+
+endif # BR2_TARGET_GUMMIBOOT
diff --git a/boot/gummiboot/buildroot.conf b/boot/gummiboot/buildroot.conf
new file mode 100644
index 0000000..8a6f02e
--- /dev/null
+++ b/boot/gummiboot/buildroot.conf
@@ -0,0 +1,4 @@
+title	Buildroot
+version	1
+linux	/bzImage
+options	console=ttyS0 root=/dev/sda2
diff --git a/boot/gummiboot/gummiboot.mk b/boot/gummiboot/gummiboot.mk
new file mode 100644
index 0000000..3d92fa7
--- /dev/null
+++ b/boot/gummiboot/gummiboot.mk
@@ -0,0 +1,44 @@
+################################################################################
+#
+# gummiboot
+#
+################################################################################
+
+GUMMIBOOT_SITE = git://anongit.freedesktop.org/gummiboot
+GUMMIBOOT_VERSION = 38
+GUMMIBOOT_LICENSE = LGPLv2.1+
+GUMMIBOOT_LICENSE_FILES = LICENSE
+
+# The git archive does not have the autoconf/automake stuff generated.
+GUMMIBOOT_AUTORECONF = YES
+GUMMIBOOT_DEPENDENCIES = gnu-efi host-pkgconf util-linux
+GUMMIBOOT_INSTALL_TARGET = NO
+GUMMIBOOT_INSTALL_IMAGES = YES
+
+ifeq ($(BR2_TARGET_GUMMIBOOT_I386),y)
+GUMMIBOOT_TARGET = i386
+GUMMIBOOT_IMGARCH = ia32
+else
+GUMMIBOOT_TARGET = x86_64
+GUMMIBOOT_IMGARCH = x64
+endif
+
+GUMMIBOOT_CONF_OPT = \
+	--host=$(GUMMIBOOT_TARGET) \
+	--with-efi-libdir=$(STAGING_DIR)/usr/lib \
+	--with-efi-ldsdir=$(STAGING_DIR)/usr/lib \
+	--with-efi-includedir=$(STAGING_DIR)/usr/include \
+	--disable-shared --enable-static
+
+define GUMMIBOOT_INSTALL_IMAGES_CMDS
+	$(INSTALL) -D -m 0644 $(@D)/gummiboot$(GUMMIBOOT_IMG_ARCH).efi \
+		$(BINARIES_DIR)/efi-part/EFI/BOOT/boot$(GUMMIBOOT_IMGARCH).efi
+	echo "boot$(GUMMIBOOT_IMGARCH).efi" > \
+		$(BINARIES_DIR)/efi-part/startup.nsh
+	$(INSTALL) -D -m 0644 boot/gummiboot/loader.conf \
+		$(BINARIES_DIR)/efi-part/loader/loader.conf
+	$(INSTALL) -D -m 0644 boot/gummiboot/buildroot.conf \
+		$(BINARIES_DIR)/efi-part/loader/entries/buildroot.conf
+endef
+
+$(eval $(autotools-package))
diff --git a/boot/gummiboot/loader.conf b/boot/gummiboot/loader.conf
new file mode 100644
index 0000000..93b77b8
--- /dev/null
+++ b/boot/gummiboot/loader.conf
@@ -0,0 +1,2 @@
+timeout 3
+default buildroot
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 14/15] board: add support for the MinnowBoard
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (12 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 13/15] gummiboot: " Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 16:47 ` [Buildroot] [PATCH 15/15] board: add support for the Fri2 board Thomas Petazzoni
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 board/minnowboard/grub.cfg         |   6 ++
 board/minnowboard/linux-3.8.config | 172 +++++++++++++++++++++++++++++++++++++
 board/minnowboard/post-build.sh    |   2 +
 board/minnowboard/readme.txt       |  40 +++++++++
 configs/minnowboard_defconfig      |  12 +++
 5 files changed, 232 insertions(+)
 create mode 100644 board/minnowboard/grub.cfg
 create mode 100644 board/minnowboard/linux-3.8.config
 create mode 100755 board/minnowboard/post-build.sh
 create mode 100644 board/minnowboard/readme.txt
 create mode 100644 configs/minnowboard_defconfig

diff --git a/board/minnowboard/grub.cfg b/board/minnowboard/grub.cfg
new file mode 100644
index 0000000..33a0f4a
--- /dev/null
+++ b/board/minnowboard/grub.cfg
@@ -0,0 +1,6 @@
+set default="0"
+set timeout="5"
+
+menuentry "Buildroot" {
+	linux /bzImage root=/dev/mmcblk0p2 rootwait console=ttyPCH0,115200
+}
diff --git a/board/minnowboard/linux-3.8.config b/board/minnowboard/linux-3.8.config
new file mode 100644
index 0000000..460aa2d
--- /dev/null
+++ b/board/minnowboard/linux-3.8.config
@@ -0,0 +1,172 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_RCU_FANOUT=32
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_MEMCG_KMEM=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_BLK_CGROUP=y
+CONFIG_NAMESPACES=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_EMBEDDED=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_KPROBES=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_SMP=y
+CONFIG_MATOM=y
+CONFIG_SCHED_SMT=y
+CONFIG_PREEMPT=y
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+# CONFIG_MTRR_SANITIZER is not set
+CONFIG_EFI=y
+CONFIG_EFI_STUB=y
+CONFIG_HZ_1000=y
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_ADVANCED_DEBUG=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_INTEL_IDLE=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCI_MSI=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_FW_LOADER=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_PCH_PHUB=m
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_NETCONSOLE=y
+CONFIG_TUN=m
+CONFIG_PCH_GBE=m
+CONFIG_INPUT_EVDEV=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO_POLLED=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_PCH_UART=y
+CONFIG_SERIAL_PCH_UART_CONSOLE=y
+CONFIG_GEN_RTC=y
+CONFIG_GEN_RTC_X=y
+CONFIG_HPET=y
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_EG20T=m
+CONFIG_SPI=y
+CONFIG_SPI_GPIO=m
+CONFIG_SPI_TOPCLIFF_PCH=m
+CONFIG_SPI_SPIDEV=m
+CONFIG_GPIOLIB=y
+CONFIG_DEBUG_GPIO=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_GENERIC_PLATFORM=y
+CONFIG_GPIO_SCH=y
+CONFIG_GPIO_PCH=y
+CONFIG_WATCHDOG=y
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_AGP=m
+CONFIG_DRM=m
+CONFIG_FB=y
+CONFIG_FB_EFI=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_HDA_INTEL=m
+CONFIG_USB=y
+CONFIG_USB_SUSPEND=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=m
+CONFIG_USB_EG20T=m
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PCI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_ONESHOT=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+CONFIG_DMADEVICES=y
+CONFIG_PCH_DMA=y
+CONFIG_MINNOWBOARD=y
+CONFIG_MINNOWBOARD_GPIO=m
+CONFIG_MINNOWBOARD_KEYS=m
+CONFIG_EFI_VARS=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_FANOTIFY=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+CONFIG_ISO9660_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_CONFIGFS_FS=m
+CONFIG_NFS_FS=y
+CONFIG_NFS_V4=y
+CONFIG_ROOT_NFS=y
+CONFIG_PRINTK_TIME=y
+CONFIG_FRAME_WARN=1024
+CONFIG_TIMER_STATS=y
+CONFIG_LATENCYTOP=y
+CONFIG_BLK_DEV_IO_TRACE=y
diff --git a/board/minnowboard/post-build.sh b/board/minnowboard/post-build.sh
new file mode 100755
index 0000000..e3f4a92
--- /dev/null
+++ b/board/minnowboard/post-build.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+cp board/minnowboard/grub.cfg ${BINARIES_DIR}/efi-part/EFI/BOOT/grub.cfg
diff --git a/board/minnowboard/readme.txt b/board/minnowboard/readme.txt
new file mode 100644
index 0000000..28ae1cd
--- /dev/null
+++ b/board/minnowboard/readme.txt
@@ -0,0 +1,40 @@
+Prepare the SD card for the Minnow Board
+========================================
+
+ 1. Partition the SD card with a GPT partition table
+
+    sudo cgdisk /dev/mmcblk0
+
+    Create two partitions:
+
+     a) First partition of a few dozens of megabytes, which will be
+     	used to store the bootloader and the kernel image. Type must
+     	be EF00 (EFI partition).
+
+     b) Second partition of any size, which will be used to store the
+        root filesystem. Type must be 8300 (Linux filesystem)
+
+ 2. Prepare the boot partition
+
+    We will format it, mount it, copy the EFI data generated by
+    Buildroot, and the kernel image.
+
+    sudo mkfs.vfat -F 32 -n boot /dev/mmcblk0p1
+    sudo mount /dev/mmcblk0p1 /mnt
+    sudo cp -a output/images/efi-part/* /mnt/
+    sudo cp output/images/bzImage /mnt/
+    sudo umount /mnt
+
+ 3. Prepare the root partition
+
+    We will format it, mount it, and extract the root filesystem.
+
+    sudo mkfs.ext3 -L root /dev/mmcblk0p2
+    sudo mount /dev/mmcblk0p2 /mnt
+    sudo tar -C /mnt -xf output/images/rootfs.tar
+    sudo umount /mnt
+
+ 4. Enjoy
+
+Additional informations about this board can be found at
+http://www.minnowboard.org/.
diff --git a/configs/minnowboard_defconfig b/configs/minnowboard_defconfig
new file mode 100644
index 0000000..ce4a1b1
--- /dev/null
+++ b/configs/minnowboard_defconfig
@@ -0,0 +1,12 @@
+BR2_x86_64=y
+BR2_x86_atom=y
+BR2_TARGET_GENERIC_GETTY_PORT="ttyPCH0"
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/minnowboard/post-build.sh"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_GIT=y
+BR2_LINUX_KERNEL_CUSTOM_REPO_URL="git://git.yoctoproject.org/linux-yocto-3.8"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="ba1587b9b62c801d161897303aa6d22809485f9b"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/minnowboard/linux-3.8.config"
+BR2_TARGET_GRUB2=y
+BR2_TARGET_GRUB2_I386_EFI=y
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 15/15] board: add support for the Fri2 board
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (13 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 14/15] board: add support for the MinnowBoard Thomas Petazzoni
@ 2013-11-11 16:47 ` Thomas Petazzoni
  2013-11-11 19:27 ` [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas De Schampheleire
  2013-12-01 22:47 ` Peter Korsgaard
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-11-11 16:47 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 board/fri2/grub.cfg         |   6 +
 board/fri2/linux-3.8.config | 336 ++++++++++++++++++++++++++++++++++++++++++++
 board/fri2/post-build.sh    |   2 +
 board/fri2/readme.txt       |  40 ++++++
 configs/fri2_defconfig      |  12 ++
 5 files changed, 396 insertions(+)
 create mode 100644 board/fri2/grub.cfg
 create mode 100644 board/fri2/linux-3.8.config
 create mode 100755 board/fri2/post-build.sh
 create mode 100644 board/fri2/readme.txt
 create mode 100644 configs/fri2_defconfig

diff --git a/board/fri2/grub.cfg b/board/fri2/grub.cfg
new file mode 100644
index 0000000..f762714
--- /dev/null
+++ b/board/fri2/grub.cfg
@@ -0,0 +1,6 @@
+set default="0"
+set timeout="5"
+
+menuentry "Buildroot" {
+	linux /bzImage root=/dev/mmcblk0p2 rootwait console=ttyPCH1,115200
+}
diff --git a/board/fri2/linux-3.8.config b/board/fri2/linux-3.8.config
new file mode 100644
index 0000000..5bb2da0
--- /dev/null
+++ b/board/fri2/linux-3.8.config
@@ -0,0 +1,336 @@
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCALVERSION="-yocto-standard"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_RCU_FANOUT=32
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_MEMCG_KMEM=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_BLK_CGROUP=y
+CONFIG_NAMESPACES=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_EMBEDDED=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_KPROBES=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_SMP=y
+CONFIG_MATOM=y
+CONFIG_SCHED_SMT=y
+CONFIG_PREEMPT=y
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+# CONFIG_MTRR_SANITIZER is not set
+CONFIG_EFI=y
+CONFIG_EFI_STUB=y
+CONFIG_HZ_1000=y
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_DEBUG=y
+CONFIG_PM_ADVANCED_DEBUG=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_INTEL_IDLE=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCI_MSI=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_BINFMT_MISC=m
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_NET_IPIP=m
+CONFIG_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_IPV6=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_RAW=m
+CONFIG_IP_SCTP=m
+CONFIG_TIPC=m
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+CONFIG_IEEE802154=y
+CONFIG_IEEE802154_6LOWPAN=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_CODEL=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_CLS_BASIC=y
+CONFIG_NET_CLS_CGROUP=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_PKTGEN=m
+CONFIG_CAN=y
+CONFIG_PCH_CAN=y
+CONFIG_BT=y
+CONFIG_CFG80211=m
+CONFIG_MAC80211=m
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_FW_LOADER=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_PCH_PHUB=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_MD_LINEAR=y
+CONFIG_MD_RAID0=y
+CONFIG_MD_RAID1=y
+CONFIG_MD_RAID10=y
+CONFIG_MD_MULTIPATH=y
+CONFIG_MD_FAULTY=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_CRYPT=y
+CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_MIRROR=y
+CONFIG_DM_ZERO=y
+CONFIG_NETDEVICES=y
+CONFIG_BONDING=m
+CONFIG_DUMMY=m
+CONFIG_NETCONSOLE=y
+CONFIG_TUN=m
+CONFIG_PCH_GBE=y
+CONFIG_PPP=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPPOE=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+CONFIG_SLIP_MODE_SLIP6=y
+CONFIG_USB_KAWETH=y
+CONFIG_USB_PEGASUS=y
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_CDC_NCM=m
+CONFIG_USB_NET_DM9601=y
+CONFIG_USB_NET_SMSC75XX=y
+CONFIG_USB_NET_SMSC95XX=y
+CONFIG_USB_NET_MCS7830=y
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_INT51X1=y
+CONFIG_IWLWIFI=m
+CONFIG_SERIAL_PCH_UART=y
+CONFIG_SERIAL_PCH_UART_CONSOLE=y
+CONFIG_HPET=y
+CONFIG_I2C_EG20T=y
+CONFIG_SPI=y
+CONFIG_SPI_GPIO=y
+CONFIG_SPI_TOPCLIFF_PCH=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_PCH=y
+CONFIG_WATCHDOG=y
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_AGP=y
+CONFIG_DRM=y
+CONFIG_FB=y
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_VESA=y
+CONFIG_FB_EFI=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_HDA_INTEL=y
+CONFIG_USB=y
+CONFIG_USB_SUSPEND=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_ACM=m
+CONFIG_USB_WDM=m
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_EG20T=y
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PCI=y
+CONFIG_DMADEVICES=y
+CONFIG_PCH_DMA=y
+CONFIG_EFI_VARS=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_REISERFS_FS=m
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_BTRFS_FS=y
+CONFIG_BTRFS_FS_POSIX_ACL=y
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+CONFIG_CUSE=m
+CONFIG_ISO9660_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_CONFIGFS_FS=m
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_NFS_FS=y
+CONFIG_NFS_V4=y
+CONFIG_ROOT_NFS=y
+CONFIG_CIFS=m
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
+CONFIG_FRAME_WARN=1024
+CONFIG_TIMER_STATS=y
+CONFIG_DEBUG_INFO=y
+CONFIG_LATENCYTOP=y
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_BLK_DEV_IO_TRACE=y
+CONFIG_UPROBE_EVENT=y
+CONFIG_KGDB=y
+CONFIG_KGDB_LOW_LEVEL_TRAP=y
+CONFIG_KGDB_KDB=y
+CONFIG_KDB_KEYBOARD=y
+CONFIG_SECURITY=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_CTR=m
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
diff --git a/board/fri2/post-build.sh b/board/fri2/post-build.sh
new file mode 100755
index 0000000..02b103a
--- /dev/null
+++ b/board/fri2/post-build.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+cp board/fri2/grub.cfg ${BINARIES_DIR}/efi-part/EFI/BOOT/grub.cfg
diff --git a/board/fri2/readme.txt b/board/fri2/readme.txt
new file mode 100644
index 0000000..c6fa7df
--- /dev/null
+++ b/board/fri2/readme.txt
@@ -0,0 +1,40 @@
+Prepare the SD card for the FRI2 Board
+======================================
+
+ 1. Partition the SD card with a GPT partition table
+
+    sudo cgdisk /dev/mmcblk0
+
+    Create two partitions:
+
+     a) First partition of a few dozens of megabytes, which will be
+     	used to store the bootloader and the kernel image. Type must
+     	be EF00 (EFI partition).
+
+     b) Second partition of any size, which will be used to store the
+        root filesystem. Type must be 8300 (Linux filesystem)
+
+ 2. Prepare the boot partition
+
+    We will format it, mount it, copy the EFI data generated by
+    Buildroot, and the kernel image.
+
+    sudo mkfs.vfat -F 32 -n boot /dev/mmcblk0p1
+    sudo mount /dev/mmcblk0p1 /mnt
+    sudo cp -a output/images/efi-part/* /mnt/
+    sudo cp output/images/bzImage /mnt/
+    sudo umount /mnt
+
+ 3. Prepare the root partition
+
+    We will format it, mount it, and extract the root filesystem.
+
+    sudo mkfs.ext3 -L root /dev/mmcblk0p2
+    sudo mount /dev/mmcblk0p2 /mnt
+    sudo tar -C /mnt -xf output/images/rootfs.tar
+    sudo umount /mnt
+
+ 4. Enjoy
+
+Additional informations about this board can be found at
+http://us.kontron.com/products/systems+and+platforms/m2m/m2m+smart+services+developer+kit.html.
diff --git a/configs/fri2_defconfig b/configs/fri2_defconfig
new file mode 100644
index 0000000..f0ee75d
--- /dev/null
+++ b/configs/fri2_defconfig
@@ -0,0 +1,12 @@
+BR2_x86_64=y
+BR2_x86_atom=y
+BR2_TARGET_GENERIC_GETTY_PORT="ttyPCH1"
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/fri2/post-build.sh"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_GIT=y
+BR2_LINUX_KERNEL_CUSTOM_REPO_URL="git://git.yoctoproject.org/linux-yocto-3.8"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="f20047520a57322f05d95a18a5fbd082fb15cb87"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="board/fri2/linux-3.8.config"
+BR2_TARGET_GRUB2=y
+BR2_TARGET_GRUB2_I386_EFI=y
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (14 preceding siblings ...)
  2013-11-11 16:47 ` [Buildroot] [PATCH 15/15] board: add support for the Fri2 board Thomas Petazzoni
@ 2013-11-11 19:27 ` Thomas De Schampheleire
  2013-12-01 22:47 ` Peter Korsgaard
  16 siblings, 0 replies; 22+ messages in thread
From: Thomas De Schampheleire @ 2013-11-11 19:27 UTC (permalink / raw)
  To: buildroot

Hi Thomas,

On Mon, Nov 11, 2013 at 5:47 PM, Thomas Petazzoni
<thomas.petazzoni@free-electrons.com> wrote:
> Hello,
>
> This commit brings a number of improvements into the world of x86
> bootloaders, and adds support for two x86 boards.
>
> In details:
>
>  * It improves the existing 'grub' package by making sure that we can
>    build a 32 bits Grub even if the selected target architecture is
>    x86-64. This is done by using the host compiler. It also makes
>    various other improvements to the 'grub', and especially adds a
>    HOWTO in the Config.in help text to explain how to install Grub
>    into a disk image, and test it under Qemu.


In [1] I reported that the grub images were excessively large. Is this
still the case?
See also Arnout's reply on that mail...

[1] http://lists.busybox.net/pipermail/buildroot/2013-October/080344.html


Best regards,
Thomas

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support
  2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
                   ` (15 preceding siblings ...)
  2013-11-11 19:27 ` [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas De Schampheleire
@ 2013-12-01 22:47 ` Peter Korsgaard
  16 siblings, 0 replies; 22+ messages in thread
From: Peter Korsgaard @ 2013-12-01 22:47 UTC (permalink / raw)
  To: buildroot

>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes:

 > Hello,
 > This commit brings a number of improvements into the world of x86
 > bootloaders, and adds support for two x86 boards.

 > In details:

 >  * It improves the existing 'grub' package by making sure that we can
 >    build a 32 bits Grub even if the selected target architecture is
 >    x86-64. This is done by using the host compiler. It also makes
 >    various other improvements to the 'grub', and especially adds a
 >    HOWTO in the Config.in help text to explain how to install Grub
 >    into a disk image, and test it under Qemu.

Committed part 1..10, thanks!

-- 
Bye, Peter Korsgaard

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 11/15] grub2: add new package
  2013-11-11 16:47 ` [Buildroot] [PATCH 11/15] grub2: add new package Thomas Petazzoni
@ 2013-12-01 22:49   ` Peter Korsgaard
  2013-12-02  8:35     ` Thomas Petazzoni
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Korsgaard @ 2013-12-01 22:49 UTC (permalink / raw)
  To: buildroot

>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes:

 > Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
 > ---
 >  boot/Config.in                     |   1 +
 >  boot/grub2/Config.in               | 120 +++++++++++++++++++++++++++++++++++++
 >  boot/grub2/grub.cfg                |   6 ++
 >  boot/grub2/grub2-remove-gets.patch |  21 +++++++
 >  boot/grub2/grub2.mk                |  88 +++++++++++++++++++++++++++
 >  5 files changed, 236 insertions(+)
 >  create mode 100644 boot/grub2/Config.in
 >  create mode 100644 boot/grub2/grub.cfg
 >  create mode 100644 boot/grub2/grub2-remove-gets.patch
 >  create mode 100644 boot/grub2/grub2.mk

 > diff --git a/boot/Config.in b/boot/Config.in
 > index eb5f7cd..71d2fbd 100644
 > --- a/boot/Config.in
 > +++ b/boot/Config.in
 > @@ -6,6 +6,7 @@ source "boot/at91dataflashboot/Config.in"
 >  source "boot/barebox/Config.in"
 >  source "boot/boot-wrapper-aarch64/Config.in"
 >  source "boot/grub/Config.in"
 > +source "boot/grub2/Config.in"
 >  source "boot/lpc32xxcdl/Config.in"
 >  source "boot/mxs-bootlets/Config.in"
 >  source "boot/syslinux/Config.in"
 > diff --git a/boot/grub2/Config.in b/boot/grub2/Config.in
 > new file mode 100644
 > index 0000000..e59626a
 > --- /dev/null
 > +++ b/boot/grub2/Config.in
 > @@ -0,0 +1,120 @@
 > +config BR2_TARGET_GRUB2
 > +	bool "grub2"
 > +	depends on BR2_i386 || BR2_x86_64

Doesn't grub2 also need BR2_HOSTARCH_NEEDS_IA32_COMPILER?

-- 
Bye, Peter Korsgaard

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 11/15] grub2: add new package
  2013-12-01 22:49   ` Peter Korsgaard
@ 2013-12-02  8:35     ` Thomas Petazzoni
  2013-12-02  8:49       ` Peter Korsgaard
  0 siblings, 1 reply; 22+ messages in thread
From: Thomas Petazzoni @ 2013-12-02  8:35 UTC (permalink / raw)
  To: buildroot

Dear Peter Korsgaard,

On Sun, 01 Dec 2013 23:49:25 +0100, Peter Korsgaard wrote:

>  > diff --git a/boot/Config.in b/boot/Config.in
>  > index eb5f7cd..71d2fbd 100644
>  > --- a/boot/Config.in
>  > +++ b/boot/Config.in
>  > @@ -6,6 +6,7 @@ source "boot/at91dataflashboot/Config.in"
>  >  source "boot/barebox/Config.in"
>  >  source "boot/boot-wrapper-aarch64/Config.in"
>  >  source "boot/grub/Config.in"
>  > +source "boot/grub2/Config.in"
>  >  source "boot/lpc32xxcdl/Config.in"
>  >  source "boot/mxs-bootlets/Config.in"
>  >  source "boot/syslinux/Config.in"
>  > diff --git a/boot/grub2/Config.in b/boot/grub2/Config.in
>  > new file mode 100644
>  > index 0000000..e59626a
>  > --- /dev/null
>  > +++ b/boot/grub2/Config.in
>  > @@ -0,0 +1,120 @@
>  > +config BR2_TARGET_GRUB2
>  > +	bool "grub2"
>  > +	depends on BR2_i386 || BR2_x86_64
> 
> Doesn't grub2 also need BR2_HOSTARCH_NEEDS_IA32_COMPILER?

From what I've tested, no it doesn't. I believe this is because grub
legacy needed libgcc, while grub2 doesn't need libgcc, so you don't
need a multilib compiler: a non-multilib x86-64 gcc can generate 32 bits
code, but doesn't provide a 32 bits libgcc.

I can do another testing if needed, just to validate this once more
(it's been a while since I did this, and I may have overlooked
something).

Best regards,

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 11/15] grub2: add new package
  2013-12-02  8:35     ` Thomas Petazzoni
@ 2013-12-02  8:49       ` Peter Korsgaard
  2013-12-02  8:51         ` Thomas Petazzoni
  0 siblings, 1 reply; 22+ messages in thread
From: Peter Korsgaard @ 2013-12-02  8:49 UTC (permalink / raw)
  To: buildroot

>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@free-electrons.com> writes:

 >> Doesn't grub2 also need BR2_HOSTARCH_NEEDS_IA32_COMPILER?

 > From what I've tested, no it doesn't. I believe this is because grub
 > legacy needed libgcc, while grub2 doesn't need libgcc, so you don't
 > need a multilib compiler: a non-multilib x86-64 gcc can generate 32 bits
 > code, but doesn't provide a 32 bits libgcc.

 > I can do another testing if needed, just to validate this once more
 > (it's been a while since I did this, and I may have overlooked
 > something).

Don't worry, I just wondered. If you already tested then that's
fine. I'll review and apply the rest of the series tonight.

-- 
Bye, Peter Korsgaard

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [Buildroot] [PATCH 11/15] grub2: add new package
  2013-12-02  8:49       ` Peter Korsgaard
@ 2013-12-02  8:51         ` Thomas Petazzoni
  0 siblings, 0 replies; 22+ messages in thread
From: Thomas Petazzoni @ 2013-12-02  8:51 UTC (permalink / raw)
  To: buildroot

Dear Peter Korsgaard,

On Mon, 02 Dec 2013 09:49:32 +0100, Peter Korsgaard wrote:

>  > From what I've tested, no it doesn't. I believe this is because grub
>  > legacy needed libgcc, while grub2 doesn't need libgcc, so you don't
>  > need a multilib compiler: a non-multilib x86-64 gcc can generate 32 bits
>  > code, but doesn't provide a 32 bits libgcc.
> 
>  > I can do another testing if needed, just to validate this once more
>  > (it's been a while since I did this, and I may have overlooked
>  > something).
> 
> Don't worry, I just wondered. If you already tested then that's
> fine. I'll review and apply the rest of the series tonight.

I'd prefer to do another test. Since I had installed all the multilib
stuff to test grub legacy, maybe I've overlooked since for grub2. Let
me make another test, and I'll report back.

Thanks,

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2013-12-02  8:51 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-11 16:47 [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 01/15] core: add BR2_HOSTARCH_NEEDS_IA32_COMPILER option Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 02/15] package: add objcopy and ranlib to HOST_CONFIGURE_OPTS Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 03/15] grub: factorize BR2_TARGET_GRUB dependency in Config.in Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 04/15] grub: support build on x86-64, and misc other improvements Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 05/15] grub: replace splash screen with a nicer Buildroot splash screen Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 06/15] grub: sample menu.lst file improvements Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 07/15] grub: install the sample menu.lst into $(TARGET_DIR)/boot/grub Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 08/15] grub: adjust splashimage in menu.lst depending on configuration Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 09/15] grub: add option to configure the list of supported filesystems Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 10/15] grub: improve help text with detailed instructions to install grub Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 11/15] grub2: add new package Thomas Petazzoni
2013-12-01 22:49   ` Peter Korsgaard
2013-12-02  8:35     ` Thomas Petazzoni
2013-12-02  8:49       ` Peter Korsgaard
2013-12-02  8:51         ` Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 12/15] gnu-efi: " Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 13/15] gummiboot: " Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 14/15] board: add support for the MinnowBoard Thomas Petazzoni
2013-11-11 16:47 ` [Buildroot] [PATCH 15/15] board: add support for the Fri2 board Thomas Petazzoni
2013-11-11 19:27 ` [Buildroot] [PATCH 00/15] Improvements to x86 bootloaders, and x86 boards support Thomas De Schampheleire
2013-12-01 22:47 ` Peter Korsgaard

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.